Skip to content

Commit

Permalink
Use ReadonlyArray
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolo-ribaudo committed Jan 30, 2022
1 parent 03b2de6 commit 287eb96
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 58 deletions.
5 changes: 2 additions & 3 deletions packages/babel-core/src/config/config-chain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import type {
} from "./validation/options";
import pathPatternToRegex from "./pattern-to-regex";
import { ConfigPrinter, ChainFormatter } from "./printer";
import type { ReadonlyDeepArray } from "./helpers/deep-array";

const debug = buildDebug("babel:config:config-chain");

Expand All @@ -35,8 +36,6 @@ import type {
ValidatedFile,
} from "./config-descriptors";

import ReadonlySet from "./helpers/readonly-set";

export type ConfigChain = {
plugins: Array<UnloadedDescriptor>;
presets: Array<UnloadedDescriptor>;
Expand All @@ -48,7 +47,7 @@ export type PresetInstance = {
options: ValidatedOptions;
alias: string;
dirname: string;
externalDependencies: ReadonlySet<string>;
externalDependencies: ReadonlyDeepArray<string>;
};

export type ConfigContext = {
Expand Down
37 changes: 17 additions & 20 deletions packages/babel-core/src/config/full.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import * as context from "../index";
import Plugin from "./plugin";
import { getItemDescriptor } from "./item";
import { buildPresetChain } from "./config-chain";
import { finalize as freezeDeepArray } from "./helpers/deep-array";
import type { DeepArray, ReadonlyDeepArray } from "./helpers/deep-array";
import type {
ConfigContext,
ConfigChain,
Expand All @@ -29,32 +31,27 @@ import loadPrivatePartialConfig from "./partial";
import type { ValidatedOptions } from "./validation/options";

import * as Context from "./cache-contexts";
import ReadonlySet from "./helpers/readonly-set";

type LoadedDescriptor = {
value: {};
options: {};
dirname: string;
alias: string;
externalDependencies: Set<string>;
externalDependencies: DeepArray<string>;
};

export type { InputOptions } from "./validation/options";

export type ResolvedConfig = {
options: any;
passes: PluginPasses;
externalDependencies: ReadonlySet<string>;
externalDependencies: ReadonlyDeepArray<string>;
};

export type { Plugin };
export type PluginPassList = Array<Plugin>;
export type PluginPasses = Array<PluginPassList>;

function copy<T>(dest: Set<T>, src: ReadonlySet<T>) {
src.forEach(dest.add, dest);
}

export default gensync<(inputOpts: unknown) => ResolvedConfig | null>(
function* loadFullConfig(inputOpts) {
const result = yield* loadPrivatePartialConfig(inputOpts);
Expand Down Expand Up @@ -94,7 +91,7 @@ export default gensync<(inputOpts: unknown) => ResolvedConfig | null>(
const pluginDescriptorsByPass: Array<Array<UnloadedDescriptor>> = [[]];
const passes: Array<Array<Plugin>> = [];

const externalDependencies = new Set<string>();
const externalDependencies: DeepArray<string> = [];

const ignored = yield* enhanceError(
context,
Expand Down Expand Up @@ -123,7 +120,7 @@ export default gensync<(inputOpts: unknown) => ResolvedConfig | null>(
throw e;
}

copy(externalDependencies, preset.externalDependencies);
externalDependencies.push(preset.externalDependencies);

// Presets normally run in reverse order, but if they
// have their own pass they run after the presets
Expand Down Expand Up @@ -205,7 +202,7 @@ export default gensync<(inputOpts: unknown) => ResolvedConfig | null>(
}
pass.push(plugin);

copy(externalDependencies, plugin.externalDependencies);
externalDependencies.push(plugin.externalDependencies);
}
}
}
Expand All @@ -221,7 +218,7 @@ export default gensync<(inputOpts: unknown) => ResolvedConfig | null>(
return {
options: opts,
passes: passes,
externalDependencies: new ReadonlySet(externalDependencies),
externalDependencies: freezeDeepArray(externalDependencies),
};
},
);
Expand All @@ -248,7 +245,7 @@ function enhanceError<T extends Function>(context, fn: T): T {
const makeDescriptorLoader = <Context, API>(
apiFactory: (
cache: CacheConfigurator<Context>,
externalDependencies: Set<string>,
externalDependencies: Array<string>,
) => API,
) =>
makeWeakCache(function* (
Expand All @@ -260,7 +257,7 @@ const makeDescriptorLoader = <Context, API>(

options = options || {};

const externalDependencies = new Set<string>();
const externalDependencies: Array<string> = [];

let item = value;
if (typeof value === "function") {
Expand Down Expand Up @@ -302,12 +299,12 @@ const makeDescriptorLoader = <Context, API>(
}

if (
externalDependencies.size > 0 &&
externalDependencies.length > 0 &&
(!cache.configured() || cache.mode() === "forever")
) {
const [firstDep] = externalDependencies;

let error = `A plugin/preset has external untracked dependencies (${firstDep}), but the cache `;
let error =
`A plugin/preset has external untracked dependencies ` +
`(${externalDependencies[0]}), but the cache `;
if (!cache.configured()) {
error += `has not been configured to be invalidated when the external dependencies change. `;
} else {
Expand Down Expand Up @@ -400,7 +397,7 @@ const instantiatePlugin = makeWeakCache(function* (
plugin.visitor || {},
]);

copy(externalDependencies, inherits.externalDependencies);
externalDependencies.push(inherits.externalDependencies);
}

return new Plugin(plugin, options, alias, externalDependencies);
Expand Down Expand Up @@ -450,7 +447,7 @@ function* loadPresetDescriptor(
context: Context.FullPreset,
): Handler<{
chain: ConfigChain | null;
externalDependencies: ReadonlySet<string>;
externalDependencies: ReadonlyDeepArray<string>;
}> {
const preset = instantiatePreset(
yield* presetDescriptorLoader(descriptor, context),
Expand All @@ -473,7 +470,7 @@ const instantiatePreset = makeWeakCacheSync(
options: validate("preset", value),
alias,
dirname,
externalDependencies: new ReadonlySet(externalDependencies),
externalDependencies: freezeDeepArray(externalDependencies),
};
},
);
Expand Down
6 changes: 3 additions & 3 deletions packages/babel-core/src/config/helpers/config-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ export function makeConfigAPI<SideChannel extends Context.SimpleConfig>(

export function makePresetAPI<SideChannel extends Context.SimplePreset>(
cache: CacheConfigurator<SideChannel>,
externalDependencies: Set<string>,
externalDependencies: Array<string>,
): PresetAPI {
const targets = () =>
// We are using JSON.parse/JSON.stringify because it's only possible to cache
Expand All @@ -88,15 +88,15 @@ export function makePresetAPI<SideChannel extends Context.SimplePreset>(
JSON.parse(cache.using(data => JSON.stringify(data.targets)));

const addExternalDependency = (ref: string) => {
externalDependencies.add(ref);
externalDependencies.push(ref);
};

return { ...makeConfigAPI(cache), targets, addExternalDependency };
}

export function makePluginAPI<SideChannel extends Context.SimplePlugin>(
cache: CacheConfigurator<SideChannel>,
externalDependencies: Set<string>,
externalDependencies: Array<string>,
): PluginAPI {
const assumption = name => cache.using(data => data.assumptions[name]);

Expand Down
23 changes: 23 additions & 0 deletions packages/babel-core/src/config/helpers/deep-array.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
export type DeepArray<T> = Array<T | ReadonlyDeepArray<T>>;

// Just to make sure that DeepArray<T> is not assignable to ReadonlyDeepArray<T>
declare const __marker: unique symbol;
export type ReadonlyDeepArray<T> = ReadonlyArray<T | ReadonlyDeepArray<T>> & {
[__marker]: true;
};

export function finalize<T>(deepArr: DeepArray<T>): ReadonlyDeepArray<T> {
return Object.freeze(deepArr) as ReadonlyDeepArray<T>;
}

export function flattenToSet<T>(arr: ReadonlyDeepArray<T>): Set<T> {
const result = new Set<T>();
const stack = [arr];
while (stack.length > 0) {
for (const el of stack.pop()) {
if (Array.isArray(el)) stack.push(el as ReadonlyDeepArray<T>);
else result.add(el as T);
}
}
return result;
}
25 changes: 0 additions & 25 deletions packages/babel-core/src/config/helpers/readonly-set.ts

This file was deleted.

9 changes: 5 additions & 4 deletions packages/babel-core/src/config/plugin.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { finalize } from "./helpers/deep-array";
import type { DeepArray, ReadonlyDeepArray } from "./helpers/deep-array";
import type { PluginObject } from "./validation/plugins";
import ReadonlySet from "./helpers/readonly-set";

export default class Plugin {
key: string | undefined | null;
Expand All @@ -13,13 +14,13 @@ export default class Plugin {

options: {};

externalDependencies: ReadonlySet<string>;
externalDependencies: ReadonlyDeepArray<string>;

constructor(
plugin: PluginObject,
options: {},
key?: string,
externalDependencies: Set<string> = new Set(),
externalDependencies: DeepArray<string> = [],
) {
this.key = plugin.name || key;

Expand All @@ -32,6 +33,6 @@ export default class Plugin {

this.options = options;

this.externalDependencies = new ReadonlySet(externalDependencies);
this.externalDependencies = finalize(externalDependencies);
}
}
6 changes: 3 additions & 3 deletions packages/babel-core/src/transformation/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import normalizeFile from "./normalize-file";
import generateCode from "./file/generate";
import type File from "./file/file";

import type ReadonlySet from "../config/helpers/readonly-set";
import { flattenToSet } from "../config/helpers/deep-array";

export type FileResultCallback = {
(err: Error, file: null): any;
Expand All @@ -27,7 +27,7 @@ export type FileResult = {
code: string | null;
map: SourceMap | null;
sourceType: "string" | "module";
externalDependencies: ReadonlySet<string>;
externalDependencies: Set<string>;
};

export function* run(
Expand Down Expand Up @@ -73,7 +73,7 @@ export function* run(
code: outputCode === undefined ? null : outputCode,
map: outputMap === undefined ? null : outputMap,
sourceType: file.ast.program.sourceType,
externalDependencies: config.externalDependencies,
externalDependencies: flattenToSet(config.externalDependencies),
};
}

Expand Down

0 comments on commit 287eb96

Please sign in to comment.