Bundle vendors from the source package (#12582)

This commit is contained in:
fisker Cheung authored and GitHub committed 2022-04-03 01:06:32 +08:00
1 parent 8a52865cf9
commit caba818940
4 files changed
+45 -11

No files matched your search

+8
View File
@@ -6,6 +6,7 @@ import esbuild from "esbuild";
import { NodeModulesPolyfillPlugin as esbuildPluginNodeModulePolyfills } from "@esbuild-plugins/node-modules-polyfill"; import { NodeModulesPolyfillPlugin as esbuildPluginNodeModulePolyfills } from "@esbuild-plugins/node-modules-polyfill";
import browserslistToEsbuild from "browserslist-to-esbuild"; import browserslistToEsbuild from "browserslist-to-esbuild";
import { PROJECT_ROOT, DIST_DIR } from "../utils/index.mjs"; import { PROJECT_ROOT, DIST_DIR } from "../utils/index.mjs";
import { vendorMetaFile, vendorsDirectory } from "../vendors/utils.mjs";
import esbuildPluginEvaluate from "./esbuild-plugins/evaluate.mjs"; import esbuildPluginEvaluate from "./esbuild-plugins/evaluate.mjs";
import esbuildPluginReplaceModule from "./esbuild-plugins/replace-module.mjs"; import esbuildPluginReplaceModule from "./esbuild-plugins/replace-module.mjs";
import esbuildPluginLicense from "./esbuild-plugins/license.mjs"; import esbuildPluginLicense from "./esbuild-plugins/license.mjs";
@@ -18,6 +19,12 @@ const { __dirname, readJsonSync, require } = createEsmUtils(import.meta);
const packageJson = readJsonSync("../../package.json"); const packageJson = readJsonSync("../../package.json");
const umdTarget = browserslistToEsbuild(packageJson.browserslist); const umdTarget = browserslistToEsbuild(packageJson.browserslist);
const vendorsReplacements = Object.entries(readJsonSync(vendorMetaFile).entries)
.filter(([, entry]) => !entry.endsWith(".json"))
.map(([vendorName, entry]) => ({
module: path.join(vendorsDirectory, entry),
path: require.resolve(vendorName),
}));
function getBabelConfig(bundle) { function getBabelConfig(bundle) {
const config = { const config = {
@@ -76,6 +83,7 @@ const bundledFiles = [
function* getEsbuildOptions(bundle, buildOptions) { function* getEsbuildOptions(bundle, buildOptions) {
const replaceModule = [ const replaceModule = [
...vendorsReplacements,
// #12493, not sure what the problem is, but replace the cjs version with esm version seems fix it // #12493, not sure what the problem is, but replace the cjs version with esm version seems fix it
{ {
module: require.resolve("tslib"), module: require.resolve("tslib"),
+15 -10
View File
@@ -1,24 +1,26 @@
#!/usr/bin/env node #!/usr/bin/env node
import fs from "node:fs/promises"; import fs from "node:fs/promises";
import path from "node:path";
import assert from "node:assert"; import assert from "node:assert";
import { fileURLToPath } from "node:url";
import createEsmUtils from "esm-utils"; import createEsmUtils from "esm-utils";
import esbuild from "esbuild"; import esbuild from "esbuild";
import { outdent } from "outdent"; import { outdent } from "outdent";
import { PROJECT_ROOT, writeJson } from "../utils/index.mjs"; import { PROJECT_ROOT, writeJson } from "../utils/index.mjs";
import esbuildPluginLicense from "../build/esbuild-plugins/license.mjs"; import esbuildPluginLicense from "../build/esbuild-plugins/license.mjs";
import vendors from "./vendors.mjs"; import vendors from "./vendors.mjs";
import { vendorMetaFile, saveVendorLicenses } from "./utils.mjs"; import {
vendorsDirectory,
vendorMetaFile,
saveVendorLicenses,
saveVendorEntry,
} from "./utils.mjs";
import esbuildPluginTsNocheck from "./esbuild-plugin-ts-nocheck.mjs"; import esbuildPluginTsNocheck from "./esbuild-plugin-ts-nocheck.mjs";
const { require } = createEsmUtils(import.meta); const { require } = createEsmUtils(import.meta);
const rootDir = new URL("../../", import.meta.url);
// prettier/vendors
const vendorsDir = new URL("./vendors/", rootDir);
// prettier/vendors/*.js // prettier/vendors/*.js
const getVendorFilePath = (vendorName, extension = "js") => const getVendorFilePath = (vendorName, extension = "js") =>
fileURLToPath(new URL(`./${vendorName}.${extension}`, vendorsDir)); path.join(vendorsDirectory, `${vendorName}.${extension}`);
// Unsafe, but good enough for now. // Unsafe, but good enough for now.
const isJson = (value) => { const isJson = (value) => {
@@ -31,7 +33,7 @@ const isJson = (value) => {
}; };
async function clean() { async function clean() {
for (const directoryOrFile of [vendorsDir, vendorMetaFile]) { for (const directoryOrFile of [vendorsDirectory, vendorMetaFile]) {
try { try {
await fs.rm(directoryOrFile, { recursive: true, force: true }); await fs.rm(directoryOrFile, { recursive: true, force: true });
} catch { } catch {
@@ -43,7 +45,7 @@ async function clean() {
async function generateDts({ vendor, module }) { async function generateDts({ vendor, module }) {
const hasDefault = Boolean(module.default); const hasDefault = Boolean(module.default);
await fs.writeFile( await fs.writeFile(
new URL(`${vendor}.d.ts`, vendorsDir), path.join(vendorsDirectory, `${vendor}.d.ts`),
[ [
"// This file is generated automatically.", "// This file is generated automatically.",
hasDefault ? `export {default} from "${vendor}";` : null, hasDefault ? `export {default} from "${vendor}";` : null,
@@ -83,11 +85,14 @@ async function bundle(vendor, options) {
const module = await import(vendor); const module = await import(vendor);
if (isJson(module)) { if (isJson(module)) {
await fs.rm(outfile); await fs.rm(outfile);
await writeJson(getVendorFilePath(vendor, "json"), module); const file = getVendorFilePath(vendor, "json");
await writeJson(file, module);
saveVendorEntry(vendor, file);
return; return;
} }
await generateDts({ vendor, module }); await generateDts({ vendor, module });
saveVendorEntry(vendor, outfile);
} }
async function main() { async function main() {
@@ -107,7 +112,7 @@ async function main() {
console.log("Vendor licenses saved"); console.log("Vendor licenses saved");
await fs.writeFile( await fs.writeFile(
new URL("./README.md", vendorsDir), path.join(vendorsDirectory, "README.md"),
outdent` outdent`
# \`./vendors\` # \`./vendors\`
+12 -1
View File
@@ -1,6 +1,8 @@
import fs from "node:fs"; import fs from "node:fs";
import { readJson, writeJson } from "../utils/index.mjs"; import path from "node:path";
import { PROJECT_ROOT, readJson, writeJson } from "../utils/index.mjs";
export const vendorsDirectory = path.join(PROJECT_ROOT, "vendors");
export const vendorMetaFile = new URL("./vendor-meta.json", import.meta.url); export const vendorMetaFile = new URL("./vendor-meta.json", import.meta.url);
const getMeta = () => const getMeta = () =>
fs.existsSync(vendorMetaFile) ? readJson(vendorMetaFile) : {}; fs.existsSync(vendorMetaFile) ? readJson(vendorMetaFile) : {};
@@ -10,3 +12,12 @@ export async function saveVendorLicenses(licenses) {
meta.licenses = licenses; meta.licenses = licenses;
await writeJson(vendorMetaFile, meta); await writeJson(vendorMetaFile, meta);
} }
export async function saveVendorEntry(vendorName, file) {
const meta = await getMeta();
meta.entries = {
...meta.entries,
[vendorName]: path.relative(vendorsDirectory, file),
};
await writeJson(vendorMetaFile, meta);
}
+10
View File
@@ -1,4 +1,14 @@
{ {
"entries": {
"chalk": "chalk.js",
"escape-string-regexp": "escape-string-regexp.js",
"execa": "execa.js",
"html-element-attributes": "html-element-attributes.json",
"html-tag-names": "html-tag-names.json",
"html-void-elements": "html-void-elements.json",
"mem": "mem.js",
"string-width": "string-width.js"
},
"licenses": [ "licenses": [
{ {
"name": "chalk", "name": "chalk",