@tamagui/static 3.0.0-beta.807.1 → 3.0.0-beta.881.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/dist/cjs/compiler.cjs +17 -5
- package/dist/cjs/compilerHost.cjs +164 -50
- package/dist/cjs/componentDiscovery.cjs +90 -0
- package/dist/cjs/domStructuralPass.cjs +16 -6
- package/dist/cjs/exports.cjs +4 -1
- package/dist/cjs/extractor/bundleConfig.cjs +23 -0
- package/dist/cjs/staticEvaluationIgnoredModules.cjs +1 -1
- package/dist/cjs/zero/theme.cjs +5 -20
- package/dist/esm/compiler.mjs +18 -6
- package/dist/esm/compiler.mjs.map +1 -1
- package/dist/esm/compilerHost.mjs +162 -51
- package/dist/esm/compilerHost.mjs.map +1 -1
- package/dist/esm/componentDiscovery.mjs +65 -0
- package/dist/esm/componentDiscovery.mjs.map +1 -0
- package/dist/esm/domStructuralPass.mjs +16 -6
- package/dist/esm/domStructuralPass.mjs.map +1 -1
- package/dist/esm/exports.mjs +4 -1
- package/dist/esm/extractor/bundleConfig.mjs +23 -1
- package/dist/esm/extractor/bundleConfig.mjs.map +1 -1
- package/dist/esm/staticEvaluationIgnoredModules.mjs +1 -1
- package/dist/esm/staticEvaluationIgnoredModules.mjs.map +1 -1
- package/dist/esm/zero/theme.mjs +5 -20
- package/dist/esm/zero/theme.mjs.map +1 -1
- package/package.json +17 -17
- package/src/compiler.ts +27 -5
- package/src/compilerHost.ts +274 -105
- package/src/componentDiscovery.ts +95 -0
- package/src/domStructuralPass.ts +26 -6
- package/src/exports.ts +2 -0
- package/src/extractor/bundleConfig.ts +34 -0
- package/src/staticEvaluationIgnoredModules.ts +1 -1
- package/src/zero/theme.ts +12 -21
- package/types/compiler.d.ts +13 -0
- package/types/compiler.d.ts.map +1 -1
- package/types/compilerHost.d.ts +13 -0
- package/types/compilerHost.d.ts.map +1 -1
- package/types/componentDiscovery.d.ts +27 -0
- package/types/componentDiscovery.d.ts.map +1 -0
- package/types/domStructuralPass.d.ts.map +1 -1
- package/types/exports.d.ts +2 -0
- package/types/exports.d.ts.map +1 -1
- package/types/extractor/bundleConfig.d.ts +7 -0
- package/types/extractor/bundleConfig.d.ts.map +1 -1
- package/types/zero/theme.d.ts +0 -1
- package/types/zero/theme.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","names":[],"sources":["esm/zero/theme.js"],"sourcesContent":["import {\n childNode,\n childNodes,\n resolvedModuleId,\n walkAst,\n zeroRuleMessage\n} from \"@tamagui/compiler-core\";\nimport { getThemeClassNames, reservedThemeProps } from \"@tamagui/helpers\";\nimport {\n resolveThemeName,\n variableToString\n} from \"@tamagui/web\";\nimport {\n getInlineValuesFromProps,\n getVariablesCSSRules\n} from \"@tamagui/web/theme-update\";\nconst MAX_THEME_BRANCHES = 8;\nconst LOWERABLE_RESERVED_PROPS = /* @__PURE__ */ new Set([\"name\", \"reset\", \"contain\"]);\nfunction jsxAttributeName(attribute) {\n const name = childNode(attribute, \"name\");\n return name && typeof name.name === \"string\" ? name.name : null;\n}\nfunction literalOf(node) {\n if (!node) return void 0;\n if (node.type === \"Literal\" && typeof node.value !== \"object\") {\n return node.value;\n }\n return void 0;\n}\nfunction hasSideEffects(node) {\n let found = false;\n walkAst(node, (child) => {\n if (child.type === \"CallExpression\" || child.type === \"OptionalCallExpression\" || child.type === \"NewExpression\" || child.type === \"AwaitExpression\" || child.type === \"YieldExpression\" || child.type === \"AssignmentExpression\" || child.type === \"UpdateExpression\" || child.type === \"TaggedTemplateExpression\") {\n found = true;\n }\n });\n return found;\n}\nfunction readNameOptions(value, source, guards) {\n const literal = literalOf(value);\n if (typeof literal === \"string\") {\n return [{ test: guards.length ? guards.join(\" && \") : null, name: literal }];\n }\n if (value.type === \"ConditionalExpression\") {\n const test = childNode(value, \"test\");\n const consequent = childNode(value, \"consequent\");\n const alternate = childNode(value, \"alternate\");\n if (!test || !consequent || !alternate) return null;\n if (hasSideEffects(test)) return null;\n const testText = source.slice(test.start, test.end).replace(/\\s+/g, \" \").trim();\n const left = readNameOptions(consequent, source, [...guards, `(${testText})`]);\n const right = readNameOptions(alternate, source, [...guards, `!(${testText})`]);\n if (!left || !right) return null;\n return [...left, ...right];\n }\n return null;\n}\nfunction foldBranches(branches) {\n const last = branches[branches.length - 1];\n if (new Set(branches.map((branch) => branch.value)).size === 1) return last.value;\n let expression = last.value;\n for (let index = branches.length - 2; index >= 0; index--) {\n const branch = branches[index];\n expression = branch.test === null ? branch.value : `${branch.test} ? ${branch.value} : ${expression}`;\n }\n return expression;\n}\nfunction resolveThemeChain(chain, rootThemeName, config) {\n let branches = [{ test: null, name: rootThemeName, isNew: false }];\n for (const node of chain) {\n const next = [];\n for (const parent of branches) {\n for (const option of node.options) {\n const resolved = resolveThemeName(\n parent.name,\n option.name,\n node.reset,\n config.themes\n );\n const tests = [parent.test, option.test].filter(Boolean);\n next.push({\n test: tests.length ? tests.join(\" && \") : null,\n name: resolved ?? parent.name,\n isNew: resolved !== null\n });\n }\n }\n branches = next;\n }\n return branches;\n}\nfunction readStaticTheme(element, id, source, config, kind = \"Theme\") {\n const moduleId = resolvedModuleId(id);\n const violations = [];\n const css = /* @__PURE__ */ new Map();\n const opening = childNode(element, \"openingElement\");\n const closing = childNode(element, \"closingElement\");\n const span = (node) => ({ id: moduleId, start: node.start, end: node.end });\n let options = [{ test: null, name: void 0 }];\n let reset = false;\n let contain = false;\n const themeKeyProps = {};\n for (const attribute of childNodes(opening, \"attributes\")) {\n if (attribute.type !== \"JSXAttribute\") {\n violations.push({\n rule: 1,\n code: \"local/unsafe-style-spread\",\n span: span(attribute),\n component: kind,\n message: zeroRuleMessage(1, { component: kind })\n });\n continue;\n }\n const key = jsxAttributeName(attribute);\n if (!key) continue;\n const rawValue = childNode(attribute, \"value\");\n const value = rawValue && rawValue.type === \"JSXExpressionContainer\" ? childNode(rawValue, \"expression\") : rawValue;\n if (kind === \"ThemeUpdate\" && reservedThemeProps[key]) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: kind,\n message: zeroRuleMessage(4, {\n detail: `the <ThemeUpdate ${key}> prop, which belongs on <Theme>,`\n })\n });\n continue;\n }\n if (kind === \"Theme\" && key === \"name\") {\n const read = value ? readNameOptions(value, source, []) : null;\n if (!read) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `the <Theme name> value ${source.slice(attribute.start, attribute.end).replace(/\\s+/g, \" \").trim()}, which is not a literal theme name or a conditional over literal theme names,`\n })\n });\n continue;\n }\n options = read;\n continue;\n }\n if (kind === \"Theme\" && reservedThemeProps[key]) {\n if (!LOWERABLE_RESERVED_PROPS.has(key)) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `the <Theme ${key}> prop, which has no compiled form,`\n })\n });\n continue;\n }\n const literal2 = value ? literalOf(value) : true;\n if (typeof literal2 !== \"boolean\") {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `a non-literal <Theme ${key}> value,`\n })\n });\n continue;\n }\n if (key === \"reset\") reset = literal2;\n if (key === \"contain\") contain = literal2;\n continue;\n }\n if (kind === \"Theme\") {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `the removed <Theme ${key}> inline-value spelling. Use <ThemeUpdate ${key}> around the subtree instead,`\n })\n });\n continue;\n }\n const literal = value ? literalOf(value) : void 0;\n if (typeof literal !== \"string\" && typeof literal !== \"number\") {\n violations.push({\n rule: 3,\n code: \"local/dynamic-style-value\",\n span: span(attribute),\n component: kind,\n message: zeroRuleMessage(3, {\n prop: key,\n component: kind,\n detail: value ? \"a theme value must be a string or number literal at build time\" : \"a theme key needs a value\"\n })\n });\n continue;\n }\n themeKeyProps[key] = literal;\n }\n if (kind === \"Theme\" && reset && options.some((option) => option.name !== void 0)) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(opening),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: \"a <Theme> with both name and reset, which cannot mean one theme,\"\n })\n });\n }\n if (!closing) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(element),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `a self-closing <${kind}>, which has no subtree to theme,`\n })\n });\n }\n const issues = [];\n const inlineValues = kind === \"ThemeUpdate\" && Object.keys(themeKeyProps).length ? getInlineValuesFromProps(themeKeyProps, config, (issue) => issues.push(issue)) : null;\n for (const issue of issues) {\n violations.push({\n rule: 3,\n code: \"local/dynamic-style-value\",\n span: span(opening),\n component: kind,\n message: zeroRuleMessage(3, {\n prop: issue.key,\n component: kind,\n detail: issue.message\n })\n });\n }\n const inlineCSS = inlineValues ? getVariablesCSSRules(inlineValues, config) : null;\n if (inlineCSS) css.set(inlineCSS.identifier, inlineCSS.rules.join(\"\"));\n if (violations.length) return { node: null, violations, css };\n return {\n node: {\n kind,\n element,\n opening,\n closing,\n options,\n reset,\n contain,\n layer: inlineValues && inlineCSS ? {\n inlineValues,\n inlineClassName: inlineCSS.identifier\n } : null\n },\n violations,\n css\n };\n}\nfunction lowerStaticTheme(node, chain, rootThemeName, config, id) {\n const moduleId = resolvedModuleId(id);\n const branches = resolveThemeChain(chain, rootThemeName, config);\n if (branches.length > MAX_THEME_BRANCHES) {\n return {\n edits: [],\n violations: [\n {\n rule: 4,\n code: \"local/unsupported-target\",\n span: { id: moduleId, start: node.element.start, end: node.element.end },\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `a <Theme> chain that enumerates ${branches.length} theme names, past the ${MAX_THEME_BRANCHES} this lowers,`\n })\n }\n ]\n };\n }\n const inlineClass = node.layer?.inlineClassName ?? \"\";\n const classBranches = branches.map((branch) => ({\n test: branch.test,\n value: JSON.stringify(\n [branch.isNew ? getThemeClassNames(branch.name) : \"\", \"is_Theme\", inlineClass].filter(Boolean).join(\" \").replace(/\\s+/g, \" \").trim()\n )\n }));\n const baseStyle = node.contain ? `display:\"contents\",contain:\"strict\"` : `display:\"contents\"`;\n const styleBranches = branches.map((branch) => {\n const theme = config.themes[branch.name];\n const color = branch.isNew && theme ? variableToString(theme.color) : \"\";\n return {\n test: branch.test,\n value: color ? `{color:${JSON.stringify(color)},${baseStyle}}` : `{${baseStyle}}`\n };\n });\n const className = foldBranches(classBranches);\n const style = foldBranches(styleBranches);\n const classAttribute = className.startsWith('\"') ? `className=${className}` : `className={${className}}`;\n const edits = [\n {\n start: node.opening.start,\n end: node.opening.end,\n content: `<span ${classAttribute} style={${style}}>`,\n origin: { id: moduleId, start: node.opening.start, end: node.opening.end }\n }\n ];\n if (node.closing) {\n edits.push({\n start: node.closing.start,\n end: node.closing.end,\n content: `</span>`,\n origin: { id: moduleId, start: node.closing.start, end: node.closing.end }\n });\n }\n return { edits, violations: [] };\n}\nexport {\n foldBranches,\n lowerStaticTheme,\n readStaticTheme,\n resolveThemeChain\n};\n//# sourceMappingURL=theme.js.map\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"theme.js","names":[],"sources":["esm/zero/theme.js"],"sourcesContent":["import {\n childNode,\n childNodes,\n resolvedModuleId,\n walkAst,\n zeroRuleMessage\n} from \"@tamagui/compiler-core\";\nimport { getThemeClassNames, reservedThemeProps } from \"@tamagui/helpers\";\nimport {\n resolveThemeName,\n variableToString\n} from \"@tamagui/web\";\nimport {\n getInlineValuesFromProps,\n getVariablesCSSRules\n} from \"@tamagui/web/theme-update\";\nconst MAX_THEME_BRANCHES = 8;\nconst LOWERABLE_RESERVED_PROPS = /* @__PURE__ */ new Set([\"name\", \"contain\"]);\nfunction jsxAttributeName(attribute) {\n const name = childNode(attribute, \"name\");\n return name && typeof name.name === \"string\" ? name.name : null;\n}\nfunction literalOf(node) {\n if (!node) return void 0;\n if (node.type === \"Literal\" && typeof node.value !== \"object\") {\n return node.value;\n }\n return void 0;\n}\nfunction hasSideEffects(node) {\n let found = false;\n walkAst(node, (child) => {\n if (child.type === \"CallExpression\" || child.type === \"OptionalCallExpression\" || child.type === \"NewExpression\" || child.type === \"AwaitExpression\" || child.type === \"YieldExpression\" || child.type === \"AssignmentExpression\" || child.type === \"UpdateExpression\" || child.type === \"TaggedTemplateExpression\") {\n found = true;\n }\n });\n return found;\n}\nfunction readNameOptions(value, source, guards) {\n const literal = literalOf(value);\n if (typeof literal === \"string\") {\n return [{ test: guards.length ? guards.join(\" && \") : null, name: literal }];\n }\n if (value.type === \"ConditionalExpression\") {\n const test = childNode(value, \"test\");\n const consequent = childNode(value, \"consequent\");\n const alternate = childNode(value, \"alternate\");\n if (!test || !consequent || !alternate) return null;\n if (hasSideEffects(test)) return null;\n const testText = source.slice(test.start, test.end).replace(/\\s+/g, \" \").trim();\n const left = readNameOptions(consequent, source, [...guards, `(${testText})`]);\n const right = readNameOptions(alternate, source, [...guards, `!(${testText})`]);\n if (!left || !right) return null;\n return [...left, ...right];\n }\n return null;\n}\nfunction foldBranches(branches) {\n const last = branches[branches.length - 1];\n if (new Set(branches.map((branch) => branch.value)).size === 1) return last.value;\n let expression = last.value;\n for (let index = branches.length - 2; index >= 0; index--) {\n const branch = branches[index];\n expression = branch.test === null ? branch.value : `${branch.test} ? ${branch.value} : ${expression}`;\n }\n return expression;\n}\nfunction resolveThemeChain(chain, rootThemeName, config) {\n let branches = [{ test: null, name: rootThemeName, isNew: false }];\n for (const node of chain) {\n const next = [];\n for (const parent of branches) {\n for (const option of node.options) {\n const resolved = resolveThemeName(\n parent.name,\n option.name,\n config.themes\n );\n const tests = [parent.test, option.test].filter(Boolean);\n next.push({\n test: tests.length ? tests.join(\" && \") : null,\n name: resolved ?? parent.name,\n isNew: resolved !== null\n });\n }\n }\n branches = next;\n }\n return branches;\n}\nfunction readStaticTheme(element, id, source, config, kind = \"Theme\") {\n const moduleId = resolvedModuleId(id);\n const violations = [];\n const css = /* @__PURE__ */ new Map();\n const opening = childNode(element, \"openingElement\");\n const closing = childNode(element, \"closingElement\");\n const span = (node) => ({ id: moduleId, start: node.start, end: node.end });\n let options = [{ test: null, name: void 0 }];\n let contain = false;\n const themeKeyProps = {};\n for (const attribute of childNodes(opening, \"attributes\")) {\n if (attribute.type !== \"JSXAttribute\") {\n violations.push({\n rule: 1,\n code: \"local/unsafe-style-spread\",\n span: span(attribute),\n component: kind,\n message: zeroRuleMessage(1, { component: kind })\n });\n continue;\n }\n const key = jsxAttributeName(attribute);\n if (!key) continue;\n const rawValue = childNode(attribute, \"value\");\n const value = rawValue && rawValue.type === \"JSXExpressionContainer\" ? childNode(rawValue, \"expression\") : rawValue;\n if (kind === \"ThemeUpdate\" && reservedThemeProps[key]) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: kind,\n message: zeroRuleMessage(4, {\n detail: `the <ThemeUpdate ${key}> prop, which belongs on <Theme>,`\n })\n });\n continue;\n }\n if (kind === \"Theme\" && key === \"name\") {\n const read = value ? readNameOptions(value, source, []) : null;\n if (!read) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `the <Theme name> value ${source.slice(attribute.start, attribute.end).replace(/\\s+/g, \" \").trim()}, which is not a literal theme name or a conditional over literal theme names,`\n })\n });\n continue;\n }\n options = read;\n continue;\n }\n if (kind === \"Theme\" && reservedThemeProps[key]) {\n if (!LOWERABLE_RESERVED_PROPS.has(key)) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `the <Theme ${key}> prop, which has no compiled form,`\n })\n });\n continue;\n }\n const literal2 = value ? literalOf(value) : true;\n if (typeof literal2 !== \"boolean\") {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `a non-literal <Theme ${key}> value,`\n })\n });\n continue;\n }\n if (key === \"contain\") contain = literal2;\n continue;\n }\n if (kind === \"Theme\") {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(attribute),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `the removed <Theme ${key}> inline-value spelling. Use <ThemeUpdate ${key}> around the subtree instead,`\n })\n });\n continue;\n }\n const literal = value ? literalOf(value) : void 0;\n if (typeof literal !== \"string\" && typeof literal !== \"number\") {\n violations.push({\n rule: 3,\n code: \"local/dynamic-style-value\",\n span: span(attribute),\n component: kind,\n message: zeroRuleMessage(3, {\n prop: key,\n component: kind,\n detail: value ? \"a theme value must be a string or number literal at build time\" : \"a theme key needs a value\"\n })\n });\n continue;\n }\n themeKeyProps[key] = literal;\n }\n if (!closing) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: span(element),\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `a self-closing <${kind}>, which has no subtree to theme,`\n })\n });\n }\n const issues = [];\n const themeUpdateConfig = config;\n const inlineValues = kind === \"ThemeUpdate\" && Object.keys(themeKeyProps).length ? getInlineValuesFromProps(\n themeKeyProps,\n themeUpdateConfig,\n (issue) => issues.push(issue)\n ) : null;\n for (const issue of issues) {\n violations.push({\n rule: 3,\n code: \"local/dynamic-style-value\",\n span: span(opening),\n component: kind,\n message: zeroRuleMessage(3, {\n prop: issue.key,\n component: kind,\n detail: issue.message\n })\n });\n }\n const inlineCSS = inlineValues ? getVariablesCSSRules(inlineValues, themeUpdateConfig) : null;\n if (inlineCSS) css.set(inlineCSS.identifier, inlineCSS.rules.join(\"\"));\n if (violations.length) return { node: null, violations, css };\n return {\n node: {\n kind,\n element,\n opening,\n closing,\n options,\n contain,\n layer: inlineValues && inlineCSS ? {\n inlineValues,\n inlineClassName: inlineCSS.identifier\n } : null\n },\n violations,\n css\n };\n}\nfunction lowerStaticTheme(node, chain, rootThemeName, config, id) {\n const moduleId = resolvedModuleId(id);\n const branches = resolveThemeChain(chain, rootThemeName, config);\n if (branches.length > MAX_THEME_BRANCHES) {\n return {\n edits: [],\n violations: [\n {\n rule: 4,\n code: \"local/unsupported-target\",\n span: { id: moduleId, start: node.element.start, end: node.element.end },\n component: \"Theme\",\n message: zeroRuleMessage(4, {\n detail: `a <Theme> chain that enumerates ${branches.length} theme names, past the ${MAX_THEME_BRANCHES} this lowers,`\n })\n }\n ]\n };\n }\n const inlineClass = node.layer?.inlineClassName ?? \"\";\n const classBranches = branches.map((branch) => ({\n test: branch.test,\n value: JSON.stringify(\n [branch.isNew ? getThemeClassNames(branch.name) : \"\", \"is_Theme\", inlineClass].filter(Boolean).join(\" \").replace(/\\s+/g, \" \").trim()\n )\n }));\n const baseStyle = node.contain ? `display:\"contents\",contain:\"strict\"` : `display:\"contents\"`;\n const styleBranches = branches.map((branch) => {\n const theme = config.themes[branch.name];\n const color = branch.isNew && theme ? variableToString(theme.color) : \"\";\n return {\n test: branch.test,\n value: color ? `{color:${JSON.stringify(color)},${baseStyle}}` : `{${baseStyle}}`\n };\n });\n const className = foldBranches(classBranches);\n const style = foldBranches(styleBranches);\n const classAttribute = className.startsWith('\"') ? `className=${className}` : `className={${className}}`;\n const edits = [\n {\n start: node.opening.start,\n end: node.opening.end,\n content: `<span ${classAttribute} style={${style}}>`,\n origin: { id: moduleId, start: node.opening.start, end: node.opening.end }\n }\n ];\n if (node.closing) {\n edits.push({\n start: node.closing.start,\n end: node.closing.end,\n content: `</span>`,\n origin: { id: moduleId, start: node.closing.start, end: node.closing.end }\n });\n }\n return { edits, violations: [] };\n}\nexport {\n foldBranches,\n lowerStaticTheme,\n readStaticTheme,\n resolveThemeChain\n};\n//# sourceMappingURL=theme.js.map\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tamagui/static",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.881.1",
|
|
4
4
|
"gitHead": "a49cc7ea6b93ba384e77a4880ae48ac4a5635c14",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"source": "src/index.ts",
|
|
@@ -45,21 +45,21 @@
|
|
|
45
45
|
"clean:build": "tamagui-build clean:build"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@tamagui/cli-color": "3.0.0-beta.
|
|
49
|
-
"@tamagui/compiler-core": "3.0.0-beta.
|
|
50
|
-
"@tamagui/config-default": "3.0.0-beta.
|
|
51
|
-
"@tamagui/core": "3.0.0-beta.
|
|
52
|
-
"@tamagui/dom": "3.0.0-beta.
|
|
53
|
-
"@tamagui/fake-react-native": "3.0.0-beta.
|
|
54
|
-
"@tamagui/generate-themes": "3.0.0-beta.
|
|
55
|
-
"@tamagui/helpers": "3.0.0-beta.
|
|
56
|
-
"@tamagui/helpers-node": "3.0.0-beta.
|
|
57
|
-
"@tamagui/react-native-web-internals": "3.0.0-beta.
|
|
58
|
-
"@tamagui/react-native-web-lite": "3.0.0-beta.
|
|
59
|
-
"@tamagui/shorthands": "3.0.0-beta.
|
|
60
|
-
"@tamagui/style-grammar": "3.0.0-beta.
|
|
61
|
-
"@tamagui/types": "3.0.0-beta.
|
|
62
|
-
"@tamagui/web": "3.0.0-beta.
|
|
48
|
+
"@tamagui/cli-color": "3.0.0-beta.881.1",
|
|
49
|
+
"@tamagui/compiler-core": "3.0.0-beta.881.1",
|
|
50
|
+
"@tamagui/config-default": "3.0.0-beta.881.1",
|
|
51
|
+
"@tamagui/core": "3.0.0-beta.881.1",
|
|
52
|
+
"@tamagui/dom": "3.0.0-beta.881.1",
|
|
53
|
+
"@tamagui/fake-react-native": "3.0.0-beta.881.1",
|
|
54
|
+
"@tamagui/generate-themes": "3.0.0-beta.881.1",
|
|
55
|
+
"@tamagui/helpers": "3.0.0-beta.881.1",
|
|
56
|
+
"@tamagui/helpers-node": "3.0.0-beta.881.1",
|
|
57
|
+
"@tamagui/react-native-web-internals": "3.0.0-beta.881.1",
|
|
58
|
+
"@tamagui/react-native-web-lite": "3.0.0-beta.881.1",
|
|
59
|
+
"@tamagui/shorthands": "3.0.0-beta.881.1",
|
|
60
|
+
"@tamagui/style-grammar": "3.0.0-beta.881.1",
|
|
61
|
+
"@tamagui/types": "3.0.0-beta.881.1",
|
|
62
|
+
"@tamagui/web": "3.0.0-beta.881.1",
|
|
63
63
|
"browserslist": "^4.28.1",
|
|
64
64
|
"check-dependency-version-consistency": "^4.1.0",
|
|
65
65
|
"esbuild": "0.28.1",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"react-native-web": "~0.21.0"
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
|
-
"@tamagui/build": "3.0.0-beta.
|
|
74
|
+
"@tamagui/build": "3.0.0-beta.881.1",
|
|
75
75
|
"@types/find-root": "^1.1.2",
|
|
76
76
|
"@types/node": "^22.1.0",
|
|
77
77
|
"@types/webpack": "^4.41.26",
|
package/src/compiler.ts
CHANGED
|
@@ -19,7 +19,8 @@ import { readFileSync } from 'node:fs'
|
|
|
19
19
|
import { createRequire } from 'node:module'
|
|
20
20
|
import path from 'node:path'
|
|
21
21
|
|
|
22
|
-
import {
|
|
22
|
+
import { ComponentDiscovery, type ComponentModuleEvaluator } from './componentDiscovery'
|
|
23
|
+
import { createComponentRegistry, createTamaguiCompilerHost } from './compilerHost'
|
|
23
24
|
import { domStructuralPass } from './domStructuralPass'
|
|
24
25
|
import type { TamaguiProjectInfo } from './extractor/bundleConfig'
|
|
25
26
|
import { loadTamagui } from './extractor/loadTamagui'
|
|
@@ -217,6 +218,15 @@ export interface CompilerInput {
|
|
|
217
218
|
project: CompilerProject
|
|
218
219
|
resolve(specifier: string, importer: string): Promise<CompilerResolution | null>
|
|
219
220
|
load(id: string): Promise<string | null>
|
|
221
|
+
/**
|
|
222
|
+
* Evaluate a host-resolved module and return its exports. The frontend asks
|
|
223
|
+
* for every package a JSX element or styled() base imports from that is not
|
|
224
|
+
* in the configured `components` list, once per module per project, and
|
|
225
|
+
* lowers against the static configs it finds. Return null (or throw) when
|
|
226
|
+
* the host cannot evaluate the module; those elements stay on the runtime
|
|
227
|
+
* path exactly as before.
|
|
228
|
+
*/
|
|
229
|
+
evaluate?: ComponentModuleEvaluator
|
|
220
230
|
}
|
|
221
231
|
|
|
222
232
|
export type CompilerUpdateInput = CompilerInput
|
|
@@ -257,6 +267,7 @@ export class CompilerFrontend {
|
|
|
257
267
|
private readonly planCaches = new Map<string, ModulePlanCache>()
|
|
258
268
|
private readonly moduleRecords = new Map<ResolvedModuleId, HostModuleInput>()
|
|
259
269
|
private moduleContext: string | null = null
|
|
270
|
+
private readonly discovery = new ComponentDiscovery()
|
|
260
271
|
|
|
261
272
|
/**
|
|
262
273
|
* One cache per project root and platform. Absent when the project produced
|
|
@@ -358,14 +369,18 @@ export class CompilerFrontend {
|
|
|
358
369
|
if (!projectInfo.tamaguiConfig || !projectInfo.components) {
|
|
359
370
|
throw new Error('The compiler requires evaluated Tamagui config and components')
|
|
360
371
|
}
|
|
372
|
+
const componentModules = input.project.componentModules.map((component) => ({
|
|
373
|
+
moduleName: component.moduleName,
|
|
374
|
+
resolvedId: cleanId(component.id),
|
|
375
|
+
}))
|
|
376
|
+
const registry = createComponentRegistry(projectInfo.components, componentModules)
|
|
377
|
+
this.discovery.seed(registry)
|
|
361
378
|
const host = createTamaguiCompilerHost({
|
|
362
379
|
target: input.target,
|
|
363
380
|
tamaguiConfig: projectInfo.tamaguiConfig,
|
|
364
381
|
components: projectInfo.components,
|
|
365
|
-
componentModules
|
|
366
|
-
|
|
367
|
-
resolvedId: cleanId(component.id),
|
|
368
|
-
})),
|
|
382
|
+
componentModules,
|
|
383
|
+
registry,
|
|
369
384
|
disablePartialExtraction: input.project.disablePartialExtraction,
|
|
370
385
|
experimentalNativeFastPath: input.project.experimentalNativeFastPath,
|
|
371
386
|
zeroRuntime: input.project.zeroRuntime,
|
|
@@ -380,6 +395,7 @@ export class CompilerFrontend {
|
|
|
380
395
|
async load(id) {
|
|
381
396
|
return modules.get(id) ?? null
|
|
382
397
|
},
|
|
398
|
+
prepare: (module) => this.discovery.prepare(module, registry, input.evaluate),
|
|
383
399
|
},
|
|
384
400
|
structuralPass: domStructuralPass,
|
|
385
401
|
})
|
|
@@ -391,6 +407,11 @@ export class CompilerFrontend {
|
|
|
391
407
|
}
|
|
392
408
|
}
|
|
393
409
|
|
|
410
|
+
/** host-resolved ids of every module discovery found components in */
|
|
411
|
+
discoveredModuleIds(): string[] {
|
|
412
|
+
return this.discovery.ids()
|
|
413
|
+
}
|
|
414
|
+
|
|
394
415
|
private async buildTree(input: CompilerUpdateInput): Promise<{
|
|
395
416
|
rootModule: HostModuleInput
|
|
396
417
|
modules: Map<ResolvedModuleId, HostModuleInput>
|
|
@@ -398,6 +419,7 @@ export class CompilerFrontend {
|
|
|
398
419
|
const moduleContext = compilerContext(input)
|
|
399
420
|
if (this.moduleContext !== moduleContext) {
|
|
400
421
|
this.moduleRecords.clear()
|
|
422
|
+
this.discovery.clear()
|
|
401
423
|
this.moduleContext = moduleContext
|
|
402
424
|
}
|
|
403
425
|
|