Skip to content

Commit

Permalink
Some refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
emmatown committed Jul 28, 2022
1 parent 5669b80 commit a2c05e1
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 122 deletions.
23 changes: 14 additions & 9 deletions packages/cli/src/build/config.ts
Expand Up @@ -8,6 +8,7 @@ import path from "path";
import resolveFrom from "resolve-from";
import * as logger from "../logger";
import { Project } from "../project";
import { getDistExtension } from "../utils";

function getGlobal(project: Project, name: string) {
if (
Expand Down Expand Up @@ -116,8 +117,8 @@ export function getRollupConfigs(pkg: Package, aliases: Aliases) {
? [
{
format: "es" as const,
entryFileNames: "[name].esm.js",
chunkFileNames: "dist/[name]-[hash].esm.js",
entryFileNames: `[name].${getDistExtension("esm")}`,
chunkFileNames: `dist/[name]-[hash].${getDistExtension("esm")}`,
dir: pkg.directory,
},
]
Expand Down Expand Up @@ -157,7 +158,7 @@ export function getRollupConfigs(pkg: Package, aliases: Aliases) {
{
format: "umd" as const,
sourcemap: true,
entryFileNames: "[name].umd.min.js",
entryFileNames: `[name].${getDistExtension("umd")}`,
name: entrypoint.json.preconstruct.umdName as string,
dir: pkg.directory,
interop,
Expand Down Expand Up @@ -188,17 +189,21 @@ export function getRollupConfigs(pkg: Package, aliases: Aliases) {
outputs: [
!exportsFieldConfig && {
format: "cjs" as const,
entryFileNames: "[name].browser.cjs.js",
chunkFileNames: "dist/[name]-[hash].browser.cjs.js",
entryFileNames: `[name].${getDistExtension("browser-cjs")}`,
chunkFileNames: `dist/[name]-[hash].${getDistExtension(
"browser-cjs"
)}`,
dir: pkg.directory,
exports: "named" as const,
interop,
plugins: cjsPlugins,
},
hasModuleField && {
format: "es" as const,
entryFileNames: "[name].browser.esm.js",
chunkFileNames: "dist/[name]-[hash].browser.esm.js",
entryFileNames: `[name].${getDistExtension("browser-esm")}`,
chunkFileNames: `dist/[name]-[hash].${getDistExtension(
"browser-esm"
)}`,
dir: pkg.directory,
},
].filter(
Expand All @@ -220,8 +225,8 @@ export function getRollupConfigs(pkg: Package, aliases: Aliases) {
outputs: [
{
format: "es" as const,
entryFileNames: "[name].worker.esm.js",
chunkFileNames: "dist/[name]-[hash].worker.esm.js",
entryFileNames: `[name].${getDistExtension("worker")}`,
chunkFileNames: `dist/[name]-[hash].${getDistExtension("worker")}`,
dir: pkg.directory,
},
],
Expand Down
8 changes: 2 additions & 6 deletions packages/cli/src/build/rollup.ts
Expand Up @@ -17,7 +17,7 @@ import typescriptDeclarations from "../rollup-plugins/typescript-declarations";
import json from "@rollup/plugin-json";
import babel from "../rollup-plugins/babel";
import terser from "../rollup-plugins/terser";
import { getNameForDistForEntrypoint } from "../utils";
import { getBaseDistName } from "../utils";
import { EXTENSIONS } from "../constants";
import { inlineProcessEnvNodeEnv } from "../rollup-plugins/inline-process-env-node-env";
import normalizePath from "normalize-path";
Expand Down Expand Up @@ -70,11 +70,7 @@ export let getRollupConfig = (
input[
path.relative(
pkg.directory,
path.join(
entrypoint.directory,
"dist",
getNameForDistForEntrypoint(entrypoint)
)
path.join(entrypoint.directory, "dist", getBaseDistName(entrypoint))
)
] = entrypoint.source;
});
Expand Down
4 changes: 4 additions & 0 deletions packages/cli/src/entrypoint.ts
Expand Up @@ -28,6 +28,10 @@ export class Entrypoint extends Item<{
this.source = source;
}

get hasModuleField() {
return this.json.module !== undefined;
}

get name(): string {
return normalizePath(
nodePath.join(
Expand Down
41 changes: 28 additions & 13 deletions packages/cli/src/package.ts
Expand Up @@ -12,10 +12,11 @@ import { Project } from "./project";
import { getUselessGlobsThatArentReallyGlobsForNewEntrypoints } from "./glob-thing";
import {
validFieldsForEntrypoint,
validFieldsFromPkg,
JSONValue,
getEntrypointName,
setFieldInOrder,
DistFilenameStrategy,
MinimalEntrypoint,
} from "./utils";
import normalizePath from "normalize-path";

Expand Down Expand Up @@ -47,19 +48,13 @@ function getPlainEntrypointContent(
keyof typeof validFieldsForEntrypoint,
string | Record<string, string | ExportsConditions>
>> = {};
const minimalEntrypoint: MinimalEntrypoint = {
hasModuleField: fields.has("module"),
name: getEntrypointName(pkg, entrypointDir),
package: pkg,
};
for (const field of fields) {
if (field === "browser") {
obj[field] = validFieldsFromPkg[field](
pkg,
fields.has("module"),
getEntrypointName(pkg, entrypointDir)
);
} else {
obj[field] = validFieldsFromPkg[field](
pkg,
getEntrypointName(pkg, entrypointDir)
);
}
obj[field] = validFieldsForEntrypoint[field](minimalEntrypoint);
}
return JSON.stringify(obj, null, indent) + "\n";
}
Expand Down Expand Up @@ -311,6 +306,26 @@ export class Package extends Item<{
return this.json.name;
}

get distFilenameStrategy(): DistFilenameStrategy {
if ("distFilenameStrategy" in this.project.json.preconstruct) {
const written = this.project.json.preconstruct.distFilenameStrategy;
if (
written !== "full" &&
written !== "unscoped-package-name" &&
written !== "full-in-package-dist"
) {
throw new FatalError(
`distFilenameStrategy is defined in your Preconstruct config as ${JSON.stringify(
written
)} but the only accepted values are "full", "full-in-package-dist" and "unscoped-package-name"`,
this.project.name
);
}
return written;
}
return "full";
}

exportsFieldConfig(): CanonicalExportsFieldConfig {
if (!this.project.experimentalFlags.exports) {
return;
Expand Down
4 changes: 0 additions & 4 deletions packages/cli/src/rollup-plugins/flow-and-prod-dev-entry.ts
Expand Up @@ -12,10 +12,6 @@ export default function flowAndNodeDevProdEntry(
pkg: Package,
warnings: FatalError[]
): Plugin {
// let directorySourceFilesMustBeIn = pkg.project.experimentalFlags
// .newEntrypoints
// ? path.resolve(pkg.directory, "src")
// : pkg.directory;
return {
name: "flow-and-prod-dev-entry",
load(id) {
Expand Down
157 changes: 67 additions & 90 deletions packages/cli/src/utils.ts
Expand Up @@ -2,11 +2,6 @@ import normalizePath from "normalize-path";
import { Entrypoint } from "./entrypoint";
import { Package, ExportsConditions } from "./package";
import * as nodePath from "path";
import { FatalError } from "./errors";

export function getNameForDistForEntrypoint(entrypoint: Entrypoint): string {
return getDistName(entrypoint.package, entrypoint.name);
}

let fields = [
"version",
Expand Down Expand Up @@ -65,77 +60,25 @@ export function getEntrypointName(pkg: Package, entrypointDir: string) {
);
}

type DistFilenameStrategy = "full" | "unscoped-package-name";
export type DistFilenameStrategy =
| "full"
| "full-in-package-dist"
| "unscoped-package-name";

function getDistNameWithStrategy(
pkg: Package,
entrypointName: string,
strategy: DistFilenameStrategy
) {
if (strategy === "full") {
return entrypointName.replace("@", "").replace(/\//g, "-");
}
return pkg.name.replace(/.*\//, "");
}
export type MinimalEntrypoint = {
package: Package;
name: string;
hasModuleField: boolean;
};

function getDistName(pkg: Package, entrypointName: string): string {
if ("distFilenameStrategy" in pkg.project.json.preconstruct) {
if (
pkg.project.json.preconstruct.distFilenameStrategy !== "full" &&
pkg.project.json.preconstruct.distFilenameStrategy !==
"unscoped-package-name"
) {
throw new FatalError(
`distFilenameStrategy is defined in your Preconstruct config as ${JSON.stringify(
pkg.project.json.preconstruct.distFilenameStrategy
)} but the only accepted values are "full" and "unscoped-package-name"`,
pkg.project.name
);
}
if (
pkg.project.json.preconstruct.distFilenameStrategy ===
"unscoped-package-name"
) {
return getDistNameWithStrategy(
pkg,
entrypointName,
"unscoped-package-name"
);
}
export function getBaseDistName(entrypoint: MinimalEntrypoint) {
const strategy = entrypoint.package.distFilenameStrategy;
if (strategy === "full" || strategy === "full-in-package-dist") {
return entrypoint.name.replace("@", "").replace(/\//g, "-");
}
return getDistNameWithStrategy(pkg, entrypointName, "full");
return entrypoint.package.name.replace(/.*\//, "");
}

export const validFieldsFromPkg = {
main(pkg: Package, entrypointName: string) {
let safeName = getDistName(pkg, entrypointName);
return `dist/${safeName}.cjs.js`;
},
module(pkg: Package, entrypointName: string) {
let safeName = getDistName(pkg, entrypointName);
return `dist/${safeName}.esm.js`;
},
"umd:main"(pkg: Package, entrypointName: string) {
let safeName = getDistName(pkg, entrypointName);
return `dist/${safeName}.umd.min.js`;
},
browser(pkg: Package, hasModuleBuild: boolean, entrypointName: string) {
let safeName = getDistName(pkg, entrypointName);

const moduleBuild = {
[`./dist/${safeName}.esm.js`]: `./dist/${safeName}.browser.esm.js`,
};
if (pkg.exportsFieldConfig()) {
return moduleBuild;
}

return {
[`./dist/${safeName}.cjs.js`]: `./dist/${safeName}.browser.cjs.js`,
...(hasModuleBuild && moduleBuild),
};
},
};

export function exportsField(
pkg: Package
): Record<string, ExportsConditions | string> | undefined {
Expand All @@ -154,7 +97,7 @@ export function exportsField(
worker: getExportsFieldOutputPath(entrypoint, "worker"),
}),
...(exportsFieldConfig.envConditions.has("browser") && {
browser: getExportsFieldOutputPath(entrypoint, "browser"),
browser: getExportsFieldOutputPath(entrypoint, "browser-esm"),
}),
default: esmBuild,
}
Expand All @@ -173,34 +116,68 @@ export function exportsField(
};
}

export type BuildTarget =
| "cjs"
| "esm"
| "umd"
| "worker"
| "browser-cjs"
| "browser-esm";

const buildTargetToExtensionPrefix: Record<BuildTarget, string> = {
cjs: "cjs",
esm: "esm",
"browser-cjs": "browser.cjs",
"browser-esm": "browser.esm",
worker: "worker.esm",
umd: "umd.min",
};

export function getDistExtension(target: BuildTarget) {
return `${buildTargetToExtensionPrefix[target]}.js`;
}

function getDistFilename(entrypoint: MinimalEntrypoint, target: BuildTarget) {
return `dist/${getBaseDistName(entrypoint)}.${getDistExtension(target)}`;
}

export function getExportsFieldOutputPath(
entrypoint: Entrypoint,
type: "cjs" | "esm" | "worker" | "browser"
target: BuildTarget
) {
const safeName = getDistName(entrypoint.package, entrypoint.name);
const format = type === "cjs" ? "cjs" : "esm";
const env = type === "worker" || type === "browser" ? type : undefined;

const prefix = entrypoint.name.replace(entrypoint.package.name, "");
return `.${prefix}/dist/${safeName}.${env ? `${env}.` : ""}${format}.js`;
return `.${prefix}/${getDistFilename(entrypoint, target)}`;
}

export const validFieldsForEntrypoint = {
main(entrypoint: Entrypoint) {
return validFieldsFromPkg.main(entrypoint.package, entrypoint.name);
main(entrypoint: MinimalEntrypoint) {
return getDistFilename(entrypoint, "cjs");
},
module(entrypoint: Entrypoint) {
return validFieldsFromPkg.module(entrypoint.package, entrypoint.name);
module(entrypoint: MinimalEntrypoint) {
return getDistFilename(entrypoint, "esm");
},
"umd:main"(entrypoint: Entrypoint) {
return validFieldsFromPkg["umd:main"](entrypoint.package, entrypoint.name);
"umd:main"(entrypoint: MinimalEntrypoint) {
return getDistFilename(entrypoint, "umd");
},
browser(entrypoint: Entrypoint) {
return validFieldsFromPkg.browser(
entrypoint.package,
entrypoint.json.module !== undefined,
entrypoint.name
);
browser(entrypoint: MinimalEntrypoint) {
const moduleBuild = {
[`./${getDistFilename(entrypoint, "esm")}`]: `./${getDistFilename(
entrypoint,
"browser-esm"
)}`,
};

if (entrypoint.package.exportsFieldConfig()) {
return moduleBuild;
}

return {
[`./${getDistFilename(entrypoint, "cjs")}`]: `./${getDistFilename(
entrypoint,
"browser-cjs"
)}`,
...(entrypoint.hasModuleField && moduleBuild),
};
},
};

Expand Down

0 comments on commit a2c05e1

Please sign in to comment.