@hanzogui/static 2.0.0

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 (207) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/dist/check-dep-versions.cjs +267 -0
  4. package/dist/checkDeps.cjs +200 -0
  5. package/dist/constants.cjs +49 -0
  6. package/dist/exports.cjs +44 -0
  7. package/dist/extractor/accessSafe.cjs +46 -0
  8. package/dist/extractor/babelParse.cjs +54 -0
  9. package/dist/extractor/buildClassName.cjs +62 -0
  10. package/dist/extractor/bundle.cjs +185 -0
  11. package/dist/extractor/bundleConfig.cjs +513 -0
  12. package/dist/extractor/concatClassName.cjs +80 -0
  13. package/dist/extractor/createEvaluator.cjs +75 -0
  14. package/dist/extractor/createExtractor.cjs +1150 -0
  15. package/dist/extractor/createLogger.cjs +45 -0
  16. package/dist/extractor/detectModuleFormat.cjs +49 -0
  17. package/dist/extractor/ensureImportingConcat.cjs +48 -0
  18. package/dist/extractor/errors.cjs +26 -0
  19. package/dist/extractor/esbuildAliasPlugin.cjs +44 -0
  20. package/dist/extractor/esbuildTsconfigPaths.cjs +86 -0
  21. package/dist/extractor/evaluateAstNode.cjs +83 -0
  22. package/dist/extractor/extractHelpers.cjs +119 -0
  23. package/dist/extractor/extractMediaStyle.cjs +128 -0
  24. package/dist/extractor/extractToClassNames.cjs +321 -0
  25. package/dist/extractor/extractToNative.cjs +266 -0
  26. package/dist/extractor/findTopmostFunction.cjs +34 -0
  27. package/dist/extractor/generatedUid.cjs +47 -0
  28. package/dist/extractor/getGuiConfigPathFromOptionsConfig.cjs +35 -0
  29. package/dist/extractor/getPrefixLogs.cjs +29 -0
  30. package/dist/extractor/getPropValueFromAttributes.cjs +67 -0
  31. package/dist/extractor/getSourceModule.cjs +64 -0
  32. package/dist/extractor/getStaticBindingsForScope.cjs +150 -0
  33. package/dist/extractor/hoistClassNames.cjs +62 -0
  34. package/dist/extractor/literalToAst.cjs +84 -0
  35. package/dist/extractor/loadFile.cjs +11 -0
  36. package/dist/extractor/loadGui.cjs +322 -0
  37. package/dist/extractor/logLines.cjs +35 -0
  38. package/dist/extractor/normalizeTernaries.cjs +73 -0
  39. package/dist/extractor/propsToFontFamilyCache.cjs +38 -0
  40. package/dist/extractor/regenerateConfig.cjs +150 -0
  41. package/dist/extractor/removeUnusedHooks.cjs +76 -0
  42. package/dist/extractor/timer.cjs +43 -0
  43. package/dist/extractor/validHTMLAttributes.cjs +77 -0
  44. package/dist/extractor/watchGuiConfig.cjs +58 -0
  45. package/dist/getPragmaOptions.cjs +58 -0
  46. package/dist/helpers/memoize.cjs +37 -0
  47. package/dist/helpers/requireGuiCore.cjs +33 -0
  48. package/dist/index.cjs +40 -0
  49. package/dist/registerRequire.cjs +115 -0
  50. package/dist/server.cjs +75 -0
  51. package/dist/setup.cjs +0 -0
  52. package/dist/types.cjs +16 -0
  53. package/dist/worker.cjs +89 -0
  54. package/package.json +101 -0
  55. package/src/check-dep-versions.ts +738 -0
  56. package/src/checkDeps.ts +371 -0
  57. package/src/constants.ts +14 -0
  58. package/src/exports.ts +15 -0
  59. package/src/extractor/accessSafe.ts +22 -0
  60. package/src/extractor/babelParse.ts +37 -0
  61. package/src/extractor/buildClassName.ts +76 -0
  62. package/src/extractor/bundle.ts +277 -0
  63. package/src/extractor/bundleConfig.ts +958 -0
  64. package/src/extractor/concatClassName.ts +105 -0
  65. package/src/extractor/createEvaluator.ts +82 -0
  66. package/src/extractor/createExtractor.ts +2665 -0
  67. package/src/extractor/createLogger.ts +41 -0
  68. package/src/extractor/detectModuleFormat.ts +42 -0
  69. package/src/extractor/ensureImportingConcat.ts +36 -0
  70. package/src/extractor/errors.ts +1 -0
  71. package/src/extractor/esbuildAliasPlugin.ts +40 -0
  72. package/src/extractor/esbuildTsconfigPaths.ts +103 -0
  73. package/src/extractor/evaluateAstNode.ts +136 -0
  74. package/src/extractor/extractHelpers.ts +211 -0
  75. package/src/extractor/extractMediaStyle.ts +194 -0
  76. package/src/extractor/extractToClassNames.ts +631 -0
  77. package/src/extractor/extractToNative.ts +463 -0
  78. package/src/extractor/findTopmostFunction.ts +24 -0
  79. package/src/extractor/generatedUid.ts +41 -0
  80. package/src/extractor/getGuiConfigPathFromOptionsConfig.ts +24 -0
  81. package/src/extractor/getPrefixLogs.ts +9 -0
  82. package/src/extractor/getPropValueFromAttributes.ts +95 -0
  83. package/src/extractor/getSourceModule.ts +96 -0
  84. package/src/extractor/getStaticBindingsForScope.ts +237 -0
  85. package/src/extractor/hoistClassNames.ts +52 -0
  86. package/src/extractor/literalToAst.ts +85 -0
  87. package/src/extractor/loadFile.ts +17 -0
  88. package/src/extractor/loadGui.ts +487 -0
  89. package/src/extractor/logLines.ts +16 -0
  90. package/src/extractor/normalizeTernaries.ts +75 -0
  91. package/src/extractor/propsToFontFamilyCache.ts +18 -0
  92. package/src/extractor/regenerateConfig.ts +186 -0
  93. package/src/extractor/removeUnusedHooks.ts +83 -0
  94. package/src/extractor/timer.ts +25 -0
  95. package/src/extractor/validHTMLAttributes.ts +52 -0
  96. package/src/extractor/watchGuiConfig.ts +57 -0
  97. package/src/getPragmaOptions.ts +57 -0
  98. package/src/helpers/memoize.ts +24 -0
  99. package/src/helpers/requireGuiCore.ts +28 -0
  100. package/src/index.ts +4 -0
  101. package/src/registerRequire.ts +236 -0
  102. package/src/server.ts +43 -0
  103. package/src/setup.ts +0 -0
  104. package/src/types.ts +109 -0
  105. package/src/worker.ts +142 -0
  106. package/types/check-dep-versions.d.ts +37 -0
  107. package/types/check-dep-versions.d.ts.map +1 -0
  108. package/types/checkDeps.d.ts +19 -0
  109. package/types/checkDeps.d.ts.map +1 -0
  110. package/types/constants.d.ts +6 -0
  111. package/types/constants.d.ts.map +1 -0
  112. package/types/exports.d.ts +16 -0
  113. package/types/exports.d.ts.map +1 -0
  114. package/types/extractor/accessSafe.d.ts +3 -0
  115. package/types/extractor/accessSafe.d.ts.map +1 -0
  116. package/types/extractor/babelParse.d.ts +5 -0
  117. package/types/extractor/babelParse.d.ts.map +1 -0
  118. package/types/extractor/buildClassName.d.ts +7 -0
  119. package/types/extractor/buildClassName.d.ts.map +1 -0
  120. package/types/extractor/bundle.d.ts +121 -0
  121. package/types/extractor/bundle.d.ts.map +1 -0
  122. package/types/extractor/bundleConfig.d.ts +49 -0
  123. package/types/extractor/bundleConfig.d.ts.map +1 -0
  124. package/types/extractor/concatClassName.d.ts +8 -0
  125. package/types/extractor/concatClassName.d.ts.map +1 -0
  126. package/types/extractor/createEvaluator.d.ts +12 -0
  127. package/types/extractor/createEvaluator.d.ts.map +1 -0
  128. package/types/extractor/createExtractor.d.ts +32 -0
  129. package/types/extractor/createExtractor.d.ts.map +1 -0
  130. package/types/extractor/createLogger.d.ts +3 -0
  131. package/types/extractor/createLogger.d.ts.map +1 -0
  132. package/types/extractor/detectModuleFormat.d.ts +5 -0
  133. package/types/extractor/detectModuleFormat.d.ts.map +1 -0
  134. package/types/extractor/ensureImportingConcat.d.ts +4 -0
  135. package/types/extractor/ensureImportingConcat.d.ts.map +1 -0
  136. package/types/extractor/errors.d.ts +3 -0
  137. package/types/extractor/errors.d.ts.map +1 -0
  138. package/types/extractor/esbuildAliasPlugin.d.ts +18 -0
  139. package/types/extractor/esbuildAliasPlugin.d.ts.map +1 -0
  140. package/types/extractor/esbuildTsconfigPaths.d.ts +11 -0
  141. package/types/extractor/esbuildTsconfigPaths.d.ts.map +1 -0
  142. package/types/extractor/evaluateAstNode.d.ts +3 -0
  143. package/types/extractor/evaluateAstNode.d.ts.map +1 -0
  144. package/types/extractor/extractHelpers.d.ts +28 -0
  145. package/types/extractor/extractHelpers.d.ts.map +1 -0
  146. package/types/extractor/extractMediaStyle.d.ts +11 -0
  147. package/types/extractor/extractMediaStyle.d.ts.map +1 -0
  148. package/types/extractor/extractToClassNames.d.ts +25 -0
  149. package/types/extractor/extractToClassNames.d.ts.map +1 -0
  150. package/types/extractor/extractToNative.d.ts +13 -0
  151. package/types/extractor/extractToNative.d.ts.map +1 -0
  152. package/types/extractor/findTopmostFunction.d.ts +4 -0
  153. package/types/extractor/findTopmostFunction.d.ts.map +1 -0
  154. package/types/extractor/generatedUid.d.ts +5 -0
  155. package/types/extractor/generatedUid.d.ts.map +1 -0
  156. package/types/extractor/getGuiConfigPathFromOptionsConfig.d.ts +3 -0
  157. package/types/extractor/getGuiConfigPathFromOptionsConfig.d.ts.map +1 -0
  158. package/types/extractor/getPrefixLogs.d.ts +3 -0
  159. package/types/extractor/getPrefixLogs.d.ts.map +1 -0
  160. package/types/extractor/getPropValueFromAttributes.d.ts +19 -0
  161. package/types/extractor/getPropValueFromAttributes.d.ts.map +1 -0
  162. package/types/extractor/getSourceModule.d.ts +16 -0
  163. package/types/extractor/getSourceModule.d.ts.map +1 -0
  164. package/types/extractor/getStaticBindingsForScope.d.ts +5 -0
  165. package/types/extractor/getStaticBindingsForScope.d.ts.map +1 -0
  166. package/types/extractor/hoistClassNames.d.ts +6 -0
  167. package/types/extractor/hoistClassNames.d.ts.map +1 -0
  168. package/types/extractor/literalToAst.d.ts +4 -0
  169. package/types/extractor/literalToAst.d.ts.map +1 -0
  170. package/types/extractor/loadFile.d.ts +1 -0
  171. package/types/extractor/loadFile.d.ts.map +1 -0
  172. package/types/extractor/loadGui.d.ts +22 -0
  173. package/types/extractor/loadGui.d.ts.map +1 -0
  174. package/types/extractor/logLines.d.ts +2 -0
  175. package/types/extractor/logLines.d.ts.map +1 -0
  176. package/types/extractor/normalizeTernaries.d.ts +3 -0
  177. package/types/extractor/normalizeTernaries.d.ts.map +1 -0
  178. package/types/extractor/propsToFontFamilyCache.d.ts +4 -0
  179. package/types/extractor/propsToFontFamilyCache.d.ts.map +1 -0
  180. package/types/extractor/regenerateConfig.d.ts +9 -0
  181. package/types/extractor/regenerateConfig.d.ts.map +1 -0
  182. package/types/extractor/removeUnusedHooks.d.ts +3 -0
  183. package/types/extractor/removeUnusedHooks.d.ts.map +1 -0
  184. package/types/extractor/timer.d.ts +5 -0
  185. package/types/extractor/timer.d.ts.map +1 -0
  186. package/types/extractor/validHTMLAttributes.d.ts +52 -0
  187. package/types/extractor/validHTMLAttributes.d.ts.map +1 -0
  188. package/types/extractor/watchGuiConfig.d.ts +5 -0
  189. package/types/extractor/watchGuiConfig.d.ts.map +1 -0
  190. package/types/getPragmaOptions.d.ts +8 -0
  191. package/types/getPragmaOptions.d.ts.map +1 -0
  192. package/types/helpers/memoize.d.ts +8 -0
  193. package/types/helpers/memoize.d.ts.map +1 -0
  194. package/types/helpers/requireGuiCore.d.ts +3 -0
  195. package/types/helpers/requireGuiCore.d.ts.map +1 -0
  196. package/types/index.d.ts +4 -0
  197. package/types/index.d.ts.map +1 -0
  198. package/types/registerRequire.d.ts +10 -0
  199. package/types/registerRequire.d.ts.map +1 -0
  200. package/types/server.d.ts +3 -0
  201. package/types/server.d.ts.map +1 -0
  202. package/types/setup.d.ts +1 -0
  203. package/types/setup.d.ts.map +1 -0
  204. package/types/types.d.ts +92 -0
  205. package/types/types.d.ts.map +1 -0
  206. package/types/worker.d.ts +46 -0
  207. package/types/worker.d.ts.map +1 -0
