@tamagui/compiler-core 0.0.0-bootstrap.0 → 3.0.0-beta.637.1

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 (98) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -1
  3. package/dist/cjs/ast.cjs +95 -0
  4. package/dist/cjs/contracts.cjs +62 -0
  5. package/dist/cjs/diagnostics.cjs +69 -0
  6. package/dist/cjs/evaluate.cjs +351 -0
  7. package/dist/cjs/graph.cjs +279 -0
  8. package/dist/cjs/hash.cjs +49 -0
  9. package/dist/cjs/index.cjs +44 -0
  10. package/dist/cjs/ir.cjs +33 -0
  11. package/dist/cjs/lower.cjs +225 -0
  12. package/dist/cjs/materialize.cjs +200 -0
  13. package/dist/cjs/normalize.cjs +622 -0
  14. package/dist/cjs/output.cjs +149 -0
  15. package/dist/cjs/planCache.cjs +224 -0
  16. package/dist/cjs/session.cjs +119 -0
  17. package/dist/cjs/yuku.cjs +159 -0
  18. package/dist/cjs/zero.cjs +387 -0
  19. package/dist/esm/ast.mjs +65 -0
  20. package/dist/esm/ast.mjs.map +1 -0
  21. package/dist/esm/contracts.mjs +34 -0
  22. package/dist/esm/contracts.mjs.map +1 -0
  23. package/dist/esm/diagnostics.mjs +44 -0
  24. package/dist/esm/diagnostics.mjs.map +1 -0
  25. package/dist/esm/evaluate.mjs +327 -0
  26. package/dist/esm/evaluate.mjs.map +1 -0
  27. package/dist/esm/graph.mjs +256 -0
  28. package/dist/esm/graph.mjs.map +1 -0
  29. package/dist/esm/hash.mjs +26 -0
  30. package/dist/esm/hash.mjs.map +1 -0
  31. package/dist/esm/index.mjs +30 -0
  32. package/dist/esm/ir.mjs +12 -0
  33. package/dist/esm/ir.mjs.map +1 -0
  34. package/dist/esm/lower.mjs +202 -0
  35. package/dist/esm/lower.mjs.map +1 -0
  36. package/dist/esm/materialize.mjs +179 -0
  37. package/dist/esm/materialize.mjs.map +1 -0
  38. package/dist/esm/normalize.mjs +596 -0
  39. package/dist/esm/normalize.mjs.map +1 -0
  40. package/dist/esm/output.mjs +119 -0
  41. package/dist/esm/output.mjs.map +1 -0
  42. package/dist/esm/planCache.mjs +194 -0
  43. package/dist/esm/planCache.mjs.map +1 -0
  44. package/dist/esm/session.mjs +99 -0
  45. package/dist/esm/session.mjs.map +1 -0
  46. package/dist/esm/yuku.mjs +136 -0
  47. package/dist/esm/yuku.mjs.map +1 -0
  48. package/dist/esm/zero.mjs +352 -0
  49. package/dist/esm/zero.mjs.map +1 -0
  50. package/package.json +42 -4
  51. package/src/ast.ts +86 -0
  52. package/src/contracts.ts +148 -0
  53. package/src/diagnostics.ts +96 -0
  54. package/src/evaluate.ts +497 -0
  55. package/src/graph.ts +347 -0
  56. package/src/hash.ts +36 -0
  57. package/src/index.ts +15 -0
  58. package/src/ir.ts +154 -0
  59. package/src/lower.ts +418 -0
  60. package/src/materialize.ts +330 -0
  61. package/src/normalize.ts +846 -0
  62. package/src/output.ts +175 -0
  63. package/src/planCache.ts +327 -0
  64. package/src/session.ts +172 -0
  65. package/src/yuku.ts +189 -0
  66. package/src/zero.ts +598 -0
  67. package/types/ast.d.ts +10 -0
  68. package/types/ast.d.ts.map +1 -0
  69. package/types/contracts.d.ts +97 -0
  70. package/types/contracts.d.ts.map +1 -0
  71. package/types/diagnostics.d.ts +31 -0
  72. package/types/diagnostics.d.ts.map +1 -0
  73. package/types/evaluate.d.ts +36 -0
  74. package/types/evaluate.d.ts.map +1 -0
  75. package/types/graph.d.ts +37 -0
  76. package/types/graph.d.ts.map +1 -0
  77. package/types/hash.d.ts +8 -0
  78. package/types/hash.d.ts.map +1 -0
  79. package/types/index.d.ts +16 -0
  80. package/types/index.d.ts.map +1 -0
  81. package/types/ir.d.ts +118 -0
  82. package/types/ir.d.ts.map +1 -0
  83. package/types/lower.d.ts +99 -0
  84. package/types/lower.d.ts.map +1 -0
  85. package/types/materialize.d.ts +104 -0
  86. package/types/materialize.d.ts.map +1 -0
  87. package/types/normalize.d.ts +8 -0
  88. package/types/normalize.d.ts.map +1 -0
  89. package/types/output.d.ts +32 -0
  90. package/types/output.d.ts.map +1 -0
  91. package/types/planCache.d.ts +113 -0
  92. package/types/planCache.d.ts.map +1 -0
  93. package/types/session.d.ts +44 -0
  94. package/types/session.d.ts.map +1 -0
  95. package/types/yuku.d.ts +4 -0
  96. package/types/yuku.d.ts.map +1 -0
  97. package/types/zero.d.ts +98 -0
  98. package/types/zero.d.ts.map +1 -0
