@tamagui/static 1.88.12 → 1.89.0-1706308641099

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 (45) hide show
  1. package/LICENSE +21 -0
  2. package/dist/esm/constants.mjs +10 -0
  3. package/dist/esm/extractor/accessSafe.mjs +11 -0
  4. package/dist/esm/extractor/babelParse.mjs +18 -0
  5. package/dist/esm/extractor/buildClassName.mjs +26 -0
  6. package/dist/esm/extractor/bundle.mjs +94 -0
  7. package/dist/esm/extractor/bundleConfig.mjs +263 -0
  8. package/dist/esm/extractor/createEvaluator.mjs +34 -0
  9. package/dist/esm/extractor/createExtractor.mjs +952 -0
  10. package/dist/esm/extractor/ensureImportingConcat.mjs +13 -0
  11. package/dist/esm/extractor/esbuildAliasPlugin.mjs +20 -0
  12. package/dist/esm/extractor/evaluateAstNode.mjs +48 -0
  13. package/dist/esm/extractor/extractHelpers.mjs +72 -0
  14. package/dist/esm/extractor/extractMediaStyle.mjs +93 -0
  15. package/dist/esm/extractor/extractToClassNames.mjs +237 -0
  16. package/dist/esm/extractor/findTopmostFunction.mjs +10 -0
  17. package/dist/esm/extractor/generateTamaguiStudioConfig.mjs +108 -0
  18. package/dist/esm/extractor/generatedUid.mjs +12 -0
  19. package/dist/esm/extractor/getPrefixLogs.mjs +4 -0
  20. package/dist/esm/extractor/getPropValueFromAttributes.mjs +31 -0
  21. package/dist/esm/extractor/getSourceModule.mjs +33 -0
  22. package/dist/esm/extractor/getStaticBindingsForScope.mjs +112 -0
  23. package/dist/esm/extractor/getTamaguiConfigPathFromOptionsConfig.mjs +5 -0
  24. package/dist/esm/extractor/hoistClassNames.mjs +24 -0
  25. package/dist/esm/extractor/literalToAst.mjs +48 -0
  26. package/dist/esm/extractor/loadFile.mjs +11 -0
  27. package/dist/esm/extractor/loadTamagui.mjs +233 -0
  28. package/dist/esm/extractor/logLines.mjs +11 -0
  29. package/dist/esm/extractor/normalizeTernaries.mjs +33 -0
  30. package/dist/esm/extractor/propsToFontFamilyCache.mjs +12 -0
  31. package/dist/esm/extractor/removeUnusedHooks.mjs +41 -0
  32. package/dist/esm/extractor/timer.mjs +19 -0
  33. package/dist/esm/extractor/validHTMLAttributes.mjs +49 -0
  34. package/dist/esm/getPragmaOptions.mjs +19 -0
  35. package/dist/esm/helpers/memoize.mjs +13 -0
  36. package/dist/esm/helpers/requireTamaguiCore.mjs +5 -0
  37. package/dist/esm/index.mjs +3 -0
  38. package/dist/esm/minifyCSS.mjs +12 -0
  39. package/dist/esm/registerRequire.mjs +74 -0
  40. package/dist/esm/server.mjs +40 -0
  41. package/dist/esm/setup.mjs +1 -0
  42. package/dist/esm/static.mjs +10 -0
  43. package/dist/esm/types.mjs +0 -0
  44. package/dist/esm/webpackPlugin.mjs +7 -0
  45. package/package.json +15 -15
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 Nate Wienert
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,10 @@
1
+ import findCacheDir from "find-cache-dir";
2
+ const CSS_FILE_NAME = "__snack.css",
3
+ MEDIA_SEP = "_",
4
+ cacheDir = findCacheDir({
5
+ name: "tamagui",
6
+ create: !0
7
+ }),
8
+ FAILED_EVAL = Symbol("failed_style_eval"),
9
+ SHOULD_DEBUG = process.env.DEBUG === "*" || process.env.DEBUG?.startsWith("tamagui");
10
+ export { CSS_FILE_NAME, FAILED_EVAL, MEDIA_SEP, SHOULD_DEBUG, cacheDir };
@@ -0,0 +1,11 @@
1
+ import * as t from "@babel/types";
2
+ function accessSafe(obj, member) {
3
+ return t.logicalExpression("&&", t.logicalExpression("&&",
4
+ // typeof obj === 'object
5
+ t.binaryExpression("===", t.unaryExpression("typeof", obj), t.stringLiteral("object")),
6
+ // obj !== null
7
+ t.binaryExpression("!==", obj, t.nullLiteral())),
8
+ // obj.member
9
+ t.memberExpression(obj, t.identifier(member), !1));
10
+ }
11
+ export { accessSafe };
@@ -0,0 +1,18 @@
1
+ import * as babelParser from "@babel/parser";
2
+ const plugins = ["asyncGenerators", "classProperties", "dynamicImport", "functionBind", "jsx", "numericSeparator", "objectRestSpread", "optionalCatchBinding", "decorators-legacy", "typescript", "optionalChaining", "nullishCoalescingOperator"],
3
+ parserOptions = Object.freeze({
4
+ plugins,
5
+ sourceType: "module"
6
+ }),
7
+ parser = babelParser.parse.bind(babelParser);
8
+ function babelParse(code, fileName) {
9
+ const codeString = code.toString();
10
+ try {
11
+ return parser(codeString, parserOptions);
12
+ } catch (err) {
13
+ throw new Error(`Error parsing babel: ${err} in ${fileName}, code:
14
+ ${codeString}
15
+ ${err.stack}`);
16
+ }
17
+ }
18
+ export { babelParse, parserOptions };
@@ -0,0 +1,26 @@
1
+ import * as t from "@babel/types";
2
+ const buildClassName = (objectsIn, extras = "") => {
3
+ let objects = buildClassNameLogic(objectsIn);
4
+ return objects ? (t.isStringLiteral(objects) ? objects.value = `${extras} ${objects.value}` : objects = t.binaryExpression("+", t.stringLiteral(extras), objects), objects) : null;
5
+ },
6
+ buildClassNameLogic = objects => objects.reduce((acc, val) => {
7
+ if (acc == null) return (
8
+ // pass conditional expressions through
9
+ t.isConditionalExpression(val) ||
10
+ // pass non-null literals through
11
+ t.isStringLiteral(val) || t.isNumericLiteral(val) ? val : t.logicalExpression("||", val, t.stringLiteral(""))
12
+ );
13
+ let inner;
14
+ if (t.isStringLiteral(val)) {
15
+ if (t.isStringLiteral(acc)) return t.stringLiteral(`${acc.value} ${val.value}`);
16
+ inner = t.stringLiteral(` ${val.value}`);
17
+ } else if (t.isLiteral(val)) inner = t.binaryExpression("+", t.stringLiteral(" "), val);else if (t.isConditionalExpression(val) || t.isBinaryExpression(val)) {
18
+ if (t.isStringLiteral(acc)) return t.binaryExpression("+", t.stringLiteral(`${acc.value} `), val);
19
+ inner = t.binaryExpression("+", t.stringLiteral(" "), val);
20
+ } else if (t.isIdentifier(val) || t.isMemberExpression(val)) inner = t.conditionalExpression(val, t.binaryExpression("+", t.stringLiteral(" "), val), t.stringLiteral(""));else {
21
+ if (t.isStringLiteral(acc)) return t.binaryExpression("+", t.stringLiteral(`${acc.value} `), t.logicalExpression("||", val, t.stringLiteral("")));
22
+ inner = t.binaryExpression("+", t.stringLiteral(" "), t.logicalExpression("||", val, t.stringLiteral("")));
23
+ }
24
+ return t.binaryExpression("+", acc, inner);
25
+ }, null);
26
+ export { buildClassName, buildClassNameLogic };
@@ -0,0 +1,94 @@
1
+ import { basename, dirname, join } from "path";
2
+ import esbuild from "esbuild";
3
+ import { pathExists, stat, writeFile } from "fs-extra";
4
+ import { esbuildAliasPlugin } from "./esbuildAliasPlugin.mjs";
5
+ import { resolveWebOrNativeSpecificEntry } from "./loadTamagui.mjs";
6
+ function getESBuildConfig({
7
+ entryPoints,
8
+ resolvePlatformSpecificEntries,
9
+ ...options
10
+ }, platform, aliases) {
11
+ process.env.DEBUG?.startsWith("tamagui") && console.info("Building", entryPoints);
12
+ const tsconfig = join(__dirname, "..", "..", "..", "tamagui.tsconfig.json");
13
+ return {
14
+ bundle: !0,
15
+ entryPoints: resolvePlatformSpecificEntries ? entryPoints.map(resolveWebOrNativeSpecificEntry) : entryPoints,
16
+ format: "cjs",
17
+ target: "node16",
18
+ jsx: "transform",
19
+ jsxFactory: "react",
20
+ allowOverwrite: !0,
21
+ keepNames: !0,
22
+ resolveExtensions: [".web.tsx", ".web.ts", ".web.jsx", ".web.js", ".tsx", ".ts", ".jsx", ".js"],
23
+ platform: "node",
24
+ tsconfig,
25
+ loader: {
26
+ ".js": "jsx",
27
+ ".png": "dataurl",
28
+ ".jpg": "dataurl",
29
+ ".jpeg": "dataurl",
30
+ ".svg": "dataurl",
31
+ ".gif": "dataurl",
32
+ ".webp": "dataurl",
33
+ ".woff2": "dataurl",
34
+ ".woff": "dataurl",
35
+ ".eot": "dataurl",
36
+ ".otf": "dataurl",
37
+ ".ttf": "dataurl"
38
+ },
39
+ logLevel: "warning",
40
+ plugins: [{
41
+ name: "external",
42
+ setup(build) {
43
+ build.onResolve({
44
+ filter: /@tamagui\/core/
45
+ }, args => ({
46
+ path: platform === "native" ? "@tamagui/core/native" : "@tamagui/core",
47
+ external: !0
48
+ })), build.onResolve({
49
+ filter: /react-native\/package.json$/
50
+ }, args => ({
51
+ path: "react-native/package.json",
52
+ external: !0
53
+ })), build.onResolve({
54
+ filter: /@tamagui\/web/
55
+ }, args => ({
56
+ path: platform === "native" ? "@tamagui/core/native" : "@tamagui/core",
57
+ external: !0
58
+ })), build.onResolve({
59
+ filter: /^(react-native|react-native\/.*)$/
60
+ }, args => ({
61
+ path: "react-native-web-lite",
62
+ external: !0
63
+ })), build.onResolve({
64
+ filter: /react-native-reanimated/
65
+ }, args => ({
66
+ path: "react-native-reanimated",
67
+ external: !0
68
+ }));
69
+ }
70
+ }, esbuildAliasPlugin({
71
+ ...aliases
72
+ })],
73
+ ...options
74
+ };
75
+ }
76
+ async function bundle(props, platform, aliases) {
77
+ await asyncLock(props);
78
+ const config = getESBuildConfig(props, platform, aliases);
79
+ return esbuild.build(config);
80
+ }
81
+ async function asyncLock(props) {
82
+ const lockFile = join(dirname(props.outfile), basename(props.outfile, ".lock")),
83
+ lockStat = await stat(lockFile).catch(() => {});
84
+ if ((lockStat ? /* @__PURE__ */new Date().getTime() - new Date(lockStat.mtime).getTime() : 1 / 0) < 500) {
85
+ process.env.DEBUG?.startsWith("tamagui") && console.info("Waiting for existing build", props.entryPoints);
86
+ let tries = 5;
87
+ for (; tries--;) {
88
+ if (await pathExists(props.outfile)) return;
89
+ await new Promise(res => setTimeout(res, 50));
90
+ }
91
+ }
92
+ writeFile(lockFile, "");
93
+ }
94
+ export { bundle };
@@ -0,0 +1,263 @@
1
+ import { readFileSync } from "fs";
2
+ import { basename, dirname, extname, join, relative, sep } from "path";
3
+ import generate from "@babel/generator";
4
+ import traverse from "@babel/traverse";
5
+ import * as t from "@babel/types";
6
+ import { Color, colorLog } from "@tamagui/cli-color";
7
+ import esbuild from "esbuild";
8
+ import { ensureDir, removeSync, writeFileSync } from "fs-extra";
9
+ import { registerRequire, setRequireResult } from "../registerRequire.mjs";
10
+ import { babelParse } from "./babelParse.mjs";
11
+ import { bundle } from "./bundle.mjs";
12
+ import { getTamaguiConfigPathFromOptionsConfig } from "./getTamaguiConfigPathFromOptionsConfig.mjs";
13
+ const external = ["@tamagui/core", "@tamagui/web", "react", "react-dom", "react-native-svg"],
14
+ esbuildExtraOptions = {
15
+ define: {
16
+ __DEV__: `${process.env.NODE_ENV === "development"}`
17
+ }
18
+ },
19
+ esbuildOptions = {
20
+ target: "es2018",
21
+ format: "cjs",
22
+ jsx: "automatic",
23
+ platform: "node",
24
+ ...esbuildExtraOptions
25
+ };
26
+ let currentBundle = null,
27
+ isBundling = !1,
28
+ lastBundle = null;
29
+ const waitForBundle = /* @__PURE__ */new Set();
30
+ function hasBundledConfigChanged() {
31
+ return lastBundle === currentBundle ? !1 : (lastBundle = currentBundle, !0);
32
+ }
33
+ async function getBundledConfig(props, rebuild = !1) {
34
+ if (isBundling) await new Promise(res => {
35
+ waitForBundle.add(res);
36
+ });else if (!currentBundle || rebuild) return await bundleConfig(props);
37
+ return currentBundle;
38
+ }
39
+ async function bundleConfig(props) {
40
+ try {
41
+ isBundling = !0;
42
+ const configEntry = props.config ? getTamaguiConfigPathFromOptionsConfig(props.config) : "",
43
+ tmpDir = join(process.cwd(), ".tamagui"),
44
+ configOutPath = join(tmpDir, "tamagui.config.cjs"),
45
+ baseComponents = props.components.filter(x => x !== "@tamagui/core"),
46
+ componentOutPaths = baseComponents.map(componentModule => join(tmpDir, `${componentModule.split(sep).join("-").replace(/[^a-z0-9]+/gi, "")}-components.config.cjs`));
47
+ if (process.env.NODE_ENV === "development" && process.env.DEBUG?.startsWith("tamagui") && console.info("Building config entry", configEntry), !props.disableInitialBuild) {
48
+ try {
49
+ await ensureDir(tmpDir);
50
+ } catch {}
51
+ const start = Date.now();
52
+ await Promise.all([props.config ? bundle({
53
+ entryPoints: [configEntry],
54
+ external,
55
+ outfile: configOutPath,
56
+ target: "node16",
57
+ ...esbuildExtraOptions
58
+ }, props.platform) : null, ...baseComponents.map((componentModule, i) => bundle({
59
+ entryPoints: [componentModule],
60
+ resolvePlatformSpecificEntries: !0,
61
+ external,
62
+ outfile: componentOutPaths[i],
63
+ target: "node16",
64
+ ...esbuildExtraOptions
65
+ }, props.platform))]), colorLog(Color.FgYellow, `
66
+ \u27A1 [tamagui] built config and components (${Date.now() - start}ms):`), colorLog(Color.Dim, `
67
+ Config .${sep}${relative(process.cwd(), configOutPath)}
68
+ Components ${[...componentOutPaths.map(p => `.${sep}${relative(process.cwd(), p)}`)].join(`
69
+ `)}
70
+ `);
71
+ }
72
+ let out;
73
+ const {
74
+ unregister
75
+ } = registerRequire(props.platform);
76
+ try {
77
+ out = require(configOutPath);
78
+ } catch (err) {
79
+ throw err;
80
+ } finally {
81
+ unregister();
82
+ }
83
+ let config = out.default || out || out.config;
84
+ if (config && config.config && !config.tokens && (config = config.config), !config) throw new Error(`No config: ${config}`);
85
+ let components = loadComponents({
86
+ ...props,
87
+ components: componentOutPaths
88
+ });
89
+ if (!components) throw new Error(`No components found: ${componentOutPaths.join(", ")}`);
90
+ for (const component of components) component.moduleName = baseComponents[componentOutPaths.indexOf(component.moduleName)] || component.moduleName, component.moduleName || (process.env.DEBUG?.includes("tamagui") || process.env.IS_TAMAGUI_DEV) && console.warn(`\u26A0\uFE0F no module name found: ${component.moduleName} ${JSON.stringify(baseComponents)} in ${JSON.stringify(componentOutPaths)}`);
91
+ process.env.NODE_ENV === "development" && process.env.DEBUG?.startsWith("tamagui") && console.info("Loaded components", components);
92
+ const res = {
93
+ components,
94
+ nameToPaths: {},
95
+ tamaguiConfig: config
96
+ };
97
+ return currentBundle = res, res;
98
+ } catch (err) {
99
+ console.error(`Error bundling tamagui config: ${err?.message} (run with DEBUG=tamagui to see stack)`), process.env.DEBUG?.includes("tamagui") && console.error(err.stack);
100
+ } finally {
101
+ isBundling = !1, waitForBundle.forEach(cb => cb()), waitForBundle.clear();
102
+ }
103
+ }
104
+ function loadComponents(props, forceExports = !1) {
105
+ const coreComponents = getCoreComponents(props),
106
+ otherComponents = loadComponentsInner(props, forceExports);
107
+ return [...coreComponents, ...(otherComponents || [])];
108
+ }
109
+ function getCoreComponents(props) {
110
+ const loaded = loadComponentsInner({
111
+ ...props,
112
+ components: ["@tamagui/core"]
113
+ });
114
+ if (!loaded) throw new Error("Core should always load");
115
+ return [{
116
+ ...loaded[0],
117
+ moduleName: "@tamagui/core"
118
+ }];
119
+ }
120
+ function loadComponentsInner(props, forceExports = !1) {
121
+ const componentsModules = props.components,
122
+ key = componentsModules.join("");
123
+ if (!forceExports && cacheComponents[key]) return cacheComponents[key];
124
+ const {
125
+ unregister
126
+ } = registerRequire(props.platform, {
127
+ proxyWormImports: forceExports
128
+ });
129
+ try {
130
+ const info = componentsModules.flatMap(name => {
131
+ const isDynamic = !!extname(name) && forceExports,
132
+ fileContents = isDynamic ? readFileSync(name, "utf-8") : "",
133
+ loadModule = isDynamic ? join(dirname(name), `.tamagui-dynamic-eval-${basename(name)}.tsx`) : name;
134
+ let writtenContents = fileContents,
135
+ didBabel = !1;
136
+ function attemptLoad({
137
+ forceExports: forceExports2 = !1
138
+ } = {}) {
139
+ isDynamic && (writtenContents = forceExports2 ? transformAddExports(babelParse(esbuildit(fileContents, "modern"), name)) : fileContents, writeFileSync(loadModule, writtenContents), esbuild.buildSync({
140
+ ...esbuildOptions,
141
+ entryPoints: [loadModule],
142
+ outfile: loadModule,
143
+ alias: {
144
+ "react-native": require.resolve("react-native-web-lite")
145
+ },
146
+ bundle: !0,
147
+ packages: "external",
148
+ allowOverwrite: !0,
149
+ // logLevel: 'silent',
150
+ sourcemap: !1,
151
+ loader: {
152
+ ".png": "dataurl",
153
+ ".jpg": "dataurl",
154
+ ".jpeg": "dataurl",
155
+ ".gif": "dataurl"
156
+ }
157
+ })), process.env.DEBUG === "tamagui" && console.info("loadModule", loadModule, require.resolve(loadModule));
158
+ const moduleResult = require(loadModule);
159
+ forceExports2 || setRequireResult(name, moduleResult);
160
+ const nameToInfo = getComponentStaticConfigByName(name, interopDefaultExport(moduleResult));
161
+ return {
162
+ moduleName: name,
163
+ nameToInfo
164
+ };
165
+ }
166
+ const dispose = () => {
167
+ isDynamic && removeSync(loadModule);
168
+ };
169
+ try {
170
+ const res = attemptLoad({
171
+ forceExports: !0
172
+ });
173
+ return didBabel = !0, res;
174
+ } catch (err) {
175
+ console.info("babel err", err, writtenContents), writtenContents = fileContents, process.env.DEBUG?.startsWith("tamagui") && console.info("Error parsing babel likely", err);
176
+ } finally {
177
+ dispose();
178
+ }
179
+ try {
180
+ return attemptLoad({
181
+ forceExports: !1
182
+ });
183
+ } catch (err) {
184
+ return process.env.TAMAGUI_ENABLE_WARN_DYNAMIC_LOAD && (console.info(`
185
+
186
+ Tamagui attempted but failed to dynamically optimize components in:
187
+ ${name}
188
+ `), console.info(err), console.info(`At: ${loadModule}`, `
189
+ didBabel: ${didBabel}`, `
190
+ In:`, writtenContents, `
191
+ isDynamic: `, isDynamic)), [];
192
+ } finally {
193
+ dispose();
194
+ }
195
+ });
196
+ return cacheComponents[key] = info, info;
197
+ } catch (err) {
198
+ return console.info("Tamagui error bundling components", err.message, err.stack), null;
199
+ } finally {
200
+ unregister();
201
+ }
202
+ }
203
+ const esbuildit = (src, target) => esbuild.transformSync(src, {
204
+ ...esbuildOptions,
205
+ ...(target === "modern" && {
206
+ target: "es2022",
207
+ jsx: "automatic",
208
+ loader: "tsx",
209
+ platform: "neutral",
210
+ format: "esm"
211
+ })
212
+ }).code;
213
+ function getComponentStaticConfigByName(name, exported) {
214
+ const components = {};
215
+ try {
216
+ if (!exported || typeof exported != "object" || Array.isArray(exported)) throw new Error(`Invalid export from package ${name}: ${typeof exported}`);
217
+ for (const key in exported) {
218
+ const found = getTamaguiComponent(key, exported[key]);
219
+ if (found) {
220
+ const {
221
+ Component,
222
+ ...sc
223
+ } = found.staticConfig;
224
+ components[key] = {
225
+ staticConfig: sc
226
+ };
227
+ }
228
+ }
229
+ } catch (err) {
230
+ process.env.TAMAGUI_ENABLE_WARN_DYNAMIC_LOAD && (console.error(`Tamagui failed getting components from ${name} (Disable error by setting environment variable TAMAGUI_ENABLE_WARN_DYNAMIC_LOAD=1)`), console.error(err));
231
+ }
232
+ return components;
233
+ }
234
+ function getTamaguiComponent(name, Component) {
235
+ if (name[0].toUpperCase() !== name[0]) return;
236
+ if (Component?.staticConfig) return Component;
237
+ }
238
+ function interopDefaultExport(mod) {
239
+ return mod?.default ?? mod;
240
+ }
241
+ const cacheComponents = {};
242
+ function transformAddExports(ast) {
243
+ const usedNames = /* @__PURE__ */new Set();
244
+ return traverse(ast, {
245
+ ExportNamedDeclaration(nodePath) {
246
+ if (nodePath.node.specifiers) for (const spec of nodePath.node.specifiers) usedNames.add(t.isIdentifier(spec.exported) ? spec.exported.name : spec.exported.value);
247
+ }
248
+ }), traverse(ast, {
249
+ VariableDeclaration(nodePath) {
250
+ if (!t.isProgram(nodePath.parent)) return;
251
+ const decs = nodePath.node.declarations;
252
+ if (decs.length > 1) return;
253
+ const [dec] = decs;
254
+ t.isIdentifier(dec.id) && dec.init && (usedNames.has(dec.id.name) || (usedNames.add(dec.id.name), nodePath.replaceWith(t.exportNamedDeclaration(t.variableDeclaration("let", [dec]), [t.exportSpecifier(t.identifier(dec.id.name), t.identifier(dec.id.name))]))));
255
+ }
256
+ }), generate(ast, {
257
+ concise: !1,
258
+ filename: "test.tsx",
259
+ retainLines: !1,
260
+ sourceMaps: !1
261
+ }).code;
262
+ }
263
+ export { bundleConfig, esbuildOptions, getBundledConfig, hasBundledConfigChanged, loadComponents, loadComponentsInner };
@@ -0,0 +1,34 @@
1
+ import vm from "vm";
2
+ import generate from "@babel/generator";
3
+ import * as t from "@babel/types";
4
+ import esbuild from "esbuild";
5
+ import { FAILED_EVAL } from "../constants.mjs";
6
+ import { evaluateAstNode } from "./evaluateAstNode.mjs";
7
+ function createEvaluator({
8
+ props,
9
+ staticNamespace,
10
+ sourcePath,
11
+ traversePath,
12
+ shouldPrintDebug
13
+ }) {
14
+ const evalFn = n => {
15
+ if (t.isIdentifier(n) && typeof staticNamespace[n.name] < "u") return staticNamespace[n.name];
16
+ const evalContext = vm.createContext(staticNamespace),
17
+ codeWithTypescriptAnnotations = `(${generate(n).code})`,
18
+ code = esbuild.transformSync(codeWithTypescriptAnnotations, {
19
+ loader: "tsx"
20
+ }).code.replace(/;\n$/, "");
21
+ return shouldPrintDebug && console.info("evaluating", code), vm.runInContext(code, evalContext);
22
+ };
23
+ return n => evaluateAstNode(n, evalFn);
24
+ }
25
+ function createSafeEvaluator(attemptEval) {
26
+ return n => {
27
+ try {
28
+ return attemptEval(n);
29
+ } catch {
30
+ return FAILED_EVAL;
31
+ }
32
+ };
33
+ }
34
+ export { createEvaluator, createSafeEvaluator };