@tamagui/compiler-core 0.0.0-bootstrap.0 → 3.0.0-beta.1093.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.
- package/LICENSE +21 -0
- package/README.md +57 -1
- package/dist/cjs/ast.cjs +108 -0
- package/dist/cjs/contracts.cjs +61 -0
- package/dist/cjs/diagnostics.cjs +68 -0
- package/dist/cjs/evaluate.cjs +602 -0
- package/dist/cjs/graph.cjs +335 -0
- package/dist/cjs/hash.cjs +48 -0
- package/dist/cjs/index.cjs +43 -0
- package/dist/cjs/ir.cjs +32 -0
- package/dist/cjs/lower.cjs +232 -0
- package/dist/cjs/materialize.cjs +222 -0
- package/dist/cjs/normalize.cjs +628 -0
- package/dist/cjs/output.cjs +148 -0
- package/dist/cjs/planCache.cjs +262 -0
- package/dist/cjs/session.cjs +127 -0
- package/dist/cjs/yuku.cjs +166 -0
- package/dist/cjs/zero.cjs +389 -0
- package/dist/esm/ast.mjs +79 -0
- package/dist/esm/ast.mjs.map +1 -0
- package/dist/esm/contracts.mjs +34 -0
- package/dist/esm/contracts.mjs.map +1 -0
- package/dist/esm/diagnostics.mjs +44 -0
- package/dist/esm/diagnostics.mjs.map +1 -0
- package/dist/esm/evaluate.mjs +576 -0
- package/dist/esm/evaluate.mjs.map +1 -0
- package/dist/esm/graph.mjs +313 -0
- package/dist/esm/graph.mjs.map +1 -0
- package/dist/esm/hash.mjs +26 -0
- package/dist/esm/hash.mjs.map +1 -0
- package/dist/esm/index.mjs +30 -0
- package/dist/esm/ir.mjs +12 -0
- package/dist/esm/ir.mjs.map +1 -0
- package/dist/esm/lower.mjs +210 -0
- package/dist/esm/lower.mjs.map +1 -0
- package/dist/esm/materialize.mjs +203 -0
- package/dist/esm/materialize.mjs.map +1 -0
- package/dist/esm/normalize.mjs +604 -0
- package/dist/esm/normalize.mjs.map +1 -0
- package/dist/esm/output.mjs +119 -0
- package/dist/esm/output.mjs.map +1 -0
- package/dist/esm/planCache.mjs +232 -0
- package/dist/esm/planCache.mjs.map +1 -0
- package/dist/esm/session.mjs +108 -0
- package/dist/esm/session.mjs.map +1 -0
- package/dist/esm/yuku.mjs +144 -0
- package/dist/esm/yuku.mjs.map +1 -0
- package/dist/esm/zero.mjs +354 -0
- package/dist/esm/zero.mjs.map +1 -0
- package/package.json +42 -4
- package/src/ast.ts +106 -0
- package/src/contracts.ts +150 -0
- package/src/diagnostics.ts +96 -0
- package/src/evaluate.ts +875 -0
- package/src/graph.ts +425 -0
- package/src/hash.ts +36 -0
- package/src/index.ts +15 -0
- package/src/ir.ts +156 -0
- package/src/lower.ts +435 -0
- package/src/materialize.ts +383 -0
- package/src/normalize.ts +834 -0
- package/src/output.ts +175 -0
- package/src/planCache.ts +362 -0
- package/src/session.ts +192 -0
- package/src/yuku.ts +197 -0
- package/src/zero.ts +609 -0
- package/types/ast.d.ts +11 -0
- package/types/ast.d.ts.map +1 -0
- package/types/contracts.d.ts +99 -0
- package/types/contracts.d.ts.map +1 -0
- package/types/diagnostics.d.ts +31 -0
- package/types/diagnostics.d.ts.map +1 -0
- package/types/evaluate.d.ts +48 -0
- package/types/evaluate.d.ts.map +1 -0
- package/types/graph.d.ts +51 -0
- package/types/graph.d.ts.map +1 -0
- package/types/hash.d.ts +8 -0
- package/types/hash.d.ts.map +1 -0
- package/types/index.d.ts +16 -0
- package/types/index.d.ts.map +1 -0
- package/types/ir.d.ts +120 -0
- package/types/ir.d.ts.map +1 -0
- package/types/lower.d.ts +99 -0
- package/types/lower.d.ts.map +1 -0
- package/types/materialize.d.ts +121 -0
- package/types/materialize.d.ts.map +1 -0
- package/types/normalize.d.ts +7 -0
- package/types/normalize.d.ts.map +1 -0
- package/types/output.d.ts +32 -0
- package/types/output.d.ts.map +1 -0
- package/types/planCache.d.ts +123 -0
- package/types/planCache.d.ts.map +1 -0
- package/types/session.d.ts +52 -0
- package/types/session.d.ts.map +1 -0
- package/types/yuku.d.ts +4 -0
- package/types/yuku.d.ts.map +1 -0
- package/types/zero.d.ts +99 -0
- package/types/zero.d.ts.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize.js","names":[],"sources":["esm/normalize.js"],"sourcesContent":["import {\n childNode,\n childNodes,\n findAstNode,\n identifierName,\n isAstNode,\n walkAst\n} from \"./ast\";\nimport {\n expressionReference,\n resolvedModuleId,\n spanOf\n} from \"./contracts\";\nimport { linkedBailout, localBailout } from \"./diagnostics\";\nimport { hostImportProvenance } from \"./ir\";\nfunction finalizeElement(base, entries, bailouts) {\n if (bailouts.length === 0) {\n return { ...base, complete: true, entries, bailouts: [] };\n }\n return {\n ...base,\n complete: false,\n bailedEntries: entries,\n bailouts\n };\n}\nfunction definitionFromDeclaration(id, name, declaration, parentOf) {\n let identifier = declaration;\n let initializer = null;\n let constant = false;\n if (declaration.type === \"VariableDeclarator\") {\n identifier = childNode(declaration, \"id\") ?? declaration;\n initializer = childNode(declaration, \"init\");\n const parent = parentOf(declaration);\n constant = parent?.type === \"VariableDeclaration\" && parent.kind === \"const\";\n } else if (declaration.type === \"Identifier\") {\n const declarator = parentOf(declaration);\n if (declarator?.type === \"VariableDeclarator\" && childNode(declarator, \"id\")?.start === declaration.start) {\n initializer = childNode(declarator, \"init\");\n const parent = parentOf(declarator);\n constant = parent?.type === \"VariableDeclaration\" && parent.kind === \"const\";\n }\n }\n return {\n id: resolvedModuleId(id),\n name,\n start: identifier.start,\n end: identifier.end,\n initializer,\n constant\n };\n}\nfunction importBinding(program, localName) {\n for (const statement of childNodes(program, \"body\")) {\n if (statement.type !== \"ImportDeclaration\") continue;\n const source = childNode(statement, \"source\");\n const sourceValue = source && typeof source.value === \"string\" ? source.value : null;\n if (!sourceValue) continue;\n for (const specifier of childNodes(statement, \"specifiers\")) {\n if (identifierName(childNode(specifier, \"local\")) !== localName) continue;\n if (specifier.type === \"ImportDefaultSpecifier\") {\n return { source: sourceValue, imported: \"default\" };\n }\n if (specifier.type === \"ImportNamespaceSpecifier\") {\n return { source: sourceValue, imported: \"*\" };\n }\n const imported = childNode(specifier, \"imported\");\n const importedName = identifierName(imported) ?? (typeof imported?.value === \"string\" ? imported.value : null);\n return importedName ? { source: sourceValue, imported: importedName } : null;\n }\n }\n return null;\n}\nfunction asStaticValue(node) {\n if (!node) return void 0;\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 elementValue(id, node) {\n const staticValue = asStaticValue(node);\n return staticValue === void 0 ? expressionReference(id, node) : { kind: \"static\", value: staticValue, span: spanOf(id, node) };\n}\nfunction symbolDefinition(definition) {\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}\nfunction componentFromNode(candidate, id, program, imports, node, bailouts) {\n const literal = asStaticValue(node);\n if (typeof literal === \"string\") {\n return {\n kind: \"intrinsic\",\n name: literal,\n span: spanOf(id, node),\n closingSpan: null,\n definition: null,\n provenance: null\n };\n }\n if ((node.type === \"MemberExpression\" || node.type === \"JSXMemberExpression\") && node.computed !== true) {\n const objectName = identifierName(childNode(node, \"object\"));\n const memberName = identifierName(childNode(node, \"property\"));\n const binding2 = objectName ? importBinding(program, objectName) : null;\n if (memberName && binding2?.imported === \"html\") {\n const provenance2 = hostImportProvenance(imports, binding2.source, binding2.imported);\n if (provenance2) {\n return {\n kind: \"binding\",\n name: memberName,\n span: spanOf(id, node),\n closingSpan: null,\n definition: null,\n provenance: provenance2\n };\n }\n }\n }\n const name = identifierName(node);\n if (!name) {\n bailouts.push(\n localBailout(\n \"local/unsupported-element-name\",\n spanOf(id, node),\n `Element target ${node.type} is not a stable identifier or intrinsic tag`\n )\n );\n return null;\n }\n const intrinsic = /^[a-z]/.test(name);\n const binding = intrinsic ? null : importBinding(program, name);\n const provenance = binding ? hostImportProvenance(imports, binding.source, binding.imported) : null;\n const definition = intrinsic ? null : symbolDefinition(candidate.definitionOf(id, name));\n if (!intrinsic && !definition && !provenance) {\n bailouts.push(\n linkedBailout(\n \"linked/unresolved-component-binding\",\n spanOf(id, node),\n `Component binding ${name} has no linked definition`\n )\n );\n }\n return {\n kind: intrinsic ? \"intrinsic\" : \"binding\",\n name,\n span: spanOf(id, node),\n closingSpan: null,\n definition,\n provenance\n };\n}\nfunction jsxComponentNode(opening) {\n return childNode(opening, \"name\");\n}\nfunction jsxEntries(id, element, opening, bailouts) {\n const entries = [];\n for (const attribute of childNodes(opening, \"attributes\")) {\n if (attribute.type === \"JSXSpreadAttribute\") {\n const argument = childNode(attribute, \"argument\");\n if (argument) {\n entries.push({\n kind: \"spread\",\n span: spanOf(id, attribute),\n value: expressionReference(id, argument)\n });\n }\n continue;\n }\n if (attribute.type !== \"JSXAttribute\") continue;\n const nameNode = childNode(attribute, \"name\");\n const name = identifierName(nameNode);\n if (!name) {\n bailouts.push(\n localBailout(\n \"local/unsupported-prop-key\",\n spanOf(id, attribute),\n \"Namespaced JSX attributes are not statically supported\"\n )\n );\n continue;\n }\n const rawValue = childNode(attribute, \"value\");\n let value;\n if (!rawValue) {\n value = { kind: \"static\", value: true, span: spanOf(id, attribute) };\n } else if (rawValue.type === \"JSXExpressionContainer\") {\n const expression = childNode(rawValue, \"expression\");\n if (!expression || expression.type === \"JSXEmptyExpression\") {\n bailouts.push(\n localBailout(\n \"local/unsupported-expression\",\n spanOf(id, rawValue),\n `JSX prop ${name} has no expression`\n )\n );\n continue;\n }\n value = elementValue(id, expression);\n } else {\n value = elementValue(id, rawValue);\n }\n entries.push({ kind: \"prop\", name, span: spanOf(id, attribute), value });\n }\n for (const child of childNodes(element, \"children\")) {\n let value;\n if (child.type === \"JSXText\") {\n if (typeof child.value !== \"string\" || child.value.trim() === \"\") continue;\n value = {\n kind: \"static\",\n value: child.value,\n span: spanOf(id, child)\n };\n } else if (child.type === \"JSXExpressionContainer\") {\n const expression = childNode(child, \"expression\");\n value = !expression || expression.type === \"JSXEmptyExpression\" ? { kind: \"empty\", span: spanOf(id, child) } : elementValue(id, expression);\n } else if (child.type === \"JSXElement\" || child.type === \"JSXFragment\") {\n value = { kind: \"element\", span: spanOf(id, child) };\n } else {\n bailouts.push(\n localBailout(\n \"local/unsupported-child\",\n spanOf(id, child),\n `JSX child ${child.type} cannot be normalized`\n )\n );\n continue;\n }\n entries.push({ kind: \"child\", span: spanOf(id, child), value });\n }\n return entries.sort((left, right) => left.span.start - right.span.start);\n}\nfunction propertyName(property) {\n if (property.computed === true) return null;\n const key = childNode(property, \"key\");\n const name = identifierName(key);\n if (name) return name;\n const literal = asStaticValue(key);\n return typeof literal === \"string\" || typeof literal === \"number\" ? String(literal) : null;\n}\nfunction runtimeChildEntries(id, program, node, bailouts) {\n const rawNodes = node.type === \"ArrayExpression\" ? node.elements : null;\n if (Array.isArray(rawNodes) && rawNodes.some((child) => child === null || !isAstNode(child))) {\n bailouts.push(\n localBailout(\n \"local/unsupported-child\",\n spanOf(id, node),\n \"Sparse compiled children cannot be normalized without changing order\"\n )\n );\n return [];\n }\n const nodes = Array.isArray(rawNodes) ? rawNodes.filter(isAstNode) : [node];\n return nodes.flatMap((child) => {\n if (child.type === \"SpreadElement\") {\n bailouts.push(\n localBailout(\n \"local/unsupported-child\",\n spanOf(id, child),\n \"Spread children cannot be statically ordered\"\n )\n );\n return [];\n }\n if (child.type === \"CallExpression\" && runtimeCall(program, child)) {\n return [\n {\n kind: \"child\",\n span: spanOf(id, child),\n value: { kind: \"element\", span: spanOf(id, child) }\n }\n ];\n }\n return [{ kind: \"child\", span: spanOf(id, child), value: elementValue(id, child) }];\n });\n}\nfunction objectEntries(id, program, object, bailouts) {\n const entries = [];\n for (const property of childNodes(object, \"properties\")) {\n if (property.type === \"SpreadElement\") {\n const argument = childNode(property, \"argument\");\n if (argument) {\n const spread = {\n kind: \"spread\",\n span: spanOf(id, property),\n value: expressionReference(id, argument)\n };\n entries.push(spread);\n }\n continue;\n }\n if (property.type !== \"Property\" && property.type !== \"ObjectProperty\") {\n bailouts.push(\n localBailout(\n \"local/unsupported-prop-key\",\n spanOf(id, property),\n `Runtime props entry ${property.type} is not a data property`\n )\n );\n continue;\n }\n const name = propertyName(property);\n const valueNode = childNode(property, \"value\");\n if (!name || !valueNode) {\n bailouts.push(\n localBailout(\n \"local/unsupported-prop-key\",\n spanOf(id, property),\n \"Computed runtime prop keys are not statically supported\"\n )\n );\n continue;\n }\n if (name === \"children\") {\n entries.push(...runtimeChildEntries(id, program, valueNode, bailouts));\n continue;\n }\n const prop = {\n kind: \"prop\",\n name,\n span: spanOf(id, property),\n value: elementValue(id, valueNode)\n };\n entries.push(prop);\n }\n return entries;\n}\nfunction runtimeCall(program, call) {\n const callee = childNode(call, \"callee\");\n if (!callee) return null;\n const directName = identifierName(callee);\n if (directName) {\n const provenance2 = importBinding(program, directName);\n if (provenance2?.source === \"react/jsx-runtime\" && (provenance2.imported === \"jsx\" || provenance2.imported === \"jsxs\")) {\n return { form: \"jsx-runtime\" };\n }\n if (provenance2?.source === \"react\" && provenance2.imported === \"createElement\") {\n return { form: \"create-element\" };\n }\n }\n if (callee.type !== \"MemberExpression\" || callee.computed === true) return null;\n const objectName = identifierName(childNode(callee, \"object\"));\n const propertyName2 = identifierName(childNode(callee, \"property\"));\n if (propertyName2 !== \"createElement\" || !objectName) return null;\n const provenance = importBinding(program, objectName);\n return provenance?.source === \"react\" && (provenance.imported === \"default\" || provenance.imported === \"*\") ? { form: \"create-element\" } : null;\n}\nfunction normalizeRuntimeElement(candidate, id, program, imports, call, runtime, bailouts) {\n const bailoutStart = bailouts.length;\n const args = childNodes(call, \"arguments\");\n const target = args[0];\n if (!target) {\n bailouts.push(\n localBailout(\n \"local/invalid-element-call\",\n spanOf(id, call),\n `${runtime.form} call has no element target`\n )\n );\n return null;\n }\n const component = componentFromNode(candidate, id, program, imports, target, bailouts);\n if (!component) return null;\n const entries = [];\n const props = args[1];\n if (props && asStaticValue(props) !== null) {\n if (props.type === \"ObjectExpression\") {\n entries.push(...objectEntries(id, program, props, bailouts));\n } else {\n entries.push({\n kind: \"spread\",\n span: spanOf(id, props),\n value: expressionReference(id, props)\n });\n }\n }\n if (runtime.form === \"create-element\") {\n for (const child of args.slice(2)) {\n entries.push(...runtimeChildEntries(id, program, child, bailouts));\n }\n }\n return finalizeElement(\n {\n kind: \"element\",\n form: runtime.form,\n id,\n span: spanOf(id, call),\n propsSpan: props ? spanOf(id, props) : null,\n component\n },\n entries.sort((left, right) => left.span.start - right.span.start),\n bailouts.slice(bailoutStart)\n );\n}\nfunction styledDefinitions(candidate, id, program, imports, bailouts) {\n const definitions = [];\n walkAst(program, (node) => {\n if (node.type !== \"VariableDeclarator\") return;\n const identifier = childNode(node, \"id\");\n const name = identifierName(identifier);\n const call = childNode(node, \"init\");\n if (!name || !identifier || call?.type !== \"CallExpression\") return;\n const callee = childNode(call, \"callee\");\n const factoryName = callee && identifierName(callee);\n if (!factoryName) return;\n const binding = importBinding(program, factoryName);\n if (!binding || binding.imported !== \"styled\") return;\n const factory = hostImportProvenance(imports, binding.source, binding.imported);\n if (!factory) return;\n const definitionBailouts = [];\n const args = childNodes(call, \"arguments\");\n const baseNode = args[0];\n const objectForm = args[1]?.type === \"ObjectExpression\";\n const optionsNode = objectForm ? args[1] : args.length >= 3 ? args[2] : args[1];\n if (!baseNode || !optionsNode) {\n definitionBailouts.push(\n localBailout(\n \"local/unsupported-styled-definition\",\n spanOf(id, call),\n `styled definition ${name} must provide a base and options object`\n )\n );\n bailouts.push(...definitionBailouts);\n return;\n }\n const base = componentFromNode(\n candidate,\n id,\n program,\n imports,\n baseNode,\n definitionBailouts\n );\n if (!base) {\n bailouts.push(...definitionBailouts);\n return;\n }\n const baseClassNode = objectForm ? null : args.length >= 3 ? args[1] : null;\n const staticConfigNode = objectForm && args.length >= 3 ? args[2] : null;\n const baseDefinition = {\n kind: \"styled-definition\",\n id,\n name,\n span: spanOf(id, call),\n definitionSpan: spanOf(id, identifier),\n factory,\n base,\n baseClassName: baseClassNode ? elementValue(id, baseClassNode) : null,\n options: expressionReference(id, optionsNode),\n staticConfig: staticConfigNode ? expressionReference(id, staticConfigNode) : null\n };\n definitions.push(\n definitionBailouts.length === 0 ? { ...baseDefinition, complete: true, bailouts: [] } : {\n ...baseDefinition,\n complete: false,\n bailouts: definitionBailouts\n }\n );\n bailouts.push(...definitionBailouts);\n });\n return definitions.sort((left, right) => left.span.start - right.span.start);\n}\nconst DOM_STYLE_FRONTENDS = /* @__PURE__ */ new Set([\n \"tamagui/dom\",\n \"@tamagui/core/dom\",\n \"@tamagui/tailwind\"\n]);\nconst STYLE_FRONTENDS = /* @__PURE__ */ new Set([\n ...DOM_STYLE_FRONTENDS,\n \"tamagui\",\n \"@tamagui/core\",\n \"@tamagui/web\"\n]);\nfunction domStyleDefinitions(id, program, imports) {\n const definitions = [];\n walkAst(program, (node) => {\n if (node.type !== \"VariableDeclarator\") return;\n const identifier = childNode(node, \"id\");\n const name = identifierName(identifier);\n const call = childNode(node, \"init\");\n if (!name || !identifier || call?.type !== \"CallExpression\") return;\n const callee = childNode(call, \"callee\");\n const factoryName = callee && identifierName(callee);\n if (!factoryName) return;\n const binding = importBinding(program, factoryName);\n if (!binding || binding.imported !== \"style\" || !STYLE_FRONTENDS.has(binding.source)) {\n return;\n }\n const factory = hostImportProvenance(imports, binding.source, binding.imported);\n const value = childNodes(call, \"arguments\")[0];\n if (!factory || !value) return;\n definitions.push({\n kind: \"dom-style-definition\",\n id,\n name,\n span: spanOf(id, call),\n definitionSpan: spanOf(id, identifier),\n factory,\n value: expressionReference(id, value)\n });\n });\n return definitions.sort((left, right) => left.span.start - right.span.start);\n}\nfunction domStyleArgument(candidate, id, program, node) {\n let call = node;\n if (node.type === \"Identifier\") {\n const name = identifierName(node);\n const definition = name ? candidate.definitionOf(id, name) : null;\n if (!definition?.constant || !definition.initializer) return null;\n call = definition.initializer;\n }\n if (call.type !== \"CallExpression\") return null;\n const callee = childNode(call, \"callee\");\n const factoryName = callee && identifierName(callee);\n if (!factoryName) return null;\n const binding = importBinding(program, factoryName);\n if (!binding || binding.imported !== \"style\" || !STYLE_FRONTENDS.has(binding.source)) {\n return null;\n }\n return childNodes(call, \"arguments\")[0] ?? null;\n}\nfunction domStyleProgram(candidate, id, program, node) {\n if (node.type !== \"ArrayExpression\" || !Array.isArray(node.elements)) {\n const argument = domStyleArgument(candidate, id, program, node);\n return argument ? {\n kind: \"dom-style\",\n span: spanOf(id, node),\n items: [{ condition: null, value: expressionReference(id, argument) }]\n } : null;\n }\n const items = [];\n for (const rawItem of node.elements) {\n if (!isAstNode(rawItem)) return null;\n let item = rawItem;\n let condition = null;\n if (item.type === \"LogicalExpression\" && item.operator === \"&&\") {\n const left = childNode(item, \"left\");\n const right = childNode(item, \"right\");\n if (!left || !right) return null;\n condition = expressionReference(id, left);\n item = right;\n }\n const argument = domStyleArgument(candidate, id, program, item);\n if (!argument) {\n const staticValue = asStaticValue(item);\n if (staticValue === false || staticValue === null) continue;\n return null;\n }\n items.push({ condition, value: expressionReference(id, argument) });\n }\n return { kind: \"dom-style\", span: spanOf(id, node), items };\n}\nfunction normalizeElements(candidate, rawId, imports = []) {\n const id = resolvedModuleId(rawId);\n const program = candidate.programOf(id);\n const elements = [];\n const bailouts = [];\n walkAst(program, (node) => {\n if (node.type === \"JSXElement\") {\n const bailoutStart = bailouts.length;\n const opening = childNode(node, \"openingElement\");\n const target = opening && jsxComponentNode(opening);\n if (!opening || !target) return;\n const component = componentFromNode(\n candidate,\n id,\n program,\n imports,\n target,\n bailouts\n );\n if (!component) return;\n const closingElement = childNode(node, \"closingElement\");\n const closingName = closingElement && childNode(closingElement, \"name\");\n if (closingName) component.closingSpan = spanOf(id, closingName);\n const entries = jsxEntries(id, node, opening, bailouts);\n for (const entry of entries) {\n if (entry.kind !== \"prop\" || entry.name !== \"style\") continue;\n const raw = entry.value.kind === \"expression\" ? nodeAtSpan(program, entry.value.start, entry.value.end) : null;\n const styleProgram = raw && domStyleProgram(candidate, id, program, raw);\n const argument = raw && domStyleArgument(candidate, id, program, raw);\n if (styleProgram) entry.value = styleProgram;\n else if (argument) entry.value = expressionReference(id, argument);\n }\n elements.push(\n finalizeElement(\n {\n kind: \"element\",\n form: \"jsx\",\n id,\n span: spanOf(id, node),\n propsSpan: spanOf(id, opening),\n component\n },\n entries,\n bailouts.slice(bailoutStart)\n )\n );\n return;\n }\n if (node.type !== \"CallExpression\") return;\n const runtime = runtimeCall(program, node);\n if (!runtime) return;\n const element = normalizeRuntimeElement(\n candidate,\n id,\n program,\n imports,\n node,\n runtime,\n bailouts\n );\n if (element) {\n const entries = element.complete ? element.entries : element.bailedEntries;\n for (const entry of entries) {\n if (entry.kind !== \"prop\" || entry.name !== \"style\") continue;\n const raw = entry.value.kind === \"expression\" ? nodeAtSpan(program, entry.value.start, entry.value.end) : null;\n const styleProgram = raw && domStyleProgram(candidate, id, program, raw);\n const argument = raw && domStyleArgument(candidate, id, program, raw);\n if (styleProgram) entry.value = styleProgram;\n else if (argument) entry.value = expressionReference(id, argument);\n }\n elements.push(element);\n }\n });\n return {\n elements: elements.sort((left, right) => left.span.start - right.span.start),\n styledDefinitions: styledDefinitions(candidate, id, program, imports, bailouts),\n domStyleDefinitions: domStyleDefinitions(id, program, imports),\n bailouts: bailouts.sort((left, right) => left.span.start - right.span.start)\n };\n}\nfunction nodeAtSpan(program, start, end) {\n return findAstNode(program, (node) => node.start === start && node.end === end, {\n start,\n end\n });\n}\nfunction asAstNode(value, label) {\n if (!isAstNode(value)) throw new Error(`${label} is not an AST node`);\n return value;\n}\nexport {\n asAstNode,\n definitionFromDeclaration,\n nodeAtSpan,\n normalizeElements\n};\n//# sourceMappingURL=normalize.js.map\n"],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { GenMapping, addSegment, setSourceContent, toEncodedMap } from "@jridgewell/gen-mapping";
|
|
2
|
+
import MagicString from "magic-string";
|
|
3
|
+
import { contentHash } from "./hash.mjs";
|
|
4
|
+
|
|
5
|
+
function compareEdits(left, right) {
|
|
6
|
+
return left.start - right.start || left.end - right.end || left.index - right.index;
|
|
7
|
+
}
|
|
8
|
+
function sourceContentHash(source) {
|
|
9
|
+
return contentHash(source);
|
|
10
|
+
}
|
|
11
|
+
function validateSourceEdits(source, edits) {
|
|
12
|
+
const sorted = edits.map((edit, index) => ({
|
|
13
|
+
...edit,
|
|
14
|
+
index
|
|
15
|
+
})).sort(compareEdits);
|
|
16
|
+
let previousEnd = 0;
|
|
17
|
+
for (const edit of sorted) {
|
|
18
|
+
if (!Number.isInteger(edit.start) || !Number.isInteger(edit.end) || edit.start < 0 || edit.end < edit.start || edit.end > source.length) {
|
|
19
|
+
throw new Error(`Invalid UTF-16 source edit [${edit.start}, ${edit.end})`);
|
|
20
|
+
}
|
|
21
|
+
if (edit.start < previousEnd) {
|
|
22
|
+
throw new Error(`Overlapping UTF-16 source edit at ${edit.start}`);
|
|
23
|
+
}
|
|
24
|
+
previousEnd = Math.max(previousEnd, edit.end);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function sourcePositions(source) {
|
|
28
|
+
const positions = new Array(source.length + 1);
|
|
29
|
+
let line = 0;
|
|
30
|
+
let column = 0;
|
|
31
|
+
for (let index = 0; index <= source.length; index++) {
|
|
32
|
+
positions[index] = {
|
|
33
|
+
line,
|
|
34
|
+
column
|
|
35
|
+
};
|
|
36
|
+
if (index === source.length) break;
|
|
37
|
+
if (source.charCodeAt(index) === 10) {
|
|
38
|
+
line++;
|
|
39
|
+
column = 0;
|
|
40
|
+
} else {
|
|
41
|
+
column++;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return positions;
|
|
45
|
+
}
|
|
46
|
+
function mappedSourceMap(source, id, edits) {
|
|
47
|
+
const map = new GenMapping();
|
|
48
|
+
setSourceContent(map, id, source);
|
|
49
|
+
const positions = sourcePositions(source);
|
|
50
|
+
let generatedLine = 0;
|
|
51
|
+
let generatedColumn = 0;
|
|
52
|
+
let sourceCursor = 0;
|
|
53
|
+
const emit = (content, sourceStart, sourceEnd) => {
|
|
54
|
+
const available = Math.max(1, sourceEnd - sourceStart);
|
|
55
|
+
for (let offset = 0; offset < content.length; offset++) {
|
|
56
|
+
const originalIndex = Math.min(sourceStart + offset, sourceStart + available - 1);
|
|
57
|
+
const original = positions[originalIndex];
|
|
58
|
+
addSegment(map, generatedLine, generatedColumn, id, original.line, original.column);
|
|
59
|
+
if (content.charCodeAt(offset) === 10) {
|
|
60
|
+
generatedLine++;
|
|
61
|
+
generatedColumn = 0;
|
|
62
|
+
} else {
|
|
63
|
+
generatedColumn++;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
for (const edit of edits) {
|
|
68
|
+
emit(source.slice(sourceCursor, edit.start), sourceCursor, edit.start);
|
|
69
|
+
if (edit.origin.id !== id) {
|
|
70
|
+
throw new Error(`Source edit for ${id} must use a local mapping origin`);
|
|
71
|
+
}
|
|
72
|
+
emit(edit.content, edit.origin.start, edit.start === edit.end ? edit.origin.start + 1 : edit.origin.end);
|
|
73
|
+
sourceCursor = edit.end;
|
|
74
|
+
}
|
|
75
|
+
emit(source.slice(sourceCursor), sourceCursor, source.length);
|
|
76
|
+
const encoded = toEncodedMap(map);
|
|
77
|
+
return {
|
|
78
|
+
version: 3,
|
|
79
|
+
file: encoded.file ?? void 0,
|
|
80
|
+
names: encoded.names,
|
|
81
|
+
sources: encoded.sources,
|
|
82
|
+
sourcesContent: encoded.sourcesContent ?? [source],
|
|
83
|
+
mappings: encoded.mappings
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function applyLoweredModule(source, id, plan) {
|
|
87
|
+
if (plan.id !== id) {
|
|
88
|
+
throw new Error(`Lowered module plan ${plan.id} cannot be applied to ${id}`);
|
|
89
|
+
}
|
|
90
|
+
if (plan.sourceHash !== sourceContentHash(source)) {
|
|
91
|
+
throw new Error(`Lowered module plan for ${id} does not match the supplied source`);
|
|
92
|
+
}
|
|
93
|
+
if (plan.edits.length === 0) return {
|
|
94
|
+
changed: false,
|
|
95
|
+
code: source,
|
|
96
|
+
map: null
|
|
97
|
+
};
|
|
98
|
+
validateSourceEdits(source, plan.edits);
|
|
99
|
+
const output = new MagicString(source);
|
|
100
|
+
const sorted = plan.edits.map((edit, index) => ({
|
|
101
|
+
...edit,
|
|
102
|
+
index
|
|
103
|
+
})).sort(compareEdits);
|
|
104
|
+
for (const edit of sorted) {
|
|
105
|
+
if (edit.start === edit.end) {
|
|
106
|
+
output.appendLeft(edit.start, edit.content);
|
|
107
|
+
} else {
|
|
108
|
+
output.overwrite(edit.start, edit.end, edit.content);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
changed: true,
|
|
113
|
+
code: output.toString(),
|
|
114
|
+
map: mappedSourceMap(source, id, sorted)
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export { applyLoweredModule, sourceContentHash, validateSourceEdits };
|
|
119
|
+
//# sourceMappingURL=output.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","names":[],"sources":["esm/output.js"],"sourcesContent":["import {\n GenMapping,\n addSegment,\n setSourceContent,\n toEncodedMap\n} from \"@jridgewell/gen-mapping\";\nimport MagicString from \"magic-string\";\nimport { contentHash } from \"./hash\";\nfunction compareEdits(left, right) {\n return left.start - right.start || left.end - right.end || left.index - right.index;\n}\nfunction sourceContentHash(source) {\n return contentHash(source);\n}\nfunction validateSourceEdits(source, edits) {\n const sorted = edits.map((edit, index) => ({ ...edit, index })).sort(compareEdits);\n let previousEnd = 0;\n for (const edit of sorted) {\n if (!Number.isInteger(edit.start) || !Number.isInteger(edit.end) || edit.start < 0 || edit.end < edit.start || edit.end > source.length) {\n throw new Error(`Invalid UTF-16 source edit [${edit.start}, ${edit.end})`);\n }\n if (edit.start < previousEnd) {\n throw new Error(`Overlapping UTF-16 source edit at ${edit.start}`);\n }\n previousEnd = Math.max(previousEnd, edit.end);\n }\n}\nfunction sourcePositions(source) {\n const positions = new Array(source.length + 1);\n let line = 0;\n let column = 0;\n for (let index = 0; index <= source.length; index++) {\n positions[index] = { line, column };\n if (index === source.length) break;\n if (source.charCodeAt(index) === 10) {\n line++;\n column = 0;\n } else {\n column++;\n }\n }\n return positions;\n}\nfunction mappedSourceMap(source, id, edits) {\n const map = new GenMapping();\n setSourceContent(map, id, source);\n const positions = sourcePositions(source);\n let generatedLine = 0;\n let generatedColumn = 0;\n let sourceCursor = 0;\n const emit = (content, sourceStart, sourceEnd) => {\n const available = Math.max(1, sourceEnd - sourceStart);\n for (let offset = 0; offset < content.length; offset++) {\n const originalIndex = Math.min(sourceStart + offset, sourceStart + available - 1);\n const original = positions[originalIndex];\n addSegment(map, generatedLine, generatedColumn, id, original.line, original.column);\n if (content.charCodeAt(offset) === 10) {\n generatedLine++;\n generatedColumn = 0;\n } else {\n generatedColumn++;\n }\n }\n };\n for (const edit of edits) {\n emit(source.slice(sourceCursor, edit.start), sourceCursor, edit.start);\n if (edit.origin.id !== id) {\n throw new Error(`Source edit for ${id} must use a local mapping origin`);\n }\n emit(\n edit.content,\n edit.origin.start,\n edit.start === edit.end ? edit.origin.start + 1 : edit.origin.end\n );\n sourceCursor = edit.end;\n }\n emit(source.slice(sourceCursor), sourceCursor, source.length);\n const encoded = toEncodedMap(map);\n return {\n version: 3,\n file: encoded.file ?? void 0,\n names: encoded.names,\n sources: encoded.sources,\n sourcesContent: encoded.sourcesContent ?? [source],\n mappings: encoded.mappings\n };\n}\nfunction applyLoweredModule(source, id, plan) {\n if (plan.id !== id) {\n throw new Error(`Lowered module plan ${plan.id} cannot be applied to ${id}`);\n }\n if (plan.sourceHash !== sourceContentHash(source)) {\n throw new Error(`Lowered module plan for ${id} does not match the supplied source`);\n }\n if (plan.edits.length === 0) return { changed: false, code: source, map: null };\n validateSourceEdits(source, plan.edits);\n const output = new MagicString(source);\n const sorted = plan.edits.map((edit, index) => ({ ...edit, index })).sort(compareEdits);\n for (const edit of sorted) {\n if (edit.start === edit.end) {\n output.appendLeft(edit.start, edit.content);\n } else {\n output.overwrite(edit.start, edit.end, edit.content);\n }\n }\n return {\n changed: true,\n code: output.toString(),\n map: mappedSourceMap(source, id, sorted)\n };\n}\nexport {\n applyLoweredModule,\n sourceContentHash,\n validateSourceEdits\n};\n//# sourceMappingURL=output.js.map\n"],"mappings":"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"}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { readFileSync, statSync } from "node:fs";
|
|
3
|
+
import { mkdir, readFile, readdir, rename, stat, unlink, writeFile } from "node:fs/promises";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { contentHash, stableStringify } from "./hash.mjs";
|
|
6
|
+
import { LOWERED_MODULE_PLAN_VERSION } from "./lower.mjs";
|
|
7
|
+
import { moduleContentHash } from "./graph.mjs";
|
|
8
|
+
|
|
9
|
+
const PLAN_CACHE_SCHEMA_VERSION = 1;
|
|
10
|
+
const PLAN_CACHE_MAX_ENTRIES = 2e4;
|
|
11
|
+
function tamaguiCacheRoot(projectRoot) {
|
|
12
|
+
return join(projectRoot, "node_modules", ".cache", "tamagui");
|
|
13
|
+
}
|
|
14
|
+
function defaultPlanCacheRoot(projectRoot, target) {
|
|
15
|
+
return join(tamaguiCacheRoot(projectRoot), "plans", target);
|
|
16
|
+
}
|
|
17
|
+
function moduleClosureNode(input, options) {
|
|
18
|
+
return {
|
|
19
|
+
contentHash: moduleContentHash(input),
|
|
20
|
+
dependencies: input.imports.filter(({ external }) => options?.includeExternal || !external).map(({ resolvedId }) => resolvedId)
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function createExternalClosureLookup() {
|
|
24
|
+
const memo = /* @__PURE__ */ new Map();
|
|
25
|
+
return (id) => {
|
|
26
|
+
const file = id.split(/[?#]/, 1)[0];
|
|
27
|
+
if (!file.startsWith("/") && !/^[A-Za-z]:[\\/]/.test(file)) {
|
|
28
|
+
return {
|
|
29
|
+
contentHash: "external",
|
|
30
|
+
dependencies: []
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const stat2 = statSync(file);
|
|
35
|
+
const cached = memo.get(file);
|
|
36
|
+
if (cached && cached.size === stat2.size && cached.mtimeMs === stat2.mtimeMs) {
|
|
37
|
+
return {
|
|
38
|
+
contentHash: cached.contentHash,
|
|
39
|
+
dependencies: []
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const hash = createHash("sha256").update(readFileSync(file)).digest("hex");
|
|
43
|
+
memo.set(file, {
|
|
44
|
+
size: stat2.size,
|
|
45
|
+
mtimeMs: stat2.mtimeMs,
|
|
46
|
+
contentHash: hash
|
|
47
|
+
});
|
|
48
|
+
return {
|
|
49
|
+
contentHash: hash,
|
|
50
|
+
dependencies: []
|
|
51
|
+
};
|
|
52
|
+
} catch {
|
|
53
|
+
return {
|
|
54
|
+
contentHash: "external",
|
|
55
|
+
dependencies: []
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function moduleClosureDigest(id, lookup, memo) {
|
|
61
|
+
const cached = memo?.get(id);
|
|
62
|
+
if (cached !== void 0) return cached;
|
|
63
|
+
const reached = /* @__PURE__ */ new Map();
|
|
64
|
+
const queue = [id];
|
|
65
|
+
let complete = true;
|
|
66
|
+
while (queue.length) {
|
|
67
|
+
const current = queue.pop();
|
|
68
|
+
if (reached.has(current)) continue;
|
|
69
|
+
const node = lookup(current);
|
|
70
|
+
if (!node) {
|
|
71
|
+
complete = false;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
reached.set(current, node.contentHash);
|
|
75
|
+
for (const dependency of node.dependencies) queue.push(dependency);
|
|
76
|
+
}
|
|
77
|
+
const digest = complete ? contentHash([...reached].sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([current, hash]) => `${current}\0${hash}`).join("\0")) : null;
|
|
78
|
+
memo?.set(id, digest);
|
|
79
|
+
return digest;
|
|
80
|
+
}
|
|
81
|
+
function planCacheKey(identity, id, closureDigest) {
|
|
82
|
+
return contentHash(stableStringify({
|
|
83
|
+
schema: 1,
|
|
84
|
+
plan: LOWERED_MODULE_PLAN_VERSION,
|
|
85
|
+
stamp: identity.stamp,
|
|
86
|
+
target: identity.target,
|
|
87
|
+
structuralPassHash: identity.structuralPassHash,
|
|
88
|
+
id,
|
|
89
|
+
closureDigest
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
var JsonFileCache = class {
|
|
93
|
+
constructor(root, schemaVersion, maxEntries = PLAN_CACHE_MAX_ENTRIES) {
|
|
94
|
+
this.root = root;
|
|
95
|
+
this.schemaVersion = schemaVersion;
|
|
96
|
+
this.maxEntries = maxEntries;
|
|
97
|
+
}
|
|
98
|
+
root;
|
|
99
|
+
schemaVersion;
|
|
100
|
+
maxEntries;
|
|
101
|
+
#hits = 0;
|
|
102
|
+
#misses = 0;
|
|
103
|
+
#writes = 0;
|
|
104
|
+
#writesSincePrune = 0;
|
|
105
|
+
#prunedThisProcess = false;
|
|
106
|
+
#created = /* @__PURE__ */ new Set();
|
|
107
|
+
get stats() {
|
|
108
|
+
return {
|
|
109
|
+
hits: this.#hits,
|
|
110
|
+
misses: this.#misses,
|
|
111
|
+
writes: this.#writes
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
resetStats() {
|
|
115
|
+
this.#hits = 0;
|
|
116
|
+
this.#misses = 0;
|
|
117
|
+
this.#writes = 0;
|
|
118
|
+
}
|
|
119
|
+
#path(key) {
|
|
120
|
+
return join(this.root, `v${this.schemaVersion}`, key.slice(0, 2), `${key}.json`);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Null on anything short of an entry `validate` fully accepts. A miss
|
|
124
|
+
* recompiles; nothing here repairs or partially trusts an entry, and a later
|
|
125
|
+
* successful compile overwrites the bad file.
|
|
126
|
+
*/
|
|
127
|
+
async read(key, validate) {
|
|
128
|
+
let parsed;
|
|
129
|
+
try {
|
|
130
|
+
parsed = JSON.parse(await readFile(this.#path(key), "utf8"));
|
|
131
|
+
} catch {
|
|
132
|
+
this.#misses++;
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
const entry = validate(parsed);
|
|
136
|
+
if (entry === null) {
|
|
137
|
+
this.#misses++;
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
this.#hits++;
|
|
141
|
+
return entry;
|
|
142
|
+
}
|
|
143
|
+
async write(key, value) {
|
|
144
|
+
const path = this.#path(key);
|
|
145
|
+
const directory = dirname(path);
|
|
146
|
+
if (!this.#created.has(directory)) {
|
|
147
|
+
await mkdir(directory, { recursive: true });
|
|
148
|
+
this.#created.add(directory);
|
|
149
|
+
}
|
|
150
|
+
const temporaryPath = `${path}.${process.pid}-${randomBytes(6).toString("hex")}.tmp`;
|
|
151
|
+
await writeFile(temporaryPath, `${stableStringify(value)}
|
|
152
|
+
`, "utf8");
|
|
153
|
+
await rename(temporaryPath, path);
|
|
154
|
+
this.#writes++;
|
|
155
|
+
this.#writesSincePrune++;
|
|
156
|
+
const batch = Math.max(1, Math.floor(this.maxEntries / 4));
|
|
157
|
+
if (!this.#prunedThisProcess || this.#writesSincePrune >= batch) {
|
|
158
|
+
this.#prunedThisProcess = true;
|
|
159
|
+
this.#writesSincePrune = 0;
|
|
160
|
+
await this.#prune();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Drops the oldest entries once the store exceeds its cap, oldest by the later
|
|
165
|
+
* of read and write time so an entry a build keeps hitting is not treated as
|
|
166
|
+
* dead on filesystems that maintain access times.
|
|
167
|
+
*/
|
|
168
|
+
async #prune() {
|
|
169
|
+
const versionRoot = join(this.root, `v${this.schemaVersion}`);
|
|
170
|
+
let shards;
|
|
171
|
+
try {
|
|
172
|
+
shards = await readdir(versionRoot);
|
|
173
|
+
} catch {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const paths = [];
|
|
177
|
+
for (const shard of shards) {
|
|
178
|
+
const directory = join(versionRoot, shard);
|
|
179
|
+
let files;
|
|
180
|
+
try {
|
|
181
|
+
files = await readdir(directory);
|
|
182
|
+
} catch {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
for (const file of files) {
|
|
186
|
+
if (file.endsWith(".json")) paths.push(join(directory, file));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (paths.length <= this.maxEntries) return;
|
|
190
|
+
const entries = [];
|
|
191
|
+
for (const path of paths) {
|
|
192
|
+
try {
|
|
193
|
+
const stats = await stat(path);
|
|
194
|
+
entries.push({
|
|
195
|
+
path,
|
|
196
|
+
usedAt: Math.max(stats.atimeMs, stats.mtimeMs)
|
|
197
|
+
});
|
|
198
|
+
} catch {}
|
|
199
|
+
}
|
|
200
|
+
entries.sort((left, right) => left.usedAt - right.usedAt);
|
|
201
|
+
for (const entry of entries.slice(0, Math.max(0, entries.length - this.maxEntries))) {
|
|
202
|
+
await unlink(entry.path).catch(() => {});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
var ModulePlanCache = class {
|
|
207
|
+
constructor(root) {
|
|
208
|
+
this.root = root;
|
|
209
|
+
this.#files = new JsonFileCache(root, 1);
|
|
210
|
+
}
|
|
211
|
+
root;
|
|
212
|
+
#files;
|
|
213
|
+
get stats() {
|
|
214
|
+
return this.#files.stats;
|
|
215
|
+
}
|
|
216
|
+
resetStats() {
|
|
217
|
+
this.#files.resetStats();
|
|
218
|
+
}
|
|
219
|
+
read(key, id, closureDigest) {
|
|
220
|
+
return this.#files.read(key, (value) => {
|
|
221
|
+
const entry = value;
|
|
222
|
+
const plan = entry?.plan;
|
|
223
|
+
return entry?.schemaVersion === 1 && entry.moduleId === id && entry.closureDigest === closureDigest && plan && plan.version === LOWERED_MODULE_PLAN_VERSION && plan.id === id && typeof plan.sourceHash === "string" && typeof plan.css === "string" && Array.isArray(plan.edits) && Array.isArray(plan.diagnostics) && Array.isArray(plan.dependencies) && !!plan.stats ? entry : null;
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
write(key, entry) {
|
|
227
|
+
return this.#files.write(key, entry);
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
export { JsonFileCache, ModulePlanCache, PLAN_CACHE_MAX_ENTRIES, PLAN_CACHE_SCHEMA_VERSION, createExternalClosureLookup, defaultPlanCacheRoot, moduleClosureDigest, moduleClosureNode, planCacheKey, tamaguiCacheRoot };
|
|
232
|
+
//# sourceMappingURL=planCache.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"planCache.js","names":["#hits","#misses","#writes","#path","#created","#writesSincePrune","#prunedThisProcess","#prune","#files"],"sources":["esm/planCache.js"],"sourcesContent":["import { createHash, randomBytes } from \"node:crypto\";\nimport { readFileSync, statSync } from \"node:fs\";\nimport {\n mkdir,\n readdir,\n readFile,\n rename,\n stat,\n unlink,\n writeFile\n} from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { contentHash, stableStringify } from \"./hash\";\nimport { LOWERED_MODULE_PLAN_VERSION } from \"./lower\";\nimport { moduleContentHash } from \"./graph\";\nconst PLAN_CACHE_SCHEMA_VERSION = 1;\nconst PLAN_CACHE_MAX_ENTRIES = 2e4;\nfunction tamaguiCacheRoot(projectRoot) {\n return join(projectRoot, \"node_modules\", \".cache\", \"tamagui\");\n}\nfunction defaultPlanCacheRoot(projectRoot, target) {\n return join(tamaguiCacheRoot(projectRoot), \"plans\", target);\n}\nfunction moduleClosureNode(input, options) {\n return {\n contentHash: moduleContentHash(input),\n dependencies: input.imports.filter(({ external }) => options?.includeExternal || !external).map(({ resolvedId }) => resolvedId)\n };\n}\nfunction createExternalClosureLookup() {\n const memo = /* @__PURE__ */ new Map();\n return (id) => {\n const file = id.split(/[?#]/, 1)[0];\n if (!file.startsWith(\"/\") && !/^[A-Za-z]:[\\\\/]/.test(file)) {\n return { contentHash: \"external\", dependencies: [] };\n }\n try {\n const stat2 = statSync(file);\n const cached = memo.get(file);\n if (cached && cached.size === stat2.size && cached.mtimeMs === stat2.mtimeMs) {\n return { contentHash: cached.contentHash, dependencies: [] };\n }\n const hash = createHash(\"sha256\").update(readFileSync(file)).digest(\"hex\");\n memo.set(file, { size: stat2.size, mtimeMs: stat2.mtimeMs, contentHash: hash });\n return { contentHash: hash, dependencies: [] };\n } catch {\n return { contentHash: \"external\", dependencies: [] };\n }\n };\n}\nfunction moduleClosureDigest(id, lookup, memo) {\n const cached = memo?.get(id);\n if (cached !== void 0) return cached;\n const reached = /* @__PURE__ */ new Map();\n const queue = [id];\n let complete = true;\n while (queue.length) {\n const current = queue.pop();\n if (reached.has(current)) continue;\n const node = lookup(current);\n if (!node) {\n complete = false;\n break;\n }\n reached.set(current, node.contentHash);\n for (const dependency of node.dependencies) queue.push(dependency);\n }\n const digest = complete ? contentHash(\n [...reached].sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0).map(([current, hash]) => `${current}\\0${hash}`).join(\"\\0\")\n ) : null;\n memo?.set(id, digest);\n return digest;\n}\nfunction planCacheKey(identity, id, closureDigest) {\n return contentHash(\n stableStringify({\n schema: PLAN_CACHE_SCHEMA_VERSION,\n plan: LOWERED_MODULE_PLAN_VERSION,\n stamp: identity.stamp,\n target: identity.target,\n structuralPassHash: identity.structuralPassHash,\n id,\n closureDigest\n })\n );\n}\nclass JsonFileCache {\n constructor(root, schemaVersion, maxEntries = PLAN_CACHE_MAX_ENTRIES) {\n this.root = root;\n this.schemaVersion = schemaVersion;\n this.maxEntries = maxEntries;\n }\n root;\n schemaVersion;\n maxEntries;\n #hits = 0;\n #misses = 0;\n #writes = 0;\n #writesSincePrune = 0;\n #prunedThisProcess = false;\n #created = /* @__PURE__ */ new Set();\n get stats() {\n return { hits: this.#hits, misses: this.#misses, writes: this.#writes };\n }\n resetStats() {\n this.#hits = 0;\n this.#misses = 0;\n this.#writes = 0;\n }\n #path(key) {\n return join(this.root, `v${this.schemaVersion}`, key.slice(0, 2), `${key}.json`);\n }\n /**\n * Null on anything short of an entry `validate` fully accepts. A miss\n * recompiles; nothing here repairs or partially trusts an entry, and a later\n * successful compile overwrites the bad file.\n */\n async read(key, validate) {\n let parsed;\n try {\n parsed = JSON.parse(await readFile(this.#path(key), \"utf8\"));\n } catch {\n this.#misses++;\n return null;\n }\n const entry = validate(parsed);\n if (entry === null) {\n this.#misses++;\n return null;\n }\n this.#hits++;\n return entry;\n }\n async write(key, value) {\n const path = this.#path(key);\n const directory = dirname(path);\n if (!this.#created.has(directory)) {\n await mkdir(directory, { recursive: true });\n this.#created.add(directory);\n }\n const temporaryPath = `${path}.${process.pid}-${randomBytes(6).toString(\"hex\")}.tmp`;\n await writeFile(temporaryPath, `${stableStringify(value)}\n`, \"utf8\");\n await rename(temporaryPath, path);\n this.#writes++;\n this.#writesSincePrune++;\n const batch = Math.max(1, Math.floor(this.maxEntries / 4));\n if (!this.#prunedThisProcess || this.#writesSincePrune >= batch) {\n this.#prunedThisProcess = true;\n this.#writesSincePrune = 0;\n await this.#prune();\n }\n }\n /**\n * Drops the oldest entries once the store exceeds its cap, oldest by the later\n * of read and write time so an entry a build keeps hitting is not treated as\n * dead on filesystems that maintain access times.\n */\n async #prune() {\n const versionRoot = join(this.root, `v${this.schemaVersion}`);\n let shards;\n try {\n shards = await readdir(versionRoot);\n } catch {\n return;\n }\n const paths = [];\n for (const shard of shards) {\n const directory = join(versionRoot, shard);\n let files;\n try {\n files = await readdir(directory);\n } catch {\n continue;\n }\n for (const file of files) {\n if (file.endsWith(\".json\")) paths.push(join(directory, file));\n }\n }\n if (paths.length <= this.maxEntries) return;\n const entries = [];\n for (const path of paths) {\n try {\n const stats = await stat(path);\n entries.push({ path, usedAt: Math.max(stats.atimeMs, stats.mtimeMs) });\n } catch {\n }\n }\n entries.sort((left, right) => left.usedAt - right.usedAt);\n for (const entry of entries.slice(0, Math.max(0, entries.length - this.maxEntries))) {\n await unlink(entry.path).catch(() => {\n });\n }\n }\n}\nclass ModulePlanCache {\n constructor(root) {\n this.root = root;\n this.#files = new JsonFileCache(root, PLAN_CACHE_SCHEMA_VERSION);\n }\n root;\n #files;\n get stats() {\n return this.#files.stats;\n }\n resetStats() {\n this.#files.resetStats();\n }\n read(key, id, closureDigest) {\n return this.#files.read(key, (value) => {\n const entry = value;\n const plan = entry?.plan;\n return entry?.schemaVersion === PLAN_CACHE_SCHEMA_VERSION && entry.moduleId === id && entry.closureDigest === closureDigest && plan && plan.version === LOWERED_MODULE_PLAN_VERSION && plan.id === id && typeof plan.sourceHash === \"string\" && typeof plan.css === \"string\" && Array.isArray(plan.edits) && Array.isArray(plan.diagnostics) && Array.isArray(plan.dependencies) && !!plan.stats ? entry : null;\n });\n }\n write(key, entry) {\n return this.#files.write(key, entry);\n }\n}\nexport {\n JsonFileCache,\n ModulePlanCache,\n PLAN_CACHE_MAX_ENTRIES,\n PLAN_CACHE_SCHEMA_VERSION,\n createExternalClosureLookup,\n defaultPlanCacheRoot,\n moduleClosureDigest,\n moduleClosureNode,\n planCacheKey,\n tamaguiCacheRoot\n};\n//# sourceMappingURL=planCache.js.map\n"],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { ProjectGraph } from "./graph.mjs";
|
|
2
|
+
import { lowerModule } from "./lower.mjs";
|
|
3
|
+
import { materializeModule } from "./materialize.mjs";
|
|
4
|
+
import { applyLoweredModule } from "./output.mjs";
|
|
5
|
+
import { PLAN_CACHE_SCHEMA_VERSION, createExternalClosureLookup, moduleClosureDigest, planCacheKey } from "./planCache.mjs";
|
|
6
|
+
import { yukuFactory } from "./yuku.mjs";
|
|
7
|
+
|
|
8
|
+
function compareIds(left, right) {
|
|
9
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
10
|
+
}
|
|
11
|
+
var CompilerSession = class {
|
|
12
|
+
#graph = new ProjectGraph(yukuFactory, { modules: [] });
|
|
13
|
+
#externalClosure = createExternalClosureLookup();
|
|
14
|
+
#queue = Promise.resolve();
|
|
15
|
+
compile(input) {
|
|
16
|
+
const operation = this.#queue.then(() => this.#compile(input));
|
|
17
|
+
this.#queue = operation.catch(() => void 0);
|
|
18
|
+
return operation;
|
|
19
|
+
}
|
|
20
|
+
update(module) {
|
|
21
|
+
return this.#enqueue(() => this.#graph.updateModule(module).invalidatedIds);
|
|
22
|
+
}
|
|
23
|
+
has(id) {
|
|
24
|
+
return this.#graph.contentHash(id) !== null;
|
|
25
|
+
}
|
|
26
|
+
dependentsOf(id) {
|
|
27
|
+
return this.#graph.dependentsOf(id);
|
|
28
|
+
}
|
|
29
|
+
remove(id) {
|
|
30
|
+
return this.#enqueue(() => this.#graph.removeModule(id));
|
|
31
|
+
}
|
|
32
|
+
parseCount(id) {
|
|
33
|
+
return this.#graph.parseCount(id);
|
|
34
|
+
}
|
|
35
|
+
#enqueue(operation) {
|
|
36
|
+
const queued = this.#queue.then(operation);
|
|
37
|
+
this.#queue = queued.catch(() => void 0);
|
|
38
|
+
return queued;
|
|
39
|
+
}
|
|
40
|
+
async #compile({ module, adapter, structuralPass }) {
|
|
41
|
+
const invalidated = /* @__PURE__ */ new Set();
|
|
42
|
+
await this.#install(module, adapter, /* @__PURE__ */ new Set(), invalidated);
|
|
43
|
+
const graph = this.#graph;
|
|
44
|
+
const cache = adapter.planCache?.stamp ? adapter.planCache : null;
|
|
45
|
+
const closureDigest = cache ? moduleClosureDigest(module.id, (id) => {
|
|
46
|
+
const hash = graph.contentHash(id);
|
|
47
|
+
if (hash) {
|
|
48
|
+
return {
|
|
49
|
+
contentHash: hash,
|
|
50
|
+
dependencies: [...graph.dependenciesOf(id), ...graph.externalImportsOf(id)]
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return this.#externalClosure(id);
|
|
54
|
+
}) : null;
|
|
55
|
+
const entry = cache && closureDigest ? {
|
|
56
|
+
store: cache.store,
|
|
57
|
+
digest: closureDigest,
|
|
58
|
+
key: planCacheKey({
|
|
59
|
+
stamp: cache.stamp,
|
|
60
|
+
target: adapter.target,
|
|
61
|
+
structuralPassHash: structuralPass?.versionHash ?? `${adapter.target}-noop-v1`
|
|
62
|
+
}, module.id, closureDigest)
|
|
63
|
+
} : null;
|
|
64
|
+
const cached = entry ? await entry.store.read(entry.key, module.id, entry.digest) : null;
|
|
65
|
+
let plan = cached?.plan;
|
|
66
|
+
if (!plan) {
|
|
67
|
+
const materialized = materializeModule(graph, module.id);
|
|
68
|
+
if (adapter.prepare) await adapter.prepare(materialized);
|
|
69
|
+
plan = lowerModule({
|
|
70
|
+
module: materialized,
|
|
71
|
+
source: module.source,
|
|
72
|
+
target: adapter.target,
|
|
73
|
+
host: adapter.host,
|
|
74
|
+
options: { projectGeneration: adapter.projectGeneration },
|
|
75
|
+
structuralPass
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
if (entry && !cached) {
|
|
79
|
+
await entry.store.write(entry.key, {
|
|
80
|
+
schemaVersion: PLAN_CACHE_SCHEMA_VERSION,
|
|
81
|
+
moduleId: module.id,
|
|
82
|
+
closureDigest: entry.digest,
|
|
83
|
+
plan
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
plan,
|
|
88
|
+
output: applyLoweredModule(module.source, module.id, plan),
|
|
89
|
+
invalidatedIds: [...invalidated].sort(compareIds)
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async #install(module, adapter, visited, invalidated) {
|
|
93
|
+
if (visited.has(module.id)) return;
|
|
94
|
+
visited.add(module.id);
|
|
95
|
+
for (const dependency of module.imports) {
|
|
96
|
+
if (dependency.external || this.has(dependency.resolvedId)) continue;
|
|
97
|
+
const loaded = await adapter.load(dependency.resolvedId);
|
|
98
|
+
if (loaded) {
|
|
99
|
+
await this.#install(loaded, adapter, visited, invalidated);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const update = this.#graph.updateModule(module);
|
|
103
|
+
for (const id of update.invalidatedIds) invalidated.add(id);
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export { CompilerSession };
|
|
108
|
+
//# sourceMappingURL=session.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","names":["#queue","#compile","#enqueue","#graph","#install","#externalClosure"],"sources":["esm/session.js"],"sourcesContent":["import { ProjectGraph } from \"./graph\";\nimport { lowerModule } from \"./lower\";\nimport { materializeModule } from \"./materialize\";\nimport { applyLoweredModule } from \"./output\";\nimport {\n PLAN_CACHE_SCHEMA_VERSION,\n createExternalClosureLookup,\n moduleClosureDigest,\n planCacheKey\n} from \"./planCache\";\nimport { yukuFactory } from \"./yuku\";\nfunction compareIds(left, right) {\n return left < right ? -1 : left > right ? 1 : 0;\n}\nclass CompilerSession {\n #graph = new ProjectGraph(yukuFactory, { modules: [] });\n #externalClosure = createExternalClosureLookup();\n #queue = Promise.resolve();\n compile(input) {\n const operation = this.#queue.then(() => this.#compile(input));\n this.#queue = operation.catch(() => void 0);\n return operation;\n }\n update(module) {\n return this.#enqueue(() => this.#graph.updateModule(module).invalidatedIds);\n }\n has(id) {\n return this.#graph.contentHash(id) !== null;\n }\n dependentsOf(id) {\n return this.#graph.dependentsOf(id);\n }\n remove(id) {\n return this.#enqueue(() => this.#graph.removeModule(id));\n }\n parseCount(id) {\n return this.#graph.parseCount(id);\n }\n #enqueue(operation) {\n const queued = this.#queue.then(operation);\n this.#queue = queued.catch(() => void 0);\n return queued;\n }\n async #compile({\n module,\n adapter,\n structuralPass\n }) {\n const invalidated = /* @__PURE__ */ new Set();\n await this.#install(module, adapter, /* @__PURE__ */ new Set(), invalidated);\n const graph = this.#graph;\n const cache = adapter.planCache?.stamp ? adapter.planCache : null;\n const closureDigest = cache ? moduleClosureDigest(module.id, (id) => {\n const hash = graph.contentHash(id);\n if (hash) {\n return {\n contentHash: hash,\n dependencies: [...graph.dependenciesOf(id), ...graph.externalImportsOf(id)]\n };\n }\n return this.#externalClosure(id);\n }) : null;\n const entry = cache && closureDigest ? {\n store: cache.store,\n digest: closureDigest,\n key: planCacheKey(\n {\n stamp: cache.stamp,\n target: adapter.target,\n structuralPassHash: structuralPass?.versionHash ?? `${adapter.target}-noop-v1`\n },\n module.id,\n closureDigest\n )\n } : null;\n const cached = entry ? await entry.store.read(entry.key, module.id, entry.digest) : null;\n let plan = cached?.plan;\n if (!plan) {\n const materialized = materializeModule(graph, module.id);\n if (adapter.prepare) await adapter.prepare(materialized);\n plan = lowerModule({\n module: materialized,\n source: module.source,\n target: adapter.target,\n host: adapter.host,\n options: { projectGeneration: adapter.projectGeneration },\n structuralPass\n });\n }\n if (entry && !cached) {\n await entry.store.write(entry.key, {\n schemaVersion: PLAN_CACHE_SCHEMA_VERSION,\n moduleId: module.id,\n closureDigest: entry.digest,\n plan\n });\n }\n return {\n plan,\n output: applyLoweredModule(module.source, module.id, plan),\n invalidatedIds: [...invalidated].sort(compareIds)\n };\n }\n async #install(module, adapter, visited, invalidated) {\n if (visited.has(module.id)) return;\n visited.add(module.id);\n for (const dependency of module.imports) {\n if (dependency.external || this.has(dependency.resolvedId)) continue;\n const loaded = await adapter.load(dependency.resolvedId);\n if (loaded) {\n await this.#install(loaded, adapter, visited, invalidated);\n }\n }\n const update = this.#graph.updateModule(module);\n for (const id of update.invalidatedIds) invalidated.add(id);\n }\n}\nexport {\n CompilerSession\n};\n//# sourceMappingURL=session.js.map\n"],"mappings":";;;;;;;;AAWA,SAAS,WAAW,MAAM,OAAO;CAC/B,OAAO,OAAO,QAAQ,CAAC,IAAI,OAAO,QAAQ,IAAI;AAChD;AACA,IAAM,kBAAN,MAAsB;CACpB,SAAS,IAAI,aAAa,aAAa,EAAE,SAAS,CAAC,EAAE,CAAC;CACtD,mBAAmB,4BAA4B;CAC/C,SAAS,QAAQ,QAAQ;CACzB,QAAQ,OAAO;EACb,MAAM,YAAY,KAAKA,OAAO,WAAW,KAAKC,SAAS,KAAK,CAAC;EAC7D,KAAKD,SAAS,UAAU,YAAY,KAAK,CAAC;EAC1C,OAAO;CACT;CACA,OAAO,QAAQ;EACb,OAAO,KAAKE,eAAe,KAAKC,OAAO,aAAa,MAAM,CAAC,CAAC,cAAc;CAC5E;CACA,IAAI,IAAI;EACN,OAAO,KAAKA,OAAO,YAAY,EAAE,MAAM;CACzC;CACA,aAAa,IAAI;EACf,OAAO,KAAKA,OAAO,aAAa,EAAE;CACpC;CACA,OAAO,IAAI;EACT,OAAO,KAAKD,eAAe,KAAKC,OAAO,aAAa,EAAE,CAAC;CACzD;CACA,WAAW,IAAI;EACb,OAAO,KAAKA,OAAO,WAAW,EAAE;CAClC;CACA,SAAS,WAAW;EAClB,MAAM,SAAS,KAAKH,OAAO,KAAK,SAAS;EACzC,KAAKA,SAAS,OAAO,YAAY,KAAK,CAAC;EACvC,OAAO;CACT;CACA,MAAMC,SAAS,EACb,QACA,SACA,kBACC;EACD,MAAM,8BAA8B,IAAI,IAAI;EAC5C,MAAM,KAAKG,SAAS,QAAQ,yBAAyB,IAAI,IAAI,GAAG,WAAW;EAC3E,MAAM,QAAQ,KAAKD;EACnB,MAAM,QAAQ,QAAQ,WAAW,QAAQ,QAAQ,YAAY;EAC7D,MAAM,gBAAgB,QAAQ,oBAAoB,OAAO,KAAK,OAAO;GACnE,MAAM,OAAO,MAAM,YAAY,EAAE;GACjC,IAAI,MAAM;IACR,OAAO;KACL,aAAa;KACb,cAAc,CAAC,GAAG,MAAM,eAAe,EAAE,GAAG,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC5E;GACF;GACA,OAAO,KAAKE,iBAAiB,EAAE;EACjC,CAAC,IAAI;EACL,MAAM,QAAQ,SAAS,gBAAgB;GACrC,OAAO,MAAM;GACb,QAAQ;GACR,KAAK,aACH;IACE,OAAO,MAAM;IACb,QAAQ,QAAQ;IAChB,oBAAoB,gBAAgB,eAAe,GAAG,QAAQ,OAAO;GACvE,GACA,OAAO,IACP,aACF;EACF,IAAI;EACJ,MAAM,SAAS,QAAQ,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,MAAM,MAAM,IAAI;EACpF,IAAI,OAAO,QAAQ;EACnB,IAAI,CAAC,MAAM;GACT,MAAM,eAAe,kBAAkB,OAAO,OAAO,EAAE;GACvD,IAAI,QAAQ,SAAS,MAAM,QAAQ,QAAQ,YAAY;GACvD,OAAO,YAAY;IACjB,QAAQ;IACR,QAAQ,OAAO;IACf,QAAQ,QAAQ;IAChB,MAAM,QAAQ;IACd,SAAS,EAAE,mBAAmB,QAAQ,kBAAkB;IACxD;GACF,CAAC;EACH;EACA,IAAI,SAAS,CAAC,QAAQ;GACpB,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK;IACjC,eAAe;IACf,UAAU,OAAO;IACjB,eAAe,MAAM;IACrB;GACF,CAAC;EACH;EACA,OAAO;GACL;GACA,QAAQ,mBAAmB,OAAO,QAAQ,OAAO,IAAI,IAAI;GACzD,gBAAgB,CAAC,GAAG,WAAW,CAAC,CAAC,KAAK,UAAU;EAClD;CACF;CACA,MAAMD,SAAS,QAAQ,SAAS,SAAS,aAAa;EACpD,IAAI,QAAQ,IAAI,OAAO,EAAE,GAAG;EAC5B,QAAQ,IAAI,OAAO,EAAE;EACrB,KAAK,MAAM,cAAc,OAAO,SAAS;GACvC,IAAI,WAAW,YAAY,KAAK,IAAI,WAAW,UAAU,GAAG;GAC5D,MAAM,SAAS,MAAM,QAAQ,KAAK,WAAW,UAAU;GACvD,IAAI,QAAQ;IACV,MAAM,KAAKA,SAAS,QAAQ,SAAS,SAAS,WAAW;GAC3D;EACF;EACA,MAAM,SAAS,KAAKD,OAAO,aAAa,MAAM;EAC9C,KAAK,MAAM,MAAM,OAAO,gBAAgB,YAAY,IAAI,EAAE;CAC5D;AACF"}
|