@@ -0,0 +1,327 @@
1
+ import { childNode, childNodes, identifierName, isAstNode, unwrapExpression } from "./ast.mjs";
2
+ import { expressionReference, spanOf } from "./contracts.mjs";
3
+ import { linkedBailout, localBailout } from "./diagnostics.mjs";
4
+
5
+ function success(value) {
6
+ return {
7
+ ok: true,
8
+ value
9
+ };
10
+ }
11
+ function literal(node) {
12
+ if (node.type === "NullLiteral") return null;
13
+ if (node.type === "Literal" || node.type.endsWith("Literal")) {
14
+ const value = node.value;
15
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean" || value === null) {
16
+ return value;
17
+ }
18
+ }
19
+ return void 0;
20
+ }
21
+ function unsupported(id, node, detail = `Expression ${node.type} is not statically supported`) {
22
+ return {
23
+ ok: false,
24
+ bailout: localBailout("local/unsupported-expression", spanOf(id, node), detail)
25
+ };
26
+ }
27
+ function evaluateDefinition(resolver, definition, useSpan, state) {
28
+ const key = `${definition.id}:${definition.span.start}`;
29
+ if (state.activeDefinitions.has(key)) {
30
+ return {
31
+ ok: false,
32
+ bailout: localBailout("local/static-evaluation-cycle", useSpan, `Static evaluation cycle reached ${definition.name}`)
33
+ };
34
+ }
35
+ if (!definition.initializer) {
36
+ return {
37
+ ok: false,
38
+ bailout: linkedBailout("linked/missing-initializer", useSpan, `Binding ${definition.name} has no static initializer`, definition.id)
39
+ };
40
+ }
41
+ if (!definition.constant) {
42
+ return {
43
+ ok: false,
44
+ bailout: linkedBailout("linked/unresolved-binding", useSpan, `Binding ${definition.name} is mutable and cannot be statically evaluated`, definition.id)
45
+ };
46
+ }
47
+ const initializer = resolver.expressionNode(definition.initializer);
48
+ if (!initializer) {
49
+ return {
50
+ ok: false,
51
+ bailout: linkedBailout("linked/missing-initializer", useSpan, `Binding ${definition.name} initializer is outside the linked graph`, definition.id)
52
+ };
53
+ }
54
+ state.dependencies.add(definition.id);
55
+ state.activeDefinitions.add(key);
56
+ try {
57
+ return evaluateNode(resolver, definition.id, initializer, state);
58
+ } finally {
59
+ state.activeDefinitions.delete(key);
60
+ }
61
+ }
62
+ function evaluateObject(resolver, id, node, state) {
63
+ const output = {};
64
+ for (const property of childNodes(node, "properties")) {
65
+ if (property.type === "SpreadElement") {
66
+ const argument = childNode(property, "argument");
67
+ if (!argument) return unsupported(id, property);
68
+ const spread = evaluateNode(resolver, id, argument, state);
69
+ if (!spread.ok) return spread;
70
+ if (!spread.value || typeof spread.value !== "object" || Array.isArray(spread.value)) {
71
+ return {
72
+ ok: false,
73
+ bailout: localBailout("local/non-object-spread", spanOf(id, property), "Static object spread did not evaluate to an object")
74
+ };
75
+ }
76
+ Object.assign(output, spread.value);
77
+ continue;
78
+ }
79
+ if (property.type !== "Property" && property.type !== "ObjectProperty") {
80
+ return unsupported(id, property);
81
+ }
82
+ const keyNode = childNode(property, "key");
83
+ const valueNode = childNode(property, "value");
84
+ if (!keyNode || !valueNode) return unsupported(id, property);
85
+ let key = identifierName(keyNode) ?? void 0;
86
+ if (property.computed === true || key === void 0) {
87
+ const evaluatedKey = evaluateNode(resolver, id, keyNode, state);
88
+ if (!evaluatedKey.ok) return evaluatedKey;
89
+ key = evaluatedKey.value;
90
+ }
91
+ if (typeof key !== "string" && typeof key !== "number") {
92
+ return unsupported(id, keyNode, "Static object key is not a string or number");
93
+ }
94
+ const value = evaluateNode(resolver, id, valueNode, state);
95
+ if (!value.ok) return value;
96
+ output[String(key)] = value.value;
97
+ }
98
+ return success(output);
99
+ }
100
+ function evaluateArray(resolver, id, node, state) {
101
+ const output = [];
102
+ const rawElements = node.elements;
103
+ if (!Array.isArray(rawElements) || rawElements.some((element) => element === null || !isAstNode(element))) {
104
+ return unsupported(id, node, "Sparse arrays are not statically supported");
105
+ }
106
+ for (const element of rawElements.filter(isAstNode)) {
107
+ if (element.type === "SpreadElement") {
108
+ const argument = childNode(element, "argument");
109
+ if (!argument) return unsupported(id, element);
110
+ const spread = evaluateNode(resolver, id, argument, state);
111
+ if (!spread.ok) return spread;
112
+ if (!Array.isArray(spread.value)) {
113
+ return unsupported(id, element, "Static array spread did not evaluate to an array");
114
+ }
115
+ output.push(...spread.value);
116
+ continue;
117
+ }
118
+ const value = evaluateNode(resolver, id, element, state);
119
+ if (!value.ok) return value;
120
+ output.push(value.value);
121
+ }
122
+ return success(output);
123
+ }
124
+ function evaluateNode(resolver, id, input, state) {
125
+ const node = unwrapExpression(input);
126
+ const literalValue = literal(node);
127
+ if (literalValue !== void 0) return success(literalValue);
128
+ switch (node.type) {
129
+ case "Identifier": {
130
+ const name = identifierName(node);
131
+ if (!name) return unsupported(id, node);
132
+ const definition = resolver.resolveBinding(id, name);
133
+ if (!definition) {
134
+ return {
135
+ ok: false,
136
+ bailout: linkedBailout("linked/unresolved-binding", spanOf(id, node), `Binding ${name} has no host-linked definition`)
137
+ };
138
+ }
139
+ return evaluateDefinition(resolver, definition, spanOf(id, node), state);
140
+ }
141
+ case "ObjectExpression": return evaluateObject(resolver, id, node, state);
142
+ case "ArrayExpression": return evaluateArray(resolver, id, node, state);
143
+ case "MemberExpression": {
144
+ const objectNode = childNode(node, "object");
145
+ const propertyNode = childNode(node, "property");
146
+ if (!objectNode || !propertyNode) return unsupported(id, node);
147
+ const object = evaluateNode(resolver, id, objectNode, state);
148
+ if (!object.ok) return object;
149
+ let property = identifierName(propertyNode);
150
+ if (node.computed === true || property === null) {
151
+ const evaluatedProperty = evaluateNode(resolver, id, propertyNode, state);
152
+ if (!evaluatedProperty.ok) return evaluatedProperty;
153
+ property = evaluatedProperty.value;
154
+ }
155
+ if ((typeof object.value !== "object" || object.value === null) && typeof object.value !== "string") {
156
+ return unsupported(id, node, "Static member target is not indexable");
157
+ }
158
+ if (typeof property !== "string" && typeof property !== "number") {
159
+ return unsupported(id, propertyNode, "Static member key is not a string or number");
160
+ }
161
+ const value = object.value[String(property)];
162
+ return value === void 0 ? unsupported(id, node, `Static member ${String(property)} does not exist`) : success(value);
163
+ }
164
+ case "UnaryExpression": {
165
+ const argument = childNode(node, "argument");
166
+ if (!argument) return unsupported(id, node);
167
+ const value = evaluateNode(resolver, id, argument, state);
168
+ if (!value.ok) return value;
169
+ if (node.operator === "-" && typeof value.value === "number") {
170
+ return success(-value.value);
171
+ }
172
+ if (node.operator === "+" && typeof value.value === "number") {
173
+ return success(value.value);
174
+ }
175
+ if (node.operator === "!") return success(!value.value);
176
+ return unsupported(id, node, `Unary operator ${String(node.operator)} is unsupported`);
177
+ }
178
+ case "BinaryExpression":
179
+ case "LogicalExpression": {
180
+ const leftNode = childNode(node, "left");
181
+ const rightNode = childNode(node, "right");
182
+ if (!leftNode || !rightNode) return unsupported(id, node);
183
+ const left = evaluateNode(resolver, id, leftNode, state);
184
+ if (!left.ok) return left;
185
+ if (node.type === "LogicalExpression") {
186
+ if (node.operator === "&&" && !left.value) return left;
187
+ if (node.operator === "||" && left.value) return left;
188
+ if (node.operator === "??" && left.value !== null) return left;
189
+ }
190
+ const right = evaluateNode(resolver, id, rightNode, state);
191
+ if (!right.ok) return right;
192
+ switch (node.operator) {
193
+ case "+":
194
+ if (typeof left.value === "number" && typeof right.value === "number") {
195
+ return success(left.value + right.value);
196
+ }
197
+ if (typeof left.value === "string" || typeof right.value === "string") {
198
+ return success(String(left.value) + String(right.value));
199
+ }
200
+ break;
201
+ case "-":
202
+ if (typeof left.value === "number" && typeof right.value === "number") {
203
+ return success(left.value - right.value);
204
+ }
205
+ break;
206
+ case "*":
207
+ if (typeof left.value === "number" && typeof right.value === "number") {
208
+ return success(left.value * right.value);
209
+ }
210
+ break;
211
+ case "/":
212
+ if (typeof left.value === "number" && typeof right.value === "number") {
213
+ return success(left.value / right.value);
214
+ }
215
+ break;
216
+ case "&&":
217
+ case "||":
218
+ case "??": return right;
219
+ }
220
+ return unsupported(id, node, `Binary operator ${String(node.operator)} is unsupported`);
221
+ }
222
+ case "ConditionalExpression": {
223
+ const testNode = childNode(node, "test");
224
+ const consequent = childNode(node, "consequent");
225
+ const alternate = childNode(node, "alternate");
226
+ if (!testNode || !consequent || !alternate) return unsupported(id, node);
227
+ const test = evaluateNode(resolver, id, testNode, state);
228
+ if (!test.ok) return test;
229
+ return evaluateNode(resolver, id, test.value ? consequent : alternate, state);
230
+ }
231
+ case "TemplateLiteral": {
232
+ const quasis = childNodes(node, "quasis");
233
+ const expressions = childNodes(node, "expressions");
234
+ let output = "";
235
+ for (let index = 0; index < quasis.length; index++) {
236
+ const quasi = quasis[index];
237
+ const cooked = quasi?.value?.cooked;
238
+ const raw = quasi?.value?.raw;
239
+ output += typeof cooked === "string" ? cooked : typeof raw === "string" ? raw : "";
240
+ const expression = expressions[index];
241
+ if (expression) {
242
+ const value = evaluateNode(resolver, id, expression, state);
243
+ if (!value.ok) return value;
244
+ output += String(value.value);
245
+ }
246
+ }
247
+ return success(output);
248
+ }
249
+ default: return unsupported(id, node);
250
+ }
251
+ }
252
+ function evaluateConditionalExpression(resolver, reference) {
253
+ const node = resolver.expressionNode(reference);
254
+ if (!node) return null;
255
+ const expression = unwrapExpression(node);
256
+ if (!isAstNode(expression) || expression.type !== "ConditionalExpression") return null;
257
+ const testNode = childNode(expression, "test");
258
+ const consequent = childNode(expression, "consequent");
259
+ const alternate = childNode(expression, "alternate");
260
+ if (!testNode || !consequent || !alternate) return null;
261
+ const trueState = {
262
+ activeDefinitions: /* @__PURE__ */ new Set(),
263
+ dependencies: /* @__PURE__ */ new Set()
264
+ };
265
+ const whenTrue = evaluateNode(resolver, reference.id, consequent, trueState);
266
+ if (!whenTrue.ok) return null;
267
+ const falseState = {
268
+ activeDefinitions: /* @__PURE__ */ new Set(),
269
+ dependencies: /* @__PURE__ */ new Set()
270
+ };
271
+ const whenFalse = evaluateNode(resolver, reference.id, alternate, falseState);
272
+ if (!whenFalse.ok) return null;
273
+ return {
274
+ test: spanOf(reference.id, testNode),
275
+ whenTrue: {
276
+ value: whenTrue.value,
277
+ dependencies: [...trueState.dependencies].sort()
278
+ },
279
+ whenFalse: {
280
+ value: whenFalse.value,
281
+ dependencies: [...falseState.dependencies].sort()
282
+ }
283
+ };
284
+ }
285
+ function evaluateExpression(resolver, reference) {
286
+ const node = resolver.expressionNode(reference);
287
+ if (!node) {
288
+ return {
289
+ ok: false,
290
+ bailout: linkedBailout("linked/missing-initializer", reference, "Expression is outside the linked project graph", reference.id)
291
+ };
292
+ }
293
+ const state = {
294
+ activeDefinitions: /* @__PURE__ */ new Set(),
295
+ dependencies: /* @__PURE__ */ new Set()
296
+ };
297
+ const result = evaluateNode(resolver, reference.id, node, state);
298
+ return result.ok ? {
299
+ ok: true,
300
+ value: result.value,
301
+ dependencies: [...state.dependencies].sort()
302
+ } : result;
303
+ }
304
+ function evaluateBinding(resolver, id, localName) {
305
+ const definition = resolver.resolveBinding(id, localName);
306
+ if (!definition) {
307
+ const emptySpan = {
308
+ id,
309
+ start: 0,
310
+ end: 0
311
+ };
312
+ return {
313
+ ok: false,
314
+ bailout: linkedBailout("linked/unresolved-binding", emptySpan, `Binding ${localName} has no host-linked definition`)
315
+ };
316
+ }
317
+ if (!definition.initializer) {
318
+ return {
319
+ ok: false,
320
+ bailout: linkedBailout("linked/missing-initializer", definition.span, `Binding ${localName} has no static initializer`, definition.id)
321
+ };
322
+ }
323
+ return evaluateExpression(resolver, expressionReference(definition.id, definition.initializer));
324
+ }
325
+
326
+ export { evaluateBinding, evaluateConditionalExpression, evaluateExpression };
327
+ //# sourceMappingURL=evaluate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate.js","names":[],"sources":["esm/evaluate.js"],"sourcesContent":["import { childNode, childNodes, identifierName, isAstNode, unwrapExpression } from \"./ast\";\nimport { expressionReference, spanOf } from \"./contracts\";\nimport { linkedBailout, localBailout } from \"./diagnostics\";\nfunction success(value) {\n return { ok: true, value };\n}\nfunction literal(node) {\n if (node.type === \"NullLiteral\") return null;\n if (node.type === \"Literal\" || node.type.endsWith(\"Literal\")) {\n const value = node.value;\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\" || value === null) {\n return value;\n }\n }\n return void 0;\n}\nfunction unsupported(id, node, detail = `Expression ${node.type} is not statically supported`) {\n return {\n ok: false,\n bailout: localBailout(\"local/unsupported-expression\", spanOf(id, node), detail)\n };\n}\nfunction evaluateDefinition(resolver, definition, useSpan, state) {\n const key = `${definition.id}:${definition.span.start}`;\n if (state.activeDefinitions.has(key)) {\n return {\n ok: false,\n bailout: localBailout(\n \"local/static-evaluation-cycle\",\n useSpan,\n `Static evaluation cycle reached ${definition.name}`\n )\n };\n }\n if (!definition.initializer) {\n return {\n ok: false,\n bailout: linkedBailout(\n \"linked/missing-initializer\",\n useSpan,\n `Binding ${definition.name} has no static initializer`,\n definition.id\n )\n };\n }\n if (!definition.constant) {\n return {\n ok: false,\n bailout: linkedBailout(\n \"linked/unresolved-binding\",\n useSpan,\n `Binding ${definition.name} is mutable and cannot be statically evaluated`,\n definition.id\n )\n };\n }\n const initializer = resolver.expressionNode(definition.initializer);\n if (!initializer) {\n return {\n ok: false,\n bailout: linkedBailout(\n \"linked/missing-initializer\",\n useSpan,\n `Binding ${definition.name} initializer is outside the linked graph`,\n definition.id\n )\n };\n }\n state.dependencies.add(definition.id);\n state.activeDefinitions.add(key);\n try {\n return evaluateNode(resolver, definition.id, initializer, state);\n } finally {\n state.activeDefinitions.delete(key);\n }\n}\nfunction evaluateObject(resolver, id, node, state) {\n const output = {};\n for (const property of childNodes(node, \"properties\")) {\n if (property.type === \"SpreadElement\") {\n const argument = childNode(property, \"argument\");\n if (!argument) return unsupported(id, property);\n const spread = evaluateNode(resolver, id, argument, state);\n if (!spread.ok) return spread;\n if (!spread.value || typeof spread.value !== \"object\" || Array.isArray(spread.value)) {\n return {\n ok: false,\n bailout: localBailout(\n \"local/non-object-spread\",\n spanOf(id, property),\n \"Static object spread did not evaluate to an object\"\n )\n };\n }\n Object.assign(output, spread.value);\n continue;\n }\n if (property.type !== \"Property\" && property.type !== \"ObjectProperty\") {\n return unsupported(id, property);\n }\n const keyNode = childNode(property, \"key\");\n const valueNode = childNode(property, \"value\");\n if (!keyNode || !valueNode) return unsupported(id, property);\n let key = identifierName(keyNode) ?? void 0;\n if (property.computed === true || key === void 0) {\n const evaluatedKey = evaluateNode(resolver, id, keyNode, state);\n if (!evaluatedKey.ok) return evaluatedKey;\n key = evaluatedKey.value;\n }\n if (typeof key !== \"string\" && typeof key !== \"number\") {\n return unsupported(id, keyNode, \"Static object key is not a string or number\");\n }\n const value = evaluateNode(resolver, id, valueNode, state);\n if (!value.ok) return value;\n output[String(key)] = value.value;\n }\n return success(output);\n}\nfunction evaluateArray(resolver, id, node, state) {\n const output = [];\n const rawElements = node.elements;\n if (!Array.isArray(rawElements) || rawElements.some((element) => element === null || !isAstNode(element))) {\n return unsupported(id, node, \"Sparse arrays are not statically supported\");\n }\n for (const element of rawElements.filter(isAstNode)) {\n if (element.type === \"SpreadElement\") {\n const argument = childNode(element, \"argument\");\n if (!argument) return unsupported(id, element);\n const spread = evaluateNode(resolver, id, argument, state);\n if (!spread.ok) return spread;\n if (!Array.isArray(spread.value)) {\n return unsupported(\n id,\n element,\n \"Static array spread did not evaluate to an array\"\n );\n }\n output.push(...spread.value);\n continue;\n }\n const value = evaluateNode(resolver, id, element, state);\n if (!value.ok) return value;\n output.push(value.value);\n }\n return success(output);\n}\nfunction evaluateNode(resolver, id, input, state) {\n const node = unwrapExpression(input);\n const literalValue = literal(node);\n if (literalValue !== void 0) return success(literalValue);\n switch (node.type) {\n case \"Identifier\": {\n const name = identifierName(node);\n if (!name) return unsupported(id, node);\n const definition = resolver.resolveBinding(id, name);\n if (!definition) {\n return {\n ok: false,\n bailout: linkedBailout(\n \"linked/unresolved-binding\",\n spanOf(id, node),\n `Binding ${name} has no host-linked definition`\n )\n };\n }\n return evaluateDefinition(resolver, definition, spanOf(id, node), state);\n }\n case \"ObjectExpression\":\n return evaluateObject(resolver, id, node, state);\n case \"ArrayExpression\":\n return evaluateArray(resolver, id, node, state);\n case \"MemberExpression\": {\n const objectNode = childNode(node, \"object\");\n const propertyNode = childNode(node, \"property\");\n if (!objectNode || !propertyNode) return unsupported(id, node);\n const object = evaluateNode(resolver, id, objectNode, state);\n if (!object.ok) return object;\n let property = identifierName(propertyNode);\n if (node.computed === true || property === null) {\n const evaluatedProperty = evaluateNode(resolver, id, propertyNode, state);\n if (!evaluatedProperty.ok) return evaluatedProperty;\n property = evaluatedProperty.value;\n }\n if ((typeof object.value !== \"object\" || object.value === null) && typeof object.value !== \"string\") {\n return unsupported(id, node, \"Static member target is not indexable\");\n }\n if (typeof property !== \"string\" && typeof property !== \"number\") {\n return unsupported(\n id,\n propertyNode,\n \"Static member key is not a string or number\"\n );\n }\n const value = object.value[String(property)];\n return value === void 0 ? unsupported(id, node, `Static member ${String(property)} does not exist`) : success(value);\n }\n case \"UnaryExpression\": {\n const argument = childNode(node, \"argument\");\n if (!argument) return unsupported(id, node);\n const value = evaluateNode(resolver, id, argument, state);\n if (!value.ok) return value;\n if (node.operator === \"-\" && typeof value.value === \"number\") {\n return success(-value.value);\n }\n if (node.operator === \"+\" && typeof value.value === \"number\") {\n return success(value.value);\n }\n if (node.operator === \"!\") return success(!value.value);\n return unsupported(\n id,\n node,\n `Unary operator ${String(node.operator)} is unsupported`\n );\n }\n case \"BinaryExpression\":\n case \"LogicalExpression\": {\n const leftNode = childNode(node, \"left\");\n const rightNode = childNode(node, \"right\");\n if (!leftNode || !rightNode) return unsupported(id, node);\n const left = evaluateNode(resolver, id, leftNode, state);\n if (!left.ok) return left;\n if (node.type === \"LogicalExpression\") {\n if (node.operator === \"&&\" && !left.value) return left;\n if (node.operator === \"||\" && left.value) return left;\n if (node.operator === \"??\" && left.value !== null) return left;\n }\n const right = evaluateNode(resolver, id, rightNode, state);\n if (!right.ok) return right;\n switch (node.operator) {\n case \"+\":\n if (typeof left.value === \"number\" && typeof right.value === \"number\") {\n return success(left.value + right.value);\n }\n if (typeof left.value === \"string\" || typeof right.value === \"string\") {\n return success(String(left.value) + String(right.value));\n }\n break;\n case \"-\":\n if (typeof left.value === \"number\" && typeof right.value === \"number\") {\n return success(left.value - right.value);\n }\n break;\n case \"*\":\n if (typeof left.value === \"number\" && typeof right.value === \"number\") {\n return success(left.value * right.value);\n }\n break;\n case \"/\":\n if (typeof left.value === \"number\" && typeof right.value === \"number\") {\n return success(left.value / right.value);\n }\n break;\n case \"&&\":\n case \"||\":\n case \"??\":\n return right;\n }\n return unsupported(\n id,\n node,\n `Binary operator ${String(node.operator)} is unsupported`\n );\n }\n case \"ConditionalExpression\": {\n const testNode = childNode(node, \"test\");\n const consequent = childNode(node, \"consequent\");\n const alternate = childNode(node, \"alternate\");\n if (!testNode || !consequent || !alternate) return unsupported(id, node);\n const test = evaluateNode(resolver, id, testNode, state);\n if (!test.ok) return test;\n return evaluateNode(resolver, id, test.value ? consequent : alternate, state);\n }\n case \"TemplateLiteral\": {\n const quasis = childNodes(node, \"quasis\");\n const expressions = childNodes(node, \"expressions\");\n let output = \"\";\n for (let index = 0; index < quasis.length; index++) {\n const quasi = quasis[index];\n const cooked = quasi?.value?.cooked;\n const raw = quasi?.value?.raw;\n output += typeof cooked === \"string\" ? cooked : typeof raw === \"string\" ? raw : \"\";\n const expression = expressions[index];\n if (expression) {\n const value = evaluateNode(resolver, id, expression, state);\n if (!value.ok) return value;\n output += String(value.value);\n }\n }\n return success(output);\n }\n default:\n return unsupported(id, node);\n }\n}\nfunction evaluateConditionalExpression(resolver, reference) {\n const node = resolver.expressionNode(reference);\n if (!node) return null;\n const expression = unwrapExpression(node);\n if (!isAstNode(expression) || expression.type !== \"ConditionalExpression\") return null;\n const testNode = childNode(expression, \"test\");\n const consequent = childNode(expression, \"consequent\");\n const alternate = childNode(expression, \"alternate\");\n if (!testNode || !consequent || !alternate) return null;\n const trueState = {\n activeDefinitions: /* @__PURE__ */ new Set(),\n dependencies: /* @__PURE__ */ new Set()\n };\n const whenTrue = evaluateNode(resolver, reference.id, consequent, trueState);\n if (!whenTrue.ok) return null;\n const falseState = {\n activeDefinitions: /* @__PURE__ */ new Set(),\n dependencies: /* @__PURE__ */ new Set()\n };\n const whenFalse = evaluateNode(resolver, reference.id, alternate, falseState);\n if (!whenFalse.ok) return null;\n return {\n test: spanOf(reference.id, testNode),\n whenTrue: {\n value: whenTrue.value,\n dependencies: [...trueState.dependencies].sort()\n },\n whenFalse: {\n value: whenFalse.value,\n dependencies: [...falseState.dependencies].sort()\n }\n };\n}\nfunction evaluateExpression(resolver, reference) {\n const node = resolver.expressionNode(reference);\n if (!node) {\n return {\n ok: false,\n bailout: linkedBailout(\n \"linked/missing-initializer\",\n reference,\n \"Expression is outside the linked project graph\",\n reference.id\n )\n };\n }\n const state = {\n activeDefinitions: /* @__PURE__ */ new Set(),\n dependencies: /* @__PURE__ */ new Set()\n };\n const result = evaluateNode(resolver, reference.id, node, state);\n return result.ok ? {\n ok: true,\n value: result.value,\n dependencies: [...state.dependencies].sort()\n } : result;\n}\nfunction evaluateBinding(resolver, id, localName) {\n const definition = resolver.resolveBinding(id, localName);\n if (!definition) {\n const emptySpan = { id, start: 0, end: 0 };\n return {\n ok: false,\n bailout: linkedBailout(\n \"linked/unresolved-binding\",\n emptySpan,\n `Binding ${localName} has no host-linked definition`\n )\n };\n }\n if (!definition.initializer) {\n return {\n ok: false,\n bailout: linkedBailout(\n \"linked/missing-initializer\",\n definition.span,\n `Binding ${localName} has no static initializer`,\n definition.id\n )\n };\n }\n return evaluateExpression(\n resolver,\n expressionReference(definition.id, definition.initializer)\n );\n}\nexport {\n evaluateBinding,\n evaluateConditionalExpression,\n evaluateExpression\n};\n//# sourceMappingURL=evaluate.js.map\n"],"mappings":"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"}
@@ -0,0 +1,256 @@
1
+ import { createHash } from "node:crypto";
2
+ import { expressionReference, resolutionKey, resolvedModuleId } from "./contracts.mjs";
3
+ import { linkedBailout, localBailout } from "./diagnostics.mjs";
4
+ import { evaluateBinding, evaluateConditionalExpression, evaluateExpression } from "./evaluate.mjs";
5
+ import { nodeAtSpan, normalizeElements } from "./normalize.mjs";
6
+
7
+ function compareIds(left, right) {
8
+ return compareCodeUnits(left, right);
9
+ }
10
+ function compareCodeUnits(left, right) {
11
+ return left < right ? -1 : left > right ? 1 : 0;
12
+ }
13
+ function stableImports(imports) {
14
+ return [...imports].sort((left, right) => {
15
+ const bySpecifier = compareCodeUnits(left.specifier, right.specifier);
16
+ return bySpecifier || compareCodeUnits(left.resolvedId, right.resolvedId);
17
+ });
18
+ }
19
+ function moduleContentHash(input) {
20
+ const hash = createHash("sha256");
21
+ hash.update(input.source);
22
+ hash.update("\0");
23
+ for (const dependency of stableImports(input.imports)) {
24
+ hash.update(dependency.specifier);
25
+ hash.update("\0");
26
+ hash.update(dependency.resolvedId);
27
+ hash.update("\0");
28
+ hash.update(dependency.external ? "external" : "internal");
29
+ hash.update("\0");
30
+ }
31
+ return hash.digest("hex");
32
+ }
33
+ var ProjectGraph = class {
34
+ #files = /* @__PURE__ */ new Map();
35
+ #resolutions = /* @__PURE__ */ new Map();
36
+ #modules = /* @__PURE__ */ new Map();
37
+ #dependencies = /* @__PURE__ */ new Map();
38
+ #dependents = /* @__PURE__ */ new Map();
39
+ #elementCache = /* @__PURE__ */ new Map();
40
+ #candidate;
41
+ constructor(factory, project) {
42
+ for (const input of project.modules) this.#installHostRecord(input);
43
+ const candidateProject = {
44
+ files: this.#files,
45
+ resolutions: this.#resolutions
46
+ };
47
+ this.#candidate = factory.create(candidateProject);
48
+ this.#candidate.link();
49
+ }
50
+ moduleIds() {
51
+ return [...this.#modules.keys()].sort(compareIds);
52
+ }
53
+ contentHash(id) {
54
+ return this.#modules.get(id)?.hash ?? null;
55
+ }
56
+ sourceOf(id) {
57
+ const source = this.#modules.get(id)?.input.source;
58
+ if (source === void 0) throw new Error(`Unknown host module ${id}`);
59
+ return source;
60
+ }
61
+ dependenciesOf(id) {
62
+ return [...this.#dependencies.get(id) ?? []].sort(compareIds);
63
+ }
64
+ dependentsOf(id) {
65
+ return [...this.#dependents.get(id) ?? []].sort(compareIds);
66
+ }
67
+ affectedBy(id) {
68
+ const affected = /* @__PURE__ */ new Set([id]);
69
+ const queue = [id];
70
+ while (queue.length) {
71
+ const current = queue.shift();
72
+ for (const dependent of this.#dependents.get(current) ?? []) {
73
+ if (affected.has(dependent)) continue;
74
+ affected.add(dependent);
75
+ queue.push(dependent);
76
+ }
77
+ }
78
+ return [...affected].sort(compareIds);
79
+ }
80
+ parseCount(id) {
81
+ return this.#candidate.parseCount(id);
82
+ }
83
+ resolveBinding(id, localName) {
84
+ const definition = this.#candidate.definitionOf(id, localName);
85
+ if (!definition) return null;
86
+ return {
87
+ id: definition.id,
88
+ name: definition.name,
89
+ span: {
90
+ id: definition.id,
91
+ start: definition.start,
92
+ end: definition.end
93
+ },
94
+ initializer: definition.initializer ? expressionReference(definition.id, definition.initializer) : null,
95
+ constant: definition.constant
96
+ };
97
+ }
98
+ expressionNode(reference) {
99
+ if (!this.#modules.has(reference.id)) return null;
100
+ return nodeAtSpan(this.#candidate.programOf(reference.id), reference.start, reference.end);
101
+ }
102
+ evaluate(reference) {
103
+ return evaluateExpression(this, reference);
104
+ }
105
+ evaluateConditional(reference) {
106
+ return evaluateConditionalExpression(this, reference);
107
+ }
108
+ evaluateBinding(id, localName) {
109
+ return evaluateBinding(this, id, localName);
110
+ }
111
+ elementsOf(id) {
112
+ const record = this.#modules.get(id);
113
+ if (!record) throw new Error(`Unknown host module ${id}`);
114
+ const cached = this.#elementCache.get(id);
115
+ if (cached?.hash === record.hash) return cached.result;
116
+ const result = normalizeElements(this.#candidate, id, record.input.imports);
117
+ this.#elementCache.set(id, {
118
+ hash: record.hash,
119
+ result
120
+ });
121
+ return result;
122
+ }
123
+ diagnostics() {
124
+ const diagnostics = this.#candidate.diagnostics().map((diagnostic) => diagnostic.kind === "parse" ? localBailout("local/parse-error", {
125
+ id: diagnostic.id,
126
+ start: 0,
127
+ end: 0
128
+ }, diagnostic.message) : linkedBailout("linked/unresolved-binding", {
129
+ id: diagnostic.id,
130
+ start: 0,
131
+ end: 0
132
+ }, diagnostic.message));
133
+ for (const [id, record] of this.#modules) {
134
+ for (const dependency of record.input.imports) {
135
+ if (dependency.external) continue;
136
+ if (this.#modules.has(dependency.resolvedId)) continue;
137
+ diagnostics.push(linkedBailout("linked/unresolved-import", {
138
+ id,
139
+ start: 0,
140
+ end: 0
141
+ }, `Host-resolved import ${dependency.specifier} points outside the project graph`, dependency.resolvedId));
142
+ }
143
+ }
144
+ return diagnostics.sort((left, right) => {
145
+ const byId = compareCodeUnits(left.span.id, right.span.id);
146
+ return byId || left.span.start - right.span.start || compareCodeUnits(left.code, right.code);
147
+ });
148
+ }
149
+ updateModule(input) {
150
+ const previous = this.#modules.get(input.id);
151
+ const nextHash = moduleContentHash(input);
152
+ if (previous?.hash === nextHash) {
153
+ return {
154
+ changed: false,
155
+ id: input.id,
156
+ previousHash: previous.hash,
157
+ contentHash: previous.hash,
158
+ invalidatedIds: []
159
+ };
160
+ }
161
+ const invalidatedIds = this.affectedBy(input.id);
162
+ const previousHash = previous?.hash ?? null;
163
+ if (previous) this.#candidate.removeFile(input.id);
164
+ this.#installHostRecord(input);
165
+ this.#candidate.addFile(input.id, input.source);
166
+ this.#candidate.link();
167
+ for (const id of invalidatedIds) this.#elementCache.delete(id);
168
+ return {
169
+ changed: true,
170
+ id: input.id,
171
+ previousHash,
172
+ contentHash: nextHash,
173
+ invalidatedIds
174
+ };
175
+ }
176
+ removeModule(id) {
177
+ const previous = this.#modules.get(id);
178
+ if (!previous) {
179
+ return {
180
+ changed: false,
181
+ id,
182
+ previousHash: null,
183
+ contentHash: null,
184
+ invalidatedIds: []
185
+ };
186
+ }
187
+ const invalidatedIds = this.affectedBy(id);
188
+ this.#candidate.removeFile(id);
189
+ this.#removeOutgoingEdges(id);
190
+ this.#removeResolutions(id);
191
+ this.#modules.delete(id);
192
+ this.#files.delete(id);
193
+ this.#candidate.link();
194
+ for (const invalidated of invalidatedIds) this.#elementCache.delete(invalidated);
195
+ return {
196
+ changed: true,
197
+ id,
198
+ previousHash: previous.hash,
199
+ contentHash: null,
200
+ invalidatedIds
201
+ };
202
+ }
203
+ #installHostRecord(input) {
204
+ resolvedModuleId(input.id);
205
+ const seenSpecifiers = /* @__PURE__ */ new Set();
206
+ for (const dependency of input.imports) {
207
+ resolvedModuleId(dependency.resolvedId);
208
+ if (seenSpecifiers.has(dependency.specifier)) {
209
+ throw new Error(`Duplicate host resolution for ${input.id}:${dependency.specifier}`);
210
+ }
211
+ seenSpecifiers.add(dependency.specifier);
212
+ }
213
+ this.#removeOutgoingEdges(input.id);
214
+ this.#removeResolutions(input.id);
215
+ const dependencies = new Set(input.imports.filter(({ external }) => !external).map(({ resolvedId }) => resolvedId));
216
+ this.#dependencies.set(input.id, dependencies);
217
+ for (const dependency of dependencies) {
218
+ let reverse = this.#dependents.get(dependency);
219
+ if (!reverse) {
220
+ reverse = /* @__PURE__ */ new Set();
221
+ this.#dependents.set(dependency, reverse);
222
+ }
223
+ reverse.add(input.id);
224
+ }
225
+ for (const dependency of input.imports) {
226
+ if (dependency.external) continue;
227
+ this.#resolutions.set(resolutionKey(input.id, dependency.specifier), dependency.resolvedId);
228
+ }
229
+ const installedInput = {
230
+ ...input,
231
+ imports: input.imports.map((dependency) => ({ ...dependency }))
232
+ };
233
+ this.#files.set(installedInput.id, installedInput.source);
234
+ this.#modules.set(installedInput.id, {
235
+ input: installedInput,
236
+ hash: moduleContentHash(installedInput)
237
+ });
238
+ }
239
+ #removeOutgoingEdges(id) {
240
+ for (const dependency of this.#dependencies.get(id) ?? []) {
241
+ const reverse = this.#dependents.get(dependency);
242
+ reverse?.delete(id);
243
+ if (reverse?.size === 0) this.#dependents.delete(dependency);
244
+ }
245
+ this.#dependencies.delete(id);
246
+ }
247
+ #removeResolutions(id) {
248
+ const prefix = `${id}\0`;
249
+ for (const key of this.#resolutions.keys()) {
250
+ if (key.startsWith(prefix)) this.#resolutions.delete(key);
251
+ }
252
+ }
253
+ };
254
+
255
+ export { ProjectGraph, moduleContentHash };
256
+ //# sourceMappingURL=graph.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","names":["#installHostRecord","#files","#resolutions","#candidate","#modules","#dependencies","#dependents","#elementCache","#removeOutgoingEdges","#removeResolutions"],"sources":["esm/graph.js"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { expressionReference, resolutionKey, resolvedModuleId } from \"./contracts\";\nimport { linkedBailout, localBailout } from \"./diagnostics\";\nimport {\n evaluateBinding,\n evaluateConditionalExpression,\n evaluateExpression\n} from \"./evaluate\";\nimport { nodeAtSpan, normalizeElements } from \"./normalize\";\nfunction compareIds(left, right) {\n return compareCodeUnits(left, right);\n}\nfunction compareCodeUnits(left, right) {\n return left < right ? -1 : left > right ? 1 : 0;\n}\nfunction stableImports(imports) {\n return [...imports].sort((left, right) => {\n const bySpecifier = compareCodeUnits(left.specifier, right.specifier);\n return bySpecifier || compareCodeUnits(left.resolvedId, right.resolvedId);\n });\n}\nfunction moduleContentHash(input) {\n const hash = createHash(\"sha256\");\n hash.update(input.source);\n hash.update(\"\\0\");\n for (const dependency of stableImports(input.imports)) {\n hash.update(dependency.specifier);\n hash.update(\"\\0\");\n hash.update(dependency.resolvedId);\n hash.update(\"\\0\");\n hash.update(dependency.external ? \"external\" : \"internal\");\n hash.update(\"\\0\");\n }\n return hash.digest(\"hex\");\n}\nclass ProjectGraph {\n #files = /* @__PURE__ */ new Map();\n #resolutions = /* @__PURE__ */ new Map();\n #modules = /* @__PURE__ */ new Map();\n #dependencies = /* @__PURE__ */ new Map();\n #dependents = /* @__PURE__ */ new Map();\n #elementCache = /* @__PURE__ */ new Map();\n #candidate;\n constructor(factory, project) {\n for (const input of project.modules) this.#installHostRecord(input);\n const candidateProject = {\n files: this.#files,\n resolutions: this.#resolutions\n };\n this.#candidate = factory.create(candidateProject);\n this.#candidate.link();\n }\n moduleIds() {\n return [...this.#modules.keys()].sort(compareIds);\n }\n contentHash(id) {\n return this.#modules.get(id)?.hash ?? null;\n }\n sourceOf(id) {\n const source = this.#modules.get(id)?.input.source;\n if (source === void 0) throw new Error(`Unknown host module ${id}`);\n return source;\n }\n dependenciesOf(id) {\n return [...this.#dependencies.get(id) ?? []].sort(compareIds);\n }\n dependentsOf(id) {\n return [...this.#dependents.get(id) ?? []].sort(compareIds);\n }\n affectedBy(id) {\n const affected = /* @__PURE__ */ new Set([id]);\n const queue = [id];\n while (queue.length) {\n const current = queue.shift();\n for (const dependent of this.#dependents.get(current) ?? []) {\n if (affected.has(dependent)) continue;\n affected.add(dependent);\n queue.push(dependent);\n }\n }\n return [...affected].sort(compareIds);\n }\n parseCount(id) {\n return this.#candidate.parseCount(id);\n }\n resolveBinding(id, localName) {\n const definition = this.#candidate.definitionOf(id, localName);\n if (!definition) return null;\n return {\n id: definition.id,\n name: definition.name,\n span: {\n id: definition.id,\n start: definition.start,\n end: definition.end\n },\n initializer: definition.initializer ? expressionReference(definition.id, definition.initializer) : null,\n constant: definition.constant\n };\n }\n expressionNode(reference) {\n if (!this.#modules.has(reference.id)) return null;\n return nodeAtSpan(\n this.#candidate.programOf(reference.id),\n reference.start,\n reference.end\n );\n }\n evaluate(reference) {\n return evaluateExpression(this, reference);\n }\n evaluateConditional(reference) {\n return evaluateConditionalExpression(this, reference);\n }\n evaluateBinding(id, localName) {\n return evaluateBinding(this, id, localName);\n }\n elementsOf(id) {\n const record = this.#modules.get(id);\n if (!record) throw new Error(`Unknown host module ${id}`);\n const cached = this.#elementCache.get(id);\n if (cached?.hash === record.hash) return cached.result;\n const result = normalizeElements(this.#candidate, id, record.input.imports);\n this.#elementCache.set(id, { hash: record.hash, result });\n return result;\n }\n diagnostics() {\n const diagnostics = this.#candidate.diagnostics().map(\n (diagnostic) => diagnostic.kind === \"parse\" ? localBailout(\n \"local/parse-error\",\n { id: diagnostic.id, start: 0, end: 0 },\n diagnostic.message\n ) : linkedBailout(\n \"linked/unresolved-binding\",\n { id: diagnostic.id, start: 0, end: 0 },\n diagnostic.message\n )\n );\n for (const [id, record] of this.#modules) {\n for (const dependency of record.input.imports) {\n if (dependency.external) continue;\n if (this.#modules.has(dependency.resolvedId)) continue;\n diagnostics.push(\n linkedBailout(\n \"linked/unresolved-import\",\n { id, start: 0, end: 0 },\n `Host-resolved import ${dependency.specifier} points outside the project graph`,\n dependency.resolvedId\n )\n );\n }\n }\n return diagnostics.sort((left, right) => {\n const byId = compareCodeUnits(left.span.id, right.span.id);\n return byId || left.span.start - right.span.start || compareCodeUnits(left.code, right.code);\n });\n }\n updateModule(input) {\n const previous = this.#modules.get(input.id);\n const nextHash = moduleContentHash(input);\n if (previous?.hash === nextHash) {\n return {\n changed: false,\n id: input.id,\n previousHash: previous.hash,\n contentHash: previous.hash,\n invalidatedIds: []\n };\n }\n const invalidatedIds = this.affectedBy(input.id);\n const previousHash = previous?.hash ?? null;\n if (previous) this.#candidate.removeFile(input.id);\n this.#installHostRecord(input);\n this.#candidate.addFile(input.id, input.source);\n this.#candidate.link();\n for (const id of invalidatedIds) this.#elementCache.delete(id);\n return {\n changed: true,\n id: input.id,\n previousHash,\n contentHash: nextHash,\n invalidatedIds\n };\n }\n removeModule(id) {\n const previous = this.#modules.get(id);\n if (!previous) {\n return {\n changed: false,\n id,\n previousHash: null,\n contentHash: null,\n invalidatedIds: []\n };\n }\n const invalidatedIds = this.affectedBy(id);\n this.#candidate.removeFile(id);\n this.#removeOutgoingEdges(id);\n this.#removeResolutions(id);\n this.#modules.delete(id);\n this.#files.delete(id);\n this.#candidate.link();\n for (const invalidated of invalidatedIds) this.#elementCache.delete(invalidated);\n return {\n changed: true,\n id,\n previousHash: previous.hash,\n contentHash: null,\n invalidatedIds\n };\n }\n #installHostRecord(input) {\n resolvedModuleId(input.id);\n const seenSpecifiers = /* @__PURE__ */ new Set();\n for (const dependency of input.imports) {\n resolvedModuleId(dependency.resolvedId);\n if (seenSpecifiers.has(dependency.specifier)) {\n throw new Error(\n `Duplicate host resolution for ${input.id}:${dependency.specifier}`\n );\n }\n seenSpecifiers.add(dependency.specifier);\n }\n this.#removeOutgoingEdges(input.id);\n this.#removeResolutions(input.id);\n const dependencies = new Set(\n input.imports.filter(({ external }) => !external).map(({ resolvedId }) => resolvedId)\n );\n this.#dependencies.set(input.id, dependencies);\n for (const dependency of dependencies) {\n let reverse = this.#dependents.get(dependency);\n if (!reverse) {\n reverse = /* @__PURE__ */ new Set();\n this.#dependents.set(dependency, reverse);\n }\n reverse.add(input.id);\n }\n for (const dependency of input.imports) {\n if (dependency.external) continue;\n this.#resolutions.set(\n resolutionKey(input.id, dependency.specifier),\n dependency.resolvedId\n );\n }\n const installedInput = {\n ...input,\n imports: input.imports.map((dependency) => ({ ...dependency }))\n };\n this.#files.set(installedInput.id, installedInput.source);\n this.#modules.set(installedInput.id, {\n input: installedInput,\n hash: moduleContentHash(installedInput)\n });\n }\n #removeOutgoingEdges(id) {\n for (const dependency of this.#dependencies.get(id) ?? []) {\n const reverse = this.#dependents.get(dependency);\n reverse?.delete(id);\n if (reverse?.size === 0) this.#dependents.delete(dependency);\n }\n this.#dependencies.delete(id);\n }\n #removeResolutions(id) {\n const prefix = `${id}\\0`;\n for (const key of this.#resolutions.keys()) {\n if (key.startsWith(prefix)) this.#resolutions.delete(key);\n }\n }\n}\nexport {\n ProjectGraph,\n moduleContentHash\n};\n//# sourceMappingURL=graph.js.map\n"],"mappings":"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"}