2021-05-15 20:09:52 +08:00
import path from "node:path" ;
2022-01-28 18:27:27 +08:00
import { createRequire } from "node:module" ;
2022-01-09 01:15:04 +08:00
import createEsmUtils from "esm-utils" ;
2022-08-11 14:08:08 +08:00
import { PROJECT_ROOT } from "../utils/index.mjs" ;
2022-09-06 20:38:50 +08:00
import modifyTypescriptModule from "./modify-typescript-module.mjs" ;
2022-01-09 01:15:04 +08:00
2022-03-25 16:37:34 +08:00
const { require , dirname } = createEsmUtils ( import . meta );
2018-05-24 15:30:45 -03:00
/**
* @typedef {Object} Bundle
* @property {string} input - input of the bundle
* @property {string?} output - path of the output file in the `dist/` folder
* @property {string?} name - name for the UMD bundle (for plugins, it'll be `prettierPlugins.${name}`)
2020-09-17 01:08:44 +09:00
* @property {'node' | 'universal'} target - should generate a CJS only for node or universal bundle
2018-05-24 15:30:45 -03:00
* @property {'core' | 'plugin'} type - it's a plugin bundle or core part of prettier
2021-05-27 08:54:42 +08:00
* @property {string[]} external - array of paths that should not be included in the final bundle
2022-03-20 14:04:30 +08:00
* @property {object[]} replaceModule - Module replacements
2018-06-21 10:29:42 +08:00
* @property {string[]} babelPlugins - babel plugins
2020-05-11 18:00:22 +08:00
* @property {boolean?} minify - minify
2022-03-13 22:47:02 +08:00
* @property {string[]?} esbuildTarget - ESBuild target
2022-03-14 16:30:12 +08:00
* @property {boolean?} interopDefault - Should export the ESM default export
2018-05-24 15:30:45 -03:00
* @typedef {Object} CommonJSConfig
* @property {string[]} ignore - paths of CJS modules to ignore
*/
2022-03-15 12:36:13 +08:00
/*
`diff` use deprecated folder mapping "./" in the "exports" field,
2022-03-16 10:24:22 +08:00
so we can't `require("diff/lib/diff/array.js")` directly.
To reduce the bundle size, replace the entry with smaller files.
2022-03-15 12:36:13 +08:00
We can switch to deep require once https://github.com/kpdecker/jsdiff/pull/351 get merged
*/
2022-03-17 21:22:52 +08:00
const diffPackageDirectory = path . dirname ( require . resolve ( "diff/package.json" ));
2022-03-15 12:36:13 +08:00
const replaceDiffPackageEntry = ( file ) => ({
2022-03-24 15:02:29 +08:00
module : path . join ( diffPackageDirectory , "lib/index.mjs" ),
path : path . join ( diffPackageDirectory , file ),
2022-03-15 12:36:13 +08:00
});
2018-05-24 15:30:45 -03:00
/** @type {Bundle[]} */
const parsers = [
{
2021-07-15 09:53:34 +08:00
input : "src/language-js/parse/babel.js" ,
2018-05-24 15:30:45 -03:00
},
{
2021-07-15 09:53:34 +08:00
input : "src/language-js/parse/flow.js" ,
2018-05-24 15:30:45 -03:00
},
{
2021-07-15 09:53:34 +08:00
input : "src/language-js/parse/typescript.js" ,
2022-03-20 14:04:30 +08:00
replaceModule : [
2020-11-18 10:59:58 +09:00
// `@typescript-eslint/typescript-estree` v4
2022-03-14 20:02:02 +08:00
{
2022-03-20 14:04:30 +08:00
module : "*" ,
2022-03-14 20:02:02 +08:00
find : 'require("globby")' ,
replacement : "{}" ,
},
{
2022-03-20 14:04:30 +08:00
module : "*" ,
2022-03-14 20:02:02 +08:00
find : "extra.projects = prepareAndTransformProjects(" ,
replacement : "extra.projects = [] || prepareAndTransformProjects(" ,
},
{
2022-03-20 14:04:30 +08:00
module : "*" ,
2022-03-14 20:02:02 +08:00
find : "process.versions.node" ,
replacement : JSON . stringify ( "999.999.999" ),
},
{
2022-03-20 14:04:30 +08:00
module : "*" ,
2022-03-14 20:02:02 +08:00
find : "process.cwd()" ,
replacement : JSON . stringify ( "/prettier-security-dirname-placeholder" ),
},
{
2022-03-20 14:04:30 +08:00
module : "*" ,
2022-03-14 20:02:02 +08:00
find : 'require("perf_hooks")' ,
replacement : "{}" ,
},
{
2022-03-20 14:04:30 +08:00
module : "*" ,
2022-03-14 20:02:02 +08:00
find : 'require("inspector")' ,
replacement : "{}" ,
},
{
2022-03-20 14:04:30 +08:00
module : "*" ,
2022-03-14 20:02:02 +08:00
find : "typescriptVersionIsAtLeast[version] = semverCheck(version);" ,
replacement : "typescriptVersionIsAtLeast[version] = true;" ,
},
2022-03-23 10:21:02 +08:00
// The next two replacement fixed webpack warning `Critical dependency: require function is used in a way in which dependencies cannot be statically extracted`
// #12338
{
module : require . resolve (
"@typescript-eslint/typescript-estree/dist/create-program/shared.js"
),
find : "moduleResolver = require(moduleResolverPath);" ,
replacement : "throw new Error('Dynamic require is not supported');" ,
},
{
module : require . resolve ( "typescript" ),
2022-09-06 20:38:50 +08:00
process : modifyTypescriptModule ,
2022-03-23 10:21:02 +08:00
},
2022-03-20 14:04:30 +08:00
{
module : require . resolve ( "debug/src/browser.js" ),
2022-03-25 16:37:34 +08:00
path : path . join ( dirname , "./shims/debug.js" ),
2022-03-20 14:04:30 +08:00
},
2022-03-14 20:02:02 +08:00
],
2018-05-24 15:30:45 -03:00
},
2020-10-13 09:14:02 +08:00
{
2022-01-28 15:25:30 +08:00
input : "src/language-js/parse/acorn-and-espree.js" ,
name : "prettierPlugins.espree" ,
// TODO: Rename this file to `parser-acorn-and-espree.js` or find a better way
output : "parser-espree.js" ,
2022-03-20 14:04:30 +08:00
replaceModule : [
2022-03-14 20:02:02 +08:00
{
2022-03-20 14:04:30 +08:00
module : require . resolve ( "espree" ),
2022-03-14 20:02:02 +08:00
find : "const Syntax = (function() {" ,
replacement : "const Syntax = undefined && (function() {" ,
},
{
2022-03-20 14:04:30 +08:00
module : require . resolve ( "espree" ),
2022-03-14 20:02:02 +08:00
find : "var visitorKeys = require('eslint-visitor-keys');" ,
replacement : "var visitorKeys;" ,
},
],
2020-10-13 09:14:02 +08:00
},
2020-11-05 14:08:37 +08:00
{
2021-07-15 09:53:34 +08:00
input : "src/language-js/parse/meriyah.js" ,
2020-11-05 14:08:37 +08:00
},
2018-11-04 23:03:07 +08:00
{
2021-07-15 09:53:34 +08:00
input : "src/language-js/parse/angular.js" ,
2022-03-20 14:04:30 +08:00
replaceModule : [
2022-03-14 20:02:02 +08:00
{
2022-03-20 14:04:30 +08:00
module : "*" ,
2022-03-14 20:02:02 +08:00
find : 'require("@angular/compiler/src/' ,
replacement : 'require("@angular/compiler/esm2015/src/' ,
},
],
2018-11-04 23:03:07 +08:00
},
2018-05-24 15:30:45 -03:00
{
input : "src/language-css/parser-postcss.js" ,
2022-03-20 14:04:30 +08:00
replaceModule : [
2022-03-20 21:56:09 +08:00
// `postcss-values-parser` uses constructor.name, it will be changed by bundler
// https://github.com/shellscape/postcss-values-parser/blob/c00f858ab8c86ce9f06fdb702e8f26376f467248/lib/parser.js#L499
2022-03-14 20:02:02 +08:00
{
2022-03-20 14:04:30 +08:00
module : require . resolve ( "postcss-values-parser/lib/parser.js" ),
2022-03-14 20:02:02 +08:00
find : "node.constructor.name === 'Word'" ,
replacement : "node.type === 'word'" ,
},
2022-03-20 21:56:09 +08:00
// The following two replacements prevent load `source-map` module
{
2022-08-15 22:30:46 +09:00
module : path . join ( require . resolve ( "postcss" ), "../previous-map.js" ),
2022-03-20 21:56:09 +08:00
text : "module.exports = class {};" ,
},
{
2022-08-15 22:30:46 +09:00
module : path . join ( require . resolve ( "postcss" ), "../map-generator.js" ),
2022-03-20 21:56:09 +08:00
text : "module.exports = class { generate() {} };" ,
},
2022-03-14 20:02:02 +08:00
],
2018-05-24 15:30:45 -03:00
},
{
2020-01-29 17:45:57 +08:00
input : "src/language-graphql/parser-graphql.js" ,
2018-05-24 15:30:45 -03:00
},
{
2020-01-29 17:45:57 +08:00
input : "src/language-markdown/parser-markdown.js" ,
2022-03-20 14:04:30 +08:00
replaceModule : [
{
module : require . resolve ( "parse-entities/decode-entity.browser.js" ),
path : require . resolve ( "parse-entities/decode-entity.js" ),
},
],
2018-05-24 15:30:45 -03:00
},
{
input : "src/language-handlebars/parser-glimmer.js" ,
2022-08-10 19:32:44 +08:00
replaceModule : [
// See comment in `src/language-handlebars/parser-glimmer.js` file
{
module : require . resolve (
"@glimmer/syntax/dist/commonjs/es2017/lib/parser/tokenizer-event-handlers.js"
),
path : require . resolve (
"@glimmer/syntax/dist/modules/es2017/lib/parser/tokenizer-event-handlers.js"
),
},
],
2018-05-24 15:30:45 -03:00
},
{
2020-01-29 17:45:57 +08:00
input : "src/language-html/parser-html.js" ,
2018-06-21 10:29:42 +08:00
},
{
input : "src/language-yaml/parser-yaml.js" ,
2018-05-24 15:30:45 -03:00
},
2021-07-15 09:53:34 +08:00
]. map (( bundle ) => {
const { name } = bundle . input . match (
/(?:parser-|parse\/)(?<name>.*?)\.js$/
). groups ;
return {
type : "plugin" ,
target : "universal" ,
name : `prettierPlugins. ${ name } ` ,
output : `parser- ${ name } .js` ,
... bundle ,
};
});
2018-05-24 15:30:45 -03:00
/** @type {Bundle[]} */
2018-05-29 14:59:57 -03:00
const coreBundles = [
2018-05-24 15:30:45 -03:00
{
2021-05-27 08:54:42 +08:00
input : "src/index.js" ,
2022-05-05 15:03:08 +08:00
interopDefault : false ,
2022-03-20 14:04:30 +08:00
replaceModule : [
2022-03-14 20:02:02 +08:00
{
2022-03-20 14:04:30 +08:00
module : require . resolve ( "@iarna/toml/lib/toml-parser.js" ),
2022-03-14 20:02:02 +08:00
find : "const utilInspect = eval(\"require('util').inspect\")" ,
replacement : "const utilInspect = require('util').inspect" ,
},
2022-03-21 10:37:57 +08:00
// `editorconfig` use a older version of `semver` and only uses `semver.gte`
{
module : require . resolve ( "editorconfig" ),
find : 'var semver = __importStar(require("semver"));' ,
replacement : `
var semver = {
gte: require( ${ JSON . stringify (
require . resolve ( "semver/functions/gte" )
) } )
};
` ,
},
2022-05-10 15:42:11 +08:00
{
module : require . resolve ( "n-readlines" ),
find : "const readBuffer = new Buffer(this.options.readChunk);" ,
replacement : "const readBuffer = Buffer.alloc(this.options.readChunk);" ,
},
2022-03-20 14:04:30 +08:00
replaceDiffPackageEntry ( "lib/diff/array.js" ),
2022-03-14 20:02:02 +08:00
],
2018-05-24 15:30:45 -03:00
},
2019-03-25 09:44:22 -07:00
{
2020-01-14 18:58:42 +08:00
input : "src/document/index.js" ,
2022-05-07 01:37:40 +08:00
interopDefault : false ,
2019-03-25 09:44:22 -07:00
name : "doc" ,
output : "doc.js" ,
target : "universal" ,
2020-09-17 01:08:44 +09:00
format : "umd" ,
2020-05-11 18:00:22 +08:00
minify : false ,
2019-03-25 09:44:22 -07:00
},
2018-05-24 15:30:45 -03:00
{
2021-05-27 08:54:42 +08:00
input : "src/standalone.js" ,
2022-05-05 15:03:08 +08:00
interopDefault : false ,
2018-05-24 15:30:45 -03:00
name : "prettier" ,
target : "universal" ,
2022-03-20 14:04:30 +08:00
replaceModule : [
{
module : require . resolve ( "@babel/highlight" ),
2022-03-25 16:37:34 +08:00
path : path . join ( dirname , "./shims/babel-highlight.js" ),
2022-03-20 14:04:30 +08:00
},
{
module : createRequire ( require . resolve ( "vnopts" )). resolve ( "chalk" ),
2022-03-25 16:37:34 +08:00
path : path . join ( dirname , "./shims/chalk.js" ),
2022-03-20 14:04:30 +08:00
},
replaceDiffPackageEntry ( "lib/diff/array.js" ),
],
2018-05-24 15:30:45 -03:00
},
{
2022-04-03 00:04:45 +08:00
input : "bin/prettier.cjs" ,
2018-05-24 15:30:45 -03:00
output : "bin-prettier.js" ,
2022-04-03 00:04:45 +08:00
esbuildTarget : [ "node0.10" ],
2022-08-11 14:08:08 +08:00
replaceModule : [
{
module : path . join ( PROJECT_ROOT , "bin/prettier.cjs" ),
process : ( text ) => text . replace ( '"../src/cli/index.js"' , '"./cli.mjs"' ),
},
],
2022-03-13 22:47:02 +08:00
},
{
input : "src/cli/index.js" ,
2022-08-11 14:08:08 +08:00
output : "cli.mjs" ,
format : "esm" ,
2021-05-27 08:54:42 +08:00
external : [ "benchmark" ],
2022-03-14 16:30:12 +08:00
interopDefault : false ,
2022-03-20 14:04:30 +08:00
replaceModule : [ replaceDiffPackageEntry ( "lib/patch/create.js" )],
2018-05-24 15:30:45 -03:00
},
{
2022-07-12 10:20:11 +08:00
input : "src/common/third-party.js" ,
2022-03-20 14:04:30 +08:00
replaceModule : [
2020-01-10 09:21:44 +08:00
// cosmiconfig@6 -> import-fresh can't find parentModule, since module is bundled
2022-03-20 14:04:30 +08:00
{
module : require . resolve ( "parent-module" ),
2022-03-25 16:37:34 +08:00
path : path . join ( dirname , "./shims/parent-module.cjs" ),
2022-03-20 14:04:30 +08:00
},
],
2018-05-24 15:30:45 -03:00
},
2021-05-27 08:54:42 +08:00
]. map (( bundle ) => ({
type : "core" ,
target : "node" ,
output : path . basename ( bundle . input ),
2020-01-20 18:49:52 +08:00
... bundle ,
}));
2021-05-27 08:54:42 +08:00
2021-09-10 11:17:09 +09:00
const configs = [... coreBundles , ... parsers ];
export default configs ;