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-03-23 10:21:02 +08:00
import { PROJECT_ROOT } from "../utils/index.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" ,
2022-03-20 14:04:30 +08:00
replaceModule : [
2020-08-21 09:15:35 +08:00
// `flow-parser` use this for `globalThis`, can't work in strictMode
2022-03-14 20:02:02 +08:00
{
2022-03-20 14:04:30 +08:00
module : require . resolve ( "flow-parser" ),
2022-03-14 20:02:02 +08:00
find : "(function(){return this}())" ,
replacement : "(globalThis)" ,
},
],
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" ),
process ( text ) {
2022-06-19 19:12:51 +08:00
// Remove useless `ts.sys`
text = text . replace (
/(?<=\n)(?<indentString>\s+)ts\.sys = \(function \(\) {.*?\n\k<indentString>}\)\(\);(?=\n)/s,
""
);
text = text . replace (
2022-03-23 10:21:02 +08:00
/(?<=\n)(?<indentString>\s+)function tryGetNodePerformanceHooks\(\) {.*?\n\k<indentString>}(?=\n)/s,
"function tryGetNodePerformanceHooks() {}"
);
2022-06-19 19:12:51 +08:00
return text ;
2022-03-23 10:21:02 +08:00
},
},
2022-05-06 20:27:33 +08:00
// yarn pnp
{
module : require . resolve ( "typescript" ),
find : "process.versions.pnp" ,
replacement : "undefined" ,
},
2022-01-26 22:27:10 +08:00
2022-03-14 20:02:02 +08:00
... Object . entries ({
// `typescript/lib/typescript.js` expose extra global objects
// `TypeScript`, `toolsVersion`, `globalThis`
'typeof process === "undefined" || process.browser' : "false" ,
'typeof globalThis === "object"' : "true" ,
2022-01-26 22:27:10 +08:00
2022-03-14 20:02:02 +08:00
"_fs.realpathSync.native" :
"_fs.realpathSync && _fs.realpathSync.native" ,
// Remove useless language service
"ts.realizeDiagnostics = " : "ts.realizeDiagnostics = undefined && " ,
"ts.TypeScriptServicesFactory = " :
"ts.TypeScriptServicesFactory = undefined && " ,
"var ShimBase = " : "var ShimBase = undefined && " ,
"var TypeScriptServicesFactory = " :
"var TypeScriptServicesFactory = undefined && " ,
"var LanguageServiceShimObject = " :
"var LanguageServiceShimObject = undefined && " ,
"var CoreServicesShimHostAdapter = " :
"var CoreServicesShimHostAdapter = undefined && " ,
"var LanguageServiceShimHostAdapter = " :
"var LanguageServiceShimHostAdapter = undefined && " ,
"var ScriptSnapshotShimAdapter = " :
"var ScriptSnapshotShimAdapter = undefined && " ,
"var ClassifierShimObject = " :
"var ClassifierShimObject = undefined && " ,
"var CoreServicesShimObject = " :
"var CoreServicesShimObject = undefined && " ,
"function simpleForwardCall(" : "0 && function simpleForwardCall(" ,
"function forwardJSONCall(" : "0 && function forwardJSONCall(" ,
"function forwardCall(" : "0 && function forwardCall(" ,
"function realizeDiagnostics(" : "0 && function realizeDiagnostics(" ,
"function realizeDiagnostic(" : "0 && function realizeDiagnostic(" ,
"function convertClassifications(" :
"0 && function convertClassifications(" ,
// Dynamic `require()`s
"ts.sys && ts.sys.require" : "false" ,
"require(etwModulePath)" : "undefined" ,
'require("source-map-support").install()' : "" ,
"require(modulePath)" : "undefined" ,
}). map (([ find , replacement ]) => ({
2022-03-20 14:04:30 +08:00
module : require . resolve ( "typescript" ),
2022-03-14 20:02:02 +08:00
find ,
replacement ,
})),
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-03-24 16:50:23 +08:00
module : path . join (
require . resolve ( "postcss/package.json" ),
"lib/previous-map.js"
),
2022-03-20 21:56:09 +08:00
text : "module.exports = class {};" ,
},
{
2022-03-24 16:50:23 +08:00
module : path . join (
require . resolve ( "postcss/package.json" ),
"lib/postcss/lib/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" ,
},
{
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" ),
2022-03-23 10:21:02 +08:00
{
2022-05-06 18:52:40 +08:00
module : path . join ( PROJECT_ROOT , "src/main/load-parser.js" ),
text : "export default () => {};" ,
2022-03-23 10:21:02 +08:00
},
2022-03-20 14:04:30 +08:00
],
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-03-13 22:47:02 +08:00
},
{
input : "src/cli/index.js" ,
output : "cli.js" ,
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-03-17 19:56:48 +08:00
input : "src/common/third-party.cjs" ,
2022-03-17 20:35:49 +08:00
output : "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 ;