@tamagui/static 1.0.0-beta.189 → 1.0.0-beta.193

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.
Files changed (153) hide show
  1. package/dist/cjs/constants.js +8 -0
  2. package/dist/cjs/constants.js.map +0 -0
  3. package/dist/cjs/extractor/accessSafe.js +4 -0
  4. package/dist/cjs/extractor/accessSafe.js.map +0 -0
  5. package/dist/cjs/extractor/babelParse.js +5 -0
  6. package/dist/cjs/extractor/babelParse.js.map +2 -2
  7. package/dist/cjs/extractor/buildClassName.js +4 -0
  8. package/dist/cjs/extractor/buildClassName.js.map +0 -0
  9. package/dist/cjs/extractor/createEvaluator.js +5 -0
  10. package/dist/cjs/extractor/createEvaluator.js.map +0 -0
  11. package/dist/cjs/extractor/createExtractor.js +862 -733
  12. package/dist/cjs/extractor/createExtractor.js.map +2 -2
  13. package/dist/cjs/extractor/ensureImportingConcat.js +4 -0
  14. package/dist/cjs/extractor/ensureImportingConcat.js.map +0 -0
  15. package/dist/cjs/extractor/evaluateAstNode.js +4 -0
  16. package/dist/cjs/extractor/evaluateAstNode.js.map +0 -0
  17. package/dist/cjs/extractor/extractHelpers.js +11 -0
  18. package/dist/cjs/extractor/extractHelpers.js.map +0 -0
  19. package/dist/cjs/extractor/extractMediaStyle.js +7 -2
  20. package/dist/cjs/extractor/extractMediaStyle.js.map +2 -2
  21. package/dist/cjs/extractor/extractToClassNames.js +19 -10
  22. package/dist/cjs/extractor/extractToClassNames.js.map +2 -2
  23. package/dist/cjs/extractor/findTopmostFunction.js +4 -0
  24. package/dist/cjs/extractor/findTopmostFunction.js.map +0 -0
  25. package/dist/cjs/extractor/generatedUid.js +4 -0
  26. package/dist/cjs/extractor/generatedUid.js.map +0 -0
  27. package/dist/cjs/extractor/getPrefixLogs.js +4 -0
  28. package/dist/cjs/extractor/getPrefixLogs.js.map +0 -0
  29. package/dist/cjs/extractor/getPropValueFromAttributes.js +4 -0
  30. package/dist/cjs/extractor/getPropValueFromAttributes.js.map +0 -0
  31. package/dist/cjs/extractor/getSourceModule.js +4 -0
  32. package/dist/cjs/extractor/getSourceModule.js.map +0 -0
  33. package/dist/cjs/extractor/getStaticBindingsForScope.js +4 -0
  34. package/dist/cjs/extractor/getStaticBindingsForScope.js.map +0 -0
  35. package/dist/cjs/extractor/hoistClassNames.js +4 -0
  36. package/dist/cjs/extractor/hoistClassNames.js.map +0 -0
  37. package/dist/cjs/extractor/literalToAst.js +5 -0
  38. package/dist/cjs/extractor/literalToAst.js.map +0 -0
  39. package/dist/cjs/extractor/loadTamagui.js +67 -47
  40. package/dist/cjs/extractor/loadTamagui.js.map +2 -2
  41. package/dist/cjs/extractor/logLines.js +4 -0
  42. package/dist/cjs/extractor/logLines.js.map +0 -0
  43. package/dist/cjs/extractor/normalizeTernaries.js +4 -0
  44. package/dist/cjs/extractor/normalizeTernaries.js.map +0 -0
  45. package/dist/cjs/extractor/removeUnusedHooks.js +4 -0
  46. package/dist/cjs/extractor/removeUnusedHooks.js.map +0 -0
  47. package/dist/cjs/extractor/timer.js +46 -0
  48. package/dist/cjs/extractor/timer.js.map +7 -0
  49. package/dist/cjs/extractor/validHTMLAttributes.js +4 -0
  50. package/dist/cjs/extractor/validHTMLAttributes.js.map +0 -0
  51. package/dist/cjs/index.js +6 -0
  52. package/dist/cjs/index.js.map +0 -0
  53. package/dist/cjs/patchReactNativeWeb.js +23 -7
  54. package/dist/cjs/patchReactNativeWeb.js.map +2 -2
  55. package/dist/cjs/types.js +0 -0
  56. package/dist/cjs/types.js.map +0 -0
  57. package/dist/esm/constants.js +0 -0
  58. package/dist/esm/constants.js.map +0 -0
  59. package/dist/esm/extractor/accessSafe.js +0 -0
  60. package/dist/esm/extractor/accessSafe.js.map +0 -0
  61. package/dist/esm/extractor/babelParse.js +0 -0
  62. package/dist/esm/extractor/babelParse.js.map +2 -2
  63. package/dist/esm/extractor/buildClassName.js +0 -0
  64. package/dist/esm/extractor/buildClassName.js.map +0 -0
  65. package/dist/esm/extractor/createEvaluator.js +0 -0
  66. package/dist/esm/extractor/createEvaluator.js.map +0 -0
  67. package/dist/esm/extractor/createExtractor.js +868 -742
  68. package/dist/esm/extractor/createExtractor.js.map +2 -2
  69. package/dist/esm/extractor/ensureImportingConcat.js +0 -0
  70. package/dist/esm/extractor/ensureImportingConcat.js.map +0 -0
  71. package/dist/esm/extractor/evaluateAstNode.js +0 -0
  72. package/dist/esm/extractor/evaluateAstNode.js.map +0 -0
  73. package/dist/esm/extractor/extractHelpers.js +0 -0
  74. package/dist/esm/extractor/extractHelpers.js.map +0 -0
  75. package/dist/esm/extractor/extractMediaStyle.js +2 -2
  76. package/dist/esm/extractor/extractMediaStyle.js.map +2 -2
  77. package/dist/esm/extractor/extractToClassNames.js +15 -10
  78. package/dist/esm/extractor/extractToClassNames.js.map +2 -2
  79. package/dist/esm/extractor/findTopmostFunction.js +0 -0
  80. package/dist/esm/extractor/findTopmostFunction.js.map +0 -0
  81. package/dist/esm/extractor/generatedUid.js +0 -0
  82. package/dist/esm/extractor/generatedUid.js.map +0 -0
  83. package/dist/esm/extractor/getPrefixLogs.js +0 -0
  84. package/dist/esm/extractor/getPrefixLogs.js.map +0 -0
  85. package/dist/esm/extractor/getPropValueFromAttributes.js +0 -0
  86. package/dist/esm/extractor/getPropValueFromAttributes.js.map +0 -0
  87. package/dist/esm/extractor/getSourceModule.js +0 -0
  88. package/dist/esm/extractor/getSourceModule.js.map +0 -0
  89. package/dist/esm/extractor/getStaticBindingsForScope.js +0 -0
  90. package/dist/esm/extractor/getStaticBindingsForScope.js.map +0 -0
  91. package/dist/esm/extractor/hoistClassNames.js +0 -0
  92. package/dist/esm/extractor/hoistClassNames.js.map +0 -0
  93. package/dist/esm/extractor/literalToAst.js +0 -0
  94. package/dist/esm/extractor/literalToAst.js.map +0 -0
  95. package/dist/esm/extractor/loadTamagui.js +63 -47
  96. package/dist/esm/extractor/loadTamagui.js.map +2 -2
  97. package/dist/esm/extractor/logLines.js +0 -0
  98. package/dist/esm/extractor/logLines.js.map +0 -0
  99. package/dist/esm/extractor/normalizeTernaries.js +0 -0
  100. package/dist/esm/extractor/normalizeTernaries.js.map +0 -0
  101. package/dist/esm/extractor/removeUnusedHooks.js +0 -0
  102. package/dist/esm/extractor/removeUnusedHooks.js.map +0 -0
  103. package/dist/esm/extractor/timer.js +24 -0
  104. package/dist/esm/extractor/timer.js.map +7 -0
  105. package/dist/esm/extractor/validHTMLAttributes.js +0 -0
  106. package/dist/esm/extractor/validHTMLAttributes.js.map +0 -0
  107. package/dist/esm/index.js +0 -0
  108. package/dist/esm/index.js.map +0 -0
  109. package/dist/esm/patchReactNativeWeb.js +19 -7
  110. package/dist/esm/patchReactNativeWeb.js.map +2 -2
  111. package/dist/esm/types.js +0 -0
  112. package/dist/esm/types.js.map +0 -0
  113. package/dist/jsx/constants.js +0 -0
  114. package/dist/jsx/extractor/accessSafe.js +0 -0
  115. package/dist/jsx/extractor/babelParse.js +0 -0
  116. package/dist/jsx/extractor/buildClassName.js +0 -0
  117. package/dist/jsx/extractor/createEvaluator.js +0 -0
  118. package/dist/jsx/extractor/createExtractor.js +868 -742
  119. package/dist/jsx/extractor/ensureImportingConcat.js +0 -0
  120. package/dist/jsx/extractor/evaluateAstNode.js +0 -0
  121. package/dist/jsx/extractor/extractHelpers.js +0 -0
  122. package/dist/jsx/extractor/extractMediaStyle.js +2 -2
  123. package/dist/jsx/extractor/extractToClassNames.js +15 -10
  124. package/dist/jsx/extractor/findTopmostFunction.js +0 -0
  125. package/dist/jsx/extractor/generatedUid.js +0 -0
  126. package/dist/jsx/extractor/getPrefixLogs.js +0 -0
  127. package/dist/jsx/extractor/getPropValueFromAttributes.js +0 -0
  128. package/dist/jsx/extractor/getSourceModule.js +0 -0
  129. package/dist/jsx/extractor/getStaticBindingsForScope.js +0 -0
  130. package/dist/jsx/extractor/hoistClassNames.js +0 -0
  131. package/dist/jsx/extractor/literalToAst.js +0 -0
  132. package/dist/jsx/extractor/loadTamagui.js +63 -47
  133. package/dist/jsx/extractor/logLines.js +0 -0
  134. package/dist/jsx/extractor/normalizeTernaries.js +0 -0
  135. package/dist/jsx/extractor/removeUnusedHooks.js +0 -0
  136. package/dist/jsx/extractor/timer.js +23 -0
  137. package/dist/jsx/extractor/validHTMLAttributes.js +0 -0
  138. package/dist/jsx/index.js +0 -0
  139. package/dist/jsx/patchReactNativeWeb.js +19 -7
  140. package/dist/jsx/types.js +0 -0
  141. package/package.json +23 -23
  142. package/types/extractor/babelParse.d.ts.map +1 -1
  143. package/types/extractor/createExtractor.d.ts +2 -0
  144. package/types/extractor/createExtractor.d.ts.map +1 -1
  145. package/types/extractor/extractMediaStyle.d.ts +1 -1
  146. package/types/extractor/extractMediaStyle.d.ts.map +1 -1
  147. package/types/extractor/extractToClassNames.d.ts +2 -1
  148. package/types/extractor/extractToClassNames.d.ts.map +1 -1
  149. package/types/extractor/loadTamagui.d.ts +2 -2
  150. package/types/extractor/loadTamagui.d.ts.map +1 -1
  151. package/types/extractor/timer.d.ts +5 -0
  152. package/types/extractor/timer.d.ts.map +1 -0
  153. package/types/patchReactNativeWeb.d.ts.map +1 -1
