@tamagui/static 2.7.7 → 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/dist/cjs/check-dep-versions.cjs +354 -0
- package/dist/cjs/checkDeps.cjs +301 -0
- package/dist/cjs/compiler.cjs +349 -0
- package/dist/cjs/compilerHost.cjs +2285 -0
- package/dist/cjs/componentDiscovery.cjs +94 -0
- package/dist/cjs/constants.cjs +32 -0
- package/dist/cjs/domStructuralPass.cjs +121 -0
- package/dist/cjs/exports.cjs +44 -0
- package/dist/cjs/extractor/addLocalExports.cjs +63 -0
- package/dist/cjs/extractor/bundle.cjs +229 -0
- package/dist/cjs/extractor/bundleConfig.cjs +769 -0
- package/dist/cjs/extractor/concatClassName.cjs +120 -0
- package/dist/cjs/extractor/detectModuleFormat.cjs +53 -0
- package/dist/cjs/extractor/esbuildAliasPlugin.cjs +46 -0
- package/dist/cjs/extractor/esbuildTsconfigPaths.cjs +91 -0
- package/dist/cjs/extractor/getTamaguiConfigPathFromOptionsConfig.cjs +42 -0
- package/dist/cjs/extractor/loadTamagui.cjs +394 -0
- package/dist/cjs/extractor/regenerateConfig.cjs +160 -0
- package/dist/cjs/extractor/watchTamaguiConfig.cjs +63 -0
- package/dist/cjs/getPragmaOptions.cjs +66 -0
- package/dist/cjs/helpers/memoize.cjs +41 -0
- package/dist/cjs/helpers/requireTamaguiCore.cjs +39 -0
- package/dist/cjs/index.cjs +33 -0
- package/dist/cjs/registerRequire.cjs +219 -0
- package/dist/cjs/server.cjs +65 -0
- package/dist/cjs/staticEvaluationIgnoredModules.cjs +85 -0
- package/dist/cjs/types.cjs +16 -0
- package/dist/cjs/zero/artifact.cjs +144 -0
- package/dist/cjs/zero/graph.cjs +208 -0
- package/dist/cjs/zero/identity.cjs +60 -0
- package/dist/cjs/zero/index.cjs +33 -0
- package/dist/cjs/zero/islands.cjs +234 -0
- package/dist/cjs/zero/options.cjs +162 -0
- package/dist/cjs/zero/ownership.cjs +78 -0
- package/dist/cjs/zero/theme.cjs +337 -0
- package/dist/cjs/zero/transform.cjs +207 -0
- package/dist/esm/check-dep-versions.mjs +329 -0
- package/dist/esm/check-dep-versions.mjs.map +1 -0
- package/dist/esm/checkDeps.mjs +279 -0
- package/dist/esm/checkDeps.mjs.map +1 -0
- package/dist/esm/compiler.mjs +319 -0
- package/dist/esm/compiler.mjs.map +1 -0
- package/dist/esm/compilerHost.mjs +2263 -0
- package/dist/esm/compilerHost.mjs.map +1 -0
- package/dist/esm/componentDiscovery.mjs +69 -0
- package/dist/esm/componentDiscovery.mjs.map +1 -0
- package/dist/esm/constants.mjs +7 -0
- package/dist/esm/constants.mjs.map +1 -0
- package/dist/esm/domStructuralPass.mjs +102 -0
- package/dist/esm/domStructuralPass.mjs.map +1 -0
- package/dist/esm/exports.mjs +29 -0
- package/dist/esm/extractor/addLocalExports.mjs +44 -0
- package/dist/esm/extractor/addLocalExports.mjs.map +1 -0
- package/dist/esm/extractor/bundle.mjs +199 -0
- package/dist/esm/extractor/bundle.mjs.map +1 -0
- package/dist/esm/extractor/bundleConfig.mjs +728 -0
- package/dist/esm/extractor/bundleConfig.mjs.map +1 -0
- package/dist/esm/extractor/concatClassName.mjs +100 -0
- package/dist/esm/extractor/concatClassName.mjs.map +1 -0
- package/dist/esm/extractor/detectModuleFormat.mjs +31 -0
- package/dist/esm/extractor/detectModuleFormat.mjs.map +1 -0
- package/dist/esm/extractor/esbuildAliasPlugin.mjs +26 -0
- package/dist/esm/extractor/esbuildAliasPlugin.mjs.map +1 -0
- package/dist/esm/extractor/esbuildTsconfigPaths.mjs +63 -0
- package/dist/esm/extractor/esbuildTsconfigPaths.mjs.map +1 -0
- package/dist/esm/extractor/getTamaguiConfigPathFromOptionsConfig.mjs +23 -0
- package/dist/esm/extractor/getTamaguiConfigPathFromOptionsConfig.mjs.map +1 -0
- package/dist/esm/extractor/loadTamagui.mjs +357 -0
- package/dist/esm/extractor/loadTamagui.mjs.map +1 -0
- package/dist/esm/extractor/regenerateConfig.mjs +131 -0
- package/dist/esm/extractor/regenerateConfig.mjs.map +1 -0
- package/dist/esm/extractor/watchTamaguiConfig.mjs +43 -0
- package/dist/esm/extractor/watchTamaguiConfig.mjs.map +1 -0
- package/dist/esm/getPragmaOptions.mjs +46 -0
- package/dist/esm/getPragmaOptions.mjs.map +1 -0
- package/dist/esm/helpers/memoize.mjs +21 -0
- package/dist/esm/helpers/memoize.mjs.map +1 -0
- package/dist/esm/helpers/requireTamaguiCore.mjs +19 -0
- package/dist/esm/helpers/requireTamaguiCore.mjs.map +1 -0
- package/dist/esm/index.mjs +8 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/registerRequire.mjs +195 -0
- package/dist/esm/registerRequire.mjs.map +1 -0
- package/dist/esm/server.mjs +40 -0
- package/dist/esm/server.mjs.map +1 -0
- package/dist/esm/setup.mjs +0 -0
- package/dist/esm/staticEvaluationIgnoredModules.mjs +61 -0
- package/dist/esm/staticEvaluationIgnoredModules.mjs.map +1 -0
- package/dist/esm/types.mjs +0 -0
- package/dist/esm/zero/artifact.mjs +119 -0
- package/dist/esm/zero/artifact.mjs.map +1 -0
- package/dist/esm/zero/graph.mjs +170 -0
- package/dist/esm/zero/graph.mjs.map +1 -0
- package/dist/esm/zero/identity.mjs +36 -0
- package/dist/esm/zero/identity.mjs.map +1 -0
- package/dist/esm/zero/index.mjs +19 -0
- package/dist/esm/zero/islands.mjs +200 -0
- package/dist/esm/zero/islands.mjs.map +1 -0
- package/dist/esm/zero/options.mjs +129 -0
- package/dist/esm/zero/options.mjs.map +1 -0
- package/dist/esm/zero/ownership.mjs +48 -0
- package/dist/esm/zero/ownership.mjs.map +1 -0
- package/dist/esm/zero/theme.mjs +313 -0
- package/dist/esm/zero/theme.mjs.map +1 -0
- package/dist/esm/zero/transform.mjs +182 -0
- package/dist/esm/zero/transform.mjs.map +1 -0
- package/package.json +38 -47
- package/src/check-dep-versions.ts +2 -2
- package/src/checkDeps.ts +3 -2
- package/src/compiler.ts +506 -0
- package/src/compilerHost.ts +3752 -0
- package/src/componentDiscovery.ts +105 -0
- package/src/constants.ts +0 -5
- package/src/domStructuralPass.ts +190 -0
- package/src/exports.ts +5 -6
- package/src/extractor/addLocalExports.ts +49 -0
- package/src/extractor/bundle.ts +38 -40
- package/src/extractor/bundleConfig.ts +368 -187
- package/src/extractor/concatClassName.ts +21 -24
- package/src/extractor/getTamaguiConfigPathFromOptionsConfig.ts +13 -5
- package/src/extractor/loadTamagui.ts +196 -143
- package/src/extractor/regenerateConfig.ts +65 -13
- package/src/extractor/watchTamaguiConfig.ts +6 -1
- package/src/helpers/requireTamaguiCore.ts +6 -1
- package/src/registerRequire.ts +94 -132
- package/src/staticEvaluationIgnoredModules.ts +74 -0
- package/src/types.ts +2 -107
- package/src/zero/artifact.ts +142 -0
- package/src/zero/graph.ts +359 -0
- package/src/zero/identity.ts +73 -0
- package/src/zero/index.ts +9 -0
- package/src/zero/islands.ts +265 -0
- package/src/zero/options.ts +239 -0
- package/src/zero/ownership.ts +113 -0
- package/src/zero/theme.ts +526 -0
- package/src/zero/transform.ts +329 -0
- package/types/check-dep-versions.d.ts.map +1 -1
- package/types/checkDeps.d.ts.map +1 -1
- package/types/compiler.d.ts +134 -0
- package/types/compiler.d.ts.map +1 -0
- package/types/compilerHost.d.ts +38 -0
- package/types/compilerHost.d.ts.map +1 -0
- package/types/componentDiscovery.d.ts +27 -0
- package/types/componentDiscovery.d.ts.map +1 -0
- package/types/constants.d.ts +0 -1
- package/types/constants.d.ts.map +1 -1
- package/types/domStructuralPass.d.ts +3 -0
- package/types/domStructuralPass.d.ts.map +1 -0
- package/types/exports.d.ts +5 -6
- package/types/exports.d.ts.map +1 -1
- package/types/extractor/addLocalExports.d.ts +3 -0
- package/types/extractor/addLocalExports.d.ts.map +1 -0
- package/types/extractor/bundle.d.ts +66 -65
- package/types/extractor/bundle.d.ts.map +1 -1
- package/types/extractor/bundleConfig.d.ts +26 -4
- package/types/extractor/bundleConfig.d.ts.map +1 -1
- package/types/extractor/esbuildAliasPlugin.d.ts.map +1 -1
- package/types/extractor/getTamaguiConfigPathFromOptionsConfig.d.ts +1 -1
- package/types/extractor/getTamaguiConfigPathFromOptionsConfig.d.ts.map +1 -1
- package/types/extractor/loadTamagui.d.ts +26 -3
- package/types/extractor/loadTamagui.d.ts.map +1 -1
- package/types/extractor/regenerateConfig.d.ts +1 -1
- package/types/extractor/regenerateConfig.d.ts.map +1 -1
- package/types/extractor/watchTamaguiConfig.d.ts.map +1 -1
- package/types/getPragmaOptions.d.ts +1 -1
- package/types/helpers/memoize.d.ts +1 -1
- package/types/helpers/memoize.d.ts.map +1 -1
- package/types/helpers/requireTamaguiCore.d.ts.map +1 -1
- package/types/index.d.ts.map +1 -1
- package/types/registerRequire.d.ts +2 -2
- package/types/registerRequire.d.ts.map +1 -1
- package/types/staticEvaluationIgnoredModules.d.ts +9 -0
- package/types/staticEvaluationIgnoredModules.d.ts.map +1 -0
- package/types/types.d.ts +2 -90
- package/types/types.d.ts.map +1 -1
- package/types/zero/artifact.d.ts +44 -0
- package/types/zero/artifact.d.ts.map +1 -0
- package/types/zero/graph.d.ts +139 -0
- package/types/zero/graph.d.ts.map +1 -0
- package/types/zero/identity.d.ts +33 -0
- package/types/zero/identity.d.ts.map +1 -0
- package/types/zero/index.d.ts +10 -0
- package/types/zero/index.d.ts.map +1 -0
- package/types/zero/islands.d.ts +56 -0
- package/types/zero/islands.d.ts.map +1 -0
- package/types/zero/options.d.ts +58 -0
- package/types/zero/options.d.ts.map +1 -0
- package/types/zero/ownership.d.ts +51 -0
- package/types/zero/ownership.d.ts.map +1 -0
- package/types/zero/theme.d.ts +85 -0
- package/types/zero/theme.d.ts.map +1 -0
- package/types/zero/transform.d.ts +53 -0
- package/types/zero/transform.d.ts.map +1 -0
- package/dist/check-dep-versions.cjs +0 -372
- package/dist/checkDeps.cjs +0 -271
- package/dist/constants.cjs +0 -51
- package/dist/exports.cjs +0 -48
- package/dist/extractor/accessSafe.cjs +0 -48
- package/dist/extractor/babelParse.cjs +0 -56
- package/dist/extractor/buildClassName.cjs +0 -86
- package/dist/extractor/bundle.cjs +0 -234
- package/dist/extractor/bundleConfig.cjs +0 -729
- package/dist/extractor/concatClassName.cjs +0 -129
- package/dist/extractor/createEvaluator.cjs +0 -88
- package/dist/extractor/createExtractor.cjs +0 -1968
- package/dist/extractor/createLogger.cjs +0 -50
- package/dist/extractor/detectModuleFormat.cjs +0 -55
- package/dist/extractor/ensureImportingConcat.cjs +0 -54
- package/dist/extractor/errors.cjs +0 -28
- package/dist/extractor/esbuildAliasPlugin.cjs +0 -56
- package/dist/extractor/esbuildTsconfigPaths.cjs +0 -108
- package/dist/extractor/evaluateAstNode.cjs +0 -128
- package/dist/extractor/extractHelpers.cjs +0 -182
- package/dist/extractor/extractMediaStyle.cjs +0 -169
- package/dist/extractor/extractToClassNames.cjs +0 -475
- package/dist/extractor/extractToNative.cjs +0 -369
- package/dist/extractor/findTopmostFunction.cjs +0 -43
- package/dist/extractor/generatedUid.cjs +0 -58
- package/dist/extractor/getPrefixLogs.cjs +0 -31
- package/dist/extractor/getPropValueFromAttributes.cjs +0 -85
- package/dist/extractor/getSourceModule.cjs +0 -100
- package/dist/extractor/getStaticBindingsForScope.cjs +0 -213
- package/dist/extractor/getTamaguiConfigPathFromOptionsConfig.cjs +0 -41
- package/dist/extractor/hasTopLevelAwait.cjs +0 -62
- package/dist/extractor/hoistClassNames.cjs +0 -76
- package/dist/extractor/literalToAst.cjs +0 -109
- package/dist/extractor/loadFile.cjs +0 -17
- package/dist/extractor/loadTamagui.cjs +0 -373
- package/dist/extractor/logLines.cjs +0 -43
- package/dist/extractor/normalizeTernaries.cjs +0 -100
- package/dist/extractor/propsToFontFamilyCache.cjs +0 -42
- package/dist/extractor/regenerateConfig.cjs +0 -178
- package/dist/extractor/removeUnusedHooks.cjs +0 -108
- package/dist/extractor/timer.cjs +0 -52
- package/dist/extractor/validHTMLAttributes.cjs +0 -79
- package/dist/extractor/watchTamaguiConfig.cjs +0 -70
- package/dist/getPragmaOptions.cjs +0 -73
- package/dist/helpers/memoize.cjs +0 -45
- package/dist/helpers/requireTamaguiCore.cjs +0 -40
- package/dist/index.cjs +0 -42
- package/dist/registerRequire.cjs +0 -209
- package/dist/server.cjs +0 -82
- package/dist/types.cjs +0 -18
- package/dist/worker.cjs +0 -111
- package/src/extractor/accessSafe.ts +0 -22
- package/src/extractor/babelParse.ts +0 -38
- package/src/extractor/buildClassName.ts +0 -76
- package/src/extractor/createEvaluator.ts +0 -82
- package/src/extractor/createExtractor.ts +0 -2970
- package/src/extractor/createLogger.ts +0 -41
- package/src/extractor/ensureImportingConcat.ts +0 -36
- package/src/extractor/errors.ts +0 -1
- package/src/extractor/evaluateAstNode.ts +0 -136
- package/src/extractor/extractHelpers.ts +0 -211
- package/src/extractor/extractMediaStyle.ts +0 -194
- package/src/extractor/extractToClassNames.ts +0 -733
- package/src/extractor/extractToNative.ts +0 -506
- package/src/extractor/findTopmostFunction.ts +0 -24
- package/src/extractor/generatedUid.ts +0 -41
- package/src/extractor/getPrefixLogs.ts +0 -9
- package/src/extractor/getPropValueFromAttributes.ts +0 -95
- package/src/extractor/getSourceModule.ts +0 -96
- package/src/extractor/getStaticBindingsForScope.ts +0 -237
- package/src/extractor/hasTopLevelAwait.ts +0 -28
- package/src/extractor/hoistClassNames.ts +0 -52
- package/src/extractor/literalToAst.ts +0 -85
- package/src/extractor/loadFile.ts +0 -17
- package/src/extractor/logLines.ts +0 -16
- package/src/extractor/normalizeTernaries.ts +0 -89
- package/src/extractor/propsToFontFamilyCache.ts +0 -18
- package/src/extractor/removeUnusedHooks.ts +0 -83
- package/src/extractor/timer.ts +0 -25
- package/src/extractor/validHTMLAttributes.ts +0 -52
- package/src/worker.ts +0 -142
- package/types/extractor/accessSafe.d.ts +0 -3
- package/types/extractor/accessSafe.d.ts.map +0 -1
- package/types/extractor/babelParse.d.ts +0 -5
- package/types/extractor/babelParse.d.ts.map +0 -1
- package/types/extractor/buildClassName.d.ts +0 -7
- package/types/extractor/buildClassName.d.ts.map +0 -1
- package/types/extractor/createEvaluator.d.ts +0 -12
- package/types/extractor/createEvaluator.d.ts.map +0 -1
- package/types/extractor/createExtractor.d.ts +0 -32
- package/types/extractor/createExtractor.d.ts.map +0 -1
- package/types/extractor/createLogger.d.ts +0 -3
- package/types/extractor/createLogger.d.ts.map +0 -1
- package/types/extractor/ensureImportingConcat.d.ts +0 -4
- package/types/extractor/ensureImportingConcat.d.ts.map +0 -1
- package/types/extractor/errors.d.ts +0 -3
- package/types/extractor/errors.d.ts.map +0 -1
- package/types/extractor/evaluateAstNode.d.ts +0 -3
- package/types/extractor/evaluateAstNode.d.ts.map +0 -1
- package/types/extractor/extractHelpers.d.ts +0 -28
- package/types/extractor/extractHelpers.d.ts.map +0 -1
- package/types/extractor/extractMediaStyle.d.ts +0 -11
- package/types/extractor/extractMediaStyle.d.ts.map +0 -1
- package/types/extractor/extractToClassNames.d.ts +0 -25
- package/types/extractor/extractToClassNames.d.ts.map +0 -1
- package/types/extractor/extractToNative.d.ts +0 -13
- package/types/extractor/extractToNative.d.ts.map +0 -1
- package/types/extractor/findTopmostFunction.d.ts +0 -4
- package/types/extractor/findTopmostFunction.d.ts.map +0 -1
- package/types/extractor/generatedUid.d.ts +0 -5
- package/types/extractor/generatedUid.d.ts.map +0 -1
- package/types/extractor/getPrefixLogs.d.ts +0 -3
- package/types/extractor/getPrefixLogs.d.ts.map +0 -1
- package/types/extractor/getPropValueFromAttributes.d.ts +0 -19
- package/types/extractor/getPropValueFromAttributes.d.ts.map +0 -1
- package/types/extractor/getSourceModule.d.ts +0 -16
- package/types/extractor/getSourceModule.d.ts.map +0 -1
- package/types/extractor/getStaticBindingsForScope.d.ts +0 -5
- package/types/extractor/getStaticBindingsForScope.d.ts.map +0 -1
- package/types/extractor/hasTopLevelAwait.d.ts +0 -2
- package/types/extractor/hasTopLevelAwait.d.ts.map +0 -1
- package/types/extractor/hoistClassNames.d.ts +0 -6
- package/types/extractor/hoistClassNames.d.ts.map +0 -1
- package/types/extractor/literalToAst.d.ts +0 -4
- package/types/extractor/literalToAst.d.ts.map +0 -1
- package/types/extractor/loadFile.d.ts +0 -1
- package/types/extractor/loadFile.d.ts.map +0 -1
- package/types/extractor/logLines.d.ts +0 -2
- package/types/extractor/logLines.d.ts.map +0 -1
- package/types/extractor/normalizeTernaries.d.ts +0 -5
- package/types/extractor/normalizeTernaries.d.ts.map +0 -1
- package/types/extractor/propsToFontFamilyCache.d.ts +0 -4
- package/types/extractor/propsToFontFamilyCache.d.ts.map +0 -1
- package/types/extractor/removeUnusedHooks.d.ts +0 -3
- package/types/extractor/removeUnusedHooks.d.ts.map +0 -1
- package/types/extractor/timer.d.ts +0 -5
- package/types/extractor/timer.d.ts.map +0 -1
- package/types/extractor/validHTMLAttributes.d.ts +0 -52
- package/types/extractor/validHTMLAttributes.d.ts.map +0 -1
- package/types/worker.d.ts +0 -46
- package/types/worker.d.ts.map +0 -1
- /package/dist/{setup.cjs → cjs/setup.cjs} +0 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { resolveZeroRuntimeSync } from "./options.mjs";
|
|
5
|
+
|
|
6
|
+
const hashCSS = (css) => createHash("sha256").update(css).digest("hex").slice(0, 16);
|
|
7
|
+
const normalize = (value) => value.split(/[?#]/, 1)[0].replace(/\\/g, "/");
|
|
8
|
+
const declaresRuntimeThemeMutation = () => process.env.TAMAGUI_DOES_SSR_CSS === "mutates-themes";
|
|
9
|
+
function resolveGlobalCSSOwnership(options, root) {
|
|
10
|
+
if (options.disable) return null;
|
|
11
|
+
if (options.platform === "native") return null;
|
|
12
|
+
if (!options.outputCSS) return null;
|
|
13
|
+
if (declaresRuntimeThemeMutation()) return null;
|
|
14
|
+
if (resolveZeroRuntimeSync(options, root).mode === "enforce") return null;
|
|
15
|
+
return { cssPath: path.isAbsolute(options.outputCSS) ? options.outputCSS : path.resolve(root, options.outputCSS) };
|
|
16
|
+
}
|
|
17
|
+
function checkGlobalCSSArtifact(input) {
|
|
18
|
+
const { cssPath, expectedCSS } = input;
|
|
19
|
+
let onDisk;
|
|
20
|
+
try {
|
|
21
|
+
onDisk = readFileSync(cssPath, "utf8");
|
|
22
|
+
} catch {
|
|
23
|
+
return {
|
|
24
|
+
kind: "missing",
|
|
25
|
+
cssPath,
|
|
26
|
+
message: `[tamagui] the generated CSS artifact ${cssPath} does not exist, so this build cannot claim TAMAGUI_DID_OUTPUT_CSS. The design-system, :root, font and theme rules would be stripped from JavaScript and put nowhere.`
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
if (onDisk !== expectedCSS) {
|
|
30
|
+
return {
|
|
31
|
+
kind: "stale",
|
|
32
|
+
cssPath,
|
|
33
|
+
message: `[tamagui] the generated CSS artifact ${cssPath} is stale: it hashes ${hashCSS(onDisk)} but this build's config generates ${hashCSS(expectedCSS)}. Deriving TAMAGUI_DID_OUTPUT_CSS from it would ship rules that do not match the build.`
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
const wanted = normalize(cssPath);
|
|
37
|
+
for (const id of input.loadedModuleIds) {
|
|
38
|
+
if (normalize(id) === wanted) return null;
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
kind: "unimported",
|
|
42
|
+
cssPath,
|
|
43
|
+
message: `[tamagui] the generated CSS artifact ${cssPath} exists but the entry graph never loads it. ${input.importHint}`
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { checkGlobalCSSArtifact, declaresRuntimeThemeMutation, hashCSS, resolveGlobalCSSOwnership };
|
|
48
|
+
//# sourceMappingURL=ownership.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ownership.js","names":[],"sources":["esm/zero/ownership.js"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { resolveZeroRuntimeSync } from \"./options\";\nconst hashCSS = (css) => createHash(\"sha256\").update(css).digest(\"hex\").slice(0, 16);\nconst normalize = (value) => value.split(/[?#]/, 1)[0].replace(/\\\\/g, \"/\");\nconst declaresRuntimeThemeMutation = () => process.env.TAMAGUI_DOES_SSR_CSS === \"mutates-themes\";\nfunction resolveGlobalCSSOwnership(options, root) {\n if (options.disable) return null;\n if (options.platform === \"native\") return null;\n if (!options.outputCSS) return null;\n if (declaresRuntimeThemeMutation()) return null;\n if (resolveZeroRuntimeSync(options, root).mode === \"enforce\") return null;\n return {\n cssPath: path.isAbsolute(options.outputCSS) ? options.outputCSS : path.resolve(root, options.outputCSS)\n };\n}\nfunction checkGlobalCSSArtifact(input) {\n const { cssPath, expectedCSS } = input;\n let onDisk;\n try {\n onDisk = readFileSync(cssPath, \"utf8\");\n } catch {\n return {\n kind: \"missing\",\n cssPath,\n message: `[tamagui] the generated CSS artifact ${cssPath} does not exist, so this build cannot claim TAMAGUI_DID_OUTPUT_CSS. The design-system, :root, font and theme rules would be stripped from JavaScript and put nowhere.`\n };\n }\n if (onDisk !== expectedCSS) {\n return {\n kind: \"stale\",\n cssPath,\n message: `[tamagui] the generated CSS artifact ${cssPath} is stale: it hashes ${hashCSS(\n onDisk\n )} but this build's config generates ${hashCSS(\n expectedCSS\n )}. Deriving TAMAGUI_DID_OUTPUT_CSS from it would ship rules that do not match the build.`\n };\n }\n const wanted = normalize(cssPath);\n for (const id of input.loadedModuleIds) {\n if (normalize(id) === wanted) return null;\n }\n return {\n kind: \"unimported\",\n cssPath,\n message: `[tamagui] the generated CSS artifact ${cssPath} exists but the entry graph never loads it. ${input.importHint}`\n };\n}\nexport {\n checkGlobalCSSArtifact,\n declaresRuntimeThemeMutation,\n hashCSS,\n resolveGlobalCSSOwnership\n};\n//# sourceMappingURL=ownership.js.map\n"],"mappings":";;;;;;AAIA,MAAM,WAAW,QAAQ,WAAW,QAAQ,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,EAAE;AACnF,MAAM,aAAa,UAAU,MAAM,MAAM,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,OAAO,GAAG;AACzE,MAAM,qCAAqC,QAAQ,IAAI,yBAAyB;AAChF,SAAS,0BAA0B,SAAS,MAAM;CAChD,IAAI,QAAQ,SAAS,OAAO;CAC5B,IAAI,QAAQ,aAAa,UAAU,OAAO;CAC1C,IAAI,CAAC,QAAQ,WAAW,OAAO;CAC/B,IAAI,6BAA6B,GAAG,OAAO;CAC3C,IAAI,uBAAuB,SAAS,IAAI,CAAC,CAAC,SAAS,WAAW,OAAO;CACrE,OAAO,EACL,SAAS,KAAK,WAAW,QAAQ,SAAS,IAAI,QAAQ,YAAY,KAAK,QAAQ,MAAM,QAAQ,SAAS,EACxG;AACF;AACA,SAAS,uBAAuB,OAAO;CACrC,MAAM,EAAE,SAAS,gBAAgB;CACjC,IAAI;CACJ,IAAI;EACF,SAAS,aAAa,SAAS,MAAM;CACvC,QAAQ;EACN,OAAO;GACL,MAAM;GACN;GACA,SAAS,wCAAwC,QAAQ;EAC3D;CACF;CACA,IAAI,WAAW,aAAa;EAC1B,OAAO;GACL,MAAM;GACN;GACA,SAAS,wCAAwC,QAAQ,uBAAuB,QAC9E,MACF,EAAE,qCAAqC,QACrC,WACF,EAAE;EACJ;CACF;CACA,MAAM,SAAS,UAAU,OAAO;CAChC,KAAK,MAAM,MAAM,MAAM,iBAAiB;EACtC,IAAI,UAAU,EAAE,MAAM,QAAQ,OAAO;CACvC;CACA,OAAO;EACL,MAAM;EACN;EACA,SAAS,wCAAwC,QAAQ,8CAA8C,MAAM;CAC/G;AACF"}
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { childNode, childNodes, resolvedModuleId, walkAst, zeroRuleMessage } from "@tamagui/compiler-core";
|
|
2
|
+
import { getThemeClassNames, getThemeScheme, reservedThemeProps } from "@tamagui/helpers";
|
|
3
|
+
import { resolveThemeName, variableToString } from "@tamagui/web";
|
|
4
|
+
import { getInlineValuesFromProps, getVariablesCSSRules } from "@tamagui/web/theme-update";
|
|
5
|
+
|
|
6
|
+
const MAX_THEME_BRANCHES = 8;
|
|
7
|
+
const LOWERABLE_RESERVED_PROPS = /* @__PURE__ */ new Set(["name", "contain"]);
|
|
8
|
+
function jsxAttributeName(attribute) {
|
|
9
|
+
const name = childNode(attribute, "name");
|
|
10
|
+
return name && typeof name.name === "string" ? name.name : null;
|
|
11
|
+
}
|
|
12
|
+
function literalOf(node) {
|
|
13
|
+
if (!node) return void 0;
|
|
14
|
+
if (node.type === "Literal" && typeof node.value !== "object") {
|
|
15
|
+
return node.value;
|
|
16
|
+
}
|
|
17
|
+
return void 0;
|
|
18
|
+
}
|
|
19
|
+
function hasSideEffects(node) {
|
|
20
|
+
let found = false;
|
|
21
|
+
walkAst(node, (child) => {
|
|
22
|
+
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") {
|
|
23
|
+
found = true;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
return found;
|
|
27
|
+
}
|
|
28
|
+
function readNameOptions(value, source, guards) {
|
|
29
|
+
const literal = literalOf(value);
|
|
30
|
+
if (typeof literal === "string") {
|
|
31
|
+
return [{
|
|
32
|
+
test: guards.length ? guards.join(" && ") : null,
|
|
33
|
+
name: literal
|
|
34
|
+
}];
|
|
35
|
+
}
|
|
36
|
+
if (value.type === "ConditionalExpression") {
|
|
37
|
+
const test = childNode(value, "test");
|
|
38
|
+
const consequent = childNode(value, "consequent");
|
|
39
|
+
const alternate = childNode(value, "alternate");
|
|
40
|
+
if (!test || !consequent || !alternate) return null;
|
|
41
|
+
if (hasSideEffects(test)) return null;
|
|
42
|
+
const testText = source.slice(test.start, test.end).replace(/\s+/g, " ").trim();
|
|
43
|
+
const left = readNameOptions(consequent, source, [...guards, `(${testText})`]);
|
|
44
|
+
const right = readNameOptions(alternate, source, [...guards, `!(${testText})`]);
|
|
45
|
+
if (!left || !right) return null;
|
|
46
|
+
return [...left, ...right];
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
function foldBranches(branches) {
|
|
51
|
+
const last = branches[branches.length - 1];
|
|
52
|
+
if (new Set(branches.map((branch) => branch.value)).size === 1) return last.value;
|
|
53
|
+
let expression = last.value;
|
|
54
|
+
for (let index = branches.length - 2; index >= 0; index--) {
|
|
55
|
+
const branch = branches[index];
|
|
56
|
+
expression = branch.test === null ? branch.value : `${branch.test} ? ${branch.value} : ${expression}`;
|
|
57
|
+
}
|
|
58
|
+
return expression;
|
|
59
|
+
}
|
|
60
|
+
function resolveThemeChain(chain, rootThemeName, config) {
|
|
61
|
+
let branches = [{
|
|
62
|
+
test: null,
|
|
63
|
+
name: rootThemeName,
|
|
64
|
+
isNew: false,
|
|
65
|
+
schemeAuthored: false
|
|
66
|
+
}];
|
|
67
|
+
for (const node of chain) {
|
|
68
|
+
const next = [];
|
|
69
|
+
for (const parent of branches) {
|
|
70
|
+
for (const option of node.options) {
|
|
71
|
+
const resolved = resolveThemeName(parent.name, option.name, config.themes);
|
|
72
|
+
const schemeAuthored = parent.schemeAuthored || Boolean(option.name && getThemeScheme(option.name) && option.name in config.themes);
|
|
73
|
+
const tests = [parent.test, option.test].filter(Boolean);
|
|
74
|
+
next.push({
|
|
75
|
+
test: tests.length ? tests.join(" && ") : null,
|
|
76
|
+
name: resolved ?? parent.name,
|
|
77
|
+
isNew: resolved !== null || schemeAuthored !== parent.schemeAuthored,
|
|
78
|
+
schemeAuthored
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
branches = next;
|
|
83
|
+
}
|
|
84
|
+
return branches;
|
|
85
|
+
}
|
|
86
|
+
function readStaticTheme(element, id, source, config, kind = "Theme") {
|
|
87
|
+
const moduleId = resolvedModuleId(id);
|
|
88
|
+
const violations = [];
|
|
89
|
+
const css = /* @__PURE__ */ new Map();
|
|
90
|
+
const opening = childNode(element, "openingElement");
|
|
91
|
+
const closing = childNode(element, "closingElement");
|
|
92
|
+
const span = (node) => ({
|
|
93
|
+
id: moduleId,
|
|
94
|
+
start: node.start,
|
|
95
|
+
end: node.end
|
|
96
|
+
});
|
|
97
|
+
let options = [{
|
|
98
|
+
test: null,
|
|
99
|
+
name: void 0
|
|
100
|
+
}];
|
|
101
|
+
let contain = false;
|
|
102
|
+
const themeKeyProps = {};
|
|
103
|
+
for (const attribute of childNodes(opening, "attributes")) {
|
|
104
|
+
if (attribute.type !== "JSXAttribute") {
|
|
105
|
+
violations.push({
|
|
106
|
+
rule: 1,
|
|
107
|
+
code: "local/unsafe-style-spread",
|
|
108
|
+
span: span(attribute),
|
|
109
|
+
component: kind,
|
|
110
|
+
message: zeroRuleMessage(1, { component: kind })
|
|
111
|
+
});
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
const key = jsxAttributeName(attribute);
|
|
115
|
+
if (!key) continue;
|
|
116
|
+
const rawValue = childNode(attribute, "value");
|
|
117
|
+
const value = rawValue && rawValue.type === "JSXExpressionContainer" ? childNode(rawValue, "expression") : rawValue;
|
|
118
|
+
if (kind === "ThemeUpdate" && reservedThemeProps[key]) {
|
|
119
|
+
violations.push({
|
|
120
|
+
rule: 4,
|
|
121
|
+
code: "local/unsupported-target",
|
|
122
|
+
span: span(attribute),
|
|
123
|
+
component: kind,
|
|
124
|
+
message: zeroRuleMessage(4, { detail: `the <ThemeUpdate ${key}> prop, which belongs on <Theme>,` })
|
|
125
|
+
});
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (kind === "Theme" && key === "name") {
|
|
129
|
+
const read = value ? readNameOptions(value, source, []) : null;
|
|
130
|
+
if (!read) {
|
|
131
|
+
violations.push({
|
|
132
|
+
rule: 4,
|
|
133
|
+
code: "local/unsupported-target",
|
|
134
|
+
span: span(attribute),
|
|
135
|
+
component: "Theme",
|
|
136
|
+
message: zeroRuleMessage(4, { 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,` })
|
|
137
|
+
});
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
options = read;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (kind === "Theme" && reservedThemeProps[key]) {
|
|
144
|
+
if (!LOWERABLE_RESERVED_PROPS.has(key)) {
|
|
145
|
+
violations.push({
|
|
146
|
+
rule: 4,
|
|
147
|
+
code: "local/unsupported-target",
|
|
148
|
+
span: span(attribute),
|
|
149
|
+
component: "Theme",
|
|
150
|
+
message: zeroRuleMessage(4, { detail: `the <Theme ${key}> prop, which has no compiled form,` })
|
|
151
|
+
});
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
const literal2 = value ? literalOf(value) : true;
|
|
155
|
+
if (typeof literal2 !== "boolean") {
|
|
156
|
+
violations.push({
|
|
157
|
+
rule: 4,
|
|
158
|
+
code: "local/unsupported-target",
|
|
159
|
+
span: span(attribute),
|
|
160
|
+
component: "Theme",
|
|
161
|
+
message: zeroRuleMessage(4, { detail: `a non-literal <Theme ${key}> value,` })
|
|
162
|
+
});
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (key === "contain") contain = literal2;
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
if (kind === "Theme") {
|
|
169
|
+
violations.push({
|
|
170
|
+
rule: 4,
|
|
171
|
+
code: "local/unsupported-target",
|
|
172
|
+
span: span(attribute),
|
|
173
|
+
component: "Theme",
|
|
174
|
+
message: zeroRuleMessage(4, { detail: `the removed <Theme ${key}> inline-value spelling. Use <ThemeUpdate ${key}> around the subtree instead,` })
|
|
175
|
+
});
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const literal = value ? literalOf(value) : void 0;
|
|
179
|
+
if (typeof literal !== "string" && typeof literal !== "number") {
|
|
180
|
+
violations.push({
|
|
181
|
+
rule: 3,
|
|
182
|
+
code: "local/dynamic-style-value",
|
|
183
|
+
span: span(attribute),
|
|
184
|
+
component: kind,
|
|
185
|
+
message: zeroRuleMessage(3, {
|
|
186
|
+
prop: key,
|
|
187
|
+
component: kind,
|
|
188
|
+
detail: value ? "a theme value must be a string or number literal at build time" : "a theme key needs a value"
|
|
189
|
+
})
|
|
190
|
+
});
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
themeKeyProps[key] = literal;
|
|
194
|
+
}
|
|
195
|
+
if (!closing) {
|
|
196
|
+
violations.push({
|
|
197
|
+
rule: 4,
|
|
198
|
+
code: "local/unsupported-target",
|
|
199
|
+
span: span(element),
|
|
200
|
+
component: "Theme",
|
|
201
|
+
message: zeroRuleMessage(4, { detail: `a self-closing <${kind}>, which has no subtree to theme,` })
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
const issues = [];
|
|
205
|
+
const themeUpdateConfig = config;
|
|
206
|
+
const inlineValues = kind === "ThemeUpdate" && Object.keys(themeKeyProps).length ? getInlineValuesFromProps(themeKeyProps, themeUpdateConfig, (issue) => issues.push(issue)) : null;
|
|
207
|
+
for (const issue of issues) {
|
|
208
|
+
violations.push({
|
|
209
|
+
rule: 3,
|
|
210
|
+
code: "local/dynamic-style-value",
|
|
211
|
+
span: span(opening),
|
|
212
|
+
component: kind,
|
|
213
|
+
message: zeroRuleMessage(3, {
|
|
214
|
+
prop: issue.key,
|
|
215
|
+
component: kind,
|
|
216
|
+
detail: issue.message
|
|
217
|
+
})
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
const inlineCSS = inlineValues ? getVariablesCSSRules(inlineValues, themeUpdateConfig) : null;
|
|
221
|
+
if (inlineCSS) css.set(inlineCSS.identifier, inlineCSS.rules.join(""));
|
|
222
|
+
if (violations.length) return {
|
|
223
|
+
node: null,
|
|
224
|
+
violations,
|
|
225
|
+
css
|
|
226
|
+
};
|
|
227
|
+
return {
|
|
228
|
+
node: {
|
|
229
|
+
kind,
|
|
230
|
+
element,
|
|
231
|
+
opening,
|
|
232
|
+
closing,
|
|
233
|
+
options,
|
|
234
|
+
contain,
|
|
235
|
+
layer: inlineValues && inlineCSS ? {
|
|
236
|
+
inlineValues,
|
|
237
|
+
inlineClassName: inlineCSS.identifier
|
|
238
|
+
} : null
|
|
239
|
+
},
|
|
240
|
+
violations,
|
|
241
|
+
css
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
function lowerStaticTheme(node, chain, rootThemeName, config, id) {
|
|
245
|
+
const moduleId = resolvedModuleId(id);
|
|
246
|
+
const branches = resolveThemeChain(chain, rootThemeName, config);
|
|
247
|
+
if (branches.length > MAX_THEME_BRANCHES) {
|
|
248
|
+
return {
|
|
249
|
+
edits: [],
|
|
250
|
+
violations: [{
|
|
251
|
+
rule: 4,
|
|
252
|
+
code: "local/unsupported-target",
|
|
253
|
+
span: {
|
|
254
|
+
id: moduleId,
|
|
255
|
+
start: node.element.start,
|
|
256
|
+
end: node.element.end
|
|
257
|
+
},
|
|
258
|
+
component: "Theme",
|
|
259
|
+
message: zeroRuleMessage(4, { detail: `a <Theme> chain that enumerates ${branches.length} theme names, past the ${MAX_THEME_BRANCHES} this lowers,` })
|
|
260
|
+
}]
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
const inlineClass = node.layer?.inlineClassName ?? "";
|
|
264
|
+
const classBranches = branches.map((branch) => ({
|
|
265
|
+
test: branch.test,
|
|
266
|
+
value: JSON.stringify([
|
|
267
|
+
branch.isNew ? getThemeClassNames(branch.name, false, branch.schemeAuthored) : "",
|
|
268
|
+
"is_Theme",
|
|
269
|
+
inlineClass
|
|
270
|
+
].filter(Boolean).join(" ").replace(/\s+/g, " ").trim())
|
|
271
|
+
}));
|
|
272
|
+
const baseStyle = node.contain ? `display:"contents",contain:"strict"` : `display:"contents"`;
|
|
273
|
+
const styleBranches = branches.map((branch) => {
|
|
274
|
+
const theme = config.themes[branch.name];
|
|
275
|
+
const color = branch.isNew && theme ? variableToString(theme.color) : "";
|
|
276
|
+
return {
|
|
277
|
+
test: branch.test,
|
|
278
|
+
value: color ? `{color:${JSON.stringify(color)},${baseStyle}}` : `{${baseStyle}}`
|
|
279
|
+
};
|
|
280
|
+
});
|
|
281
|
+
const className = foldBranches(classBranches);
|
|
282
|
+
const style = foldBranches(styleBranches);
|
|
283
|
+
const classAttribute = className.startsWith("\"") ? `className=${className}` : `className={${className}}`;
|
|
284
|
+
const edits = [{
|
|
285
|
+
start: node.opening.start,
|
|
286
|
+
end: node.opening.end,
|
|
287
|
+
content: `<span ${classAttribute} style={${style}}>`,
|
|
288
|
+
origin: {
|
|
289
|
+
id: moduleId,
|
|
290
|
+
start: node.opening.start,
|
|
291
|
+
end: node.opening.end
|
|
292
|
+
}
|
|
293
|
+
}];
|
|
294
|
+
if (node.closing) {
|
|
295
|
+
edits.push({
|
|
296
|
+
start: node.closing.start,
|
|
297
|
+
end: node.closing.end,
|
|
298
|
+
content: `</span>`,
|
|
299
|
+
origin: {
|
|
300
|
+
id: moduleId,
|
|
301
|
+
start: node.closing.start,
|
|
302
|
+
end: node.closing.end
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
return {
|
|
307
|
+
edits,
|
|
308
|
+
violations: []
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
export { foldBranches, lowerStaticTheme, readStaticTheme, resolveThemeChain };
|
|
313
|
+
//# sourceMappingURL=theme.mjs.map
|
|
@@ -0,0 +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, getThemeScheme, 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 = [\n { test: null, name: rootThemeName, isNew: false, schemeAuthored: false }\n ];\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 schemeAuthored = parent.schemeAuthored || Boolean(\n option.name && getThemeScheme(option.name) && option.name in 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 // a node that pins a scheme its parent had only inherited is its own\n // scope even when the resolved name is unchanged, because it is the\n // node that emits the pinned class\n isNew: resolved !== null || schemeAuthored !== parent.schemeAuthored,\n schemeAuthored\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 [\n branch.isNew ? getThemeClassNames(branch.name, false, branch.schemeAuthored) : \"\",\n \"is_Theme\",\n inlineClass\n ].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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"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { applyLoweredModule, childNode, childNodes, parseModuleAst, planZeroErasure, resolvedModuleId, walkAst, zeroIslandThemeMessage, zeroViolationsFromPlan } from "@tamagui/compiler-core";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { foldBranches, lowerStaticTheme, readStaticTheme, resolveThemeChain } from "./theme.mjs";
|
|
5
|
+
|
|
6
|
+
function identifierNameOf(node) {
|
|
7
|
+
return node && node.type === "Identifier" && typeof node.name === "string" ? node.name : null;
|
|
8
|
+
}
|
|
9
|
+
function jsxNameOf(element) {
|
|
10
|
+
const opening = childNode(element, "openingElement");
|
|
11
|
+
if (!opening) return null;
|
|
12
|
+
const name = childNode(opening, "name");
|
|
13
|
+
return name && name.type === "JSXIdentifier" && typeof name.name === "string" ? name.name : null;
|
|
14
|
+
}
|
|
15
|
+
function transformZeroModule(input) {
|
|
16
|
+
const { id, source, config } = input;
|
|
17
|
+
const moduleId = resolvedModuleId(id);
|
|
18
|
+
const program = parseModuleAst(source, id);
|
|
19
|
+
const violations = zeroViolationsFromPlan(input.plan);
|
|
20
|
+
const edits = [];
|
|
21
|
+
const bridges = /* @__PURE__ */ new Map();
|
|
22
|
+
const bridgeCSS = /* @__PURE__ */ new Map();
|
|
23
|
+
let themeLocal = null;
|
|
24
|
+
let themeUpdateLocal = null;
|
|
25
|
+
const islandLocals = /* @__PURE__ */ new Map();
|
|
26
|
+
for (const statement of childNodes(program, "body")) {
|
|
27
|
+
if (statement.type !== "ImportDeclaration") continue;
|
|
28
|
+
const sourceNode = childNode(statement, "source");
|
|
29
|
+
const specifier = sourceNode && typeof sourceNode.value === "string" ? sourceNode.value : null;
|
|
30
|
+
if (!specifier) continue;
|
|
31
|
+
const island = input.resolveIslandLoader(specifier);
|
|
32
|
+
for (const importSpecifier of childNodes(statement, "specifiers")) {
|
|
33
|
+
const local = identifierNameOf(childNode(importSpecifier, "local"));
|
|
34
|
+
if (!local) continue;
|
|
35
|
+
if (island) {
|
|
36
|
+
islandLocals.set(local, island.islandId);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (!input.isTamaguiSpecifier(specifier)) continue;
|
|
40
|
+
const imported = childNode(importSpecifier, "imported");
|
|
41
|
+
if (imported && imported.name === "Theme") themeLocal = local;
|
|
42
|
+
if (imported && imported.name === "ThemeUpdate") themeUpdateLocal = local;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const parents = /* @__PURE__ */ new Map();
|
|
46
|
+
const elements = [];
|
|
47
|
+
walkAst(program, (node, parent) => {
|
|
48
|
+
if (parent) parents.set(node, parent);
|
|
49
|
+
if (node.type === "JSXElement") elements.push(node);
|
|
50
|
+
});
|
|
51
|
+
const themeElements = elements.filter((element) => {
|
|
52
|
+
const name = jsxNameOf(element);
|
|
53
|
+
return name === themeLocal || name === themeUpdateLocal;
|
|
54
|
+
});
|
|
55
|
+
const themeNodes = /* @__PURE__ */ new Map();
|
|
56
|
+
for (const element of themeElements) {
|
|
57
|
+
const read = readStaticTheme(element, id, source, config, jsxNameOf(element) === themeUpdateLocal ? "ThemeUpdate" : "Theme");
|
|
58
|
+
for (const [identifier, rules] of read.css) bridgeCSS.set(identifier, rules);
|
|
59
|
+
violations.push(...read.violations);
|
|
60
|
+
if (read.node) themeNodes.set(element, read.node);
|
|
61
|
+
}
|
|
62
|
+
const themeChainOf = (element) => {
|
|
63
|
+
const chain = [];
|
|
64
|
+
let cursor = element;
|
|
65
|
+
while (cursor) {
|
|
66
|
+
const node = themeNodes.get(cursor);
|
|
67
|
+
if (node) chain.unshift(node);
|
|
68
|
+
cursor = parents.get(cursor);
|
|
69
|
+
}
|
|
70
|
+
return chain;
|
|
71
|
+
};
|
|
72
|
+
const rootThemeName = Object.keys(config.themes)[0] ?? "light";
|
|
73
|
+
for (const element of themeElements) {
|
|
74
|
+
const node = themeNodes.get(element);
|
|
75
|
+
if (!node) continue;
|
|
76
|
+
const lowered = lowerStaticTheme(node, themeChainOf(element), rootThemeName, config, id);
|
|
77
|
+
violations.push(...lowered.violations);
|
|
78
|
+
edits.push(...lowered.edits);
|
|
79
|
+
}
|
|
80
|
+
const mounts = elements.filter((element) => {
|
|
81
|
+
const name = jsxNameOf(element);
|
|
82
|
+
return !!name && islandLocals.has(name);
|
|
83
|
+
}).sort((left, right) => left.start - right.start);
|
|
84
|
+
const moduleBridgePrefix = createHash("sha256").update(path.relative(input.root, id).replace(/\\/g, "/")).digest("hex").slice(0, 8);
|
|
85
|
+
const loweredRanges = input.plan.edits.filter((edit) => edit.end > edit.start);
|
|
86
|
+
const isOpaqueAncestor = (element) => {
|
|
87
|
+
if (themeNodes.has(element)) return false;
|
|
88
|
+
const name = jsxNameOf(element);
|
|
89
|
+
if (!name || islandLocals.has(name)) return false;
|
|
90
|
+
if (name[0] !== name[0].toUpperCase()) return false;
|
|
91
|
+
const nameNode = childNode(childNode(element, "openingElement"), "name");
|
|
92
|
+
return !loweredRanges.some((edit) => edit.start <= nameNode.start && edit.end >= nameNode.end);
|
|
93
|
+
};
|
|
94
|
+
mounts.forEach((element, index) => {
|
|
95
|
+
const islandId = islandLocals.get(jsxNameOf(element));
|
|
96
|
+
let opaque = null;
|
|
97
|
+
for (let cursor = parents.get(element); cursor; cursor = parents.get(cursor)) {
|
|
98
|
+
if (cursor.type === "JSXElement" && isOpaqueAncestor(cursor)) opaque = cursor;
|
|
99
|
+
}
|
|
100
|
+
if (opaque) {
|
|
101
|
+
violations.push({
|
|
102
|
+
rule: 4,
|
|
103
|
+
code: "local/unsupported-target",
|
|
104
|
+
span: {
|
|
105
|
+
id: moduleId,
|
|
106
|
+
start: element.start,
|
|
107
|
+
end: element.end
|
|
108
|
+
},
|
|
109
|
+
component: islandId,
|
|
110
|
+
message: zeroIslandThemeMessage(islandId)
|
|
111
|
+
});
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const chain = themeChainOf(element);
|
|
115
|
+
const layers = chain.map((node) => node.layer).filter((layer) => !!layer);
|
|
116
|
+
const branches = resolveThemeChain(chain, rootThemeName, config);
|
|
117
|
+
const descriptors = branches.map((branch, branchIndex) => ({
|
|
118
|
+
test: branch.test,
|
|
119
|
+
bridge: {
|
|
120
|
+
id: branches.length === 1 ? `b${moduleBridgePrefix}_${index}` : `b${moduleBridgePrefix}_${index}_${branchIndex}`,
|
|
121
|
+
name: branch.name,
|
|
122
|
+
layers
|
|
123
|
+
}
|
|
124
|
+
}));
|
|
125
|
+
const list = bridges.get(islandId) ?? [];
|
|
126
|
+
for (const descriptor of descriptors) list.push(descriptor.bridge);
|
|
127
|
+
bridges.set(islandId, list);
|
|
128
|
+
const fold = (value) => foldBranches(descriptors.map((descriptor) => ({
|
|
129
|
+
test: descriptor.test,
|
|
130
|
+
value: value(descriptor.bridge)
|
|
131
|
+
})));
|
|
132
|
+
const opening = childNode(element, "openingElement");
|
|
133
|
+
const nameNode = childNode(opening, "name");
|
|
134
|
+
edits.push({
|
|
135
|
+
start: nameNode.end,
|
|
136
|
+
end: nameNode.end,
|
|
137
|
+
content: ` data-tamagui-bridge={${fold((bridge) => JSON.stringify(bridge.id))}} __tamaguiBridge={${fold((bridge) => JSON.stringify(bridge))}}`,
|
|
138
|
+
origin: {
|
|
139
|
+
id: moduleId,
|
|
140
|
+
start: nameNode.start,
|
|
141
|
+
end: nameNode.end
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
const erasure = violations.length ? null : planZeroErasure({
|
|
146
|
+
id: moduleId,
|
|
147
|
+
source,
|
|
148
|
+
loweredEdits: [...input.plan.edits, ...edits],
|
|
149
|
+
isTamaguiSpecifier: input.isTamaguiSpecifier,
|
|
150
|
+
islandIdFor: input.resolveIslandModule
|
|
151
|
+
});
|
|
152
|
+
if (erasure) {
|
|
153
|
+
edits.push(...erasure.edits);
|
|
154
|
+
violations.push(...erasure.violations);
|
|
155
|
+
}
|
|
156
|
+
const output = input.mode === "report" ? applyLoweredModule(source, moduleId, input.plan) : violations.length ? {
|
|
157
|
+
changed: false,
|
|
158
|
+
code: source,
|
|
159
|
+
map: null
|
|
160
|
+
} : applyLoweredModule(source, moduleId, {
|
|
161
|
+
id: moduleId,
|
|
162
|
+
sourceHash: input.plan.sourceHash,
|
|
163
|
+
edits: [...input.plan.edits, ...edits]
|
|
164
|
+
});
|
|
165
|
+
return {
|
|
166
|
+
output,
|
|
167
|
+
edits: input.mode === "report" ? [] : edits,
|
|
168
|
+
bridges: input.mode === "report" ? /* @__PURE__ */ new Map() : bridges,
|
|
169
|
+
bridgeCSS: input.mode === "report" ? /* @__PURE__ */ new Map() : bridgeCSS,
|
|
170
|
+
violations,
|
|
171
|
+
erased: {
|
|
172
|
+
modules: erasure?.removedModules ?? [],
|
|
173
|
+
bindings: erasure?.removedBindings ?? [],
|
|
174
|
+
styledDefinitions: erasure?.erasedStyledDefinitions ?? [],
|
|
175
|
+
exports: erasure?.erasedExports ?? []
|
|
176
|
+
},
|
|
177
|
+
rewrittenAnimatedNumberHooks: erasure?.rewrittenAnimatedNumberHooks ?? []
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export { transformZeroModule };
|
|
182
|
+
//# sourceMappingURL=transform.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","names":[],"sources":["esm/zero/transform.js"],"sourcesContent":["import {\n applyLoweredModule,\n childNode,\n childNodes,\n parseModuleAst,\n planZeroErasure,\n resolvedModuleId,\n walkAst,\n zeroIslandThemeMessage,\n zeroViolationsFromPlan\n} from \"@tamagui/compiler-core\";\nimport { createHash } from \"node:crypto\";\nimport path from \"node:path\";\nimport {\n foldBranches,\n lowerStaticTheme,\n readStaticTheme,\n resolveThemeChain\n} from \"./theme\";\nfunction identifierNameOf(node) {\n return node && node.type === \"Identifier\" && typeof node.name === \"string\" ? node.name : null;\n}\nfunction jsxNameOf(element) {\n const opening = childNode(element, \"openingElement\");\n if (!opening) return null;\n const name = childNode(opening, \"name\");\n return name && name.type === \"JSXIdentifier\" && typeof name.name === \"string\" ? name.name : null;\n}\nfunction transformZeroModule(input) {\n const { id, source, config } = input;\n const moduleId = resolvedModuleId(id);\n const program = parseModuleAst(source, id);\n const violations = zeroViolationsFromPlan(input.plan);\n const edits = [];\n const bridges = /* @__PURE__ */ new Map();\n const bridgeCSS = /* @__PURE__ */ new Map();\n let themeLocal = null;\n let themeUpdateLocal = null;\n const islandLocals = /* @__PURE__ */ new Map();\n for (const statement of childNodes(program, \"body\")) {\n if (statement.type !== \"ImportDeclaration\") continue;\n const sourceNode = childNode(statement, \"source\");\n const specifier = sourceNode && typeof sourceNode.value === \"string\" ? sourceNode.value : null;\n if (!specifier) continue;\n const island = input.resolveIslandLoader(specifier);\n for (const importSpecifier of childNodes(statement, \"specifiers\")) {\n const local = identifierNameOf(childNode(importSpecifier, \"local\"));\n if (!local) continue;\n if (island) {\n islandLocals.set(local, island.islandId);\n continue;\n }\n if (!input.isTamaguiSpecifier(specifier)) continue;\n const imported = childNode(importSpecifier, \"imported\");\n if (imported && imported.name === \"Theme\") themeLocal = local;\n if (imported && imported.name === \"ThemeUpdate\") themeUpdateLocal = local;\n }\n }\n const parents = /* @__PURE__ */ new Map();\n const elements = [];\n walkAst(program, (node, parent) => {\n if (parent) parents.set(node, parent);\n if (node.type === \"JSXElement\") elements.push(node);\n });\n const themeElements = elements.filter((element) => {\n const name = jsxNameOf(element);\n return name === themeLocal || name === themeUpdateLocal;\n });\n const themeNodes = /* @__PURE__ */ new Map();\n for (const element of themeElements) {\n const read = readStaticTheme(\n element,\n id,\n source,\n config,\n jsxNameOf(element) === themeUpdateLocal ? \"ThemeUpdate\" : \"Theme\"\n );\n for (const [identifier, rules] of read.css) bridgeCSS.set(identifier, rules);\n violations.push(...read.violations);\n if (read.node) themeNodes.set(element, read.node);\n }\n const themeChainOf = (element) => {\n const chain = [];\n let cursor = element;\n while (cursor) {\n const node = themeNodes.get(cursor);\n if (node) chain.unshift(node);\n cursor = parents.get(cursor);\n }\n return chain;\n };\n const rootThemeName = Object.keys(config.themes)[0] ?? \"light\";\n for (const element of themeElements) {\n const node = themeNodes.get(element);\n if (!node) continue;\n const lowered = lowerStaticTheme(\n node,\n themeChainOf(element),\n rootThemeName,\n config,\n id\n );\n violations.push(...lowered.violations);\n edits.push(...lowered.edits);\n }\n const mounts = elements.filter((element) => {\n const name = jsxNameOf(element);\n return !!name && islandLocals.has(name);\n }).sort((left, right) => left.start - right.start);\n const moduleBridgePrefix = createHash(\"sha256\").update(path.relative(input.root, id).replace(/\\\\/g, \"/\")).digest(\"hex\").slice(0, 8);\n const loweredRanges = input.plan.edits.filter((edit) => edit.end > edit.start);\n const isOpaqueAncestor = (element) => {\n if (themeNodes.has(element)) return false;\n const name = jsxNameOf(element);\n if (!name || islandLocals.has(name)) return false;\n if (name[0] !== name[0].toUpperCase()) return false;\n const nameNode = childNode(childNode(element, \"openingElement\"), \"name\");\n return !loweredRanges.some(\n (edit) => edit.start <= nameNode.start && edit.end >= nameNode.end\n );\n };\n mounts.forEach((element, index) => {\n const islandId = islandLocals.get(jsxNameOf(element));\n let opaque = null;\n for (let cursor = parents.get(element); cursor; cursor = parents.get(cursor)) {\n if (cursor.type === \"JSXElement\" && isOpaqueAncestor(cursor)) opaque = cursor;\n }\n if (opaque) {\n violations.push({\n rule: 4,\n code: \"local/unsupported-target\",\n span: { id: moduleId, start: element.start, end: element.end },\n component: islandId,\n message: zeroIslandThemeMessage(islandId)\n });\n return;\n }\n const chain = themeChainOf(element);\n const layers = chain.map((node) => node.layer).filter((layer) => !!layer);\n const branches = resolveThemeChain(chain, rootThemeName, config);\n const descriptors = branches.map((branch, branchIndex) => ({\n test: branch.test,\n bridge: {\n // unique across modules and stable across the server and client\n // compilations of the same entry, because both see the same module path\n id: branches.length === 1 ? `b${moduleBridgePrefix}_${index}` : `b${moduleBridgePrefix}_${index}_${branchIndex}`,\n name: branch.name,\n layers\n }\n }));\n const list = bridges.get(islandId) ?? [];\n for (const descriptor of descriptors) list.push(descriptor.bridge);\n bridges.set(islandId, list);\n const fold = (value) => foldBranches(\n descriptors.map((descriptor) => ({\n test: descriptor.test,\n value: value(descriptor.bridge)\n }))\n );\n const opening = childNode(element, \"openingElement\");\n const nameNode = childNode(opening, \"name\");\n edits.push({\n start: nameNode.end,\n end: nameNode.end,\n content: ` data-tamagui-bridge={${fold(\n (bridge) => JSON.stringify(bridge.id)\n )}} __tamaguiBridge={${fold((bridge) => JSON.stringify(bridge))}}`,\n origin: { id: moduleId, start: nameNode.start, end: nameNode.end }\n });\n });\n const erasure = violations.length ? null : planZeroErasure({\n id: moduleId,\n source,\n loweredEdits: [...input.plan.edits, ...edits],\n isTamaguiSpecifier: input.isTamaguiSpecifier,\n islandIdFor: input.resolveIslandModule\n });\n if (erasure) {\n edits.push(...erasure.edits);\n violations.push(...erasure.violations);\n }\n const output = input.mode === \"report\" ? applyLoweredModule(source, moduleId, input.plan) : violations.length ? { changed: false, code: source, map: null } : applyLoweredModule(source, moduleId, {\n id: moduleId,\n sourceHash: input.plan.sourceHash,\n edits: [...input.plan.edits, ...edits]\n });\n return {\n output,\n edits: input.mode === \"report\" ? [] : edits,\n bridges: input.mode === \"report\" ? /* @__PURE__ */ new Map() : bridges,\n bridgeCSS: input.mode === \"report\" ? /* @__PURE__ */ new Map() : bridgeCSS,\n violations,\n erased: {\n modules: erasure?.removedModules ?? [],\n bindings: erasure?.removedBindings ?? [],\n styledDefinitions: erasure?.erasedStyledDefinitions ?? [],\n exports: erasure?.erasedExports ?? []\n },\n rewrittenAnimatedNumberHooks: erasure?.rewrittenAnimatedNumberHooks ?? []\n };\n}\nexport {\n transformZeroModule\n};\n//# sourceMappingURL=transform.js.map\n"],"mappings":"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"}
|