@tamagui/static 1.13.2 → 1.13.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/constants.js +1 -52
- package/dist/cjs/constants.js.map +2 -2
- package/dist/cjs/extractor/accessSafe.js +1 -52
- package/dist/cjs/extractor/accessSafe.js.map +2 -2
- package/dist/cjs/extractor/babelParse.js +1 -66
- package/dist/cjs/extractor/babelParse.js.map +2 -2
- package/dist/cjs/extractor/buildClassName.js +1 -99
- package/dist/cjs/extractor/buildClassName.js.map +2 -2
- package/dist/cjs/extractor/bundle.js +1 -126
- package/dist/cjs/extractor/bundle.js.map +2 -2
- package/dist/cjs/extractor/createEvaluator.js +1 -86
- package/dist/cjs/extractor/createEvaluator.js.map +2 -2
- package/dist/cjs/extractor/createExtractor.js +15 -1630
- package/dist/cjs/extractor/createExtractor.js.map +2 -2
- package/dist/cjs/extractor/ensureImportingConcat.js +1 -64
- package/dist/cjs/extractor/ensureImportingConcat.js.map +2 -2
- package/dist/cjs/extractor/evaluateAstNode.js +1 -130
- package/dist/cjs/extractor/evaluateAstNode.js.map +2 -2
- package/dist/cjs/extractor/extractHelpers.js +1 -207
- package/dist/cjs/extractor/extractHelpers.js.map +2 -2
- package/dist/cjs/extractor/extractMediaStyle.js +1 -193
- package/dist/cjs/extractor/extractMediaStyle.js.map +2 -2
- package/dist/cjs/extractor/extractToClassNames.js +13 -413
- package/dist/cjs/extractor/extractToClassNames.js.map +2 -2
- package/dist/cjs/extractor/findTopmostFunction.js +1 -43
- package/dist/cjs/extractor/findTopmostFunction.js.map +2 -2
- package/dist/cjs/extractor/generatedUid.js +1 -59
- package/dist/cjs/extractor/generatedUid.js.map +2 -2
- package/dist/cjs/extractor/getPrefixLogs.js +1 -31
- package/dist/cjs/extractor/getPrefixLogs.js.map +2 -2
- package/dist/cjs/extractor/getPropValueFromAttributes.js +1 -89
- package/dist/cjs/extractor/getPropValueFromAttributes.js.map +2 -2
- package/dist/cjs/extractor/getSourceModule.js +1 -103
- package/dist/cjs/extractor/getSourceModule.js.map +2 -2
- package/dist/cjs/extractor/getStaticBindingsForScope.js +1 -225
- package/dist/cjs/extractor/getStaticBindingsForScope.js.map +2 -2
- package/dist/cjs/extractor/hoistClassNames.js +1 -74
- package/dist/cjs/extractor/hoistClassNames.js.map +2 -2
- package/dist/cjs/extractor/literalToAst.js +1 -115
- package/dist/cjs/extractor/literalToAst.js.map +2 -2
- package/dist/cjs/extractor/loadFile.js +2 -20
- package/dist/cjs/extractor/loadFile.js.map +2 -2
- package/dist/cjs/extractor/loadTamagui.js +15 -432
- package/dist/cjs/extractor/loadTamagui.js.map +2 -2
- package/dist/cjs/extractor/logLines.js +3 -43
- package/dist/cjs/extractor/logLines.js.map +2 -2
- package/dist/cjs/extractor/normalizeTernaries.js +1 -85
- package/dist/cjs/extractor/normalizeTernaries.js.map +2 -2
- package/dist/cjs/extractor/removeUnusedHooks.js +1 -109
- package/dist/cjs/extractor/removeUnusedHooks.js.map +2 -2
- package/dist/cjs/extractor/timer.js +1 -52
- package/dist/cjs/extractor/timer.js.map +2 -2
- package/dist/cjs/extractor/validHTMLAttributes.js +1 -126
- package/dist/cjs/extractor/validHTMLAttributes.js.map +2 -2
- package/dist/cjs/getPragmaOptions.js +2 -67
- package/dist/cjs/getPragmaOptions.js.map +2 -2
- package/dist/cjs/helpers/memoize.js +1 -45
- package/dist/cjs/helpers/memoize.js.map +2 -2
- package/dist/cjs/index.js +1 -42
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/require.js +5 -81
- package/dist/cjs/require.js.map +2 -2
- package/dist/cjs/types.js +1 -16
- package/dist/cjs/types.js.map +2 -2
- package/dist/cjs/webpackPlugin.js +1 -34
- package/dist/cjs/webpackPlugin.js.map +2 -2
- package/dist/esm/constants.js +1 -14
- package/dist/esm/constants.js.map +2 -2
- package/dist/esm/constants.mjs +1 -14
- package/dist/esm/constants.mjs.map +2 -2
- package/dist/esm/extractor/accessSafe.js +1 -18
- package/dist/esm/extractor/accessSafe.js.map +2 -2
- package/dist/esm/extractor/accessSafe.mjs +1 -18
- package/dist/esm/extractor/accessSafe.mjs.map +2 -2
- package/dist/esm/extractor/babelParse.js +1 -31
- package/dist/esm/extractor/babelParse.js.map +2 -2
- package/dist/esm/extractor/babelParse.mjs +1 -31
- package/dist/esm/extractor/babelParse.mjs.map +2 -2
- package/dist/esm/extractor/buildClassName.js +1 -64
- package/dist/esm/extractor/buildClassName.js.map +2 -2
- package/dist/esm/extractor/buildClassName.mjs +1 -64
- package/dist/esm/extractor/buildClassName.mjs.map +2 -2
- package/dist/esm/extractor/bundle.js +1 -91
- package/dist/esm/extractor/bundle.js.map +2 -2
- package/dist/esm/extractor/bundle.mjs +1 -91
- package/dist/esm/extractor/bundle.mjs.map +2 -2
- package/dist/esm/extractor/createEvaluator.js +1 -51
- package/dist/esm/extractor/createEvaluator.js.map +2 -2
- package/dist/esm/extractor/createEvaluator.mjs +1 -51
- package/dist/esm/extractor/createEvaluator.mjs.map +2 -2
- package/dist/esm/extractor/createExtractor.js +15 -1613
- package/dist/esm/extractor/createExtractor.js.map +2 -2
- package/dist/esm/extractor/createExtractor.mjs +15 -1613
- package/dist/esm/extractor/createExtractor.mjs.map +2 -2
- package/dist/esm/extractor/ensureImportingConcat.js +1 -30
- package/dist/esm/extractor/ensureImportingConcat.js.map +2 -2
- package/dist/esm/extractor/ensureImportingConcat.mjs +1 -30
- package/dist/esm/extractor/ensureImportingConcat.mjs.map +2 -2
- package/dist/esm/extractor/evaluateAstNode.js +1 -96
- package/dist/esm/extractor/evaluateAstNode.js.map +2 -2
- package/dist/esm/extractor/evaluateAstNode.mjs +1 -96
- package/dist/esm/extractor/evaluateAstNode.mjs.map +2 -2
- package/dist/esm/extractor/extractHelpers.js +1 -161
- package/dist/esm/extractor/extractHelpers.js.map +2 -2
- package/dist/esm/extractor/extractHelpers.mjs +1 -161
- package/dist/esm/extractor/extractHelpers.mjs.map +2 -2
- package/dist/esm/extractor/extractMediaStyle.js +1 -158
- package/dist/esm/extractor/extractMediaStyle.js.map +2 -2
- package/dist/esm/extractor/extractMediaStyle.mjs +1 -158
- package/dist/esm/extractor/extractMediaStyle.mjs.map +2 -2
- package/dist/esm/extractor/extractToClassNames.js +13 -379
- package/dist/esm/extractor/extractToClassNames.js.map +2 -2
- package/dist/esm/extractor/extractToClassNames.mjs +13 -379
- package/dist/esm/extractor/extractToClassNames.mjs.map +2 -2
- package/dist/esm/extractor/findTopmostFunction.js +1 -19
- package/dist/esm/extractor/findTopmostFunction.js.map +2 -2
- package/dist/esm/extractor/findTopmostFunction.mjs +1 -19
- package/dist/esm/extractor/findTopmostFunction.mjs.map +2 -2
- package/dist/esm/extractor/generatedUid.js +1 -25
- package/dist/esm/extractor/generatedUid.js.map +2 -2
- package/dist/esm/extractor/generatedUid.mjs +1 -25
- package/dist/esm/extractor/generatedUid.mjs.map +2 -2
- package/dist/esm/extractor/getPrefixLogs.js +1 -7
- package/dist/esm/extractor/getPrefixLogs.js.map +2 -2
- package/dist/esm/extractor/getPrefixLogs.mjs +1 -7
- package/dist/esm/extractor/getPrefixLogs.mjs.map +2 -2
- package/dist/esm/extractor/getPropValueFromAttributes.js +1 -55
- package/dist/esm/extractor/getPropValueFromAttributes.js.map +2 -2
- package/dist/esm/extractor/getPropValueFromAttributes.mjs +1 -55
- package/dist/esm/extractor/getPropValueFromAttributes.mjs.map +2 -2
- package/dist/esm/extractor/getSourceModule.js +1 -69
- package/dist/esm/extractor/getSourceModule.js.map +2 -2
- package/dist/esm/extractor/getSourceModule.mjs +1 -69
- package/dist/esm/extractor/getSourceModule.mjs.map +2 -2
- package/dist/esm/extractor/getStaticBindingsForScope.js +1 -190
- package/dist/esm/extractor/getStaticBindingsForScope.js.map +2 -2
- package/dist/esm/extractor/getStaticBindingsForScope.mjs +1 -190
- package/dist/esm/extractor/getStaticBindingsForScope.mjs.map +2 -2
- package/dist/esm/extractor/hoistClassNames.js +1 -40
- package/dist/esm/extractor/hoistClassNames.js.map +2 -2
- package/dist/esm/extractor/hoistClassNames.mjs +1 -40
- package/dist/esm/extractor/hoistClassNames.mjs.map +2 -2
- package/dist/esm/extractor/literalToAst.js +1 -80
- package/dist/esm/extractor/literalToAst.js.map +2 -2
- package/dist/esm/extractor/literalToAst.mjs +1 -80
- package/dist/esm/extractor/literalToAst.mjs.map +2 -2
- package/dist/esm/extractor/loadFile.js +2 -19
- package/dist/esm/extractor/loadFile.js.map +2 -2
- package/dist/esm/extractor/loadFile.mjs +2 -19
- package/dist/esm/extractor/loadFile.mjs.map +2 -2
- package/dist/esm/extractor/loadTamagui.js +15 -396
- package/dist/esm/extractor/loadTamagui.js.map +2 -2
- package/dist/esm/extractor/loadTamagui.mjs +15 -396
- package/dist/esm/extractor/loadTamagui.mjs.map +2 -2
- package/dist/esm/extractor/logLines.js +3 -19
- package/dist/esm/extractor/logLines.js.map +2 -2
- package/dist/esm/extractor/logLines.mjs +3 -19
- package/dist/esm/extractor/logLines.mjs.map +2 -2
- package/dist/esm/extractor/normalizeTernaries.js +1 -51
- package/dist/esm/extractor/normalizeTernaries.js.map +2 -2
- package/dist/esm/extractor/normalizeTernaries.mjs +1 -51
- package/dist/esm/extractor/normalizeTernaries.mjs.map +2 -2
- package/dist/esm/extractor/removeUnusedHooks.js +1 -75
- package/dist/esm/extractor/removeUnusedHooks.js.map +2 -2
- package/dist/esm/extractor/removeUnusedHooks.mjs +1 -75
- package/dist/esm/extractor/removeUnusedHooks.mjs.map +2 -2
- package/dist/esm/extractor/timer.js +1 -28
- package/dist/esm/extractor/timer.js.map +2 -2
- package/dist/esm/extractor/timer.mjs +1 -28
- package/dist/esm/extractor/timer.mjs.map +2 -2
- package/dist/esm/extractor/validHTMLAttributes.js +1 -101
- package/dist/esm/extractor/validHTMLAttributes.js.map +2 -2
- package/dist/esm/extractor/validHTMLAttributes.mjs +1 -101
- package/dist/esm/extractor/validHTMLAttributes.mjs.map +2 -2
- package/dist/esm/getPragmaOptions.js +2 -43
- package/dist/esm/getPragmaOptions.js.map +2 -2
- package/dist/esm/getPragmaOptions.mjs +2 -43
- package/dist/esm/getPragmaOptions.mjs.map +2 -2
- package/dist/esm/helpers/memoize.js +1 -21
- package/dist/esm/helpers/memoize.js.map +2 -2
- package/dist/esm/helpers/memoize.mjs +1 -21
- package/dist/esm/helpers/memoize.mjs.map +2 -2
- package/dist/esm/index.js +1 -15
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/index.mjs +1 -15
- package/dist/esm/index.mjs.map +2 -2
- package/dist/esm/require.js +5 -55
- package/dist/esm/require.js.map +2 -2
- package/dist/esm/require.mjs +5 -55
- package/dist/esm/require.mjs.map +2 -2
- package/dist/esm/webpackPlugin.js +1 -10
- package/dist/esm/webpackPlugin.js.map +2 -2
- package/dist/esm/webpackPlugin.mjs +1 -10
- package/dist/esm/webpackPlugin.mjs.map +2 -2
- package/package.json +14 -14
|
@@ -1,159 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { getStylesAtomic, mediaObjectToString } from "@tamagui/core-node";
|
|
3
|
-
import { MEDIA_SEP } from "../constants.js";
|
|
4
|
-
import { isPresent, isValidImport } from "./extractHelpers.js";
|
|
5
|
-
function extractMediaStyle(props, ternary, jsxPath, tamaguiConfig, sourcePath, importance = 0, shouldPrintDebug = false) {
|
|
6
|
-
const mt = getMediaQueryTernary(props, ternary, jsxPath, sourcePath);
|
|
7
|
-
if (!mt) {
|
|
8
|
-
return null;
|
|
9
|
-
}
|
|
10
|
-
const { key } = mt;
|
|
11
|
-
const mq = tamaguiConfig.media[key];
|
|
12
|
-
if (!mq) {
|
|
13
|
-
console.error(`Media query "${key}" not found: ${Object.keys(tamaguiConfig.media)}`);
|
|
14
|
-
return null;
|
|
15
|
-
}
|
|
16
|
-
const getStyleObj = (styleObj, negate = false) => {
|
|
17
|
-
return styleObj ? { styleObj, negate } : null;
|
|
18
|
-
};
|
|
19
|
-
const styleOpts = [
|
|
20
|
-
getStyleObj(ternary.consequent, false),
|
|
21
|
-
getStyleObj(ternary.alternate, true)
|
|
22
|
-
].filter(isPresent);
|
|
23
|
-
if (shouldPrintDebug && !styleOpts.length) {
|
|
24
|
-
console.log(" media query, no styles?");
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
const mediaKeys = Object.keys(tamaguiConfig.media);
|
|
28
|
-
const mediaKeyPrecendence = mediaKeys.reduce((acc, cur, i) => {
|
|
29
|
-
acc[cur] = new Array(importance + 1).fill(":root").join("");
|
|
30
|
-
return acc;
|
|
31
|
-
}, {});
|
|
32
|
-
let mediaStyles = [];
|
|
33
|
-
for (const { styleObj, negate } of styleOpts) {
|
|
34
|
-
const styles = getStylesAtomic(styleObj);
|
|
35
|
-
const singleMediaStyles = styles.map((style) => {
|
|
36
|
-
const negKey = negate ? "0" : "";
|
|
37
|
-
const ogPrefix = style.identifier.slice(0, style.identifier.indexOf("-") + 1);
|
|
38
|
-
const identifier = `${style.identifier.replace(
|
|
39
|
-
ogPrefix,
|
|
40
|
-
`${ogPrefix}${MEDIA_SEP}${key}${negKey}${MEDIA_SEP}`
|
|
41
|
-
)}`;
|
|
42
|
-
const className = `.${identifier}`;
|
|
43
|
-
const mediaSelector = mediaObjectToString(tamaguiConfig.media[key]);
|
|
44
|
-
const screenStr = negate ? "not all" : "screen";
|
|
45
|
-
const mediaQuery = `${screenStr} and ${mediaSelector}`;
|
|
46
|
-
const precendencePrefix = mediaKeyPrecendence[key];
|
|
47
|
-
const styleInner = style.rules.map((rule) => rule.replace(style.identifier, identifier)).join(";");
|
|
48
|
-
let styleRule = "";
|
|
49
|
-
if (styleInner.includes("@media")) {
|
|
50
|
-
styleRule = styleInner.replace("{", ` and ${mediaQuery} {`);
|
|
51
|
-
} else {
|
|
52
|
-
styleRule = `@media ${mediaQuery} { ${precendencePrefix} ${styleInner} }`;
|
|
53
|
-
}
|
|
54
|
-
return {
|
|
55
|
-
...style,
|
|
56
|
-
identifier,
|
|
57
|
-
className,
|
|
58
|
-
rules: [styleRule]
|
|
59
|
-
};
|
|
60
|
-
});
|
|
61
|
-
if (shouldPrintDebug === "verbose") {
|
|
62
|
-
console.log(" media styles:", importance, styleObj, singleMediaStyles.map((x) => x.identifier).join(", "));
|
|
63
|
-
}
|
|
64
|
-
mediaStyles = [...mediaStyles, ...singleMediaStyles];
|
|
65
|
-
}
|
|
66
|
-
ternary.remove();
|
|
67
|
-
return { mediaStyles, ternaryWithoutMedia: mt.ternaryWithoutMedia };
|
|
68
|
-
}
|
|
69
|
-
function getMediaQueryTernary(props, ternary, jsxPath, sourcePath) {
|
|
70
|
-
if (t.isLogicalExpression(ternary.test) && ternary.test.operator === "&&") {
|
|
71
|
-
const mediaLeft = getMediaInfoFromExpression(
|
|
72
|
-
props,
|
|
73
|
-
ternary.test.left,
|
|
74
|
-
jsxPath,
|
|
75
|
-
sourcePath,
|
|
76
|
-
ternary.inlineMediaQuery
|
|
77
|
-
);
|
|
78
|
-
if (mediaLeft) {
|
|
79
|
-
return {
|
|
80
|
-
...mediaLeft,
|
|
81
|
-
ternaryWithoutMedia: {
|
|
82
|
-
...ternary,
|
|
83
|
-
test: ternary.test.right
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
const result = getMediaInfoFromExpression(
|
|
89
|
-
props,
|
|
90
|
-
ternary.test,
|
|
91
|
-
jsxPath,
|
|
92
|
-
sourcePath,
|
|
93
|
-
ternary.inlineMediaQuery
|
|
94
|
-
);
|
|
95
|
-
if (result) {
|
|
96
|
-
return {
|
|
97
|
-
...result,
|
|
98
|
-
ternaryWithoutMedia: null
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
function getMediaInfoFromExpression(props, test, jsxPath, sourcePath, inlineMediaQuery) {
|
|
104
|
-
var _a, _b, _c;
|
|
105
|
-
if (inlineMediaQuery) {
|
|
106
|
-
return {
|
|
107
|
-
key: inlineMediaQuery,
|
|
108
|
-
bindingName: inlineMediaQuery
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
if (t.isMemberExpression(test) && t.isIdentifier(test.object) && t.isIdentifier(test.property)) {
|
|
112
|
-
const name = test.object["name"];
|
|
113
|
-
const key = test.property["name"];
|
|
114
|
-
const bindings = jsxPath.scope.getAllBindings();
|
|
115
|
-
const binding = bindings[name];
|
|
116
|
-
if (!binding)
|
|
117
|
-
return false;
|
|
118
|
-
const bindingNode = (_a = binding.path) == null ? void 0 : _a.node;
|
|
119
|
-
if (!t.isVariableDeclarator(bindingNode) || !bindingNode.init)
|
|
120
|
-
return false;
|
|
121
|
-
if (!isValidMediaCall(props, jsxPath, bindingNode.init, sourcePath))
|
|
122
|
-
return false;
|
|
123
|
-
return { key, bindingName: name };
|
|
124
|
-
}
|
|
125
|
-
if (t.isIdentifier(test)) {
|
|
126
|
-
const key = test.name;
|
|
127
|
-
const node = (_c = (_b = jsxPath.scope.getBinding(test.name)) == null ? void 0 : _b.path) == null ? void 0 : _c.node;
|
|
128
|
-
if (!t.isVariableDeclarator(node))
|
|
129
|
-
return false;
|
|
130
|
-
if (!node.init || !isValidMediaCall(props, jsxPath, node.init, sourcePath))
|
|
131
|
-
return false;
|
|
132
|
-
return { key, bindingName: key };
|
|
133
|
-
}
|
|
134
|
-
return null;
|
|
135
|
-
}
|
|
136
|
-
function isValidMediaCall(props, jsxPath, init, sourcePath) {
|
|
137
|
-
if (!t.isCallExpression(init))
|
|
138
|
-
return false;
|
|
139
|
-
if (!t.isIdentifier(init.callee))
|
|
140
|
-
return false;
|
|
141
|
-
if (init.callee.name !== "useMedia")
|
|
142
|
-
return false;
|
|
143
|
-
const bindings = jsxPath.scope.getAllBindings();
|
|
144
|
-
const mediaBinding = bindings["useMedia"];
|
|
145
|
-
if (!mediaBinding)
|
|
146
|
-
return false;
|
|
147
|
-
const useMediaImport = mediaBinding.path.parent;
|
|
148
|
-
if (!t.isImportDeclaration(useMediaImport))
|
|
149
|
-
return false;
|
|
150
|
-
if (!isValidImport(props, sourcePath)) {
|
|
151
|
-
return false;
|
|
152
|
-
}
|
|
153
|
-
return true;
|
|
154
|
-
}
|
|
155
|
-
export {
|
|
156
|
-
extractMediaStyle,
|
|
157
|
-
isValidMediaCall
|
|
158
|
-
};
|
|
1
|
+
import*as o from"@babel/types";import{getStylesAtomic as A,mediaObjectToString as v}from"@tamagui/core-node";import{MEDIA_SEP as T}from"../constants.js";import{isPresent as B,isValidImport as J}from"./extractHelpers.js";function R(s,e,i,n,a,t=0,f=!1){const c=K(s,e,i,a);if(!c)return null;const{key:r}=c;if(!n.media[r])return console.error(`Media query "${r}" not found: ${Object.keys(n.media)}`),null;const y=(l,u=!1)=>l?{styleObj:l,negate:u}:null,p=[y(e.consequent,!1),y(e.alternate,!0)].filter(B);if(f&&!p.length)return console.log(" media query, no styles?"),null;const W=Object.keys(n.media).reduce((l,u,j)=>(l[u]=new Array(t+1).fill(":root").join(""),l),{});let b=[];for(const{styleObj:l,negate:u}of p){const $=A(l).map(d=>{const x=u?"0":"",h=d.identifier.slice(0,d.identifier.indexOf("-")+1),S=`${d.identifier.replace(h,`${h}${T}${r}${x}${T}`)}`,k=`.${S}`,F=v(n.media[r]),O=`${u?"not all":"screen"} and ${F}`,V=W[r],I=d.rules.map(q=>q.replace(d.identifier,S)).join(";");let M="";return I.includes("@media")?M=I.replace("{",` and ${O} {`):M=`@media ${O} { ${V} ${I} }`,{...d,identifier:S,className:k,rules:[M]}});f==="verbose"&&console.log(" media styles:",t,l,$.map(d=>d.identifier).join(", ")),b=[...b,...$]}return e.remove(),{mediaStyles:b,ternaryWithoutMedia:c.ternaryWithoutMedia}}function K(s,e,i,n){if(o.isLogicalExpression(e.test)&&e.test.operator==="&&"){const t=E(s,e.test.left,i,n,e.inlineMediaQuery);if(t)return{...t,ternaryWithoutMedia:{...e,test:e.test.right}}}const a=E(s,e.test,i,n,e.inlineMediaQuery);return a?{...a,ternaryWithoutMedia:null}:null}function E(s,e,i,n,a){var t,f,c;if(a)return{key:a,bindingName:a};if(o.isMemberExpression(e)&&o.isIdentifier(e.object)&&o.isIdentifier(e.property)){const r=e.object.name,m=e.property.name,p=i.scope.getAllBindings()[r];if(!p)return!1;const g=(t=p.path)==null?void 0:t.node;return!o.isVariableDeclarator(g)||!g.init||!N(s,i,g.init,n)?!1:{key:m,bindingName:r}}if(o.isIdentifier(e)){const r=e.name,m=(c=(f=i.scope.getBinding(e.name))==null?void 0:f.path)==null?void 0:c.node;return!o.isVariableDeclarator(m)||!m.init||!N(s,i,m.init,n)?!1:{key:r,bindingName:r}}return null}function N(s,e,i,n){if(!o.isCallExpression(i)||!o.isIdentifier(i.callee)||i.callee.name!=="useMedia")return!1;const t=e.scope.getAllBindings().useMedia;if(!t)return!1;const f=t.path.parent;return!(!o.isImportDeclaration(f)||!J(s,n))}export{R as extractMediaStyle,N as isValidMediaCall};
|
|
159
2
|
//# sourceMappingURL=extractMediaStyle.js.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/extractor/extractMediaStyle.ts"],
|
|
4
4
|
"sourcesContent": ["import { NodePath } from '@babel/traverse'\nimport * as t from '@babel/types'\nimport { TamaguiInternalConfig, getStylesAtomic, mediaObjectToString } from '@tamagui/core-node'\nimport type { ViewStyle } from 'react-native'\n\nimport { MEDIA_SEP } from '../constants.js'\nimport type { StyleObject, TamaguiOptionsWithFileInfo, Ternary } from '../types.js'\nimport { isPresent, isValidImport } from './extractHelpers.js'\n\nexport function extractMediaStyle(\n props: TamaguiOptionsWithFileInfo,\n ternary: Ternary,\n jsxPath: NodePath<t.JSXElement>,\n tamaguiConfig: TamaguiInternalConfig,\n sourcePath: string,\n importance = 0,\n shouldPrintDebug: boolean | 'verbose' = false\n) {\n const mt = getMediaQueryTernary(props, ternary, jsxPath, sourcePath)\n if (!mt) {\n return null\n }\n const { key } = mt\n const mq = tamaguiConfig.media[key]\n if (!mq) {\n // eslint-disable-next-line no-console\n console.error(`Media query \"${key}\" not found: ${Object.keys(tamaguiConfig.media)}`)\n return null\n }\n const getStyleObj = (styleObj: ViewStyle | null, negate = false) => {\n return styleObj ? { styleObj, negate } : null\n }\n const styleOpts = [\n getStyleObj(ternary.consequent, false),\n getStyleObj(ternary.alternate, true),\n ].filter(isPresent)\n if (shouldPrintDebug && !styleOpts.length) {\n // eslint-disable-next-line no-console\n console.log(' media query, no styles?')\n return null\n }\n // for now order first strongest\n const mediaKeys = Object.keys(tamaguiConfig.media)\n const mediaKeyPrecendence = mediaKeys.reduce((acc, cur, i) => {\n acc[cur] = new Array(importance + 1).fill(':root').join('')\n return acc\n }, {})\n let mediaStyles: StyleObject[] = []\n for (const { styleObj, negate } of styleOpts) {\n const styles = getStylesAtomic(styleObj)\n const singleMediaStyles = styles.map((style) => {\n const negKey = negate ? '0' : ''\n const ogPrefix = style.identifier.slice(0, style.identifier.indexOf('-') + 1)\n // adds an extra separator before and after to detect later\n // so it goes from: \"_f-[hash]\"\n // to: \"_f-_sm0_[hash]\" or \"_f-_sm_[hash]\"\n const identifier = `${style.identifier.replace(\n ogPrefix,\n `${ogPrefix}${MEDIA_SEP}${key}${negKey}${MEDIA_SEP}`\n )}`\n const className = `.${identifier}`\n const mediaSelector = mediaObjectToString(tamaguiConfig.media[key])\n const screenStr = negate ? 'not all' : 'screen'\n const mediaQuery = `${screenStr} and ${mediaSelector}`\n const precendencePrefix = mediaKeyPrecendence[key]\n const styleInner = style.rules\n .map((rule) => rule.replace(style.identifier, identifier))\n .join(';')\n // combines media queries if they already exist\n let styleRule = ''\n if (styleInner.includes('@media')) {\n // combine\n styleRule = styleInner.replace('{', ` and ${mediaQuery} {`)\n } else {\n styleRule = `@media ${mediaQuery} { ${precendencePrefix} ${styleInner} }`\n }\n return {\n ...style,\n identifier,\n className,\n rules: [styleRule],\n }\n })\n if (shouldPrintDebug === 'verbose') {\n // prettier-ignore\n // eslint-disable-next-line no-console\n console.log(' media styles:', importance, styleObj, singleMediaStyles.map(x => x.identifier).join(', '))\n }\n // add to output\n mediaStyles = [...mediaStyles, ...singleMediaStyles]\n }\n // filter out\n ternary.remove()\n return { mediaStyles, ternaryWithoutMedia: mt.ternaryWithoutMedia }\n}\n\nfunction getMediaQueryTernary(\n props: TamaguiOptionsWithFileInfo,\n ternary: Ternary,\n jsxPath: NodePath<t.JSXElement>,\n sourcePath: string\n): null | {\n key: string\n bindingName: string\n ternaryWithoutMedia: Ternary | null\n} {\n // this handles unwrapping logical && media query ternarys\n // first, unwrap if it has media logicalExpression\n if (t.isLogicalExpression(ternary.test) && ternary.test.operator === '&&') {\n // *should* be normalized to always be on left side\n const mediaLeft = getMediaInfoFromExpression(\n props,\n ternary.test.left,\n jsxPath,\n sourcePath,\n ternary.inlineMediaQuery\n )\n if (mediaLeft) {\n return {\n ...mediaLeft,\n ternaryWithoutMedia: {\n ...ternary,\n test: ternary.test.right,\n },\n }\n }\n }\n // const media = useMedia()\n // ... media.sm\n const result = getMediaInfoFromExpression(\n props,\n ternary.test,\n jsxPath,\n sourcePath,\n ternary.inlineMediaQuery\n )\n if (result) {\n return {\n ...result,\n ternaryWithoutMedia: null,\n }\n }\n return null\n}\n\nfunction getMediaInfoFromExpression(\n props: TamaguiOptionsWithFileInfo,\n test: t.Expression,\n jsxPath: NodePath<t.JSXElement>,\n sourcePath: string,\n inlineMediaQuery?: string\n) {\n if (inlineMediaQuery) {\n return {\n key: inlineMediaQuery,\n bindingName: inlineMediaQuery,\n }\n }\n if (t.isMemberExpression(test) && t.isIdentifier(test.object) && t.isIdentifier(test.property)) {\n const name = test.object['name']\n const key = test.property['name']\n const bindings = jsxPath.scope.getAllBindings()\n const binding = bindings[name]\n if (!binding) return false\n const bindingNode = binding.path?.node\n if (!t.isVariableDeclarator(bindingNode) || !bindingNode.init) return false\n if (!isValidMediaCall(props, jsxPath, bindingNode.init, sourcePath)) return false\n return { key, bindingName: name }\n }\n if (t.isIdentifier(test)) {\n const key = test.name\n const node = jsxPath.scope.getBinding(test.name)?.path?.node\n if (!t.isVariableDeclarator(node)) return false\n if (!node.init || !isValidMediaCall(props, jsxPath, node.init, sourcePath)) return false\n return { key, bindingName: key }\n }\n return null\n}\n\nexport function isValidMediaCall(\n props: TamaguiOptionsWithFileInfo,\n jsxPath: NodePath<t.JSXElement>,\n init: t.Expression,\n sourcePath: string\n) {\n if (!t.isCallExpression(init)) return false\n if (!t.isIdentifier(init.callee)) return false\n // TODO could support renaming useMedia by looking up import first\n if (init.callee.name !== 'useMedia') return false\n const bindings = jsxPath.scope.getAllBindings()\n const mediaBinding = bindings['useMedia']\n if (!mediaBinding) return false\n const useMediaImport = mediaBinding.path.parent\n if (!t.isImportDeclaration(useMediaImport)) return false\n if (!isValidImport(props, sourcePath)) {\n return false\n }\n return true\n}\n"],
|
|
5
|
-
"mappings": "AACA,
|
|
6
|
-
"names": []
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["t", "getStylesAtomic", "mediaObjectToString", "MEDIA_SEP", "isPresent", "isValidImport", "extractMediaStyle", "props", "ternary", "jsxPath", "tamaguiConfig", "sourcePath", "importance", "shouldPrintDebug", "mt", "getMediaQueryTernary", "key", "getStyleObj", "styleObj", "negate", "styleOpts", "mediaKeyPrecendence", "acc", "cur", "i", "mediaStyles", "singleMediaStyles", "style", "negKey", "ogPrefix", "identifier", "className", "mediaSelector", "mediaQuery", "precendencePrefix", "styleInner", "rule", "styleRule", "x", "mediaLeft", "getMediaInfoFromExpression", "result", "test", "inlineMediaQuery", "_a", "_b", "_c", "name", "binding", "bindingNode", "isValidMediaCall", "node", "init", "mediaBinding", "useMediaImport"]
|
|
7
7
|
}
|
|
@@ -1,159 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { getStylesAtomic, mediaObjectToString } from "@tamagui/core-node";
|
|
3
|
-
import { MEDIA_SEP } from "../constants.js";
|
|
4
|
-
import { isPresent, isValidImport } from "./extractHelpers.js";
|
|
5
|
-
function extractMediaStyle(props, ternary, jsxPath, tamaguiConfig, sourcePath, importance = 0, shouldPrintDebug = false) {
|
|
6
|
-
const mt = getMediaQueryTernary(props, ternary, jsxPath, sourcePath);
|
|
7
|
-
if (!mt) {
|
|
8
|
-
return null;
|
|
9
|
-
}
|
|
10
|
-
const { key } = mt;
|
|
11
|
-
const mq = tamaguiConfig.media[key];
|
|
12
|
-
if (!mq) {
|
|
13
|
-
console.error(`Media query "${key}" not found: ${Object.keys(tamaguiConfig.media)}`);
|
|
14
|
-
return null;
|
|
15
|
-
}
|
|
16
|
-
const getStyleObj = (styleObj, negate = false) => {
|
|
17
|
-
return styleObj ? { styleObj, negate } : null;
|
|
18
|
-
};
|
|
19
|
-
const styleOpts = [
|
|
20
|
-
getStyleObj(ternary.consequent, false),
|
|
21
|
-
getStyleObj(ternary.alternate, true)
|
|
22
|
-
].filter(isPresent);
|
|
23
|
-
if (shouldPrintDebug && !styleOpts.length) {
|
|
24
|
-
console.log(" media query, no styles?");
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
const mediaKeys = Object.keys(tamaguiConfig.media);
|
|
28
|
-
const mediaKeyPrecendence = mediaKeys.reduce((acc, cur, i) => {
|
|
29
|
-
acc[cur] = new Array(importance + 1).fill(":root").join("");
|
|
30
|
-
return acc;
|
|
31
|
-
}, {});
|
|
32
|
-
let mediaStyles = [];
|
|
33
|
-
for (const { styleObj, negate } of styleOpts) {
|
|
34
|
-
const styles = getStylesAtomic(styleObj);
|
|
35
|
-
const singleMediaStyles = styles.map((style) => {
|
|
36
|
-
const negKey = negate ? "0" : "";
|
|
37
|
-
const ogPrefix = style.identifier.slice(0, style.identifier.indexOf("-") + 1);
|
|
38
|
-
const identifier = `${style.identifier.replace(
|
|
39
|
-
ogPrefix,
|
|
40
|
-
`${ogPrefix}${MEDIA_SEP}${key}${negKey}${MEDIA_SEP}`
|
|
41
|
-
)}`;
|
|
42
|
-
const className = `.${identifier}`;
|
|
43
|
-
const mediaSelector = mediaObjectToString(tamaguiConfig.media[key]);
|
|
44
|
-
const screenStr = negate ? "not all" : "screen";
|
|
45
|
-
const mediaQuery = `${screenStr} and ${mediaSelector}`;
|
|
46
|
-
const precendencePrefix = mediaKeyPrecendence[key];
|
|
47
|
-
const styleInner = style.rules.map((rule) => rule.replace(style.identifier, identifier)).join(";");
|
|
48
|
-
let styleRule = "";
|
|
49
|
-
if (styleInner.includes("@media")) {
|
|
50
|
-
styleRule = styleInner.replace("{", ` and ${mediaQuery} {`);
|
|
51
|
-
} else {
|
|
52
|
-
styleRule = `@media ${mediaQuery} { ${precendencePrefix} ${styleInner} }`;
|
|
53
|
-
}
|
|
54
|
-
return {
|
|
55
|
-
...style,
|
|
56
|
-
identifier,
|
|
57
|
-
className,
|
|
58
|
-
rules: [styleRule]
|
|
59
|
-
};
|
|
60
|
-
});
|
|
61
|
-
if (shouldPrintDebug === "verbose") {
|
|
62
|
-
console.log(" media styles:", importance, styleObj, singleMediaStyles.map((x) => x.identifier).join(", "));
|
|
63
|
-
}
|
|
64
|
-
mediaStyles = [...mediaStyles, ...singleMediaStyles];
|
|
65
|
-
}
|
|
66
|
-
ternary.remove();
|
|
67
|
-
return { mediaStyles, ternaryWithoutMedia: mt.ternaryWithoutMedia };
|
|
68
|
-
}
|
|
69
|
-
function getMediaQueryTernary(props, ternary, jsxPath, sourcePath) {
|
|
70
|
-
if (t.isLogicalExpression(ternary.test) && ternary.test.operator === "&&") {
|
|
71
|
-
const mediaLeft = getMediaInfoFromExpression(
|
|
72
|
-
props,
|
|
73
|
-
ternary.test.left,
|
|
74
|
-
jsxPath,
|
|
75
|
-
sourcePath,
|
|
76
|
-
ternary.inlineMediaQuery
|
|
77
|
-
);
|
|
78
|
-
if (mediaLeft) {
|
|
79
|
-
return {
|
|
80
|
-
...mediaLeft,
|
|
81
|
-
ternaryWithoutMedia: {
|
|
82
|
-
...ternary,
|
|
83
|
-
test: ternary.test.right
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
const result = getMediaInfoFromExpression(
|
|
89
|
-
props,
|
|
90
|
-
ternary.test,
|
|
91
|
-
jsxPath,
|
|
92
|
-
sourcePath,
|
|
93
|
-
ternary.inlineMediaQuery
|
|
94
|
-
);
|
|
95
|
-
if (result) {
|
|
96
|
-
return {
|
|
97
|
-
...result,
|
|
98
|
-
ternaryWithoutMedia: null
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
function getMediaInfoFromExpression(props, test, jsxPath, sourcePath, inlineMediaQuery) {
|
|
104
|
-
var _a, _b, _c;
|
|
105
|
-
if (inlineMediaQuery) {
|
|
106
|
-
return {
|
|
107
|
-
key: inlineMediaQuery,
|
|
108
|
-
bindingName: inlineMediaQuery
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
if (t.isMemberExpression(test) && t.isIdentifier(test.object) && t.isIdentifier(test.property)) {
|
|
112
|
-
const name = test.object["name"];
|
|
113
|
-
const key = test.property["name"];
|
|
114
|
-
const bindings = jsxPath.scope.getAllBindings();
|
|
115
|
-
const binding = bindings[name];
|
|
116
|
-
if (!binding)
|
|
117
|
-
return false;
|
|
118
|
-
const bindingNode = (_a = binding.path) == null ? void 0 : _a.node;
|
|
119
|
-
if (!t.isVariableDeclarator(bindingNode) || !bindingNode.init)
|
|
120
|
-
return false;
|
|
121
|
-
if (!isValidMediaCall(props, jsxPath, bindingNode.init, sourcePath))
|
|
122
|
-
return false;
|
|
123
|
-
return { key, bindingName: name };
|
|
124
|
-
}
|
|
125
|
-
if (t.isIdentifier(test)) {
|
|
126
|
-
const key = test.name;
|
|
127
|
-
const node = (_c = (_b = jsxPath.scope.getBinding(test.name)) == null ? void 0 : _b.path) == null ? void 0 : _c.node;
|
|
128
|
-
if (!t.isVariableDeclarator(node))
|
|
129
|
-
return false;
|
|
130
|
-
if (!node.init || !isValidMediaCall(props, jsxPath, node.init, sourcePath))
|
|
131
|
-
return false;
|
|
132
|
-
return { key, bindingName: key };
|
|
133
|
-
}
|
|
134
|
-
return null;
|
|
135
|
-
}
|
|
136
|
-
function isValidMediaCall(props, jsxPath, init, sourcePath) {
|
|
137
|
-
if (!t.isCallExpression(init))
|
|
138
|
-
return false;
|
|
139
|
-
if (!t.isIdentifier(init.callee))
|
|
140
|
-
return false;
|
|
141
|
-
if (init.callee.name !== "useMedia")
|
|
142
|
-
return false;
|
|
143
|
-
const bindings = jsxPath.scope.getAllBindings();
|
|
144
|
-
const mediaBinding = bindings["useMedia"];
|
|
145
|
-
if (!mediaBinding)
|
|
146
|
-
return false;
|
|
147
|
-
const useMediaImport = mediaBinding.path.parent;
|
|
148
|
-
if (!t.isImportDeclaration(useMediaImport))
|
|
149
|
-
return false;
|
|
150
|
-
if (!isValidImport(props, sourcePath)) {
|
|
151
|
-
return false;
|
|
152
|
-
}
|
|
153
|
-
return true;
|
|
154
|
-
}
|
|
155
|
-
export {
|
|
156
|
-
extractMediaStyle,
|
|
157
|
-
isValidMediaCall
|
|
158
|
-
};
|
|
1
|
+
import*as o from"@babel/types";import{getStylesAtomic as A,mediaObjectToString as v}from"@tamagui/core-node";import{MEDIA_SEP as T}from"../constants.js";import{isPresent as B,isValidImport as J}from"./extractHelpers.js";function R(s,e,i,n,a,t=0,f=!1){const c=K(s,e,i,a);if(!c)return null;const{key:r}=c;if(!n.media[r])return console.error(`Media query "${r}" not found: ${Object.keys(n.media)}`),null;const y=(l,u=!1)=>l?{styleObj:l,negate:u}:null,p=[y(e.consequent,!1),y(e.alternate,!0)].filter(B);if(f&&!p.length)return console.log(" media query, no styles?"),null;const W=Object.keys(n.media).reduce((l,u,j)=>(l[u]=new Array(t+1).fill(":root").join(""),l),{});let b=[];for(const{styleObj:l,negate:u}of p){const $=A(l).map(d=>{const x=u?"0":"",h=d.identifier.slice(0,d.identifier.indexOf("-")+1),S=`${d.identifier.replace(h,`${h}${T}${r}${x}${T}`)}`,k=`.${S}`,F=v(n.media[r]),O=`${u?"not all":"screen"} and ${F}`,V=W[r],I=d.rules.map(q=>q.replace(d.identifier,S)).join(";");let M="";return I.includes("@media")?M=I.replace("{",` and ${O} {`):M=`@media ${O} { ${V} ${I} }`,{...d,identifier:S,className:k,rules:[M]}});f==="verbose"&&console.log(" media styles:",t,l,$.map(d=>d.identifier).join(", ")),b=[...b,...$]}return e.remove(),{mediaStyles:b,ternaryWithoutMedia:c.ternaryWithoutMedia}}function K(s,e,i,n){if(o.isLogicalExpression(e.test)&&e.test.operator==="&&"){const t=E(s,e.test.left,i,n,e.inlineMediaQuery);if(t)return{...t,ternaryWithoutMedia:{...e,test:e.test.right}}}const a=E(s,e.test,i,n,e.inlineMediaQuery);return a?{...a,ternaryWithoutMedia:null}:null}function E(s,e,i,n,a){var t,f,c;if(a)return{key:a,bindingName:a};if(o.isMemberExpression(e)&&o.isIdentifier(e.object)&&o.isIdentifier(e.property)){const r=e.object.name,m=e.property.name,p=i.scope.getAllBindings()[r];if(!p)return!1;const g=(t=p.path)==null?void 0:t.node;return!o.isVariableDeclarator(g)||!g.init||!N(s,i,g.init,n)?!1:{key:m,bindingName:r}}if(o.isIdentifier(e)){const r=e.name,m=(c=(f=i.scope.getBinding(e.name))==null?void 0:f.path)==null?void 0:c.node;return!o.isVariableDeclarator(m)||!m.init||!N(s,i,m.init,n)?!1:{key:r,bindingName:r}}return null}function N(s,e,i,n){if(!o.isCallExpression(i)||!o.isIdentifier(i.callee)||i.callee.name!=="useMedia")return!1;const t=e.scope.getAllBindings().useMedia;if(!t)return!1;const f=t.path.parent;return!(!o.isImportDeclaration(f)||!J(s,n))}export{R as extractMediaStyle,N as isValidMediaCall};
|
|
159
2
|
//# sourceMappingURL=extractMediaStyle.mjs.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/extractor/extractMediaStyle.ts"],
|
|
4
4
|
"sourcesContent": ["import { NodePath } from '@babel/traverse'\nimport * as t from '@babel/types'\nimport { TamaguiInternalConfig, getStylesAtomic, mediaObjectToString } from '@tamagui/core-node'\nimport type { ViewStyle } from 'react-native'\n\nimport { MEDIA_SEP } from '../constants.js'\nimport type { StyleObject, TamaguiOptionsWithFileInfo, Ternary } from '../types.js'\nimport { isPresent, isValidImport } from './extractHelpers.js'\n\nexport function extractMediaStyle(\n props: TamaguiOptionsWithFileInfo,\n ternary: Ternary,\n jsxPath: NodePath<t.JSXElement>,\n tamaguiConfig: TamaguiInternalConfig,\n sourcePath: string,\n importance = 0,\n shouldPrintDebug: boolean | 'verbose' = false\n) {\n const mt = getMediaQueryTernary(props, ternary, jsxPath, sourcePath)\n if (!mt) {\n return null\n }\n const { key } = mt\n const mq = tamaguiConfig.media[key]\n if (!mq) {\n // eslint-disable-next-line no-console\n console.error(`Media query \"${key}\" not found: ${Object.keys(tamaguiConfig.media)}`)\n return null\n }\n const getStyleObj = (styleObj: ViewStyle | null, negate = false) => {\n return styleObj ? { styleObj, negate } : null\n }\n const styleOpts = [\n getStyleObj(ternary.consequent, false),\n getStyleObj(ternary.alternate, true),\n ].filter(isPresent)\n if (shouldPrintDebug && !styleOpts.length) {\n // eslint-disable-next-line no-console\n console.log(' media query, no styles?')\n return null\n }\n // for now order first strongest\n const mediaKeys = Object.keys(tamaguiConfig.media)\n const mediaKeyPrecendence = mediaKeys.reduce((acc, cur, i) => {\n acc[cur] = new Array(importance + 1).fill(':root').join('')\n return acc\n }, {})\n let mediaStyles: StyleObject[] = []\n for (const { styleObj, negate } of styleOpts) {\n const styles = getStylesAtomic(styleObj)\n const singleMediaStyles = styles.map((style) => {\n const negKey = negate ? '0' : ''\n const ogPrefix = style.identifier.slice(0, style.identifier.indexOf('-') + 1)\n // adds an extra separator before and after to detect later\n // so it goes from: \"_f-[hash]\"\n // to: \"_f-_sm0_[hash]\" or \"_f-_sm_[hash]\"\n const identifier = `${style.identifier.replace(\n ogPrefix,\n `${ogPrefix}${MEDIA_SEP}${key}${negKey}${MEDIA_SEP}`\n )}`\n const className = `.${identifier}`\n const mediaSelector = mediaObjectToString(tamaguiConfig.media[key])\n const screenStr = negate ? 'not all' : 'screen'\n const mediaQuery = `${screenStr} and ${mediaSelector}`\n const precendencePrefix = mediaKeyPrecendence[key]\n const styleInner = style.rules\n .map((rule) => rule.replace(style.identifier, identifier))\n .join(';')\n // combines media queries if they already exist\n let styleRule = ''\n if (styleInner.includes('@media')) {\n // combine\n styleRule = styleInner.replace('{', ` and ${mediaQuery} {`)\n } else {\n styleRule = `@media ${mediaQuery} { ${precendencePrefix} ${styleInner} }`\n }\n return {\n ...style,\n identifier,\n className,\n rules: [styleRule],\n }\n })\n if (shouldPrintDebug === 'verbose') {\n // prettier-ignore\n // eslint-disable-next-line no-console\n console.log(' media styles:', importance, styleObj, singleMediaStyles.map(x => x.identifier).join(', '))\n }\n // add to output\n mediaStyles = [...mediaStyles, ...singleMediaStyles]\n }\n // filter out\n ternary.remove()\n return { mediaStyles, ternaryWithoutMedia: mt.ternaryWithoutMedia }\n}\n\nfunction getMediaQueryTernary(\n props: TamaguiOptionsWithFileInfo,\n ternary: Ternary,\n jsxPath: NodePath<t.JSXElement>,\n sourcePath: string\n): null | {\n key: string\n bindingName: string\n ternaryWithoutMedia: Ternary | null\n} {\n // this handles unwrapping logical && media query ternarys\n // first, unwrap if it has media logicalExpression\n if (t.isLogicalExpression(ternary.test) && ternary.test.operator === '&&') {\n // *should* be normalized to always be on left side\n const mediaLeft = getMediaInfoFromExpression(\n props,\n ternary.test.left,\n jsxPath,\n sourcePath,\n ternary.inlineMediaQuery\n )\n if (mediaLeft) {\n return {\n ...mediaLeft,\n ternaryWithoutMedia: {\n ...ternary,\n test: ternary.test.right,\n },\n }\n }\n }\n // const media = useMedia()\n // ... media.sm\n const result = getMediaInfoFromExpression(\n props,\n ternary.test,\n jsxPath,\n sourcePath,\n ternary.inlineMediaQuery\n )\n if (result) {\n return {\n ...result,\n ternaryWithoutMedia: null,\n }\n }\n return null\n}\n\nfunction getMediaInfoFromExpression(\n props: TamaguiOptionsWithFileInfo,\n test: t.Expression,\n jsxPath: NodePath<t.JSXElement>,\n sourcePath: string,\n inlineMediaQuery?: string\n) {\n if (inlineMediaQuery) {\n return {\n key: inlineMediaQuery,\n bindingName: inlineMediaQuery,\n }\n }\n if (t.isMemberExpression(test) && t.isIdentifier(test.object) && t.isIdentifier(test.property)) {\n const name = test.object['name']\n const key = test.property['name']\n const bindings = jsxPath.scope.getAllBindings()\n const binding = bindings[name]\n if (!binding) return false\n const bindingNode = binding.path?.node\n if (!t.isVariableDeclarator(bindingNode) || !bindingNode.init) return false\n if (!isValidMediaCall(props, jsxPath, bindingNode.init, sourcePath)) return false\n return { key, bindingName: name }\n }\n if (t.isIdentifier(test)) {\n const key = test.name\n const node = jsxPath.scope.getBinding(test.name)?.path?.node\n if (!t.isVariableDeclarator(node)) return false\n if (!node.init || !isValidMediaCall(props, jsxPath, node.init, sourcePath)) return false\n return { key, bindingName: key }\n }\n return null\n}\n\nexport function isValidMediaCall(\n props: TamaguiOptionsWithFileInfo,\n jsxPath: NodePath<t.JSXElement>,\n init: t.Expression,\n sourcePath: string\n) {\n if (!t.isCallExpression(init)) return false\n if (!t.isIdentifier(init.callee)) return false\n // TODO could support renaming useMedia by looking up import first\n if (init.callee.name !== 'useMedia') return false\n const bindings = jsxPath.scope.getAllBindings()\n const mediaBinding = bindings['useMedia']\n if (!mediaBinding) return false\n const useMediaImport = mediaBinding.path.parent\n if (!t.isImportDeclaration(useMediaImport)) return false\n if (!isValidImport(props, sourcePath)) {\n return false\n }\n return true\n}\n"],
|
|
5
|
-
"mappings": "AACA,
|
|
6
|
-
"names": []
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["t", "getStylesAtomic", "mediaObjectToString", "MEDIA_SEP", "isPresent", "isValidImport", "extractMediaStyle", "props", "ternary", "jsxPath", "tamaguiConfig", "sourcePath", "importance", "shouldPrintDebug", "mt", "getMediaQueryTernary", "key", "getStyleObj", "styleObj", "negate", "styleOpts", "mediaKeyPrecendence", "acc", "cur", "i", "mediaStyles", "singleMediaStyles", "style", "negKey", "ogPrefix", "identifier", "className", "mediaSelector", "mediaQuery", "precendencePrefix", "styleInner", "rule", "styleRule", "x", "mediaLeft", "getMediaInfoFromExpression", "result", "test", "inlineMediaQuery", "_a", "_b", "_c", "name", "binding", "bindingNode", "isValidMediaCall", "node", "init", "mediaBinding", "useMediaImport"]
|
|
7
7
|
}
|