@@ -0,0 +1,277 @@
1
+ import { readFileSync } from 'node:fs'
2
+ import esbuild from 'esbuild'
3
+ import * as FS from 'fs-extra'
4
+ import type { GuiPlatform } from '../types'
5
+ import { detectModuleFormat } from './detectModuleFormat'
6
+ import { esbuildAliasPlugin } from './esbuildAliasPlugin'
7
+ import { resolveWebOrNativeSpecificEntry } from './loadGui'
8
+ import { TsconfigPathsPlugin } from './esbuildTsconfigPaths'
9
+
10
+ export const esbuildLoaderConfig = {
11
+ '.js': 'jsx',
12
+ '.png': 'dataurl',
13
+ '.jpg': 'dataurl',
14
+ '.jpeg': 'dataurl',
15
+ '.svg': 'dataurl',
16
+ '.gif': 'dataurl',
17
+ '.webp': 'dataurl',
18
+ '.woff2': 'dataurl',
19
+ '.woff': 'dataurl',
20
+ '.eot': 'dataurl',
21
+ '.otf': 'dataurl',
22
+ '.ttf': 'dataurl',
23
+ '.mp4': 'file',
24
+ '.mpeg4': 'file',
25
+ '.mov': 'file',
26
+ '.avif': 'file',
27
+ '.wmv': 'file',
28
+ '.webm': 'file',
29
+ '.wav': 'file',
30
+ '.aac': 'file',
31
+ '.ogg': 'file',
32
+ '.flac': 'file',
33
+ '.node': 'empty',
34
+ } as const
35
+
36
+ const dataExtensions = Object.keys(esbuildLoaderConfig)
37
+ .filter(
38
+ (k) => esbuildLoaderConfig[k] === 'file' || esbuildLoaderConfig[k] === 'dataurl'
39
+ )
40
+ .map((k) => k.slice(1))
41
+
42
+ export const esbuildIgnoreFilesRegex = new RegExp(`.(${dataExtensions.join('|')})$`, 'i')
43
+
44
+ /**
45
+ * For internal loading of new files
46
+ */
47
+
48
+ type Props = Omit<Partial<esbuild.BuildOptions>, 'entryPoints'> & {
49
+ outfile: string
50
+ entryPoints: string[]
51
+ resolvePlatformSpecificEntries?: boolean
52
+ }
53
+
54
+ function getESBuildConfig(
55
+ { entryPoints, resolvePlatformSpecificEntries, ...options }: Props,
56
+ platform: GuiPlatform,
57
+ aliases?: Record<string, string>
58
+ ) {
59
+ if (process.env.DEBUG?.startsWith('@hanzo/gui')) {
60
+ console.info(`Building`, entryPoints)
61
+ }
62
+
63
+ const resolvedEntryPoints = !resolvePlatformSpecificEntries
64
+ ? entryPoints
65
+ : entryPoints.map(resolveWebOrNativeSpecificEntry)
66
+
67
+ // detect format from entry points if not explicitly provided by caller
68
+ const detectedFormat = options.format || detectEntryFormat(resolvedEntryPoints[0])
69
+
70
+ const res: esbuild.BuildOptions = {
71
+ bundle: true,
72
+ entryPoints: resolvedEntryPoints,
73
+ format: detectedFormat,
74
+ // for ESM: prefer "module" field for resolution, add require() shim for bundled CJS deps
75
+ ...(detectedFormat === 'esm'
76
+ ? {
77
+ mainFields: ['module', 'main'],
78
+ banner: {
79
+ js: 'import { createRequire as __cr } from "module"; const require = __cr(import.meta.url);',
80
+ },
81
+ }
82
+ : {}),
83
+ target: 'node24',
84
+ jsx: 'transform',
85
+ jsxFactory: 'react',
86
+ allowOverwrite: true,
87
+ keepNames: true,
88
+ resolveExtensions: [
89
+ ...(process.env.HANZO_GUI_TARGET === 'web'
90
+ ? ['.web.tsx', '.web.ts', '.web.jsx', '.web.js']
91
+ : ['.native.tsx', '.native.ts', '.native.jsx', '.native.js']),
92
+ '.tsx',
93
+ '.ts',
94
+ '.jsx',
95
+ '.js',
96
+ ],
97
+ platform: 'node',
98
+ tsconfigRaw: {
99
+ compilerOptions: {
100
+ jsx: 'react-jsx',
101
+ },
102
+ },
103
+ loader: esbuildLoaderConfig,
104
+ logLevel: 'warning',
105
+ plugins: [
106
+ TsconfigPathsPlugin(),
107
+
108
+ // handle ESM-only features that can't be used with CJS output
109
+ {
110
+ name: 'handle-esm-features',
111
+ setup(build) {
112
+ // only apply transforms for CJS output - ESM supports these natively
113
+ const isCjs =
114
+ build.initialOptions.format === 'cjs' || !build.initialOptions.format
115
+
116
+ build.onLoad({ filter: /\.(ts|tsx|js|jsx|mjs)$/ }, (args) => {
117
+ // skip if ESM output - import.meta and top-level await work natively
118
+ if (!isCjs) {
119
+ return null
120
+ }
121
+
122
+ // skip most node_modules
123
+ if (args.path.includes('node_modules') && !args.path.includes('@gui')) {
124
+ return null
125
+ }
126
+
127
+ let contents = readFileSync(args.path, 'utf8')
128
+ let modified = false
129
+
130
+ // transform import.meta.env -> process.env (Vite-style env vars)
131
+ if (contents.includes('import.meta.env')) {
132
+ contents = contents.replace(/import\.meta\.env/g, 'process.env')
133
+ modified = true
134
+ }
135
+
136
+ // transform import.meta.url -> "" (not needed for static extraction)
137
+ if (contents.includes('import.meta.url')) {
138
+ contents = contents.replace(/import\.meta\.url/g, '""')
139
+ modified = true
140
+ }
141
+
142
+ // transform import.meta.main -> false
143
+ if (contents.includes('import.meta.main')) {
144
+ contents = contents.replace(/import\.meta\.main/g, 'false')
145
+ modified = true
146
+ }
147
+
148
+ // stub files with top-level await - they're typically runtime-only
149
+ if (
150
+ /^\s*(?:const|let|var|export)\s+[^=]*=\s*await\b/m.test(contents) ||
151
+ /^await\s/m.test(contents)
152
+ ) {
153
+ if (process.env.DEBUG?.startsWith('@hanzo/gui')) {
154
+ console.info(`[hanzo-gui] stubbing file with top-level await: ${args.path}`)
155
+ }
156
+ return {
157
+ contents: `// stubbed - contains top-level await\nmodule.exports = {}`,
158
+ loader: 'js',
159
+ }
160
+ }
161
+
162
+ if (modified) {
163
+ return {
164
+ contents,
165
+ loader: args.path.endsWith('.tsx')
166
+ ? 'tsx'
167
+ : args.path.endsWith('.ts')
168
+ ? 'ts'
169
+ : args.path.endsWith('.jsx')
170
+ ? 'jsx'
171
+ : 'js',
172
+ }
173
+ }
174
+
175
+ return null
176
+ })
177
+ },
178
+ },
179
+
180
+ {
181
+ name: 'external',
182
+ setup(build) {
183
+ const proxyWormPath = require.resolve('@hanzogui/proxy-worm')
184
+
185
+ // only externalize @hanzogui/core and @hanzogui/web - these are provided at runtime
186
+ // other @hanzogui/* packages (like @hanzogui/config/v3) must be bundled in to avoid
187
+ // ESM race conditions when multiple threads require() them concurrently
188
+ build.onResolve({ filter: /^@gui\/(core|web)$/ }, (args) => {
189
+ if (args.kind === 'entry-point') {
190
+ return null
191
+ }
192
+ return {
193
+ path: platform === 'native' ? '@hanzogui/core/native' : args.path,
194
+ external: true,
195
+ }
196
+ })
197
+
198
+ build.onResolve({ filter: /react-native\/package.json$/ }, () => {
199
+ return {
200
+ path: 'react-native/package.json',
201
+ external: true,
202
+ }
203
+ })
204
+
205
+ build.onResolve({ filter: /^(react-native|react-native\/.*)$/ }, () => {
206
+ return {
207
+ path: '@hanzogui/react-native-web-lite',
208
+ external: true,
209
+ }
210
+ })
211
+
212
+ build.onResolve({ filter: /^react-native-reanimated(?:\/.*)?$/ }, () => {
213
+ return {
214
+ path: proxyWormPath,
215
+ }
216
+ })
217
+
218
+ build.onResolve({ filter: /^react-native-worklets(?:\/.*)?$/ }, () => {
219
+ return {
220
+ path: proxyWormPath,
221
+ }
222
+ })
223
+
224
+ // externalize animation libraries - not needed for static extraction
225
+ build.onResolve({ filter: /^(framer-motion|motion)/ }, (args) => {
226
+ return {
227
+ path: args.path,
228
+ external: true,
229
+ }
230
+ })
231
+ },
232
+ },
233
+ esbuildAliasPlugin({
234
+ ...aliases,
235
+ }),
236
+ ],
237
+ ...options,
238
+ }
239
+
240
+ return res
241
+ }
242
+
243
+ function detectEntryFormat(entryPoint: string): esbuild.BuildOptions['format'] {
244
+ // file path - detect from file/package.json
245
+ if (entryPoint.startsWith('/') || entryPoint.startsWith('.')) {
246
+ return detectModuleFormat(entryPoint)
247
+ }
248
+ // bare module specifier - check package.json type field
249
+ try {
250
+ const pkgJsonPath = require.resolve(entryPoint + '/package.json')
251
+ const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'))
252
+ return pkg.type === 'module' ? 'esm' : 'cjs'
253
+ } catch {
254
+ return 'cjs'
255
+ }
256
+ }
257
+
258
+ export async function esbundleGuiConfig(
259
+ props: Props,
260
+ platform: GuiPlatform,
261
+ aliases?: Record<string, string>
262
+ ) {
263
+ const config = getESBuildConfig(props, platform, aliases)
264
+
265
+ // build to memory first, then write atomically (temp file + rename)
266
+ // to prevent other threads from reading partially-written files
267
+ const tmpFile = props.outfile + '.tmp.' + process.pid
268
+ const result = await esbuild.build({
269
+ ...config,
270
+ outfile: tmpFile,
271
+ })
272
+
273
+ // atomic rename prevents other threads from reading partial files
274
+ await FS.rename(tmpFile, props.outfile)
275
+
276
+ return result
277
+ }