@workflow/builders 4.0.1-beta.67 → 4.0.1-beta.68
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/dist/base-builder.d.ts.map +1 -1
- package/dist/base-builder.js +60 -6
- package/dist/base-builder.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/node-module-esbuild-plugin.d.ts.map +1 -1
- package/dist/node-module-esbuild-plugin.js +45 -13
- package/dist/node-module-esbuild-plugin.js.map +1 -1
- package/dist/node-module-esbuild-plugin.test.js +47 -0
- package/dist/node-module-esbuild-plugin.test.js.map +1 -1
- package/dist/serde-checker.d.ts +70 -0
- package/dist/serde-checker.d.ts.map +1 -0
- package/dist/serde-checker.js +118 -0
- package/dist/serde-checker.js.map +1 -0
- package/dist/swc-esbuild-plugin.d.ts +10 -0
- package/dist/swc-esbuild-plugin.d.ts.map +1 -1
- package/dist/swc-esbuild-plugin.js +97 -37
- package/dist/swc-esbuild-plugin.js.map +1 -1
- package/dist/swc-esbuild-plugin.test.js +299 -0
- package/dist/swc-esbuild-plugin.test.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serde compliance checker for workflow custom class serialization.
|
|
3
|
+
*
|
|
4
|
+
* Analyzes source code to determine if classes with WORKFLOW_SERIALIZE /
|
|
5
|
+
* WORKFLOW_DESERIALIZE are correctly set up for the workflow sandbox.
|
|
6
|
+
*
|
|
7
|
+
* Used by:
|
|
8
|
+
* - CLI `validate` command
|
|
9
|
+
* - CLI `transform` command (--check-serde)
|
|
10
|
+
* - SWC playground serde analysis panel
|
|
11
|
+
* - Build-time warnings in BaseBuilder
|
|
12
|
+
*/
|
|
13
|
+
import type { WorkflowManifest } from './apply-swc-transform.js';
|
|
14
|
+
/**
|
|
15
|
+
* Result of checking a single class for serde compliance.
|
|
16
|
+
*/
|
|
17
|
+
export interface SerdeClassCheckResult {
|
|
18
|
+
/** The class name as detected in the source */
|
|
19
|
+
className: string;
|
|
20
|
+
/** The classId assigned by the SWC plugin (from the manifest) */
|
|
21
|
+
classId: string;
|
|
22
|
+
/** Whether the SWC plugin detected serde symbols on this class */
|
|
23
|
+
detected: boolean;
|
|
24
|
+
/** Whether a registration IIFE was generated in the output */
|
|
25
|
+
registered: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Node.js built-in module imports remaining in the workflow-mode output.
|
|
28
|
+
* If non-empty, the class is NOT workflow-sandbox compliant.
|
|
29
|
+
*/
|
|
30
|
+
nodeImports: string[];
|
|
31
|
+
/** Whether the class passes all compliance checks */
|
|
32
|
+
compliant: boolean;
|
|
33
|
+
/** Human-readable descriptions of any issues found */
|
|
34
|
+
issues: string[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Full result of serde compliance analysis for a source file.
|
|
38
|
+
*/
|
|
39
|
+
export interface SerdeCheckResult {
|
|
40
|
+
/** Per-class analysis results */
|
|
41
|
+
classes: SerdeClassCheckResult[];
|
|
42
|
+
/** All Node.js built-in imports found in the workflow-mode output */
|
|
43
|
+
globalNodeImports: string[];
|
|
44
|
+
/** Whether the workflow-mode output contains any serde-related classes */
|
|
45
|
+
hasSerdeClasses: boolean;
|
|
46
|
+
/** The raw workflow manifest extracted from the SWC transform */
|
|
47
|
+
manifest: WorkflowManifest;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Lightweight serde compliance checker that works with pre-computed
|
|
51
|
+
* SWC transform results. This avoids re-running the SWC transform
|
|
52
|
+
* when the caller already has the outputs (e.g., the playground or builder).
|
|
53
|
+
*/
|
|
54
|
+
export declare function analyzeSerdeCompliance(options: {
|
|
55
|
+
/** Source code (used for pattern detection) */
|
|
56
|
+
sourceCode: string;
|
|
57
|
+
/** Workflow-mode transformed output */
|
|
58
|
+
workflowCode: string;
|
|
59
|
+
/** Manifest extracted from the SWC transform */
|
|
60
|
+
manifest: WorkflowManifest;
|
|
61
|
+
}): SerdeCheckResult;
|
|
62
|
+
/**
|
|
63
|
+
* Extract class entries from a WorkflowManifest.
|
|
64
|
+
*/
|
|
65
|
+
export declare function extractClassEntries(manifest: WorkflowManifest): Array<{
|
|
66
|
+
className: string;
|
|
67
|
+
classId: string;
|
|
68
|
+
fileName: string;
|
|
69
|
+
}>;
|
|
70
|
+
//# sourceMappingURL=serde-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serde-checker.d.ts","sourceRoot":"","sources":["../src/serde-checker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAiBjE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,QAAQ,EAAE,OAAO,CAAC;IAClB,8DAA8D;IAC9D,UAAU,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,qDAAqD;IACrD,SAAS,EAAE,OAAO,CAAC;IACnB,sDAAsD;IACtD,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,qEAAqE;IACrE,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;IACzB,iEAAiE;IACjE,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,QAAQ,EAAE,gBAAgB,CAAC;CAC5B,GAAG,gBAAgB,CA4EnB;AAwBD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,gBAAgB,GACzB,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAcjE"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serde compliance checker for workflow custom class serialization.
|
|
3
|
+
*
|
|
4
|
+
* Analyzes source code to determine if classes with WORKFLOW_SERIALIZE /
|
|
5
|
+
* WORKFLOW_DESERIALIZE are correctly set up for the workflow sandbox.
|
|
6
|
+
*
|
|
7
|
+
* Used by:
|
|
8
|
+
* - CLI `validate` command
|
|
9
|
+
* - CLI `transform` command (--check-serde)
|
|
10
|
+
* - SWC playground serde analysis panel
|
|
11
|
+
* - Build-time warnings in BaseBuilder
|
|
12
|
+
*/
|
|
13
|
+
import builtinModules from 'builtin-modules';
|
|
14
|
+
// Build a regex that matches Node.js built-in module imports in transformed code.
|
|
15
|
+
// Handles both ESM (`from 'fs'`, `from 'node:fs'`) and CJS (`require('fs')`)
|
|
16
|
+
const nodeBuiltins = builtinModules.join('|');
|
|
17
|
+
// Regex to extract specific module names from import/require statements
|
|
18
|
+
const nodeImportExtractRegex = new RegExp(`(?:from\\s+['"](?:node:)?((?:${nodeBuiltins})(?:/[^'"]*)?)['"]` +
|
|
19
|
+
`|require\\s*\\(\\s*['"](?:node:)?((?:${nodeBuiltins})(?:/[^'"]*)?)['"]\\s*\\))`, 'g');
|
|
20
|
+
// Regex to detect class registration IIFEs generated by the SWC plugin
|
|
21
|
+
const registrationIifeRegex = /Symbol\.for\s*\(\s*["']workflow-class-registry["']\s*\)/;
|
|
22
|
+
/**
|
|
23
|
+
* Lightweight serde compliance checker that works with pre-computed
|
|
24
|
+
* SWC transform results. This avoids re-running the SWC transform
|
|
25
|
+
* when the caller already has the outputs (e.g., the playground or builder).
|
|
26
|
+
*/
|
|
27
|
+
export function analyzeSerdeCompliance(options) {
|
|
28
|
+
const { sourceCode, workflowCode, manifest } = options;
|
|
29
|
+
// 1. Extract all Node.js built-in imports from the workflow output
|
|
30
|
+
const globalNodeImports = extractNodeImports(workflowCode);
|
|
31
|
+
// 2. Check if the manifest contains any serde-registered classes
|
|
32
|
+
const classEntries = extractClassEntries(manifest);
|
|
33
|
+
const hasSerdeClasses = classEntries.length > 0;
|
|
34
|
+
// 3. Check if the workflow output contains registration IIFEs
|
|
35
|
+
const hasRegistration = registrationIifeRegex.test(workflowCode);
|
|
36
|
+
// 4. Analyze each class
|
|
37
|
+
const classes = classEntries.map((entry) => {
|
|
38
|
+
const issues = [];
|
|
39
|
+
// Check for Node.js imports (these will fail in the workflow sandbox)
|
|
40
|
+
if (globalNodeImports.length > 0) {
|
|
41
|
+
issues.push(`Workflow bundle contains Node.js built-in imports: ${globalNodeImports.join(', ')}. ` +
|
|
42
|
+
`These will fail at runtime in the workflow sandbox. ` +
|
|
43
|
+
`Add "use step" to methods that depend on Node.js APIs so they are stripped from the workflow bundle.`);
|
|
44
|
+
}
|
|
45
|
+
// Check for registration
|
|
46
|
+
if (!hasRegistration) {
|
|
47
|
+
issues.push(`No class registration IIFE was generated. ` +
|
|
48
|
+
`Ensure WORKFLOW_SERIALIZE and WORKFLOW_DESERIALIZE are defined as static methods ` +
|
|
49
|
+
`inside the class body using computed property syntax: static [WORKFLOW_SERIALIZE](...) { ... }`);
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
className: entry.className,
|
|
53
|
+
classId: entry.classId,
|
|
54
|
+
detected: true,
|
|
55
|
+
registered: hasRegistration,
|
|
56
|
+
nodeImports: globalNodeImports,
|
|
57
|
+
compliant: globalNodeImports.length === 0 && hasRegistration,
|
|
58
|
+
issues,
|
|
59
|
+
};
|
|
60
|
+
});
|
|
61
|
+
// 5. Check for classes that have serde patterns in source but weren't detected by SWC
|
|
62
|
+
const sourceHasSerdePatterns = /\[\s*WORKFLOW_(?:SERIALIZE|DESERIALIZE)\s*\]/.test(sourceCode) ||
|
|
63
|
+
/Symbol\.for\s*\(\s*['"]workflow-(?:serialize|deserialize)['"]\s*\)/.test(sourceCode);
|
|
64
|
+
if (sourceHasSerdePatterns && classEntries.length === 0) {
|
|
65
|
+
classes.push({
|
|
66
|
+
className: '<unknown>',
|
|
67
|
+
classId: '',
|
|
68
|
+
detected: false,
|
|
69
|
+
registered: false,
|
|
70
|
+
nodeImports: globalNodeImports,
|
|
71
|
+
compliant: false,
|
|
72
|
+
issues: [
|
|
73
|
+
`Source code contains WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE patterns but ` +
|
|
74
|
+
`the SWC plugin did not detect any serde-enabled classes. ` +
|
|
75
|
+
`Ensure the symbols are defined as static methods INSIDE the class body, ` +
|
|
76
|
+
`not assigned externally (e.g., (MyClass as any)[WORKFLOW_SERIALIZE] = ...).`,
|
|
77
|
+
],
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
classes,
|
|
82
|
+
globalNodeImports,
|
|
83
|
+
hasSerdeClasses,
|
|
84
|
+
manifest,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Extract Node.js built-in module names from transformed code.
|
|
89
|
+
*/
|
|
90
|
+
function extractNodeImports(code) {
|
|
91
|
+
const imports = new Set();
|
|
92
|
+
// Reset regex state
|
|
93
|
+
nodeImportExtractRegex.lastIndex = 0;
|
|
94
|
+
for (let match = nodeImportExtractRegex.exec(code); match !== null; match = nodeImportExtractRegex.exec(code)) {
|
|
95
|
+
// match[1] is from the ESM pattern, match[2] is from the CJS pattern
|
|
96
|
+
const moduleName = match[1] || match[2];
|
|
97
|
+
if (moduleName) {
|
|
98
|
+
// Normalize to base module name (e.g., 'fs/promises' -> 'fs')
|
|
99
|
+
imports.add(moduleName.split('/')[0]);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return [...imports].sort();
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Extract class entries from a WorkflowManifest.
|
|
106
|
+
*/
|
|
107
|
+
export function extractClassEntries(manifest) {
|
|
108
|
+
const entries = [];
|
|
109
|
+
if (!manifest.classes)
|
|
110
|
+
return entries;
|
|
111
|
+
for (const [fileName, classes] of Object.entries(manifest.classes)) {
|
|
112
|
+
for (const [className, { classId }] of Object.entries(classes)) {
|
|
113
|
+
entries.push({ className, classId, fileName });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return entries;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=serde-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serde-checker.js","sourceRoot":"","sources":["../src/serde-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,16 @@ export interface SwcPluginOptions {
|
|
|
18
18
|
* breaks them because the .js file doesn't exist on disk.
|
|
19
19
|
*/
|
|
20
20
|
rewriteTsExtensions?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Absolute file paths of discovered workflow/step/serde entries whose
|
|
23
|
+
* imports must be treated as side-effectful.
|
|
24
|
+
*
|
|
25
|
+
* The SWC compiler transform injects registration calls (workflow IDs,
|
|
26
|
+
* step IDs, class serialization, etc.) into these files. Without this
|
|
27
|
+
* override, esbuild honours `"sideEffects": false` from the package's
|
|
28
|
+
* `package.json` and silently drops bare imports of these modules.
|
|
29
|
+
*/
|
|
30
|
+
sideEffectEntries?: string[];
|
|
21
31
|
}
|
|
22
32
|
export declare function createSwcPlugin(options: SwcPluginOptions): Plugin;
|
|
23
33
|
//# sourceMappingURL=swc-esbuild-plugin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swc-esbuild-plugin.d.ts","sourceRoot":"","sources":["../src/swc-esbuild-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;AAOlC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"swc-esbuild-plugin.d.ts","sourceRoot":"","sources":["../src/swc-esbuild-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;AAOlC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAsCD,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAqSjE"}
|
|
@@ -55,58 +55,118 @@ export function createSwcPlugin(options) {
|
|
|
55
55
|
return cjsResolver(context, path);
|
|
56
56
|
}
|
|
57
57
|
};
|
|
58
|
+
// Pre-compute the normalized side-effect entries set for O(1) lookups.
|
|
59
|
+
const normalizedSideEffectEntries = new Set(options.sideEffectEntries?.map((e) => e.replace(/\\/g, '/')));
|
|
58
60
|
build.onResolve({ filter: /.*/ }, async (args) => {
|
|
59
|
-
if (
|
|
61
|
+
if (args.pluginData?.skipSwcPlugin)
|
|
62
|
+
return null;
|
|
63
|
+
if (!options.entriesToBundle &&
|
|
64
|
+
normalizedSideEffectEntries.size === 0) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
// When only sideEffectEntries is set (no entriesToBundle), we only
|
|
68
|
+
// need to override sideEffects for top-level bare imports — typically
|
|
69
|
+
// from the virtual entry. Skip resolution for transitive imports
|
|
70
|
+
// (dynamic imports, requires, etc.) to avoid unnecessary overhead.
|
|
71
|
+
if (!options.entriesToBundle && args.kind !== 'import-statement') {
|
|
60
72
|
return null;
|
|
61
73
|
}
|
|
62
74
|
try {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
75
|
+
const specifier = args.path;
|
|
76
|
+
const specifierIsPath = specifier.startsWith('.') || specifier.startsWith('/');
|
|
77
|
+
let resolvedPath;
|
|
78
|
+
// Determines whether the external path should be relativized
|
|
79
|
+
// (project-local file) or kept as a bare specifier (npm package).
|
|
80
|
+
let shouldMakeRelative = specifierIsPath;
|
|
81
|
+
if (specifierIsPath) {
|
|
82
|
+
resolvedPath = await enhancedResolve(args.resolveDir, specifier);
|
|
67
83
|
}
|
|
68
84
|
else {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
//
|
|
72
|
-
//
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
85
|
+
// Resolve from project root so nested deps aren't externalized
|
|
86
|
+
resolvedPath = await enhancedResolve(build.initialOptions.absWorkingDir || process.cwd(), specifier).catch(() => undefined); // swallow so esbuild fallback below can try
|
|
87
|
+
// Fall back to esbuild for aliases/tsconfig paths,
|
|
88
|
+
// but only accept project-local results
|
|
89
|
+
if (!resolvedPath) {
|
|
90
|
+
const esbuildResult = await build.resolve(specifier, {
|
|
91
|
+
resolveDir: args.resolveDir,
|
|
92
|
+
kind: args.kind,
|
|
93
|
+
pluginData: { skipSwcPlugin: true },
|
|
94
|
+
});
|
|
95
|
+
const didResolve = !!esbuildResult.path && !esbuildResult.errors.length;
|
|
96
|
+
const isProjectLocalFile = didResolve &&
|
|
97
|
+
!esbuildResult.path
|
|
98
|
+
.replace(/\\/g, '/')
|
|
99
|
+
.includes('/node_modules/');
|
|
100
|
+
if (isProjectLocalFile) {
|
|
101
|
+
resolvedPath = esbuildResult.path;
|
|
102
|
+
shouldMakeRelative = true;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
76
105
|
}
|
|
77
106
|
if (!resolvedPath)
|
|
78
107
|
return null;
|
|
79
108
|
// Normalize to forward slashes for cross-platform comparison
|
|
80
109
|
const normalizedResolvedPath = resolvedPath.replace(/\\/g, '/');
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
110
|
+
// Check if this module is a discovered entry whose SWC-transformed
|
|
111
|
+
// code contains side effects (workflow/step/class registration).
|
|
112
|
+
// Override the package.json "sideEffects": false so esbuild does not
|
|
113
|
+
// drop bare imports of these modules.
|
|
114
|
+
const hasSideEffects = normalizedSideEffectEntries.has(normalizedResolvedPath);
|
|
115
|
+
if (options.entriesToBundle) {
|
|
116
|
+
let shouldBundle = false;
|
|
117
|
+
for (const entryToBundle of options.entriesToBundle) {
|
|
118
|
+
const normalizedEntry = entryToBundle.replace(/\\/g, '/');
|
|
119
|
+
if (normalizedResolvedPath === normalizedEntry) {
|
|
120
|
+
shouldBundle = true;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
// if the current entry imports a child that needs
|
|
124
|
+
// to be bundled then it needs to also be bundled so
|
|
125
|
+
// that the child can have our transform applied
|
|
126
|
+
if (parentHasChild(normalizedResolvedPath, normalizedEntry)) {
|
|
127
|
+
shouldBundle = true;
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
85
130
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
131
|
+
if (shouldBundle) {
|
|
132
|
+
// Let esbuild bundle this entry, but override sideEffects if needed.
|
|
133
|
+
// We must return the resolved `path` alongside `sideEffects` because
|
|
134
|
+
// returning only `{ sideEffects: true }` without a path causes esbuild
|
|
135
|
+
// to fall through to its own resolver, which re-reads the package.json
|
|
136
|
+
// and applies `"sideEffects": false` from there.
|
|
137
|
+
return hasSideEffects
|
|
138
|
+
? { path: resolvedPath, sideEffects: true }
|
|
139
|
+
: null;
|
|
91
140
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
.replace(/\.cts$/, '.cjs');
|
|
141
|
+
let externalPath;
|
|
142
|
+
if (shouldMakeRelative) {
|
|
143
|
+
externalPath = relative(options.outdir || process.cwd(), resolvedPath).replace(/\\/g, '/');
|
|
144
|
+
if (options.rewriteTsExtensions) {
|
|
145
|
+
// Rewrite TypeScript extensions to their JS equivalents so the
|
|
146
|
+
// externalized import is loadable by Node's native ESM loader.
|
|
147
|
+
externalPath = externalPath
|
|
148
|
+
.replace(/\.tsx?$/, '.js')
|
|
149
|
+
.replace(/\.mts$/, '.mjs')
|
|
150
|
+
.replace(/\.cts$/, '.cjs');
|
|
151
|
+
}
|
|
104
152
|
}
|
|
153
|
+
else {
|
|
154
|
+
externalPath = specifier;
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
external: true,
|
|
158
|
+
path: externalPath,
|
|
159
|
+
sideEffects: hasSideEffects || undefined,
|
|
160
|
+
};
|
|
105
161
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
|
|
162
|
+
// No entriesToBundle — only override sideEffects when needed.
|
|
163
|
+
// We must return the resolved `path` alongside `sideEffects` because
|
|
164
|
+
// returning only `{ sideEffects: true }` without a path causes esbuild
|
|
165
|
+
// to fall through to its own resolver, which re-reads the package.json
|
|
166
|
+
// and applies `"sideEffects": false` from there.
|
|
167
|
+
return hasSideEffects
|
|
168
|
+
? { path: resolvedPath, sideEffects: true }
|
|
169
|
+
: null;
|
|
110
170
|
}
|
|
111
171
|
catch (_) { }
|
|
112
172
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swc-esbuild-plugin.js","sourceRoot":"","sources":["../src/swc-esbuild-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,mBAAmB,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EACL,iBAAiB,GAElB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,SAAS,EACT,cAAc,GACf,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"swc-esbuild-plugin.js","sourceRoot":"","sources":["../src/swc-esbuild-plugin.ts"],"names":[],"mappings":"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"}
|