Skip to content

Commit

Permalink
feat(babel): decomposited 1st stage monolith into separate tasks (#1320)
Browse files Browse the repository at this point in the history
  • Loading branch information
Anber committed Aug 4, 2023
1 parent 715dc93 commit 9cb4143
Show file tree
Hide file tree
Showing 50 changed files with 1,529 additions and 985 deletions.
28 changes: 28 additions & 0 deletions .changeset/dull-cherries-burn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
---
'@linaria/atomic': minor
'@linaria/babel-preset': minor
'@linaria/cli': minor
'@linaria/core': minor
'@linaria/esbuild': minor
'@linaria/extractor': minor
'@linaria/griffel': minor
'@linaria/babel-plugin-interop': minor
'linaria': minor
'@linaria/logger': minor
'@linaria/postcss-linaria': minor
'@linaria/react': minor
'@linaria/rollup': minor
'@linaria/server': minor
'@linaria/shaker': minor
'@linaria/stylelint': minor
'@linaria/stylelint-config-standard-linaria': minor
'@linaria/tags': minor
'@linaria/testkit': minor
'@linaria/utils': minor
'@linaria/vite': minor
'@linaria/webpack-loader': minor
'@linaria/webpack4-loader': minor
'@linaria/webpack5-loader': minor
---

Refactoring of the 1st stage of transformation. It opens the road to processing wildcard reexports.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@
"typescript": "^4.7.4"
},
"engines": {
"node": "^12.16.0 || >=13.7.0",
"node": ">=16.0.0",
"pnpm": "^8.0.0"
}
}
2 changes: 1 addition & 1 deletion packages/atomic/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@
}
},
"engines": {
"node": "^12.16.0 || >=13.7.0"
"node": ">=16.0.0"
},
"publishConfig": {
"access": "public"
Expand Down
2 changes: 1 addition & 1 deletion packages/babel/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
"typescript": "^4.7.4"
},
"engines": {
"node": "^12.16.0 || >=13.7.0"
"node": ">=16.0.0"
},
"publishConfig": {
"access": "public"
Expand Down
11 changes: 11 additions & 0 deletions packages/babel/src/cache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,16 @@ import type { File } from '@babel/types';
import { linariaLogger } from '@linaria/logger';

import type { IModule } from './module';
import type { IEntrypoint } from './transform-stages/queue/types';
import type { ITransformFileResult } from './types';

function hashContent(content: string) {
return createHash('sha256').update(content).digest('hex');
}

interface ICaches {
entrypoints: Map<string, IEntrypoint>;
ignored: Map<string, true>;
resolve: Map<string, string>;
resolveTask: Map<
string,
Expand All @@ -38,6 +41,8 @@ type MapValue<T> = T extends Map<string, infer V> ? V : never;
const cacheLogger = linariaLogger.extend('cache');

const cacheNames = [
'entrypoints',
'ignored',
'resolve',
'resolveTask',
'code',
Expand All @@ -57,6 +62,10 @@ const loggers = cacheNames.reduce(
export class TransformCacheCollection {
private contentHashes = new Map<string, string>();

protected readonly entrypoints: Map<string, IEntrypoint>;

protected readonly ignored: Map<string, true>;

protected readonly resolve: Map<string, string>;

protected readonly resolveTask: Map<string, Promise<string>>;
Expand All @@ -75,6 +84,8 @@ export class TransformCacheCollection {
protected readonly originalAST: Map<string, File>;

constructor(caches: Partial<ICaches> = {}) {
this.entrypoints = caches.entrypoints || new Map();
this.ignored = caches.ignored || new Map();
this.resolve = caches.resolve || new Map();
this.resolveTask = caches.resolveTask || new Map();
this.code = caches.code || new Map();
Expand Down
6 changes: 2 additions & 4 deletions packages/babel/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,8 @@ export * from './types';
export { parseFile } from './transform-stages/helpers/parseFile';
export { default as loadLinariaOptions } from './transform-stages/helpers/loadLinariaOptions';
export type { PluginOptions } from './transform-stages/helpers/loadLinariaOptions';
export {
createEntrypoint,
prepareCode,
} from './transform-stages/1-prepare-for-eval';
export { prepareCode } from './transform-stages/queue/actions/transform';
export { createEntrypoint } from './transform-stages/queue/createEntrypoint';
export { transformUrl } from './transform-stages/4-extract';
export { default as isNode } from './utils/isNode';
export { default as getTagProcessor } from './utils/getTagProcessor';
Expand Down
31 changes: 30 additions & 1 deletion packages/babel/src/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,10 @@ class Module {

id: string;

ignored: boolean;

parentIsIgnored: boolean;

filename: string;

imports: Map<string, string[]> | null;
Expand Down Expand Up @@ -161,6 +165,8 @@ class Module {
this.dependencies = null;
this.transform = parentModule?.transform ?? null;
this.debug = createCustomDebug('module', this.idx);
this.parentIsIgnored = parentModule?.ignored ?? false;
this.ignored = this.cache.get('ignored', filename) ?? this.parentIsIgnored;

this.#lazyValues = new Map();

Expand Down Expand Up @@ -346,6 +352,22 @@ class Module {
return null;
}

if (this.cache.has('ignored', filename)) {
log(
'code-cache',
'✅ file has been ignored during prepare stage. Original code will be used'
);
return fs.readFileSync(filename, 'utf-8');
}

if (this.ignored) {
log(
'code-cache',
'✅ one of the parent files has been ignored during prepare stage. Original code will be used'
);
return fs.readFileSync(filename, 'utf-8');
}

// Requested file can be already prepared for evaluation on the stage 1
if (onlyAsString && this.cache.has('code', filename)) {
const cached = this.cache.get('code', filename);
Expand All @@ -354,12 +376,19 @@ class Module {
log('code-cache', '✅ ready for evaluation');
return cached?.result.code ?? '';
}

log(
'code-cache',
'❌ file has been processed during prepare stage but %o is not evaluated yet',
uncachedExports
);
} else {
log('code-cache', '❌ file has not been processed during prepare stage');
}

// If code wasn't extracted from cache, read it from the file system.
// It indicates that we were unable to process some of the imports on stage1
// TODO: transpile the file
log('code-cache', '❌ file has not been processed during prepare stage');
return fs.readFileSync(filename, 'utf-8');
}

Expand Down
8 changes: 5 additions & 3 deletions packages/babel/src/plugins/preeval.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export default function preeval(
this.processors = [];

const onProcessTemplateFinished = eventEmitter.pair({
method: 'preeval:processTemplate',
method: 'queue:transform:preeval:processTemplate',
});

file.path.traverse({
Expand All @@ -67,15 +67,17 @@ export default function preeval(
) {
log('start', 'Strip all JSX and browser related stuff');
const onCodeRemovingFinished = eventEmitter.pair({
method: 'preeval:removeDangerousCode',
method: 'queue:transform:preeval:removeDangerousCode',
});
removeDangerousCode(file.path);
onCodeRemovingFinished();
}

onFinishCallbacks.set(
this,
eventEmitter.pair({ method: 'preeval:rest-transformations' })
eventEmitter.pair({
method: 'queue:transform:preeval:rest-transformations',
})
);
},
visitor: {},
Expand Down

0 comments on commit 9cb4143

Please sign in to comment.