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.
Files changed (94) hide show
  1. package/README.md +378 -0
  2. package/dist/analyzer.d.ts +11 -0
  3. package/dist/analyzer.d.ts.map +1 -0
  4. package/dist/analyzer.js +330 -0
  5. package/dist/analyzer.js.map +1 -0
  6. package/dist/ast-compat.d.ts +11 -0
  7. package/dist/ast-compat.d.ts.map +1 -0
  8. package/dist/ast-compat.js +84 -0
  9. package/dist/ast-compat.js.map +1 -0
  10. package/dist/classify/boundary.d.ts +30 -0
  11. package/dist/classify/boundary.d.ts.map +1 -0
  12. package/dist/classify/boundary.js +145 -0
  13. package/dist/classify/boundary.js.map +1 -0
  14. package/dist/classify/browser-globals.d.ts +29 -0
  15. package/dist/classify/browser-globals.d.ts.map +1 -0
  16. package/dist/classify/browser-globals.js +197 -0
  17. package/dist/classify/browser-globals.js.map +1 -0
  18. package/dist/classify/index.d.ts +14 -0
  19. package/dist/classify/index.d.ts.map +1 -0
  20. package/dist/classify/index.js +294 -0
  21. package/dist/classify/index.js.map +1 -0
  22. package/dist/classify/lazy-llm.d.ts +122 -0
  23. package/dist/classify/lazy-llm.d.ts.map +1 -0
  24. package/dist/classify/lazy-llm.js +142 -0
  25. package/dist/classify/lazy-llm.js.map +1 -0
  26. package/dist/classify/lazy.d.ts +23 -0
  27. package/dist/classify/lazy.d.ts.map +1 -0
  28. package/dist/classify/lazy.js +686 -0
  29. package/dist/classify/lazy.js.map +1 -0
  30. package/dist/classify/llm-client.d.ts +59 -0
  31. package/dist/classify/llm-client.d.ts.map +1 -0
  32. package/dist/classify/llm-client.js +193 -0
  33. package/dist/classify/llm-client.js.map +1 -0
  34. package/dist/classify/purity.d.ts +21 -0
  35. package/dist/classify/purity.d.ts.map +1 -0
  36. package/dist/classify/purity.js +47 -0
  37. package/dist/classify/purity.js.map +1 -0
  38. package/dist/classify/react-patterns.d.ts +15 -0
  39. package/dist/classify/react-patterns.d.ts.map +1 -0
  40. package/dist/classify/react-patterns.js +82 -0
  41. package/dist/classify/react-patterns.js.map +1 -0
  42. package/dist/classify/taint.d.ts +32 -0
  43. package/dist/classify/taint.d.ts.map +1 -0
  44. package/dist/classify/taint.js +68 -0
  45. package/dist/classify/taint.js.map +1 -0
  46. package/dist/cli.d.ts +3 -0
  47. package/dist/cli.d.ts.map +1 -0
  48. package/dist/cli.js +109 -0
  49. package/dist/cli.js.map +1 -0
  50. package/dist/extract/chunk-module.d.ts +20 -0
  51. package/dist/extract/chunk-module.d.ts.map +1 -0
  52. package/dist/extract/chunk-module.js +163 -0
  53. package/dist/extract/chunk-module.js.map +1 -0
  54. package/dist/extract/client-stub.d.ts +25 -0
  55. package/dist/extract/client-stub.d.ts.map +1 -0
  56. package/dist/extract/client-stub.js +233 -0
  57. package/dist/extract/client-stub.js.map +1 -0
  58. package/dist/extract/import-resolver.d.ts +20 -0
  59. package/dist/extract/import-resolver.d.ts.map +1 -0
  60. package/dist/extract/import-resolver.js +51 -0
  61. package/dist/extract/import-resolver.js.map +1 -0
  62. package/dist/extract/index.d.ts +20 -0
  63. package/dist/extract/index.d.ts.map +1 -0
  64. package/dist/extract/index.js +105 -0
  65. package/dist/extract/index.js.map +1 -0
  66. package/dist/extract/lazy-transform.d.ts +14 -0
  67. package/dist/extract/lazy-transform.d.ts.map +1 -0
  68. package/dist/extract/lazy-transform.js +473 -0
  69. package/dist/extract/lazy-transform.js.map +1 -0
  70. package/dist/index.d.ts +4 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +3 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/plugin.d.ts +7 -0
  75. package/dist/plugin.d.ts.map +1 -0
  76. package/dist/plugin.js +535 -0
  77. package/dist/plugin.js.map +1 -0
  78. package/dist/runtime/index.d.ts +28 -0
  79. package/dist/runtime/index.d.ts.map +1 -0
  80. package/dist/runtime/index.js +73 -0
  81. package/dist/runtime/index.js.map +1 -0
  82. package/dist/types.d.ts +219 -0
  83. package/dist/types.d.ts.map +1 -0
  84. package/dist/types.js +2 -0
  85. package/dist/types.js.map +1 -0
  86. package/dist/vite.d.ts +3 -0
  87. package/dist/vite.d.ts.map +1 -0
  88. package/dist/vite.js +3 -0
  89. package/dist/vite.js.map +1 -0
  90. package/dist/webpack.d.ts +3 -0
  91. package/dist/webpack.d.ts.map +1 -0
  92. package/dist/webpack.js +3 -0
  93. package/dist/webpack.js.map +1 -0
  94. 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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"}
@@ -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,3 @@
1
+ export { phantom, VIRTUAL_PREFIX, PUBLIC_PREFIX } from './plugin.js';
2
+ export { analyzeModule } from './analyzer.js';
3
+ //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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"}