phantom-build 0.1.0
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 +378 -0
- package/dist/analyzer.d.ts +11 -0
- package/dist/analyzer.d.ts.map +1 -0
- package/dist/analyzer.js +330 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/ast-compat.d.ts +11 -0
- package/dist/ast-compat.d.ts.map +1 -0
- package/dist/ast-compat.js +84 -0
- package/dist/ast-compat.js.map +1 -0
- package/dist/classify/boundary.d.ts +30 -0
- package/dist/classify/boundary.d.ts.map +1 -0
- package/dist/classify/boundary.js +145 -0
- package/dist/classify/boundary.js.map +1 -0
- package/dist/classify/browser-globals.d.ts +29 -0
- package/dist/classify/browser-globals.d.ts.map +1 -0
- package/dist/classify/browser-globals.js +197 -0
- package/dist/classify/browser-globals.js.map +1 -0
- package/dist/classify/index.d.ts +14 -0
- package/dist/classify/index.d.ts.map +1 -0
- package/dist/classify/index.js +294 -0
- package/dist/classify/index.js.map +1 -0
- package/dist/classify/lazy-llm.d.ts +122 -0
- package/dist/classify/lazy-llm.d.ts.map +1 -0
- package/dist/classify/lazy-llm.js +142 -0
- package/dist/classify/lazy-llm.js.map +1 -0
- package/dist/classify/lazy.d.ts +23 -0
- package/dist/classify/lazy.d.ts.map +1 -0
- package/dist/classify/lazy.js +686 -0
- package/dist/classify/lazy.js.map +1 -0
- package/dist/classify/llm-client.d.ts +59 -0
- package/dist/classify/llm-client.d.ts.map +1 -0
- package/dist/classify/llm-client.js +193 -0
- package/dist/classify/llm-client.js.map +1 -0
- package/dist/classify/purity.d.ts +21 -0
- package/dist/classify/purity.d.ts.map +1 -0
- package/dist/classify/purity.js +47 -0
- package/dist/classify/purity.js.map +1 -0
- package/dist/classify/react-patterns.d.ts +15 -0
- package/dist/classify/react-patterns.d.ts.map +1 -0
- package/dist/classify/react-patterns.js +82 -0
- package/dist/classify/react-patterns.js.map +1 -0
- package/dist/classify/taint.d.ts +32 -0
- package/dist/classify/taint.d.ts.map +1 -0
- package/dist/classify/taint.js +68 -0
- package/dist/classify/taint.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +109 -0
- package/dist/cli.js.map +1 -0
- package/dist/extract/chunk-module.d.ts +20 -0
- package/dist/extract/chunk-module.d.ts.map +1 -0
- package/dist/extract/chunk-module.js +163 -0
- package/dist/extract/chunk-module.js.map +1 -0
- package/dist/extract/client-stub.d.ts +25 -0
- package/dist/extract/client-stub.d.ts.map +1 -0
- package/dist/extract/client-stub.js +233 -0
- package/dist/extract/client-stub.js.map +1 -0
- package/dist/extract/import-resolver.d.ts +20 -0
- package/dist/extract/import-resolver.d.ts.map +1 -0
- package/dist/extract/import-resolver.js +51 -0
- package/dist/extract/import-resolver.js.map +1 -0
- package/dist/extract/index.d.ts +20 -0
- package/dist/extract/index.d.ts.map +1 -0
- package/dist/extract/index.js +105 -0
- package/dist/extract/index.js.map +1 -0
- package/dist/extract/lazy-transform.d.ts +14 -0
- package/dist/extract/lazy-transform.d.ts.map +1 -0
- package/dist/extract/lazy-transform.js +473 -0
- package/dist/extract/lazy-transform.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +7 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +535 -0
- package/dist/plugin.js.map +1 -0
- package/dist/runtime/index.d.ts +28 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +73 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/types.d.ts +219 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/vite.d.ts +3 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +3 -0
- package/dist/vite.js.map +1 -0
- package/dist/webpack.d.ts +3 -0
- package/dist/webpack.d.ts.map +1 -0
- package/dist/webpack.js +3 -0
- package/dist/webpack.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
// ── Public API ──────────────────────────────────────────────────────────
|
|
2
|
+
/**
|
|
3
|
+
* Apply React.lazy + Suspense transforms to a cloned AST.
|
|
4
|
+
*
|
|
5
|
+
* Mutates the AST in place:
|
|
6
|
+
* 1. Rewrites component imports → React.lazy(() => import(...))
|
|
7
|
+
* 2. Wraps JSX usages in <Suspense fallback={null}>
|
|
8
|
+
* 3. Ensures `lazy` and `Suspense` are imported from 'react'
|
|
9
|
+
*
|
|
10
|
+
* Should be called on a structuredClone of the original AST.
|
|
11
|
+
*/
|
|
12
|
+
export function applyLazyTransforms(ast, candidates) {
|
|
13
|
+
if (candidates.length === 0)
|
|
14
|
+
return;
|
|
15
|
+
// Step 1: Rewrite imports → lazy declarations
|
|
16
|
+
for (const candidate of candidates) {
|
|
17
|
+
rewriteImportToLazy(ast, candidate);
|
|
18
|
+
}
|
|
19
|
+
// Step 2: Wrap JSX usages in Suspense boundaries
|
|
20
|
+
// Group candidates by suspenseGroup for batch wrapping
|
|
21
|
+
const grouped = groupBySuspense(candidates);
|
|
22
|
+
for (const group of grouped) {
|
|
23
|
+
wrapInSuspense(ast, group);
|
|
24
|
+
}
|
|
25
|
+
// Step 3: Ensure React imports include lazy and Suspense
|
|
26
|
+
ensureReactImports(ast);
|
|
27
|
+
}
|
|
28
|
+
// ── Import rewriting ────────────────────────────────────────────────────
|
|
29
|
+
/**
|
|
30
|
+
* Rewrite a static component import to a React.lazy declaration.
|
|
31
|
+
*
|
|
32
|
+
* Handles three cases:
|
|
33
|
+
*
|
|
34
|
+
* Default import:
|
|
35
|
+
* import Foo from './Foo'
|
|
36
|
+
* → const Foo = lazy(() => import('./Foo'))
|
|
37
|
+
*
|
|
38
|
+
* Named import:
|
|
39
|
+
* import { Foo } from './Foo'
|
|
40
|
+
* → const Foo = lazy(() => import('./Foo').then(m => ({ default: m.Foo })))
|
|
41
|
+
*
|
|
42
|
+
* Named import (only specifier):
|
|
43
|
+
* Removes the entire import declaration.
|
|
44
|
+
*
|
|
45
|
+
* Named import (one of several):
|
|
46
|
+
* Removes only the component specifier, keeps the rest.
|
|
47
|
+
*/
|
|
48
|
+
function rewriteImportToLazy(ast, candidate) {
|
|
49
|
+
// Find the import declaration that contains this specifier.
|
|
50
|
+
// Match on the original `source` (as written in the module), not `resolvedSource`.
|
|
51
|
+
const importIndex = ast.body.findIndex((node) => {
|
|
52
|
+
if (node.type !== 'ImportDeclaration')
|
|
53
|
+
return false;
|
|
54
|
+
const decl = node;
|
|
55
|
+
return decl.source.value === candidate.source &&
|
|
56
|
+
decl.specifiers.some((s) => {
|
|
57
|
+
if (s.type === 'ImportDefaultSpecifier')
|
|
58
|
+
return s.local.name === candidate.localName;
|
|
59
|
+
if (s.type === 'ImportSpecifier')
|
|
60
|
+
return s.local.name === candidate.localName;
|
|
61
|
+
return false;
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
if (importIndex === -1)
|
|
65
|
+
return;
|
|
66
|
+
const importDecl = ast.body[importIndex];
|
|
67
|
+
// Build the lazy() call
|
|
68
|
+
const lazyDecl = buildLazyDeclaration(candidate);
|
|
69
|
+
if (importDecl.specifiers.length === 1) {
|
|
70
|
+
// Only specifier — replace entire import with lazy declaration
|
|
71
|
+
ast.body[importIndex] = lazyDecl;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Multiple specifiers — remove just this one, add lazy declaration after
|
|
75
|
+
importDecl.specifiers = importDecl.specifiers.filter((s) => {
|
|
76
|
+
if (s.type === 'ImportDefaultSpecifier')
|
|
77
|
+
return s.local.name !== candidate.localName;
|
|
78
|
+
if (s.type === 'ImportSpecifier')
|
|
79
|
+
return s.local.name !== candidate.localName;
|
|
80
|
+
return true;
|
|
81
|
+
});
|
|
82
|
+
// Insert lazy declaration right after the import
|
|
83
|
+
ast.body.splice(importIndex + 1, 0, lazyDecl);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Build: const Foo = lazy(() => import('./Foo'))
|
|
88
|
+
* Or for named exports: const Foo = lazy(() => import('./Foo').then(m => ({ default: m.Foo })))
|
|
89
|
+
*/
|
|
90
|
+
function buildLazyDeclaration(candidate) {
|
|
91
|
+
let importExpr;
|
|
92
|
+
// Use resolvedSource (barrel-resolved) for the dynamic import target,
|
|
93
|
+
// falling back to the original source if no resolution was needed.
|
|
94
|
+
const importTarget = candidate.resolvedSource ?? candidate.source;
|
|
95
|
+
// The dynamic import expression
|
|
96
|
+
const dynamicImport = {
|
|
97
|
+
type: 'CallExpression',
|
|
98
|
+
callee: {
|
|
99
|
+
type: 'Import',
|
|
100
|
+
}, // ImportExpression represented as CallExpression for compat
|
|
101
|
+
arguments: [
|
|
102
|
+
{ type: 'Literal', value: importTarget },
|
|
103
|
+
],
|
|
104
|
+
optional: false,
|
|
105
|
+
};
|
|
106
|
+
// For ESTree, dynamic import is actually ImportExpression, but we model it
|
|
107
|
+
// in a way esrap can handle
|
|
108
|
+
const importExpression = {
|
|
109
|
+
type: 'ImportExpression',
|
|
110
|
+
source: { type: 'Literal', value: importTarget },
|
|
111
|
+
};
|
|
112
|
+
let factoryBody;
|
|
113
|
+
if (candidate.importKind === 'default') {
|
|
114
|
+
// Default import: lazy(() => import('./Foo'))
|
|
115
|
+
// The module already has a default export, React.lazy handles it
|
|
116
|
+
factoryBody = importExpression;
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// Named import: lazy(() => import('./Foo').then(m => ({ default: m.Foo })))
|
|
120
|
+
// React.lazy requires the promise to resolve with { default: Component }
|
|
121
|
+
const exportedName = candidate.importedName ?? candidate.localName;
|
|
122
|
+
factoryBody = {
|
|
123
|
+
type: 'CallExpression',
|
|
124
|
+
callee: {
|
|
125
|
+
type: 'MemberExpression',
|
|
126
|
+
object: importExpression,
|
|
127
|
+
property: { type: 'Identifier', name: 'then' },
|
|
128
|
+
computed: false,
|
|
129
|
+
optional: false,
|
|
130
|
+
},
|
|
131
|
+
arguments: [
|
|
132
|
+
{
|
|
133
|
+
type: 'ArrowFunctionExpression',
|
|
134
|
+
params: [{ type: 'Identifier', name: 'm' }],
|
|
135
|
+
body: {
|
|
136
|
+
type: 'ObjectExpression',
|
|
137
|
+
properties: [
|
|
138
|
+
{
|
|
139
|
+
type: 'Property',
|
|
140
|
+
key: { type: 'Identifier', name: 'default' },
|
|
141
|
+
value: {
|
|
142
|
+
type: 'MemberExpression',
|
|
143
|
+
object: { type: 'Identifier', name: 'm' },
|
|
144
|
+
property: { type: 'Identifier', name: exportedName },
|
|
145
|
+
computed: false,
|
|
146
|
+
optional: false,
|
|
147
|
+
},
|
|
148
|
+
kind: 'init',
|
|
149
|
+
method: false,
|
|
150
|
+
shorthand: false,
|
|
151
|
+
computed: false,
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
},
|
|
155
|
+
expression: true,
|
|
156
|
+
async: false,
|
|
157
|
+
generator: false,
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
optional: false,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// The factory arrow: () => import(...) or () => import(...).then(...)
|
|
164
|
+
const factory = {
|
|
165
|
+
type: 'ArrowFunctionExpression',
|
|
166
|
+
params: [],
|
|
167
|
+
body: factoryBody,
|
|
168
|
+
expression: true,
|
|
169
|
+
async: false,
|
|
170
|
+
generator: false,
|
|
171
|
+
};
|
|
172
|
+
// lazy(factory)
|
|
173
|
+
const lazyCall = {
|
|
174
|
+
type: 'CallExpression',
|
|
175
|
+
callee: { type: 'Identifier', name: 'lazy' },
|
|
176
|
+
arguments: [factory],
|
|
177
|
+
optional: false,
|
|
178
|
+
};
|
|
179
|
+
// const Foo = lazy(...)
|
|
180
|
+
return {
|
|
181
|
+
type: 'VariableDeclaration',
|
|
182
|
+
declarations: [
|
|
183
|
+
{
|
|
184
|
+
type: 'VariableDeclarator',
|
|
185
|
+
id: { type: 'Identifier', name: candidate.localName },
|
|
186
|
+
init: lazyCall,
|
|
187
|
+
},
|
|
188
|
+
],
|
|
189
|
+
kind: 'const',
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function groupBySuspense(candidates) {
|
|
193
|
+
const grouped = new Map();
|
|
194
|
+
const ungrouped = [];
|
|
195
|
+
for (const c of candidates) {
|
|
196
|
+
if (c.suspenseGroup) {
|
|
197
|
+
let group = grouped.get(c.suspenseGroup);
|
|
198
|
+
if (!group) {
|
|
199
|
+
group = [];
|
|
200
|
+
grouped.set(c.suspenseGroup, group);
|
|
201
|
+
}
|
|
202
|
+
group.push(c);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
ungrouped.push(c);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const result = [];
|
|
209
|
+
// Grouped candidates share a Suspense boundary
|
|
210
|
+
for (const [groupId, cands] of grouped) {
|
|
211
|
+
result.push({ candidates: cands, groupId });
|
|
212
|
+
}
|
|
213
|
+
// Ungrouped candidates each get their own boundary
|
|
214
|
+
for (const c of ungrouped) {
|
|
215
|
+
result.push({ candidates: [c], groupId: null });
|
|
216
|
+
}
|
|
217
|
+
return result;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Wrap JSX usages of lazy components in <Suspense fallback={null}>.
|
|
221
|
+
*
|
|
222
|
+
* For grouped candidates (adjacent siblings), wraps them all in a
|
|
223
|
+
* single Suspense boundary. For individual candidates, wraps each
|
|
224
|
+
* JSX element independently.
|
|
225
|
+
*
|
|
226
|
+
* Walks the AST looking for parent elements whose children include
|
|
227
|
+
* the target JSX elements, then splices in the Suspense wrapper.
|
|
228
|
+
*/
|
|
229
|
+
function wrapInSuspense(ast, group) {
|
|
230
|
+
const targetNames = new Set(group.candidates.map((c) => c.localName));
|
|
231
|
+
const mutations = [];
|
|
232
|
+
walkAndMutate(ast, (node) => {
|
|
233
|
+
const children = getJSXChildren(node);
|
|
234
|
+
if (!children)
|
|
235
|
+
return;
|
|
236
|
+
const matches = [];
|
|
237
|
+
for (let i = 0; i < children.length; i++) {
|
|
238
|
+
const child = children[i];
|
|
239
|
+
// Case 1: Direct JSXElement child — <PaymentForm />
|
|
240
|
+
if (child.type === 'JSXElement') {
|
|
241
|
+
if (isTargetJSXElement(child, targetNames)) {
|
|
242
|
+
matches.push({ index: i, kind: 'direct' });
|
|
243
|
+
}
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
// Case 2: JSXExpressionContainer — {cond && <PromoCode />} or {cond ? <A/> : <B/>}
|
|
247
|
+
if (child.type === 'JSXExpressionContainer') {
|
|
248
|
+
const expr = child.expression;
|
|
249
|
+
if (expr && containsTargetJSXElement(expr, targetNames)) {
|
|
250
|
+
matches.push({ index: i, kind: 'conditional' });
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (matches.length > 0) {
|
|
255
|
+
mutations.push({ children, matches });
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
// Apply mutations after the walk is complete
|
|
259
|
+
for (const { children, matches } of mutations) {
|
|
260
|
+
const directMatches = matches.filter((m) => m.kind === 'direct');
|
|
261
|
+
const conditionalMatches = matches.filter((m) => m.kind === 'conditional');
|
|
262
|
+
// Handle grouped direct children (adjacent siblings share one Suspense)
|
|
263
|
+
if (group.candidates.length > 1 && directMatches.length > 1) {
|
|
264
|
+
const first = Math.min(...directMatches.map((m) => m.index));
|
|
265
|
+
const last = Math.max(...directMatches.map((m) => m.index));
|
|
266
|
+
const wrapped = children.splice(first, last - first + 1);
|
|
267
|
+
const suspenseElement = buildSuspenseJSX(wrapped);
|
|
268
|
+
children.splice(first, 0, suspenseElement);
|
|
269
|
+
// Adjust conditional indices after splice
|
|
270
|
+
const offset = (last - first + 1) - 1;
|
|
271
|
+
for (const cm of conditionalMatches) {
|
|
272
|
+
if (cm.index > last)
|
|
273
|
+
cm.index -= offset;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
// Individual direct children (process in reverse to preserve indices)
|
|
278
|
+
for (let i = directMatches.length - 1; i >= 0; i--) {
|
|
279
|
+
const idx = directMatches[i].index;
|
|
280
|
+
const child = children[idx];
|
|
281
|
+
children[idx] = buildSuspenseJSX([child]);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
// Handle conditional children — wrap the JSXElement inside the conditional expression
|
|
285
|
+
for (let i = conditionalMatches.length - 1; i >= 0; i--) {
|
|
286
|
+
const idx = conditionalMatches[i].index;
|
|
287
|
+
const child = children[idx];
|
|
288
|
+
if (child.type === 'JSXExpressionContainer') {
|
|
289
|
+
const expr = child.expression;
|
|
290
|
+
wrapTargetInConditionalExpr(expr, targetNames);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/** Check if a JSXElement node has a tag name in the target set */
|
|
296
|
+
function isTargetJSXElement(node, targets) {
|
|
297
|
+
if (node.type !== 'JSXElement')
|
|
298
|
+
return false;
|
|
299
|
+
const opening = node.openingElement;
|
|
300
|
+
const name = opening?.name;
|
|
301
|
+
return name?.type === 'JSXIdentifier' && targets.has(name.name);
|
|
302
|
+
}
|
|
303
|
+
/** Check if an expression contains a target JSXElement (e.g., in && or ternary) */
|
|
304
|
+
function containsTargetJSXElement(expr, targets) {
|
|
305
|
+
if (isTargetJSXElement(expr, targets))
|
|
306
|
+
return true;
|
|
307
|
+
// cond && <Target />
|
|
308
|
+
if (expr.type === 'LogicalExpression') {
|
|
309
|
+
const right = expr.right;
|
|
310
|
+
if (right && isTargetJSXElement(right, targets))
|
|
311
|
+
return true;
|
|
312
|
+
const left = expr.left;
|
|
313
|
+
if (left && isTargetJSXElement(left, targets))
|
|
314
|
+
return true;
|
|
315
|
+
}
|
|
316
|
+
// cond ? <Target /> : fallback
|
|
317
|
+
if (expr.type === 'ConditionalExpression') {
|
|
318
|
+
const consequent = expr.consequent;
|
|
319
|
+
const alternate = expr.alternate;
|
|
320
|
+
if (consequent && isTargetJSXElement(consequent, targets))
|
|
321
|
+
return true;
|
|
322
|
+
if (alternate && isTargetJSXElement(alternate, targets))
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Wrap the target JSXElement inside a conditional expression with Suspense.
|
|
329
|
+
* {cond && <Target />} → {cond && <Suspense fallback={null}><Target /></Suspense>}
|
|
330
|
+
*/
|
|
331
|
+
function wrapTargetInConditionalExpr(expr, targets) {
|
|
332
|
+
// cond && <Target />
|
|
333
|
+
if (expr.type === 'LogicalExpression') {
|
|
334
|
+
const right = expr.right;
|
|
335
|
+
if (right && isTargetJSXElement(right, targets)) {
|
|
336
|
+
expr.right = buildSuspenseJSX([right]);
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
const left = expr.left;
|
|
340
|
+
if (left && isTargetJSXElement(left, targets)) {
|
|
341
|
+
expr.left = buildSuspenseJSX([left]);
|
|
342
|
+
return;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// cond ? <Target /> : fallback
|
|
346
|
+
if (expr.type === 'ConditionalExpression') {
|
|
347
|
+
const consequent = expr.consequent;
|
|
348
|
+
if (consequent && isTargetJSXElement(consequent, targets)) {
|
|
349
|
+
expr.consequent = buildSuspenseJSX([consequent]);
|
|
350
|
+
}
|
|
351
|
+
const alternate = expr.alternate;
|
|
352
|
+
if (alternate && isTargetJSXElement(alternate, targets)) {
|
|
353
|
+
expr.alternate = buildSuspenseJSX([alternate]);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Build a <Suspense fallback={null}>...children...</Suspense> JSX element.
|
|
359
|
+
*/
|
|
360
|
+
function buildSuspenseJSX(children) {
|
|
361
|
+
return {
|
|
362
|
+
type: 'JSXElement',
|
|
363
|
+
openingElement: {
|
|
364
|
+
type: 'JSXOpeningElement',
|
|
365
|
+
name: { type: 'JSXIdentifier', name: 'Suspense' },
|
|
366
|
+
attributes: [
|
|
367
|
+
{
|
|
368
|
+
type: 'JSXAttribute',
|
|
369
|
+
name: { type: 'JSXIdentifier', name: 'fallback' },
|
|
370
|
+
value: {
|
|
371
|
+
type: 'JSXExpressionContainer',
|
|
372
|
+
expression: { type: 'Literal', value: null, raw: 'null' },
|
|
373
|
+
},
|
|
374
|
+
},
|
|
375
|
+
],
|
|
376
|
+
selfClosing: false,
|
|
377
|
+
},
|
|
378
|
+
closingElement: {
|
|
379
|
+
type: 'JSXClosingElement',
|
|
380
|
+
name: { type: 'JSXIdentifier', name: 'Suspense' },
|
|
381
|
+
},
|
|
382
|
+
children,
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
// ── React import management ─────────────────────────────────────────────
|
|
386
|
+
/**
|
|
387
|
+
* Ensure the module imports `lazy` and `Suspense` from 'react'.
|
|
388
|
+
*
|
|
389
|
+
* If an existing `import { ... } from 'react'` exists, adds the missing
|
|
390
|
+
* specifiers. Otherwise, prepends a new import declaration.
|
|
391
|
+
*/
|
|
392
|
+
function ensureReactImports(ast) {
|
|
393
|
+
const needed = new Set(['lazy', 'Suspense']);
|
|
394
|
+
// Find existing react import
|
|
395
|
+
const reactImport = ast.body.find((node) => node.type === 'ImportDeclaration' &&
|
|
396
|
+
node.source.value === 'react');
|
|
397
|
+
if (reactImport) {
|
|
398
|
+
// Check which specifiers already exist
|
|
399
|
+
for (const spec of reactImport.specifiers) {
|
|
400
|
+
if (spec.type === 'ImportSpecifier') {
|
|
401
|
+
needed.delete(spec.imported.name);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
// Add missing specifiers
|
|
405
|
+
for (const name of needed) {
|
|
406
|
+
reactImport.specifiers.push({
|
|
407
|
+
type: 'ImportSpecifier',
|
|
408
|
+
imported: { type: 'Identifier', name },
|
|
409
|
+
local: { type: 'Identifier', name },
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
// No react import exists — add one
|
|
415
|
+
const specifiers = [...needed].map((name) => ({
|
|
416
|
+
type: 'ImportSpecifier',
|
|
417
|
+
imported: { type: 'Identifier', name },
|
|
418
|
+
local: { type: 'Identifier', name },
|
|
419
|
+
}));
|
|
420
|
+
const newImport = {
|
|
421
|
+
type: 'ImportDeclaration',
|
|
422
|
+
specifiers,
|
|
423
|
+
source: { type: 'Literal', value: 'react' },
|
|
424
|
+
attributes: [],
|
|
425
|
+
};
|
|
426
|
+
ast.body.unshift(newImport);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
// ── AST helpers ─────────────────────────────────────────────────────────
|
|
430
|
+
/**
|
|
431
|
+
* Get JSX children array from a node, if it has one.
|
|
432
|
+
* Returns the actual array reference (for mutation).
|
|
433
|
+
*/
|
|
434
|
+
function getJSXChildren(node) {
|
|
435
|
+
if (node.type !== 'JSXElement' && node.type !== 'JSXFragment')
|
|
436
|
+
return null;
|
|
437
|
+
const children = node.children;
|
|
438
|
+
if (!Array.isArray(children))
|
|
439
|
+
return null;
|
|
440
|
+
return children;
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Keys that are not AST children — skip to avoid traversing metadata
|
|
444
|
+
* objects or potential circular references from scope analysis.
|
|
445
|
+
*/
|
|
446
|
+
const SKIP_KEYS = new Set([
|
|
447
|
+
'type', 'range', 'loc', 'start', 'end',
|
|
448
|
+
'parent', 'scope', 'raw',
|
|
449
|
+
'trailingComments', 'leadingComments', 'innerComments',
|
|
450
|
+
]);
|
|
451
|
+
/**
|
|
452
|
+
* Walk AST nodes, allowing mutation at each level.
|
|
453
|
+
* The callback receives the raw object for direct property access.
|
|
454
|
+
*/
|
|
455
|
+
function walkAndMutate(node, callback) {
|
|
456
|
+
if (!node || typeof node !== 'object')
|
|
457
|
+
return;
|
|
458
|
+
if (Array.isArray(node)) {
|
|
459
|
+
for (const child of node)
|
|
460
|
+
walkAndMutate(child, callback);
|
|
461
|
+
return;
|
|
462
|
+
}
|
|
463
|
+
const obj = node;
|
|
464
|
+
if (typeof obj.type !== 'string')
|
|
465
|
+
return;
|
|
466
|
+
callback(obj);
|
|
467
|
+
for (const key of Object.keys(obj)) {
|
|
468
|
+
if (SKIP_KEYS.has(key))
|
|
469
|
+
continue;
|
|
470
|
+
walkAndMutate(obj[key], callback);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
//# sourceMappingURL=lazy-transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-transform.js","sourceRoot":"","sources":["../../src/extract/lazy-transform.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { phantom, VIRTUAL_PREFIX, PUBLIC_PREFIX } from './plugin.js';
|
|
2
|
+
export { analyzeModule } from './analyzer.js';
|
|
3
|
+
export type { AnalysisResult, AnalyzedModule, ClassifiedSegment, ComponentProfile, FunctionDependency, ImportInfo, LazyCandidate, LazyCandidateResult, ManifestEntry, PhantomManifest, PhantomPluginOptions, PrefetchStrategy, ReExportMapping, SegmentClassification, } from './types.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EACV,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PhantomPluginOptions } from './types.js';
|
|
2
|
+
/** Prefix for Phantom virtual chunk modules */
|
|
3
|
+
export declare const VIRTUAL_PREFIX = "\0phantom:";
|
|
4
|
+
/** Public prefix used in import statements (before resolution) */
|
|
5
|
+
export declare const PUBLIC_PREFIX = "phantom:";
|
|
6
|
+
export declare const phantom: import("unplugin").UnpluginInstance<PhantomPluginOptions, boolean>;
|
|
7
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAQV,oBAAoB,EAGrB,MAAM,YAAY,CAAC;AAMpB,+CAA+C;AAC/C,eAAO,MAAM,cAAc,eAAe,CAAC;AAE3C,kEAAkE;AAClE,eAAO,MAAM,aAAa,aAAa,CAAC;AA4DxC,eAAO,MAAM,OAAO,oEA2flB,CAAC"}
|