@tamagui/static 1.0.0-alpha.2 → 1.0.0-alpha.23
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/constants.js +33 -0
- package/dist/cjs/constants.js.map +7 -0
- package/dist/cjs/extractor/accessSafe.js +33 -0
- package/dist/cjs/extractor/accessSafe.js.map +7 -0
- package/dist/cjs/extractor/babelParse.js +52 -0
- package/dist/cjs/extractor/babelParse.js.map +7 -0
- package/dist/cjs/extractor/buildClassName.js +62 -0
- package/dist/cjs/extractor/buildClassName.js.map +7 -0
- package/dist/cjs/extractor/createEvaluator.js +73 -0
- package/dist/cjs/extractor/createEvaluator.js.map +7 -0
- package/dist/cjs/extractor/createExtractor.js +903 -0
- package/dist/cjs/extractor/createExtractor.js.map +7 -0
- package/dist/cjs/extractor/ensureImportingConcat.js +46 -0
- package/dist/cjs/extractor/ensureImportingConcat.js.map +7 -0
- package/dist/cjs/extractor/evaluateAstNode.js +116 -0
- package/dist/cjs/extractor/evaluateAstNode.js.map +7 -0
- package/dist/cjs/extractor/extractHelpers.js +118 -0
- package/dist/cjs/extractor/extractHelpers.js.map +7 -0
- package/dist/cjs/extractor/extractMediaStyle.js +187 -0
- package/dist/cjs/extractor/extractMediaStyle.js.map +7 -0
- package/dist/cjs/extractor/extractToClassNames.js +279 -0
- package/dist/cjs/extractor/extractToClassNames.js.map +7 -0
- package/dist/cjs/extractor/findTopmostFunction.js +29 -0
- package/dist/cjs/extractor/findTopmostFunction.js.map +7 -0
- package/dist/cjs/extractor/generatedUid.js +50 -0
- package/dist/cjs/extractor/generatedUid.js.map +7 -0
- package/dist/cjs/extractor/getPropValueFromAttributes.js +71 -0
- package/dist/cjs/extractor/getPropValueFromAttributes.js.map +7 -0
- package/dist/cjs/extractor/getSourceModule.js +91 -0
- package/dist/cjs/extractor/getSourceModule.js.map +7 -0
- package/dist/cjs/extractor/getStaticBindingsForScope.js +150 -0
- package/dist/cjs/extractor/getStaticBindingsForScope.js.map +7 -0
- package/dist/cjs/extractor/hoistClassNames.js +66 -0
- package/dist/cjs/extractor/hoistClassNames.js.map +7 -0
- package/dist/cjs/extractor/literalToAst.js +56 -0
- package/dist/cjs/extractor/literalToAst.js.map +7 -0
- package/dist/cjs/extractor/loadTamagui.js +63 -0
- package/dist/cjs/extractor/loadTamagui.js.map +7 -0
- package/dist/cjs/extractor/logLines.js +23 -0
- package/dist/cjs/extractor/logLines.js.map +7 -0
- package/dist/cjs/extractor/normalizeTernaries.js +102 -0
- package/dist/cjs/extractor/normalizeTernaries.js.map +7 -0
- package/dist/cjs/extractor/removeUnusedHooks.js +101 -0
- package/dist/cjs/extractor/removeUnusedHooks.js.map +7 -0
- package/dist/cjs/index.js +37 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/patchReactNativeWeb.js +129 -0
- package/dist/cjs/patchReactNativeWeb.js.map +7 -0
- package/dist/cjs/types.js +4 -0
- package/dist/cjs/types.js.map +7 -0
- package/dist/{constants.js → esm/constants.js} +0 -0
- package/dist/{constants.js.map → esm/constants.js.map} +1 -1
- package/dist/{extractor → esm/extractor}/accessSafe.js +0 -0
- package/dist/{extractor → esm/extractor}/accessSafe.js.map +1 -1
- package/dist/{extractor → esm/extractor}/babelParse.js +0 -0
- package/dist/{extractor → esm/extractor}/babelParse.js.map +1 -1
- package/dist/{extractor → esm/extractor}/buildClassName.js +0 -0
- package/dist/{extractor → esm/extractor}/buildClassName.js.map +1 -1
- package/dist/{extractor → esm/extractor}/createEvaluator.js +0 -0
- package/dist/{extractor → esm/extractor}/createEvaluator.js.map +1 -1
- package/dist/{extractor → esm/extractor}/createExtractor.js +92 -54
- package/dist/esm/extractor/createExtractor.js.map +7 -0
- package/dist/{extractor → esm/extractor}/ensureImportingConcat.js +0 -0
- package/dist/{extractor → esm/extractor}/ensureImportingConcat.js.map +1 -1
- package/dist/{extractor → esm/extractor}/evaluateAstNode.js +0 -0
- package/dist/{extractor → esm/extractor}/evaluateAstNode.js.map +1 -1
- package/dist/{extractor → esm/extractor}/extractHelpers.js +3 -1
- package/dist/{extractor → esm/extractor}/extractHelpers.js.map +3 -3
- package/dist/{extractor → esm/extractor}/extractMediaStyle.js +0 -0
- package/dist/{extractor → esm/extractor}/extractMediaStyle.js.map +1 -1
- package/dist/{extractor → esm/extractor}/extractToClassNames.js +21 -24
- package/dist/esm/extractor/extractToClassNames.js.map +7 -0
- package/dist/{extractor → esm/extractor}/findTopmostFunction.js +0 -0
- package/dist/{extractor → esm/extractor}/findTopmostFunction.js.map +1 -1
- package/dist/{extractor → esm/extractor}/generatedUid.js +0 -0
- package/dist/{extractor → esm/extractor}/generatedUid.js.map +1 -1
- package/dist/{extractor → esm/extractor}/getPropValueFromAttributes.js +0 -0
- package/dist/{extractor → esm/extractor}/getPropValueFromAttributes.js.map +1 -1
- package/dist/{extractor → esm/extractor}/getSourceModule.js +0 -0
- package/dist/{extractor → esm/extractor}/getSourceModule.js.map +1 -1
- package/dist/{extractor → esm/extractor}/getStaticBindingsForScope.js +0 -0
- package/dist/{extractor → esm/extractor}/getStaticBindingsForScope.js.map +1 -1
- package/dist/{extractor → esm/extractor}/hoistClassNames.js +0 -0
- package/dist/{extractor → esm/extractor}/hoistClassNames.js.map +1 -1
- package/dist/{extractor → esm/extractor}/literalToAst.js +0 -0
- package/dist/{extractor → esm/extractor}/literalToAst.js.map +1 -1
- package/dist/{extractor → esm/extractor}/loadTamagui.js +0 -0
- package/dist/{extractor → esm/extractor}/loadTamagui.js.map +1 -1
- package/dist/esm/extractor/logLines.js +17 -0
- package/dist/esm/extractor/logLines.js.map +7 -0
- package/dist/{extractor → esm/extractor}/normalizeTernaries.js +0 -0
- package/dist/{extractor → esm/extractor}/normalizeTernaries.js.map +1 -1
- package/dist/{extractor → esm/extractor}/removeUnusedHooks.js +0 -0
- package/dist/{extractor → esm/extractor}/removeUnusedHooks.js.map +1 -1
- package/dist/{index.js → esm/index.js} +0 -0
- package/dist/{index.js.map → esm/index.js.map} +1 -1
- package/dist/{patchReactNativeWeb.js → esm/patchReactNativeWeb.js} +18 -3
- package/dist/esm/patchReactNativeWeb.js.map +7 -0
- package/dist/{types.js → esm/types.js} +0 -0
- package/dist/{types.js.map → esm/types.js.map} +0 -0
- package/dist/jsx/constants.js +9 -0
- package/dist/jsx/extractor/accessSafe.js +10 -0
- package/dist/jsx/extractor/babelParse.js +29 -0
- package/dist/jsx/extractor/buildClassName.js +39 -0
- package/dist/jsx/extractor/createEvaluator.js +50 -0
- package/dist/jsx/extractor/createExtractor.js +839 -0
- package/dist/jsx/extractor/ensureImportingConcat.js +23 -0
- package/dist/jsx/extractor/evaluateAstNode.js +93 -0
- package/dist/jsx/extractor/extractHelpers.js +93 -0
- package/dist/jsx/extractor/extractMediaStyle.js +150 -0
- package/dist/jsx/extractor/extractToClassNames.js +239 -0
- package/dist/jsx/extractor/findTopmostFunction.js +22 -0
- package/dist/jsx/extractor/generatedUid.js +27 -0
- package/dist/jsx/extractor/getPropValueFromAttributes.js +48 -0
- package/dist/jsx/extractor/getSourceModule.js +68 -0
- package/dist/jsx/extractor/getStaticBindingsForScope.js +127 -0
- package/dist/jsx/extractor/hoistClassNames.js +43 -0
- package/dist/jsx/extractor/literalToAst.js +33 -0
- package/dist/jsx/extractor/loadTamagui.js +40 -0
- package/dist/jsx/extractor/logLines.js +16 -0
- package/dist/jsx/extractor/normalizeTernaries.js +51 -0
- package/dist/jsx/extractor/removeUnusedHooks.js +77 -0
- package/dist/jsx/index.js +13 -0
- package/{src/patchReactNativeWeb.ts → dist/jsx/patchReactNativeWeb.js} +44 -45
- package/dist/jsx/types.js +0 -0
- package/package.json +19 -16
- package/types/constants.d.ts +4 -0
- package/types/constants.d.ts.map +1 -0
- package/types/extractor/accessSafe.d.ts +3 -0
- package/types/extractor/accessSafe.d.ts.map +1 -0
- package/types/extractor/babelParse.d.ts +5 -0
- package/types/extractor/babelParse.d.ts.map +1 -0
- package/types/extractor/buildClassName.d.ts +4 -0
- package/types/extractor/buildClassName.d.ts.map +1 -0
- package/types/extractor/createEvaluator.d.ts +12 -0
- package/types/extractor/createEvaluator.d.ts.map +1 -0
- package/types/extractor/createExtractor.d.ts +14 -0
- package/types/extractor/createExtractor.d.ts.map +1 -0
- package/types/extractor/ensureImportingConcat.d.ts +4 -0
- package/types/extractor/ensureImportingConcat.d.ts.map +1 -0
- package/types/extractor/evaluateAstNode.d.ts +3 -0
- package/types/extractor/evaluateAstNode.d.ts.map +1 -0
- package/types/extractor/extractHelpers.d.ts +12 -0
- package/types/extractor/extractHelpers.d.ts.map +1 -0
- package/types/extractor/extractMediaStyle.d.ts +10 -0
- package/types/extractor/extractMediaStyle.d.ts.map +1 -0
- package/types/extractor/extractToClassNames.d.ts +22 -0
- package/types/extractor/extractToClassNames.d.ts.map +1 -0
- package/types/extractor/findTopmostFunction.d.ts +4 -0
- package/types/extractor/findTopmostFunction.d.ts.map +1 -0
- package/types/extractor/generatedUid.d.ts +5 -0
- package/types/extractor/generatedUid.d.ts.map +1 -0
- package/types/extractor/getPropValueFromAttributes.d.ts +3 -0
- package/types/extractor/getPropValueFromAttributes.d.ts.map +1 -0
- package/types/extractor/getSourceModule.d.ts +16 -0
- package/types/extractor/getSourceModule.d.ts.map +1 -0
- package/types/extractor/getStaticBindingsForScope.d.ts +4 -0
- package/types/extractor/getStaticBindingsForScope.d.ts.map +1 -0
- package/types/extractor/hoistClassNames.d.ts +6 -0
- package/types/extractor/hoistClassNames.d.ts.map +1 -0
- package/types/extractor/literalToAst.d.ts +3 -0
- package/types/extractor/literalToAst.d.ts.map +1 -0
- package/types/extractor/loadTamagui.d.ts +9 -0
- package/types/extractor/loadTamagui.d.ts.map +1 -0
- package/types/extractor/logLines.d.ts +2 -0
- package/types/extractor/logLines.d.ts.map +1 -0
- package/types/extractor/normalizeTernaries.d.ts +3 -0
- package/types/extractor/normalizeTernaries.d.ts.map +1 -0
- package/types/extractor/removeUnusedHooks.d.ts +3 -0
- package/types/extractor/removeUnusedHooks.d.ts.map +1 -0
- package/types/index.d.ts +8 -0
- package/types/index.d.ts.map +1 -0
- package/types/patchReactNativeWeb.d.ts +2 -0
- package/types/patchReactNativeWeb.d.ts.map +1 -0
- package/types/types.d.ts +79 -0
- package/types/types.d.ts.map +1 -0
- package/dist/extractor/createExtractor.js.map +0 -7
- package/dist/extractor/extractToClassNames.js.map +0 -7
- package/dist/index.cjs +0 -2080
- package/dist/index.cjs.map +0 -7
- package/dist/patchReactNativeWeb.js.map +0 -7
- package/src/constants.ts +0 -10
- package/src/extractor/accessSafe.ts +0 -18
- package/src/extractor/babelParse.ts +0 -27
- package/src/extractor/buildClassName.ts +0 -61
- package/src/extractor/createEvaluator.ts +0 -68
- package/src/extractor/createExtractor.ts +0 -1115
- package/src/extractor/ensureImportingConcat.ts +0 -33
- package/src/extractor/evaluateAstNode.ts +0 -121
- package/src/extractor/extractHelpers.ts +0 -101
- package/src/extractor/extractMediaStyle.ts +0 -191
- package/src/extractor/extractToClassNames.ts +0 -337
- package/src/extractor/findTopmostFunction.ts +0 -22
- package/src/extractor/generatedUid.ts +0 -43
- package/src/extractor/getPropValueFromAttributes.ts +0 -92
- package/src/extractor/getSourceModule.ts +0 -101
- package/src/extractor/getStaticBindingsForScope.ts +0 -173
- package/src/extractor/hoistClassNames.ts +0 -45
- package/src/extractor/literalToAst.ts +0 -32
- package/src/extractor/loadTamagui.ts +0 -61
- package/src/extractor/normalizeTernaries.ts +0 -60
- package/src/extractor/removeUnusedHooks.ts +0 -76
- package/src/index.ts +0 -9
- package/src/types.ts +0 -80
|
@@ -12,6 +12,7 @@ import { findTopmostFunction } from "./findTopmostFunction";
|
|
|
12
12
|
import { getStaticBindingsForScope } from "./getStaticBindingsForScope";
|
|
13
13
|
import { literalToAst } from "./literalToAst";
|
|
14
14
|
import { loadTamagui } from "./loadTamagui";
|
|
15
|
+
import { logLines } from "./logLines";
|
|
15
16
|
import { normalizeTernaries } from "./normalizeTernaries";
|
|
16
17
|
import { removeUnusedHooks } from "./removeUnusedHooks";
|
|
17
18
|
const { mediaQueryConfig, postProcessStyles, pseudos } = CoreNode;
|
|
@@ -34,8 +35,9 @@ function createExtractor() {
|
|
|
34
35
|
format: "cjs"
|
|
35
36
|
});
|
|
36
37
|
let loadedTamaguiConfig;
|
|
38
|
+
let hasLogged = false;
|
|
37
39
|
return {
|
|
38
|
-
|
|
40
|
+
getTamagui() {
|
|
39
41
|
return loadedTamaguiConfig;
|
|
40
42
|
},
|
|
41
43
|
parse: (fileOrPath, {
|
|
@@ -46,7 +48,10 @@ function createExtractor() {
|
|
|
46
48
|
sourcePath = "",
|
|
47
49
|
onExtractTag,
|
|
48
50
|
getFlattenedNode,
|
|
49
|
-
|
|
51
|
+
disableExtraction,
|
|
52
|
+
disableExtractInlineMedia,
|
|
53
|
+
disableExtractVariables,
|
|
54
|
+
disableDebugAttr,
|
|
50
55
|
...props
|
|
51
56
|
}) => {
|
|
52
57
|
if (sourcePath === "") {
|
|
@@ -61,13 +66,15 @@ function createExtractor() {
|
|
|
61
66
|
});
|
|
62
67
|
loadedTamaguiConfig = tamaguiConfig;
|
|
63
68
|
const defaultTheme = tamaguiConfig.themes[Object.keys(tamaguiConfig.themes)[0]];
|
|
64
|
-
let doesUseValidImport = false;
|
|
65
69
|
const body = fileOrPath.type === "Program" ? fileOrPath.get("body") : fileOrPath.program.body;
|
|
66
|
-
const isInternalImport = /* @__PURE__ */ __name((importStr) =>
|
|
67
|
-
|
|
70
|
+
const isInternalImport = /* @__PURE__ */ __name((importStr) => {
|
|
71
|
+
return isInsideTamagui(sourcePath) && importStr[0] === ".";
|
|
72
|
+
}, "isInternalImport");
|
|
73
|
+
const validComponents = Object.keys(components).filter((key) => key[0].toUpperCase() === key[0] && !!components[key]?.staticConfig).reduce((obj, name) => {
|
|
68
74
|
obj[name] = components[name];
|
|
69
75
|
return obj;
|
|
70
76
|
}, {});
|
|
77
|
+
let doesUseValidImport = false;
|
|
71
78
|
for (const bodyPath of body) {
|
|
72
79
|
if (bodyPath.type !== "ImportDeclaration")
|
|
73
80
|
continue;
|
|
@@ -78,7 +85,6 @@ function createExtractor() {
|
|
|
78
85
|
const name = specifier.local.name;
|
|
79
86
|
return validComponents[name] || validHooks[name];
|
|
80
87
|
})) {
|
|
81
|
-
console.log("WHAT");
|
|
82
88
|
doesUseValidImport = true;
|
|
83
89
|
break;
|
|
84
90
|
}
|
|
@@ -97,6 +103,11 @@ function createExtractor() {
|
|
|
97
103
|
return fileOrPath.type === "File" ? traverse(fileOrPath, a) : fileOrPath.traverse(a);
|
|
98
104
|
}, "callTraverse");
|
|
99
105
|
let programPath;
|
|
106
|
+
const res = {
|
|
107
|
+
flattened: 0,
|
|
108
|
+
optimized: 0,
|
|
109
|
+
modified: 0
|
|
110
|
+
};
|
|
100
111
|
callTraverse({
|
|
101
112
|
Program: {
|
|
102
113
|
enter(path) {
|
|
@@ -128,8 +139,26 @@ function createExtractor() {
|
|
|
128
139
|
if (!component || !component.staticConfig) {
|
|
129
140
|
return;
|
|
130
141
|
}
|
|
131
|
-
const { staticConfig } = component;
|
|
132
142
|
const originalNodeName = node.name.name;
|
|
143
|
+
if (shouldPrintDebug) {
|
|
144
|
+
console.log(`
|
|
145
|
+
<${originalNodeName} />`);
|
|
146
|
+
}
|
|
147
|
+
const filePath = sourcePath.replace(process.cwd(), ".");
|
|
148
|
+
const lineNumbers = node.loc ? node.loc.start.line + (node.loc.start.line !== node.loc.end.line ? `-${node.loc.end.line}` : "") : "";
|
|
149
|
+
if (shouldAddDebugProp && !disableDebugAttr) {
|
|
150
|
+
const preName = componentName ? `${componentName}:` : "";
|
|
151
|
+
res.modified++;
|
|
152
|
+
node.attributes.unshift(t.jsxAttribute(t.jsxIdentifier("data-is"), t.stringLiteral(` ${preName}${node.name.name} ${filePath.replace("./", "")}:${lineNumbers} `)));
|
|
153
|
+
}
|
|
154
|
+
if (disableExtraction) {
|
|
155
|
+
if (!hasLogged) {
|
|
156
|
+
console.log("\u{1F95A} Tamagui disableExtraction set: no CSS or optimizations will be run");
|
|
157
|
+
hasLogged = true;
|
|
158
|
+
}
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const { staticConfig } = component;
|
|
133
162
|
const isTextView = staticConfig.isText || false;
|
|
134
163
|
const validStyles = staticConfig?.validStyles ?? {};
|
|
135
164
|
let tagName = staticConfig.defaultProps?.tag ?? (isTextView ? "span" : "div");
|
|
@@ -151,21 +180,17 @@ function createExtractor() {
|
|
|
151
180
|
]);
|
|
152
181
|
const excludeProps = new Set(props.excludeProps ?? []);
|
|
153
182
|
const isExcludedProp = /* @__PURE__ */ __name((name) => {
|
|
154
|
-
const
|
|
155
|
-
if (
|
|
183
|
+
const res2 = excludeProps.has(name);
|
|
184
|
+
if (res2 && shouldPrintDebug)
|
|
156
185
|
console.log(` excluding ${name}`);
|
|
157
|
-
return
|
|
186
|
+
return res2;
|
|
158
187
|
}, "isExcludedProp");
|
|
159
188
|
const isDeoptedProp = /* @__PURE__ */ __name((name) => {
|
|
160
|
-
const
|
|
161
|
-
if (
|
|
189
|
+
const res2 = deoptProps.has(name);
|
|
190
|
+
if (res2 && shouldPrintDebug)
|
|
162
191
|
console.log(` deopting ${name}`);
|
|
163
|
-
return
|
|
192
|
+
return res2;
|
|
164
193
|
}, "isDeoptedProp");
|
|
165
|
-
if (shouldPrintDebug) {
|
|
166
|
-
console.log(`
|
|
167
|
-
<${originalNodeName} />`);
|
|
168
|
-
}
|
|
169
194
|
const staticNamespace = getStaticBindingsForScope(traversePath.scope, importsWhitelist, sourcePath, bindingCache, shouldPrintDebug);
|
|
170
195
|
const attemptEval = !evaluateVars ? evaluateAstNode : createEvaluator({
|
|
171
196
|
tamaguiConfig,
|
|
@@ -238,11 +263,11 @@ function createExtractor() {
|
|
|
238
263
|
let isFlattened = false;
|
|
239
264
|
attrs = traversePath.get("openingElement").get("attributes").flatMap((path) => {
|
|
240
265
|
try {
|
|
241
|
-
const
|
|
242
|
-
if (!
|
|
266
|
+
const res2 = evaluateAttribute(path);
|
|
267
|
+
if (!res2) {
|
|
243
268
|
path.remove();
|
|
244
269
|
}
|
|
245
|
-
return
|
|
270
|
+
return res2;
|
|
246
271
|
} catch (err) {
|
|
247
272
|
console.log("Error extracting attribute", err.message, err.stack);
|
|
248
273
|
console.log("node", path.node);
|
|
@@ -264,7 +289,9 @@ function createExtractor() {
|
|
|
264
289
|
}
|
|
265
290
|
const propName = prop.key["name"];
|
|
266
291
|
if (!isStaticAttributeName(propName) && propName !== "tag") {
|
|
267
|
-
|
|
292
|
+
if (shouldPrintDebug) {
|
|
293
|
+
console.log(" not a valid style prop!", propName);
|
|
294
|
+
}
|
|
268
295
|
return false;
|
|
269
296
|
}
|
|
270
297
|
return true;
|
|
@@ -330,7 +357,9 @@ function createExtractor() {
|
|
|
330
357
|
if (!test)
|
|
331
358
|
throw new Error(`no test`);
|
|
332
359
|
if ([alt, cons].some((side) => side && !isExtractable(side))) {
|
|
333
|
-
|
|
360
|
+
if (shouldPrintDebug) {
|
|
361
|
+
console.log("not extractable", alt, cons);
|
|
362
|
+
}
|
|
334
363
|
return attr;
|
|
335
364
|
}
|
|
336
365
|
return [
|
|
@@ -361,6 +390,9 @@ function createExtractor() {
|
|
|
361
390
|
return attr;
|
|
362
391
|
}
|
|
363
392
|
if (name[0] === "$" && t.isJSXExpressionContainer(attribute?.value)) {
|
|
393
|
+
if (disableExtractInlineMedia) {
|
|
394
|
+
return attr;
|
|
395
|
+
}
|
|
364
396
|
const shortname = name.slice(1);
|
|
365
397
|
if (mediaQueryConfig[shortname]) {
|
|
366
398
|
const expression = attribute.value.expression;
|
|
@@ -400,6 +432,17 @@ function createExtractor() {
|
|
|
400
432
|
value: path.node
|
|
401
433
|
};
|
|
402
434
|
}
|
|
435
|
+
if (disableExtractVariables) {
|
|
436
|
+
if (value) {
|
|
437
|
+
if (value.type === "StringLiteral" && value.value[0] === "$") {
|
|
438
|
+
if (shouldPrintDebug) {
|
|
439
|
+
console.log(" native, disable extract var", value.value);
|
|
440
|
+
}
|
|
441
|
+
inlinePropCount++;
|
|
442
|
+
return attr;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
403
446
|
const styleValue = attemptEvalSafe(value);
|
|
404
447
|
if (!isStaticAttributeName(name)) {
|
|
405
448
|
let keys = [name];
|
|
@@ -420,7 +463,9 @@ function createExtractor() {
|
|
|
420
463
|
if (styleValue !== FAILED_EVAL) {
|
|
421
464
|
return {
|
|
422
465
|
type: "style",
|
|
423
|
-
value: { [name]: styleValue }
|
|
466
|
+
value: { [name]: styleValue },
|
|
467
|
+
name,
|
|
468
|
+
attr: path.node
|
|
424
469
|
};
|
|
425
470
|
}
|
|
426
471
|
if (t.isBinaryExpression(value)) {
|
|
@@ -533,7 +578,7 @@ function createExtractor() {
|
|
|
533
578
|
}
|
|
534
579
|
__name(evaluateAttribute, "evaluateAttribute");
|
|
535
580
|
if (shouldPrintDebug) {
|
|
536
|
-
console.log(" - attrs (before)
|
|
581
|
+
console.log(" - attrs (before):\n", logLines(attrs.map(attrStr).join(", ")));
|
|
537
582
|
}
|
|
538
583
|
node.attributes = attrs.filter(isAttr).map((x) => x.value);
|
|
539
584
|
if (couldntParse) {
|
|
@@ -547,8 +592,6 @@ function createExtractor() {
|
|
|
547
592
|
if (parentFn) {
|
|
548
593
|
modifiedComponents.add(parentFn);
|
|
549
594
|
}
|
|
550
|
-
const filePath = sourcePath.replace(process.cwd(), ".");
|
|
551
|
-
const lineNumbers = node.loc ? node.loc.start.line + (node.loc.start.line !== node.loc.end.line ? `-${node.loc.end.line}` : "") : "";
|
|
552
595
|
let ternaries = [];
|
|
553
596
|
attrs = attrs.reduce((out, cur) => {
|
|
554
597
|
const next = attrs[attrs.indexOf(cur) + 1];
|
|
@@ -611,14 +654,16 @@ function createExtractor() {
|
|
|
611
654
|
attrs = attrs.reduce((acc, cur) => {
|
|
612
655
|
if (cur.type === "style") {
|
|
613
656
|
for (const key in cur.value) {
|
|
614
|
-
const
|
|
657
|
+
const shouldEnsureOverridden = !!staticConfig.ensureOverriddenProp?.[key];
|
|
615
658
|
const isSetInAttrsAlready = attrs.some((x) => x.type === "attr" && x.value.type === "JSXAttribute" && x.value.name.name === key);
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
659
|
+
if (!isSetInAttrsAlready) {
|
|
660
|
+
const isVariant = !!staticConfig.variants?.[cur.name || ""];
|
|
661
|
+
if (isVariant || shouldEnsureOverridden) {
|
|
662
|
+
acc.push({
|
|
663
|
+
type: "attr",
|
|
664
|
+
value: cur.attr || t.jsxAttribute(t.jsxIdentifier(key), t.jsxExpressionContainer(t.nullLiteral()))
|
|
665
|
+
});
|
|
666
|
+
}
|
|
622
667
|
}
|
|
623
668
|
}
|
|
624
669
|
}
|
|
@@ -627,7 +672,7 @@ function createExtractor() {
|
|
|
627
672
|
}, []);
|
|
628
673
|
}
|
|
629
674
|
if (shouldPrintDebug) {
|
|
630
|
-
console.log(" - attrs (flattened):
|
|
675
|
+
console.log(" - attrs (flattened): \n", logLines(attrs.map(attrStr).join(", ")));
|
|
631
676
|
}
|
|
632
677
|
attrs = attrs.reduce((acc, cur) => {
|
|
633
678
|
if (cur.type !== "attr" || !t.isJSXAttribute(cur.value) || typeof cur.value.name.name !== "string") {
|
|
@@ -645,7 +690,7 @@ function createExtractor() {
|
|
|
645
690
|
return acc;
|
|
646
691
|
}, []);
|
|
647
692
|
if (shouldPrintDebug) {
|
|
648
|
-
console.log(" - attrs (evaluated styles):
|
|
693
|
+
console.log(" - attrs (evaluated styles): \n", logLines(attrs.map(attrStr).join(", ")));
|
|
649
694
|
}
|
|
650
695
|
let prev = null;
|
|
651
696
|
attrs = attrs.reduce((acc, cur) => {
|
|
@@ -660,7 +705,7 @@ function createExtractor() {
|
|
|
660
705
|
return acc;
|
|
661
706
|
}, []);
|
|
662
707
|
if (shouldPrintDebug) {
|
|
663
|
-
console.log(" - attrs (combined \u{1F500}):
|
|
708
|
+
console.log(" - attrs (combined \u{1F500}): \n", logLines(attrs.map(attrStr).join(", ")));
|
|
664
709
|
}
|
|
665
710
|
const getStyles = /* @__PURE__ */ __name((props2) => {
|
|
666
711
|
if (!props2)
|
|
@@ -674,9 +719,10 @@ function createExtractor() {
|
|
|
674
719
|
const out = postProcessStyles(props2, staticConfig, defaultTheme);
|
|
675
720
|
const next = out?.style ?? props2;
|
|
676
721
|
if (shouldPrintDebug) {
|
|
677
|
-
console.log("
|
|
678
|
-
console.log("
|
|
679
|
-
console.log("
|
|
722
|
+
console.log(" getStyles props >>\n", logLines(objToStr(props2)));
|
|
723
|
+
console.log(" getStyles next >>\n", logLines(objToStr(next)));
|
|
724
|
+
console.log(" getStyles style >>\n", logLines(objToStr(out.style)));
|
|
725
|
+
console.log(" getStyles viewp >>\n", logLines(objToStr(out.viewProps)));
|
|
680
726
|
}
|
|
681
727
|
if (staticConfig.validStyles) {
|
|
682
728
|
for (const key in next) {
|
|
@@ -687,9 +733,6 @@ function createExtractor() {
|
|
|
687
733
|
}
|
|
688
734
|
return next;
|
|
689
735
|
}, "getStyles");
|
|
690
|
-
if (shouldPrintDebug) {
|
|
691
|
-
console.log(" staticConfig.defaultProps", staticConfig.defaultProps);
|
|
692
|
-
}
|
|
693
736
|
const completeStylesProcessed = getStyles({
|
|
694
737
|
...staticConfig.defaultProps,
|
|
695
738
|
...completeStaticProps
|
|
@@ -709,8 +752,8 @@ function createExtractor() {
|
|
|
709
752
|
}
|
|
710
753
|
}
|
|
711
754
|
if (shouldPrintDebug) {
|
|
712
|
-
console.log("
|
|
713
|
-
console.log("
|
|
755
|
+
console.log(" completeStaticProps\n", logLines(objToStr(completeStaticProps)));
|
|
756
|
+
console.log(" completeStylesProcessed\n", logLines(objToStr(completeStylesProcessed)));
|
|
714
757
|
}
|
|
715
758
|
for (const attr of attrs) {
|
|
716
759
|
try {
|
|
@@ -745,14 +788,7 @@ function createExtractor() {
|
|
|
745
788
|
}
|
|
746
789
|
}
|
|
747
790
|
if (shouldPrintDebug) {
|
|
748
|
-
console.log(" - attrs (after)
|
|
749
|
-
}
|
|
750
|
-
if (shouldAddDebugProp) {
|
|
751
|
-
const preName = componentName ? `${componentName}:` : "";
|
|
752
|
-
attrs.unshift({
|
|
753
|
-
type: "attr",
|
|
754
|
-
value: t.jsxAttribute(t.jsxIdentifier("data-is"), t.stringLiteral(` ${preName}${node.name.name} ${filePath.replace("./", "")}:${lineNumbers} `))
|
|
755
|
-
});
|
|
791
|
+
console.log(" - attrs (after):\n", logLines(attrs.map(attrStr).join(", ")));
|
|
756
792
|
}
|
|
757
793
|
if (shouldFlatten) {
|
|
758
794
|
if (shouldPrintDebug) {
|
|
@@ -760,15 +796,16 @@ function createExtractor() {
|
|
|
760
796
|
}
|
|
761
797
|
isFlattened = true;
|
|
762
798
|
node.name.name = flatNode;
|
|
763
|
-
|
|
799
|
+
res.flattened++;
|
|
764
800
|
if (closingElement) {
|
|
765
801
|
closingElement.name.name = flatNode;
|
|
766
802
|
}
|
|
767
803
|
}
|
|
768
804
|
if (shouldPrintDebug) {
|
|
769
805
|
console.log(" [\u274A] inline props ", inlinePropCount, shouldDeopt ? " deopted" : "", hasSpread ? " spread" : "", "!flatten", staticConfig.neverFlatten);
|
|
770
|
-
console.log(" - attrs (end)
|
|
806
|
+
console.log(" - attrs (end):\n", logLines(attrs.map(attrStr).join(", ")));
|
|
771
807
|
}
|
|
808
|
+
res.optimized++;
|
|
772
809
|
onExtractTag({
|
|
773
810
|
attrs,
|
|
774
811
|
node,
|
|
@@ -791,6 +828,7 @@ function createExtractor() {
|
|
|
791
828
|
removeUnusedHooks(comp, shouldPrintDebug);
|
|
792
829
|
}
|
|
793
830
|
}
|
|
831
|
+
return res;
|
|
794
832
|
}
|
|
795
833
|
};
|
|
796
834
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/extractor/createExtractor.ts"],
|
|
4
|
+
"sourcesContent": ["import traverse, { NodePath, Visitor } from '@babel/traverse'\nimport * as t from '@babel/types'\nimport type { StaticConfigParsed, TamaguiInternalConfig } from '@tamagui/core'\nimport * as CoreNode from '@tamagui/core-node'\nimport { stylePropsTransform } from '@tamagui/helpers'\nimport { difference, pick } from 'lodash'\n\nimport { ExtractedAttr, ExtractedAttrAttr, ExtractorParseProps, Ternary } from '../types'\nimport { createEvaluator, createSafeEvaluator } from './createEvaluator'\nimport { evaluateAstNode } from './evaluateAstNode'\nimport { attrStr, findComponentName, isInsideTamagui, isPresent, objToStr } from './extractHelpers'\nimport { findTopmostFunction } from './findTopmostFunction'\nimport { getStaticBindingsForScope } from './getStaticBindingsForScope'\nimport { literalToAst } from './literalToAst'\nimport { loadTamagui } from './loadTamagui'\nimport { logLines } from './logLines'\nimport { normalizeTernaries } from './normalizeTernaries'\nimport { removeUnusedHooks } from './removeUnusedHooks'\n\nconst { mediaQueryConfig, postProcessStyles, pseudos } = CoreNode\n\nexport const FAILED_EVAL = Symbol('failed_style_eval')\nconst UNTOUCHED_PROPS = {\n key: true,\n style: true,\n className: true,\n}\n\nconst isAttr = (x: ExtractedAttr): x is ExtractedAttrAttr => x.type === 'attr'\n\nconst validHooks = {\n useMedia: true,\n useTheme: true,\n}\n\nexport type Extractor = ReturnType<typeof createExtractor>\n\nconst createTernary = (x: Ternary) => x\n\nexport function createExtractor() {\n const shouldAddDebugProp =\n // really basic disable this for next.js because it messes with ssr\n !process.env.npm_package_dependencies_next &&\n process.env.TAMAGUI_TARGET !== 'native' &&\n process.env.IDENTIFY_TAGS !== 'false' &&\n (process.env.NODE_ENV === 'development' || process.env.DEBUG || process.env.IDENTIFY_TAGS)\n\n // ts imports\n require('esbuild-register/dist/node').register({\n target: 'es2019',\n format: 'cjs',\n })\n\n let loadedTamaguiConfig: TamaguiInternalConfig\n let hasLogged = false\n\n return {\n getTamagui() {\n return loadedTamaguiConfig\n },\n parse: (\n fileOrPath: NodePath<t.Program> | t.File,\n {\n config = 'tamagui.config.ts',\n importsWhitelist = ['constants.js'],\n evaluateVars = true,\n shouldPrintDebug = false,\n sourcePath = '',\n onExtractTag,\n getFlattenedNode,\n disableExtraction,\n disableExtractInlineMedia,\n disableExtractVariables,\n disableDebugAttr,\n ...props\n }: ExtractorParseProps\n ) => {\n if (sourcePath === '') {\n throw new Error(`Must provide a source file name`)\n }\n if (!Array.isArray(props.components)) {\n throw new Error(`Must provide components array with list of Tamagui component modules`)\n }\n\n // we require it after parse because we need to set some global/env stuff before importing\n // otherwise we'd import `rnw` and cause it to evaluate react-native-web which causes errors\n const { components, tamaguiConfig } = loadTamagui({\n config,\n components: props.components || ['tamagui'],\n })\n\n loadedTamaguiConfig = tamaguiConfig\n\n const defaultTheme = tamaguiConfig.themes[Object.keys(tamaguiConfig.themes)[0]]\n const body = fileOrPath.type === 'Program' ? fileOrPath.get('body') : fileOrPath.program.body\n\n /**\n * Step 1: Determine if importing any statically extractable components\n */\n const isInternalImport = (importStr: string) => {\n return isInsideTamagui(sourcePath) && importStr[0] === '.'\n }\n\n const validComponents: { [key: string]: any } = Object.keys(components)\n // check if uppercase to avoid hitting media query proxy before init\n .filter((key) => key[0].toUpperCase() === key[0] && !!components[key]?.staticConfig)\n .reduce((obj, name) => {\n obj[name] = components[name]\n return obj\n }, {})\n\n let doesUseValidImport = false\n\n for (const bodyPath of body) {\n if (bodyPath.type !== 'ImportDeclaration') continue\n const node = ('node' in bodyPath ? bodyPath.node : bodyPath) as any\n const from = node.source.value\n if (props.components.includes(from) || isInternalImport(from)) {\n if (\n node.specifiers.some((specifier) => {\n const name = specifier.local.name\n return validComponents[name] || validHooks[name]\n })\n ) {\n doesUseValidImport = true\n break\n }\n }\n }\n\n if (shouldPrintDebug) {\n console.log(sourcePath, { doesUseValidImport })\n }\n\n if (!doesUseValidImport) {\n return null\n }\n\n let couldntParse = false\n const modifiedComponents = new Set<NodePath<any>>()\n\n // only keeping a cache around per-file, reset it if it changes\n const bindingCache: Record<string, string | null> = {}\n\n const callTraverse = (a: Visitor<{}>) => {\n return fileOrPath.type === 'File' ? traverse(fileOrPath, a) : fileOrPath.traverse(a)\n }\n\n /**\n * Step 2: Statically extract from JSX < /> nodes\n */\n let programPath: NodePath<t.Program>\n\n const res = {\n flattened: 0,\n optimized: 0,\n modified: 0,\n }\n\n callTraverse({\n Program: {\n enter(path) {\n programPath = path\n },\n },\n JSXElement(traversePath) {\n const node = traversePath.node.openingElement\n const ogAttributes = node.attributes\n const componentName = findComponentName(traversePath.scope)\n const closingElement = traversePath.node.closingElement\n\n // skip non-identifier opening elements (member expressions, etc.)\n if (t.isJSXMemberExpression(closingElement?.name) || !t.isJSXIdentifier(node.name)) {\n return\n }\n\n // validate its a proper import from tamagui (or internally inside tamagui)\n const binding = traversePath.scope.getBinding(node.name.name)\n\n if (binding) {\n if (!t.isImportDeclaration(binding.path.parent)) {\n return\n }\n const source = binding.path.parent.source\n if (!props.components.includes(source.value) && !isInternalImport(source.value)) {\n return\n }\n if (!validComponents[binding.identifier.name]) {\n return\n }\n }\n\n const component = validComponents[node.name.name] as { staticConfig?: StaticConfigParsed }\n if (!component || !component.staticConfig) {\n return\n }\n\n const originalNodeName = node.name.name\n\n if (shouldPrintDebug) {\n console.log(`\\n<${originalNodeName} />`)\n }\n\n const filePath = sourcePath.replace(process.cwd(), '.')\n const lineNumbers = node.loc\n ? node.loc.start.line +\n (node.loc.start.line !== node.loc.end.line ? `-${node.loc.end.line}` : '')\n : ''\n\n // add data-is\n if (shouldAddDebugProp && !disableDebugAttr) {\n const preName = componentName ? `${componentName}:` : ''\n res.modified++\n node.attributes.unshift(\n t.jsxAttribute(\n t.jsxIdentifier('data-is'),\n t.stringLiteral(\n ` ${preName}${node.name.name} ${filePath.replace('./', '')}:${lineNumbers} `\n )\n )\n )\n }\n\n if (disableExtraction) {\n if (!hasLogged) {\n console.log('\uD83E\uDD5A Tamagui disableExtraction set: no CSS or optimizations will be run')\n hasLogged = true\n }\n return\n }\n\n const { staticConfig } = component\n const isTextView = staticConfig.isText || false\n const validStyles = staticConfig?.validStyles ?? {}\n\n // find tag=\"a\" tag=\"main\" etc dom indicators\n let tagName = staticConfig.defaultProps?.tag ?? (isTextView ? 'span' : 'div')\n traversePath\n .get('openingElement')\n .get('attributes')\n .forEach((path) => {\n const attr = path.node\n if (t.isJSXSpreadAttribute(attr)) return\n if (attr.name.name !== 'tag') return\n const val = attr.value\n if (!t.isStringLiteral(val)) return\n tagName = val.value\n })\n\n const flatNode = getFlattenedNode({ isTextView, tag: tagName })\n\n const deoptProps = new Set([\n ...(props.deoptProps ?? []),\n ...(staticConfig.deoptProps ?? []),\n ])\n const excludeProps = new Set(props.excludeProps ?? [])\n const isExcludedProp = (name: string) => {\n const res = excludeProps.has(name)\n if (res && shouldPrintDebug) console.log(` excluding ${name}`)\n return res\n }\n\n const isDeoptedProp = (name: string) => {\n const res = deoptProps.has(name)\n if (res && shouldPrintDebug) console.log(` deopting ${name}`)\n return res\n }\n\n // Generate scope object at this level\n const staticNamespace = getStaticBindingsForScope(\n traversePath.scope,\n importsWhitelist,\n sourcePath,\n bindingCache,\n shouldPrintDebug\n )\n\n const attemptEval = !evaluateVars\n ? evaluateAstNode\n : createEvaluator({\n tamaguiConfig,\n staticNamespace,\n sourcePath,\n traversePath,\n shouldPrintDebug,\n })\n const attemptEvalSafe = createSafeEvaluator(attemptEval)\n\n if (shouldPrintDebug) {\n console.log(' staticNamespace', Object.keys(staticNamespace).join(', '))\n }\n\n //\n // SPREADS SETUP\n //\n\n // TODO restore\n const hasDeopt = (obj: Object) => {\n return Object.keys(obj).some(isDeoptedProp)\n }\n\n // flatten any easily evaluatable spreads\n const flattenedAttrs: (t.JSXAttribute | t.JSXSpreadAttribute)[] = []\n traversePath\n .get('openingElement')\n .get('attributes')\n .forEach((path) => {\n const attr = path.node\n if (!t.isJSXSpreadAttribute(attr)) {\n flattenedAttrs.push(attr)\n return\n }\n let arg: any\n try {\n arg = attemptEval(attr.argument)\n } catch (e: any) {\n if (shouldPrintDebug) {\n console.log(' couldnt parse spread', e.message)\n }\n flattenedAttrs.push(attr)\n return\n }\n if (typeof arg !== 'undefined') {\n try {\n if (typeof arg !== 'object' || arg == null) {\n if (shouldPrintDebug) {\n console.log(' non object or null arg', arg)\n }\n flattenedAttrs.push(attr)\n } else {\n for (const k in arg) {\n const value = arg[k]\n // this is a null prop:\n if (!value && typeof value === 'object') {\n console.log('shouldnt we handle this?', k, value, arg)\n continue\n }\n flattenedAttrs.push(\n t.jsxAttribute(\n t.jsxIdentifier(k),\n t.jsxExpressionContainer(literalToAst(value))\n )\n )\n }\n }\n } catch (err) {\n console.warn('cant parse spread, caught err', err)\n couldntParse = true\n }\n }\n })\n\n if (couldntParse) {\n return\n }\n\n // set flattened\n node.attributes = flattenedAttrs\n\n // add in default props\n if (staticConfig.defaultProps) {\n for (const key in staticConfig.defaultProps) {\n const serialize = require('babel-literal-to-ast')\n const val = staticConfig.defaultProps[key]\n node.attributes.unshift(\n t.jsxAttribute(\n t.jsxIdentifier(key),\n typeof val === 'string'\n ? t.stringLiteral(val)\n : t.jsxExpressionContainer(serialize(val))\n )\n )\n }\n }\n\n let attrs: ExtractedAttr[] = []\n let shouldDeopt = false\n let inlinePropCount = 0\n let isFlattened = false\n\n // RUN first pass\n\n // normalize all conditionals so we can evaluate away easier later\n // at the same time lets normalize shorthand media queries into spreads:\n // that way we can parse them with the same logic later on\n //\n // {...media.sm && { color: x ? 'red' : 'blue' }}\n // => {...media.sm && x && { color: 'red' }}\n // => {...media.sm && !x && { color: 'blue' }}\n //\n // $sm={{ color: 'red' }}\n // => {...media.sm && { color: 'red' }}\n //\n // $sm={{ color: x ? 'red' : 'blue' }}\n // => {...media.sm && x && { color: 'red' }}\n // => {...media.sm && !x && { color: 'blue' }}\n\n attrs = traversePath\n .get('openingElement')\n .get('attributes')\n .flatMap((path) => {\n try {\n const res = evaluateAttribute(path)\n if (!res) {\n path.remove()\n }\n return res\n } catch (err: any) {\n console.log('Error extracting attribute', err.message, err.stack)\n console.log('node', path.node)\n return {\n type: 'attr',\n value: path.node,\n } as const\n }\n })\n .flat(4)\n .filter(isPresent)\n\n function isStaticAttributeName(name: string) {\n return !!(\n !!validStyles[name] ||\n staticConfig.validPropsExtra?.[name] ||\n !!pseudos[name] ||\n staticConfig.variants?.[name] ||\n tamaguiConfig.shorthands[name] ||\n (name[0] === '$' ? !!mediaQueryConfig[name.slice(1)] : false)\n )\n }\n\n function isExtractable(obj: t.Node): obj is t.ObjectExpression {\n return (\n t.isObjectExpression(obj) &&\n obj.properties.every((prop) => {\n if (!t.isObjectProperty(prop)) {\n console.log('not object prop', prop)\n return false\n }\n const propName = prop.key['name']\n if (!isStaticAttributeName(propName) && propName !== 'tag') {\n if (shouldPrintDebug) {\n console.log(' not a valid style prop!', propName)\n }\n return false\n }\n return true\n })\n )\n }\n\n // side <= { color: 'red', background: x ? 'red' : 'green' }\n // | => Ternary<test, { color: 'red' }, null>\n // | => Ternary<test && x, { background: 'red' }, null>\n // | => Ternary<test && !x, { background: 'green' }, null>\n function createTernariesFromObjectProperties(\n test: t.Expression,\n side: t.Expression | null,\n ternaryPartial: Partial<Ternary> = {}\n ): null | Ternary[] {\n if (!side) {\n return null\n }\n if (!isExtractable(side)) {\n throw new Error('not extractable')\n }\n return side.properties.flatMap((property) => {\n if (!t.isObjectProperty(property)) {\n throw new Error('expected object property')\n }\n // this could be a recurse here if we want to get fancy\n if (t.isConditionalExpression(property.value)) {\n // merge up into the parent conditional, split into two\n const [truthy, falsy] = [\n t.objectExpression([t.objectProperty(property.key, property.value.consequent)]),\n t.objectExpression([t.objectProperty(property.key, property.value.alternate)]),\n ].map((x) => attemptEval(x))\n return [\n createTernary({\n remove() {},\n ...ternaryPartial,\n test: t.logicalExpression('&&', test, property.value.test),\n consequent: truthy,\n alternate: null,\n }),\n createTernary({\n ...ternaryPartial,\n test: t.logicalExpression(\n '&&',\n test,\n t.unaryExpression('!', property.value.test)\n ),\n consequent: falsy,\n alternate: null,\n remove() {},\n }),\n ]\n }\n const obj = t.objectExpression([t.objectProperty(property.key, property.value)])\n const consequent = attemptEval(obj)\n return createTernary({\n remove() {},\n ...ternaryPartial,\n test,\n consequent,\n alternate: null,\n })\n })\n }\n\n // START function evaluateAttribute\n function evaluateAttribute(\n path: NodePath<t.JSXAttribute | t.JSXSpreadAttribute>\n ): ExtractedAttr | ExtractedAttr[] | null {\n const attribute = path.node\n const attr: ExtractedAttr = { type: 'attr', value: attribute }\n // ...spreads\n if (t.isJSXSpreadAttribute(attribute)) {\n const arg = attribute.argument\n const conditional = t.isConditionalExpression(arg)\n ? // <YStack {...isSmall ? { color: 'red } : { color: 'blue }}\n ([arg.test, arg.consequent, arg.alternate] as const)\n : t.isLogicalExpression(arg) && arg.operator === '&&'\n ? // <YStack {...isSmall && { color: 'red }}\n ([arg.left, arg.right, null] as const)\n : null\n\n if (conditional) {\n const [test, alt, cons] = conditional\n if (!test) throw new Error(`no test`)\n if ([alt, cons].some((side) => side && !isExtractable(side))) {\n if (shouldPrintDebug) {\n console.log('not extractable', alt, cons)\n }\n return attr\n }\n // split into individual ternaries per object property\n return [\n ...(createTernariesFromObjectProperties(test, alt) || []),\n ...((cons &&\n createTernariesFromObjectProperties(t.unaryExpression('!', test), cons)) ||\n []),\n ].map((ternary) => ({\n type: 'ternary',\n value: ternary,\n }))\n }\n }\n // END ...spreads\n\n // directly keep these\n // couldn't evaluate spread, undefined name, or name is not string\n if (\n t.isJSXSpreadAttribute(attribute) ||\n !attribute.name ||\n typeof attribute.name.name !== 'string'\n ) {\n inlinePropCount++\n return attr\n }\n\n const name = attribute.name.name\n\n if (isExcludedProp(name)) {\n return null\n }\n\n // can still optimize the object... see hoverStyle on native\n if (isDeoptedProp(name)) {\n if (shouldPrintDebug) {\n console.log(' ! inlining, deopt prop', name)\n }\n inlinePropCount++\n return attr\n }\n\n // pass className, key, and style props through untouched\n if (UNTOUCHED_PROPS[name]) {\n return attr\n }\n\n // shorthand media queries\n if (name[0] === '$' && t.isJSXExpressionContainer(attribute?.value)) {\n // allow disabling this extraction\n if (disableExtractInlineMedia) {\n return attr\n }\n\n const shortname = name.slice(1)\n if (mediaQueryConfig[shortname]) {\n const expression = attribute.value.expression\n if (!t.isJSXEmptyExpression(expression)) {\n const ternaries = createTernariesFromObjectProperties(\n t.stringLiteral(shortname),\n expression,\n {\n inlineMediaQuery: shortname,\n }\n )\n if (ternaries) {\n return ternaries.map((value) => ({\n type: 'ternary',\n value,\n }))\n }\n }\n }\n }\n\n const [value, valuePath] = (() => {\n if (t.isJSXExpressionContainer(attribute?.value)) {\n return [attribute.value.expression!, path.get('value')!] as const\n } else {\n return [attribute.value!, path.get('value')!] as const\n }\n })()\n\n const remove = () => {\n Array.isArray(valuePath) ? valuePath.map((p) => p.remove()) : valuePath.remove()\n }\n\n if (name === 'ref') {\n if (shouldPrintDebug) {\n console.log(' ! inlining, ref', name)\n }\n inlinePropCount++\n return attr\n }\n\n if (name === 'tag') {\n return {\n type: 'attr',\n value: path.node,\n }\n }\n\n // native shouldn't extract variables\n if (disableExtractVariables) {\n if (value) {\n if (value.type === 'StringLiteral' && value.value[0] === '$') {\n if (shouldPrintDebug) {\n console.log(' native, disable extract var', value.value)\n }\n inlinePropCount++\n return attr\n }\n }\n }\n\n // if value can be evaluated, extract it and filter it out\n const styleValue = attemptEvalSafe(value)\n\n // never flatten if a prop isn't a valid static attribute\n // only post prop-mapping\n if (!isStaticAttributeName(name)) {\n let keys = [name]\n if (staticConfig.propMapper) {\n // for now passing empty props {}, a bit odd, need to at least document\n // for now we don't expose custom components so just noting behavior\n const out = staticConfig.propMapper(\n name,\n styleValue,\n defaultTheme,\n staticConfig.defaultProps\n )\n if (out) {\n keys = Object.keys(out)\n }\n }\n if (keys.some((k) => !isStaticAttributeName(k) && k !== 'tag')) {\n if (shouldPrintDebug) {\n console.log(' ! inlining, not static attribute name', name)\n }\n inlinePropCount++\n return attr\n }\n }\n\n // FAILED = dynamic or ternary, keep going\n if (styleValue !== FAILED_EVAL) {\n return {\n type: 'style',\n value: { [name]: styleValue },\n name,\n attr: path.node,\n }\n }\n\n // ternaries!\n\n // binary ternary, we can eventually make this smarter but step 1\n // basically for the common use case of:\n // opacity={(conditional ? 0 : 1) * scale}\n if (t.isBinaryExpression(value)) {\n const { operator, left, right } = value\n // if one side is a ternary, and the other side is evaluatable, we can maybe extract\n const lVal = attemptEvalSafe(left)\n const rVal = attemptEvalSafe(right)\n if (shouldPrintDebug) {\n console.log(` evalBinaryExpression lVal ${String(lVal)}, rVal ${String(rVal)}`)\n }\n if (lVal !== FAILED_EVAL && t.isConditionalExpression(right)) {\n const ternary = addBinaryConditional(operator, left, right)\n if (ternary) return ternary\n }\n if (rVal !== FAILED_EVAL && t.isConditionalExpression(left)) {\n const ternary = addBinaryConditional(operator, right, left)\n if (ternary) return ternary\n }\n if (shouldPrintDebug) {\n console.log(` evalBinaryExpression cant extract`)\n }\n inlinePropCount++\n return attr\n }\n\n const staticConditional = getStaticConditional(value)\n if (staticConditional) {\n return { type: 'ternary', value: staticConditional }\n }\n\n const staticLogical = getStaticLogical(value)\n if (staticLogical) {\n return { type: 'ternary', value: staticLogical }\n }\n\n if (shouldPrintDebug) {\n console.log(' ! inline prop via no match', name, value.type)\n }\n // if we've made it this far, the prop stays inline\n inlinePropCount++\n\n //\n // RETURN ATTR\n //\n return attr\n\n // attr helpers:\n function addBinaryConditional(\n operator: any,\n staticExpr: any,\n cond: t.ConditionalExpression\n ): ExtractedAttr | null {\n if (getStaticConditional(cond)) {\n const alt = attemptEval(t.binaryExpression(operator, staticExpr, cond.alternate))\n const cons = attemptEval(t.binaryExpression(operator, staticExpr, cond.consequent))\n if (shouldPrintDebug) {\n console.log(' binaryConditional', cond.test, cons, alt)\n }\n return {\n type: 'ternary',\n value: {\n test: cond.test,\n remove,\n alternate: { [name]: alt },\n consequent: { [name]: cons },\n },\n }\n }\n return null\n }\n\n function getStaticConditional(value: t.Node): Ternary | null {\n if (t.isConditionalExpression(value)) {\n try {\n if (shouldPrintDebug) {\n console.log('attempt', value.alternate, value.consequent)\n }\n const aVal = attemptEval(value.alternate)\n const cVal = attemptEval(value.consequent)\n if (shouldPrintDebug) {\n const type = value.test.type\n console.log(' static ternary', type, cVal, aVal)\n }\n return {\n test: value.test,\n remove,\n consequent: { [name]: cVal },\n alternate: { [name]: aVal },\n }\n } catch (err: any) {\n if (shouldPrintDebug) {\n console.log(' cant eval ternary', err.message)\n }\n }\n }\n return null\n }\n\n function getStaticLogical(value: t.Node): Ternary | null {\n if (t.isLogicalExpression(value)) {\n if (value.operator === '&&') {\n try {\n const val = attemptEval(value.right)\n if (shouldPrintDebug) {\n console.log(' staticLogical', value.left, name, val)\n }\n return {\n test: value.left,\n remove,\n consequent: { [name]: val },\n alternate: null,\n }\n } catch (err) {\n if (shouldPrintDebug) {\n console.log(' cant static eval logical', err)\n }\n }\n }\n }\n return null\n }\n } // END function evaluateAttribute\n\n // see if we can filter them\n if (shouldPrintDebug) {\n console.log(' - attrs (before):\\n', logLines(attrs.map(attrStr).join(', ')))\n }\n\n // now update to new values\n node.attributes = attrs.filter(isAttr).map((x) => x.value)\n\n if (couldntParse) {\n if (shouldPrintDebug) {\n console.log(` cancel:`, { couldntParse, shouldDeopt })\n }\n node.attributes = ogAttributes\n return\n }\n\n // before deopt, can still optimize\n const parentFn = findTopmostFunction(traversePath)\n if (parentFn) {\n modifiedComponents.add(parentFn)\n }\n\n // combine ternaries\n let ternaries: Ternary[] = []\n attrs = attrs\n .reduce<(ExtractedAttr | ExtractedAttr[])[]>((out, cur) => {\n const next = attrs[attrs.indexOf(cur) + 1]\n if (cur.type === 'ternary') {\n ternaries.push(cur.value)\n }\n if ((!next || next.type !== 'ternary') && ternaries.length) {\n // finish, process\n const normalized = normalizeTernaries(ternaries).map(\n ({ alternate, consequent, ...rest }) => {\n return {\n type: 'ternary' as const,\n value: {\n ...rest,\n alternate: alternate || null,\n consequent: consequent || null,\n },\n }\n }\n )\n try {\n return [...out, ...normalized]\n } finally {\n if (shouldPrintDebug) {\n console.log(\n ` normalizeTernaries (${ternaries.length} => ${normalized.length})`\n )\n }\n ternaries = []\n }\n }\n if (cur.type === 'ternary') {\n return out\n }\n out.push(cur)\n return out\n }, [])\n .flat()\n\n // evaluates all static attributes into a simple object\n const completeStaticProps = {\n ...Object.keys(attrs).reduce((acc, index) => {\n const cur = attrs[index] as ExtractedAttr\n if (cur.type === 'style') {\n Object.assign(acc, cur.value)\n }\n if (cur.type === 'attr') {\n if (t.isJSXSpreadAttribute(cur.value)) {\n return acc\n }\n if (!t.isJSXIdentifier(cur.value.name)) {\n return acc\n }\n const key = cur.value.name.name\n // undefined = boolean true\n const value = attemptEvalSafe(cur.value.value || t.booleanLiteral(true))\n if (value === FAILED_EVAL) {\n return acc\n }\n acc[key] = value\n }\n return acc\n }, {}),\n }\n\n // flatten logic!\n // fairly simple check to see if all children are text\n const hasSpread = node.attributes.some((x) => t.isJSXSpreadAttribute(x))\n const hasOnlyStringChildren =\n !hasSpread &&\n (node.selfClosing ||\n (traversePath.node.children &&\n traversePath.node.children.every((x) => x.type === 'JSXText')))\n const shouldFlatten =\n !shouldDeopt &&\n inlinePropCount === 0 &&\n !hasSpread &&\n staticConfig.neverFlatten !== true &&\n (staticConfig.neverFlatten === 'jsx' ? hasOnlyStringChildren : true)\n\n // insert overrides - this inserts null props for things that are set in classNames\n // only when not flattening, so the downstream component can skip applying those styles\n if (!shouldFlatten) {\n attrs = attrs.reduce<ExtractedAttr[]>((acc, cur) => {\n if (cur.type === 'style') {\n // TODO need to loop over initial props not just style props\n for (const key in cur.value) {\n const shouldEnsureOverridden = !!staticConfig.ensureOverriddenProp?.[key]\n const isSetInAttrsAlready = attrs.some(\n (x) =>\n x.type === 'attr' &&\n x.value.type === 'JSXAttribute' &&\n x.value.name.name === key\n )\n\n if (!isSetInAttrsAlready) {\n const isVariant = !!staticConfig.variants?.[cur.name || '']\n if (isVariant || shouldEnsureOverridden) {\n acc.push({\n type: 'attr',\n value:\n cur.attr ||\n t.jsxAttribute(\n t.jsxIdentifier(key),\n t.jsxExpressionContainer(t.nullLiteral())\n ),\n })\n }\n }\n }\n }\n acc.push(cur)\n return acc\n }, [])\n }\n\n if (shouldPrintDebug) {\n console.log(' - attrs (flattened): \\n', logLines(attrs.map(attrStr).join(', ')))\n }\n\n // evaluate away purely style props\n attrs = attrs.reduce<ExtractedAttr[]>((acc, cur) => {\n if (\n cur.type !== 'attr' ||\n !t.isJSXAttribute(cur.value) ||\n typeof cur.value.name.name !== 'string'\n ) {\n if (cur.type === 'style') {\n const key = Object.keys(cur.value)[0]\n if (!validStyles[key] && !pseudos[key]) {\n if (shouldPrintDebug) {\n console.log(' \u274C excluding', key)\n }\n // we've already expanded shorthands, now we can remove them\n return acc\n }\n }\n }\n acc.push(cur)\n return acc\n }, [])\n\n if (shouldPrintDebug) {\n console.log(' - attrs (evaluated styles): \\n', logLines(attrs.map(attrStr).join(', ')))\n }\n\n // combine styles, leave undefined values\n let prev: ExtractedAttr | null = null\n attrs = attrs.reduce<ExtractedAttr[]>((acc, cur) => {\n if (cur.type === 'style') {\n if (prev?.type === 'style') {\n Object.assign(prev.value, cur.value)\n return acc\n }\n }\n acc.push(cur)\n prev = cur\n return acc\n }, [])\n\n if (shouldPrintDebug) {\n console.log(' - attrs (combined \uD83D\uDD00): \\n', logLines(attrs.map(attrStr).join(', ')))\n }\n\n // post process\n const getStyles = (props: Object | null) => {\n if (!props) return\n if (!!excludeProps.size) {\n for (const key in props) {\n if (isExcludedProp(key)) delete props[key]\n }\n }\n\n const out = postProcessStyles(props, staticConfig, defaultTheme)\n const next = out?.style ?? props\n if (shouldPrintDebug) {\n console.log(' getStyles props >>\\n', logLines(objToStr(props)))\n console.log(' getStyles next >>\\n', logLines(objToStr(next)))\n console.log(' getStyles style >>\\n', logLines(objToStr(out.style)))\n console.log(' getStyles viewp >>\\n', logLines(objToStr(out.viewProps)))\n }\n if (staticConfig.validStyles) {\n for (const key in next) {\n if (!staticConfig.validStyles[key] && !pseudos[key]) {\n delete next[key]\n }\n }\n }\n return next\n }\n\n // used to ensure we pass the entire prop bundle to getStyles\n const completeStylesProcessed = getStyles({\n ...staticConfig.defaultProps,\n ...completeStaticProps,\n })\n\n // any extra styles added in postprocess should be added to first group as they wont be overriden\n const stylesToAddToInitialGroup = difference(\n Object.keys(completeStylesProcessed),\n Object.keys(completeStaticProps)\n )\n\n if (stylesToAddToInitialGroup.length) {\n const toAdd = pick(completeStylesProcessed, ...stylesToAddToInitialGroup)\n const firstGroup = attrs.find((x) => x.type === 'style')\n if (shouldPrintDebug) {\n console.log(' stylesToAddToInitialGroup', stylesToAddToInitialGroup.join(', '))\n console.log(' toAdd', objToStr(toAdd))\n }\n if (!firstGroup) {\n attrs.unshift({ type: 'style', value: toAdd })\n } else {\n Object.assign(firstGroup.value, toAdd)\n }\n }\n\n if (shouldPrintDebug) {\n // prettier-ignore\n console.log(' completeStaticProps\\n', logLines(objToStr(completeStaticProps)))\n // prettier-ignore\n console.log(' completeStylesProcessed\\n', logLines(objToStr(completeStylesProcessed)))\n }\n\n for (const attr of attrs) {\n try {\n switch (attr.type) {\n case 'ternary':\n const a = getStyles(attr.value.alternate)\n const c = getStyles(attr.value.consequent)\n attr.value.alternate = a\n attr.value.consequent = c\n if (shouldPrintDebug) {\n console.log(' => tern ', attrStr(attr))\n }\n break\n case 'style':\n const next = {}\n for (const key in attr.value) {\n if (key in stylePropsTransform) {\n // TODO this logic needs to be a bit more right, because could have spread in between transforms...\n next['transform'] = completeStylesProcessed['transform']\n } else {\n next[key] = completeStylesProcessed[key] ?? attr.value[key]\n }\n }\n attr.value = next\n break\n }\n } catch (err) {\n // any error de-opt\n if (shouldPrintDebug) {\n console.log(' postprocessing error, deopt', err)\n node.attributes = ogAttributes\n return node\n }\n }\n }\n\n if (shouldPrintDebug) {\n console.log(' - attrs (after):\\n', logLines(attrs.map(attrStr).join(', ')))\n }\n\n if (shouldFlatten) {\n // DO FLATTEN\n if (shouldPrintDebug) {\n console.log(' [\u2705] flattening', originalNodeName, flatNode)\n }\n isFlattened = true\n node.name.name = flatNode\n res.flattened++\n if (closingElement) {\n closingElement.name.name = flatNode\n }\n }\n\n if (shouldPrintDebug) {\n // prettier-ignore\n console.log(' [\u274A] inline props ', inlinePropCount, shouldDeopt ? ' deopted' : '', hasSpread ? ' spread' : '', '!flatten', staticConfig.neverFlatten)\n console.log(' - attrs (end):\\n', logLines(attrs.map(attrStr).join(', ')))\n }\n\n res.optimized++\n\n onExtractTag({\n attrs,\n node,\n lineNumbers,\n filePath,\n attemptEval,\n jsxPath: traversePath,\n originalNodeName,\n isFlattened,\n programPath,\n })\n },\n })\n\n /**\n * Step 3: Remove dead code from removed media query / theme hooks\n */\n if (modifiedComponents.size) {\n const all = Array.from(modifiedComponents)\n if (shouldPrintDebug) {\n console.log(' [\uD83E\uDE9D] hook check', all.length)\n }\n for (const comp of all) {\n removeUnusedHooks(comp, shouldPrintDebug)\n }\n }\n\n return res\n },\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["
|
|
3
|
+
"sources": ["../../../src/extractor/ensureImportingConcat.ts"],
|
|
4
4
|
"sourcesContent": ["import { NodePath } from '@babel/traverse'\nimport * as t from '@babel/types'\n\nimport { CONCAT_CLASSNAME_IMPORT } from './extractToClassNames'\n\nconst importConcatPkg = '@tamagui/helpers'\n\nexport function ensureImportingConcat(path: NodePath<t.Program>) {\n const bodyPath = path.get('body')\n const imported: NodePath<t.ImportDeclaration> | undefined = bodyPath.find(\n (x) => x.isImportDeclaration() && x.node.source.value === importConcatPkg\n ) as any\n const importSpecifier = t.importSpecifier(\n t.identifier(CONCAT_CLASSNAME_IMPORT),\n t.identifier(CONCAT_CLASSNAME_IMPORT)\n )\n\n if (!imported) {\n path.node.body.push(t.importDeclaration([importSpecifier], t.stringLiteral(importConcatPkg)))\n return\n }\n\n const specifiers = imported.node.specifiers\n const alreadyImported = specifiers.some(\n (x) => t.isImportSpecifier(x) && t.isIdentifier(x.imported) && x.imported.name === CONCAT_CLASSNAME_IMPORT\n )\n\n if (!alreadyImported) {\n specifiers.push(\n t.importSpecifier(t.identifier(CONCAT_CLASSNAME_IMPORT), t.identifier(CONCAT_CLASSNAME_IMPORT))\n )\n }\n}\n"],
|
|
5
5
|
"mappings": ";;AACA;AAEA;AAEA,MAAM,kBAAkB;AAEjB,+BAA+B,MAA2B;AAC/D,QAAM,WAAW,KAAK,IAAI;AAC1B,QAAM,WAAsD,SAAS,KACnE,CAAC,MAAM,EAAE,yBAAyB,EAAE,KAAK,OAAO,UAAU;AAE5D,QAAM,kBAAkB,EAAE,gBACxB,EAAE,WAAW,0BACb,EAAE,WAAW;AAGf,MAAI,CAAC,UAAU;AACb,SAAK,KAAK,KAAK,KAAK,EAAE,kBAAkB,CAAC,kBAAkB,EAAE,cAAc;AAC3E;AAAA;AAGF,QAAM,aAAa,SAAS,KAAK;AACjC,QAAM,kBAAkB,WAAW,KACjC,CAAC,MAAM,EAAE,kBAAkB,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,SAAS;AAGrF,MAAI,CAAC,iBAAiB;AACpB,eAAW,KACT,EAAE,gBAAgB,EAAE,WAAW,0BAA0B,EAAE,WAAW;AAAA;AAAA;AAtB5D;",
|
|
6
6
|
"names": []
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["
|
|
3
|
+
"sources": ["../../../src/extractor/evaluateAstNode.ts"],
|
|
4
4
|
"sourcesContent": ["import * as t from '@babel/types'\n\nexport function evaluateAstNode(\n exprNode: t.Node | undefined | null,\n evalFn?: (node: t.Node) => any,\n shouldPrintDebug?: boolean\n): any {\n if (exprNode === undefined) {\n return undefined\n }\n\n // null === boolean true (at least in our use cases for jsx eval)\n if (exprNode === null) {\n return true\n }\n\n if (t.isJSXExpressionContainer(exprNode)) {\n return evaluateAstNode(exprNode.expression)\n }\n\n // loop through ObjectExpression keys\n if (t.isObjectExpression(exprNode)) {\n const ret: Record<string, any> = {}\n for (let idx = -1, len = exprNode.properties.length; ++idx < len; ) {\n const value = exprNode.properties[idx]\n\n if (!t.isObjectProperty(value)) {\n throw new Error('evaluateAstNode can only evaluate object properties')\n }\n\n let key: string | number | null | undefined | boolean\n if (value.computed) {\n if (typeof evalFn !== 'function') {\n throw new Error(\n 'evaluateAstNode does not support computed keys unless an eval function is provided'\n )\n }\n key = evaluateAstNode(value.key, evalFn)\n } else if (t.isIdentifier(value.key)) {\n key = value.key.name\n } else if (t.isStringLiteral(value.key) || t.isNumericLiteral(value.key)) {\n key = value.key.value\n } else {\n throw new Error('Unsupported key type: ' + value.key.type)\n }\n\n if (typeof key !== 'string' && typeof key !== 'number') {\n throw new Error('key must be either a string or a number')\n }\n\n ret[key] = evaluateAstNode(value.value, evalFn)\n }\n return ret\n }\n\n if (t.isArrayExpression(exprNode)) {\n return exprNode.elements.map((x) => {\n return evaluateAstNode(x as any, evalFn)\n })\n }\n\n if (t.isUnaryExpression(exprNode) && exprNode.operator === '-') {\n const ret = evaluateAstNode(exprNode.argument, evalFn)\n if (ret == null) {\n return null\n }\n return -ret\n }\n\n if (t.isTemplateLiteral(exprNode)) {\n if (typeof evalFn !== 'function') {\n throw new Error(\n 'evaluateAstNode does not support template literals unless an eval function is provided'\n )\n }\n\n let ret: string = ''\n for (let idx = -1, len = exprNode.quasis.length; ++idx < len; ) {\n const quasi = exprNode.quasis[idx]\n const expr = exprNode.expressions[idx]\n ret += quasi.value.raw\n if (expr) {\n ret += evaluateAstNode(expr, evalFn)\n }\n }\n return ret\n }\n\n // In the interest of representing the \"evaluated\" prop\n // as the user intended, we support negative null. Why not.\n if (t.isNullLiteral(exprNode)) {\n return null\n }\n\n if (t.isNumericLiteral(exprNode) || t.isStringLiteral(exprNode) || t.isBooleanLiteral(exprNode)) {\n // In the interest of representing the \"evaluated\" prop\n // as the user intended, we support negative null. Why not.\n return exprNode.value\n }\n\n if (t.isBinaryExpression(exprNode)) {\n if (exprNode.operator === '+') {\n return evaluateAstNode(exprNode.left, evalFn) + evaluateAstNode(exprNode.right, evalFn)\n } else if (exprNode.operator === '-') {\n return evaluateAstNode(exprNode.left, evalFn) - evaluateAstNode(exprNode.right, evalFn)\n } else if (exprNode.operator === '*') {\n return evaluateAstNode(exprNode.left, evalFn) * evaluateAstNode(exprNode.right, evalFn)\n } else if (exprNode.operator === '/') {\n return evaluateAstNode(exprNode.left, evalFn) / evaluateAstNode(exprNode.right, evalFn)\n }\n }\n\n // if we've made it this far, the value has to be evaluated\n if (typeof evalFn !== 'function') {\n throw new Error(\n 'evaluateAstNode does not support non-literal values unless an eval function is provided'\n )\n }\n\n return evalFn(exprNode)\n}\n"],
|
|
5
5
|
"mappings": ";;AAAA;AAEO,yBACL,UACA,QACA,kBACK;AACL,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA;AAIT,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA;AAGT,MAAI,EAAE,yBAAyB,WAAW;AACxC,WAAO,gBAAgB,SAAS;AAAA;AAIlC,MAAI,EAAE,mBAAmB,WAAW;AAClC,UAAM,MAA2B;AACjC,aAAS,MAAM,IAAI,MAAM,SAAS,WAAW,QAAQ,EAAE,MAAM,OAAO;AAClE,YAAM,QAAQ,SAAS,WAAW;AAElC,UAAI,CAAC,EAAE,iBAAiB,QAAQ;AAC9B,cAAM,IAAI,MAAM;AAAA;AAGlB,UAAI;AACJ,UAAI,MAAM,UAAU;AAClB,YAAI,OAAO,WAAW,YAAY;AAChC,gBAAM,IAAI,MACR;AAAA;AAGJ,cAAM,gBAAgB,MAAM,KAAK;AAAA,iBACxB,EAAE,aAAa,MAAM,MAAM;AACpC,cAAM,MAAM,IAAI;AAAA,iBACP,EAAE,gBAAgB,MAAM,QAAQ,EAAE,iBAAiB,MAAM,MAAM;AACxE,cAAM,MAAM,IAAI;AAAA,aACX;AACL,cAAM,IAAI,MAAM,2BAA2B,MAAM,IAAI;AAAA;AAGvD,UAAI,OAAO,QAAQ,YAAY,OAAO,QAAQ,UAAU;AACtD,cAAM,IAAI,MAAM;AAAA;AAGlB,UAAI,OAAO,gBAAgB,MAAM,OAAO;AAAA;AAE1C,WAAO;AAAA;AAGT,MAAI,EAAE,kBAAkB,WAAW;AACjC,WAAO,SAAS,SAAS,IAAI,CAAC,MAAM;AAClC,aAAO,gBAAgB,GAAU;AAAA;AAAA;AAIrC,MAAI,EAAE,kBAAkB,aAAa,SAAS,aAAa,KAAK;AAC9D,UAAM,MAAM,gBAAgB,SAAS,UAAU;AAC/C,QAAI,OAAO,MAAM;AACf,aAAO;AAAA;AAET,WAAO,CAAC;AAAA;AAGV,MAAI,EAAE,kBAAkB,WAAW;AACjC,QAAI,OAAO,WAAW,YAAY;AAChC,YAAM,IAAI,MACR;AAAA;AAIJ,QAAI,MAAc;AAClB,aAAS,MAAM,IAAI,MAAM,SAAS,OAAO,QAAQ,EAAE,MAAM,OAAO;AAC9D,YAAM,QAAQ,SAAS,OAAO;AAC9B,YAAM,OAAO,SAAS,YAAY;AAClC,aAAO,MAAM,MAAM;AACnB,UAAI,MAAM;AACR,eAAO,gBAAgB,MAAM;AAAA;AAAA;AAGjC,WAAO;AAAA;AAKT,MAAI,EAAE,cAAc,WAAW;AAC7B,WAAO;AAAA;AAGT,MAAI,EAAE,iBAAiB,aAAa,EAAE,gBAAgB,aAAa,EAAE,iBAAiB,WAAW;AAG/F,WAAO,SAAS;AAAA;AAGlB,MAAI,EAAE,mBAAmB,WAAW;AAClC,QAAI,SAAS,aAAa,KAAK;AAC7B,aAAO,gBAAgB,SAAS,MAAM,UAAU,gBAAgB,SAAS,OAAO;AAAA,eACvE,SAAS,aAAa,KAAK;AACpC,aAAO,gBAAgB,SAAS,MAAM,UAAU,gBAAgB,SAAS,OAAO;AAAA,eACvE,SAAS,aAAa,KAAK;AACpC,aAAO,gBAAgB,SAAS,MAAM,UAAU,gBAAgB,SAAS,OAAO;AAAA,eACvE,SAAS,aAAa,KAAK;AACpC,aAAO,gBAAgB,SAAS,MAAM,UAAU,gBAAgB,SAAS,OAAO;AAAA;AAAA;AAKpF,MAAI,OAAO,WAAW,YAAY;AAChC,UAAM,IAAI,MACR;AAAA;AAIJ,SAAO,OAAO;AAAA;AArHA;",
|
|
6
6
|
"names": []
|
|
@@ -78,7 +78,9 @@ function isValidThemeHook(jsxPath, n, sourcePath) {
|
|
|
78
78
|
return true;
|
|
79
79
|
}
|
|
80
80
|
__name(isValidThemeHook, "isValidThemeHook");
|
|
81
|
-
const isInsideTamagui = /* @__PURE__ */ __name((srcName) =>
|
|
81
|
+
const isInsideTamagui = /* @__PURE__ */ __name((srcName) => {
|
|
82
|
+
return srcName.includes("/dist/jsx") || srcName.includes("/core/src");
|
|
83
|
+
}, "isInsideTamagui");
|
|
82
84
|
export {
|
|
83
85
|
attrStr,
|
|
84
86
|
findComponentName,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["
|
|
4
|
-
"sourcesContent": ["import type { NodePath } from '@babel/traverse'\nimport * as t from '@babel/types'\n\nimport { ExtractedAttr, Ternary } from '../types'\n\nexport function isPresent<T extends Object>(input: null | void | undefined | T): input is T {\n return input != null\n}\n\nexport function isSimpleSpread(node: t.JSXSpreadAttribute) {\n return t.isIdentifier(node.argument) || t.isMemberExpression(node.argument)\n}\n\nexport const attrStr = (attr: ExtractedAttr) => {\n return attr.type === 'attr'\n ? getNameAttr(attr.value)\n : attr.type === 'ternary'\n ? `...${ternaryStr(attr.value)}`\n : `${attr.type}(${objToStr(attr.value)})`\n}\n\nexport const objToStr = (obj: any) => {\n return Object.entries(obj)\n .map(\n ([k, v]) =>\n `${k}:${Array.isArray(v) ? `[...]` : v && typeof v === 'object' ? `{${objToStr(v)}}` : v}`\n )\n .join(', ')\n}\n\nconst getNameAttr = (attr: t.JSXAttribute | t.JSXSpreadAttribute) => {\n if (t.isJSXSpreadAttribute(attr)) {\n return `...${attr.argument['name']}`\n }\n return 'name' in attr ? attr.name.name : `unknown-${attr['type']}`\n}\n\nexport const ternaryStr = (x: Ternary) => {\n return [\n 'ternary:',\n t.isIdentifier(x.test)\n ? x.test.name\n : t.isMemberExpression(x.test)\n ? [x.test.object['name'], x.test.property['name']]\n : x.test,\n x.consequent ? ` ? ${objToStr(x.consequent)}` : ' ? \u26AB\uFE0F',\n x.alternate ? ` : ${objToStr(x.alternate)}` : ' : \u26AB\uFE0F',\n ]\n .flat()\n .join('')\n}\n\nexport function findComponentName(scope) {\n let componentName = ''\n let cur = scope.path\n while (cur.parentPath && !t.isProgram(cur.parentPath.parent)) {\n cur = cur.parentPath\n }\n let node = cur.parent\n if (t.isExportNamedDeclaration(node)) {\n node = node.declaration\n }\n if (t.isVariableDeclaration(node)) {\n const [dec] = node.declarations\n if (t.isVariableDeclarator(dec) && t.isIdentifier(dec.id)) {\n return dec.id.name\n }\n }\n if (t.isFunctionDeclaration(node)) {\n return node.id?.name\n }\n return componentName\n}\n\nexport function isValidThemeHook(\n jsxPath: NodePath<t.JSXElement>,\n n: t.MemberExpression,\n sourcePath: string\n) {\n if (!t.isIdentifier(n.object) || !t.isIdentifier(n.property)) return false\n const bindings = jsxPath.scope.getAllBindings()\n const binding = bindings[n.object.name]\n if (!binding?.path) return false\n if (!binding.path.isVariableDeclarator()) return false\n const init = binding.path.node.init\n if (!t.isCallExpression(init)) return false\n if (!t.isIdentifier(init.callee)) return false\n // TODO could support renaming useTheme by looking up import first\n if (init.callee.name !== 'useTheme') return false\n const importNode = binding.scope.getBinding('useTheme')?.path.parent\n if (!t.isImportDeclaration(importNode)) return false\n if (importNode.source.value !== 'tamagui') {\n if (!isInsideTamagui(sourcePath)) {\n return false\n }\n }\n return true\n}\n\nexport const isInsideTamagui = (srcName: string)
|
|
5
|
-
"mappings": ";;AACA;AAIO,mBAAqC,OAAgD;AAC1F,SAAO,SAAS;AAAA;AADF;AAIT,wBAAwB,MAA4B;AACzD,SAAO,EAAE,aAAa,KAAK,aAAa,EAAE,mBAAmB,KAAK;AAAA;AADpD;AAIT,MAAM,UAAU,wBAAC,SAAwB;AAC9C,SAAO,KAAK,SAAS,SACjB,YAAY,KAAK,SACjB,KAAK,SAAS,YACd,MAAM,WAAW,KAAK,WACtB,GAAG,KAAK,QAAQ,SAAS,KAAK;AAAA,GALb;AAQhB,MAAM,WAAW,wBAAC,QAAa;AACpC,SAAO,OAAO,QAAQ,KACnB,IACC,CAAC,CAAC,GAAG,OACH,GAAG,KAAK,MAAM,QAAQ,KAAK,UAAU,KAAK,OAAO,MAAM,WAAW,IAAI,SAAS,QAAQ,KAE1F,KAAK;AAAA,GANc;AASxB,MAAM,cAAc,wBAAC,SAAgD;AACnE,MAAI,EAAE,qBAAqB,OAAO;AAChC,WAAO,MAAM,KAAK,SAAS;AAAA;AAE7B,SAAO,UAAU,OAAO,KAAK,KAAK,OAAO,WAAW,KAAK;AAAA,GAJvC;AAOb,MAAM,aAAa,wBAAC,MAAe;AACxC,SAAO;AAAA,IACL;AAAA,IACA,EAAE,aAAa,EAAE,QACb,EAAE,KAAK,OACP,EAAE,mBAAmB,EAAE,QACvB,CAAC,EAAE,KAAK,OAAO,SAAS,EAAE,KAAK,SAAS,WACxC,EAAE;AAAA,IACN,EAAE,aAAa,OAAO,SAAS,EAAE,gBAAgB;AAAA,IACjD,EAAE,YAAY,OAAO,SAAS,EAAE,eAAe;AAAA,IAE9C,OACA,KAAK;AAAA,GAZgB;AAenB,2BAA2B,OAAO;AACvC,MAAI,gBAAgB;AACpB,MAAI,MAAM,MAAM;AAChB,SAAO,IAAI,cAAc,CAAC,EAAE,UAAU,IAAI,WAAW,SAAS;AAC5D,UAAM,IAAI;AAAA;AAEZ,MAAI,OAAO,IAAI;AACf,MAAI,EAAE,yBAAyB,OAAO;AACpC,WAAO,KAAK;AAAA;AAEd,MAAI,EAAE,sBAAsB,OAAO;AACjC,UAAM,CAAC,OAAO,KAAK;AACnB,QAAI,EAAE,qBAAqB,QAAQ,EAAE,aAAa,IAAI,KAAK;AACzD,aAAO,IAAI,GAAG;AAAA;AAAA;AAGlB,MAAI,EAAE,sBAAsB,OAAO;AACjC,WAAO,KAAK,IAAI;AAAA;AAElB,SAAO;AAAA;AAnBO;AAsBT,0BACL,SACA,GACA,YACA;AACA,MAAI,CAAC,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,aAAa,EAAE;AAAW,WAAO;AACrE,QAAM,WAAW,QAAQ,MAAM;AAC/B,QAAM,UAAU,SAAS,EAAE,OAAO;AAClC,MAAI,CAAC,SAAS;AAAM,WAAO;AAC3B,MAAI,CAAC,QAAQ,KAAK;AAAwB,WAAO;AACjD,QAAM,OAAO,QAAQ,KAAK,KAAK;AAC/B,MAAI,CAAC,EAAE,iBAAiB;AAAO,WAAO;AACtC,MAAI,CAAC,EAAE,aAAa,KAAK;AAAS,WAAO;AAEzC,MAAI,KAAK,OAAO,SAAS;AAAY,WAAO;AAC5C,QAAM,aAAa,QAAQ,MAAM,WAAW,aAAa,KAAK;AAC9D,MAAI,CAAC,EAAE,oBAAoB;AAAa,WAAO;AAC/C,MAAI,WAAW,OAAO,UAAU,WAAW;AACzC,QAAI,CAAC,gBAAgB,aAAa;AAChC,aAAO;AAAA;AAAA;AAGX,SAAO;AAAA;AAtBO;AAyBT,MAAM,kBAAkB,wBAAC,
|
|
3
|
+
"sources": ["../../../src/extractor/extractHelpers.ts"],
|
|
4
|
+
"sourcesContent": ["import type { NodePath } from '@babel/traverse'\nimport * as t from '@babel/types'\n\nimport { ExtractedAttr, Ternary } from '../types'\n\nexport function isPresent<T extends Object>(input: null | void | undefined | T): input is T {\n return input != null\n}\n\nexport function isSimpleSpread(node: t.JSXSpreadAttribute) {\n return t.isIdentifier(node.argument) || t.isMemberExpression(node.argument)\n}\n\nexport const attrStr = (attr: ExtractedAttr) => {\n return attr.type === 'attr'\n ? getNameAttr(attr.value)\n : attr.type === 'ternary'\n ? `...${ternaryStr(attr.value)}`\n : `${attr.type}(${objToStr(attr.value)})`\n}\n\nexport const objToStr = (obj: any) => {\n return Object.entries(obj)\n .map(\n ([k, v]) =>\n `${k}:${Array.isArray(v) ? `[...]` : v && typeof v === 'object' ? `{${objToStr(v)}}` : v}`\n )\n .join(', ')\n}\n\nconst getNameAttr = (attr: t.JSXAttribute | t.JSXSpreadAttribute) => {\n if (t.isJSXSpreadAttribute(attr)) {\n return `...${attr.argument['name']}`\n }\n return 'name' in attr ? attr.name.name : `unknown-${attr['type']}`\n}\n\nexport const ternaryStr = (x: Ternary) => {\n return [\n 'ternary:',\n t.isIdentifier(x.test)\n ? x.test.name\n : t.isMemberExpression(x.test)\n ? [x.test.object['name'], x.test.property['name']]\n : x.test,\n x.consequent ? ` ? ${objToStr(x.consequent)}` : ' ? \u26AB\uFE0F',\n x.alternate ? ` : ${objToStr(x.alternate)}` : ' : \u26AB\uFE0F',\n ]\n .flat()\n .join('')\n}\n\nexport function findComponentName(scope) {\n let componentName = ''\n let cur = scope.path\n while (cur.parentPath && !t.isProgram(cur.parentPath.parent)) {\n cur = cur.parentPath\n }\n let node = cur.parent\n if (t.isExportNamedDeclaration(node)) {\n node = node.declaration\n }\n if (t.isVariableDeclaration(node)) {\n const [dec] = node.declarations\n if (t.isVariableDeclarator(dec) && t.isIdentifier(dec.id)) {\n return dec.id.name\n }\n }\n if (t.isFunctionDeclaration(node)) {\n return node.id?.name\n }\n return componentName\n}\n\nexport function isValidThemeHook(\n jsxPath: NodePath<t.JSXElement>,\n n: t.MemberExpression,\n sourcePath: string\n) {\n if (!t.isIdentifier(n.object) || !t.isIdentifier(n.property)) return false\n const bindings = jsxPath.scope.getAllBindings()\n const binding = bindings[n.object.name]\n if (!binding?.path) return false\n if (!binding.path.isVariableDeclarator()) return false\n const init = binding.path.node.init\n if (!t.isCallExpression(init)) return false\n if (!t.isIdentifier(init.callee)) return false\n // TODO could support renaming useTheme by looking up import first\n if (init.callee.name !== 'useTheme') return false\n const importNode = binding.scope.getBinding('useTheme')?.path.parent\n if (!t.isImportDeclaration(importNode)) return false\n if (importNode.source.value !== 'tamagui') {\n if (!isInsideTamagui(sourcePath)) {\n return false\n }\n }\n return true\n}\n\nexport const isInsideTamagui = (srcName: string) => {\n return srcName.includes('/dist/jsx') || srcName.includes('/core/src')\n}\n"],
|
|
5
|
+
"mappings": ";;AACA;AAIO,mBAAqC,OAAgD;AAC1F,SAAO,SAAS;AAAA;AADF;AAIT,wBAAwB,MAA4B;AACzD,SAAO,EAAE,aAAa,KAAK,aAAa,EAAE,mBAAmB,KAAK;AAAA;AADpD;AAIT,MAAM,UAAU,wBAAC,SAAwB;AAC9C,SAAO,KAAK,SAAS,SACjB,YAAY,KAAK,SACjB,KAAK,SAAS,YACd,MAAM,WAAW,KAAK,WACtB,GAAG,KAAK,QAAQ,SAAS,KAAK;AAAA,GALb;AAQhB,MAAM,WAAW,wBAAC,QAAa;AACpC,SAAO,OAAO,QAAQ,KACnB,IACC,CAAC,CAAC,GAAG,OACH,GAAG,KAAK,MAAM,QAAQ,KAAK,UAAU,KAAK,OAAO,MAAM,WAAW,IAAI,SAAS,QAAQ,KAE1F,KAAK;AAAA,GANc;AASxB,MAAM,cAAc,wBAAC,SAAgD;AACnE,MAAI,EAAE,qBAAqB,OAAO;AAChC,WAAO,MAAM,KAAK,SAAS;AAAA;AAE7B,SAAO,UAAU,OAAO,KAAK,KAAK,OAAO,WAAW,KAAK;AAAA,GAJvC;AAOb,MAAM,aAAa,wBAAC,MAAe;AACxC,SAAO;AAAA,IACL;AAAA,IACA,EAAE,aAAa,EAAE,QACb,EAAE,KAAK,OACP,EAAE,mBAAmB,EAAE,QACvB,CAAC,EAAE,KAAK,OAAO,SAAS,EAAE,KAAK,SAAS,WACxC,EAAE;AAAA,IACN,EAAE,aAAa,OAAO,SAAS,EAAE,gBAAgB;AAAA,IACjD,EAAE,YAAY,OAAO,SAAS,EAAE,eAAe;AAAA,IAE9C,OACA,KAAK;AAAA,GAZgB;AAenB,2BAA2B,OAAO;AACvC,MAAI,gBAAgB;AACpB,MAAI,MAAM,MAAM;AAChB,SAAO,IAAI,cAAc,CAAC,EAAE,UAAU,IAAI,WAAW,SAAS;AAC5D,UAAM,IAAI;AAAA;AAEZ,MAAI,OAAO,IAAI;AACf,MAAI,EAAE,yBAAyB,OAAO;AACpC,WAAO,KAAK;AAAA;AAEd,MAAI,EAAE,sBAAsB,OAAO;AACjC,UAAM,CAAC,OAAO,KAAK;AACnB,QAAI,EAAE,qBAAqB,QAAQ,EAAE,aAAa,IAAI,KAAK;AACzD,aAAO,IAAI,GAAG;AAAA;AAAA;AAGlB,MAAI,EAAE,sBAAsB,OAAO;AACjC,WAAO,KAAK,IAAI;AAAA;AAElB,SAAO;AAAA;AAnBO;AAsBT,0BACL,SACA,GACA,YACA;AACA,MAAI,CAAC,EAAE,aAAa,EAAE,WAAW,CAAC,EAAE,aAAa,EAAE;AAAW,WAAO;AACrE,QAAM,WAAW,QAAQ,MAAM;AAC/B,QAAM,UAAU,SAAS,EAAE,OAAO;AAClC,MAAI,CAAC,SAAS;AAAM,WAAO;AAC3B,MAAI,CAAC,QAAQ,KAAK;AAAwB,WAAO;AACjD,QAAM,OAAO,QAAQ,KAAK,KAAK;AAC/B,MAAI,CAAC,EAAE,iBAAiB;AAAO,WAAO;AACtC,MAAI,CAAC,EAAE,aAAa,KAAK;AAAS,WAAO;AAEzC,MAAI,KAAK,OAAO,SAAS;AAAY,WAAO;AAC5C,QAAM,aAAa,QAAQ,MAAM,WAAW,aAAa,KAAK;AAC9D,MAAI,CAAC,EAAE,oBAAoB;AAAa,WAAO;AAC/C,MAAI,WAAW,OAAO,UAAU,WAAW;AACzC,QAAI,CAAC,gBAAgB,aAAa;AAChC,aAAO;AAAA;AAAA;AAGX,SAAO;AAAA;AAtBO;AAyBT,MAAM,kBAAkB,wBAAC,YAAoB;AAClD,SAAO,QAAQ,SAAS,gBAAgB,QAAQ,SAAS;AAAA,GAD5B;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["
|
|
3
|
+
"sources": ["../../../src/extractor/extractMediaStyle.ts"],
|
|
4
4
|
"sourcesContent": ["import { NodePath } from '@babel/traverse'\nimport * as t from '@babel/types'\nimport type { TamaguiInternalConfig } from '@tamagui/core'\nimport { getStylesAtomic, mediaObjectToString } from '@tamagui/core-node'\nimport { ViewStyle } from 'react-native'\n\nimport { MEDIA_SEP } from '../constants'\nimport { StyleObject, Ternary } from '../types'\nimport { isInsideTamagui, isPresent } from './extractHelpers'\n\nexport function extractMediaStyle(\n ternary: Ternary,\n jsxPath: NodePath<t.JSXElement>,\n tamaguiConfig: TamaguiInternalConfig,\n sourcePath: string,\n importance = 0,\n shouldPrintDebug = false\n) {\n const mt = getMediaQueryTernary(ternary, jsxPath, sourcePath)\n if (!mt) {\n return null\n }\n const { key } = mt\n const mq = tamaguiConfig.media[key]\n if (!mq) {\n console.error(`Media query \"${key}\" not found: ${Object.keys(tamaguiConfig.media)}`)\n return null\n }\n const getStyleObj = (styleObj: ViewStyle | null, negate = false) => {\n return styleObj ? { styleObj, negate } : null\n }\n const styleOpts = [\n getStyleObj(ternary.consequent, false),\n getStyleObj(ternary.alternate, true),\n ].filter(isPresent)\n if (shouldPrintDebug && !styleOpts.length) {\n console.log(' media query, no styles?')\n return null\n }\n // for now order first strongest\n const mediaKeys = Object.keys(tamaguiConfig.media)\n const mediaKeyPrecendence = mediaKeys.reduce((acc, cur, i) => {\n acc[cur] = new Array(importance + 1).fill(':root').join('')\n return acc\n }, {})\n let mediaStyles: StyleObject[] = []\n for (const { styleObj, negate } of styleOpts) {\n const styles = getStylesAtomic(styleObj)\n const singleMediaStyles = styles.map((style) => {\n const negKey = negate ? '0' : ''\n const ogPrefix = style.identifier.slice(0, style.identifier.indexOf('-') + 1)\n // adds an extra separator before and after to detect later in concatClassName\n // so it goes from: \"_f-[hash]\"\n // to: \"_f-_sm0_[hash]\" or \"_f-_sm_[hash]\"\n const identifier = `${style.identifier.replace(\n ogPrefix,\n `${ogPrefix}${MEDIA_SEP}${key}${negKey}${MEDIA_SEP}`\n )}`\n const className = `.${identifier}`\n const mediaSelector = mediaObjectToString(tamaguiConfig.media[key])\n const screenStr = negate ? 'not all' : 'screen'\n const mediaQuery = `${screenStr} and ${mediaSelector}`\n const precendencePrefix = mediaKeyPrecendence[key]\n const styleInner = style.rules[0].replace(style.identifier, identifier)\n // combines media queries if they already exist\n let styleRule = ''\n if (styleInner.includes('@media')) {\n // combine\n styleRule = styleInner.replace('{', ` and ${mediaQuery} {`)\n } else {\n styleRule = `@media ${mediaQuery} { ${precendencePrefix} ${styleInner} }`\n }\n return {\n ...style,\n identifier,\n className,\n rules: [styleRule],\n }\n })\n if (shouldPrintDebug) {\n // prettier-ignore\n console.log(' media styles:', importance, singleMediaStyles.map(x => x.identifier).join(', '))\n }\n // add to output\n mediaStyles = [...mediaStyles, ...singleMediaStyles]\n }\n // filter out\n ternary.remove()\n return { mediaStyles, ternaryWithoutMedia: mt.ternaryWithoutMedia }\n}\n\nfunction getMediaQueryTernary(\n ternary: Ternary,\n jsxPath: NodePath<t.JSXElement>,\n sourcePath: string\n): null | {\n key: string\n bindingName: string\n ternaryWithoutMedia: Ternary | null\n} {\n // this handles unwrapping logical && media query ternarys\n // first, unwrap if it has media logicalExpression\n if (t.isLogicalExpression(ternary.test) && ternary.test.operator === '&&') {\n // *should* be normalized to always be on left side, TODO verify\n const mediaLeft = getMediaInfoFromExpression(\n ternary.test.left,\n jsxPath,\n sourcePath,\n ternary.inlineMediaQuery\n )\n if (mediaLeft) {\n return {\n ...mediaLeft,\n ternaryWithoutMedia: {\n ...ternary,\n test: ternary.test.right,\n },\n }\n }\n }\n // const media = useMedia()\n // ... media.sm\n const result = getMediaInfoFromExpression(\n ternary.test,\n jsxPath,\n sourcePath,\n ternary.inlineMediaQuery\n )\n if (result) {\n return {\n ...result,\n ternaryWithoutMedia: null,\n }\n }\n return null\n}\n\nfunction getMediaInfoFromExpression(\n test: t.Expression,\n jsxPath: NodePath<t.JSXElement>,\n sourcePath: string,\n inlineMediaQuery?: string\n) {\n if (inlineMediaQuery) {\n return {\n key: inlineMediaQuery,\n bindingName: inlineMediaQuery,\n }\n }\n if (t.isMemberExpression(test) && t.isIdentifier(test.object) && t.isIdentifier(test.property)) {\n const name = test.object['name']\n const key = test.property['name']\n const bindings = jsxPath.scope.getAllBindings()\n const binding = bindings[name]\n if (!binding) return false\n const bindingNode = binding.path?.node\n if (!t.isVariableDeclarator(bindingNode) || !bindingNode.init) return false\n if (!isValidMediaCall(jsxPath, bindingNode.init, sourcePath)) return false\n return { key, bindingName: name }\n }\n if (t.isIdentifier(test)) {\n const key = test.name\n const node = jsxPath.scope.getBinding(test.name)?.path?.node\n if (!t.isVariableDeclarator(node)) return false\n if (!node.init || !isValidMediaCall(jsxPath, node.init, sourcePath)) return false\n return { key, bindingName: key }\n }\n return null\n}\n\nexport function isValidMediaCall(\n jsxPath: NodePath<t.JSXElement>,\n init: t.Expression,\n sourcePath: string\n) {\n if (!t.isCallExpression(init)) return false\n if (!t.isIdentifier(init.callee)) return false\n // TODO could support renaming useMedia by looking up import first\n if (init.callee.name !== 'useMedia') return false\n const bindings = jsxPath.scope.getAllBindings()\n const mediaBinding = bindings['useMedia']\n if (!mediaBinding) return false\n const useMediaImport = mediaBinding.path.parent\n if (!t.isImportDeclaration(useMediaImport)) return false\n if (useMediaImport.source.value !== 'tamagui') {\n if (!isInsideTamagui(sourcePath)) {\n return false\n }\n }\n return true\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|