@@ -1,10 +1,13 @@
1
1
  var __defProp = Object.defineProperty;
2
2
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ import { relative } from "path";
3
4
  import traverse from "@babel/traverse";
4
5
  import * as t from "@babel/types";
5
6
  import {
6
7
  getSplitStyles,
7
8
  mediaQueryConfig,
9
+ normalizeStyleObject,
10
+ proxyThemeVariables,
8
11
  pseudos,
9
12
  rnw
10
13
  } from "@tamagui/core-node";
@@ -20,12 +23,22 @@ import { loadTamagui } from "./loadTamagui";
20
23
  import { logLines } from "./logLines";
21
24
  import { normalizeTernaries } from "./normalizeTernaries";
22
25
  import { removeUnusedHooks } from "./removeUnusedHooks";
26
+ import { timer } from "./timer";
23
27
  import { validHTMLAttributes } from "./validHTMLAttributes";
24
28
  const UNTOUCHED_PROPS = {
25
29
  key: true,
26
30
  style: true,
27
31
  className: true
28
32
  };
33
+ const INLINE_EXTRACTABLE = {
34
+ ref: "ref",
35
+ key: "key",
36
+ onPress: "onClick",
37
+ onHoverIn: "onMouseEnter",
38
+ onHoverOut: "onMouseLeave",
39
+ onPressIn: "onMouseDown",
40
+ onPressOut: "onMouseUp"
41
+ };
29
42
  const isAttr = /* @__PURE__ */ __name((x) => x.type === "attr", "isAttr");
