@tamagui/compiler-core 3.0.0-beta.891.1 → 3.0.0-beta.901.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.
@@ -158,7 +158,7 @@ function evaluateNode(resolver, id, input, state) {
158
158
  case "Identifier": {
159
159
  const name = (0, import_ast.identifierName)(node);
160
160
  if (!name) return unsupported(id, node);
161
- const definition = resolver.resolveBinding(id, name);
161
+ const definition = resolver.resolveReference((0, import_contracts.expressionReference)(id, node));
162
162
  if (!definition) {
163
163
  return {
164
164
  ok: false,
@@ -350,6 +350,32 @@ function evaluateDynamicNode(resolver, id, input, state) {
350
350
  }
351
351
  }
352
352
  }
353
+ if (node.type === "TemplateLiteral") {
354
+ const quasis = (0, import_ast.childNodes)(node, "quasis");
355
+ const expressions = (0, import_ast.childNodes)(node, "expressions");
356
+ let values = [""];
357
+ for (let position = 0; position < quasis.length; position++) {
358
+ const text = quasiText(quasis[position]);
359
+ values = values.map((value) => value + text);
360
+ const expression = expressions[position];
361
+ if (!expression) continue;
362
+ const part = evaluateDynamicNode(resolver, id, expression, state);
363
+ if (!part?.values) return null;
364
+ const next = [];
365
+ for (const value of values) {
366
+ for (const primitive of part.values) {
367
+ const joined = value + String(primitive);
368
+ if (!next.includes(joined)) next.push(joined);
369
+ }
370
+ }
371
+ if (next.length > 32) return null;
372
+ values = next;
373
+ }
374
+ return {
375
+ type: "string",
376
+ values
377
+ };
378
+ }
353
379
  return null;
354
380
  }
355
381
  function collectLeaves(node) {
@@ -379,9 +405,8 @@ function evaluateBranchesNode(resolver, id, input, depth, state, sourceId) {
379
405
  const node = (0, import_ast.unwrapExpression)(input);
380
406
  if (!(0, import_ast.isAstNode)(node)) return null;
381
407
  if (node.type === "Identifier") {
382
- const name = (0, import_ast.identifierName)(node);
383
- if (!name) return null;
384
- const definition = resolver.resolveBinding(id, name);
408
+ if (!(0, import_ast.identifierName)(node)) return null;
409
+ const definition = resolver.resolveReference((0, import_contracts.expressionReference)(id, node));
385
410
  if (!definition || !definition.constant || !definition.initializer) return null;
386
411
  const initializer = resolver.expressionNode(definition.initializer);
387
412
  if (!initializer) return null;
@@ -26,6 +26,7 @@ __export(graph_exports, {
26
26
  module.exports = __toCommonJS(graph_exports);
27
27
  var import_node_crypto = require("node:crypto");
28
28
  var import_contracts = require("./contracts.cjs");
29
+ var import_ast = require("./ast.cjs");
29
30
  var import_diagnostics = require("./diagnostics.cjs");
30
31
  var import_evaluate = require("./evaluate.cjs");
31
32
  var import_normalize = require("./normalize.cjs");
@@ -149,6 +150,34 @@ var ProjectGraph = class {
149
150
  if (!this.#modules.has(reference.id)) return null;
150
151
  return (0, import_normalize.nodeAtSpan)(this.#candidate.programOf(reference.id), reference.start, reference.end);
151
152
  }
153
+ /**
154
+ * The members of a plain object literal, each as its own expression:
155
+ * `{ width: expr, height: 10 }`. Null for anything else, and for an object
156
+ * that spreads, computes a key, or defines a method or accessor.
157
+ */
158
+ objectMembers(reference) {
159
+ const node = this.expressionNode(reference);
160
+ if (!node) return null;
161
+ const object = (0, import_ast.unwrapExpression)(node);
162
+ if (object.type !== "ObjectExpression") return null;
163
+ const members = [];
164
+ for (const property of (0, import_ast.childNodes)(object, "properties")) {
165
+ if (property.type !== "Property" && property.type !== "ObjectProperty" || property.computed === true || property.method === true || property.kind !== void 0 && property.kind !== "init") {
166
+ return null;
167
+ }
168
+ const key = (0, import_ast.childNode)(property, "key");
169
+ const value = (0, import_ast.childNode)(property, "value");
170
+ if (!key || !value) return null;
171
+ const name = (0, import_ast.identifierName)(key) ?? (typeof key.value === "string" ? key.value : null);
172
+ if (name === null) return null;
173
+ members.push({
174
+ name,
175
+ span: (0, import_contracts.spanOf)(reference.id, property),
176
+ value: (0, import_contracts.expressionReference)(reference.id, value)
177
+ });
178
+ }
179
+ return members;
180
+ }
152
181
  evaluate(reference) {
153
182
  return (0, import_evaluate.evaluateExpression)(this, reference);
154
183
  }
@@ -56,6 +56,14 @@ function unsafeEntry(element, entry, component, host) {
56
56
  if (entry.kind === "prop" && host.isStyleProp(entry.name, component) && (entry.value.kind === "bailout" || entry.value.kind === "conditional") && !host.canLowerDynamicStyleProp?.(entry.name, component, entry.value.kind)) {
57
57
  return diagnostic("local/dynamic-style-value", element, `Style prop ${entry.name} could not be evaluated`, entry.name);
58
58
  }
59
+ if (entry.kind === "prop" && entry.value.kind === "object") {
60
+ for (const member of entry.value.members) {
61
+ if (member.value.kind !== "bailout" && member.value.kind !== "conditional") continue;
62
+ if (!host.isStyleProp(member.name, component) || !host.canLowerDynamicStyleProp?.(member.name, component, member.value.kind)) {
63
+ return diagnostic("local/dynamic-style-value", element, `Style prop ${member.name} could not be evaluated`, member.name);
64
+ }
65
+ }
66
+ }
59
67
  return null;
60
68
  }
61
69
  function editsAreCandidateLocal(element, edits) {
@@ -71,13 +71,28 @@ function materializeValue(graph, value) {
71
71
  dynamic: graph.evaluateDynamic(value)
72
72
  };
73
73
  }
74
+ function materializeStyleObject(graph, reference, bailout) {
75
+ const members = graph.objectMembers(reference);
76
+ if (!members) return null;
77
+ return {
78
+ kind: "object",
79
+ span: reference,
80
+ members: members.map((member) => ({
81
+ name: member.name,
82
+ span: member.span,
83
+ value: materializeValue(graph, member.value)
84
+ })),
85
+ bailout
86
+ };
87
+ }
74
88
  function materializeEntry(graph, entry) {
75
89
  if (entry.kind === "prop") {
90
+ const value = materializeValue(graph, entry.value);
76
91
  return {
77
92
  kind: entry.kind,
78
93
  name: entry.name,
79
94
  span: entry.span,
80
- value: materializeValue(graph, entry.value)
95
+ value: entry.name === "style" && value.kind === "bailout" && entry.value.kind === "expression" ? materializeStyleObject(graph, entry.value, value.bailout) ?? value : value
81
96
  };
82
97
  }
83
98
  if (entry.kind === "spread") {
@@ -137,6 +152,9 @@ function collectDependencies(module2) {
137
152
  for (const dependency of value.dependencies) dependencies.add(dependency);
138
153
  } else if (value.kind === "dom-style") {
139
154
  for (const item of value.items) collect(item.value);
155
+ } else if (value.kind === "object") {
156
+ for (const member of value.members) collect(member.value);
157
+ if (value.bailout.dependencyId) dependencies.add(value.bailout.dependencyId);
140
158
  } else {
141
159
  for (const dependency of value.dynamic?.dependencies ?? []) {
142
160
  dependencies.add(dependency);
@@ -21,7 +21,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var normalize_exports = {};
22
22
  __export(normalize_exports, {
23
23
  asAstNode: () => asAstNode,
24
- declarationForName: () => declarationForName,
25
24
  definitionFromDeclaration: () => definitionFromDeclaration,
26
25
  nodeAtSpan: () => nodeAtSpan,
27
26
  normalizeElements: () => normalizeElements
@@ -615,12 +614,6 @@ function normalizeElements(candidate, rawId, imports = []) {
615
614
  bailouts: bailouts.sort((left, right) => left.span.start - right.span.start)
616
615
  };
617
616
  }
618
- function declarationForName(program, name) {
619
- return (0, import_ast.findAstNode)(program, (node) => {
620
- if (node.type !== "VariableDeclarator") return false;
621
- return (0, import_ast.identifierName)((0, import_ast.childNode)(node, "id")) === name;
622
- });
623
- }
624
617
  function nodeAtSpan(program, start, end) {
625
618
  return (0, import_ast.findAstNode)(program, (node) => node.start === start && node.end === end);
626
619
  }
package/dist/cjs/yuku.cjs CHANGED
@@ -64,8 +64,7 @@ var YukuCandidate = class {
64
64
  const declaration = symbol.declarations[0];
65
65
  if (!declaration) return null;
66
66
  const program = (0, import_normalize.asAstNode)(symbol.module.ast, `${symbol.module.path} program`);
67
- const normalizedDeclaration = (0, import_normalize.declarationForName)(program, symbol.name) ?? (0, import_normalize.asAstNode)(declaration, `${symbol.name} declaration`);
68
- return (0, import_normalize.definitionFromDeclaration)(symbol.module.path, symbol.name, program, normalizedDeclaration);
67
+ return (0, import_normalize.definitionFromDeclaration)(symbol.module.path, symbol.name, program, (0, import_normalize.asAstNode)(declaration, `${symbol.name} declaration`));
69
68
  }
70
69
  definitionOf(id, localName) {
71
70
  const symbol = this.#canonicalSymbol(id, localName);
@@ -129,7 +129,7 @@ function evaluateNode(resolver, id, input, state) {
129
129
  case "Identifier": {
130
130
  const name = identifierName(node);
131
131
  if (!name) return unsupported(id, node);
132
- const definition = resolver.resolveBinding(id, name);
132
+ const definition = resolver.resolveReference(expressionReference(id, node));
133
133
  if (!definition) {
134
134
  return {
135
135
  ok: false,
@@ -321,6 +321,32 @@ function evaluateDynamicNode(resolver, id, input, state) {
321
321
  }
322
322
  }
323
323
  }
324
+ if (node.type === "TemplateLiteral") {
325
+ const quasis = childNodes(node, "quasis");
326
+ const expressions = childNodes(node, "expressions");
327
+ let values = [""];
328
+ for (let position = 0; position < quasis.length; position++) {
329
+ const text = quasiText(quasis[position]);
330
+ values = values.map((value) => value + text);
331
+ const expression = expressions[position];
332
+ if (!expression) continue;
333
+ const part = evaluateDynamicNode(resolver, id, expression, state);
334
+ if (!part?.values) return null;
335
+ const next = [];
336
+ for (const value of values) {
337
+ for (const primitive of part.values) {
338
+ const joined = value + String(primitive);
339
+ if (!next.includes(joined)) next.push(joined);
340
+ }
341
+ }
342
+ if (next.length > 32) return null;
343
+ values = next;
344
+ }
345
+ return {
346
+ type: "string",
347
+ values
348
+ };
349
+ }
324
350
  return null;
325
351
  }
326
352
  function collectLeaves(node) {
@@ -350,9 +376,8 @@ function evaluateBranchesNode(resolver, id, input, depth, state, sourceId) {
350
376
  const node = unwrapExpression(input);
351
377
  if (!isAstNode(node)) return null;
352
378
  if (node.type === "Identifier") {
353
- const name = identifierName(node);
354
- if (!name) return null;
355
- const definition = resolver.resolveBinding(id, name);
379
+ if (!identifierName(node)) return null;
380
+ const definition = resolver.resolveReference(expressionReference(id, node));
356
381
  if (!definition || !definition.constant || !definition.initializer) return null;
357
382
  const initializer = resolver.expressionNode(definition.initializer);
358
383
  if (!initializer) return null;
@@ -1 +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 output += quasiText(quasis[index]);\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 quasiText(quasi) {\n const cooked = quasi?.value?.cooked;\n const raw = quasi?.value?.raw;\n return typeof cooked === \"string\" ? cooked : typeof raw === \"string\" ? raw : \"\";\n}\nfunction dynamicPrimitive(value) {\n if (value === null) return \"null\";\n if (typeof value === \"number\") return \"number\";\n if (typeof value === \"string\") return \"string\";\n if (typeof value === \"boolean\") return \"boolean\";\n return null;\n}\nfunction evaluateDynamicNode(resolver, id, input, state) {\n const exact = evaluateNode(resolver, id, input, state);\n if (exact.ok) {\n const type = dynamicPrimitive(exact.value);\n return type ? { type, values: [exact.value] } : null;\n }\n const node = unwrapExpression(input);\n if (node.type === \"Identifier\") {\n if (!identifierName(node)) return null;\n const definition = resolver.resolveReference(expressionReference(id, node));\n if (!definition?.constant || !definition.initializer) return null;\n const key = `${definition.id}:${definition.span.start}`;\n if (state.activeDefinitions.has(key)) return null;\n const initializer = resolver.expressionNode(definition.initializer);\n if (!initializer) return null;\n state.dependencies.add(definition.id);\n state.activeDefinitions.add(key);\n try {\n return evaluateDynamicNode(resolver, definition.id, initializer, state);\n } finally {\n state.activeDefinitions.delete(key);\n }\n }\n if (node.type === \"MemberExpression\") {\n const objectNode = childNode(node, \"object\");\n const propertyNode = childNode(node, \"property\");\n if (!objectNode || !propertyNode) return null;\n const object = evaluateNode(resolver, id, objectNode, state);\n if (!object.ok || !Array.isArray(object.value)) return null;\n const property = evaluateDynamicNode(resolver, id, propertyNode, state);\n if (property?.type !== \"number\" || object.value.length > 32) return null;\n const values = [];\n let type = null;\n for (const value of object.value) {\n const nextType = dynamicPrimitive(value);\n if (!nextType || type && type !== nextType) return null;\n type = nextType;\n const primitive = value;\n if (!values.includes(primitive)) values.push(primitive);\n }\n return type ? { type, values } : null;\n }\n if (node.type === \"BinaryExpression\") {\n const leftNode = childNode(node, \"left\");\n const rightNode = childNode(node, \"right\");\n if (!leftNode || !rightNode) return null;\n const left = evaluateDynamicNode(resolver, id, leftNode, state);\n const right = evaluateDynamicNode(resolver, id, rightNode, state);\n if (node.operator === \"+\") {\n return left?.type === \"number\" && right?.type === \"number\" ? { type: \"number\" } : null;\n }\n if (node.operator === \"-\" || node.operator === \"*\" || node.operator === \"/\" || node.operator === \"%\" || node.operator === \"**\") {\n if (left?.type === \"number\" || right?.type === \"number\") {\n return { type: \"number\" };\n }\n }\n }\n return null;\n}\nfunction collectLeaves(node) {\n if (node.kind === \"leaf\") return [node];\n return [...collectLeaves(node.whenTrue), ...collectLeaves(node.whenFalse)];\n}\nfunction collectBranchDependencies(node) {\n if (node.kind === \"leaf\") return node.dependencies;\n return [\n .../* @__PURE__ */ new Set([\n ...collectBranchDependencies(node.whenTrue),\n ...collectBranchDependencies(node.whenFalse)\n ])\n ].sort();\n}\nfunction evaluateBranchChild(resolver, id, node, depth, state, sourceId) {\n const leafState = {\n activeDefinitions: new Set(state.activeDefinitions),\n dependencies: new Set(state.dependencies)\n };\n const leafRes = evaluateNode(resolver, id, node, leafState);\n if (leafRes.ok) {\n return {\n kind: \"leaf\",\n value: leafRes.value,\n dependencies: [...leafState.dependencies].sort()\n };\n }\n return evaluateBranchesNode(resolver, id, node, depth + 1, leafState, sourceId);\n}\nfunction evaluateBranchesNode(resolver, id, input, depth, state, sourceId) {\n const node = unwrapExpression(input);\n if (!isAstNode(node)) return null;\n if (node.type === \"Identifier\") {\n const name = identifierName(node);\n if (!name) return null;\n const definition = resolver.resolveBinding(id, name);\n if (!definition || !definition.constant || !definition.initializer) return null;\n const initializer = resolver.expressionNode(definition.initializer);\n if (!initializer) return null;\n const key = `${definition.id}:${definition.span.start}`;\n if (state.activeDefinitions.has(key)) return null;\n state.activeDefinitions.add(key);\n state.dependencies.add(definition.id);\n try {\n return evaluateBranchesNode(\n resolver,\n definition.id,\n initializer,\n depth,\n state,\n sourceId\n );\n } finally {\n state.activeDefinitions.delete(key);\n }\n }\n if (depth >= 3) return null;\n if (node.type === \"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 null;\n const test = spanOf(id, testNode);\n if (test.id !== sourceId) return null;\n const whenTrue = evaluateBranchChild(resolver, id, consequent, depth, state, sourceId);\n if (!whenTrue) return null;\n const whenFalse = evaluateBranchChild(resolver, id, alternate, depth, state, sourceId);\n if (!whenFalse) return null;\n return {\n kind: \"branch\",\n test,\n whenTrue,\n whenFalse\n };\n }\n if (node.type === \"TemplateLiteral\") {\n return templateBranchesNode(\n resolver,\n id,\n childNodes(node, \"quasis\"),\n childNodes(node, \"expressions\"),\n 0,\n \"\",\n depth,\n state,\n sourceId\n );\n }\n if (node.type === \"LogicalExpression\") {\n const left = childNode(node, \"left\");\n const right = childNode(node, \"right\");\n if (!left || !right) return null;\n if (node.operator === \"&&\") {\n const test = spanOf(id, left);\n if (test.id !== sourceId) return null;\n const whenTrue = evaluateBranchChild(resolver, id, right, depth, state, sourceId);\n if (!whenTrue) return null;\n const whenFalse = {\n kind: \"leaf\",\n value: void 0,\n dependencies: [...state.dependencies].sort()\n };\n return {\n kind: \"branch\",\n test,\n whenTrue,\n whenFalse\n };\n }\n if (node.operator === \"||\" || node.operator === \"??\") {\n const test = spanOf(id, left);\n if (test.id !== sourceId) return null;\n const leftState = {\n activeDefinitions: new Set(state.activeDefinitions),\n dependencies: new Set(state.dependencies)\n };\n const leftRes = evaluateNode(resolver, id, left, leftState);\n if (!leftRes.ok) return null;\n const whenTrue = {\n kind: \"leaf\",\n value: leftRes.value,\n dependencies: [...leftState.dependencies].sort()\n };\n const whenFalse = evaluateBranchChild(resolver, id, right, depth, state, sourceId);\n if (!whenFalse) return null;\n return {\n kind: \"branch\",\n test,\n whenTrue,\n whenFalse\n };\n }\n }\n return null;\n}\nfunction mapBranchLeaves(node, map) {\n if (node.kind === \"leaf\") return map(node);\n const whenTrue = mapBranchLeaves(node.whenTrue, map);\n if (!whenTrue) return null;\n const whenFalse = mapBranchLeaves(node.whenFalse, map);\n if (!whenFalse) return null;\n return { kind: \"branch\", test: node.test, whenTrue, whenFalse };\n}\nfunction templateBranchesNode(resolver, id, quasis, expressions, index, prefix, depth, state, sourceId) {\n let text = prefix;\n for (let position = index; position < quasis.length; position++) {\n text += quasiText(quasis[position]);\n const expression = expressions[position];\n if (!expression) continue;\n const exact = evaluateNode(resolver, id, expression, state);\n if (exact.ok) {\n const interpolated = templateInterpolation(exact.value);\n if (interpolated === null) return null;\n text += interpolated;\n continue;\n }\n const tree = evaluateBranchesNode(\n resolver,\n id,\n expression,\n depth + 1,\n state,\n sourceId\n );\n if (!tree) return null;\n return mapBranchLeaves(tree, (leaf) => {\n if (leaf.value === void 0) return null;\n const interpolated = templateInterpolation(leaf.value);\n if (interpolated === null) return null;\n return templateBranchesNode(\n resolver,\n id,\n quasis,\n expressions,\n position + 1,\n text + interpolated,\n depth + 1,\n state,\n sourceId\n );\n });\n }\n return { kind: \"leaf\", value: text, dependencies: [...state.dependencies].sort() };\n}\nfunction templateInterpolation(value) {\n if (value === null) return \"null\";\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n return null;\n}\nfunction evaluateBranches(resolver, reference) {\n const node = resolver.expressionNode(reference);\n if (!node) return null;\n const state = {\n activeDefinitions: /* @__PURE__ */ new Set(),\n dependencies: /* @__PURE__ */ new Set()\n };\n const tree = evaluateBranchesNode(resolver, reference.id, node, 0, state, reference.id);\n return tree?.kind === \"branch\" ? tree : null;\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 evaluateDynamicExpression(resolver, reference) {\n const node = resolver.expressionNode(reference);\n if (!node) return null;\n const state = {\n activeDefinitions: /* @__PURE__ */ new Set(),\n dependencies: /* @__PURE__ */ new Set()\n };\n const result = evaluateDynamicNode(resolver, reference.id, node, state);\n return result ? { ...result, dependencies: [...state.dependencies].sort() } : null;\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 collectBranchDependencies,\n collectLeaves,\n evaluateBinding,\n evaluateBranches,\n evaluateDynamicExpression,\n evaluateExpression\n};\n//# sourceMappingURL=evaluate.js.map\n"],"mappings":"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"}
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.resolveReference(expressionReference(id, node));\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 output += quasiText(quasis[index]);\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 quasiText(quasi) {\n const cooked = quasi?.value?.cooked;\n const raw = quasi?.value?.raw;\n return typeof cooked === \"string\" ? cooked : typeof raw === \"string\" ? raw : \"\";\n}\nfunction dynamicPrimitive(value) {\n if (value === null) return \"null\";\n if (typeof value === \"number\") return \"number\";\n if (typeof value === \"string\") return \"string\";\n if (typeof value === \"boolean\") return \"boolean\";\n return null;\n}\nfunction evaluateDynamicNode(resolver, id, input, state) {\n const exact = evaluateNode(resolver, id, input, state);\n if (exact.ok) {\n const type = dynamicPrimitive(exact.value);\n return type ? { type, values: [exact.value] } : null;\n }\n const node = unwrapExpression(input);\n if (node.type === \"Identifier\") {\n if (!identifierName(node)) return null;\n const definition = resolver.resolveReference(expressionReference(id, node));\n if (!definition?.constant || !definition.initializer) return null;\n const key = `${definition.id}:${definition.span.start}`;\n if (state.activeDefinitions.has(key)) return null;\n const initializer = resolver.expressionNode(definition.initializer);\n if (!initializer) return null;\n state.dependencies.add(definition.id);\n state.activeDefinitions.add(key);\n try {\n return evaluateDynamicNode(resolver, definition.id, initializer, state);\n } finally {\n state.activeDefinitions.delete(key);\n }\n }\n if (node.type === \"MemberExpression\") {\n const objectNode = childNode(node, \"object\");\n const propertyNode = childNode(node, \"property\");\n if (!objectNode || !propertyNode) return null;\n const object = evaluateNode(resolver, id, objectNode, state);\n if (!object.ok || !Array.isArray(object.value)) return null;\n const property = evaluateDynamicNode(resolver, id, propertyNode, state);\n if (property?.type !== \"number\" || object.value.length > 32) return null;\n const values = [];\n let type = null;\n for (const value of object.value) {\n const nextType = dynamicPrimitive(value);\n if (!nextType || type && type !== nextType) return null;\n type = nextType;\n const primitive = value;\n if (!values.includes(primitive)) values.push(primitive);\n }\n return type ? { type, values } : null;\n }\n if (node.type === \"BinaryExpression\") {\n const leftNode = childNode(node, \"left\");\n const rightNode = childNode(node, \"right\");\n if (!leftNode || !rightNode) return null;\n const left = evaluateDynamicNode(resolver, id, leftNode, state);\n const right = evaluateDynamicNode(resolver, id, rightNode, state);\n if (node.operator === \"+\") {\n return left?.type === \"number\" && right?.type === \"number\" ? { type: \"number\" } : null;\n }\n if (node.operator === \"-\" || node.operator === \"*\" || node.operator === \"/\" || node.operator === \"%\" || node.operator === \"**\") {\n if (left?.type === \"number\" || right?.type === \"number\") {\n return { type: \"number\" };\n }\n }\n }\n if (node.type === \"TemplateLiteral\") {\n const quasis = childNodes(node, \"quasis\");\n const expressions = childNodes(node, \"expressions\");\n let values = [\"\"];\n for (let position = 0; position < quasis.length; position++) {\n const text = quasiText(quasis[position]);\n values = values.map((value) => value + text);\n const expression = expressions[position];\n if (!expression) continue;\n const part = evaluateDynamicNode(resolver, id, expression, state);\n if (!part?.values) return null;\n const next = [];\n for (const value of values) {\n for (const primitive of part.values) {\n const joined = value + String(primitive);\n if (!next.includes(joined)) next.push(joined);\n }\n }\n if (next.length > 32) return null;\n values = next;\n }\n return { type: \"string\", values };\n }\n return null;\n}\nfunction collectLeaves(node) {\n if (node.kind === \"leaf\") return [node];\n return [...collectLeaves(node.whenTrue), ...collectLeaves(node.whenFalse)];\n}\nfunction collectBranchDependencies(node) {\n if (node.kind === \"leaf\") return node.dependencies;\n return [\n .../* @__PURE__ */ new Set([\n ...collectBranchDependencies(node.whenTrue),\n ...collectBranchDependencies(node.whenFalse)\n ])\n ].sort();\n}\nfunction evaluateBranchChild(resolver, id, node, depth, state, sourceId) {\n const leafState = {\n activeDefinitions: new Set(state.activeDefinitions),\n dependencies: new Set(state.dependencies)\n };\n const leafRes = evaluateNode(resolver, id, node, leafState);\n if (leafRes.ok) {\n return {\n kind: \"leaf\",\n value: leafRes.value,\n dependencies: [...leafState.dependencies].sort()\n };\n }\n return evaluateBranchesNode(resolver, id, node, depth + 1, leafState, sourceId);\n}\nfunction evaluateBranchesNode(resolver, id, input, depth, state, sourceId) {\n const node = unwrapExpression(input);\n if (!isAstNode(node)) return null;\n if (node.type === \"Identifier\") {\n if (!identifierName(node)) return null;\n const definition = resolver.resolveReference(expressionReference(id, node));\n if (!definition || !definition.constant || !definition.initializer) return null;\n const initializer = resolver.expressionNode(definition.initializer);\n if (!initializer) return null;\n const key = `${definition.id}:${definition.span.start}`;\n if (state.activeDefinitions.has(key)) return null;\n state.activeDefinitions.add(key);\n state.dependencies.add(definition.id);\n try {\n return evaluateBranchesNode(\n resolver,\n definition.id,\n initializer,\n depth,\n state,\n sourceId\n );\n } finally {\n state.activeDefinitions.delete(key);\n }\n }\n if (depth >= 3) return null;\n if (node.type === \"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 null;\n const test = spanOf(id, testNode);\n if (test.id !== sourceId) return null;\n const whenTrue = evaluateBranchChild(resolver, id, consequent, depth, state, sourceId);\n if (!whenTrue) return null;\n const whenFalse = evaluateBranchChild(resolver, id, alternate, depth, state, sourceId);\n if (!whenFalse) return null;\n return {\n kind: \"branch\",\n test,\n whenTrue,\n whenFalse\n };\n }\n if (node.type === \"TemplateLiteral\") {\n return templateBranchesNode(\n resolver,\n id,\n childNodes(node, \"quasis\"),\n childNodes(node, \"expressions\"),\n 0,\n \"\",\n depth,\n state,\n sourceId\n );\n }\n if (node.type === \"LogicalExpression\") {\n const left = childNode(node, \"left\");\n const right = childNode(node, \"right\");\n if (!left || !right) return null;\n if (node.operator === \"&&\") {\n const test = spanOf(id, left);\n if (test.id !== sourceId) return null;\n const whenTrue = evaluateBranchChild(resolver, id, right, depth, state, sourceId);\n if (!whenTrue) return null;\n const whenFalse = {\n kind: \"leaf\",\n value: void 0,\n dependencies: [...state.dependencies].sort()\n };\n return {\n kind: \"branch\",\n test,\n whenTrue,\n whenFalse\n };\n }\n if (node.operator === \"||\" || node.operator === \"??\") {\n const test = spanOf(id, left);\n if (test.id !== sourceId) return null;\n const leftState = {\n activeDefinitions: new Set(state.activeDefinitions),\n dependencies: new Set(state.dependencies)\n };\n const leftRes = evaluateNode(resolver, id, left, leftState);\n if (!leftRes.ok) return null;\n const whenTrue = {\n kind: \"leaf\",\n value: leftRes.value,\n dependencies: [...leftState.dependencies].sort()\n };\n const whenFalse = evaluateBranchChild(resolver, id, right, depth, state, sourceId);\n if (!whenFalse) return null;\n return {\n kind: \"branch\",\n test,\n whenTrue,\n whenFalse\n };\n }\n }\n return null;\n}\nfunction mapBranchLeaves(node, map) {\n if (node.kind === \"leaf\") return map(node);\n const whenTrue = mapBranchLeaves(node.whenTrue, map);\n if (!whenTrue) return null;\n const whenFalse = mapBranchLeaves(node.whenFalse, map);\n if (!whenFalse) return null;\n return { kind: \"branch\", test: node.test, whenTrue, whenFalse };\n}\nfunction templateBranchesNode(resolver, id, quasis, expressions, index, prefix, depth, state, sourceId) {\n let text = prefix;\n for (let position = index; position < quasis.length; position++) {\n text += quasiText(quasis[position]);\n const expression = expressions[position];\n if (!expression) continue;\n const exact = evaluateNode(resolver, id, expression, state);\n if (exact.ok) {\n const interpolated = templateInterpolation(exact.value);\n if (interpolated === null) return null;\n text += interpolated;\n continue;\n }\n const tree = evaluateBranchesNode(\n resolver,\n id,\n expression,\n depth + 1,\n state,\n sourceId\n );\n if (!tree) return null;\n return mapBranchLeaves(tree, (leaf) => {\n if (leaf.value === void 0) return null;\n const interpolated = templateInterpolation(leaf.value);\n if (interpolated === null) return null;\n return templateBranchesNode(\n resolver,\n id,\n quasis,\n expressions,\n position + 1,\n text + interpolated,\n depth + 1,\n state,\n sourceId\n );\n });\n }\n return { kind: \"leaf\", value: text, dependencies: [...state.dependencies].sort() };\n}\nfunction templateInterpolation(value) {\n if (value === null) return \"null\";\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n return null;\n}\nfunction evaluateBranches(resolver, reference) {\n const node = resolver.expressionNode(reference);\n if (!node) return null;\n const state = {\n activeDefinitions: /* @__PURE__ */ new Set(),\n dependencies: /* @__PURE__ */ new Set()\n };\n const tree = evaluateBranchesNode(resolver, reference.id, node, 0, state, reference.id);\n return tree?.kind === \"branch\" ? tree : null;\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 evaluateDynamicExpression(resolver, reference) {\n const node = resolver.expressionNode(reference);\n if (!node) return null;\n const state = {\n activeDefinitions: /* @__PURE__ */ new Set(),\n dependencies: /* @__PURE__ */ new Set()\n };\n const result = evaluateDynamicNode(resolver, reference.id, node, state);\n return result ? { ...result, dependencies: [...state.dependencies].sort() } : null;\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 collectBranchDependencies,\n collectLeaves,\n evaluateBinding,\n evaluateBranches,\n evaluateDynamicExpression,\n evaluateExpression\n};\n//# sourceMappingURL=evaluate.js.map\n"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
- import { expressionReference, resolutionKey, resolvedModuleId } from "./contracts.mjs";
2
+ import { expressionReference, resolutionKey, resolvedModuleId, spanOf } from "./contracts.mjs";
3
+ import { childNode, childNodes, identifierName, unwrapExpression } from "./ast.mjs";
3
4
  import { linkedBailout, localBailout } from "./diagnostics.mjs";
4
5
  import { evaluateBinding, evaluateBranches, evaluateDynamicExpression, evaluateExpression } from "./evaluate.mjs";
5
6
  import { nodeAtSpan, normalizeElements } from "./normalize.mjs";
@@ -124,6 +125,34 @@ var ProjectGraph = class {
124
125
  if (!this.#modules.has(reference.id)) return null;
125
126
  return nodeAtSpan(this.#candidate.programOf(reference.id), reference.start, reference.end);
126
127
  }
128
+ /**
129
+ * The members of a plain object literal, each as its own expression:
130
+ * `{ width: expr, height: 10 }`. Null for anything else, and for an object
131
+ * that spreads, computes a key, or defines a method or accessor.
132
+ */
133
+ objectMembers(reference) {
134
+ const node = this.expressionNode(reference);
135
+ if (!node) return null;
136
+ const object = unwrapExpression(node);
137
+ if (object.type !== "ObjectExpression") return null;
138
+ const members = [];
139
+ for (const property of childNodes(object, "properties")) {
140
+ if (property.type !== "Property" && property.type !== "ObjectProperty" || property.computed === true || property.method === true || property.kind !== void 0 && property.kind !== "init") {
141
+ return null;
142
+ }
143
+ const key = childNode(property, "key");
144
+ const value = childNode(property, "value");
145
+ if (!key || !value) return null;
146
+ const name = identifierName(key) ?? (typeof key.value === "string" ? key.value : null);
147
+ if (name === null) return null;
148
+ members.push({
149
+ name,
150
+ span: spanOf(reference.id, property),
151
+ value: expressionReference(reference.id, value)
152
+ });
153
+ }
154
+ return members;
155
+ }
127
156
  evaluate(reference) {
128
157
  return evaluateExpression(this, reference);
129
158
  }
@@ -1 +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 evaluateBranches,\n evaluateDynamicExpression,\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 /** resolved ids a module imports that the graph does not own (package entries) */\n externalImportsOf(id) {\n const record = this.#modules.get(id);\n if (!record) return [];\n const ids = /* @__PURE__ */ new Set();\n for (const dependency of record.input.imports) {\n if (dependency.external) ids.add(dependency.resolvedId);\n }\n return [...ids].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 resolveReference(reference) {\n const definition = this.#candidate.definitionAt(\n reference.id,\n reference.start,\n reference.end\n );\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 evaluateBranches(reference) {\n return evaluateBranches(this, reference);\n }\n evaluateDynamic(reference) {\n return evaluateDynamicExpression(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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"}
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, spanOf } from \"./contracts\";\nimport { childNode, childNodes, identifierName, unwrapExpression } from \"./ast\";\nimport { linkedBailout, localBailout } from \"./diagnostics\";\nimport {\n evaluateBinding,\n evaluateBranches,\n evaluateDynamicExpression,\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 /** resolved ids a module imports that the graph does not own (package entries) */\n externalImportsOf(id) {\n const record = this.#modules.get(id);\n if (!record) return [];\n const ids = /* @__PURE__ */ new Set();\n for (const dependency of record.input.imports) {\n if (dependency.external) ids.add(dependency.resolvedId);\n }\n return [...ids].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 resolveReference(reference) {\n const definition = this.#candidate.definitionAt(\n reference.id,\n reference.start,\n reference.end\n );\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 /**\n * The members of a plain object literal, each as its own expression:\n * `{ width: expr, height: 10 }`. Null for anything else, and for an object\n * that spreads, computes a key, or defines a method or accessor.\n */\n objectMembers(reference) {\n const node = this.expressionNode(reference);\n if (!node) return null;\n const object = unwrapExpression(node);\n if (object.type !== \"ObjectExpression\") return null;\n const members = [];\n for (const property of childNodes(object, \"properties\")) {\n if (property.type !== \"Property\" && property.type !== \"ObjectProperty\" || property.computed === true || property.method === true || property.kind !== void 0 && property.kind !== \"init\") {\n return null;\n }\n const key = childNode(property, \"key\");\n const value = childNode(property, \"value\");\n if (!key || !value) return null;\n const name = identifierName(key) ?? (typeof key.value === \"string\" ? key.value : null);\n if (name === null) return null;\n members.push({\n name,\n span: spanOf(reference.id, property),\n value: expressionReference(reference.id, value)\n });\n }\n return members;\n }\n evaluate(reference) {\n return evaluateExpression(this, reference);\n }\n evaluateBranches(reference) {\n return evaluateBranches(this, reference);\n }\n evaluateDynamic(reference) {\n return evaluateDynamicExpression(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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"}
@@ -31,6 +31,14 @@ function unsafeEntry(element, entry, component, host) {
31
31
  if (entry.kind === "prop" && host.isStyleProp(entry.name, component) && (entry.value.kind === "bailout" || entry.value.kind === "conditional") && !host.canLowerDynamicStyleProp?.(entry.name, component, entry.value.kind)) {
32
32
  return diagnostic("local/dynamic-style-value", element, `Style prop ${entry.name} could not be evaluated`, entry.name);
33
33
  }
34
+ if (entry.kind === "prop" && entry.value.kind === "object") {
35
+ for (const member of entry.value.members) {
36
+ if (member.value.kind !== "bailout" && member.value.kind !== "conditional") continue;
37
+ if (!host.isStyleProp(member.name, component) || !host.canLowerDynamicStyleProp?.(member.name, component, member.value.kind)) {
38
+ return diagnostic("local/dynamic-style-value", element, `Style prop ${member.name} could not be evaluated`, member.name);
39
+ }
40
+ }
41
+ }
34
42
  return null;
35
43
  }
36
44
  function editsAreCandidateLocal(element, edits) {