From 758dfcac67301344ba6e5f27d2ab5b5ca3643352 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Wed, 1 Mar 2023 15:34:30 +0800 Subject: [PATCH] Build: add utility to get package files (#14430) --- scripts/build/build-javascript-module.js | 6 +- scripts/build/config.mjs | 92 +++++++++++------------- scripts/build/utils.js | 15 ++++ 3 files changed, 57 insertions(+), 56 deletions(-) create mode 100644 scripts/build/utils.js diff --git a/scripts/build/build-javascript-module.js b/scripts/build/build-javascript-module.js index 379f68b2d..1bfac69c8 100644 --- a/scripts/build/build-javascript-module.js +++ b/scripts/build/build-javascript-module.js @@ -15,6 +15,7 @@ import esbuildPluginThrowWarnings from "./esbuild-plugins/throw-warnings.mjs"; import esbuildPluginShimCommonjsObjects from "./esbuild-plugins/shim-commonjs-objects.mjs"; import esbuildPluginPrimitiveDefine from "./esbuild-plugins/primitive-define.mjs"; import transform from "./transform/index.js"; +import { getPackageFile } from "./utils.js"; const { dirname, readJsonSync, require } = createEsmUtils(import.meta); const packageJson = readJsonSync("../../package.json"); @@ -62,10 +63,7 @@ function getEsbuildOptions({ file, files, shouldCollectLicenses, cliOptions }) { })), // https://github.com/evanw/esbuild/issues/2103 { - module: path.join( - path.dirname(require.resolve("outdent/package.json")), - "lib-module/index.js" - ), + module: getPackageFile("outdent/lib-module/index.js"), process(text) { const index = text.indexOf('if (typeof module !== "undefined") {'); if (index === -1) { diff --git a/scripts/build/config.mjs b/scripts/build/config.mjs index 713021e7e..7c7e2e0d8 100644 --- a/scripts/build/config.mjs +++ b/scripts/build/config.mjs @@ -14,6 +14,7 @@ import buildPackageJson from "./build-package-json.js"; import buildLicense from "./build-license.js"; import modifyTypescriptModule from "./modify-typescript-module.mjs"; import reuseDocumentModule from "./reuse-document-module.js"; +import { getPackageFile } from "./utils.js"; const { require, @@ -99,15 +100,14 @@ function getTypesFileConfig({ input: jsFileInput, outputBaseName }) { /* `diff` use deprecated folder mapping "./" in the "exports" field, -so we can't `require("diff/lib/diff/array.js")` directly. +so we can't `import("diff/lib/diff/array.js")` directly. To reduce the bundle size, replace the entry with smaller files. -We can switch to deep require once https://github.com/kpdecker/jsdiff/pull/351 get merged +We can switch to deep import once https://github.com/kpdecker/jsdiff/pull/351 get merged */ -const diffPackageDirectory = path.dirname(require.resolve("diff/package.json")); const replaceDiffPackageEntry = (file) => ({ - module: path.join(diffPackageDirectory, "lib/index.mjs"), - path: path.join(diffPackageDirectory, file), + module: getPackageFile("diff/lib/index.mjs"), + path: getPackageFile(`diff/${file}`), }); const extensions = { @@ -151,7 +151,7 @@ const pluginFiles = [ process: modifyTypescriptModule, }, { - module: require.resolve( + module: getPackageFile( "@typescript-eslint/typescript-estree/dist/parser.js" ), process(text) { @@ -164,7 +164,7 @@ const pluginFiles = [ }, }, { - module: require.resolve( + module: getPackageFile( "@typescript-eslint/typescript-estree/dist/parseSettings/createParseSettings.js" ), process(text) { @@ -185,31 +185,31 @@ const pluginFiles = [ }, }, { - module: require.resolve( + module: getPackageFile( "@typescript-eslint/typescript-estree/dist/parseSettings/inferSingleRun.js" ), text: "exports.inferSingleRun = () => false;", }, { - module: require.resolve( + module: getPackageFile( "@typescript-eslint/typescript-estree/dist/parseSettings/ExpiringCache.js" ), text: "exports.ExpiringCache = class {};", }, { - module: require.resolve( + module: getPackageFile( "@typescript-eslint/typescript-estree/dist/parseSettings/getProjectConfigFiles.js" ), text: "exports.resolveProjectList = () => [];", }, { - module: require.resolve( + module: getPackageFile( "@typescript-eslint/typescript-estree/dist/parseSettings/warnAboutTSVersion.js" ), text: "exports.warnAboutTSVersion = () => {};", }, { - module: require.resolve( + module: getPackageFile( "@typescript-eslint/typescript-estree/dist/create-program/getScriptKind.js" ), process: (text) => @@ -219,20 +219,20 @@ const pluginFiles = [ ), }, { - module: require.resolve( + module: getPackageFile( "@typescript-eslint/typescript-estree/dist/version-check.js" ), text: "exports.typescriptVersionIsAtLeast = new Proxy({}, {get: () => true})", }, // Only needed if `range`/`loc` in parse options is `false` { - module: require.resolve( + module: getPackageFile( "@typescript-eslint/typescript-estree/dist/ast-converter.js" ), process: (text) => text.replace('require("./simple-traverse")', "{}"), }, { - module: require.resolve("debug/src/browser.js"), + module: getPackageFile("debug/src/browser.js"), path: path.join(dirname, "./shims/debug.js"), }, ], @@ -257,7 +257,7 @@ const pluginFiles = [ }, { // We don't use value of JSXText - module: require.resolve("acorn-jsx/xhtml.js"), + module: getPackageFile("acorn-jsx/xhtml.js"), text: "module.exports = {};", }, ], @@ -279,10 +279,7 @@ const pluginFiles = [ // We only use a small set of `@angular/compiler` from `esm2020/src/expression_parser/` // Those files can't be imported, they also not directly runnable, because `.mjs` extension is missing { - module: path.join( - path.dirname(require.resolve("@angular/compiler/package.json")), - "fesm2020/compiler.mjs" - ), + module: getPackageFile("@angular/compiler/fesm2020/compiler.mjs"), text: /* indent */ ` export * from '../esm2020/src/expression_parser/ast.mjs'; export {Lexer} from '../esm2020/src/expression_parser/lexer.mjs'; @@ -294,10 +291,7 @@ const pluginFiles = [ "expression_parser/parser.mjs", "ml_parser/interpolation_config.mjs", ].map((file) => ({ - module: path.join( - path.dirname(require.resolve("@angular/compiler/package.json")), - `esm2020/src/${file}` - ), + module: getPackageFile(`@angular/compiler/esm2020/src/${file}`), process: (text) => text.replaceAll(/(?<=import .*? from )'(.{1,2}\/.*)'/g, "'$1.mjs'"), })), @@ -306,25 +300,30 @@ const pluginFiles = [ { input: "src/language-css/parser-postcss.js", replaceModule: [ - // `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 - { - module: require.resolve("postcss-values-parser/lib/parser.js"), - find: "node.constructor.name === 'Word'", - replacement: "node.type === 'word'", - }, // The following two replacements prevent load `source-map` module { - module: path.join(require.resolve("postcss"), "../previous-map.js"), + module: getPackageFile("postcss/lib/previous-map.js"), text: "module.exports = class {};", }, { - module: path.join(require.resolve("postcss"), "../map-generator.js"), + module: getPackageFile("postcss/lib/map-generator.js"), text: "module.exports = class { generate() {} };", }, + { + module: getPackageFile("postcss/lib/input.js"), + process: (text) => + text.replace("require('url')", "{}").replace("require('path')", "{}"), + }, + // `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 + { + module: getPackageFile("postcss-values-parser/lib/parser.js"), + find: "node.constructor.name === 'Word'", + replacement: "node.type === 'word'", + }, // Prevent `node:util`, `node:utl`, and `node:path` shim { - module: require.resolve("postcss-values-parser/lib/tokenize.js"), + module: getPackageFile("postcss-values-parser/lib/tokenize.js"), process: (text) => text .replace("require('util')", "{}") @@ -337,11 +336,6 @@ const pluginFiles = [ "let message = `Syntax error at line: ${line}, column: ${pos - offset}, token: ${pos}`;" ), }, - { - module: path.join(require.resolve("postcss"), "../input.js"), - process: (text) => - text.replace("require('url')", "{}").replace("require('path')", "{}"), - }, ], }, "src/language-graphql/parser-graphql.js", @@ -349,8 +343,8 @@ const pluginFiles = [ input: "src/language-markdown/parser-markdown.js", replaceModule: [ { - module: require.resolve("parse-entities/decode-entity.browser.js"), - path: require.resolve("parse-entities/decode-entity.js"), + module: getPackageFile("parse-entities/decode-entity.browser.js"), + path: getPackageFile("parse-entities/decode-entity.js"), }, ], }, @@ -359,30 +353,24 @@ const pluginFiles = [ replaceModule: [ // See comment in `src/language-handlebars/parser-glimmer.js` file { - module: require.resolve( + module: getPackageFile( "@glimmer/syntax/dist/commonjs/es2017/lib/parser/tokenizer-event-handlers.js" ), - path: require.resolve( + path: getPackageFile( "@glimmer/syntax/dist/modules/es2017/lib/parser/tokenizer-event-handlers.js" ), }, // This passed to plugins, our plugin don't need access to the options { - module: require.resolve( + module: getPackageFile( "@glimmer/syntax/dist/modules/es2017/lib/parser/tokenizer-event-handlers.js" ), process: (text) => text.replace(/\nconst syntax = \{.*?\n\};/su, "\nconst syntax = {};"), }, { - module: path.join( - path.dirname(require.resolve("@handlebars/parser/package.json")), - "dist/esm/index.js" - ), - path: path.join( - path.dirname(require.resolve("@handlebars/parser/package.json")), - "dist/esm/parse.js" - ), + module: getPackageFile("@handlebars/parser/dist/esm/index.js"), + path: getPackageFile("@handlebars/parser/dist/esm/parse.js"), }, ], }, diff --git a/scripts/build/utils.js b/scripts/build/utils.js new file mode 100644 index 000000000..9dc04de9f --- /dev/null +++ b/scripts/build/utils.js @@ -0,0 +1,15 @@ +import path from "node:path"; +import fs from "node:fs"; +import { PROJECT_ROOT } from "../utils/index.mjs"; + +function getPackageFile(file) { + const resolved = path.join(PROJECT_ROOT, `node_modules/${file}`); + + if (!fs.existsSync(resolved)) { + throw new Error(`'${file}' not exist.`); + } + + return resolved; +} + +export { getPackageFile };