30
43
  const validHooks = {
31
44
  useMedia: true,
@@ -33,11 +46,11 @@ const validHooks = {
33
46
  };
34
47
  const createTernary = /* @__PURE__ */ __name((x) => x, "createTernary");
35
48
  function createExtractor() {
49
+ if (!process.env.TAMAGUI_TARGET) {
50
+ console.log('\u26A0\uFE0F Please set process.env.TAMAGUI_TARGET to either "web" or "native"');
51
+ process.exit(1);
52
+ }
36
53
  const shouldAddDebugProp = !process.env.npm_package_dependencies_next && process.env.TAMAGUI_TARGET !== "native" && process.env.IDENTIFY_TAGS !== "false" && (process.env.NODE_ENV === "development" || process.env.DEBUG || process.env.IDENTIFY_TAGS);
37
- require("esbuild-register/dist/node").register({
38
- target: "es2019",
39
- format: "cjs"
40
- });
41
54
  let loadedTamaguiConfig;
42
55
  let hasLogged = false;
43
56
  return {
@@ -70,12 +83,18 @@ function createExtractor() {
70
83
  if (!Array.isArray(props.components)) {
71
84
  throw new Error(`Must provide components array with list of Tamagui component modules`);
72
85
  }
86
+ const ogDebug = shouldPrintDebug;
87
+ const tm = timer();
73
88
  const { components, tamaguiConfig } = loadTamagui({
74
89
  config,
75
90
  components: props.components || ["tamagui"]
76
91
  });
92
+ if (shouldPrintDebug === "verbose") {
93
+ console.log("tamagui.config.ts:", { components, config });
94
+ }
95
+ tm.mark("load-tamagui", shouldPrintDebug === "verbose");
77
96
  loadedTamaguiConfig = tamaguiConfig;
78
- const defaultTheme = tamaguiConfig.themes[Object.keys(tamaguiConfig.themes)[0]];
97
+ const defaultTheme = proxyThemeVariables(tamaguiConfig.themes[Object.keys(tamaguiConfig.themes)[0]]);
79
98
  const body = fileOrPath.type === "Program" ? fileOrPath.get("body") : fileOrPath.program.body;
80
99
  const isInternalImport = /* @__PURE__ */ __name((importStr) => {
81
100
  return isInsideTamagui(sourcePath) && importStr[0] === ".";
@@ -87,17 +106,26 @@ function createExtractor() {
87
106
  obj[name] = components[name];
88
107
  return obj;
89
108
  }, {});
109
+ if (shouldPrintDebug === "verbose") {
110
+ console.log("validComponents", Object.keys(validComponents));
111
+ }
90
112
  let doesUseValidImport = false;
113
+ let hasImportedTheme = false;
91
114
  for (const bodyPath of body) {
92
115
  if (bodyPath.type !== "ImportDeclaration")
93
116
  continue;
94
117
  const node = "node" in bodyPath ? bodyPath.node : bodyPath;
95
118
  const from = node.source.value;
96
- if (props.components.includes(from) || isInternalImport(from)) {
97
- if (node.specifiers.some((specifier) => {
119
+ const isValidImport = props.components.includes(from) || isInternalImport(from);
120
+ if (isValidImport) {
121
+ const isValidComponent = node.specifiers.some((specifier) => {
98
122
  const name = specifier.local.name;
99
123
  return validComponents[name] || validHooks[name];
100
- })) {
124
+ });
125
+ if (shouldPrintDebug === "verbose") {
126
+ console.log("import from", from, { isValidComponent });
127
+ }
128
+ if (isValidComponent) {
101
129
  doesUseValidImport = true;
102
130
  break;
103
131
  }
@@ -109,6 +137,7 @@ function createExtractor() {
109
137
  if (!doesUseValidImport) {
110
138
  return null;
111
139
  }
140
+ tm.mark("import-check", shouldPrintDebug === "verbose");
112
141
  let couldntParse = false;
113
142
  const modifiedComponents = /* @__PURE__ */ new Set();
114
143
  const bindingCache = {};
@@ -130,6 +159,7 @@ function createExtractor() {
130
159
  },
131
160
  JSXElement(traversePath) {
132
161
  var _a, _b, _c, _d, _e;
162
+ tm.mark("jsx-element", shouldPrintDebug === "verbose");
133
163
  const node = traversePath.node.openingElement;
134
164
  const ogAttributes = node.attributes;
135
165
  const componentName = findComponentName(traversePath.scope);
@@ -156,579 +186,771 @@ function createExtractor() {
156
186
  }
157
187
  const originalNodeName = node.name.name;
158
188
  res.found++;
159
- if (shouldPrintDebug) {
160
- console.log(`
161
- <${originalNodeName} />`);
162
- }
163
- const filePath = sourcePath.replace(process.cwd(), ".");
189
+ const filePath = `./${relative(process.cwd(), sourcePath)}`;
164
190
  const lineNumbers = node.loc ? node.loc.start.line + (node.loc.start.line !== node.loc.end.line ? `-${node.loc.end.line}` : "") : "";
165
- if (shouldAddDebugProp && !disableDebugAttr) {
166
- const preName = componentName ? `${componentName}.` : "";
167
- res.modified++;
168
- node.attributes.unshift(t.jsxAttribute(t.jsxIdentifier("data-is"), t.stringLiteral(`${preName}${node.name.name}@${filePath.replace("./", "")}:${lineNumbers}`)));
169
- }
170
- const shouldLog = !hasLogged;
171
- if (shouldLog) {
172
- const prefix = " |";
173
- console.log(prefixLogs || prefix, " total \xB7 optimized \xB7 flattened ");
174
- hasLogged = true;
175
- }
176
- if (disableExtraction) {
177
- return;
178
- }
179
- const { staticConfig } = component;
180
- const isTextView = staticConfig.isText || false;
181
- const validStyles = (_a = staticConfig == null ? void 0 : staticConfig.validStyles) != null ? _a : {};
182
- function isValidStyleKey(name) {
183
- var _a2;
184
- return !!(!!validStyles[name] || !!pseudos[name] || ((_a2 = staticConfig.variants) == null ? void 0 : _a2[name]) || tamaguiConfig.shorthands[name] || (name[0] === "$" ? !!mediaQueryConfig[name.slice(1)] : false));
185
- }
186
- __name(isValidStyleKey, "isValidStyleKey");
187
- let tagName = (_c = (_b = staticConfig.defaultProps) == null ? void 0 : _b.tag) != null ? _c : isTextView ? "span" : "div";
188
- traversePath.get("openingElement").get("attributes").forEach((path) => {
189
- const attr = path.node;
190
- if (t.isJSXSpreadAttribute(attr))
191
- return;
192
- if (attr.name.name !== "tag")
193
- return;
194
- const val = attr.value;
195
- if (!t.isStringLiteral(val))
196
- return;
197
- tagName = val.value;
198
- });
199
- const flatNode = getFlattenedNode({ isTextView, tag: tagName });
200
- const inlineProps = /* @__PURE__ */ new Set([
201
- ...props.inlineProps || [],
202
- ...staticConfig.inlineProps || []
203
- ]);
204
- const deoptProps = /* @__PURE__ */ new Set([
205
- ...props.deoptProps || [],
206
- ...staticConfig.deoptProps || []
207
- ]);
208
- const staticNamespace = getStaticBindingsForScope(traversePath.scope, importsWhitelist, sourcePath, bindingCache, shouldPrintDebug);
209
- const attemptEval = !evaluateVars ? evaluateAstNode : createEvaluator({
210
- tamaguiConfig,
211
- staticNamespace,
212
- sourcePath,
213
- traversePath,
214
- shouldPrintDebug
215
- });
216
- const attemptEvalSafe = createSafeEvaluator(attemptEval);
217
- if (shouldPrintDebug) {
218
- console.log(" staticNamespace", Object.keys(staticNamespace).join(", "));
191
+ const tagId = [componentName, `${node.name.name}`, `${filePath}:${lineNumbers}`].filter(Boolean);
192
+ const debugPropValue = node.attributes.filter((n) => t.isJSXAttribute(n) && t.isJSXIdentifier(n.name) && n.name.name === "debug").map((n) => {
193
+ if (n.value === null)
194
+ return true;
195
+ if (t.isStringLiteral(n.value))
196
+ return n.value.value;
197
+ return false;
198
+ })[0];
199
+ if (debugPropValue) {
200
+ shouldPrintDebug = debugPropValue;
219
201
  }
220
- const flattenedAttrs = [];
221
- traversePath.get("openingElement").get("attributes").forEach((path) => {
222
- const attr = path.node;
223
- if (!t.isJSXSpreadAttribute(attr)) {
224
- flattenedAttrs.push(attr);
225
- return;
226
- }
227
- let arg;
228
- try {
229
- arg = attemptEval(attr.argument);
230
- } catch (e) {
231
- if (shouldPrintDebug) {
232
- console.log(" couldnt parse spread", e.message);
233
- }
234
- flattenedAttrs.push(attr);
235
- return;
236
- }
237
- if (arg !== void 0) {
238
- try {
239
- if (typeof arg !== "object" || arg == null) {
240
- if (shouldPrintDebug) {
241
- console.log(" non object or null arg", arg);
242
- }
243
- flattenedAttrs.push(attr);
244
- } else {
245
- for (const k in arg) {
246
- const value = arg[k];
247
- if (!value && typeof value === "object") {
248
- console.log("shouldnt we handle this?", k, value, arg);
249
- continue;
202
+ try {
203
+ let isValidStyleKey = function(name) {
204
+ var _a2;
205
+ return !!(!!validStyles[name] || !!pseudos[name] || ((_a2 = staticConfig.variants) == null ? void 0 : _a2[name]) || tamaguiConfig.shorthands[name] || (name[0] === "$" ? !!mediaQueryConfig[name.slice(1)] : false));
206
+ }, evaluateAttribute = function(path) {
207
+ const attribute = path.node;
208
+ const attr = { type: "attr", value: attribute };
209
+ if (t.isJSXSpreadAttribute(attribute)) {
210
+ const arg = attribute.argument;
211
+ const conditional = t.isConditionalExpression(arg) ? [arg.test, arg.consequent, arg.alternate] : t.isLogicalExpression(arg) && arg.operator === "&&" ? [arg.left, arg.right, null] : null;
212
+ if (conditional) {
213
+ const [test, alt, cons] = conditional;
214
+ if (!test)
215
+ throw new Error(`no test`);
216
+ if ([alt, cons].some((side) => side && !isExtractable(side))) {
217
+ if (shouldPrintDebug) {
218
+ console.log("not extractable", alt, cons);
250
219
  }
251
- flattenedAttrs.push(t.jsxAttribute(t.jsxIdentifier(k), t.jsxExpressionContainer(literalToAst(value))));
220
+ return attr;
252
221
  }
222
+ return [
223
+ ...createTernariesFromObjectProperties(test, alt) || [],
224
+ ...cons && createTernariesFromObjectProperties(t.unaryExpression("!", test), cons) || []
225
+ ].map((ternary) => ({
226
+ type: "ternary",
227
+ value: ternary
228
+ }));
253
229
  }
254
- } catch (err) {
255
- console.warn("cant parse spread, caught err", err);
256
- couldntParse = true;
257
- }
258
- }
259
- });
260
- if (couldntParse) {
261
- return;
262
- }
263
- node.attributes = flattenedAttrs;
264
- if (staticConfig.defaultProps) {
265
- for (const key in staticConfig.defaultProps) {
266
- if (isValidStyleKey(key)) {
267
- continue;
268
230
  }
269
- const serialize = require("babel-literal-to-ast");
270
- const val = staticConfig.defaultProps[key];
271
- try {
272
- const serializedDefaultProp = serialize(val);
273
- node.attributes.unshift(t.jsxAttribute(t.jsxIdentifier(key), typeof val === "string" ? t.stringLiteral(val) : t.jsxExpressionContainer(serializedDefaultProp)));
274
- } catch (err) {
275
- console.warn(`\u26A0\uFE0F Error evaluating default prop for component ${node.name.name}, prop ${key}
276
- error: ${err}
277
- value:`, val, "\n defaultProps:", staticConfig.defaultProps);
278
- }
279
- }
280
- }
281
- let attrs = [];
282
- let shouldDeopt = false;
283
- let inlinePropCount = 0;
284
- let hasSetOptimized = false;
285
- attrs = traversePath.get("openingElement").get("attributes").flatMap((path) => {
286
- try {
287
- const res2 = evaluateAttribute(path);
288
- if (!res2) {
289
- path.remove();
290
- }
291
- return res2;
292
- } catch (err) {
293
- if (shouldPrintDebug) {
294
- console.log("Error extracting attribute", err.message, err.stack);
295
- console.log("node", path.node);
231
+ if (t.isJSXSpreadAttribute(attribute) || !attribute.name || typeof attribute.name.name !== "string") {
232
+ if (shouldPrintDebug) {
233
+ console.log(" ! inlining, spread attr");
234
+ }
235
+ inlined.set(`${Math.random()}`, "spread");
236
+ return attr;
296
237
  }
297
- return {
298
- type: "attr",
299
- value: path.node
300
- };
301
- }
302
- }).flat(4).filter(isPresent);
303
- if (shouldPrintDebug) {
304
- console.log(" - attrs (before):\n", logLines(attrs.map(attrStr).join(", ")));
305
- }
306
- function evaluateAttribute(path) {
307
- const attribute = path.node;
308
- const attr = { type: "attr", value: attribute };
309
- if (t.isJSXSpreadAttribute(attribute)) {
310
- const arg = attribute.argument;
311
- const conditional = t.isConditionalExpression(arg) ? [arg.test, arg.consequent, arg.alternate] : t.isLogicalExpression(arg) && arg.operator === "&&" ? [arg.left, arg.right, null] : null;
312
- if (conditional) {
313
- const [test, alt, cons] = conditional;
314
- if (!test)
315
- throw new Error(`no test`);
316
- if ([alt, cons].some((side) => side && !isExtractable(side))) {
317
- if (shouldPrintDebug) {
318
- console.log("not extractable", alt, cons);
319
- }
320
- return attr;
238
+ const name = attribute.name.name;
239
+ if (excludeProps == null ? void 0 : excludeProps.has(name)) {
240
+ if (shouldPrintDebug) {
241
+ console.log(" excluding prop", name);
321
242
  }
322
- return [
323
- ...createTernariesFromObjectProperties(test, alt) || [],
324
- ...cons && createTernariesFromObjectProperties(t.unaryExpression("!", test), cons) || []
325
- ].map((ternary) => ({
326
- type: "ternary",
327
- value: ternary
328
- }));
243
+ return null;
329
244
  }
330
- }
331
- if (t.isJSXSpreadAttribute(attribute) || !attribute.name || typeof attribute.name.name !== "string") {
332
- if (shouldPrintDebug) {
333
- console.log(" ! inlining, spread attr");
245
+ if (inlineProps.has(name)) {
246
+ inlined.set(name, name);
247
+ if (shouldPrintDebug) {
248
+ console.log(" ! inlining, inline prop", name);
249
+ }
250
+ return attr;
334
251
  }
335
- inlinePropCount++;
336
- return attr;
337
- }
338
- const name = attribute.name.name;
339
- if (excludeProps == null ? void 0 : excludeProps.has(name)) {
340
- if (shouldPrintDebug) {
341
- console.log(" excluding prop", name);
252
+ if (deoptProps.has(name)) {
253
+ shouldDeopt = true;
254
+ inlined.set(name, name);
255
+ if (shouldPrintDebug) {
256
+ console.log(" ! inlining, deopted prop", name);
257
+ }
258
+ return attr;
342
259
  }
343
- return null;
344
- }
345
- if (inlineProps.has(name)) {
346
- inlinePropCount++;
347
- if (shouldPrintDebug) {
348
- console.log(" ! inlining, inline prop", name);
260
+ if (UNTOUCHED_PROPS[name]) {
261
+ return attr;
349
262
  }
350
- return attr;
351
- }
352
- if (deoptProps.has(name)) {
353
- shouldDeopt = true;
354
- inlinePropCount++;
355
- if (shouldPrintDebug) {
356
- console.log(" ! inlining, deopted prop", name);
263
+ if (INLINE_EXTRACTABLE[name]) {
264
+ inlined.set(name, INLINE_EXTRACTABLE[name]);
265
+ return attr;
357
266
  }
358
- return attr;
359
- }
360
- if (UNTOUCHED_PROPS[name]) {
361
- return attr;
362
- }
363
- if (name.startsWith("data-")) {
364
- return attr;
365
- }
366
- if (name[0] === "$" && t.isJSXExpressionContainer(attribute == null ? void 0 : attribute.value)) {
367
- if (disableExtractInlineMedia) {
267
+ if (name.startsWith("data-")) {
368
268
  return attr;
369
269
  }
370
- const shortname = name.slice(1);
371
- if (mediaQueryConfig[shortname]) {
372
- const expression = attribute.value.expression;
373
- if (!t.isJSXEmptyExpression(expression)) {
374
- const ternaries2 = createTernariesFromObjectProperties(t.stringLiteral(shortname), expression, {
375
- inlineMediaQuery: shortname
376
- });
377
- if (ternaries2) {
378
- return ternaries2.map((value2) => ({
379
- type: "ternary",
380
- value: value2
381
- }));
270
+ if (name[0] === "$" && t.isJSXExpressionContainer(attribute == null ? void 0 : attribute.value)) {
271
+ if (disableExtractInlineMedia) {
272
+ return attr;
273
+ }
274
+ const shortname = name.slice(1);
275
+ if (mediaQueryConfig[shortname]) {
276
+ const expression = attribute.value.expression;
277
+ if (!t.isJSXEmptyExpression(expression)) {
278
+ const ternaries2 = createTernariesFromObjectProperties(t.stringLiteral(shortname), expression, {
279
+ inlineMediaQuery: shortname
280
+ });
281
+ if (ternaries2) {
282
+ return ternaries2.map((value2) => ({
283
+ type: "ternary",
284
+ value: value2
285
+ }));
286
+ }
382
287
  }
383
288
  }
384
289
  }
385
- }
386
- const [value, valuePath] = (() => {
387
- if (t.isJSXExpressionContainer(attribute == null ? void 0 : attribute.value)) {
388
- return [attribute.value.expression, path.get("value")];
389
- } else {
390
- return [attribute.value, path.get("value")];
290
+ const [value, valuePath] = (() => {
291
+ if (t.isJSXExpressionContainer(attribute == null ? void 0 : attribute.value)) {
292
+ return [attribute.value.expression, path.get("value")];
293
+ } else {
294
+ return [attribute.value, path.get("value")];
295
+ }
296
+ })();
297
+ const remove = /* @__PURE__ */ __name(() => {
298
+ Array.isArray(valuePath) ? valuePath.map((p) => p.remove()) : valuePath.remove();
299
+ }, "remove");
300
+ if (name === "ref") {
301
+ if (shouldPrintDebug) {
302
+ console.log(" ! inlining, ref", name);
303
+ }
304
+ inlined.set("ref", "ref");
305
+ return attr;
391
306
  }
392
- })();
393
- const remove = /* @__PURE__ */ __name(() => {
394
- Array.isArray(valuePath) ? valuePath.map((p) => p.remove()) : valuePath.remove();
395
- }, "remove");
396
- if (name === "ref") {
397
- if (shouldPrintDebug) {
398
- console.log(" ! inlining, ref", name);
307
+ if (name === "tag") {
308
+ return {
309
+ type: "attr",
310
+ value: path.node
311
+ };
399
312
  }
400
- inlinePropCount++;
401
- return attr;
402
- }
403
- if (name === "tag") {
404
- return {
405
- type: "attr",
406
- value: path.node
407
- };
408
- }
409
- if (disableExtractVariables) {
410
- if (value) {
411
- if (value.type === "StringLiteral" && value.value[0] === "$") {
412
- if (shouldPrintDebug) {
413
- console.log(` ! inlining, native disable extract: ${name} =`, value.value);
313
+ if (disableExtractVariables) {
314
+ if (value) {
315
+ if (value.type === "StringLiteral" && value.value[0] === "$") {
316
+ if (shouldPrintDebug) {
317
+ console.log(` ! inlining, native disable extract: ${name} =`, value.value);
318
+ }
319
+ inlined.set(name, true);
320
+ return attr;
414
321
  }
415
- inlinePropCount++;
416
- return attr;
417
322
  }
418
323
  }
419
- }
420
- const styleValue = attemptEvalSafe(value);
421
- if (!isValidStyleKey(name)) {
422
- let keys = [name];
423
- let out = null;
424
- if (staticConfig.propMapper) {
425
- out = staticConfig.propMapper(name, styleValue, defaultTheme, staticConfig.defaultProps, staticConfig);
426
- if (out) {
427
- out = rnw.createDOMProps(isTextView ? "span" : "div", out);
428
- delete out.className;
429
- keys = Object.keys(out);
430
- }
324
+ if (name === "theme") {
325
+ inlined.set("theme", attr.value);
326
+ return attr;
431
327
  }
432
- const attributes = keys.map((key) => {
433
- const val = out[key];
434
- if (!isValidStyleKey(key)) {
435
- if (validHTMLAttributes[key]) {
328
+ const styleValue = attemptEvalSafe(value);
329
+ if (!isValidStyleKey(name)) {
330
+ let keys = [name];
331
+ let out = null;
332
+ if (staticConfig.propMapper) {
333
+ out = staticConfig.propMapper(name, styleValue, defaultTheme, staticConfig.defaultProps, "auto");
334
+ if (out) {
335
+ out = rnw.createDOMProps(isTextView ? "span" : "div", out);
336
+ delete out.className;
337
+ keys = Object.keys(out);
338
+ }
339
+ }
340
+ let didInline = false;
341
+ const attributes = keys.map((key) => {
342
+ const val = out[key];
343
+ if (isValidStyleKey(key)) {
436
344
  return {
437
- type: "attr",
438
- value: t.jsxAttribute(t.jsxIdentifier(key), t.jsxExpressionContainer(literalToAst(val)))
345
+ type: "style",
346
+ value: { [name]: styleValue },
347
+ name,
348
+ attr: path.node
439
349
  };
440
350
  }
351
+ if (validHTMLAttributes[key]) {
352
+ return attr;
353
+ }
441
354
  if (shouldPrintDebug) {
442
355
  console.log(" ! inlining, non-static", key);
443
356
  }
444
- inlinePropCount++;
357
+ didInline = true;
358
+ inlined.set(key, val);
359
+ return val;
360
+ });
361
+ if (didInline) {
362
+ if (shouldPrintDebug) {
363
+ console.log(" bailing flattening due to attributes", attributes);
364
+ }
365
+ return attr;
445
366
  }
446
- return {
447
- type: "style",
448
- value: { [name]: styleValue },
449
- name,
450
- attr: path.node
451
- };
452
- });
453
- if (inlinePropCount) {
454
- return attr;
367
+ return attributes;
455
368
  }
456
- return attributes;
457
- }
458
- if (styleValue !== FAILED_EVAL) {
459
- if (shouldPrintDebug) {
460
- console.log(` style: ${name} =`, styleValue);
461
- }
462
- if (!(name in staticConfig.defaultProps)) {
463
- if (!hasSetOptimized) {
464
- res.optimized++;
465
- hasSetOptimized = true;
369
+ if (styleValue !== FAILED_EVAL) {
370
+ if (isValidStyleKey(name)) {
371
+ if (shouldPrintDebug) {
372
+ console.log(` style: ${name} =`, styleValue);
373
+ }
374
+ if (!(name in staticConfig.defaultProps)) {
375
+ if (!hasSetOptimized) {
376
+ res.optimized++;
377
+ hasSetOptimized = true;
378
+ }
379
+ }
380
+ return {
381
+ type: "style",
382
+ value: { [name]: styleValue },
383
+ name,
384
+ attr: path.node
385
+ };
386
+ } else {
387
+ inlined.set(name, true);
388
+ return attr;
466
389
  }
467
390
  }
468
- return {
469
- type: "style",
470
- value: { [name]: styleValue },
471
- name,
472
- attr: path.node
473
- };
474
- }
475
- if (t.isBinaryExpression(value)) {
476
- if (shouldPrintDebug) {
477
- console.log(` binary expression ${name} = `, value);
478
- }
479
- const { operator, left, right } = value;
480
- const lVal = attemptEvalSafe(left);
481
- const rVal = attemptEvalSafe(right);
482
- if (shouldPrintDebug) {
483
- console.log(` evalBinaryExpression lVal ${String(lVal)}, rVal ${String(rVal)}`);
391
+ if (t.isBinaryExpression(value)) {
392
+ if (shouldPrintDebug) {
393
+ console.log(` binary expression ${name} = `, value);
394
+ }
395
+ const { operator, left, right } = value;
396
+ const lVal = attemptEvalSafe(left);
397
+ const rVal = attemptEvalSafe(right);
398
+ if (shouldPrintDebug) {
399
+ console.log(` evalBinaryExpression lVal ${String(lVal)}, rVal ${String(rVal)}`);
400
+ }
401
+ if (lVal !== FAILED_EVAL && t.isConditionalExpression(right)) {
402
+ const ternary = addBinaryConditional(operator, left, right);
403
+ if (ternary)
404
+ return ternary;
405
+ }
406
+ if (rVal !== FAILED_EVAL && t.isConditionalExpression(left)) {
407
+ const ternary = addBinaryConditional(operator, right, left);
408
+ if (ternary)
409
+ return ternary;
410
+ }
411
+ if (shouldPrintDebug) {
412
+ console.log(` evalBinaryExpression cant extract`);
413
+ }
414
+ inlined.set(name, true);
415
+ return attr;
484
416
  }
485
- if (lVal !== FAILED_EVAL && t.isConditionalExpression(right)) {
486
- const ternary = addBinaryConditional(operator, left, right);
487
- if (ternary)
488
- return ternary;
417
+ const staticConditional = getStaticConditional(value);
418
+ if (staticConditional) {
419
+ if (shouldPrintDebug) {
420
+ console.log(` static conditional ${name} = `, value);
421
+ }
422
+ return { type: "ternary", value: staticConditional };
489
423
  }
490
- if (rVal !== FAILED_EVAL && t.isConditionalExpression(left)) {
491
- const ternary = addBinaryConditional(operator, right, left);
492
- if (ternary)
493
- return ternary;
424
+ const staticLogical = getStaticLogical(value);
425
+ if (staticLogical) {
426
+ if (shouldPrintDebug) {
427
+ console.log(` static ternary ${name} = `, value);
428
+ }
429
+ return { type: "ternary", value: staticLogical };
494
430
  }
431
+ inlined.set(name, true);
495
432
  if (shouldPrintDebug) {
496
- console.log(` evalBinaryExpression cant extract`);
433
+ console.log(` ! inline no match ${name}`, value);
497
434
  }
498
- inlinePropCount++;
499
435
  return attr;
500
- }
501
- const staticConditional = getStaticConditional(value);
502
- if (staticConditional) {
503
- if (shouldPrintDebug) {
504
- console.log(` static conditional ${name} = `, value);
505
- }
506
- return { type: "ternary", value: staticConditional };
507
- }
508
- const staticLogical = getStaticLogical(value);
509
- if (staticLogical) {
510
- if (shouldPrintDebug) {
511
- console.log(` static ternary ${name} = `, value);
512
- }
513
- return { type: "ternary", value: staticLogical };
514
- }
515
- if (shouldPrintDebug) {
516
- console.log(" ! inline prop via no match", name, value.type);
517
- }
518
- inlinePropCount++;
519
- if (shouldPrintDebug) {
520
- console.log(` inlining ${name} = `, value);
521
- }
522
- return attr;
523
- function addBinaryConditional(operator, staticExpr, cond) {
524
- if (getStaticConditional(cond)) {
525
- const alt = attemptEval(t.binaryExpression(operator, staticExpr, cond.alternate));
526
- const cons = attemptEval(t.binaryExpression(operator, staticExpr, cond.consequent));
527
- if (shouldPrintDebug) {
528
- console.log(" binaryConditional", cond.test, cons, alt);
529
- }
530
- return {
531
- type: "ternary",
532
- value: {
533
- test: cond.test,
534
- remove,
535
- alternate: { [name]: alt },
536
- consequent: { [name]: cons }
537
- }
538
- };
539
- }
540
- return null;
541
- }
542
- __name(addBinaryConditional, "addBinaryConditional");
543
- function getStaticConditional(value2) {
544
- if (t.isConditionalExpression(value2)) {
545
- try {
436
+ function addBinaryConditional(operator, staticExpr, cond) {
437
+ if (getStaticConditional(cond)) {
438
+ const alt = attemptEval(t.binaryExpression(operator, staticExpr, cond.alternate));
439
+ const cons = attemptEval(t.binaryExpression(operator, staticExpr, cond.consequent));
546
440
  if (shouldPrintDebug) {
547
- console.log("attempt", value2.alternate, value2.consequent);
548
- }
549
- const aVal = attemptEval(value2.alternate);
550
- const cVal = attemptEval(value2.consequent);
551
- if (shouldPrintDebug) {
552
- const type = value2.test.type;
553
- console.log(" static ternary", type, cVal, aVal);
441
+ console.log(" binaryConditional", cond.test, cons, alt);
554
442
  }
555
443
  return {
556
- test: value2.test,
557
- remove,
558
- consequent: { [name]: cVal },
559
- alternate: { [name]: aVal }
444
+ type: "ternary",
445
+ value: {
446
+ test: cond.test,
447
+ remove,
448
+ alternate: { [name]: alt },
449
+ consequent: { [name]: cons }
450
+ }
560
451
  };
561
- } catch (err) {
562
- if (shouldPrintDebug) {
563
- console.log(" cant eval ternary", err.message);
564
- }
565
452
  }
453
+ return null;
566
454
  }
567
- return null;
568
- }
569
- __name(getStaticConditional, "getStaticConditional");
570
- function getStaticLogical(value2) {
571
- if (t.isLogicalExpression(value2)) {
572
- if (value2.operator === "&&") {
455
+ __name(addBinaryConditional, "addBinaryConditional");
456
+ function getStaticConditional(value2) {
457
+ if (t.isConditionalExpression(value2)) {
573
458
  try {
574
- const val = attemptEval(value2.right);
459
+ const aVal = attemptEval(value2.alternate);
460
+ const cVal = attemptEval(value2.consequent);
575
461
  if (shouldPrintDebug) {
576
- console.log(" staticLogical", value2.left, name, val);
462
+ const type = value2.test.type;
463
+ console.log(" static ternary", type, cVal, aVal);
577
464
  }
578
465
  return {
579
- test: value2.left,
466
+ test: value2.test,
580
467
  remove,
581
- consequent: { [name]: val },
582
- alternate: null
468
+ consequent: { [name]: cVal },
469
+ alternate: { [name]: aVal }
583
470
  };
584
471
  } catch (err) {
585
472
  if (shouldPrintDebug) {
586
- console.log(" cant static eval logical", err);
473
+ console.log(" cant eval ternary", err.message);
587
474
  }
588
475
  }
589
476
  }
477
+ return null;
478
+ }
479
+ __name(getStaticConditional, "getStaticConditional");
480
+ function getStaticLogical(value2) {
481
+ if (t.isLogicalExpression(value2)) {
482
+ if (value2.operator === "&&") {
483
+ try {
484
+ const val = attemptEval(value2.right);
485
+ if (shouldPrintDebug) {
486
+ console.log(" staticLogical", value2.left, name, val);
487
+ }
488
+ return {
489
+ test: value2.left,
490
+ remove,
491
+ consequent: { [name]: val },
492
+ alternate: null
493
+ };
494
+ } catch (err) {
495
+ if (shouldPrintDebug) {
496
+ console.log(" cant static eval logical", err);
497
+ }
498
+ }
499
+ }
500
+ }
501
+ return null;
502
+ }
503
+ __name(getStaticLogical, "getStaticLogical");
504
+ }, isExtractable = function(obj) {
505
+ return t.isObjectExpression(obj) && obj.properties.every((prop) => {
506
+ if (!t.isObjectProperty(prop)) {
507
+ console.log("not object prop", prop);
508
+ return false;
509
+ }
510
+ const propName = prop.key["name"];
511
+ if (!isValidStyleKey(propName) && propName !== "tag") {
512
+ if (shouldPrintDebug) {
513
+ console.log(" not a valid style prop!", propName);
514
+ }
515
+ return false;
516
+ }
517
+ return true;
518
+ });
519
+ }, createTernariesFromObjectProperties = function(test, side, ternaryPartial = {}) {
520
+ if (!side) {
521
+ return null;
522
+ }
523
+ if (!isExtractable(side)) {
524
+ throw new Error("not extractable");
590
525
  }
591
- return null;
526
+ return side.properties.flatMap((property) => {
527
+ if (!t.isObjectProperty(property)) {
528
+ throw new Error("expected object property");
529
+ }
530
+ if (t.isIdentifier(property.key)) {
531
+ const key = property.key.name;
532
+ const mediaQueryKey = key.slice(1);
533
+ const isMediaQuery = key[0] === "$" && mediaQueryConfig[mediaQueryKey];
534
+ if (isMediaQuery) {
535
+ if (t.isExpression(property.value)) {
536
+ const ternaries2 = createTernariesFromObjectProperties(t.stringLiteral(mediaQueryKey), property.value, {
537
+ inlineMediaQuery: mediaQueryKey
538
+ });
539
+ if (ternaries2) {
540
+ return ternaries2.map((value) => ({
541
+ ...ternaryPartial,
542
+ ...value,
543
+ test: t.logicalExpression("&&", value.test, test)
544
+ }));
545
+ } else {
546
+ console.log("\u26A0\uFE0F no ternaries?", property);
547
+ }
548
+ } else {
549
+ console.log("\u26A0\uFE0F not expression", property);
550
+ }
551
+ }
552
+ }
553
+ if (t.isConditionalExpression(property.value)) {
554
+ const [truthy, falsy] = [
555
+ t.objectExpression([t.objectProperty(property.key, property.value.consequent)]),
556
+ t.objectExpression([t.objectProperty(property.key, property.value.alternate)])
557
+ ].map((x) => attemptEval(x));
558
+ return [
559
+ createTernary({
560
+ remove() {
561
+ },
562
+ ...ternaryPartial,
563
+ test: t.logicalExpression("&&", test, property.value.test),
564
+ consequent: truthy,
565
+ alternate: null
566
+ }),
567
+ createTernary({
568
+ ...ternaryPartial,
569
+ test: t.logicalExpression("&&", test, t.unaryExpression("!", property.value.test)),
570
+ consequent: falsy,
571
+ alternate: null,
572
+ remove() {
573
+ }
574
+ })
575
+ ];
576
+ }
577
+ const obj = t.objectExpression([t.objectProperty(property.key, property.value)]);
578
+ const consequent = attemptEval(obj);
579
+ return createTernary({
580
+ remove() {
581
+ },
582
+ ...ternaryPartial,
583
+ test,
584
+ consequent,
585
+ alternate: null
586
+ });
587
+ });
588
+ }, mergeStyles = function(prev2, next) {
589
+ for (const key in next) {
590
+ if (pseudos[key]) {
591
+ prev2[key] = prev2[key] || {};
592
+ if (shouldPrintDebug) {
593
+ if (!next[key] || !prev2[key]) {
594
+ console.log("warn: missing", key, prev2, next);
595
+ }
596
+ }
597
+ Object.assign(prev2[key], next[key]);
598
+ } else {
599
+ prev2[key] = next[key];
600
+ }
601
+ }
602
+ };
603
+ __name(isValidStyleKey, "isValidStyleKey");
604
+ __name(evaluateAttribute, "evaluateAttribute");
605
+ __name(isExtractable, "isExtractable");
606
+ __name(createTernariesFromObjectProperties, "createTernariesFromObjectProperties");
607
+ __name(mergeStyles, "mergeStyles");
608
+ node.attributes.find((n) => t.isJSXAttribute(n) && t.isJSXIdentifier(n.name) && n.name.name === "debug" && n.value === null);
609
+ if (shouldPrintDebug) {
610
+ console.log("\n");
611
+ console.log("\x1B[33m%s\x1B[0m", `${tagId[0]} | ${tagId[2]} -------------------`);
612
+ console.log("\x1B[1m", "\x1B[32m", `<${originalNodeName} />`);
592
613
  }
593
- __name(getStaticLogical, "getStaticLogical");
594
- }
595
- __name(evaluateAttribute, "evaluateAttribute");
596
- function isExtractable(obj) {
597
- return t.isObjectExpression(obj) && obj.properties.every((prop) => {
598
- if (!t.isObjectProperty(prop)) {
599
- console.log("not object prop", prop);
600
- return false;
614
+ if (shouldAddDebugProp && !disableDebugAttr) {
615
+ res.modified++;
616
+ node.attributes.unshift(t.jsxAttribute(t.jsxIdentifier("data-is"), t.stringLiteral(tagId.join(" "))));
617
+ }
618
+ const shouldLog = !hasLogged;
619
+ if (shouldLog) {
620
+ const prefix = " |";
621
+ console.log(prefixLogs || prefix, " total \xB7 optimized \xB7 flattened ");
622
+ hasLogged = true;
623
+ }
624
+ if (disableExtraction) {
625
+ return;
626
+ }
627
+ const { staticConfig } = component;
628
+ const isTextView = staticConfig.isText || false;
629
+ const validStyles = (_a = staticConfig == null ? void 0 : staticConfig.validStyles) != null ? _a : {};
630
+ let tagName = (_c = (_b = staticConfig.defaultProps) == null ? void 0 : _b.tag) != null ? _c : isTextView ? "span" : "div";
631
+ traversePath.get("openingElement").get("attributes").forEach((path) => {
632
+ const attr = path.node;
633
+ if (t.isJSXSpreadAttribute(attr))
634
+ return;
635
+ if (attr.name.name !== "tag")
636
+ return;
637
+ const val = attr.value;
638
+ if (!t.isStringLiteral(val))
639
+ return;
640
+ tagName = val.value;
641
+ });
642
+ const flatNode = getFlattenedNode({ isTextView, tag: tagName });
643
+ const inlineProps = /* @__PURE__ */ new Set([
644
+ ...props.inlineProps || [],
645
+ ...staticConfig.inlineProps || []
646
+ ]);
647
+ const deoptProps = /* @__PURE__ */ new Set([
648
+ "animation",
649
+ ...props.deoptProps || [],
650
+ ...staticConfig.deoptProps || []
651
+ ]);
652
+ const staticNamespace = getStaticBindingsForScope(traversePath.scope, importsWhitelist, sourcePath, bindingCache, shouldPrintDebug);
653
+ const attemptEval = !evaluateVars ? evaluateAstNode : createEvaluator({
654
+ tamaguiConfig,
655
+ staticNamespace,
656
+ sourcePath,
657
+ traversePath,
658
+ shouldPrintDebug
659
+ });
660
+ const attemptEvalSafe = createSafeEvaluator(attemptEval);
661
+ if (shouldPrintDebug) {
662
+ console.log(" staticNamespace", Object.keys(staticNamespace).join(", "));
663
+ }
664
+ const flattenedAttrs = [];
665
+ traversePath.get("openingElement").get("attributes").forEach((path) => {
666
+ const attr = path.node;
667
+ if (!t.isJSXSpreadAttribute(attr)) {
668
+ flattenedAttrs.push(attr);
669
+ return;
601
670
  }
602
- const propName = prop.key["name"];
603
- if (!isValidStyleKey(propName) && propName !== "tag") {
671
+ let arg;
672
+ try {
673
+ arg = attemptEval(attr.argument);
674
+ } catch (e) {
604
675
  if (shouldPrintDebug) {
605
- console.log(" not a valid style prop!", propName);
676
+ console.log(" couldnt parse spread", e.message);
677
+ }
678
+ flattenedAttrs.push(attr);
679
+ return;
680
+ }
681
+ if (arg !== void 0) {
682
+ try {
683
+ if (typeof arg !== "object" || arg == null) {
684
+ if (shouldPrintDebug) {
685
+ console.log(" non object or null arg", arg);
686
+ }
687
+ flattenedAttrs.push(attr);
688
+ } else {
689
+ for (const k in arg) {
690
+ const value = arg[k];
691
+ if (!value && typeof value === "object") {
692
+ console.log("shouldnt we handle this?", k, value, arg);
693
+ continue;
694
+ }
695
+ flattenedAttrs.push(t.jsxAttribute(t.jsxIdentifier(k), t.jsxExpressionContainer(literalToAst(value))));
696
+ }
697
+ }
698
+ } catch (err) {
699
+ console.warn("cant parse spread, caught err", err);
700
+ couldntParse = true;
606
701
  }
607
- return false;
608
702
  }
609
- return true;
610
703
  });
611
- }
612
- __name(isExtractable, "isExtractable");
613
- function createTernariesFromObjectProperties(test, side, ternaryPartial = {}) {
614
- if (!side) {
615
- return null;
704
+ if (couldntParse) {
705
+ return;
706
+ }
707
+ tm.mark("jsx-element-flattened", shouldPrintDebug === "verbose");
708
+ node.attributes = flattenedAttrs;
709
+ if (staticConfig.defaultProps) {
710
+ for (const key in staticConfig.defaultProps) {
711
+ if (isValidStyleKey(key)) {
712
+ continue;
713
+ }
714
+ const serialize = require("babel-literal-to-ast");
715
+ const val = staticConfig.defaultProps[key];
716
+ try {
717
+ const serializedDefaultProp = serialize(val);
718
+ node.attributes.unshift(t.jsxAttribute(t.jsxIdentifier(key), typeof val === "string" ? t.stringLiteral(val) : t.jsxExpressionContainer(serializedDefaultProp)));
719
+ } catch (err) {
720
+ console.warn(`\u26A0\uFE0F Error evaluating default prop for component ${node.name.name}, prop ${key}
721
+ error: ${err}
722
+ value:`, val, "\n defaultProps:", staticConfig.defaultProps);
723
+ }
724
+ }
616
725
  }
617
- if (!isExtractable(side)) {
618
- throw new Error("not extractable");
726
+ let attrs = [];
727
+ let shouldDeopt = false;
728
+ const inlined = /* @__PURE__ */ new Map();
729
+ let hasSetOptimized = false;
730
+ attrs = traversePath.get("openingElement").get("attributes").flatMap((path) => {
731
+ try {
732
+ const res2 = evaluateAttribute(path);
733
+ tm.mark("jsx-element-evaluate-attr", shouldPrintDebug === "verbose");
734
+ if (!res2) {
735
+ path.remove();
736
+ }
737
+ return res2;
738
+ } catch (err) {
739
+ if (shouldPrintDebug) {
740
+ console.log("Error extracting attribute", err.message, err.stack);
741
+ console.log("node", path.node);
742
+ }
743
+ return {
744
+ type: "attr",
745
+ value: path.node
746
+ };
747
+ }
748
+ }).flat(4).filter(isPresent);
749
+ if (shouldPrintDebug) {
750
+ console.log(" - attrs (before):\n", logLines(attrs.map(attrStr).join(", ")));
619
751
  }
620
- return side.properties.flatMap((property) => {
621
- if (!t.isObjectProperty(property)) {
622
- throw new Error("expected object property");
752
+ node.attributes = attrs.filter(isAttr).map((x) => x.value);
753
+ if (couldntParse || shouldDeopt) {
754
+ if (shouldPrintDebug) {
755
+ console.log(` avoid optimizing:`, { couldntParse, shouldDeopt });
623
756
  }
624
- if (t.isIdentifier(property.key)) {
625
- const key = property.key.name;
626
- const mediaQueryKey = key.slice(1);
627
- const isMediaQuery = key[0] === "$" && mediaQueryConfig[mediaQueryKey];
628
- if (isMediaQuery) {
629
- if (t.isExpression(property.value)) {
630
- const ternaries2 = createTernariesFromObjectProperties(t.stringLiteral(mediaQueryKey), property.value, {
631
- inlineMediaQuery: mediaQueryKey
632
- });
633
- if (ternaries2) {
634
- return ternaries2.map((value) => ({
635
- ...ternaryPartial,
636
- ...value,
637
- test: t.logicalExpression("&&", value.test, test)
638
- }));
639
- } else {
640
- console.log("\u26A0\uFE0F no ternaries?", property);
757
+ node.attributes = ogAttributes;
758
+ return;
759
+ }
760
+ const parentFn = findTopmostFunction(traversePath);
761
+ if (parentFn) {
762
+ modifiedComponents.add(parentFn);
763
+ }
764
+ let ternaries = [];
765
+ attrs = attrs.reduce((out, cur) => {
766
+ const next = attrs[attrs.indexOf(cur) + 1];
767
+ if (cur.type === "ternary") {
768
+ ternaries.push(cur.value);
769
+ }
770
+ if ((!next || next.type !== "ternary") && ternaries.length) {
771
+ const normalized = normalizeTernaries(ternaries).map(({ alternate, consequent, ...rest }) => {
772
+ return {
773
+ type: "ternary",
774
+ value: {
775
+ ...rest,
776
+ alternate: alternate || null,
777
+ consequent: consequent || null
641
778
  }
642
- } else {
643
- console.log("\u26A0\uFE0F not expression", property);
779
+ };
780
+ });
781
+ try {
782
+ return [...out, ...normalized];
783
+ } finally {
784
+ if (shouldPrintDebug) {
785
+ console.log(` normalizeTernaries (${ternaries.length} => ${normalized.length})`);
644
786
  }
787
+ ternaries = [];
645
788
  }
646
789
  }
647
- if (t.isConditionalExpression(property.value)) {
648
- const [truthy, falsy] = [
649
- t.objectExpression([t.objectProperty(property.key, property.value.consequent)]),
650
- t.objectExpression([t.objectProperty(property.key, property.value.alternate)])
651
- ].map((x) => attemptEval(x));
652
- return [
653
- createTernary({
654
- remove() {
655
- },
656
- ...ternaryPartial,
657
- test: t.logicalExpression("&&", test, property.value.test),
658
- consequent: truthy,
659
- alternate: null
660
- }),
661
- createTernary({
662
- ...ternaryPartial,
663
- test: t.logicalExpression("&&", test, t.unaryExpression("!", property.value.test)),
664
- consequent: falsy,
665
- alternate: null,
666
- remove() {
667
- }
668
- })
669
- ];
790
+ if (cur.type === "ternary") {
791
+ return out;
670
792
  }
671
- const obj = t.objectExpression([t.objectProperty(property.key, property.value)]);
672
- const consequent = attemptEval(obj);
673
- return createTernary({
674
- remove() {
675
- },
676
- ...ternaryPartial,
677
- test,
678
- consequent,
679
- alternate: null
680
- });
681
- });
682
- }
683
- __name(createTernariesFromObjectProperties, "createTernariesFromObjectProperties");
684
- node.attributes = attrs.filter(isAttr).map((x) => x.value);
685
- if (couldntParse || shouldDeopt) {
793
+ out.push(cur);
794
+ return out;
795
+ }, []).flat();
796
+ const hasSpread = node.attributes.some((x) => t.isJSXSpreadAttribute(x));
797
+ const hasOnlyStringChildren = !hasSpread && (node.selfClosing || traversePath.node.children && traversePath.node.children.every((x) => x.type === "JSXText"));
798
+ let themeVal = inlined.get("theme");
799
+ inlined.delete("theme");
800
+ const allOtherPropsExtractable = [...inlined].every(([k, v]) => INLINE_EXTRACTABLE[k]);
801
+ const shouldWrapThme = allOtherPropsExtractable && !!themeVal;
802
+ const canFlattenProps = inlined.size === 0 || shouldWrapThme || allOtherPropsExtractable;
803
+ let shouldFlatten = !shouldDeopt && canFlattenProps && !hasSpread && staticConfig.neverFlatten !== true && (staticConfig.neverFlatten === "jsx" ? hasOnlyStringChildren : true);
686
804
  if (shouldPrintDebug) {
687
- console.log(` avoid optimizing:`, { couldntParse, shouldDeopt });
805
+ console.log(" - flatten?", objToStr({ hasSpread, shouldDeopt, shouldFlatten, canFlattenProps, shouldWrapThme, allOtherPropsExtractable, hasOnlyStringChildren }));
688
806
  }
689
- node.attributes = ogAttributes;
690
- return;
691
- }
692
- const parentFn = findTopmostFunction(traversePath);
693
- if (parentFn) {
694
- modifiedComponents.add(parentFn);
695
- }
696
- let ternaries = [];
697
- attrs = attrs.reduce((out, cur) => {
698
- const next = attrs[attrs.indexOf(cur) + 1];
699
- if (cur.type === "ternary") {
700
- ternaries.push(cur.value);
807
+ if (shouldFlatten && shouldWrapThme) {
808
+ if (shouldPrintDebug) {
809
+ console.log(" - wrapping theme", allOtherPropsExtractable, themeVal);
810
+ }
811
+ attrs = attrs.filter((x) => x.type === "attr" && t.isJSXAttribute(x.value) && x.value.name.name === "theme" ? false : true);
812
+ if (!hasImportedTheme) {
813
+ hasImportedTheme = true;
814
+ programPath.node.body.push(t.importDeclaration([t.importSpecifier(t.identifier("_TamaguiTheme"), t.identifier("Theme"))], t.stringLiteral("@tamagui/core")));
815
+ }
816
+ traversePath.replaceWith(t.jsxElement(t.jsxOpeningElement(t.jsxIdentifier("_TamaguiTheme"), [
817
+ t.jsxAttribute(t.jsxIdentifier("name"), themeVal.value)
818
+ ]), t.jsxClosingElement(t.jsxIdentifier("_TamaguiTheme")), [traversePath.node]));
701
819
  }
702
- if ((!next || next.type !== "ternary") && ternaries.length) {
703
- const normalized = normalizeTernaries(ternaries).map(({ alternate, consequent, ...rest }) => {
704
- return {
705
- type: "ternary",
706
- value: {
707
- ...rest,
708
- alternate: alternate || null,
709
- consequent: consequent || null
710
- }
820
+ if (shouldFlatten && staticConfig.defaultProps) {
821
+ const defaultStyleAttrs = Object.keys(staticConfig.defaultProps).flatMap((key) => {
822
+ if (!isValidStyleKey(key)) {
823
+ return [];
824
+ }
825
+ const value = staticConfig.defaultProps[key];
826
+ const name = tamaguiConfig.shorthands[key] || key;
827
+ if (value === void 0) {
828
+ console.warn(`\u26A0\uFE0F Error evaluating default style for component, prop ${key} ${value}`);
829
+ shouldDeopt = true;
830
+ return;
831
+ }
832
+ const attr = {
833
+ type: "style",
834
+ name,
835
+ value: { [name]: value }
711
836
  };
837
+ return attr;
712
838
  });
713
- try {
714
- return [...out, ...normalized];
715
- } finally {
716
- if (shouldPrintDebug) {
717
- console.log(` normalizeTernaries (${ternaries.length} => ${normalized.length})`);
839
+ if (defaultStyleAttrs.length) {
840
+ attrs = [...defaultStyleAttrs, ...attrs];
841
+ }
842
+ }
843
+ if (shouldDeopt) {
844
+ node.attributes = ogAttributes;
845
+ return;
846
+ }
847
+ const ensureOverridden = {};
848
+ if (!shouldFlatten) {
849
+ for (const cur of attrs) {
850
+ if (cur.type === "style") {
851
+ for (const key in cur.value) {
852
+ const shouldEnsureOverridden = !!((_d = staticConfig.ensureOverriddenProp) == null ? void 0 : _d[key]);
853
+ const isSetInAttrsAlready = attrs.some((x) => x.type === "attr" && x.value.type === "JSXAttribute" && x.value.name.name === key);
854
+ if (!isSetInAttrsAlready) {
855
+ const isVariant = !!((_e = staticConfig.variants) == null ? void 0 : _e[cur.name || ""]);
856
+ if (isVariant || shouldEnsureOverridden) {
857
+ ensureOverridden[key] = true;
858
+ }
859
+ }
860
+ }
718
861
  }
719
- ternaries = [];
720
862
  }
721
863
  }
722
- if (cur.type === "ternary") {
723
- return out;
864
+ if (shouldPrintDebug) {
865
+ console.log(" - attrs (flattened): \n", logLines(attrs.map(attrStr).join(", ")));
866
+ console.log(" - ensureOverriden:", Object.keys(ensureOverridden).join(", "));
867
+ }
868
+ attrs = attrs.reduce((acc, cur) => {
869
+ if (!cur) {
870
+ return acc;
871
+ }
872
+ if (cur.type === "attr" && !t.isJSXSpreadAttribute(cur.value)) {
873
+ if (shouldFlatten) {
874
+ if (cur.value.name.name === "tag") {
875
+ return acc;
876
+ }
877
+ }
878
+ }
879
+ if (cur.type !== "style") {
880
+ acc.push(cur);
881
+ return acc;
882
+ }
883
+ let key = Object.keys(cur.value)[0];
884
+ const value = cur.value[key];
885
+ const fullKey = tamaguiConfig.shorthands[key];
886
+ if (fullKey) {
887
+ cur.value = { [fullKey]: value };
888
+ key = fullKey;
889
+ }
890
+ if (disableExtractVariables) {
891
+ if (value[0] === "$") {
892
+ if (shouldPrintDebug) {
893
+ console.log(` keeping variable inline: ${key} =`, value);
894
+ }
895
+ acc.push({
896
+ type: "attr",
897
+ value: t.jsxAttribute(t.jsxIdentifier(key), t.jsxExpressionContainer(t.stringLiteral(value)))
898
+ });
899
+ return acc;
900
+ }
901
+ }
902
+ acc.push(cur);
903
+ return acc;
904
+ }, []);
905
+ tm.mark("jsx-element-expanded", shouldPrintDebug === "verbose");
906
+ if (shouldPrintDebug) {
907
+ console.log(" - attrs (expanded): \n", logLines(attrs.map(attrStr).join(", ")));
724
908
  }
725
- out.push(cur);
726
- return out;
727
- }, []).flat();
728
- const completeStaticProps = {
729
- ...Object.keys(attrs).reduce((acc, index) => {
909
+ let prev = null;
910
+ attrs = attrs.reduce((acc, cur) => {
911
+ if (cur.type === "style") {
912
+ const key = Object.keys(cur.value)[0];
913
+ const value = cur.value[key];
914
+ const shouldKeepOriginalAttr = !shouldFlatten && !validStyles[key] && !pseudos[key] && !key.startsWith("data-");
915
+ if (shouldKeepOriginalAttr) {
916
+ if (shouldPrintDebug) {
917
+ console.log(" - keeping as non-style", key);
918
+ }
919
+ prev = cur;
920
+ acc.push({
921
+ type: "attr",
922
+ value: t.jsxAttribute(t.jsxIdentifier(key), t.jsxExpressionContainer(typeof value === "string" ? t.stringLiteral(value) : literalToAst(value)))
923
+ });
924
+ acc.push(cur);
925
+ return acc;
926
+ }
927
+ if (ensureOverridden[key]) {
928
+ acc.push({
929
+ type: "attr",
930
+ value: cur.attr || t.jsxAttribute(t.jsxIdentifier(key), t.jsxExpressionContainer(t.nullLiteral()))
931
+ });
932
+ }
933
+ if ((prev == null ? void 0 : prev.type) === "style") {
934
+ mergeStyles(prev.value, cur.value);
935
+ return acc;
936
+ }
937
+ }
938
+ prev = cur;
939
+ acc.push(cur);
940
+ return acc;
941
+ }, []);
942
+ const state = {
943
+ noClassNames: true,
944
+ focus: false,
945
+ hover: false,
946
+ mounted: true,
947
+ press: false,
948
+ pressIn: false
949
+ };
950
+ const completeStaticProps = Object.keys(attrs).reduce((acc, index) => {
730
951
  const cur = attrs[index];
731
952
  if (cur.type === "style") {
953
+ normalizeStyleObject(cur.value);
732
954
  Object.assign(acc, cur.value);
733
955
  }
734
956
  if (cur.type === "attr") {
@@ -746,282 +968,185 @@ function createExtractor() {
746
968
  acc[key] = value;
747
969
  }
748
970
  return acc;
749
- }, {})
750
- };
751
- const hasSpread = node.attributes.some((x) => t.isJSXSpreadAttribute(x));
752
- const hasOnlyStringChildren = !hasSpread && (node.selfClosing || traversePath.node.children && traversePath.node.children.every((x) => x.type === "JSXText"));
753
- const shouldFlatten = !shouldDeopt && inlinePropCount === 0 && !hasSpread && staticConfig.neverFlatten !== true && (staticConfig.neverFlatten === "jsx" ? hasOnlyStringChildren : true);
754
- if (shouldFlatten && staticConfig.defaultProps) {
755
- const defaultStyleAttrs = Object.keys(staticConfig.defaultProps).flatMap((key) => {
756
- if (!isValidStyleKey(key)) {
757
- return;
971
+ }, {});
972
+ const completeProps = {
973
+ ...staticConfig.defaultProps,
974
+ ...completeStaticProps
975
+ };
976
+ if (shouldPrintDebug) {
977
+ console.log(" - attrs (combined \u{1F500}): \n", logLines(attrs.map(attrStr).join(", ")));
978
+ console.log(" - defaultProps: \n", logLines(objToStr(staticConfig.defaultProps)));
979
+ console.log(" - completeStaticProps: \n", logLines(objToStr(completeStaticProps)));
980
+ }
981
+ const getStyles = /* @__PURE__ */ __name((props2, debugName = "") => {
982
+ if (!props2 || !Object.keys(props2).length) {
983
+ if (shouldPrintDebug)
984
+ console.log(" getStyles() no props");
985
+ return {};
986
+ }
987
+ if (excludeProps && !!excludeProps.size) {
988
+ for (const key in props2) {
989
+ if (excludeProps.has(key)) {
990
+ if (shouldPrintDebug)
991
+ console.log(" delete excluded", key);
992
+ delete props2[key];
993
+ }
994
+ }
758
995
  }
759
996
  try {
760
- const serialize = require("babel-literal-to-ast");
761
- const val = staticConfig.defaultProps[key];
762
- const value = serialize(val);
763
- const name = tamaguiConfig.shorthands[key] || key;
764
- return {
765
- type: "style",
766
- name,
767
- value
997
+ const out = getSplitStyles(props2, staticConfig, defaultTheme, {
998
+ ...state,
999
+ fallbackProps: completeProps
1000
+ });
1001
+ const outStyle = {
1002
+ ...out.style,
1003
+ ...out.pseudos
768
1004
  };
769
- } catch (err) {
770
- console.warn(`\u26A0\uFE0F Error evaluating default style for component, prop ${key}
771
- error: ${err}`);
772
- shouldDeopt = true;
773
- }
774
- });
775
- if (defaultStyleAttrs.length) {
776
- attrs = [...defaultStyleAttrs, ...attrs];
777
- }
778
- }
779
- if (shouldDeopt) {
780
- node.attributes = ogAttributes;
781
- return;
782
- }
783
- const ensureOverridden = {};
784
- if (!shouldFlatten) {
785
- for (const cur of attrs) {
786
- if (cur.type === "style") {
787
- for (const key in cur.value) {
788
- const shouldEnsureOverridden = !!((_d = staticConfig.ensureOverriddenProp) == null ? void 0 : _d[key]);
789
- const isSetInAttrsAlready = attrs.some((x) => x.type === "attr" && x.value.type === "JSXAttribute" && x.value.name.name === key);
790
- if (!isSetInAttrsAlready) {
791
- const isVariant = !!((_e = staticConfig.variants) == null ? void 0 : _e[cur.name || ""]);
792
- if (isVariant || shouldEnsureOverridden) {
793
- ensureOverridden[key] = true;
1005
+ if (staticConfig.validStyles) {
1006
+ for (const key in outStyle) {
1007
+ if (!staticConfig.validStyles[key] && !pseudos[key] && !/(hover|focus|press)Style$/.test(key)) {
1008
+ if (shouldPrintDebug)
1009
+ console.log(" delete invalid style", key);
1010
+ delete outStyle[key];
794
1011
  }
795
1012
  }
796
1013
  }
797
- }
798
- }
799
- }
800
- if (shouldPrintDebug) {
801
- console.log(" - attrs (flattened): \n", logLines(attrs.map(attrStr).join(", ")));
802
- console.log(" - ensureOverriden:", Object.keys(ensureOverridden).join(", "));
803
- }
804
- attrs = attrs.reduce((acc, cur) => {
805
- if (!cur) {
806
- return acc;
807
- }
808
- if (shouldFlatten && cur.type === "attr" && !t.isJSXSpreadAttribute(cur.value) && cur.value.name.name === "tag") {
809
- return acc;
810
- }
811
- if (cur.type !== "style") {
812
- acc.push(cur);
813
- return acc;
814
- }
815
- let key = Object.keys(cur.value)[0];
816
- const value = cur.value[key];
817
- const fullKey = tamaguiConfig.shorthands[key];
818
- if (fullKey) {
819
- cur.value = { [fullKey]: value };
820
- key = fullKey;
821
- }
822
- if (disableExtractVariables) {
823
- if (value[0] === "$") {
824
1014
  if (shouldPrintDebug) {
825
- console.log(` keeping variable inline: ${key} =`, value);
1015
+ console.log(` getStyles ${debugName} (props):
1016
+ `, logLines(objToStr(props2)));
1017
+ console.log(` getStyles ${debugName} (out.viewProps):
1018
+ `, logLines(objToStr(out.viewProps)));
1019
+ console.log(` getStyles ${debugName} (out.style):
1020
+ `, logLines(objToStr(outStyle || {}), true));
826
1021
  }
827
- acc.push({
828
- type: "attr",
829
- value: t.jsxAttribute(t.jsxIdentifier(key), t.jsxExpressionContainer(t.stringLiteral(value)))
830
- });
831
- return acc;
1022
+ return outStyle;
1023
+ } catch (err) {
1024
+ console.log("error", err.message, err.stack);
1025
+ return {};
832
1026
  }
1027
+ }, "getStyles");
1028
+ const completeStylesProcessed = getStyles(completeProps, "completeStylesProcessed");
1029
+ if (!completeStylesProcessed) {
1030
+ throw new Error(`Impossible, no styles`);
833
1031
  }
834
- acc.push(cur);
835
- return acc;
836
- }, []);
837
- if (shouldPrintDebug) {
838
- console.log(" - attrs (expanded): \n", logLines(attrs.map(attrStr).join(", ")));
839
- }
840
- let prev = null;
841
- function mergeStyles(prev2, next) {
842
- for (const key in next) {
843
- if (pseudos[key]) {
844
- prev2[key] = prev2[key] || {};
845
- Object.assign(prev2[key], next[key]);
1032
+ const stylesToAddToInitialGroup = shouldFlatten ? difference(Object.keys(completeStylesProcessed), Object.keys(completeStaticProps)) : [];
1033
+ if (stylesToAddToInitialGroup.length) {
1034
+ const toAdd = pick(completeStylesProcessed, ...stylesToAddToInitialGroup);
1035
+ const firstGroup = attrs.find((x) => x.type === "style");
1036
+ if (shouldPrintDebug) {
1037
+ console.log(" toAdd", objToStr(toAdd));
1038
+ }
1039
+ if (!firstGroup) {
1040
+ attrs.unshift({ type: "style", value: toAdd });
846
1041
  } else {
847
- prev2[key] = next[key];
1042
+ Object.assign(firstGroup.value, toAdd);
848
1043
  }
849
1044
  }
850
- }
851
- __name(mergeStyles, "mergeStyles");
852
- attrs = attrs.reduce((acc, cur) => {
853
- if (cur.type === "style") {
854
- const key = Object.keys(cur.value)[0];
855
- const value = cur.value[key];
856
- const shouldKeepOriginalAttr = !shouldFlatten && !validStyles[key] && !pseudos[key] && !key.startsWith("data-");
857
- if (shouldKeepOriginalAttr) {
858
- if (shouldPrintDebug) {
859
- console.log(" - keeping as non-style", key);
860
- }
861
- prev = cur;
862
- acc.push({
863
- type: "attr",
864
- value: t.jsxAttribute(t.jsxIdentifier(key), t.jsxExpressionContainer(typeof value === "string" ? t.stringLiteral(value) : literalToAst(value)))
865
- });
866
- acc.push(cur);
867
- return acc;
868
- }
869
- if (ensureOverridden[key]) {
870
- acc.push({
871
- type: "attr",
872
- value: cur.attr || t.jsxAttribute(t.jsxIdentifier(key), t.jsxExpressionContainer(t.nullLiteral()))
873
- });
874
- }
875
- if ((prev == null ? void 0 : prev.type) === "style") {
876
- mergeStyles(prev.value, cur.value);
877
- return acc;
878
- }
1045
+ if (shouldPrintDebug) {
1046
+ console.log(" -- stylesToAddToInitialGroup", stylesToAddToInitialGroup.join(", "), { shouldFlatten });
1047
+ console.log(" -- completeStaticProps:\n", logLines(objToStr(completeStaticProps)));
1048
+ console.log(" -- completeStylesProcessed:\n", logLines(objToStr(completeStylesProcessed)));
879
1049
  }
880
- prev = cur;
881
- acc.push(cur);
882
- return acc;
883
- }, []);
884
- if (shouldPrintDebug) {
885
- console.log(" - attrs (combined \u{1F500}): \n", logLines(attrs.map(attrStr).join(", ")));
886
- }
887
- const getStyles = /* @__PURE__ */ __name((props2, debugName = "") => {
888
- if (!props2)
889
- return;
890
- if (!Object.keys(props2).length)
891
- return;
892
- if (excludeProps && !!excludeProps.size) {
893
- for (const key in props2) {
894
- if (excludeProps.has(key)) {
895
- delete props2[key];
1050
+ let getStyleError = null;
1051
+ for (const attr of attrs) {
1052
+ try {
1053
+ if (shouldPrintDebug)
1054
+ console.log(" *", attrStr(attr));
1055
+ switch (attr.type) {
1056
+ case "ternary":
1057
+ const a = getStyles(attr.value.alternate, "ternary.alternate");
1058
+ const c = getStyles(attr.value.consequent, "ternary.consequent");
1059
+ if (a)
1060
+ attr.value.alternate = a;
1061
+ if (c)
1062
+ attr.value.consequent = c;
1063
+ if (shouldPrintDebug)
1064
+ console.log(" => tern ", attrStr(attr));
1065
+ continue;
1066
+ case "style":
1067
+ if (shouldPrintDebug)
1068
+ console.log(" * styles in", logLines(objToStr(attr.value)));
1069
+ const styles = getStyles(attr.value, "style");
1070
+ if (shouldPrintDebug)
1071
+ console.log(" * styles out", logLines(objToStr(styles)));
1072
+ if (styles) {
1073
+ attr.value = Object.fromEntries(Object.keys(styles).map((k) => [k, completeStylesProcessed[k]]));
1074
+ }
1075
+ continue;
896
1076
  }
1077
+ } catch (err) {
1078
+ getStyleError = err;
897
1079
  }
898
1080
  }
899
- const out = getSplitStyles(props2, staticConfig, defaultTheme, {
900
- noClassNames: true
901
- });
902
- const outStyle = {
903
- ...out.style,
904
- ...out.pseudos
905
- };
906
- if (shouldPrintDebug === "verbose") {
907
- console.log(` getStyles ${debugName} (props):
908
- `, logLines(objToStr(props2)));
909
- console.log(` getStyles ${debugName} (out.viewProps):
910
- `, logLines(objToStr(out.viewProps)));
911
- console.log(` getStyles ${debugName} (out.style):
912
- `, logLines(objToStr(outStyle || {}), true));
1081
+ tm.mark("jsx-element-styles", shouldPrintDebug === "verbose");
1082
+ if (getStyleError) {
1083
+ console.log(" \u26A0\uFE0F postprocessing error, deopt", getStyleError);
1084
+ node.attributes = ogAttributes;
1085
+ return node;
913
1086
  }
914
- for (const key in outStyle) {
915
- if (staticConfig.validStyles) {
916
- if (!staticConfig.validStyles[key] && !pseudos[key]) {
917
- delete outStyle[key];
1087
+ const existingStyleKeys = /* @__PURE__ */ new Set();
1088
+ for (let i = attrs.length - 1; i >= 0; i--) {
1089
+ const attr = attrs[i];
1090
+ if (shouldFlatten && canFlattenProps) {
1091
+ if (attr.type === "attr") {
1092
+ if (t.isJSXAttribute(attr.value)) {
1093
+ if (t.isJSXIdentifier(attr.value.name)) {
1094
+ const name = attr.value.name.name;
1095
+ if (INLINE_EXTRACTABLE[name]) {
1096
+ attr.value.name.name = INLINE_EXTRACTABLE[name];
1097
+ }
1098
+ }
1099
+ }
918
1100
  }
919
1101
  }
920
- }
921
- return outStyle;
922
- }, "getStyles");
923
- const completeStylesProcessed = getStyles({
924
- ...staticConfig.defaultProps,
925
- ...completeStaticProps
926
- }, "completeStylesProcessed");
927
- if (!completeStylesProcessed) {
928
- throw new Error(`Impossible, no styles`);
929
- }
930
- const stylesToAddToInitialGroup = shouldFlatten ? difference(Object.keys(completeStylesProcessed), Object.keys(completeStaticProps)) : [];
931
- if (stylesToAddToInitialGroup.length) {
932
- const toAdd = pick(completeStylesProcessed, ...stylesToAddToInitialGroup);
933
- const firstGroup = attrs.find((x) => x.type === "style");
934
- if (shouldPrintDebug) {
935
- console.log(" toAdd", objToStr(toAdd));
936
- }
937
- if (!firstGroup) {
938
- attrs.unshift({ type: "style", value: toAdd });
939
- } else {
940
- Object.assign(firstGroup.value, toAdd);
941
- }
942
- }
943
- if (shouldPrintDebug) {
944
- console.log(" -- stylesToAddToInitialGroup", stylesToAddToInitialGroup.join(", "), { shouldFlatten });
945
- console.log(" -- completeStaticProps:\n", logLines(objToStr(completeStaticProps)));
946
- console.log(" -- completeStylesProcessed:\n", logLines(objToStr(completeStylesProcessed)));
947
- }
948
- let getStyleError = null;
949
- for (const attr of attrs) {
950
- try {
951
- if (shouldPrintDebug)
952
- console.log(" *", attrStr(attr));
953
- switch (attr.type) {
954
- case "ternary":
955
- const a = getStyles(attr.value.alternate, "ternary.alternate");
956
- const c = getStyles(attr.value.consequent, "ternary.consequent");
957
- if (a)
958
- attr.value.alternate = a;
959
- if (c)
960
- attr.value.consequent = c;
961
- if (shouldPrintDebug)
962
- console.log(" => tern ", attrStr(attr));
963
- continue;
964
- case "style":
965
- const styles = getStyles(attr.value, "style");
966
- if (styles) {
967
- attr.value = Object.fromEntries(Object.keys(styles).map((k) => [k, completeStylesProcessed[k]]));
1102
+ if (attr.type === "style") {
1103
+ for (const key in attr.value) {
1104
+ if (existingStyleKeys.has(key)) {
1105
+ if (shouldPrintDebug) {
1106
+ console.log(" >> delete existing", key);
1107
+ }
1108
+ delete attr.value[key];
968
1109
  } else {
969
- console.warn("?????????");
1110
+ existingStyleKeys.add(key);
970
1111
  }
971
- continue;
1112
+ }
972
1113
  }
973
- } catch (err) {
974
- getStyleError = err;
975
1114
  }
976
- }
977
- if (getStyleError) {
978
- console.log(" \u26A0\uFE0F postprocessing error, deopt", getStyleError);
979
- node.attributes = ogAttributes;
980
- return node;
981
- }
982
- const existingStyleKeys = /* @__PURE__ */ new Set();
983
- for (let i = attrs.length - 1; i >= 0; i--) {
984
- const attr = attrs[i];
985
- if (attr.type === "style") {
986
- for (const key in attr.value) {
987
- if (existingStyleKeys.has(key)) {
988
- delete attr.value[key];
989
- } else {
990
- existingStyleKeys.add(key);
991
- }
1115
+ if (shouldFlatten) {
1116
+ if (shouldPrintDebug) {
1117
+ console.log(" [\u2705] flattening", originalNodeName, flatNode);
1118
+ }
1119
+ node.name.name = flatNode;
1120
+ res.flattened++;
1121
+ if (closingElement) {
1122
+ closingElement.name.name = flatNode;
992
1123
  }
993
1124
  }
994
- }
995
- if (shouldPrintDebug) {
996
- console.log(" - attrs (after):\n", logLines(attrs.map(attrStr).join(", ")));
997
- }
998
- if (shouldFlatten) {
999
1125
  if (shouldPrintDebug) {
1000
- console.log(" [\u2705] flattening", originalNodeName, flatNode);
1126
+ console.log(` \u274A\u274A inline props (${inlined.size}):`, shouldDeopt ? " deopted" : "", hasSpread ? " has spread" : "", staticConfig.neverFlatten ? "neverFlatten" : "");
1127
+ console.log(" - attrs (end):\n", logLines(attrs.map(attrStr).join(", ")));
1001
1128
  }
1002
- node.name.name = flatNode;
1003
- res.flattened++;
1004
- if (closingElement) {
1005
- closingElement.name.name = flatNode;
1129
+ onExtractTag({
1130
+ attrs,
1131
+ node,
1132
+ lineNumbers,
1133
+ filePath,
1134
+ attemptEval,
1135
+ jsxPath: traversePath,
1136
+ originalNodeName,
1137
+ isFlattened: shouldFlatten,
1138
+ programPath
1139
+ });
1140
+ } catch (err) {
1141
+ throw err;
1142
+ } finally {
1143
+ if (debugPropValue) {
1144
+ shouldPrintDebug = ogDebug;
1006
1145
  }
1007
1146
  }
1008
- if (shouldPrintDebug) {
1009
- console.log(` \u274A\u274A inline props (${inlinePropCount}):`, shouldDeopt ? " deopted" : "", hasSpread ? " has spread" : "", staticConfig.neverFlatten ? "neverFlatten" : "");
1010
- console.log(" - attrs (end):\n", logLines(attrs.map(attrStr).join(", ")));
1011
- }
1012
- onExtractTag({
1013
- attrs,
1014
- node,
1015
- lineNumbers,
1016
- filePath,
1017
- attemptEval,
1018
- jsxPath: traversePath,
1019
- originalNodeName,
1020
- isFlattened: shouldFlatten,
1021
- programPath
1022
- });
1023
1147
  }
1024
1148
  });
1149
+ tm.mark("jsx-done", shouldPrintDebug === "verbose");
1025
1150
  if (modifiedComponents.size) {
1026
1151
  const all = Array.from(modifiedComponents);
1027
1152
  if (shouldPrintDebug) {
@@ -1031,6 +1156,7 @@ function createExtractor() {
1031
1156
  removeUnusedHooks(comp, shouldPrintDebug);
1032
1157
  }
1033
1158
  }
1159
+ tm.done(shouldPrintDebug === "verbose");
1034
1160
  return res;
1035
1161
  }
1036
1162
  };