xbintsc 0.3.18 → 0.3.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/dist/src/cli/main.js +124 -30
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/codegen/generator/calls/access.js +8 -1
- package/dist/src/codegen/generator/calls/access.js.map +1 -1
- package/dist/src/codegen/generator/state.js +20 -0
- package/dist/src/codegen/generator/state.js.map +1 -1
- package/dist/src/codegen/generator/tables.d.ts +6 -0
- package/dist/src/codegen/generator/tables.js +38 -0
- package/dist/src/codegen/generator/tables.js.map +1 -1
- package/dist/src/driver/bundler/commonjs.d.ts +52 -0
- package/dist/src/driver/bundler/commonjs.js +493 -0
- package/dist/src/driver/bundler/commonjs.js.map +1 -0
- package/dist/src/driver/bundler/graph.d.ts +2 -1
- package/dist/src/driver/bundler/graph.js +32 -3
- package/dist/src/driver/bundler/graph.js.map +1 -1
- package/dist/src/driver/bundler/merge.d.ts +2 -1
- package/dist/src/driver/bundler/merge.js +16 -2
- package/dist/src/driver/bundler/merge.js.map +1 -1
- package/dist/src/driver/bundler/types.d.ts +8 -0
- package/dist/src/driver/compiler.d.ts +8 -1
- package/dist/src/driver/compiler.js +75 -7
- package/dist/src/driver/compiler.js.map +1 -1
- package/dist/src/driver/config.d.ts +53 -0
- package/dist/src/driver/config.js +141 -0
- package/dist/src/driver/config.js.map +1 -0
- package/dist/src/driver/icon.d.ts +62 -0
- package/dist/src/driver/icon.js +151 -0
- package/dist/src/driver/icon.js.map +1 -0
- package/dist/src/driver/index.d.ts +4 -0
- package/dist/src/driver/index.js +4 -0
- package/dist/src/driver/index.js.map +1 -1
- package/dist/src/driver/mac-bundle.d.ts +41 -0
- package/dist/src/driver/mac-bundle.js +123 -0
- package/dist/src/driver/mac-bundle.js.map +1 -0
- package/dist/src/driver/win-icon.d.ts +27 -0
- package/dist/src/driver/win-icon.js +80 -0
- package/dist/src/driver/win-icon.js.map +1 -0
- package/dist/src/extensions/gui/html.d.ts +25 -0
- package/dist/src/extensions/gui/html.js +203 -0
- package/dist/src/extensions/gui/html.js.map +1 -0
- package/dist/src/extensions/gui/index.js +11 -0
- package/dist/src/extensions/gui/index.js.map +1 -1
- package/dist/src/extensions/registry.d.ts +29 -0
- package/dist/src/extensions/registry.js +14 -0
- package/dist/src/extensions/registry.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/lexer/scanner/identifiers.js +4 -12
- package/dist/src/lexer/scanner/identifiers.js.map +1 -1
- package/dist/src/parser/statements.js +17 -4
- package/dist/src/parser/statements.js.map +1 -1
- package/dist/tests/cli/main.test.js +46 -1
- package/dist/tests/cli/main.test.js.map +1 -1
- package/dist/tests/driver/bundler-resolve.test.d.ts +1 -0
- package/dist/tests/driver/bundler-resolve.test.js +230 -0
- package/dist/tests/driver/bundler-resolve.test.js.map +1 -0
- package/dist/tests/driver/config.test.d.ts +1 -0
- package/dist/tests/driver/config.test.js +124 -0
- package/dist/tests/driver/config.test.js.map +1 -0
- package/dist/tests/driver/icon.test.d.ts +1 -0
- package/dist/tests/driver/icon.test.js +421 -0
- package/dist/tests/driver/icon.test.js.map +1 -0
- package/dist/tests/driver/modules.test.js +177 -0
- package/dist/tests/driver/modules.test.js.map +1 -1
- package/dist/tests/e2e/fetch.test.d.ts +12 -0
- package/dist/tests/e2e/fetch.test.js +272 -0
- package/dist/tests/e2e/fetch.test.js.map +1 -0
- package/dist/tests/e2e/gui-dom.test.d.ts +5 -0
- package/dist/tests/e2e/gui-dom.test.js +102 -0
- package/dist/tests/e2e/gui-dom.test.js.map +1 -0
- package/dist/tests/e2e/gui-events.test.d.ts +5 -0
- package/dist/tests/e2e/gui-events.test.js +60 -0
- package/dist/tests/e2e/gui-events.test.js.map +1 -0
- package/dist/tests/e2e/gui-helpers.d.ts +31 -0
- package/dist/tests/e2e/gui-helpers.js +74 -0
- package/dist/tests/e2e/gui-helpers.js.map +1 -0
- package/dist/tests/e2e/gui-layout.test.d.ts +4 -0
- package/dist/tests/e2e/gui-layout.test.js +88 -0
- package/dist/tests/e2e/gui-layout.test.js.map +1 -0
- package/dist/tests/e2e/gui-lifecycle.test.d.ts +5 -0
- package/dist/tests/e2e/gui-lifecycle.test.js +58 -0
- package/dist/tests/e2e/gui-lifecycle.test.js.map +1 -0
- package/dist/tests/e2e/gui-paint.test.d.ts +5 -0
- package/dist/tests/e2e/gui-paint.test.js +111 -0
- package/dist/tests/e2e/gui-paint.test.js.map +1 -0
- package/dist/tests/e2e/gui-script.test.d.ts +5 -0
- package/dist/tests/e2e/gui-script.test.js +78 -0
- package/dist/tests/e2e/gui-script.test.js.map +1 -0
- package/dist/tests/e2e/gui-style.test.d.ts +5 -0
- package/dist/tests/e2e/gui-style.test.js +175 -0
- package/dist/tests/e2e/gui-style.test.js.map +1 -0
- package/dist/tests/e2e/icon.test.d.ts +7 -0
- package/dist/tests/e2e/icon.test.js +80 -0
- package/dist/tests/e2e/icon.test.js.map +1 -0
- package/dist/tests/e2e/npm-modules.test.d.ts +4 -1
- package/dist/tests/e2e/npm-modules.test.js +47 -1
- package/dist/tests/e2e/npm-modules.test.js.map +1 -1
- package/dist/tests/e2e/runtime-coverage-typed-array.test.d.ts +9 -0
- package/dist/tests/e2e/runtime-coverage-typed-array.test.js +140 -0
- package/dist/tests/e2e/runtime-coverage-typed-array.test.js.map +1 -0
- package/dist/tests/extensions/gui-index.test.d.ts +1 -0
- package/dist/tests/extensions/gui-index.test.js +49 -0
- package/dist/tests/extensions/gui-index.test.js.map +1 -0
- package/dist/tests/extensions/gui.test.d.ts +1 -0
- package/dist/tests/extensions/gui.test.js +177 -0
- package/dist/tests/extensions/gui.test.js.map +1 -0
- package/dist/tests/extensions/registry.test.js +36 -0
- package/dist/tests/extensions/registry.test.js.map +1 -1
- package/dist/tests/parser/statements.test.js +11 -0
- package/dist/tests/parser/statements.test.js.map +1 -1
- package/dist/tests/public-api.test.d.ts +1 -0
- package/dist/tests/public-api.test.js +31 -0
- package/dist/tests/public-api.test.js.map +1 -0
- package/package.json +1 -1
- package/runtime/ext_gui/css.cpp +4 -517
- package/runtime/ext_gui/css_internal.h +27 -0
- package/runtime/ext_gui/css_match.cpp +195 -0
- package/runtime/ext_gui/css_selector.cpp +207 -0
- package/runtime/ext_gui/css_sheet.cpp +129 -0
- package/runtime/ext_gui/document.cpp +90 -0
- package/runtime/ext_gui/document.h +23 -0
- package/runtime/ext_gui/dom.cpp +43 -403
- package/runtime/ext_gui/dom.h +7 -0
- package/runtime/ext_gui/dom_api.cpp +164 -0
- package/runtime/ext_gui/dom_api.h +12 -0
- package/runtime/ext_gui/dom_api_document.cpp +96 -0
- package/runtime/ext_gui/dom_api_events.cpp +123 -0
- package/runtime/ext_gui/dom_api_internal.h +135 -0
- package/runtime/ext_gui/dom_api_node.cpp +329 -0
- package/runtime/ext_gui/dom_api_node_read.cpp +294 -0
- package/runtime/ext_gui/dom_api_proto.cpp +130 -0
- package/runtime/ext_gui/dom_api_style.cpp +192 -0
- package/runtime/ext_gui/dom_internal.h +39 -0
- package/runtime/ext_gui/dom_parse.cpp +348 -0
- package/runtime/ext_gui/dom_serialize.cpp +54 -0
- package/runtime/ext_gui/gui.cpp +61 -245
- package/runtime/ext_gui/gui_engine.h +54 -0
- package/runtime/ext_gui/gui_events.cpp +294 -0
- package/runtime/ext_gui/gui_internal.h +29 -0
- package/runtime/ext_gui/layout.cpp +6 -597
- package/runtime/ext_gui/layout_flex.cpp +200 -0
- package/runtime/ext_gui/layout_flow.cpp +191 -0
- package/runtime/ext_gui/layout_flow_internal.h +149 -0
- package/runtime/ext_gui/layout_inline.cpp +181 -0
- package/runtime/ext_gui/layout_internal.h +20 -0
- package/runtime/ext_gui/renderer.cpp +15 -679
- package/runtime/ext_gui/renderer_image.cpp +233 -0
- package/runtime/ext_gui/renderer_internal.h +112 -0
- package/runtime/ext_gui/renderer_shaders.h +108 -0
- package/runtime/ext_gui/renderer_text.cpp +342 -0
- package/runtime/ext_gui/script.cpp +63 -0
- package/runtime/ext_gui/style.cpp +12 -660
- package/runtime/ext_gui/style_internal.h +33 -0
- package/runtime/ext_gui/style_print.cpp +113 -0
- package/runtime/ext_gui/style_ua.cpp +98 -0
- package/runtime/ext_gui/style_values.cpp +468 -0
- package/runtime/ext_gui/window.cpp +60 -0
- package/runtime/rt.h +6 -0
- package/runtime/rt_internal.h +4 -0
- package/runtime/xt_builtins.c +1 -0
- package/runtime/xt_containers/access.inc +32 -1
- package/runtime/xt_fetch/buffer.inc +64 -0
- package/runtime/xt_fetch/headers.inc +312 -0
- package/runtime/xt_fetch/request.inc +386 -0
- package/runtime/xt_fetch/response.inc +107 -0
- package/runtime/xt_fetch/socket.inc +72 -0
- package/runtime/xt_fetch/url.inc +108 -0
- package/runtime/xt_fetch.c +39 -0
- package/runtime/xt_stdlib2/set.inc +1 -1
- package/runtime/xt_typed_array.c +614 -0
- package/src/cli/main.ts +137 -29
- package/src/codegen/generator/calls/access.ts +9 -1
- package/src/codegen/generator/state.ts +20 -0
- package/src/codegen/generator/tables.ts +40 -0
- package/src/driver/bundler/commonjs.ts +553 -0
- package/src/driver/bundler/graph.ts +35 -2
- package/src/driver/bundler/merge.ts +18 -1
- package/src/driver/bundler/types.ts +8 -0
- package/src/driver/compiler.ts +85 -7
- package/src/driver/config.ts +173 -0
- package/src/driver/icon.ts +184 -0
- package/src/driver/index.ts +30 -0
- package/src/driver/mac-bundle.ts +156 -0
- package/src/driver/win-icon.ts +96 -0
- package/src/extensions/gui/html.ts +236 -0
- package/src/extensions/gui/index.ts +11 -0
- package/src/extensions/registry.ts +39 -0
- package/src/index.ts +1 -1
- package/src/lexer/scanner/identifiers.ts +4 -11
- package/src/parser/statements.ts +17 -4
- package/dist/tests/e2e/gui.test.d.ts +0 -12
- package/dist/tests/e2e/gui.test.js +0 -493
- package/dist/tests/e2e/gui.test.js.map +0 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CommonJS compatibility for `node_modules`.
|
|
3
|
+
*
|
|
4
|
+
* xbintsc is ESM-first: relative `.ts` files and ESM packages are bundled into
|
|
5
|
+
* one module and `require()` in user code is rejected. npm, however, still
|
|
6
|
+
* ships a lot of CommonJS. This pass lets a CommonJS file *inside
|
|
7
|
+
* `node_modules`* keep working by lowering its free `module` / `exports` /
|
|
8
|
+
* `require` references to per-module synthetic bindings:
|
|
9
|
+
*
|
|
10
|
+
* const <prefix>$cjs_module = { exports: {} };
|
|
11
|
+
* const <prefix>$cjs_exports = <prefix>$cjs_module.exports;
|
|
12
|
+
*
|
|
13
|
+
* `module.exports = x` and `exports.x = y` then behave as they do in Node, and
|
|
14
|
+
* `require("x")` is rewritten to the already-bundled dependency's exports
|
|
15
|
+
* object. User code (anything outside `node_modules`) is left untouched, so
|
|
16
|
+
* the code generator still reports its `require` use.
|
|
17
|
+
*/
|
|
18
|
+
import { type CallExpression, type SourceFileNode } from "../../ast/nodes.js";
|
|
19
|
+
import type { BindResult } from "../../binder/binder.js";
|
|
20
|
+
import type { DiagnosticBag } from "../../diagnostics/diagnostic.js";
|
|
21
|
+
import type { DependencyResolution, ModuleRecord } from "./types.js";
|
|
22
|
+
/** The specifier of every `require("...")` call in a module. */
|
|
23
|
+
export interface RequireSite {
|
|
24
|
+
/** The call node, for the diagnostic location. */
|
|
25
|
+
readonly node: CallExpression;
|
|
26
|
+
/** The string literal argument's value. */
|
|
27
|
+
readonly specifier: string;
|
|
28
|
+
}
|
|
29
|
+
/** True when a path lives under a `node_modules` directory. */
|
|
30
|
+
export declare function isNodeModulesPath(path: string): boolean;
|
|
31
|
+
/** True when a module references `require`, `module` or `exports` freely. */
|
|
32
|
+
export declare function usesCommonJS(bind: BindResult): boolean;
|
|
33
|
+
/** Every `require("<literal>")` call in a module. */
|
|
34
|
+
export declare function collectRequireSites(sourceFile: SourceFileNode, bind: BindResult): RequireSite[];
|
|
35
|
+
export interface CommonJSLoweringContext {
|
|
36
|
+
readonly resolve: (fromDir: string, specifier: string) => DependencyResolution;
|
|
37
|
+
readonly recordFor: (path: string) => ModuleRecord | undefined;
|
|
38
|
+
readonly diagnostics: DiagnosticBag;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Phase A: give a CommonJS module its `module` / `exports` state, rewrite the
|
|
42
|
+
* free references, and record its export surface (whole-object `default` plus
|
|
43
|
+
* every syntactically detectable named export). Runs before the ESM export
|
|
44
|
+
* collection so re-exports of a CommonJS module resolve.
|
|
45
|
+
*/
|
|
46
|
+
export declare function prepareCommonJS(record: ModuleRecord): void;
|
|
47
|
+
/**
|
|
48
|
+
* Phase B: rewrite every `require("x")` call to the bundled dependency's
|
|
49
|
+
* exports. Runs after the ESM export collection because a required ESM module
|
|
50
|
+
* is exposed as a synthetic namespace object.
|
|
51
|
+
*/
|
|
52
|
+
export declare function lowerCommonJSRequires(record: ModuleRecord, context: CommonJSLoweringContext): void;
|
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CommonJS compatibility for `node_modules`.
|
|
3
|
+
*
|
|
4
|
+
* xbintsc is ESM-first: relative `.ts` files and ESM packages are bundled into
|
|
5
|
+
* one module and `require()` in user code is rejected. npm, however, still
|
|
6
|
+
* ships a lot of CommonJS. This pass lets a CommonJS file *inside
|
|
7
|
+
* `node_modules`* keep working by lowering its free `module` / `exports` /
|
|
8
|
+
* `require` references to per-module synthetic bindings:
|
|
9
|
+
*
|
|
10
|
+
* const <prefix>$cjs_module = { exports: {} };
|
|
11
|
+
* const <prefix>$cjs_exports = <prefix>$cjs_module.exports;
|
|
12
|
+
*
|
|
13
|
+
* `module.exports = x` and `exports.x = y` then behave as they do in Node, and
|
|
14
|
+
* `require("x")` is rewritten to the already-bundled dependency's exports
|
|
15
|
+
* object. User code (anything outside `node_modules`) is left untouched, so
|
|
16
|
+
* the code generator still reports its `require` use.
|
|
17
|
+
*/
|
|
18
|
+
import { dirname } from "node:path";
|
|
19
|
+
import { SyntaxKind, } from "../../ast/nodes.js";
|
|
20
|
+
import { DiagnosticCode } from "../../diagnostics/diagnostic.js";
|
|
21
|
+
import { moduleScope, renameReferences } from "./symbols.js";
|
|
22
|
+
/** True when a path lives under a `node_modules` directory. */
|
|
23
|
+
export function isNodeModulesPath(path) {
|
|
24
|
+
return path.split(/[\\/]+/).includes("node_modules");
|
|
25
|
+
}
|
|
26
|
+
/** True when a module references `require`, `module` or `exports` freely. */
|
|
27
|
+
export function usesCommonJS(bind) {
|
|
28
|
+
return bind.unresolved.some((identifier) => identifier.text === "require" || identifier.text === "module" || identifier.text === "exports");
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A `require` identifier is CommonJS only when it has no binding; a local
|
|
32
|
+
* `function require() {}` or parameter must not be treated as the CJS hook.
|
|
33
|
+
*/
|
|
34
|
+
function isFreeRequire(identifier, bind) {
|
|
35
|
+
return identifier.text === "require" && !bind.symbolOfIdentifier.get(identifier);
|
|
36
|
+
}
|
|
37
|
+
/** Every `require("<literal>")` call in a module. */
|
|
38
|
+
export function collectRequireSites(sourceFile, bind) {
|
|
39
|
+
const sites = [];
|
|
40
|
+
forEachNode(sourceFile, (node) => {
|
|
41
|
+
if (node.kind !== SyntaxKind.CallExpression)
|
|
42
|
+
return;
|
|
43
|
+
const call = node;
|
|
44
|
+
const callee = call.expression;
|
|
45
|
+
if (callee.kind !== SyntaxKind.Identifier)
|
|
46
|
+
return;
|
|
47
|
+
if (!isFreeRequire(callee, bind))
|
|
48
|
+
return;
|
|
49
|
+
const first = call.arguments[0];
|
|
50
|
+
if (first && first.kind === SyntaxKind.StringLiteral) {
|
|
51
|
+
sites.push({ node: call, specifier: first.value });
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
return sites;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Phase A: give a CommonJS module its `module` / `exports` state, rewrite the
|
|
58
|
+
* free references, and record its export surface (whole-object `default` plus
|
|
59
|
+
* every syntactically detectable named export). Runs before the ESM export
|
|
60
|
+
* collection so re-exports of a CommonJS module resolve.
|
|
61
|
+
*/
|
|
62
|
+
export function prepareCommonJS(record) {
|
|
63
|
+
if (!record.commonjs)
|
|
64
|
+
return;
|
|
65
|
+
const statements = record.sourceFile.statements;
|
|
66
|
+
const anchor = statements[0]?.start ?? record.sourceFile.start;
|
|
67
|
+
const moduleName = `${record.prefix}$cjs_module`;
|
|
68
|
+
const exportsName = `${record.prefix}$cjs_exports`;
|
|
69
|
+
record.cjsModule = moduleName;
|
|
70
|
+
const hasExports = record.bind.unresolved.some((identifier) => identifier.text === "exports");
|
|
71
|
+
const hasModule = record.bind.unresolved.some((identifier) => identifier.text === "module");
|
|
72
|
+
// Detect exports before rewriting `module`/`exports`, since the detection
|
|
73
|
+
// matches on their original names.
|
|
74
|
+
const exportNames = detectExportNames(record.sourceFile, record.bind);
|
|
75
|
+
for (const identifier of record.bind.unresolved) {
|
|
76
|
+
if (identifier.text === "module" && hasModule)
|
|
77
|
+
identifier.text = moduleName;
|
|
78
|
+
else if (identifier.text === "exports" && hasExports)
|
|
79
|
+
identifier.text = exportsName;
|
|
80
|
+
}
|
|
81
|
+
const prefixStatements = [
|
|
82
|
+
variableStatement(moduleName, objectLiteral([propertyAssignment("exports", objectLiteral([]))]), anchor),
|
|
83
|
+
];
|
|
84
|
+
prefixStatements.push(variableStatement(exportsName, member(moduleName, "exports", anchor), anchor));
|
|
85
|
+
const suffixStatements = [];
|
|
86
|
+
const defaultName = `${record.prefix}$cjs_default`;
|
|
87
|
+
suffixStatements.push(variableStatement(defaultName, member(moduleName, "exports", anchor), anchor));
|
|
88
|
+
record.exports.set("default", defaultName);
|
|
89
|
+
for (const name of exportNames) {
|
|
90
|
+
const local = `${record.prefix}$cjs_${name}`;
|
|
91
|
+
suffixStatements.push(variableStatement(local, member(member(moduleName, "exports", anchor), name, anchor), anchor));
|
|
92
|
+
record.exports.set(name, local);
|
|
93
|
+
}
|
|
94
|
+
statements.unshift(...prefixStatements);
|
|
95
|
+
statements.push(...suffixStatements);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Phase B: rewrite every `require("x")` call to the bundled dependency's
|
|
99
|
+
* exports. Runs after the ESM export collection because a required ESM module
|
|
100
|
+
* is exposed as a synthetic namespace object.
|
|
101
|
+
*/
|
|
102
|
+
export function lowerCommonJSRequires(record, context) {
|
|
103
|
+
if (!record.commonjs)
|
|
104
|
+
return;
|
|
105
|
+
const statements = record.sourceFile.statements;
|
|
106
|
+
const anchor = statements[0]?.start ?? record.sourceFile.start;
|
|
107
|
+
const imports = [];
|
|
108
|
+
const namespaces = [];
|
|
109
|
+
let counter = 0;
|
|
110
|
+
// Before rewriting requires, turn `var x = require("node:fs")` into an ESM
|
|
111
|
+
// namespace import. Extension/built-in modules are not first-class values in
|
|
112
|
+
// the code generator, so binding one to a local name has to make the local
|
|
113
|
+
// name an import binding rather than an assignment of the module object.
|
|
114
|
+
hoistExternalNamespaceRequires(record, context, statements, anchor);
|
|
115
|
+
const replace = (node) => {
|
|
116
|
+
if (node.kind !== SyntaxKind.CallExpression)
|
|
117
|
+
return undefined;
|
|
118
|
+
const call = node;
|
|
119
|
+
const callee = call.expression;
|
|
120
|
+
if (callee.kind !== SyntaxKind.Identifier)
|
|
121
|
+
return undefined;
|
|
122
|
+
if (!isFreeRequire(callee, record.bind))
|
|
123
|
+
return undefined;
|
|
124
|
+
const first = call.arguments[0];
|
|
125
|
+
if (!first || first.kind !== SyntaxKind.StringLiteral) {
|
|
126
|
+
context.diagnostics.error(DiagnosticCode.UnsupportedFeature, "CommonJS `require()` with a non-literal argument is not supported", node, record.path);
|
|
127
|
+
return undefinedLiteral(anchor);
|
|
128
|
+
}
|
|
129
|
+
const specifier = first.value;
|
|
130
|
+
const resolution = context.resolve(dirname(record.path), specifier);
|
|
131
|
+
if (resolution.kind === "missing") {
|
|
132
|
+
context.diagnostics.error(DiagnosticCode.CodegenError, `Cannot resolve module '${specifier}' required from '${record.path}'`, node, record.path);
|
|
133
|
+
return undefinedLiteral(anchor);
|
|
134
|
+
}
|
|
135
|
+
if (resolution.kind === "external") {
|
|
136
|
+
const name = `${record.prefix}$ext_${counter++}`;
|
|
137
|
+
imports.push(defaultImport(name, specifier, anchor));
|
|
138
|
+
return identifier(name, anchor);
|
|
139
|
+
}
|
|
140
|
+
const dependency = context.recordFor(resolution.path);
|
|
141
|
+
if (!dependency) {
|
|
142
|
+
context.diagnostics.error(DiagnosticCode.CodegenError, `Cannot resolve module '${specifier}' required from '${record.path}'`, node, record.path);
|
|
143
|
+
return undefinedLiteral(anchor);
|
|
144
|
+
}
|
|
145
|
+
if (dependency.commonjs && dependency.cjsModule) {
|
|
146
|
+
return member(dependency.cjsModule, "exports", anchor);
|
|
147
|
+
}
|
|
148
|
+
// An ESM dependency is exposed to `require` as a namespace object.
|
|
149
|
+
const name = `${record.prefix}$req_${counter++}`;
|
|
150
|
+
namespaces.push(variableStatement(name, namespaceObject(dependency, anchor), anchor));
|
|
151
|
+
return identifier(name, anchor);
|
|
152
|
+
};
|
|
153
|
+
for (const statement of statements)
|
|
154
|
+
replaceInTree(statement, replace);
|
|
155
|
+
if (imports.length > 0 || namespaces.length > 0)
|
|
156
|
+
statements.unshift(...imports, ...namespaces);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Statically detect a CommonJS module's named exports so ESM consumers can
|
|
160
|
+
* import them: `exports.x = ...`, `module.exports.x = ...`, an object-literal
|
|
161
|
+
* `module.exports = { ... }`, and the `Object.defineProperty`/`Object.assign`
|
|
162
|
+
* forms.
|
|
163
|
+
*/
|
|
164
|
+
function detectExportNames(sourceFile, bind) {
|
|
165
|
+
const names = new Set();
|
|
166
|
+
forEachNode(sourceFile, (node) => {
|
|
167
|
+
if (node.kind === SyntaxKind.BinaryExpression) {
|
|
168
|
+
const assignment = node;
|
|
169
|
+
if (assignment.operator !== "=")
|
|
170
|
+
return;
|
|
171
|
+
const name = namedExportTarget(assignment.left, bind);
|
|
172
|
+
if (name)
|
|
173
|
+
names.add(name);
|
|
174
|
+
if (isModuleExports(assignment.left, bind) && assignment.right.kind === SyntaxKind.ObjectLiteralExpression) {
|
|
175
|
+
for (const property of assignment.right.properties) {
|
|
176
|
+
const key = literalPropertyName(property);
|
|
177
|
+
if (key)
|
|
178
|
+
names.add(key);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else if (node.kind === SyntaxKind.CallExpression) {
|
|
183
|
+
const call = node;
|
|
184
|
+
const callee = call.expression;
|
|
185
|
+
if (callee.kind !== SyntaxKind.PropertyAccessExpression)
|
|
186
|
+
return;
|
|
187
|
+
const access = callee;
|
|
188
|
+
if (access.expression.kind !== SyntaxKind.Identifier)
|
|
189
|
+
return;
|
|
190
|
+
const method = access.name.text;
|
|
191
|
+
const target = call.arguments[0];
|
|
192
|
+
const value = call.arguments[1];
|
|
193
|
+
if (access.expression.kind === SyntaxKind.Identifier && access.expression.text === "Object") {
|
|
194
|
+
if (method === "defineProperty" && target && value && value.kind === SyntaxKind.StringLiteral) {
|
|
195
|
+
if (isModuleExportsOrExports(target, bind))
|
|
196
|
+
names.add(value.value);
|
|
197
|
+
}
|
|
198
|
+
else if (method === "assign" && target && isModuleExportsOrExports(target, bind) && value) {
|
|
199
|
+
if (value.kind === SyntaxKind.ObjectLiteralExpression) {
|
|
200
|
+
for (const property of value.properties) {
|
|
201
|
+
const key = literalPropertyName(property);
|
|
202
|
+
if (key)
|
|
203
|
+
names.add(key);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
// Keep only names that are safe to snapshot via `.name` access.
|
|
211
|
+
return [...names].filter((name) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name) && name !== "default");
|
|
212
|
+
}
|
|
213
|
+
/** The property name assigned through `exports.x` / `module.exports.x`. */
|
|
214
|
+
function namedExportTarget(left, bind) {
|
|
215
|
+
if (left.kind !== SyntaxKind.PropertyAccessExpression)
|
|
216
|
+
return undefined;
|
|
217
|
+
const access = left;
|
|
218
|
+
const owner = access.expression;
|
|
219
|
+
if (isModuleExportsOrExports(owner, bind))
|
|
220
|
+
return access.name.text;
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
function isModuleExportsOrExports(expression, bind) {
|
|
224
|
+
if (expression.kind !== SyntaxKind.Identifier) {
|
|
225
|
+
if (expression.kind !== SyntaxKind.PropertyAccessExpression)
|
|
226
|
+
return false;
|
|
227
|
+
return isModuleExports(expression, bind);
|
|
228
|
+
}
|
|
229
|
+
const identifier = expression;
|
|
230
|
+
return identifier.text === "exports" && !bind.symbolOfIdentifier.get(identifier);
|
|
231
|
+
}
|
|
232
|
+
function isModuleExports(expression, bind) {
|
|
233
|
+
if (expression.kind !== SyntaxKind.PropertyAccessExpression)
|
|
234
|
+
return false;
|
|
235
|
+
const access = expression;
|
|
236
|
+
if (access.name.text !== "exports")
|
|
237
|
+
return false;
|
|
238
|
+
const owner = access.expression;
|
|
239
|
+
if (owner.kind !== SyntaxKind.Identifier)
|
|
240
|
+
return false;
|
|
241
|
+
const identifier = owner;
|
|
242
|
+
return identifier.text === "module" && !bind.symbolOfIdentifier.get(identifier);
|
|
243
|
+
}
|
|
244
|
+
function literalPropertyName(property) {
|
|
245
|
+
if (property.kind === SyntaxKind.ShorthandPropertyAssignment) {
|
|
246
|
+
return property.name.text;
|
|
247
|
+
}
|
|
248
|
+
if (property.kind === SyntaxKind.PropertyAssignment) {
|
|
249
|
+
const name = property.name;
|
|
250
|
+
if (name.kind === SyntaxKind.Identifier || name.kind === SyntaxKind.StringLiteral) {
|
|
251
|
+
return name.text ?? name.value;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return undefined;
|
|
255
|
+
}
|
|
256
|
+
/** Build `{ default: <dep default>, ...named }` for a required ESM module. */
|
|
257
|
+
function namespaceObject(dependency, anchor) {
|
|
258
|
+
const properties = [];
|
|
259
|
+
const names = [...dependency.exports.keys()].filter((name) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name));
|
|
260
|
+
for (const name of ["default", ...names.filter((name) => name !== "default")]) {
|
|
261
|
+
const target = dependency.exports.get(name);
|
|
262
|
+
if (target)
|
|
263
|
+
properties.push(propertyAssignment(name, identifier(target, anchor)));
|
|
264
|
+
}
|
|
265
|
+
return objectLiteral(properties);
|
|
266
|
+
}
|
|
267
|
+
// ---------------------------------------------------------------------------
|
|
268
|
+
// Generic, allocation-light AST helpers (constructed nodes carry no trivia).
|
|
269
|
+
// ---------------------------------------------------------------------------
|
|
270
|
+
function isNode(value) {
|
|
271
|
+
return !!value && typeof value === "object" && "kind" in value;
|
|
272
|
+
}
|
|
273
|
+
/** Pre-order walk over every child node. */
|
|
274
|
+
function forEachNode(root, visit) {
|
|
275
|
+
visit(root);
|
|
276
|
+
const record = root;
|
|
277
|
+
for (const key of Object.keys(record)) {
|
|
278
|
+
if (key === "kind" || key === "start" || key === "end" || key === "text" || key === "value" || key === "raw")
|
|
279
|
+
continue;
|
|
280
|
+
const value = record[key];
|
|
281
|
+
if (Array.isArray(value)) {
|
|
282
|
+
for (const child of value)
|
|
283
|
+
if (isNode(child))
|
|
284
|
+
forEachNode(child, visit);
|
|
285
|
+
}
|
|
286
|
+
else if (isNode(value)) {
|
|
287
|
+
forEachNode(value, visit);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/** Children-first walk that lets `replace` swap a node for a new expression. */
|
|
292
|
+
function replaceInTree(node, replace) {
|
|
293
|
+
const record = node;
|
|
294
|
+
for (const key of Object.keys(record)) {
|
|
295
|
+
if (key === "kind" || key === "start" || key === "end" || key === "text" || key === "value" || key === "raw")
|
|
296
|
+
continue;
|
|
297
|
+
const value = record[key];
|
|
298
|
+
if (Array.isArray(value)) {
|
|
299
|
+
for (let index = 0; index < value.length; index++) {
|
|
300
|
+
if (isNode(value[index]))
|
|
301
|
+
value[index] = replaceInTree(value[index], replace);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
else if (isNode(value)) {
|
|
305
|
+
record[key] = replaceInTree(value, replace);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return replace(node) ?? node;
|
|
309
|
+
}
|
|
310
|
+
function identifier(text, anchor) {
|
|
311
|
+
return { kind: SyntaxKind.Identifier, text, start: anchor, end: anchor };
|
|
312
|
+
}
|
|
313
|
+
function member(object, name, anchor) {
|
|
314
|
+
const expression = typeof object === "string" ? identifier(object, anchor) : object;
|
|
315
|
+
return {
|
|
316
|
+
kind: SyntaxKind.PropertyAccessExpression,
|
|
317
|
+
expression,
|
|
318
|
+
name: identifier(name, anchor),
|
|
319
|
+
optional: false,
|
|
320
|
+
start: anchor,
|
|
321
|
+
end: anchor,
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
function objectLiteral(properties) {
|
|
325
|
+
return { kind: SyntaxKind.ObjectLiteralExpression, properties, start: 0, end: 0 };
|
|
326
|
+
}
|
|
327
|
+
function propertyAssignment(name, initializer) {
|
|
328
|
+
return {
|
|
329
|
+
kind: SyntaxKind.PropertyAssignment,
|
|
330
|
+
name: identifier(name, 0),
|
|
331
|
+
initializer,
|
|
332
|
+
start: 0,
|
|
333
|
+
end: 0,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
function undefinedLiteral(anchor) {
|
|
337
|
+
return { kind: SyntaxKind.UndefinedKeyword, start: anchor, end: anchor };
|
|
338
|
+
}
|
|
339
|
+
function variableStatement(name, initializer, anchor) {
|
|
340
|
+
const declaration = {
|
|
341
|
+
kind: SyntaxKind.VariableDeclaration,
|
|
342
|
+
name: identifier(name, anchor),
|
|
343
|
+
exclamation: false,
|
|
344
|
+
initializer,
|
|
345
|
+
start: anchor,
|
|
346
|
+
end: anchor,
|
|
347
|
+
};
|
|
348
|
+
const list = {
|
|
349
|
+
kind: SyntaxKind.VariableDeclarationList,
|
|
350
|
+
declarationKind: "const",
|
|
351
|
+
declarations: [declaration],
|
|
352
|
+
start: anchor,
|
|
353
|
+
end: anchor,
|
|
354
|
+
};
|
|
355
|
+
return { kind: SyntaxKind.VariableStatement, declarationList: list, modifiers: [], start: anchor, end: anchor };
|
|
356
|
+
}
|
|
357
|
+
function defaultImport(name, specifier, anchor) {
|
|
358
|
+
const moduleSpecifier = {
|
|
359
|
+
kind: SyntaxKind.StringLiteral,
|
|
360
|
+
text: JSON.stringify(specifier),
|
|
361
|
+
value: specifier,
|
|
362
|
+
raw: JSON.stringify(specifier),
|
|
363
|
+
start: anchor,
|
|
364
|
+
end: anchor,
|
|
365
|
+
};
|
|
366
|
+
return {
|
|
367
|
+
kind: SyntaxKind.ImportDeclaration,
|
|
368
|
+
importClause: { kind: SyntaxKind.ImportClause, name: identifier(name, anchor), isTypeOnly: false, start: anchor, end: anchor },
|
|
369
|
+
moduleSpecifier,
|
|
370
|
+
attributes: [],
|
|
371
|
+
start: anchor,
|
|
372
|
+
end: anchor,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Rewrite `var x = require("<external>")` into an ESM import so that the
|
|
377
|
+
* extension / built-in module can be used as a first-class value:
|
|
378
|
+
*
|
|
379
|
+
* const os = require("node:os") -> import * as os from "node:os"
|
|
380
|
+
* const { join } = require("node:path") -> import { join } from "node:path"
|
|
381
|
+
*
|
|
382
|
+
* Only simple identifier / object-literal bindings at the top level are
|
|
383
|
+
* handled; a require nested inside an expression falls back to the default
|
|
384
|
+
* import path, which supports direct member access but not value use.
|
|
385
|
+
*/
|
|
386
|
+
function hoistExternalNamespaceRequires(record, context, statements, anchor) {
|
|
387
|
+
const scope = moduleScope(record);
|
|
388
|
+
if (!scope)
|
|
389
|
+
return;
|
|
390
|
+
for (let index = 0; index < statements.length; index++) {
|
|
391
|
+
const statement = statements[index];
|
|
392
|
+
if (!statement || statement.kind !== SyntaxKind.VariableStatement)
|
|
393
|
+
continue;
|
|
394
|
+
const list = statement.declarationList;
|
|
395
|
+
if (list.declarations.length !== 1)
|
|
396
|
+
continue;
|
|
397
|
+
const declaration = list.declarations[0];
|
|
398
|
+
if (!declaration)
|
|
399
|
+
continue;
|
|
400
|
+
const initializer = declaration.initializer;
|
|
401
|
+
if (!initializer || initializer.kind !== SyntaxKind.CallExpression)
|
|
402
|
+
continue;
|
|
403
|
+
const call = initializer;
|
|
404
|
+
const callee = call.expression;
|
|
405
|
+
if (callee.kind !== SyntaxKind.Identifier || !isFreeRequire(callee, record.bind))
|
|
406
|
+
continue;
|
|
407
|
+
const first = call.arguments[0];
|
|
408
|
+
if (!first || first.kind !== SyntaxKind.StringLiteral)
|
|
409
|
+
continue;
|
|
410
|
+
const specifier = first.value;
|
|
411
|
+
if (context.resolve(dirname(record.path), specifier).kind !== "external")
|
|
412
|
+
continue;
|
|
413
|
+
if (declaration.name.kind === SyntaxKind.Identifier) {
|
|
414
|
+
const symbol = scope.symbols.get(declaration.name.text);
|
|
415
|
+
const finalName = symbol ? record.finalNames.get(symbol.id) : undefined;
|
|
416
|
+
if (!symbol || !finalName)
|
|
417
|
+
continue;
|
|
418
|
+
renameReferences(symbol, finalName);
|
|
419
|
+
statements[index] = namespaceImport(finalName, specifier, anchor);
|
|
420
|
+
continue;
|
|
421
|
+
}
|
|
422
|
+
if (declaration.name.kind === SyntaxKind.ObjectBindingPattern) {
|
|
423
|
+
const hoisted = hoistObjectBinding(record, scope, declaration.name, specifier, anchor);
|
|
424
|
+
if (hoisted)
|
|
425
|
+
statements[index] = hoisted;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
/** Build `import { a, b as c } from "spec"` for a `const { ... } = require` binding. */
|
|
430
|
+
function hoistObjectBinding(record, scope, pattern, specifier, anchor) {
|
|
431
|
+
const specifiers = [];
|
|
432
|
+
for (const element of pattern.elements) {
|
|
433
|
+
if (element.dotDotDotToken || element.initializer || element.name.kind !== SyntaxKind.Identifier)
|
|
434
|
+
return undefined;
|
|
435
|
+
const localText = element.name.text;
|
|
436
|
+
const importedName = element.propertyName
|
|
437
|
+
? element.propertyName.kind === SyntaxKind.Identifier
|
|
438
|
+
? element.propertyName.text
|
|
439
|
+
: element.propertyName.value
|
|
440
|
+
: localText;
|
|
441
|
+
const symbol = scope.symbols.get(localText);
|
|
442
|
+
const finalName = symbol ? record.finalNames.get(symbol.id) : undefined;
|
|
443
|
+
if (!symbol || !finalName)
|
|
444
|
+
return undefined;
|
|
445
|
+
renameReferences(symbol, finalName);
|
|
446
|
+
specifiers.push({
|
|
447
|
+
kind: SyntaxKind.ImportSpecifier,
|
|
448
|
+
propertyName: importedName === finalName ? undefined : identifier(importedName, anchor),
|
|
449
|
+
name: identifier(finalName, anchor),
|
|
450
|
+
isTypeOnly: false,
|
|
451
|
+
start: anchor,
|
|
452
|
+
end: anchor,
|
|
453
|
+
});
|
|
454
|
+
}
|
|
455
|
+
if (specifiers.length === 0)
|
|
456
|
+
return undefined;
|
|
457
|
+
const namedBindings = { kind: SyntaxKind.NamedImports, elements: specifiers, start: anchor, end: anchor };
|
|
458
|
+
return importDeclaration(namedBindings, specifier, anchor);
|
|
459
|
+
}
|
|
460
|
+
function namespaceImport(name, specifier, anchor) {
|
|
461
|
+
const namedBindings = {
|
|
462
|
+
kind: SyntaxKind.NamespaceImport,
|
|
463
|
+
name: identifier(name, anchor),
|
|
464
|
+
start: anchor,
|
|
465
|
+
end: anchor,
|
|
466
|
+
};
|
|
467
|
+
return importDeclaration(namedBindings, specifier, anchor);
|
|
468
|
+
}
|
|
469
|
+
function importDeclaration(namedBindings, specifier, anchor) {
|
|
470
|
+
const moduleSpecifier = {
|
|
471
|
+
kind: SyntaxKind.StringLiteral,
|
|
472
|
+
text: JSON.stringify(specifier),
|
|
473
|
+
value: specifier,
|
|
474
|
+
raw: JSON.stringify(specifier),
|
|
475
|
+
start: anchor,
|
|
476
|
+
end: anchor,
|
|
477
|
+
};
|
|
478
|
+
return {
|
|
479
|
+
kind: SyntaxKind.ImportDeclaration,
|
|
480
|
+
importClause: {
|
|
481
|
+
kind: SyntaxKind.ImportClause,
|
|
482
|
+
namedBindings,
|
|
483
|
+
isTypeOnly: false,
|
|
484
|
+
start: anchor,
|
|
485
|
+
end: anchor,
|
|
486
|
+
},
|
|
487
|
+
moduleSpecifier,
|
|
488
|
+
attributes: [],
|
|
489
|
+
start: anchor,
|
|
490
|
+
end: anchor,
|
|
491
|
+
};
|
|
492
|
+
}
|
|
493
|
+
//# sourceMappingURL=commonjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commonjs.js","sourceRoot":"","sources":["../../../../src/driver/bundler/commonjs.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* reaches, in dependency order.
|
|
4
4
|
*/
|
|
5
5
|
import { DiagnosticBag } from "../../diagnostics/diagnostic.js";
|
|
6
|
+
import type { AssetLoader } from "../../extensions/registry.js";
|
|
6
7
|
import type { ModuleRecord } from "./types.js";
|
|
7
8
|
/** Load, parse and bind the entry module and every module it imports. */
|
|
8
|
-
export declare function loadGraph(entryPath: string, diagnostics: DiagnosticBag, externalSpecifiers: ReadonlySet<string
|
|
9
|
+
export declare function loadGraph(entryPath: string, diagnostics: DiagnosticBag, externalSpecifiers: ReadonlySet<string>, assetLoaders?: Readonly<Record<string, AssetLoader>>): ModuleRecord[] | undefined;
|
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
* reaches, in dependency order.
|
|
4
4
|
*/
|
|
5
5
|
import { existsSync, readFileSync } from "node:fs";
|
|
6
|
-
import { dirname } from "node:path";
|
|
6
|
+
import { dirname, extname } from "node:path";
|
|
7
7
|
import { SyntaxKind } from "../../ast/nodes.js";
|
|
8
8
|
import { bind } from "../../binder/binder.js";
|
|
9
9
|
import { DiagnosticCode } from "../../diagnostics/diagnostic.js";
|
|
10
10
|
import { SourceFile } from "../../diagnostics/source.js";
|
|
11
11
|
import { Parser } from "../../parser/parser.js";
|
|
12
12
|
import { classifyDependency } from "./resolve.js";
|
|
13
|
+
import { collectRequireSites, isNodeModulesPath, usesCommonJS } from "./commonjs.js";
|
|
13
14
|
function moduleSpecifierOf(statement) {
|
|
14
15
|
if (statement.kind === SyntaxKind.ImportDeclaration) {
|
|
15
16
|
return statement.moduleSpecifier.value;
|
|
@@ -22,7 +23,7 @@ function moduleSpecifierOf(statement) {
|
|
|
22
23
|
return undefined;
|
|
23
24
|
}
|
|
24
25
|
/** Load, parse and bind the entry module and every module it imports. */
|
|
25
|
-
export function loadGraph(entryPath, diagnostics, externalSpecifiers) {
|
|
26
|
+
export function loadGraph(entryPath, diagnostics, externalSpecifiers, assetLoaders = {}) {
|
|
26
27
|
const records = new Map();
|
|
27
28
|
const order = [];
|
|
28
29
|
const visiting = new Set();
|
|
@@ -43,7 +44,22 @@ export function loadGraph(entryPath, diagnostics, externalSpecifiers) {
|
|
|
43
44
|
return undefined;
|
|
44
45
|
}
|
|
45
46
|
visiting.add(path);
|
|
46
|
-
const
|
|
47
|
+
const raw = readFileSync(path, "utf8");
|
|
48
|
+
/* An extension may rewrite an imported asset (e.g. `.html`) into a TS
|
|
49
|
+
* module before it is parsed. The core only sees the transformed text. */
|
|
50
|
+
const loader = assetLoaders[extname(path).toLowerCase()];
|
|
51
|
+
let text = raw;
|
|
52
|
+
if (loader) {
|
|
53
|
+
try {
|
|
54
|
+
text = loader(path, raw).moduleSource;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
diagnostics.error(DiagnosticCode.CodegenError, error instanceof Error ? error.message : String(error));
|
|
58
|
+
failed = true;
|
|
59
|
+
visiting.delete(path);
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
47
63
|
const file = new SourceFile(path, text);
|
|
48
64
|
const parser = new Parser(file, diagnostics);
|
|
49
65
|
const sourceFile = parser.parseSourceFile();
|
|
@@ -57,7 +73,11 @@ export function loadGraph(entryPath, diagnostics, externalSpecifiers) {
|
|
|
57
73
|
exports: new Map(),
|
|
58
74
|
originalNames: new Map(),
|
|
59
75
|
finalNames: new Map(),
|
|
76
|
+
commonjs: false,
|
|
60
77
|
};
|
|
78
|
+
// `require` / `module` / `exports` are only honoured inside `node_modules`,
|
|
79
|
+
// so user code keeps its ESM-only diagnostic.
|
|
80
|
+
record.commonjs = isNodeModulesPath(path) && usesCommonJS(bindResult);
|
|
61
81
|
records.set(path, record);
|
|
62
82
|
for (const statement of sourceFile.statements) {
|
|
63
83
|
const specifier = moduleSpecifierOf(statement);
|
|
@@ -73,6 +93,15 @@ export function loadGraph(entryPath, diagnostics, externalSpecifiers) {
|
|
|
73
93
|
}
|
|
74
94
|
load(dependency.path);
|
|
75
95
|
}
|
|
96
|
+
// A CommonJS module's `require("...")` calls are dynamic import edges: the
|
|
97
|
+
// target must be bundled (and evaluated) before this module runs.
|
|
98
|
+
if (record.commonjs) {
|
|
99
|
+
for (const site of collectRequireSites(sourceFile, bindResult)) {
|
|
100
|
+
const dependency = classifyDependency(dirname(path), site.specifier, externalSpecifiers);
|
|
101
|
+
if (dependency.kind === "file")
|
|
102
|
+
load(dependency.path);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
76
105
|
visiting.delete(path);
|
|
77
106
|
order.push(record);
|
|
78
107
|
return record;
|