@tamagui/static 1.88.13 → 1.89.0-1706360676826
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/LICENSE +21 -0
- package/dist/cjs/extractor/createExtractor.js.map +1 -1
- package/dist/cjs/extractor/createExtractor.native.js.map +1 -1
- package/dist/cjs/extractor/extractMediaStyle.js.map +1 -1
- package/dist/cjs/extractor/extractMediaStyle.native.js.map +1 -1
- package/dist/cjs/extractor/generateTamaguiStudioConfig.js.map +1 -1
- package/dist/cjs/extractor/generateTamaguiStudioConfig.native.js.map +1 -1
- package/dist/cjs/extractor/getStaticBindingsForScope.js.map +1 -1
- package/dist/cjs/extractor/getStaticBindingsForScope.native.js.map +1 -1
- package/dist/esm/constants.mjs +10 -0
- package/dist/esm/extractor/accessSafe.mjs +11 -0
- package/dist/esm/extractor/babelParse.mjs +18 -0
- package/dist/esm/extractor/buildClassName.mjs +26 -0
- package/dist/esm/extractor/bundle.mjs +94 -0
- package/dist/esm/extractor/bundleConfig.mjs +263 -0
- package/dist/esm/extractor/createEvaluator.mjs +34 -0
- package/dist/esm/extractor/createExtractor.js.map +1 -1
- package/dist/esm/extractor/createExtractor.mjs +952 -0
- package/dist/esm/extractor/createExtractor.native.js.map +1 -1
- package/dist/esm/extractor/ensureImportingConcat.mjs +13 -0
- package/dist/esm/extractor/esbuildAliasPlugin.mjs +20 -0
- package/dist/esm/extractor/evaluateAstNode.mjs +48 -0
- package/dist/esm/extractor/extractHelpers.mjs +72 -0
- package/dist/esm/extractor/extractMediaStyle.js.map +1 -1
- package/dist/esm/extractor/extractMediaStyle.mjs +93 -0
- package/dist/esm/extractor/extractMediaStyle.native.js.map +1 -1
- package/dist/esm/extractor/extractToClassNames.mjs +237 -0
- package/dist/esm/extractor/findTopmostFunction.mjs +10 -0
- package/dist/esm/extractor/generateTamaguiStudioConfig.js.map +1 -1
- package/dist/esm/extractor/generateTamaguiStudioConfig.mjs +108 -0
- package/dist/esm/extractor/generateTamaguiStudioConfig.native.js.map +1 -1
- package/dist/esm/extractor/generatedUid.mjs +12 -0
- package/dist/esm/extractor/getPrefixLogs.mjs +4 -0
- package/dist/esm/extractor/getPropValueFromAttributes.mjs +31 -0
- package/dist/esm/extractor/getSourceModule.mjs +33 -0
- package/dist/esm/extractor/getStaticBindingsForScope.js.map +1 -1
- package/dist/esm/extractor/getStaticBindingsForScope.mjs +112 -0
- package/dist/esm/extractor/getStaticBindingsForScope.native.js.map +1 -1
- package/dist/esm/extractor/getTamaguiConfigPathFromOptionsConfig.mjs +5 -0
- package/dist/esm/extractor/hoistClassNames.mjs +24 -0
- package/dist/esm/extractor/literalToAst.mjs +48 -0
- package/dist/esm/extractor/loadFile.mjs +11 -0
- package/dist/esm/extractor/loadTamagui.mjs +233 -0
- package/dist/esm/extractor/logLines.mjs +11 -0
- package/dist/esm/extractor/normalizeTernaries.mjs +33 -0
- package/dist/esm/extractor/propsToFontFamilyCache.mjs +12 -0
- package/dist/esm/extractor/removeUnusedHooks.mjs +41 -0
- package/dist/esm/extractor/timer.mjs +19 -0
- package/dist/esm/extractor/validHTMLAttributes.mjs +49 -0
- package/dist/esm/getPragmaOptions.mjs +19 -0
- package/dist/esm/helpers/memoize.mjs +13 -0
- package/dist/esm/helpers/requireTamaguiCore.mjs +5 -0
- package/dist/esm/index.mjs +3 -0
- package/dist/esm/minifyCSS.mjs +12 -0
- package/dist/esm/registerRequire.mjs +74 -0
- package/dist/esm/server.mjs +40 -0
- package/dist/esm/setup.mjs +1 -0
- package/dist/esm/static.mjs +10 -0
- package/dist/esm/types.mjs +0 -0
- package/dist/esm/webpackPlugin.mjs +7 -0
- package/package.json +15 -15
- package/src/extractor/babelParse.ts +1 -1
- package/src/extractor/bundle.ts +1 -1
- package/src/extractor/bundleConfig.ts +1 -1
- package/src/extractor/createEvaluator.ts +2 -2
- package/src/extractor/createExtractor.ts +3 -2
- package/src/extractor/ensureImportingConcat.ts +1 -1
- package/src/extractor/extractMediaStyle.ts +3 -2
- package/src/extractor/extractToClassNames.ts +1 -1
- package/src/extractor/findTopmostFunction.ts +2 -2
- package/src/extractor/generateTamaguiStudioConfig.ts +4 -3
- package/src/extractor/getPrefixLogs.ts +1 -1
- package/src/extractor/getStaticBindingsForScope.ts +3 -2
- package/src/extractor/getTamaguiConfigPathFromOptionsConfig.ts +1 -1
- package/src/extractor/hoistClassNames.ts +1 -1
- package/src/extractor/loadTamagui.ts +1 -1
- package/src/extractor/normalizeTernaries.ts +1 -1
- package/src/extractor/removeUnusedHooks.ts +1 -1
- package/src/helpers/requireTamaguiCore.ts +1 -1
- package/src/registerRequire.ts +1 -1
- package/src/server.ts +1 -1
- package/src/types.ts +2 -2
- package/types/extractor/babelParse.d.ts +1 -1
- package/types/extractor/babelParse.d.ts.map +1 -1
- package/types/extractor/bundle.d.ts +1 -1
- package/types/extractor/bundle.d.ts.map +1 -1
- package/types/extractor/bundleConfig.d.ts +1 -1
- package/types/extractor/bundleConfig.d.ts.map +1 -1
- package/types/extractor/createEvaluator.d.ts +2 -2
- package/types/extractor/createEvaluator.d.ts.map +1 -1
- package/types/extractor/createExtractor.d.ts +2 -2
- package/types/extractor/createExtractor.d.ts.map +1 -1
- package/types/extractor/ensureImportingConcat.d.ts +1 -1
- package/types/extractor/ensureImportingConcat.d.ts.map +1 -1
- package/types/extractor/extractMediaStyle.d.ts +2 -2
- package/types/extractor/extractMediaStyle.d.ts.map +1 -1
- package/types/extractor/extractToClassNames.d.ts +1 -1
- package/types/extractor/extractToClassNames.d.ts.map +1 -1
- package/types/extractor/findTopmostFunction.d.ts +2 -2
- package/types/extractor/findTopmostFunction.d.ts.map +1 -1
- package/types/extractor/generateTamaguiStudioConfig.d.ts +2 -2
- package/types/extractor/generateTamaguiStudioConfig.d.ts.map +1 -1
- package/types/extractor/getPrefixLogs.d.ts +1 -1
- package/types/extractor/getPrefixLogs.d.ts.map +1 -1
- package/types/extractor/getStaticBindingsForScope.d.ts +1 -1
- package/types/extractor/getStaticBindingsForScope.d.ts.map +1 -1
- package/types/extractor/getTamaguiConfigPathFromOptionsConfig.d.ts +1 -1
- package/types/extractor/getTamaguiConfigPathFromOptionsConfig.d.ts.map +1 -1
- package/types/extractor/hoistClassNames.d.ts +1 -1
- package/types/extractor/hoistClassNames.d.ts.map +1 -1
- package/types/extractor/loadTamagui.d.ts +1 -1
- package/types/extractor/loadTamagui.d.ts.map +1 -1
- package/types/extractor/normalizeTernaries.d.ts +1 -1
- package/types/extractor/normalizeTernaries.d.ts.map +1 -1
- package/types/extractor/removeUnusedHooks.d.ts +1 -1
- package/types/extractor/removeUnusedHooks.d.ts.map +1 -1
- package/types/helpers/requireTamaguiCore.d.ts +1 -1
- package/types/helpers/requireTamaguiCore.d.ts.map +1 -1
- package/types/registerRequire.d.ts +1 -1
- package/types/registerRequire.d.ts.map +1 -1
- package/types/server.d.ts +1 -1
- package/types/server.d.ts.map +1 -1
- package/types/types.d.ts +2 -2
- package/types/types.d.ts.map +1 -1
@@ -0,0 +1,24 @@
|
|
1
|
+
import * as t from "@babel/types";
|
2
|
+
function hoistClassNames(path, existing, expr) {
|
3
|
+
const hoist = hoistClassNames.bind(null, path, existing);
|
4
|
+
if (t.isStringLiteral(expr)) {
|
5
|
+
if (expr.value.trim() === "") return expr;
|
6
|
+
if (existing[expr.value]) return existing[expr.value];
|
7
|
+
const identifier = replaceStringWithVariable(expr);
|
8
|
+
return existing[expr.value] = identifier, identifier;
|
9
|
+
}
|
10
|
+
if (t.isBinaryExpression(expr)) return t.binaryExpression(expr.operator, hoist(expr.left), hoist(expr.right));
|
11
|
+
if (t.isLogicalExpression(expr)) return t.logicalExpression(expr.operator, hoist(expr.left), hoist(expr.right));
|
12
|
+
if (t.isConditionalExpression(expr)) return t.conditionalExpression(expr.test, hoist(expr.consequent), hoist(expr.alternate));
|
13
|
+
return expr;
|
14
|
+
function replaceStringWithVariable(str) {
|
15
|
+
const uid = path.scope.generateUidIdentifier("cn"),
|
16
|
+
parent = path.findParent(path2 => path2.isProgram());
|
17
|
+
if (!parent) throw new Error("no program?");
|
18
|
+
const variable = t.variableDeclaration("const", [
|
19
|
+
// adding a space for extra safety
|
20
|
+
t.variableDeclarator(uid, t.stringLiteral(` ${str.value}`))]);
|
21
|
+
return parent.unshiftContainer("body", variable), uid;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
export { hoistClassNames };
|
@@ -0,0 +1,48 @@
|
|
1
|
+
import * as t from "@babel/types";
|
2
|
+
function literalToAst(literal) {
|
3
|
+
if (literal === null) return t.nullLiteral();
|
4
|
+
switch (typeof literal) {
|
5
|
+
case "function":
|
6
|
+
throw new Error("Unsupported");
|
7
|
+
case "number":
|
8
|
+
return t.numericLiteral(literal);
|
9
|
+
case "string":
|
10
|
+
return t.stringLiteral(literal);
|
11
|
+
case "boolean":
|
12
|
+
return t.booleanLiteral(literal);
|
13
|
+
case "undefined":
|
14
|
+
return t.unaryExpression("void", t.numericLiteral(0), !0);
|
15
|
+
default:
|
16
|
+
return Array.isArray(literal) ? t.arrayExpression(literal.map(literalToAst)) : t.objectExpression(Object.keys(literal).filter(k => typeof literal[k] < "u").map(k => t.objectProperty(t.stringLiteral(k), literalToAst(literal[k]))));
|
17
|
+
}
|
18
|
+
}
|
19
|
+
const easyPeasies = ["BooleanLiteral", "StringLiteral", "NumericLiteral"];
|
20
|
+
function astToLiteral(node) {
|
21
|
+
if (node) {
|
22
|
+
if (easyPeasies.includes(node.type)) return node.value;
|
23
|
+
if (!(node.name === "undefined" && !node.value)) {
|
24
|
+
if (t.isNullLiteral(node)) return null;
|
25
|
+
if (t.isObjectExpression(node)) return computeProps(node.properties);
|
26
|
+
if (t.isArrayExpression(node)) return node.elements.reduce(
|
27
|
+
// @ts-ignore
|
28
|
+
(acc, element) => [...acc, ...(element?.type === "SpreadElement" ? astToLiteral(element.argument) : [astToLiteral(element)])], []);
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
function computeProps(props) {
|
33
|
+
return props.reduce((acc, prop) => {
|
34
|
+
if (prop.type === "SpreadElement") return {
|
35
|
+
...acc,
|
36
|
+
...astToLiteral(prop.argument)
|
37
|
+
};
|
38
|
+
if (prop.type !== "ObjectMethod") {
|
39
|
+
const val = astToLiteral(prop.value);
|
40
|
+
if (val !== void 0) return {
|
41
|
+
...acc,
|
42
|
+
[prop.key.name]: val
|
43
|
+
};
|
44
|
+
}
|
45
|
+
return acc;
|
46
|
+
}, {});
|
47
|
+
}
|
48
|
+
export { astToLiteral, literalToAst };
|
@@ -0,0 +1,11 @@
|
|
1
|
+
process.on("message", path => {
|
2
|
+
if (typeof path != "string") throw new Error(`Not a string: ${path}`);
|
3
|
+
try {
|
4
|
+
const out = require(path);
|
5
|
+
process.send?.(JSON.stringify(out));
|
6
|
+
} catch (err) {
|
7
|
+
err instanceof Error ? process.send?.(`-${err.message}
|
8
|
+
${err.stack}`) : process.send?.(`-${err}`);
|
9
|
+
}
|
10
|
+
});
|
11
|
+
setInterval(() => {}, 1e3);
|
@@ -0,0 +1,233 @@
|
|
1
|
+
import { writeFileSync } from "fs";
|
2
|
+
import { basename, dirname, extname, join, relative, resolve } from "path";
|
3
|
+
import { Color, colorLog } from "@tamagui/cli-color";
|
4
|
+
import { getDefaultTamaguiConfig } from "@tamagui/config-default";
|
5
|
+
import esbuild from "esbuild";
|
6
|
+
import { existsSync, pathExists, readJSON, writeFile } from "fs-extra";
|
7
|
+
import { SHOULD_DEBUG } from "../constants.mjs";
|
8
|
+
import { requireTamaguiCore } from "../helpers/requireTamaguiCore.mjs";
|
9
|
+
import { minifyCSS } from "../minifyCSS.mjs";
|
10
|
+
import { getNameToPaths, registerRequire } from "../registerRequire.mjs";
|
11
|
+
import { TamaguiProjectInfo, getBundledConfig, hasBundledConfigChanged, loadComponents } from "./bundleConfig.mjs";
|
12
|
+
import { generateTamaguiStudioConfig, generateTamaguiStudioConfigSync, generateTamaguiThemes } from "./generateTamaguiStudioConfig.mjs";
|
13
|
+
import { getTamaguiConfigPathFromOptionsConfig } from "./getTamaguiConfigPathFromOptionsConfig.mjs";
|
14
|
+
const getFilledOptions = propsIn => ({
|
15
|
+
// defaults
|
16
|
+
platform: "web",
|
17
|
+
config: "tamagui.config.ts",
|
18
|
+
components: ["tamagui"],
|
19
|
+
...propsIn
|
20
|
+
});
|
21
|
+
async function loadTamagui(propsIn) {
|
22
|
+
const props = getFilledOptions(propsIn),
|
23
|
+
bundleInfo = await getBundledConfig(props);
|
24
|
+
if (!bundleInfo) return console.warn("No bundled config generated, maybe an error in bundling. Set DEBUG=tamagui and re-run to get logs."), null;
|
25
|
+
if (await generateThemesAndLog(props, !0), !hasBundledConfigChanged()) return bundleInfo;
|
26
|
+
if (bundleInfo) {
|
27
|
+
const {
|
28
|
+
createTamagui
|
29
|
+
} = requireTamaguiCore(props.platform),
|
30
|
+
config = createTamagui(bundleInfo.tamaguiConfig);
|
31
|
+
if (props.outputCSS) {
|
32
|
+
colorLog(Color.FgYellow, ` \u27A1 [tamagui] output css: ${props.outputCSS}
|
33
|
+
`);
|
34
|
+
const css = props.disableMinifyCSS === !1 ? minifyCSS(config.getCSS()).code : config.getCSS();
|
35
|
+
await writeFile(props.outputCSS, css);
|
36
|
+
}
|
37
|
+
}
|
38
|
+
return process.env.NODE_ENV === "development" && (await generateTamaguiStudioConfig(props, bundleInfo)), bundleInfo;
|
39
|
+
}
|
40
|
+
let waiting = !1,
|
41
|
+
hasLoggedOnce = !1;
|
42
|
+
const generateThemesAndLog = async (options, force = !1) => {
|
43
|
+
if (!waiting && options.themeBuilder) try {
|
44
|
+
waiting = !0, await new Promise(res => setTimeout(res, 30));
|
45
|
+
const didGenerate = await generateTamaguiThemes(options, force);
|
46
|
+
!hasLoggedOnce && didGenerate && (hasLoggedOnce = !0, colorLog(Color.FgYellow, `
|
47
|
+
\u27A1 [tamagui] generated themes: ${relative(process.cwd(), options.themeBuilder.output)}`));
|
48
|
+
} finally {
|
49
|
+
waiting = !1;
|
50
|
+
}
|
51
|
+
},
|
52
|
+
last = {},
|
53
|
+
lastVersion = {};
|
54
|
+
function loadTamaguiSync({
|
55
|
+
forceExports,
|
56
|
+
cacheKey,
|
57
|
+
...propsIn
|
58
|
+
}) {
|
59
|
+
const key = JSON.stringify(propsIn);
|
60
|
+
if (last[key] && !hasBundledConfigChanged() && (!lastVersion[key] || lastVersion[key] === cacheKey)) return last[key];
|
61
|
+
lastVersion[key] = cacheKey || "";
|
62
|
+
const props = getFilledOptions(propsIn);
|
63
|
+
process.env.IS_STATIC = "is_static", process.env.TAMAGUI_IS_SERVER = "true";
|
64
|
+
const {
|
65
|
+
unregister
|
66
|
+
} = registerRequire(props.platform, {
|
67
|
+
proxyWormImports: !!forceExports
|
68
|
+
});
|
69
|
+
try {
|
70
|
+
const devValueOG = globalThis.__DEV__;
|
71
|
+
globalThis.__DEV__ = process.env.NODE_ENV === "development";
|
72
|
+
try {
|
73
|
+
let tamaguiConfig = null;
|
74
|
+
if (propsIn.config) {
|
75
|
+
const configPath = getTamaguiConfigPathFromOptionsConfig(propsIn.config),
|
76
|
+
exp = require(configPath);
|
77
|
+
if (tamaguiConfig = exp.default || exp.config || exp, !tamaguiConfig || !tamaguiConfig.parsed) {
|
78
|
+
const confPath = require.resolve(configPath);
|
79
|
+
throw new Error(`Can't find valid config in ${confPath}:
|
80
|
+
|
81
|
+
Be sure you "export default" or "export const config" the config.`);
|
82
|
+
}
|
83
|
+
if (tamaguiConfig) {
|
84
|
+
const {
|
85
|
+
createTamagui
|
86
|
+
} = requireTamaguiCore(props.platform);
|
87
|
+
createTamagui(tamaguiConfig);
|
88
|
+
}
|
89
|
+
}
|
90
|
+
const components = loadComponents(props, forceExports);
|
91
|
+
if (!components) throw new Error("No components loaded");
|
92
|
+
process.env.DEBUG === "tamagui" && console.info("components", components), process.env.IS_STATIC = void 0, globalThis.__DEV__ = devValueOG;
|
93
|
+
const info = {
|
94
|
+
components,
|
95
|
+
tamaguiConfig,
|
96
|
+
nameToPaths: getNameToPaths()
|
97
|
+
};
|
98
|
+
if (tamaguiConfig) {
|
99
|
+
if (props.outputCSS) {
|
100
|
+
colorLog(Color.FgYellow, ` \u27A1 [tamagui] output css: ${props.outputCSS}
|
101
|
+
`);
|
102
|
+
const css = props.disableMinifyCSS === !1 ? minifyCSS(tamaguiConfig.getCSS()).code : tamaguiConfig.getCSS();
|
103
|
+
writeFileSync(props.outputCSS, css);
|
104
|
+
}
|
105
|
+
generateTamaguiStudioConfigSync(props, info);
|
106
|
+
}
|
107
|
+
return last[key] = {
|
108
|
+
...info,
|
109
|
+
cached: !0
|
110
|
+
}, info;
|
111
|
+
} catch (err) {
|
112
|
+
err instanceof Error ? !SHOULD_DEBUG && !forceExports ? (console.warn("Error loading tamagui.config.ts (set DEBUG=tamagui to see full stack), running tamagui without custom config"), console.info(`
|
113
|
+
|
114
|
+
${err.message}
|
115
|
+
|
116
|
+
`)) : SHOULD_DEBUG && console.error(err) : console.error("Error loading tamagui.config.ts", err);
|
117
|
+
const {
|
118
|
+
createTamagui
|
119
|
+
} = requireTamaguiCore(props.platform);
|
120
|
+
return {
|
121
|
+
components: [],
|
122
|
+
tamaguiConfig: createTamagui(getDefaultTamaguiConfig()),
|
123
|
+
nameToPaths: {}
|
124
|
+
};
|
125
|
+
}
|
126
|
+
} finally {
|
127
|
+
unregister();
|
128
|
+
}
|
129
|
+
}
|
130
|
+
async function getOptions({
|
131
|
+
root = process.cwd(),
|
132
|
+
tsconfigPath = "tsconfig.json",
|
133
|
+
tamaguiOptions,
|
134
|
+
host,
|
135
|
+
debug
|
136
|
+
} = {}) {
|
137
|
+
const dotDir = join(root, ".tamagui");
|
138
|
+
let pkgJson = {};
|
139
|
+
try {
|
140
|
+
pkgJson = await readJSON(join(root, "package.json"));
|
141
|
+
} catch {}
|
142
|
+
return {
|
143
|
+
mode: process.env.NODE_ENV === "production" ? "production" : "development",
|
144
|
+
root,
|
145
|
+
host: host || "127.0.0.1",
|
146
|
+
pkgJson,
|
147
|
+
debug,
|
148
|
+
tsconfigPath,
|
149
|
+
tamaguiOptions: {
|
150
|
+
platform: "web",
|
151
|
+
components: ["tamagui"],
|
152
|
+
...tamaguiOptions,
|
153
|
+
config: await getDefaultTamaguiConfigPath(root, tamaguiOptions?.config)
|
154
|
+
},
|
155
|
+
paths: {
|
156
|
+
dotDir,
|
157
|
+
conf: join(dotDir, "tamagui.config.json"),
|
158
|
+
types: join(dotDir, "types.json")
|
159
|
+
}
|
160
|
+
};
|
161
|
+
}
|
162
|
+
function resolveWebOrNativeSpecificEntry(entry) {
|
163
|
+
const workspaceRoot = resolve(),
|
164
|
+
resolved = require.resolve(entry, {
|
165
|
+
paths: [workspaceRoot]
|
166
|
+
}),
|
167
|
+
ext = extname(resolved),
|
168
|
+
fileName = basename(resolved).replace(ext, ""),
|
169
|
+
specificFile = join(dirname(resolved), fileName + "." + "web" + ext);
|
170
|
+
return existsSync(specificFile) ? specificFile : entry;
|
171
|
+
}
|
172
|
+
const defaultPaths = ["tamagui.config.ts", join("src", "tamagui.config.ts")];
|
173
|
+
let hasWarnedOnce = !1;
|
174
|
+
async function getDefaultTamaguiConfigPath(root, configPath) {
|
175
|
+
const searchPaths = [...new Set([configPath, ...defaultPaths].filter(Boolean).map(p => join(root, p)))];
|
176
|
+
for (const path of searchPaths) if (await pathExists(path)) return path;
|
177
|
+
hasWarnedOnce || (hasWarnedOnce = !0, console.warn(`Warning: couldn't find tamagui.config.ts in the following paths given configuration "${configPath}":
|
178
|
+
${searchPaths.join(`
|
179
|
+
`)}
|
180
|
+
`));
|
181
|
+
}
|
182
|
+
async function watchTamaguiConfig(tamaguiOptions) {
|
183
|
+
const options = await getOptions({
|
184
|
+
tamaguiOptions
|
185
|
+
});
|
186
|
+
if (!options.tamaguiOptions.config) throw new Error("No config");
|
187
|
+
if (process.env.NODE_ENV === "production") return {
|
188
|
+
dispose() {}
|
189
|
+
};
|
190
|
+
const disposeConfigWatcher = await esbuildWatchFiles(options.tamaguiOptions.config, () => {
|
191
|
+
generateTamaguiStudioConfig(options.tamaguiOptions, null, !0);
|
192
|
+
}),
|
193
|
+
themeBuilderInput = options.tamaguiOptions.themeBuilder?.input;
|
194
|
+
let disposeThemesWatcher;
|
195
|
+
if (themeBuilderInput) {
|
196
|
+
let inputPath = themeBuilderInput;
|
197
|
+
try {
|
198
|
+
inputPath = require.resolve(themeBuilderInput);
|
199
|
+
} catch {}
|
200
|
+
disposeThemesWatcher = await esbuildWatchFiles(inputPath, () => {
|
201
|
+
generateThemesAndLog(options.tamaguiOptions);
|
202
|
+
});
|
203
|
+
}
|
204
|
+
return {
|
205
|
+
dispose() {
|
206
|
+
disposeConfigWatcher(), disposeThemesWatcher?.();
|
207
|
+
}
|
208
|
+
};
|
209
|
+
}
|
210
|
+
async function esbuildWatchFiles(entry, onChanged) {
|
211
|
+
let hasRunOnce = !1;
|
212
|
+
const context = await esbuild.context({
|
213
|
+
bundle: !0,
|
214
|
+
entryPoints: [entry],
|
215
|
+
resolveExtensions: [".ts", ".tsx", ".js", ".jsx", ".mjs"],
|
216
|
+
logLevel: "silent",
|
217
|
+
write: !1,
|
218
|
+
plugins: [{
|
219
|
+
name: "on-rebuild",
|
220
|
+
setup({
|
221
|
+
onEnd
|
222
|
+
}) {
|
223
|
+
onEnd(() => {
|
224
|
+
hasRunOnce ? onChanged() : hasRunOnce = !0;
|
225
|
+
});
|
226
|
+
}
|
227
|
+
}]
|
228
|
+
});
|
229
|
+
return context.watch(), () => {
|
230
|
+
context.dispose();
|
231
|
+
};
|
232
|
+
}
|
233
|
+
export { TamaguiProjectInfo, getOptions, loadTamagui, loadTamaguiSync, resolveWebOrNativeSpecificEntry, watchTamaguiConfig };
|
@@ -0,0 +1,11 @@
|
|
1
|
+
const prefix = " ",
|
2
|
+
logLines = (str, singleLine = !1) => {
|
3
|
+
if (singleLine) return prefix + str.split(" ").join(`
|
4
|
+
${prefix}`);
|
5
|
+
const lines = [""],
|
6
|
+
items = str.split(" ");
|
7
|
+
for (const item of items) item.length + lines[lines.length - 1].length > 85 && lines.push(""), lines[lines.length - 1] += item + " ";
|
8
|
+
return lines.map((line, i) => prefix + (i == 0 ? "" : " ") + line.trim()).join(`
|
9
|
+
`);
|
10
|
+
};
|
11
|
+
export { logLines };
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import generate from "@babel/generator";
|
2
|
+
import * as t from "@babel/types";
|
3
|
+
import invariant from "invariant";
|
4
|
+
function normalizeTernaries(ternaries) {
|
5
|
+
if (invariant(Array.isArray(ternaries), "extractStaticTernaries expects param 1 to be an array of ternaries"), ternaries.length === 0) return [];
|
6
|
+
const ternariesByKey = {};
|
7
|
+
for (let idx = -1, len = ternaries.length; ++idx < len;) {
|
8
|
+
const {
|
9
|
+
test,
|
10
|
+
consequent,
|
11
|
+
alternate,
|
12
|
+
remove,
|
13
|
+
...rest
|
14
|
+
} = ternaries[idx];
|
15
|
+
let ternaryTest = test;
|
16
|
+
t.isExpressionStatement(test) && (ternaryTest = test.expression);
|
17
|
+
let shouldSwap = !1;
|
18
|
+
t.isUnaryExpression(test) && test.operator === "!" ? (ternaryTest = test.argument, shouldSwap = !0) : t.isBinaryExpression(test) && (test.operator === "!==" || test.operator === "!=") && (ternaryTest = t.binaryExpression(test.operator.replace("!", "="), test.left, test.right), shouldSwap = !0);
|
19
|
+
const key = generate(ternaryTest).code;
|
20
|
+
ternariesByKey[key] || (ternariesByKey[key] = {
|
21
|
+
...rest,
|
22
|
+
alternate: {},
|
23
|
+
consequent: {},
|
24
|
+
test: ternaryTest,
|
25
|
+
remove
|
26
|
+
});
|
27
|
+
const altStyle = (shouldSwap ? consequent : alternate) ?? {},
|
28
|
+
consStyle = (shouldSwap ? alternate : consequent) ?? {};
|
29
|
+
Object.assign(ternariesByKey[key].alternate, altStyle), Object.assign(ternariesByKey[key].consequent, consStyle);
|
30
|
+
}
|
31
|
+
return Object.keys(ternariesByKey).map(key => ternariesByKey[key]);
|
32
|
+
}
|
33
|
+
export { normalizeTernaries };
|
@@ -0,0 +1,12 @@
|
|
1
|
+
const cache = /* @__PURE__ */new WeakMap();
|
2
|
+
function setPropsToFontFamily(props, ff) {
|
3
|
+
cache.set(props, ff);
|
4
|
+
}
|
5
|
+
function getPropsToFontFamily(props) {
|
6
|
+
return cache.get(props);
|
7
|
+
}
|
8
|
+
function getFontFamilyClassNameFromProps(props) {
|
9
|
+
const ff = getPropsToFontFamily(props);
|
10
|
+
if (ff) return ` font_${ff.replace("$", "")}`;
|
11
|
+
}
|
12
|
+
export { getFontFamilyClassNameFromProps, getPropsToFontFamily, setPropsToFontFamily };
|
@@ -0,0 +1,41 @@
|
|
1
|
+
import * as t from "@babel/types";
|
2
|
+
const hooks = {
|
3
|
+
useMedia: !0,
|
4
|
+
useTheme: !0
|
5
|
+
};
|
6
|
+
function removeUnusedHooks(compFn, shouldPrintDebug) {
|
7
|
+
compFn.scope.crawl();
|
8
|
+
let bodyStatements = compFn?.get("body");
|
9
|
+
if (!bodyStatements) {
|
10
|
+
console.info("no body statemnts?", compFn);
|
11
|
+
return;
|
12
|
+
}
|
13
|
+
if (Array.isArray(bodyStatements) || (bodyStatements.isFunctionExpression() ? bodyStatements = bodyStatements.scope.path.get("body") : bodyStatements = bodyStatements.get("body")), !bodyStatements || !Array.isArray(bodyStatements)) return;
|
14
|
+
const statements = bodyStatements;
|
15
|
+
for (const statement of statements) {
|
16
|
+
if (!statement.isVariableDeclaration()) continue;
|
17
|
+
const declarations = statement.get("declarations");
|
18
|
+
if (!Array.isArray(declarations)) continue;
|
19
|
+
const isBindingReferenced = name => !!statement.scope.getBinding(name)?.referenced;
|
20
|
+
for (const declarator of declarations) {
|
21
|
+
const id = declarator.get("id"),
|
22
|
+
init = declarator.node.init;
|
23
|
+
if (Array.isArray(id) || Array.isArray(init)) continue;
|
24
|
+
(() => {
|
25
|
+
if (!(init && t.isCallExpression(init) && t.isIdentifier(init.callee) && hooks[init.callee.name])) return !1;
|
26
|
+
if (t.isIdentifier(id.node)) {
|
27
|
+
const name = id.node.name;
|
28
|
+
return !isBindingReferenced(name);
|
29
|
+
}
|
30
|
+
return t.isObjectPattern(id.node) ? id.get("properties").every(prop => {
|
31
|
+
if (!prop.isObjectProperty()) return !1;
|
32
|
+
const value = prop.get("value");
|
33
|
+
if (Array.isArray(value) || !value.isIdentifier()) return !1;
|
34
|
+
const name = value.node.name;
|
35
|
+
return !isBindingReferenced(name);
|
36
|
+
}) : !1;
|
37
|
+
})() && (declarator.remove(), shouldPrintDebug && console.info(` [\u{1FA9D}] removed ${id.node.name ?? ""}`));
|
38
|
+
}
|
39
|
+
}
|
40
|
+
}
|
41
|
+
export { removeUnusedHooks };
|
@@ -0,0 +1,19 @@
|
|
1
|
+
const timer = () => {
|
2
|
+
const start = Date.now();
|
3
|
+
let last = start;
|
4
|
+
return {
|
5
|
+
mark: (name, print = !1) => {
|
6
|
+
if (print) {
|
7
|
+
const took = Date.now() - last;
|
8
|
+
last = Date.now(), console.info(`Time ${name}: ${took}ms`), took > 10 && console.info(" long timer");
|
9
|
+
}
|
10
|
+
},
|
11
|
+
done: (print = !1) => {
|
12
|
+
if (print) {
|
13
|
+
const total = Date.now() - start;
|
14
|
+
console.info(`Total time: ${total}ms`), total > 50 && console.info(" long timer");
|
15
|
+
}
|
16
|
+
}
|
17
|
+
};
|
18
|
+
};
|
19
|
+
export { timer };
|
@@ -0,0 +1,49 @@
|
|
1
|
+
const validHTMLAttributes = {
|
2
|
+
autocomplete: !0,
|
3
|
+
border: !0,
|
4
|
+
contenteditable: !0,
|
5
|
+
crossorigin: !0,
|
6
|
+
dir: !0,
|
7
|
+
draggable: !0,
|
8
|
+
enctype: !0,
|
9
|
+
formenctype: !0,
|
10
|
+
formmethod: !0,
|
11
|
+
formtarget: !0,
|
12
|
+
inputmode: !0,
|
13
|
+
kind: !0,
|
14
|
+
link: !0,
|
15
|
+
method: !0,
|
16
|
+
preload: !0,
|
17
|
+
referrerpolicy: !0,
|
18
|
+
rel: !0,
|
19
|
+
rev: !0,
|
20
|
+
role: !0,
|
21
|
+
sandbox: !0,
|
22
|
+
shape: !0,
|
23
|
+
spellcheck: !0,
|
24
|
+
target: !0,
|
25
|
+
translate: !0,
|
26
|
+
type: !0,
|
27
|
+
wrap: !0,
|
28
|
+
"aria-autocomplete": !0,
|
29
|
+
"aria-busy": !0,
|
30
|
+
"aria-checked": !0,
|
31
|
+
"aria-current": !0,
|
32
|
+
"aria-disabled": !0,
|
33
|
+
"aria-expanded": !0,
|
34
|
+
"aria-haspopup": !0,
|
35
|
+
"aria-hidden": !0,
|
36
|
+
"aria-invalid": !0,
|
37
|
+
"aria-polite": !0,
|
38
|
+
"aria-modal": !0,
|
39
|
+
"aria-multiline": !0,
|
40
|
+
"aria-multiselectable": !0,
|
41
|
+
"aria-orientation": !0,
|
42
|
+
"aria-pressed": !0,
|
43
|
+
"aria-readonly": !0,
|
44
|
+
"aria-relevant": !0,
|
45
|
+
"aria-required": !0,
|
46
|
+
"aria-selected": !0,
|
47
|
+
"aria-sort": !0
|
48
|
+
};
|
49
|
+
export { validHTMLAttributes };
|
@@ -0,0 +1,19 @@
|
|
1
|
+
function getPragmaOptions({
|
2
|
+
source,
|
3
|
+
path,
|
4
|
+
disableCommentCheck
|
5
|
+
}) {
|
6
|
+
if (!disableCommentCheck && !source.startsWith("//") && !source.startsWith("/*")) return {
|
7
|
+
shouldPrintDebug: !1,
|
8
|
+
shouldDisable: !1
|
9
|
+
};
|
10
|
+
let shouldPrintDebug = !1,
|
11
|
+
shouldDisable = !1;
|
12
|
+
const firstLine = source.slice(0, 800).split(`
|
13
|
+
`)[0];
|
14
|
+
return firstLine.includes("tamagui-ignore") && (shouldDisable = !0), firstLine.includes("debug") && (shouldPrintDebug = !0), firstLine.includes("debug-verbose") && (shouldPrintDebug = "verbose"), process.env.TAMAGUI_DEBUG_FILE && path.includes(process.env.TAMAGUI_DEBUG_FILE) && (shouldPrintDebug = "verbose"), process.env.DEBUG?.includes("tamagui") && (shouldPrintDebug ||= !0), process.env.DEBUG?.includes("tamagui-verbose") && (shouldPrintDebug = "verbose"), {
|
15
|
+
shouldPrintDebug,
|
16
|
+
shouldDisable
|
17
|
+
};
|
18
|
+
}
|
19
|
+
export { getPragmaOptions };
|
@@ -0,0 +1,13 @@
|
|
1
|
+
function memoize(func, resolver) {
|
2
|
+
if (typeof func != "function" || resolver != null && typeof resolver != "function") throw new TypeError("Expected a function");
|
3
|
+
const memoized = function (...args) {
|
4
|
+
const key = resolver ? resolver.apply(this, args) : args[0],
|
5
|
+
cache = memoized.cache;
|
6
|
+
if (cache.has(key)) return cache.get(key);
|
7
|
+
const result = func.apply(this, args);
|
8
|
+
return memoized.cache = cache.set(key, result) || cache, result;
|
9
|
+
};
|
10
|
+
return memoized.cache = new (memoize.Cache || Map)(), memoized;
|
11
|
+
}
|
12
|
+
memoize.Cache = Map;
|
13
|
+
export { memoize };
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import browserslist from "browserslist";
|
2
|
+
import { browserslistToTargets, transform } from "lightningcss";
|
3
|
+
function minifyCSS(input) {
|
4
|
+
return transform({
|
5
|
+
filename: "style.css",
|
6
|
+
code: Buffer.from(input),
|
7
|
+
minify: !0,
|
8
|
+
targets: browserslistToTargets(browserslist(">= 0.5%")),
|
9
|
+
sourceMap: !0
|
10
|
+
});
|
11
|
+
}
|
12
|
+
export { minifyCSS };
|
@@ -0,0 +1,74 @@
|
|
1
|
+
import { register } from "esbuild-register/dist/node";
|
2
|
+
import { requireTamaguiCore } from "./helpers/requireTamaguiCore.mjs";
|
3
|
+
const nameToPaths = {},
|
4
|
+
Module = require("module"),
|
5
|
+
getNameToPaths = () => nameToPaths,
|
6
|
+
proxyWorm = require("@tamagui/proxy-worm"),
|
7
|
+
rnw = require("react-native-web");
|
8
|
+
let isRegistered = !1,
|
9
|
+
og;
|
10
|
+
const whitelisted = {
|
11
|
+
react: !0
|
12
|
+
},
|
13
|
+
compiled = {};
|
14
|
+
function setRequireResult(name, result) {
|
15
|
+
compiled[name] = result;
|
16
|
+
}
|
17
|
+
function registerRequire(platform, {
|
18
|
+
proxyWormImports
|
19
|
+
} = {
|
20
|
+
proxyWormImports: !1
|
21
|
+
}) {
|
22
|
+
if (isRegistered) return {
|
23
|
+
tamaguiRequire: require,
|
24
|
+
unregister: () => {}
|
25
|
+
};
|
26
|
+
const {
|
27
|
+
unregister
|
28
|
+
} = register({
|
29
|
+
hookIgnoreNodeModules: !1
|
30
|
+
});
|
31
|
+
og || (og = Module.prototype.require), isRegistered = !0, Module.prototype.require = tamaguiRequire;
|
32
|
+
function tamaguiRequire(path) {
|
33
|
+
if (path === "tamagui" && platform === "native") return og.apply(this, ["tamagui/native"]);
|
34
|
+
if (path === "@tamagui/core" || path === "@tamagui/web") return requireTamaguiCore(platform, path2 => og.apply(this, [path2]));
|
35
|
+
if (path in compiled) return compiled[path];
|
36
|
+
if (/\.(gif|jpe?g|png|svg|ttf|otf|woff2?|bmp|webp)$/i.test(path)) return {};
|
37
|
+
if (path === "@gorhom/bottom-sheet" || path.startsWith("react-native-reanimated") || path === "expo-linear-gradient" || path === "@expo/vector-icons" || path === "tamagui/linear-gradient" || path === "react-native-svg") return proxyWorm;
|
38
|
+
if (path === "react-native/package.json") return packageJson;
|
39
|
+
if (path === "react-native-web-lite" || path.startsWith("react-native")) return rnw;
|
40
|
+
if (path in knownIgnorableModules) return proxyWorm;
|
41
|
+
if (!whitelisted[path] && proxyWormImports && !path.includes(".tamagui-dynamic-eval")) return path === "tamagui" ? og.apply(this, [path]) : proxyWorm;
|
42
|
+
try {
|
43
|
+
return og.apply(this, arguments);
|
44
|
+
} catch (err) {
|
45
|
+
return !process.env.TAMAGUI_ENABLE_WARN_DYNAMIC_LOAD && path.includes("tamagui-dynamic-eval") ? void 0 : (allowedIgnores[path] || IGNORES === "true" || (!process.env.TAMAGUI_SHOW_FULL_BUNDLE_ERRORS && !process.env.DEBUG ? hasWarnedForModules.has(path) || (hasWarnedForModules.add(path), console.info(` tamagui: skipping ${path} tamagui.dev/docs/intro/errors#warning-001`)) : console.error(`Tamagui failed loading "${path}"
|
46
|
+
|
47
|
+
${err.message}
|
48
|
+
${err.stack}
|
49
|
+
|
50
|
+
`)), proxyWorm);
|
51
|
+
}
|
52
|
+
}
|
53
|
+
return {
|
54
|
+
tamaguiRequire,
|
55
|
+
unregister: () => {
|
56
|
+
unregister(), isRegistered = !1, Module.prototype.require = og;
|
57
|
+
}
|
58
|
+
};
|
59
|
+
}
|
60
|
+
const packageJson = require("react-native-web/package.json"),
|
61
|
+
IGNORES = process.env.TAMAGUI_IGNORE_BUNDLE_ERRORS,
|
62
|
+
extraIgnores = IGNORES === "true" ? [] : process.env.TAMAGUI_IGNORE_BUNDLE_ERRORS?.split(","),
|
63
|
+
knownIgnorableModules = {
|
64
|
+
"expo-modules": !0,
|
65
|
+
solito: !0,
|
66
|
+
...Object.fromEntries(extraIgnores?.map(k => [k, !0]) || [])
|
67
|
+
},
|
68
|
+
hasWarnedForModules = /* @__PURE__ */new Set(),
|
69
|
+
allowedIgnores = {
|
70
|
+
"expo-constants": !0,
|
71
|
+
"./ExpoHaptics": !0,
|
72
|
+
"./js/MaskedView": !0
|
73
|
+
};
|
74
|
+
export { getNameToPaths, registerRequire, setRequireResult };
|
@@ -0,0 +1,40 @@
|
|
1
|
+
import net from "node:net";
|
2
|
+
async function startServer(options) {
|
3
|
+
const port = await getAvailablePort(),
|
4
|
+
server = net.createServer();
|
5
|
+
server.unref(), await new Promise((resolve, reject) => {
|
6
|
+
server.on("error", reject), server.on("connection", conn => {
|
7
|
+
conn.on("data", data => {
|
8
|
+
console.info("got", data.toString());
|
9
|
+
});
|
10
|
+
}), server.listen({
|
11
|
+
port
|
12
|
+
}, () => {
|
13
|
+
const {
|
14
|
+
port: port2
|
15
|
+
} = server.address();
|
16
|
+
server.close(() => {
|
17
|
+
resolve(port2);
|
18
|
+
});
|
19
|
+
});
|
20
|
+
});
|
21
|
+
}
|
22
|
+
async function getAvailablePort(port = 8089) {
|
23
|
+
return checkAvailablePort(port).catch(() => getAvailablePort(port + 1));
|
24
|
+
}
|
25
|
+
function checkAvailablePort(port) {
|
26
|
+
return new Promise((resolve, reject) => {
|
27
|
+
const server = net.createServer();
|
28
|
+
server.unref(), server.on("error", reject), server.listen({
|
29
|
+
port
|
30
|
+
}, () => {
|
31
|
+
const {
|
32
|
+
port: port2
|
33
|
+
} = server.address();
|
34
|
+
server.close(() => {
|
35
|
+
resolve(port2);
|
36
|
+
});
|
37
|
+
});
|
38
|
+
});
|
39
|
+
}
|
40
|
+
export { startServer };
|
@@ -0,0 +1 @@
|
|
1
|
+
process.env.IS_STATIC = "is_static";
|