@tamagui/static 1.0.0-alpha.53 → 1.0.0-alpha.57
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/extractor/createExtractor.js +64 -32
- package/dist/cjs/extractor/createExtractor.js.map +2 -2
- package/dist/cjs/extractor/extractToClassNames.js +6 -4
- package/dist/cjs/extractor/extractToClassNames.js.map +2 -2
- package/dist/esm/extractor/createExtractor.js +66 -33
- package/dist/esm/extractor/createExtractor.js.map +2 -2
- package/dist/esm/extractor/extractToClassNames.js +6 -4
- package/dist/esm/extractor/extractToClassNames.js.map +2 -2
- package/dist/jsx/extractor/createExtractor.js +66 -33
- package/dist/jsx/extractor/extractToClassNames.js +6 -4
- package/package.json +5 -4
- package/types/extractor/createExtractor.d.ts.map +1 -1
- package/types/extractor/extractToClassNames.d.ts.map +1 -1
|
@@ -525,7 +525,7 @@ function createExtractor() {
|
|
|
525
525
|
if (value) {
|
|
526
526
|
if (value.type === "StringLiteral" && value.value[0] === "$") {
|
|
527
527
|
if (shouldPrintDebug) {
|
|
528
|
-
console.log(
|
|
528
|
+
console.log(` native, disable extract: ${name} =`, value.value);
|
|
529
529
|
}
|
|
530
530
|
inlinePropCount++;
|
|
531
531
|
return attr;
|
|
@@ -541,7 +541,7 @@ function createExtractor() {
|
|
|
541
541
|
keys = Object.keys(out);
|
|
542
542
|
}
|
|
543
543
|
}
|
|
544
|
-
if (keys.some((k) => !isStaticAttributeName(k) && k !== "tag")) {
|
|
544
|
+
if (keys.some((k) => !isStaticAttributeName(k) && k !== "tag" && !k.startsWith("data-"))) {
|
|
545
545
|
if (shouldPrintDebug) {
|
|
546
546
|
console.log(" ! inlining, not static attribute name", name);
|
|
547
547
|
}
|
|
@@ -550,6 +550,9 @@ function createExtractor() {
|
|
|
550
550
|
}
|
|
551
551
|
}
|
|
552
552
|
if (styleValue !== import_constants.FAILED_EVAL) {
|
|
553
|
+
if (shouldPrintDebug) {
|
|
554
|
+
console.log(` style: ${name} =`, styleValue);
|
|
555
|
+
}
|
|
553
556
|
return {
|
|
554
557
|
type: "style",
|
|
555
558
|
value: { [name]: styleValue },
|
|
@@ -558,6 +561,9 @@ function createExtractor() {
|
|
|
558
561
|
};
|
|
559
562
|
}
|
|
560
563
|
if (t.isBinaryExpression(value)) {
|
|
564
|
+
if (shouldPrintDebug) {
|
|
565
|
+
console.log(` binary expression ${name} = `, value);
|
|
566
|
+
}
|
|
561
567
|
const { operator, left, right } = value;
|
|
562
568
|
const lVal = attemptEvalSafe(left);
|
|
563
569
|
const rVal = attemptEvalSafe(right);
|
|
@@ -582,16 +588,25 @@ function createExtractor() {
|
|
|
582
588
|
}
|
|
583
589
|
const staticConditional = getStaticConditional(value);
|
|
584
590
|
if (staticConditional) {
|
|
591
|
+
if (shouldPrintDebug) {
|
|
592
|
+
console.log(` static conditional ${name} = `, value);
|
|
593
|
+
}
|
|
585
594
|
return { type: "ternary", value: staticConditional };
|
|
586
595
|
}
|
|
587
596
|
const staticLogical = getStaticLogical(value);
|
|
588
597
|
if (staticLogical) {
|
|
598
|
+
if (shouldPrintDebug) {
|
|
599
|
+
console.log(` static ternary ${name} = `, value);
|
|
600
|
+
}
|
|
589
601
|
return { type: "ternary", value: staticLogical };
|
|
590
602
|
}
|
|
591
603
|
if (shouldPrintDebug) {
|
|
592
604
|
console.log(" ! inline prop via no match", name, value.type);
|
|
593
605
|
}
|
|
594
606
|
inlinePropCount++;
|
|
607
|
+
if (shouldPrintDebug) {
|
|
608
|
+
console.log(` inlining ${name} = `, value);
|
|
609
|
+
}
|
|
595
610
|
return attr;
|
|
596
611
|
function addBinaryConditional(operator, staticExpr, cond) {
|
|
597
612
|
if (getStaticConditional(cond)) {
|
|
@@ -760,15 +775,32 @@ function createExtractor() {
|
|
|
760
775
|
console.log(" - attrs (flattened): \n", (0, import_logLines.logLines)(attrs.map(import_extractHelpers.attrStr).join(", ")));
|
|
761
776
|
}
|
|
762
777
|
attrs = attrs.reduce((acc, cur) => {
|
|
763
|
-
if (cur.type
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
778
|
+
if (cur.type === "style") {
|
|
779
|
+
let key = Object.keys(cur.value)[0];
|
|
780
|
+
let value = cur.value[key];
|
|
781
|
+
const nonShortKey = tamaguiConfig.shorthands[key];
|
|
782
|
+
if (nonShortKey) {
|
|
783
|
+
cur.value = { [nonShortKey]: value };
|
|
784
|
+
key = nonShortKey;
|
|
785
|
+
}
|
|
786
|
+
if (disableExtractVariables) {
|
|
787
|
+
if (value[0] === "$") {
|
|
767
788
|
if (shouldPrintDebug) {
|
|
768
|
-
console.log(
|
|
789
|
+
console.log(` keeping variable inline: ${key} =`, value);
|
|
769
790
|
}
|
|
770
|
-
return
|
|
791
|
+
return [
|
|
792
|
+
{
|
|
793
|
+
type: "attr",
|
|
794
|
+
value: t.jsxAttribute(t.jsxIdentifier(key), t.jsxExpressionContainer(t.stringLiteral(value)))
|
|
795
|
+
}
|
|
796
|
+
];
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
if (!validStyles[key] && !import_core_node.pseudos[key]) {
|
|
800
|
+
if (shouldPrintDebug) {
|
|
801
|
+
console.log(" - ignoring (expanded already):", key);
|
|
771
802
|
}
|
|
803
|
+
return acc;
|
|
772
804
|
}
|
|
773
805
|
}
|
|
774
806
|
acc.push(cur);
|
|
@@ -804,13 +836,12 @@ function createExtractor() {
|
|
|
804
836
|
const out = (0, import_core_node.postProcessStyles)(props2, staticConfig, defaultTheme);
|
|
805
837
|
const next = (out == null ? void 0 : out.style) ?? props2;
|
|
806
838
|
if (shouldPrintDebug) {
|
|
807
|
-
console.log("
|
|
808
|
-
console.log("
|
|
809
|
-
console.log("
|
|
810
|
-
console.log(" getStyles viewp >>\n", (0, import_logLines.logLines)((0, import_extractHelpers.objToStr)(out.viewProps)));
|
|
839
|
+
console.log(" viewProps >>\n", (0, import_logLines.logLines)((0, import_extractHelpers.objToStr)(out.viewProps)));
|
|
840
|
+
console.log(" props >>\n", (0, import_logLines.logLines)((0, import_extractHelpers.objToStr)(props2)));
|
|
841
|
+
console.log(" next <<\n", (0, import_logLines.logLines)((0, import_extractHelpers.objToStr)(next)));
|
|
811
842
|
}
|
|
812
|
-
|
|
813
|
-
|
|
843
|
+
for (const key in next) {
|
|
844
|
+
if (staticConfig.validStyles) {
|
|
814
845
|
if (!staticConfig.validStyles[key] && !import_core_node.pseudos[key]) {
|
|
815
846
|
delete next[key];
|
|
816
847
|
}
|
|
@@ -824,7 +855,6 @@ function createExtractor() {
|
|
|
824
855
|
const toAdd = (0, import_lodash.pick)(completeStylesProcessed, ...stylesToAddToInitialGroup);
|
|
825
856
|
const firstGroup = attrs.find((x) => x.type === "style");
|
|
826
857
|
if (shouldPrintDebug) {
|
|
827
|
-
console.log(" stylesToAddToInitialGroup", stylesToAddToInitialGroup.join(", "));
|
|
828
858
|
console.log(" toAdd", (0, import_extractHelpers.objToStr)(toAdd));
|
|
829
859
|
}
|
|
830
860
|
if (!firstGroup) {
|
|
@@ -837,6 +867,7 @@ function createExtractor() {
|
|
|
837
867
|
console.log(" completeStaticProps\n", (0, import_logLines.logLines)((0, import_extractHelpers.objToStr)(completeStaticProps)));
|
|
838
868
|
console.log(" completeStylesProcessed\n", (0, import_logLines.logLines)((0, import_extractHelpers.objToStr)(completeStylesProcessed)));
|
|
839
869
|
}
|
|
870
|
+
let getStyleError = null;
|
|
840
871
|
for (const attr of attrs) {
|
|
841
872
|
try {
|
|
842
873
|
switch (attr.type) {
|
|
@@ -845,30 +876,31 @@ function createExtractor() {
|
|
|
845
876
|
const c = getStyles(attr.value.consequent);
|
|
846
877
|
attr.value.alternate = a;
|
|
847
878
|
attr.value.consequent = c;
|
|
848
|
-
if (shouldPrintDebug)
|
|
879
|
+
if (shouldPrintDebug)
|
|
849
880
|
console.log(" => tern ", (0, import_extractHelpers.attrStr)(attr));
|
|
850
|
-
|
|
851
|
-
break;
|
|
881
|
+
continue;
|
|
852
882
|
case "style":
|
|
853
|
-
const
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
883
|
+
for (const keyIn in attr.value) {
|
|
884
|
+
const [key, value] = (() => {
|
|
885
|
+
if (keyIn in import_helpers.stylePropsTransform) {
|
|
886
|
+
return ["transform", completeStylesProcessed["transform"]];
|
|
887
|
+
} else {
|
|
888
|
+
return [keyIn, completeStylesProcessed[keyIn] ?? attr.value[keyIn]];
|
|
889
|
+
}
|
|
890
|
+
})();
|
|
891
|
+
attr.value[key] = value;
|
|
860
892
|
}
|
|
861
|
-
|
|
862
|
-
break;
|
|
893
|
+
continue;
|
|
863
894
|
}
|
|
864
895
|
} catch (err) {
|
|
865
|
-
|
|
866
|
-
console.log(" postprocessing error, deopt", err);
|
|
867
|
-
node.attributes = ogAttributes;
|
|
868
|
-
return node;
|
|
869
|
-
}
|
|
896
|
+
getStyleError = err;
|
|
870
897
|
}
|
|
871
898
|
}
|
|
899
|
+
if (getStyleError) {
|
|
900
|
+
console.log(" \u26A0\uFE0F postprocessing error, deopt", getStyleError);
|
|
901
|
+
node.attributes = ogAttributes;
|
|
902
|
+
return node;
|
|
903
|
+
}
|
|
872
904
|
if (shouldPrintDebug) {
|
|
873
905
|
console.log(" - attrs (after):\n", (0, import_logLines.logLines)(attrs.map(import_extractHelpers.attrStr).join(", ")));
|
|
874
906
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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 { mediaQueryConfig, postProcessStyles, pseudos } from '@tamagui/core-node'\nimport { stylePropsTransform } from '@tamagui/helpers'\nimport { difference, pick } from 'lodash'\n\nimport { FAILED_EVAL } from '../constants'\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 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 if (key === 'StyleSheet') {\n // temp bugfix when wrapping styled(require('react-native-web').Input)\n continue\n }\n const serialize = require('babel-literal-to-ast')\n const val = staticConfig.defaultProps[key]\n try {\n const serializedDefaultProp = serialize(val)\n node.attributes.unshift(\n t.jsxAttribute(\n t.jsxIdentifier(key),\n typeof val === 'string'\n ? t.stringLiteral(val)\n : t.jsxExpressionContainer(serializedDefaultProp)\n )\n )\n } catch (err) {\n console.warn(\n `\u26A0\uFE0F Error evaluating default prop for component ${node.name.name}, prop ${key}\\n error: ${err}\\n value:`,\n val,\n '\\n defaultProps:',\n staticConfig.defaultProps\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 if (shouldPrintDebug) {\n console.log('Error extracting attribute', err.message, err.stack)\n console.log('node', path.node)\n }\n return {\n type: 'attr',\n value: path.node,\n } as const\n }\n })\n .flat(4)\n .filter(isPresent)\n\n if (shouldPrintDebug) {\n console.log(' - attrs (before):\\n', logLines(attrs.map(attrStr).join(', ')))\n }\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 // 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 let key = Object.keys(cur.value)[0]\n // const fullKey = tamaguiConfig.shorthands[key]\n // // expand shorthand here\n // if (fullKey) {\n // cur.value = { [fullKey]: cur.value[key] }\n // key = fullKey\n // }\n if (!validStyles[key] && !pseudos[key]) {\n if (shouldPrintDebug) {\n console.log(' - ignoring (expanded already):', 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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",
|
|
4
|
+
"sourcesContent": ["import traverse, { NodePath, Visitor } from '@babel/traverse'\nimport * as t from '@babel/types'\nimport type { StaticConfigParsed, TamaguiInternalConfig } from '@tamagui/core'\nimport { mediaQueryConfig, postProcessStyles, pseudos } from '@tamagui/core-node'\nimport { stylePropsTransform } from '@tamagui/helpers'\nimport { difference, pick } from 'lodash'\n\nimport { FAILED_EVAL } from '../constants'\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 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 if (key === 'StyleSheet') {\n // temp bugfix when wrapping styled(require('react-native-web').Input)\n continue\n }\n const serialize = require('babel-literal-to-ast')\n const val = staticConfig.defaultProps[key]\n try {\n const serializedDefaultProp = serialize(val)\n node.attributes.unshift(\n t.jsxAttribute(\n t.jsxIdentifier(key),\n typeof val === 'string'\n ? t.stringLiteral(val)\n : t.jsxExpressionContainer(serializedDefaultProp)\n )\n )\n } catch (err) {\n console.warn(\n `\u26A0\uFE0F Error evaluating default prop for component ${node.name.name}, prop ${key}\\n error: ${err}\\n value:`,\n val,\n '\\n defaultProps:',\n staticConfig.defaultProps\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 if (shouldPrintDebug) {\n console.log('Error extracting attribute', err.message, err.stack)\n console.log('node', path.node)\n }\n return {\n type: 'attr',\n value: path.node,\n } as const\n }\n })\n .flat(4)\n .filter(isPresent)\n\n if (shouldPrintDebug) {\n console.log(' - attrs (before):\\n', logLines(attrs.map(attrStr).join(', ')))\n }\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: ${name} =`, 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 (\n keys.some((k) => !isStaticAttributeName(k) && k !== 'tag' && !k.startsWith('data-'))\n ) {\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 if (shouldPrintDebug) {\n console.log(` style: ${name} =`, styleValue)\n }\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 if (shouldPrintDebug) {\n console.log(` binary expression ${name} = `, value)\n }\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 if (shouldPrintDebug) {\n console.log(` static conditional ${name} = `, value)\n }\n return { type: 'ternary', value: staticConditional }\n }\n\n const staticLogical = getStaticLogical(value)\n if (staticLogical) {\n if (shouldPrintDebug) {\n console.log(` static ternary ${name} = `, value)\n }\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 if (shouldPrintDebug) {\n console.log(` inlining ${name} = `, value)\n }\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 // 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 (cur.type === 'style') {\n let key = Object.keys(cur.value)[0]\n let value = cur.value[key]\n const nonShortKey = tamaguiConfig.shorthands[key]\n // expand shorthand here\n if (nonShortKey) {\n cur.value = { [nonShortKey]: value }\n key = nonShortKey\n }\n\n // finally we have all styles + expansions, lets see if we need to skip\n // any and keep them as attrs\n if (disableExtractVariables) {\n if (value[0] === '$') {\n if (shouldPrintDebug) {\n console.log(` keeping variable inline: ${key} =`, value)\n }\n return [\n {\n type: 'attr',\n value: t.jsxAttribute(\n t.jsxIdentifier(key),\n t.jsxExpressionContainer(t.stringLiteral(value))\n ),\n },\n ]\n }\n }\n\n if (!validStyles[key] && !pseudos[key]) {\n if (shouldPrintDebug) {\n console.log(' - ignoring (expanded already):', key)\n }\n // we've already expanded shorthands, now we can remove them\n return acc\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 const out = postProcessStyles(props, staticConfig, defaultTheme)\n const next = out?.style ?? props\n if (shouldPrintDebug) {\n console.log(' viewProps >>\\n', logLines(objToStr(out.viewProps)))\n console.log(' props >>\\n', logLines(objToStr(props)))\n console.log(' next <<\\n', logLines(objToStr(next)))\n }\n for (const key in next) {\n if (staticConfig.validStyles) {\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(' 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 let getStyleError: any = null\n\n // fix up ternaries, combine final style values\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) console.log(' => tern ', attrStr(attr))\n continue\n case 'style':\n for (const keyIn in attr.value) {\n const [key, value] = (() => {\n if (keyIn in stylePropsTransform) {\n // TODO this logic needs to be a bit more right, because could have spread in between transforms...\n return ['transform', completeStylesProcessed['transform']] as const\n } else {\n return [keyIn, completeStylesProcessed[keyIn] ?? attr.value[keyIn]] as const\n }\n })()\n attr.value[key] = value\n }\n continue\n }\n } catch (err) {\n // any error de-opt\n getStyleError = err\n }\n }\n\n if (getStyleError) {\n console.log(' \u26A0\uFE0F postprocessing error, deopt', getStyleError)\n node.attributes = ogAttributes\n return node\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
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -96,11 +96,15 @@ function extractToClassNames({
|
|
|
96
96
|
}
|
|
97
97
|
const cssMap = /* @__PURE__ */ new Map();
|
|
98
98
|
const existingHoists = {};
|
|
99
|
+
let hasFlattened = false;
|
|
99
100
|
const res = extractor.parse(ast, __spreadProps(__spreadValues({
|
|
100
101
|
sourcePath,
|
|
101
102
|
shouldPrintDebug
|
|
102
103
|
}, options), {
|
|
103
|
-
getFlattenedNode: ({ tag }) =>
|
|
104
|
+
getFlattenedNode: ({ tag }) => {
|
|
105
|
+
hasFlattened = true;
|
|
106
|
+
return tag;
|
|
107
|
+
},
|
|
104
108
|
onExtractTag: ({
|
|
105
109
|
attrs,
|
|
106
110
|
node,
|
|
@@ -210,10 +214,8 @@ function extractToClassNames({
|
|
|
210
214
|
const nameExpr = names ? (0, import_hoistClassNames.hoistClassNames)(jsxPath, existingHoists, names) : null;
|
|
211
215
|
let expr = nameExpr;
|
|
212
216
|
if (nameExpr && !t.isIdentifier(nameExpr)) {
|
|
213
|
-
if (!
|
|
214
|
-
console.log("not flat");
|
|
217
|
+
if (!hasFlattened) {
|
|
215
218
|
} else {
|
|
216
|
-
console.log("flat");
|
|
217
219
|
(0, import_ensureImportingConcat.ensureImportingConcat)(programPath);
|
|
218
220
|
const simpleSpreads = attrs.filter((x) => t.isJSXSpreadAttribute(x.value) && (0, import_extractHelpers.isSimpleSpread)(x.value));
|
|
219
221
|
expr = t.callExpression(t.identifier(import_constants.CONCAT_CLASSNAME_IMPORT), [
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/extractor/extractToClassNames.ts"],
|
|
4
|
-
"sourcesContent": ["import * as path from 'path'\nimport { basename } from 'path'\nimport * as util from 'util'\n\nimport generate from '@babel/generator'\nimport * as t from '@babel/types'\nimport { getStylesAtomic } from '@tamagui/core-node'\nimport { concatClassName } from '@tamagui/helpers'\nimport invariant from 'invariant'\nimport { getRemainingRequest } from 'loader-utils'\nimport { ViewStyle } from 'react-native'\n\nimport { CONCAT_CLASSNAME_IMPORT } from '../constants'\nimport { ClassNameObject, StyleObject, TamaguiOptions } from '../types'\nimport { babelParse } from './babelParse'\nimport { buildClassName } from './buildClassName'\nimport { Extractor } from './createExtractor'\nimport { ensureImportingConcat } from './ensureImportingConcat'\nimport { isSimpleSpread } from './extractHelpers'\nimport { extractMediaStyle } from './extractMediaStyle'\nimport { hoistClassNames } from './hoistClassNames'\nimport { logLines } from './logLines'\n\nconst mergeStyleGroups = {\n shadowOpacity: true,\n shadowRadius: true,\n shadowColor: true,\n shadowOffset: true,\n}\n\nexport function extractToClassNames({\n loader,\n extractor,\n source,\n sourcePath,\n options,\n shouldPrintDebug,\n threaded,\n cssPath,\n}: {\n loader: any\n extractor: Extractor\n source: string | Buffer\n sourcePath: string\n options: TamaguiOptions\n shouldPrintDebug: boolean\n cssPath: string\n threaded?: boolean\n}): null | {\n js: string | Buffer\n styles: string\n stylesPath?: string\n ast: t.File\n map: any // RawSourceMap from 'source-map'\n} {\n if (typeof source !== 'string') {\n throw new Error('`source` must be a string of javascript')\n }\n invariant(\n typeof sourcePath === 'string' && path.isAbsolute(sourcePath),\n '`sourcePath` must be an absolute path to a .js file'\n )\n\n const shouldLogTiming = options.logTimings ?? true\n const start = Date.now()\n const mem = shouldLogTiming ? process.memoryUsage() : null\n\n // Using a map for (officially supported) guaranteed insertion order\n let ast: t.File\n\n try {\n // @ts-ignore\n ast = babelParse(source)\n } catch (err) {\n console.error('babel parse error:', sourcePath)\n throw err\n }\n\n const cssMap = new Map<string, { css: string; commentTexts: string[] }>()\n const existingHoists: { [key: string]: t.Identifier } = {}\n\n const res = extractor.parse(ast, {\n sourcePath,\n shouldPrintDebug,\n ...options,\n getFlattenedNode: ({ tag }) => tag,\n onExtractTag: ({\n attrs,\n node,\n attemptEval,\n jsxPath,\n originalNodeName,\n filePath,\n lineNumbers,\n programPath,\n }) => {\n let finalClassNames: ClassNameObject[] = []\n let finalAttrs: (t.JSXAttribute | t.JSXSpreadAttribute)[] = []\n let finalStyles: StyleObject[] = []\n\n const viewStyles = {}\n for (const attr of attrs) {\n if (attr.type === 'style') {\n Object.assign(viewStyles, attr.value)\n }\n }\n\n const ensureNeededPrevStyle = (style: ViewStyle) => {\n // ensure all group keys are merged\n const keys = Object.keys(style)\n if (!keys.some((key) => mergeStyleGroups[key])) {\n return style\n }\n for (const k in mergeStyleGroups) {\n if (k in viewStyles) {\n style[k] = style[k] ?? viewStyles[k]\n }\n }\n return style\n }\n\n const addStyles = (style: ViewStyle | null) => {\n if (!style) return []\n const styleWithPrev = ensureNeededPrevStyle(style)\n const res = getStylesAtomic(styleWithPrev)\n if (res.length) {\n finalStyles = [...finalStyles, ...res]\n }\n return res\n }\n\n // 1 to start above any :hover styles\n let lastMediaImportance = 1\n for (const attr of attrs) {\n switch (attr.type) {\n case 'style':\n const styles = addStyles(attr.value)\n const newClassNames = concatClassName(styles.map((x) => x.identifier).join(' '))\n // prettier-ignore\n const existing = finalClassNames.find((x) => x.type == 'StringLiteral') as t.StringLiteral | null\n if (existing) {\n existing.value = `${existing.value} ${newClassNames}`\n } else {\n finalClassNames = [...finalClassNames, t.stringLiteral(newClassNames)]\n }\n if (shouldPrintDebug) {\n // prettier-ignore\n console.log(' classnames (after)\\n', logLines(finalClassNames.map(x => x['value']).join(' ')))\n }\n break\n case 'attr':\n const val = attr.value\n if (t.isJSXSpreadAttribute(val)) {\n if (isSimpleSpread(val)) {\n finalClassNames.push(\n t.logicalExpression(\n '&&',\n val.argument,\n t.memberExpression(val.argument, t.identifier('className'))\n )\n )\n }\n } else if (val.name.name === 'className') {\n const value = val.value\n if (value) {\n try {\n const evaluatedValue = attemptEval(value)\n finalClassNames.push(t.stringLiteral(evaluatedValue))\n } catch (e) {\n finalClassNames.push(value['expression'])\n }\n }\n continue\n }\n finalAttrs.push(val)\n break\n case 'ternary':\n const mediaExtraction = extractMediaStyle(\n attr.value,\n jsxPath,\n extractor.getTamagui(),\n sourcePath,\n lastMediaImportance,\n shouldPrintDebug\n )\n if (mediaExtraction) {\n lastMediaImportance++\n finalStyles = [...finalStyles, ...mediaExtraction.mediaStyles]\n finalClassNames = [\n ...finalClassNames,\n ...mediaExtraction.mediaStyles.map((x) => t.stringLiteral(x.identifier)),\n ]\n if (!mediaExtraction.ternaryWithoutMedia) {\n continue\n }\n }\n const ternary = mediaExtraction?.ternaryWithoutMedia || attr.value\n const consInfo = addStyles(ternary.consequent)\n const altInfo = addStyles(ternary.alternate)\n const cCN = consInfo.map((x) => x.identifier).join(' ')\n const aCN = altInfo.map((x) => x.identifier).join(' ')\n if (consInfo.length && altInfo.length) {\n finalClassNames.push(\n t.conditionalExpression(ternary.test, t.stringLiteral(cCN), t.stringLiteral(aCN))\n )\n } else {\n finalClassNames.push(\n t.conditionalExpression(\n ternary.test,\n t.stringLiteral(' ' + cCN),\n t.stringLiteral(' ' + aCN)\n )\n )\n }\n break\n }\n }\n\n node.attributes = finalAttrs\n\n if (finalClassNames.length) {\n // inserts the _cn variable and uses it for className\n const names = buildClassName(finalClassNames)\n const nameExpr = names ? hoistClassNames(jsxPath, existingHoists, names) : null\n let expr = nameExpr\n\n // if has some spreads, use concat helper\n if (nameExpr && !t.isIdentifier(nameExpr)) {\n if (!res?.flattened) {\n console.log('not flat')\n } else {\n console.log('flat')\n ensureImportingConcat(programPath)\n const simpleSpreads = attrs.filter(\n (x) => t.isJSXSpreadAttribute(x.value) && isSimpleSpread(x.value)\n )\n expr = t.callExpression(t.identifier(CONCAT_CLASSNAME_IMPORT), [\n expr,\n ...simpleSpreads.map((val) => val.value['argument']),\n ])\n }\n }\n\n node.attributes.push(\n t.jsxAttribute(t.jsxIdentifier('className'), t.jsxExpressionContainer(expr))\n )\n }\n\n const comment = util.format('/* %s:%s (%s) */', filePath, lineNumbers, originalNodeName)\n\n for (const { className, rules } of finalStyles) {\n if (cssMap.has(className)) {\n if (comment) {\n const val = cssMap.get(className)!\n val.commentTexts.push(comment)\n cssMap.set(className, val)\n }\n } else if (rules.length) {\n if (rules.length > 1) {\n console.log(' rules error', { rules })\n throw new Error(`Shouldn't have more than one rule`)\n }\n cssMap.set(className, {\n css: rules[0],\n commentTexts: [comment],\n })\n }\n }\n },\n })\n\n if (!res || (!res.modified && !res.optimized && !res.flattened)) {\n if (shouldPrintDebug) {\n console.log('no res or none modified', res)\n }\n return null\n }\n\n const styles = Array.from(cssMap.values())\n .map((x) => x.css)\n .join('\\n')\n .trim()\n\n if (styles) {\n const cssQuery = threaded\n ? `cssData=${Buffer.from(styles).toString('base64')}`\n : `cssPath=${cssPath}`\n const remReq = getRemainingRequest(loader)\n const importPath = `${cssPath}!=!tamagui-loader?${cssQuery}!${remReq}`\n ast.program.body.unshift(t.importDeclaration([], t.stringLiteral(importPath)))\n }\n\n const result = generate(\n ast,\n {\n concise: false,\n filename: sourcePath,\n retainLines: false,\n sourceFileName: sourcePath,\n sourceMaps: true,\n },\n source\n )\n\n if (shouldPrintDebug) {\n console.log(\n '\\n -------- output code ------- \\n\\n',\n result.code\n .split('\\n')\n .filter((x) => !x.startsWith('//'))\n .join('\\n')\n )\n console.log('\\n -------- output style -------- \\n\\n', styles)\n }\n\n if (shouldLogTiming) {\n const memUsed = mem\n ? Math.round(((process.memoryUsage().heapUsed - mem.heapUsed) / 1024 / 1204) * 10) / 10\n : 0\n const timing = `${Date.now() - start}`.padStart(3)\n const path = basename(sourcePath).padStart(40)\n const numOptimized = `${res.optimized}`.padStart(4)\n const memory = memUsed > 10 ? `used ${memUsed}MB` : ''\n console.log(\n ` \uD83E\uDD5A ${path} ${timing}ms \u05C1\u00B7 ${numOptimized} optimized \u00B7 ${res.flattened} flattened ${memory}`\n )\n }\n\n return {\n ast,\n styles,\n js: result.code,\n map: result.map,\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,WAAsB;AACtB,kBAAyB;AACzB,WAAsB;AAEtB,uBAAqB;AACrB,QAAmB;AACnB,uBAAgC;AAChC,qBAAgC;AAChC,uBAAsB;AACtB,0BAAoC;AAGpC,uBAAwC;AAExC,wBAA2B;AAC3B,4BAA+B;AAE/B,mCAAsC;AACtC,4BAA+B;AAC/B,+BAAkC;AAClC,6BAAgC;AAChC,sBAAyB;AAEzB,MAAM,mBAAmB;AAAA,EACvB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,aAAa;AAAA,EACb,cAAc;AAAA;AAGT,6BAA6B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAgBA;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI,MAAM;AAAA;AAElB,gCACE,OAAO,eAAe,YAAY,KAAK,WAAW,aAClD;AAGF,QAAM,kBAAkB,QAAQ,cAAc;AAC9C,QAAM,QAAQ,KAAK;AACnB,QAAM,MAAM,kBAAkB,QAAQ,gBAAgB;AAGtD,MAAI;AAEJ,MAAI;AAEF,UAAM,kCAAW;AAAA,WACV,KAAP;AACA,YAAQ,MAAM,sBAAsB;AACpC,UAAM;AAAA;AAGR,QAAM,SAAS,oBAAI;AACnB,QAAM,iBAAkD;AAExD,QAAM,MAAM,UAAU,MAAM,KAAK;AAAA,IAC/B;AAAA,IACA;AAAA,KACG,UAH4B;AAAA,IAI/B,kBAAkB,CAAC,EAAE,UAAU;AAAA,
|
|
4
|
+
"sourcesContent": ["import * as path from 'path'\nimport { basename } from 'path'\nimport * as util from 'util'\n\nimport generate from '@babel/generator'\nimport * as t from '@babel/types'\nimport { getStylesAtomic } from '@tamagui/core-node'\nimport { concatClassName } from '@tamagui/helpers'\nimport invariant from 'invariant'\nimport { getRemainingRequest } from 'loader-utils'\nimport { ViewStyle } from 'react-native'\n\nimport { CONCAT_CLASSNAME_IMPORT } from '../constants'\nimport { ClassNameObject, StyleObject, TamaguiOptions } from '../types'\nimport { babelParse } from './babelParse'\nimport { buildClassName } from './buildClassName'\nimport { Extractor } from './createExtractor'\nimport { ensureImportingConcat } from './ensureImportingConcat'\nimport { isSimpleSpread } from './extractHelpers'\nimport { extractMediaStyle } from './extractMediaStyle'\nimport { hoistClassNames } from './hoistClassNames'\nimport { logLines } from './logLines'\n\nconst mergeStyleGroups = {\n shadowOpacity: true,\n shadowRadius: true,\n shadowColor: true,\n shadowOffset: true,\n}\n\nexport function extractToClassNames({\n loader,\n extractor,\n source,\n sourcePath,\n options,\n shouldPrintDebug,\n threaded,\n cssPath,\n}: {\n loader: any\n extractor: Extractor\n source: string | Buffer\n sourcePath: string\n options: TamaguiOptions\n shouldPrintDebug: boolean\n cssPath: string\n threaded?: boolean\n}): null | {\n js: string | Buffer\n styles: string\n stylesPath?: string\n ast: t.File\n map: any // RawSourceMap from 'source-map'\n} {\n if (typeof source !== 'string') {\n throw new Error('`source` must be a string of javascript')\n }\n invariant(\n typeof sourcePath === 'string' && path.isAbsolute(sourcePath),\n '`sourcePath` must be an absolute path to a .js file'\n )\n\n const shouldLogTiming = options.logTimings ?? true\n const start = Date.now()\n const mem = shouldLogTiming ? process.memoryUsage() : null\n\n // Using a map for (officially supported) guaranteed insertion order\n let ast: t.File\n\n try {\n // @ts-ignore\n ast = babelParse(source)\n } catch (err) {\n console.error('babel parse error:', sourcePath)\n throw err\n }\n\n const cssMap = new Map<string, { css: string; commentTexts: string[] }>()\n const existingHoists: { [key: string]: t.Identifier } = {}\n\n let hasFlattened = false\n\n const res = extractor.parse(ast, {\n sourcePath,\n shouldPrintDebug,\n ...options,\n getFlattenedNode: ({ tag }) => {\n hasFlattened = true\n return tag\n },\n onExtractTag: ({\n attrs,\n node,\n attemptEval,\n jsxPath,\n originalNodeName,\n filePath,\n lineNumbers,\n programPath,\n }) => {\n let finalClassNames: ClassNameObject[] = []\n let finalAttrs: (t.JSXAttribute | t.JSXSpreadAttribute)[] = []\n let finalStyles: StyleObject[] = []\n\n const viewStyles = {}\n for (const attr of attrs) {\n if (attr.type === 'style') {\n Object.assign(viewStyles, attr.value)\n }\n }\n\n const ensureNeededPrevStyle = (style: ViewStyle) => {\n // ensure all group keys are merged\n const keys = Object.keys(style)\n if (!keys.some((key) => mergeStyleGroups[key])) {\n return style\n }\n for (const k in mergeStyleGroups) {\n if (k in viewStyles) {\n style[k] = style[k] ?? viewStyles[k]\n }\n }\n return style\n }\n\n const addStyles = (style: ViewStyle | null) => {\n if (!style) return []\n const styleWithPrev = ensureNeededPrevStyle(style)\n const res = getStylesAtomic(styleWithPrev)\n if (res.length) {\n finalStyles = [...finalStyles, ...res]\n }\n return res\n }\n\n // 1 to start above any :hover styles\n let lastMediaImportance = 1\n for (const attr of attrs) {\n switch (attr.type) {\n case 'style':\n const styles = addStyles(attr.value)\n const newClassNames = concatClassName(styles.map((x) => x.identifier).join(' '))\n // prettier-ignore\n const existing = finalClassNames.find((x) => x.type == 'StringLiteral') as t.StringLiteral | null\n if (existing) {\n existing.value = `${existing.value} ${newClassNames}`\n } else {\n finalClassNames = [...finalClassNames, t.stringLiteral(newClassNames)]\n }\n if (shouldPrintDebug) {\n // prettier-ignore\n console.log(' classnames (after)\\n', logLines(finalClassNames.map(x => x['value']).join(' ')))\n }\n break\n case 'attr':\n const val = attr.value\n if (t.isJSXSpreadAttribute(val)) {\n if (isSimpleSpread(val)) {\n finalClassNames.push(\n t.logicalExpression(\n '&&',\n val.argument,\n t.memberExpression(val.argument, t.identifier('className'))\n )\n )\n }\n } else if (val.name.name === 'className') {\n const value = val.value\n if (value) {\n try {\n const evaluatedValue = attemptEval(value)\n finalClassNames.push(t.stringLiteral(evaluatedValue))\n } catch (e) {\n finalClassNames.push(value['expression'])\n }\n }\n continue\n }\n finalAttrs.push(val)\n break\n case 'ternary':\n const mediaExtraction = extractMediaStyle(\n attr.value,\n jsxPath,\n extractor.getTamagui(),\n sourcePath,\n lastMediaImportance,\n shouldPrintDebug\n )\n if (mediaExtraction) {\n lastMediaImportance++\n finalStyles = [...finalStyles, ...mediaExtraction.mediaStyles]\n finalClassNames = [\n ...finalClassNames,\n ...mediaExtraction.mediaStyles.map((x) => t.stringLiteral(x.identifier)),\n ]\n if (!mediaExtraction.ternaryWithoutMedia) {\n continue\n }\n }\n const ternary = mediaExtraction?.ternaryWithoutMedia || attr.value\n const consInfo = addStyles(ternary.consequent)\n const altInfo = addStyles(ternary.alternate)\n const cCN = consInfo.map((x) => x.identifier).join(' ')\n const aCN = altInfo.map((x) => x.identifier).join(' ')\n if (consInfo.length && altInfo.length) {\n finalClassNames.push(\n t.conditionalExpression(ternary.test, t.stringLiteral(cCN), t.stringLiteral(aCN))\n )\n } else {\n finalClassNames.push(\n t.conditionalExpression(\n ternary.test,\n t.stringLiteral(' ' + cCN),\n t.stringLiteral(' ' + aCN)\n )\n )\n }\n break\n }\n }\n\n node.attributes = finalAttrs\n\n if (finalClassNames.length) {\n // inserts the _cn variable and uses it for className\n const names = buildClassName(finalClassNames)\n const nameExpr = names ? hoistClassNames(jsxPath, existingHoists, names) : null\n let expr = nameExpr\n\n // if has some spreads, use concat helper\n if (nameExpr && !t.isIdentifier(nameExpr)) {\n if (!hasFlattened) {\n // not flat\n } else {\n ensureImportingConcat(programPath)\n const simpleSpreads = attrs.filter(\n (x) => t.isJSXSpreadAttribute(x.value) && isSimpleSpread(x.value)\n )\n expr = t.callExpression(t.identifier(CONCAT_CLASSNAME_IMPORT), [\n expr,\n ...simpleSpreads.map((val) => val.value['argument']),\n ])\n }\n }\n\n node.attributes.push(\n t.jsxAttribute(t.jsxIdentifier('className'), t.jsxExpressionContainer(expr))\n )\n }\n\n const comment = util.format('/* %s:%s (%s) */', filePath, lineNumbers, originalNodeName)\n\n for (const { className, rules } of finalStyles) {\n if (cssMap.has(className)) {\n if (comment) {\n const val = cssMap.get(className)!\n val.commentTexts.push(comment)\n cssMap.set(className, val)\n }\n } else if (rules.length) {\n if (rules.length > 1) {\n console.log(' rules error', { rules })\n throw new Error(`Shouldn't have more than one rule`)\n }\n cssMap.set(className, {\n css: rules[0],\n commentTexts: [comment],\n })\n }\n }\n },\n })\n\n if (!res || (!res.modified && !res.optimized && !res.flattened)) {\n if (shouldPrintDebug) {\n console.log('no res or none modified', res)\n }\n return null\n }\n\n const styles = Array.from(cssMap.values())\n .map((x) => x.css)\n .join('\\n')\n .trim()\n\n if (styles) {\n const cssQuery = threaded\n ? `cssData=${Buffer.from(styles).toString('base64')}`\n : `cssPath=${cssPath}`\n const remReq = getRemainingRequest(loader)\n const importPath = `${cssPath}!=!tamagui-loader?${cssQuery}!${remReq}`\n ast.program.body.unshift(t.importDeclaration([], t.stringLiteral(importPath)))\n }\n\n const result = generate(\n ast,\n {\n concise: false,\n filename: sourcePath,\n retainLines: false,\n sourceFileName: sourcePath,\n sourceMaps: true,\n },\n source\n )\n\n if (shouldPrintDebug) {\n console.log(\n '\\n -------- output code ------- \\n\\n',\n result.code\n .split('\\n')\n .filter((x) => !x.startsWith('//'))\n .join('\\n')\n )\n console.log('\\n -------- output style -------- \\n\\n', styles)\n }\n\n if (shouldLogTiming) {\n const memUsed = mem\n ? Math.round(((process.memoryUsage().heapUsed - mem.heapUsed) / 1024 / 1204) * 10) / 10\n : 0\n const timing = `${Date.now() - start}`.padStart(3)\n const path = basename(sourcePath).padStart(40)\n const numOptimized = `${res.optimized}`.padStart(4)\n const memory = memUsed > 10 ? `used ${memUsed}MB` : ''\n console.log(\n ` \uD83E\uDD5A ${path} ${timing}ms \u05C1\u00B7 ${numOptimized} optimized \u00B7 ${res.flattened} flattened ${memory}`\n )\n }\n\n return {\n ast,\n styles,\n js: result.code,\n map: result.map,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|