tungsten 0.3.1 → 0.3.3

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 (291) hide show
  1. package/dist/.build-complete +1 -0
  2. package/dist/Components.d.ts +2 -1
  3. package/dist/Components.d.ts.map +1 -1
  4. package/dist/Components.js +10 -1
  5. package/dist/DomRegion.js +1 -1
  6. package/dist/Framework.d.ts +2 -0
  7. package/dist/Framework.d.ts.map +1 -1
  8. package/dist/Framework.js +68 -57
  9. package/dist/FrameworkConfig.d.ts +6 -0
  10. package/dist/FrameworkConfig.d.ts.map +1 -1
  11. package/dist/FunctionComponentStandIn.d.ts +2 -0
  12. package/dist/FunctionComponentStandIn.d.ts.map +1 -1
  13. package/dist/FunctionComponentStandIn.js +10 -1
  14. package/dist/Instance/Instance.d.ts.map +1 -1
  15. package/dist/Instance/Instance.js +18 -1
  16. package/dist/Instance/InstanceConfig.d.ts +1 -0
  17. package/dist/Instance/InstanceConfig.d.ts.map +1 -1
  18. package/dist/PopMessage.type.d.ts +6 -0
  19. package/dist/PopMessage.type.d.ts.map +1 -0
  20. package/dist/PopMessage.type.js +1 -0
  21. package/dist/Servers/DevServer.d.ts +4 -0
  22. package/dist/Servers/DevServer.d.ts.map +1 -1
  23. package/dist/Servers/DevServer.js +116 -13
  24. package/dist/Servers/MatchedRouteInfo.d.ts +1 -1
  25. package/dist/Servers/MatchedRouteInfo.d.ts.map +1 -1
  26. package/dist/Servers/ProdServer.d.ts +1 -0
  27. package/dist/Servers/ProdServer.d.ts.map +1 -1
  28. package/dist/Servers/ProdServer.js +79 -5
  29. package/dist/Servers/devErrorPageAutoRetry.d.ts +4 -0
  30. package/dist/Servers/devErrorPageAutoRetry.d.ts.map +1 -0
  31. package/dist/Servers/devErrorPageAutoRetry.js +26 -0
  32. package/dist/Servers/hono/DevServerHono.js +25 -29
  33. package/dist/Servers/hono/ProdServerHono.js +49 -142
  34. package/dist/Servers/hono/TungstenServerHono.d.ts +1 -1
  35. package/dist/Servers/hono/TungstenServerHono.d.ts.map +1 -1
  36. package/dist/Servers/hono/TungstenServerHono.js +12 -29
  37. package/dist/Servers/routing.d.ts.map +1 -1
  38. package/dist/Servers/routing.js +10 -6
  39. package/dist/Servers/tungstenCorePrivateEnvSchema.d.ts +0 -3
  40. package/dist/Servers/tungstenCorePrivateEnvSchema.d.ts.map +1 -1
  41. package/dist/Servers/tungstenCorePrivateEnvSchema.js +3 -3
  42. package/dist/Servers/tungstenCorePublicEnvSchema.d.ts +8 -0
  43. package/dist/Servers/tungstenCorePublicEnvSchema.d.ts.map +1 -0
  44. package/dist/Servers/tungstenCorePublicEnvSchema.js +14 -0
  45. package/dist/Store/InternalStoreSchema.d.ts +2 -0
  46. package/dist/Store/InternalStoreSchema.d.ts.map +1 -1
  47. package/dist/Store/InternalStoreSchema.js +1 -0
  48. package/dist/api/Request.d.ts +1 -1
  49. package/dist/api/Request.d.ts.map +1 -1
  50. package/dist/api/Response.d.ts +1 -1
  51. package/dist/api/Response.d.ts.map +1 -1
  52. package/dist/api/getExport.d.ts.map +1 -1
  53. package/dist/api/getExport.js +2 -1
  54. package/dist/babelPlugins/BabelAddDevCacheBust.d.ts +11 -0
  55. package/dist/babelPlugins/BabelAddDevCacheBust.d.ts.map +1 -0
  56. package/dist/babelPlugins/BabelAddDevCacheBust.js +68 -0
  57. package/dist/babelPlugins/BabelTypes.d.ts +2 -2
  58. package/dist/babelPlugins/BabelTypes.d.ts.map +1 -1
  59. package/dist/babelPlugins/BabelTypes.js +0 -1
  60. package/dist/bin/commands/build.d.ts.map +1 -1
  61. package/dist/bin/commands/build.js +3 -0
  62. package/dist/bin/commands/dev.d.ts.map +1 -1
  63. package/dist/bin/commands/dev.js +16 -3
  64. package/dist/bin/commands/devmon.d.ts +2 -0
  65. package/dist/bin/commands/devmon.d.ts.map +1 -0
  66. package/dist/bin/commands/devmon.js +66 -0
  67. package/dist/bin/index.d.ts.map +1 -1
  68. package/dist/bin/index.js +6 -0
  69. package/dist/booleanAttributeValue.d.ts +21 -0
  70. package/dist/booleanAttributeValue.d.ts.map +1 -0
  71. package/dist/booleanAttributeValue.js +23 -0
  72. package/dist/build/compileJavascript.js +1 -1
  73. package/dist/build/compileUserApp.d.ts +2 -1
  74. package/dist/build/compileUserApp.d.ts.map +1 -1
  75. package/dist/build/compileUserApp.js +10 -9
  76. package/dist/build/createInstanceConfigFile.js +1 -1
  77. package/dist/build/makeBabelUserDevConfig.d.ts.map +1 -1
  78. package/dist/build/makeBabelUserDevConfig.js +6 -1
  79. package/dist/compat/types.d.ts +1 -1
  80. package/dist/compat/types.d.ts.map +1 -1
  81. package/dist/components/PopMessages.d.ts +12 -0
  82. package/dist/components/PopMessages.d.ts.map +1 -0
  83. package/dist/components/PopMessages.js +45 -0
  84. package/dist/defaultConfig.d.ts +3 -0
  85. package/dist/defaultConfig.d.ts.map +1 -1
  86. package/dist/defaultConfig.js +4 -1
  87. package/dist/env/Interfaces.d.ts +2 -1
  88. package/dist/env/Interfaces.d.ts.map +1 -1
  89. package/dist/env/getEnvSchemas.d.ts +1 -1
  90. package/dist/env/getEnvSchemas.d.ts.map +1 -1
  91. package/dist/env/getEnvSchemas.js +2 -1
  92. package/dist/env/publicEnv.d.ts.map +1 -1
  93. package/dist/env/publicEnv.js +4 -1
  94. package/dist/frameworkConfigSchema.d.ts +4 -0
  95. package/dist/frameworkConfigSchema.d.ts.map +1 -1
  96. package/dist/frameworkConfigSchema.js +2 -1
  97. package/dist/getComponent.d.ts.map +1 -1
  98. package/dist/getComponent.js +2 -1
  99. package/dist/getRoutes.d.ts.map +1 -1
  100. package/dist/getRoutes.js +2 -1
  101. package/dist/hmr/applyHmrModule.d.ts +11 -0
  102. package/dist/hmr/applyHmrModule.d.ts.map +1 -0
  103. package/dist/hmr/applyHmrModule.js +78 -0
  104. package/dist/hmr/componentIdentity.d.ts +9 -0
  105. package/dist/hmr/componentIdentity.d.ts.map +1 -0
  106. package/dist/hmr/componentIdentity.js +17 -0
  107. package/dist/hmr/instanceRegistry.d.ts +4 -0
  108. package/dist/hmr/instanceRegistry.d.ts.map +1 -0
  109. package/dist/hmr/instanceRegistry.js +6 -0
  110. package/dist/hmr/liveReloadHub.d.ts +10 -0
  111. package/dist/hmr/liveReloadHub.d.ts.map +1 -0
  112. package/dist/{dev → hmr}/liveReloadHub.js +8 -2
  113. package/dist/hmr/refreshStylesheets.d.ts +2 -0
  114. package/dist/hmr/refreshStylesheets.d.ts.map +1 -0
  115. package/dist/hmr/refreshStylesheets.js +26 -0
  116. package/dist/hooks/index.d.ts +1 -0
  117. package/dist/hooks/index.d.ts.map +1 -1
  118. package/dist/hooks/index.js +1 -0
  119. package/dist/hooks/useInstance.d.ts +3 -0
  120. package/dist/hooks/useInstance.d.ts.map +1 -0
  121. package/dist/hooks/useInstance.js +4 -0
  122. package/dist/hydrate/hydrate.d.ts +10 -0
  123. package/dist/hydrate/hydrate.d.ts.map +1 -1
  124. package/dist/hydrate/hydrate.js +81 -19
  125. package/dist/hydrate/reconcileHydratedAttributes.d.ts.map +1 -1
  126. package/dist/hydrate/reconcileHydratedAttributes.js +14 -5
  127. package/dist/hydrate/renderHydrationMismatchBanner.d.ts +7 -0
  128. package/dist/hydrate/renderHydrationMismatchBanner.d.ts.map +1 -0
  129. package/dist/hydrate/renderHydrationMismatchBanner.js +69 -0
  130. package/dist/importDevModuleWithRetry.d.ts +3 -0
  131. package/dist/importDevModuleWithRetry.d.ts.map +1 -0
  132. package/dist/importDevModuleWithRetry.js +46 -0
  133. package/dist/indexInner.d.ts +8 -0
  134. package/dist/indexInner.d.ts.map +1 -1
  135. package/dist/indexInner.js +7 -1
  136. package/dist/makeInstanceConfigFromFrameworkConfig.d.ts.map +1 -1
  137. package/dist/makeInstanceConfigFromFrameworkConfig.js +2 -1
  138. package/dist/pop.d.ts +10 -0
  139. package/dist/pop.d.ts.map +1 -0
  140. package/dist/pop.js +49 -0
  141. package/dist/rawHtml/filterContentNode.d.ts +20 -0
  142. package/dist/rawHtml/filterContentNode.d.ts.map +1 -0
  143. package/dist/rawHtml/filterContentNode.js +96 -0
  144. package/dist/rawHtml/parseHtml.d.ts +14 -0
  145. package/dist/rawHtml/parseHtml.d.ts.map +1 -1
  146. package/dist/rawHtml/parseHtml.js +4 -4
  147. package/dist/rawHtml/sanitizeHtml.d.ts +17 -0
  148. package/dist/rawHtml/sanitizeHtml.d.ts.map +1 -0
  149. package/dist/rawHtml/sanitizeHtml.js +19 -0
  150. package/dist/render/HeadData.d.ts +2 -0
  151. package/dist/render/HeadData.d.ts.map +1 -1
  152. package/dist/render/contentNodeToHtml.d.ts +18 -0
  153. package/dist/render/contentNodeToHtml.d.ts.map +1 -0
  154. package/dist/render/contentNodeToHtml.js +66 -0
  155. package/dist/render/contentToHtml.d.ts.map +1 -1
  156. package/dist/render/contentToHtml.js +3 -1
  157. package/dist/render/processHead.d.ts.map +1 -1
  158. package/dist/render/processHead.js +53 -6
  159. package/dist/render/renderingTreeToHtml.d.ts.map +1 -1
  160. package/dist/render/renderingTreeToHtml.js +8 -1
  161. package/dist/routing/ErrorRouteType.d.ts +6 -0
  162. package/dist/routing/ErrorRouteType.d.ts.map +1 -0
  163. package/dist/routing/ErrorRouteType.js +1 -0
  164. package/dist/routing/RouteTypes.d.ts +2 -1
  165. package/dist/routing/RouteTypes.d.ts.map +1 -1
  166. package/dist/routing/Routes.d.ts +5 -0
  167. package/dist/routing/Routes.d.ts.map +1 -1
  168. package/dist/routing/TungstenErrorInfo.d.ts +6 -0
  169. package/dist/routing/TungstenErrorInfo.d.ts.map +1 -0
  170. package/dist/routing/TungstenErrorInfo.js +6 -0
  171. package/dist/style/styleContentSxy.js +21 -0
  172. package/dist/testing/hydrateTestApp.d.ts +38 -0
  173. package/dist/testing/hydrateTestApp.d.ts.map +1 -0
  174. package/dist/testing/hydrateTestApp.js +242 -0
  175. package/dist/testing/index.d.ts +4 -3
  176. package/dist/testing/index.d.ts.map +1 -1
  177. package/dist/testing/index.js +16 -2
  178. package/dist/timeProfiler.d.ts +6 -0
  179. package/dist/timeProfiler.d.ts.map +1 -0
  180. package/dist/timeProfiler.js +31 -0
  181. package/dist/update/integrateUpdateVdom.d.ts +16 -1
  182. package/dist/update/integrateUpdateVdom.d.ts.map +1 -1
  183. package/dist/update/integrateUpdateVdom.js +116 -7
  184. package/dist/warnOnFrameworkChange.d.ts +2 -0
  185. package/dist/warnOnFrameworkChange.d.ts.map +1 -0
  186. package/dist/warnOnFrameworkChange.js +27 -0
  187. package/package.json +18 -16
  188. package/dist/Instance/gotoRedirect.sxyt.d.ts +0 -2
  189. package/dist/Instance/gotoRedirect.sxyt.d.ts.map +0 -1
  190. package/dist/Instance/gotoRedirect.sxyt.js +0 -148
  191. package/dist/Instance/runTrackedWork.sxyt.d.ts +0 -2
  192. package/dist/Instance/runTrackedWork.sxyt.d.ts.map +0 -1
  193. package/dist/Instance/runTrackedWork.sxyt.js +0 -35
  194. package/dist/_client/cjsHelpers.sxyt.d.ts +0 -2
  195. package/dist/_client/cjsHelpers.sxyt.d.ts.map +0 -1
  196. package/dist/_client/cjsHelpers.sxyt.js +0 -45
  197. package/dist/auth/passwordHashing.sxyt.d.ts +0 -2
  198. package/dist/auth/passwordHashing.sxyt.d.ts.map +0 -1
  199. package/dist/auth/passwordHashing.sxyt.js +0 -46
  200. package/dist/auth/ref/checkPasswordResetToken.sxyt.d.ts +0 -2
  201. package/dist/auth/ref/checkPasswordResetToken.sxyt.d.ts.map +0 -1
  202. package/dist/auth/ref/checkPasswordResetToken.sxyt.js +0 -40
  203. package/dist/auth/ref/createPasswordResetToken.sxyt.d.ts +0 -2
  204. package/dist/auth/ref/createPasswordResetToken.sxyt.d.ts.map +0 -1
  205. package/dist/auth/ref/createPasswordResetToken.sxyt.js +0 -10
  206. package/dist/babelPlugins/fixImportsInSassErrorMessage.sxyt.d.ts +0 -2
  207. package/dist/babelPlugins/fixImportsInSassErrorMessage.sxyt.d.ts.map +0 -1
  208. package/dist/babelPlugins/fixImportsInSassErrorMessage.sxyt.js +0 -108
  209. package/dist/babelPlugins/transformPackageImports/resolveBareImport.sxyt.d.ts +0 -2
  210. package/dist/babelPlugins/transformPackageImports/resolveBareImport.sxyt.d.ts.map +0 -1
  211. package/dist/babelPlugins/transformPackageImports/resolveBareImport.sxyt.js +0 -104
  212. package/dist/bin/commands/compile.sxyt.d.ts +0 -2
  213. package/dist/bin/commands/compile.sxyt.d.ts.map +0 -1
  214. package/dist/bin/commands/compile.sxyt.js +0 -255
  215. package/dist/build/modifySassImports.sxyt.d.ts +0 -2
  216. package/dist/build/modifySassImports.sxyt.d.ts.map +0 -1
  217. package/dist/build/modifySassImports.sxyt.js +0 -55
  218. package/dist/build/sassImportParser.sxyt.d.ts +0 -2
  219. package/dist/build/sassImportParser.sxyt.d.ts.map +0 -1
  220. package/dist/build/sassImportParser.sxyt.js +0 -110
  221. package/dist/build/scssImportParserChatgpt.sxyt.d.ts +0 -2
  222. package/dist/build/scssImportParserChatgpt.sxyt.d.ts.map +0 -1
  223. package/dist/build/scssImportParserChatgpt.sxyt.js +0 -120
  224. package/dist/clone.sxyt.d.ts +0 -2
  225. package/dist/clone.sxyt.d.ts.map +0 -1
  226. package/dist/clone.sxyt.js +0 -24
  227. package/dist/componentProxyHandlers.sxyt.d.ts +0 -2
  228. package/dist/componentProxyHandlers.sxyt.d.ts.map +0 -1
  229. package/dist/componentProxyHandlers.sxyt.js +0 -130
  230. package/dist/components/RawHtml.sxyt.d.ts +0 -2
  231. package/dist/components/RawHtml.sxyt.d.ts.map +0 -1
  232. package/dist/components/RawHtml.sxyt.js +0 -104
  233. package/dist/components/bindable/BindableSelect.sxyt.d.ts +0 -2
  234. package/dist/components/bindable/BindableSelect.sxyt.d.ts.map +0 -1
  235. package/dist/components/bindable/BindableSelect.sxyt.js +0 -186
  236. package/dist/dev/liveReloadHub.d.ts +0 -6
  237. package/dist/dev/liveReloadHub.d.ts.map +0 -1
  238. package/dist/env/injectEnv.sxyt.d.ts +0 -2
  239. package/dist/env/injectEnv.sxyt.d.ts.map +0 -1
  240. package/dist/env/injectEnv.sxyt.js +0 -20
  241. package/dist/env/parseEnv.sxyt.d.ts +0 -2
  242. package/dist/env/parseEnv.sxyt.d.ts.map +0 -1
  243. package/dist/env/parseEnv.sxyt.js +0 -11
  244. package/dist/findProjectDir.sxyt.d.ts +0 -2
  245. package/dist/findProjectDir.sxyt.d.ts.map +0 -1
  246. package/dist/findProjectDir.sxyt.js +0 -82
  247. package/dist/hydrate/reconcileHydratedAttributes.sxyt.d.ts +0 -2
  248. package/dist/hydrate/reconcileHydratedAttributes.sxyt.d.ts.map +0 -1
  249. package/dist/hydrate/reconcileHydratedAttributes.sxyt.js +0 -173
  250. package/dist/innerHtmlFromProps.sxyt.d.ts +0 -2
  251. package/dist/innerHtmlFromProps.sxyt.d.ts.map +0 -1
  252. package/dist/innerHtmlFromProps.sxyt.js +0 -99
  253. package/dist/postcssPlugins/parseSelectors.sxyt.d.ts +0 -2
  254. package/dist/postcssPlugins/parseSelectors.sxyt.d.ts.map +0 -1
  255. package/dist/postcssPlugins/parseSelectors.sxyt.js +0 -62
  256. package/dist/postcssPlugins/parseSelectorsRich.sxyt.d.ts +0 -2
  257. package/dist/postcssPlugins/parseSelectorsRich.sxyt.d.ts.map +0 -1
  258. package/dist/postcssPlugins/parseSelectorsRich.sxyt.js +0 -155
  259. package/dist/rawHtml/parseHtml.sxyt.d.ts +0 -2
  260. package/dist/rawHtml/parseHtml.sxyt.d.ts.map +0 -1
  261. package/dist/rawHtml/parseHtml.sxyt.js +0 -239
  262. package/dist/render/getFunctionBodyAsString.sxyt.d.ts +0 -2
  263. package/dist/render/getFunctionBodyAsString.sxyt.d.ts.map +0 -1
  264. package/dist/render/getFunctionBodyAsString.sxyt.js +0 -37
  265. package/dist/render/processProps.sxyt.d.ts +0 -2
  266. package/dist/render/processProps.sxyt.d.ts.map +0 -1
  267. package/dist/render/processProps.sxyt.js +0 -90
  268. package/dist/routing/compareRequestToRegex.sxyt.d.ts +0 -2
  269. package/dist/routing/compareRequestToRegex.sxyt.d.ts.map +0 -1
  270. package/dist/routing/compareRequestToRegex.sxyt.js +0 -65
  271. package/dist/routing/getPathPriority.sxyt.d.ts +0 -2
  272. package/dist/routing/getPathPriority.sxyt.d.ts.map +0 -1
  273. package/dist/routing/getPathPriority.sxyt.js +0 -24
  274. package/dist/routing/matchPath.sxyt.d.ts +0 -2
  275. package/dist/routing/matchPath.sxyt.d.ts.map +0 -1
  276. package/dist/routing/matchPath.sxyt.js +0 -41
  277. package/dist/routing/patternToRegex.sxyt.d.ts +0 -2
  278. package/dist/routing/patternToRegex.sxyt.d.ts.map +0 -1
  279. package/dist/routing/patternToRegex.sxyt.js +0 -69
  280. package/dist/routing/splitRequest.sxyt.d.ts +0 -2
  281. package/dist/routing/splitRequest.sxyt.d.ts.map +0 -1
  282. package/dist/routing/splitRequest.sxyt.js +0 -47
  283. package/dist/style/jssToCss.sxyt.d.ts +0 -2
  284. package/dist/style/jssToCss.sxyt.d.ts.map +0 -1
  285. package/dist/style/jssToCss.sxyt.js +0 -17
  286. package/dist/testing/createTestApp.sxyt.d.ts +0 -2
  287. package/dist/testing/createTestApp.sxyt.d.ts.map +0 -1
  288. package/dist/testing/createTestApp.sxyt.js +0 -470
  289. package/dist/testing/ensureTestEnvLoaded.sxyt.d.ts +0 -2
  290. package/dist/testing/ensureTestEnvLoaded.sxyt.d.ts.map +0 -1
  291. package/dist/testing/ensureTestEnvLoaded.sxyt.js +0 -20
@@ -0,0 +1,68 @@
1
+ // BabelAddDevCacheBust
2
+ // exports MakeBabelAddDevCacheBust (function)
3
+ //
4
+ // Dev-only. Appends a `?v=<mtime>` query to every relative import/re-export
5
+ // specifier, versioned off the imported file's own mtime as it sits in
6
+ // codeLocation (the tsc-emitted, pre-final-babel intermediate directory).
7
+ //
8
+ // Without this, the client's HMR reload script only cache-busts the
9
+ // top-level file(s) named in the SSE payload (`?t=<now>`); anything THAT
10
+ // file statically imports by its plain URL still resolves against whatever
11
+ // the browser had cached for that plain URL. On a rename that touches two
12
+ // files in the same edit (e.g. `Button.tsx` renaming an export while
13
+ // `Home.tsx` updates its import of it), the freshly re-fetched `Home.js`'s
14
+ // own static `import ... from '../components/Button.js'` could resolve to a
15
+ // stale cached `Button.js` that doesn't have the new export yet, throwing a
16
+ // genuine browser SyntaxError before HMR ever gets a chance to run - see
17
+ // docs/hmr.md's "stale-module-cache SyntaxError" finding. Stamping every
18
+ // import with the target's current mtime means an edited dependency always
19
+ // gets a URL the browser has never cached, regardless of which file in the
20
+ // chain was named in the SSE event.
21
+ //
22
+ // Must run after BabelTransformJsxExtensionsToJs (registered later in the
23
+ // dev plugin list) so it seess the corrected '.js' specifier - but resolution
24
+ // tries both '.js' and '.jsx' on disk regardless, since codeLocation only
25
+ // ever contains the pre-rename '.jsx' file, so this works whichever order
26
+ // plugins actually end up running in.
27
+ import { dirname, join } from 'path';
28
+ import fs from 'fs';
29
+ function resolveOnDiskMtime(fromDir, specifier) {
30
+ if (!specifier.startsWith('.')) return undefined;
31
+ const candidates = specifier.endsWith('.jsx') ? [specifier, specifier.slice(0, -1)] : specifier.endsWith('.js') ? [specifier, `${specifier.slice(0, -3)}.jsx`] : [];
32
+ for (const candidate of candidates) {
33
+ const abs = join(fromDir, candidate);
34
+ if (fs.existsSync(abs)) return fs.statSync(abs).mtimeMs;
35
+ }
36
+ return undefined;
37
+ }
38
+ function versionedSpecifier(fromDir, specifier) {
39
+ const mtimeMs = resolveOnDiskMtime(fromDir, specifier);
40
+ if (mtimeMs === undefined) return specifier;
41
+ const separator = specifier.includes('?') ? '&' : '?';
42
+ return `${specifier}${separator}v=${mtimeMs}`;
43
+ }
44
+ export function MakeBabelAddDevCacheBust() {
45
+ return function BabelAddDevCacheBust() {
46
+ let fileDir = '';
47
+ return {
48
+ pre(state) {
49
+ const stateFilename = state.opts.filename;
50
+ fileDir = typeof stateFilename === 'string' ? dirname(stateFilename) : '';
51
+ },
52
+ visitor: {
53
+ ImportDeclaration(path) {
54
+ if (fileDir === '') return;
55
+ path.node.source.value = versionedSpecifier(fileDir, path.node.source.value);
56
+ },
57
+ ExportNamedDeclaration(path) {
58
+ if (fileDir === '' || path.node.source == null) return;
59
+ path.node.source.value = versionedSpecifier(fileDir, path.node.source.value);
60
+ },
61
+ ExportAllDeclaration(path) {
62
+ if (fileDir === '') return;
63
+ path.node.source.value = versionedSpecifier(fileDir, path.node.source.value);
64
+ }
65
+ }
66
+ };
67
+ };
68
+ }
@@ -1,6 +1,6 @@
1
1
  import type * as BabelCore from '@babel/core';
2
- export { BabelCore };
3
- export { NodePath, PluginPass } from '@babel/core';
2
+ export type { BabelCore };
3
+ export type { NodePath, PluginPass } from '@babel/core';
4
4
  export type Babel = typeof BabelCore;
5
5
  export * as BabelTypes from '@babel/types';
6
6
  //# sourceMappingURL=BabelTypes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BabelTypes.d.ts","sourceRoot":"","sources":["../../src/babelPlugins/BabelTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,SAAS,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,CAAA;AACpB,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAClD,MAAM,MAAM,KAAK,GAAG,OAAO,SAAS,CAAC;AAErC,OAAO,KAAK,UAAU,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"BabelTypes.d.ts","sourceRoot":"","sources":["../../src/babelPlugins/BabelTypes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,SAAS,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,SAAS,EAAE,CAAA;AACzB,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACvD,MAAM,MAAM,KAAK,GAAG,OAAO,SAAS,CAAC;AAErC,OAAO,KAAK,UAAU,MAAM,cAAc,CAAA"}
@@ -1,3 +1,2 @@
1
- export { NodePath } from '@babel/core';
2
1
  //import type { types as Types } from '@babel/core';
3
2
  export * as BabelTypes from '@babel/types';
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/build.ts"],"names":[],"mappings":"AAyCA,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/build.ts"],"names":[],"mappings":"AA6CA,OAAO,EAAE,CAAA"}
@@ -3,8 +3,11 @@ import chalk from 'chalk-extensions';
3
3
  import { Framework } from "../../Framework.js";
4
4
  import { cliOut, cliNews } from "../../cliOutput.js";
5
5
  import { staticSiteFolder } from "../../settings.js";
6
+ import { createTimeProfiler } from "../../timeProfiler.js";
7
+ const profile = process.argv.slice(3).includes('--profile');
6
8
  //// prep the app
7
9
  const sxyFramework = new Framework();
10
+ sxyFramework.profiler = createTimeProfiler(profile);
8
11
  await sxyFramework.init();
9
12
  await sxyFramework.clean('prod');
10
13
  await sxyFramework.build('prod');
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/dev.ts"],"names":[],"mappings":"AAwCA,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/dev.ts"],"names":[],"mappings":"AAqDA,OAAO,EAAE,CAAA"}
@@ -1,11 +1,17 @@
1
1
  import open from 'open';
2
2
  import { cliOut } from "../../cliOutput.js";
3
3
  import { Framework } from "../../Framework.js";
4
+ import { warnOnFrameworkChange } from "../../warnOnFrameworkChange.js";
5
+ import { createTimeProfiler } from "../../timeProfiler.js";
4
6
  //import dotenv from 'dotenv'
5
7
  //dotenv.config({ path: '.private.env' })
8
+ const args = process.argv.slice(3);
9
+ const boot = !args.includes('--no-boot');
10
+ const profile = args.includes('--profile');
6
11
  cliOut(`Starting dev mode`);
7
12
  //// prep the app
8
13
  const sxyFramework = new Framework();
14
+ sxyFramework.profiler = createTimeProfiler(profile);
9
15
  await sxyFramework.init();
10
16
  //console.log('framework ready')
11
17
  // build for dev
@@ -16,8 +22,15 @@ await sxyFramework.build('dev');
16
22
  // start a dev server
17
23
  const devServer = await sxyFramework.createDevServer();
18
24
  //cliOut('Dev server ready')
19
- const devServerLocation = await devServer.start();
25
+ const devServerLocation = await sxyFramework.profiler.timeProfileAsync('start dev server', () => devServer.start());
26
+ // devmon already restarts this process itself on a framework rebuild, so the warning
27
+ // (which just tells you to restart manually) would be redundant noise under it - see devmon.ts.
28
+ if (sxyFramework.config?.warnOnFrameworkChange && process.env.__TUNGSTEN_DEVMON !== 'true') {
29
+ warnOnFrameworkChange();
30
+ }
20
31
  // do a dummy request to trigger any error immediately during dev
21
32
  //axios.get(sxyFramework.devServer.location)
22
- cliOut('Booting to the dev site in your browser');
23
- open(devServerLocation);
33
+ if (boot) {
34
+ cliOut('Booting to the dev site in your browser');
35
+ open(devServerLocation);
36
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=devmon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devmon.d.ts","sourceRoot":"","sources":["../../../src/bin/commands/devmon.ts"],"names":[],"mappings":"AAqEA,OAAO,EAAE,CAAA"}
@@ -0,0 +1,66 @@
1
+ // Master process for `tungsten dev`: runs it as a child process and watches the same
2
+ // build-notification marker file as warnOnFrameworkChange.ts (dist/.build-complete in the
3
+ // framework package). When a framework rebuild touches it, kills and respawns the dev child
4
+ // instead of just warning that a restart is needed.
5
+ import { spawn } from 'node:child_process';
6
+ import { join } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+ import chokidar from 'chokidar';
9
+ import { cliError } from "../../cliOutput.js";
10
+ import { getFrameworkDir } from "../../getFrameworkDir.js";
11
+ const binIndexPath = fileURLToPath(new URL('../index.js', import.meta.url));
12
+ const initialArgs = process.argv.slice(3);
13
+ // Restarts always force --no-boot (no reopening the browser tab each time), but otherwise
14
+ // keep whatever else devmon itself was passed - e.g. --profile.
15
+ const restartArgs = [...initialArgs.filter(arg => arg !== '--no-boot'), '--no-boot'];
16
+ const buildMarkerPath = join(getFrameworkDir(), 'dist', '.build-complete');
17
+ let child = null;
18
+ let restarting = false;
19
+ function startDev(args) {
20
+ // __TUNGSTEN_DEVMON tells dev.ts to skip warnOnFrameworkChange() - devmon is already
21
+ // restarting it, so that warning would just be confusing noise here.
22
+ child = spawn(process.execPath, [binIndexPath, 'dev', ...args], {
23
+ stdio: 'inherit',
24
+ env: {
25
+ ...process.env,
26
+ __TUNGSTEN_DEVMON: 'true'
27
+ }
28
+ });
29
+ child.on('exit', code => {
30
+ child = null;
31
+ // not one of our own restarts, so the dev process ended on its own (crash, or the
32
+ // user quit it directly) - nothing left for devmon to supervise
33
+ if (!restarting) process.exit(code ?? 0);
34
+ });
35
+ }
36
+ function restartDev() {
37
+ if (restarting) return;
38
+ restarting = true;
39
+ cliError('tungsten framework rebuilt - restarting tungsten dev');
40
+ if (child === null) {
41
+ restarting = false;
42
+ startDev(restartArgs);
43
+ return;
44
+ }
45
+ child.once('exit', () => {
46
+ restarting = false;
47
+ startDev(restartArgs);
48
+ });
49
+ child.kill();
50
+ }
51
+ startDev(initialArgs);
52
+ const watcher = chokidar.watch(buildMarkerPath, {
53
+ ignoreInitial: true,
54
+ awaitWriteFinish: {
55
+ stabilityThreshold: 200,
56
+ pollInterval: 20
57
+ }
58
+ });
59
+ watcher.on('all', restartDev);
60
+ function shutdown() {
61
+ void watcher.close();
62
+ if (child !== null) child.kill();
63
+ process.exit(0);
64
+ }
65
+ process.on('SIGINT', shutdown);
66
+ process.on('SIGTERM', shutdown);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bin/index.ts"],"names":[],"mappings":"AAmDA,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bin/index.ts"],"names":[],"mappings":"AAwDA,OAAO,EAAE,CAAA"}
package/dist/bin/index.js CHANGED
@@ -10,6 +10,12 @@ switch (command) {
10
10
  await import("./commands/dev.js");
11
11
  break;
12
12
  }
13
+ case 'devmon':
14
+ {
15
+ process.env.__TUNGSTEN_ENV = 'development';
16
+ await import("./commands/devmon.js");
17
+ break;
18
+ }
13
19
  case 'build':
14
20
  {
15
21
  process.env.__TUNGSTEN_ENV = 'production';
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The attribute string value for a boolean prop, or `null` when the attribute
3
+ * should be omitted entirely.
4
+ *
5
+ * The general rule is an ordinary HTML boolean attribute - `disabled`,
6
+ * `checked`, `hidden` and the rest: present (conventionally with an empty
7
+ * value) means true, absent means false. `contentEditable` looks like one of
8
+ * these in JSX but is not: `contenteditable` is a three-state enumerated
9
+ * attribute (true/false/inherit) where an absent attribute means *inherit*,
10
+ * not false. Representing `contentEditable={false}` by omitting the
11
+ * attribute therefore does nothing under an editable ancestor - the element
12
+ * silently stays editable. It gets explicit `"true"`/`"false"` strings
13
+ * instead; every other boolean prop keeps the ordinary rule.
14
+ *
15
+ * Shared by every place that turns a boolean prop into HTML - the server
16
+ * renderer, the client create/update paths, hydration's attribute
17
+ * reconciliation, and `contentNodeToHtml()` - so they cannot disagree with
18
+ * each other and produce a false hydration mismatch.
19
+ */
20
+ export declare function booleanAttributeValue(name: string, value: boolean): string | null;
21
+ //# sourceMappingURL=booleanAttributeValue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"booleanAttributeValue.d.ts","sourceRoot":"","sources":["../src/booleanAttributeValue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAGjF"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * The attribute string value for a boolean prop, or `null` when the attribute
3
+ * should be omitted entirely.
4
+ *
5
+ * The general rule is an ordinary HTML boolean attribute - `disabled`,
6
+ * `checked`, `hidden` and the rest: present (conventionally with an empty
7
+ * value) means true, absent means false. `contentEditable` looks like one of
8
+ * these in JSX but is not: `contenteditable` is a three-state enumerated
9
+ * attribute (true/false/inherit) where an absent attribute means *inherit*,
10
+ * not false. Representing `contentEditable={false}` by omitting the
11
+ * attribute therefore does nothing under an editable ancestor - the element
12
+ * silently stays editable. It gets explicit `"true"`/`"false"` strings
13
+ * instead; every other boolean prop keeps the ordinary rule.
14
+ *
15
+ * Shared by every place that turns a boolean prop into HTML - the server
16
+ * renderer, the client create/update paths, hydration's attribute
17
+ * reconciliation, and `contentNodeToHtml()` - so they cannot disagree with
18
+ * each other and produce a false hydration mismatch.
19
+ */
20
+ export function booleanAttributeValue(name, value) {
21
+ if (name.toLowerCase() === 'contenteditable') return value ? 'true' : 'false';
22
+ return value ? '' : null;
23
+ }
@@ -52,7 +52,7 @@ export async function compileJavascript(projectDir, appConfig, codeLocation, sou
52
52
  const pendingExportWipes = new Map();
53
53
  const exportWipeGraceMs = 5000;
54
54
  async function transformFile(file) {
55
- if (options.quiet !== true) console.log('transforming file', file);
55
+ //if (options.quiet !== true) console.log('transforming file', file)
56
56
  try {
57
57
  let rel = file.slice(codeLocationLength);
58
58
  if (rel.endsWith('.jsx')) rel = rel.slice(0, -1);
@@ -1,5 +1,6 @@
1
1
  import type { CompilationInfo } from './CompilationInfo.js';
2
2
  import type { FrameworkConfigComplete } from '../FrameworkConfig.js';
3
3
  import type { Mode } from '../Mode.js';
4
- export declare function compileUserApp(projectDir: string, appConfig: FrameworkConfigComplete, mode: Mode): Promise<CompilationInfo>;
4
+ import { type TimeProfiler } from '../timeProfiler.js';
5
+ export declare function compileUserApp(projectDir: string, appConfig: FrameworkConfigComplete, mode: Mode, profiler?: TimeProfiler): Promise<CompilationInfo>;
5
6
  //# sourceMappingURL=compileUserApp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"compileUserApp.d.ts","sourceRoot":"","sources":["../../src/build/compileUserApp.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAWtC,wBAAsB,cAAc,CAChC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,uBAAuB,EAAE,IAAI,EAAE,IAAI,GACnE,OAAO,CAAC,eAAe,CAAC,CAoD1B"}
1
+ {"version":3,"file":"compileUserApp.d.ts","sourceRoot":"","sources":["../../src/build/compileUserApp.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAQtC,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAI1E,wBAAsB,cAAc,CAChC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,uBAAuB,EAAE,IAAI,EAAE,IAAI,EAClE,QAAQ,GAAE,YAAwC,GACnD,OAAO,CAAC,eAAe,CAAC,CAwD1B"}
@@ -5,9 +5,10 @@ import { copyAssets } from "./copyAssets.js";
5
5
  import { copyPublicFiles } from "./copyPublicFiles.js";
6
6
  import { buildCodeSubPath, bundleFolder, devBuildOuterFolder, prodBuildFolder } from "../settings.js";
7
7
  import { combineComponentCss } from "./combineComponentCss.js";
8
- import { emitReloadEvent } from "../dev/liveReloadHub.js";
8
+ import { emitReloadEvent } from "../hmr/liveReloadHub.js";
9
+ import { createTimeProfiler } from "../timeProfiler.js";
9
10
  //import { compileEnv } from './compileEnv.js'
10
- export async function compileUserApp(projectDir, appConfig, mode) {
11
+ export async function compileUserApp(projectDir, appConfig, mode, profiler = createTimeProfiler(false)) {
11
12
  const codeLocation = join(projectDir, appConfig.codeDir);
12
13
  const relSourceDir = appConfig.sourceDir !== undefined && appConfig.sourceDir !== '' ? appConfig.sourceDir : appConfig.codeDir;
13
14
  const sourceLocation = join(projectDir, relSourceDir);
@@ -15,15 +16,15 @@ export async function compileUserApp(projectDir, appConfig, mode) {
15
16
  const buildLocation = mode === 'dev' ? join(projectDir, devBuildOuterFolder) : join(projectDir, prodBuildFolder);
16
17
  const codeSubPath = buildCodeSubPath;
17
18
  const buildCodeLocation = join(buildLocation, codeSubPath);
18
- const compileJavascriptPromise = compileJavascript(projectDir, appConfig, codeLocation, sourceLocation, styleImportBase, buildLocation, buildCodeLocation, mode, true, mode === 'dev' ? {
19
+ const compileJavascriptPromise = profiler.timeProfileAsync('compile javascript', () => compileJavascript(projectDir, appConfig, codeLocation, sourceLocation, styleImportBase, buildLocation, buildCodeLocation, mode, true, mode === 'dev' ? {
19
20
  onCycleComplete: cycle => {
20
- if (cycle.success) emitReloadEvent('js');
21
+ if (cycle.success) emitReloadEvent('js', cycle.file);
21
22
  }
22
- } : {});
23
+ } : {}));
23
24
  //const compileEnvPromise = compileEnv(projectDir, appConfig, codeLocation, buildLocation, mode)
24
- const compileStylesPromise = compileStyles(projectDir, appConfig, styleImportBase, buildLocation, true, mode === 'dev' ? () => emitReloadEvent('css') : undefined);
25
- const copyAssetsPromise = copyAssets(projectDir, appConfig, buildLocation);
26
- const copyPublicFilesPromise = copyPublicFiles(projectDir, appConfig, buildLocation);
25
+ const compileStylesPromise = profiler.timeProfileAsync('compile styles', () => compileStyles(projectDir, appConfig, styleImportBase, buildLocation, true, mode === 'dev' ? () => emitReloadEvent('css') : undefined));
26
+ const copyAssetsPromise = profiler.timeProfileAsync('copy assets', () => copyAssets(projectDir, appConfig, buildLocation));
27
+ const copyPublicFilesPromise = profiler.timeProfileAsync('copy public files', () => copyPublicFiles(projectDir, appConfig, buildLocation));
27
28
  const {
28
29
  importAliases
29
30
  } = await compileJavascriptPromise;
@@ -31,7 +32,7 @@ export async function compileUserApp(projectDir, appConfig, mode) {
31
32
  await compileStylesPromise;
32
33
  await copyAssetsPromise;
33
34
  await copyPublicFilesPromise;
34
- if (mode === 'prod') await combineComponentCss(buildLocation);
35
+ if (mode === 'prod') await profiler.timeProfileAsync('combine component css', () => combineComponentCss(buildLocation));
35
36
  const compilationInfo = {
36
37
  type: 'success',
37
38
  projectDir,
@@ -20,7 +20,7 @@ export async function createInstanceConfigFile(config, mode, buildLocation) {
20
20
  });
21
21
  await fsPromises.writeFile(appConfigLocation,
22
22
  // to
23
- `export default { prod: ${(mode === 'prod').toString()}, useRootComponent: ${config.useRootComponent.toString()}, siteBasePath: "${siteBasePath}", clientSideNav: ${config.clientSideNav.toString()}, staticSite: ${config.staticSite.toString()} };` // eslint-disable-line max-len
23
+ `export default { prod: ${(mode === 'prod').toString()}, useRootComponent: ${config.useRootComponent.toString()}, siteBasePath: "${siteBasePath}", clientSideNav: ${config.clientSideNav.toString()}, staticSite: ${config.staticSite.toString()}, csr: ${config.csr.toString()} };` // eslint-disable-line max-len
24
24
  );
25
25
  } catch (e) {
26
26
  throw new TungstenError(`createAppConfig() Error: error creating app config file`);
@@ -1 +1 @@
1
- {"version":3,"file":"makeBabelUserDevConfig.d.ts","sourceRoot":"","sources":["../../src/build/makeBabelUserDevConfig.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAKnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,OAAO,EAAoC,eAAe,EAAE,MAAM,iDAAiD,CAAA;AAMnH,wBAAgB,sBAAsB,CAClC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,kBAAkB,EAAE,MAAM,EAC1B,aAAa,EAAE,MAAM,EACrB,iBAAiB,EAAE,MAAM,EACzB,qBAAqB,EAAE,MAAM,EAC7B,2BAA2B,EAAE,WAAW,CAAC,MAAM,CAAC,EAChD,kBAAkB,EAAE,eAAe,EACnC,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,GACzB,gBAAgB,CA4BlB"}
1
+ {"version":3,"file":"makeBabelUserDevConfig.d.ts","sourceRoot":"","sources":["../../src/build/makeBabelUserDevConfig.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAKnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,OAAO,EAAoC,eAAe,EAAE,MAAM,iDAAiD,CAAA;AAOnH,wBAAgB,sBAAsB,CAClC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,kBAAkB,EAAE,MAAM,EAC1B,aAAa,EAAE,MAAM,EACrB,iBAAiB,EAAE,MAAM,EACzB,qBAAqB,EAAE,MAAM,EAC7B,2BAA2B,EAAE,WAAW,CAAC,MAAM,CAAC,EAChD,kBAAkB,EAAE,eAAe,EACnC,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,GACzB,gBAAgB,CAgClB"}
@@ -6,6 +6,7 @@ import { MakeBabelTransformPackageImports } from "../babelPlugins/BabelTransform
6
6
  import { componentCssFolder, componentCssFile } from "../settings.js";
7
7
  import userCommonConfig from "./babel.user.common.config.js";
8
8
  import { MakeBabelTransformCssImports } from "../babelPlugins/BabelTransformCssImports.js";
9
+ import { MakeBabelAddDevCacheBust } from "../babelPlugins/BabelAddDevCacheBust.js";
9
10
  export function makeBabelUserDevConfig(projectDir, absCodeDir, absSourceDir, absStyleImportBase, buildLocation, buildCodeLocation, packagesCacheLocation, skipPackageCompilationFiles, oldDependencyGraph, dependencyGraph, importAliases, promises) {
10
11
  const userDevConfig = objectCopy(userCommonConfig);
11
12
  userDevConfig.plugins.push(MakeBabelTransformPackageImports({
@@ -29,6 +30,10 @@ export function makeBabelUserDevConfig(projectDir, absCodeDir, absSourceDir, abs
29
30
  projectAbsStyleImportDir: absStyleImportBase,
30
31
  classNameFormat: '[folder]-[name]_[local]',
31
32
  cssOutputFile: join(buildLocation, componentCssFolder, componentCssFile)
32
- }));
33
+ }),
34
+ // Dev-only: keeps every relative import's browser-cached URL in sync with the
35
+ // imported file's own on-disk mtime - see BabelAddDevCacheBust.ts and
36
+ // docs/hmr.md's "stale-module-cache SyntaxError" finding.
37
+ MakeBabelAddDevCacheBust());
33
38
  return userDevConfig;
34
39
  }
@@ -1,6 +1,6 @@
1
1
  import { TungstenStatefulComponent } from 'tungsten/Components.jsx';
2
2
  import { ContentNode, ContentNodeElement } from '../ContentNode.js';
3
- export { ContentNode as ReactNode, ContentNodeElement as ReactElement };
3
+ export type { ContentNode as ReactNode, ContentNodeElement as ReactElement };
4
4
  export type PropsWithChildren<P> = P & {
5
5
  children?: ContentNode | undefined;
6
6
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/compat/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,yBAAyB,EAAiC,MAAM,yBAAyB,CAAA;AACzH,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEnE,OAAO,EAAE,WAAW,IAAI,SAAS,EAAE,kBAAkB,IAAI,YAAY,EAAE,CAAA;AAEvE,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CAAE,CAAC;AAwJ9E,KAAK,iBAAiB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAgC9G,OAAO,KAAK,KAAK,SAAS,MAAM,YAAY,CAAA;AAC5C,KAAK,aAAa,CAAC,CAAC,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AACnD,KAAK,iBAAiB,CAAC,CAAC,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAS3D,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,EAAE;IACrC,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAC9D,SAAS,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC7C,YAAY,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/compat/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,yBAAyB,EAAiC,MAAM,yBAAyB,CAAA;AACzH,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEnE,YAAY,EAAE,WAAW,IAAI,SAAS,EAAE,kBAAkB,IAAI,YAAY,EAAE,CAAA;AAE5E,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CAAE,CAAC;AAwJ9E,KAAK,iBAAiB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,yBAAyB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAgC9G,OAAO,KAAK,KAAK,SAAS,MAAM,YAAY,CAAA;AAC5C,KAAK,aAAa,CAAC,CAAC,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AACnD,KAAK,iBAAiB,CAAC,CAAC,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAS3D,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,EAAE;IACrC,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAC9D,SAAS,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAC7C,YAAY,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC"}
@@ -0,0 +1,12 @@
1
+ import { TungstenSimpleInternalStoreComponent } from '../Components.jsx';
2
+ type Props = {
3
+ className?: string;
4
+ messageClassName?: string;
5
+ unstyled?: boolean;
6
+ };
7
+ export declare class PopMessages extends TungstenSimpleInternalStoreComponent<Props> {
8
+ clientInit: () => void;
9
+ content: () => import("../ContentNode.js").ContentNode;
10
+ }
11
+ export {};
12
+ //# sourceMappingURL=PopMessages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PopMessages.d.ts","sourceRoot":"","sources":["../../src/components/PopMessages.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,oCAAoC,EAAE,MAAM,mBAAmB,CAAA;AAGxE,KAAK,KAAK,GAAG;IACT,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAIzB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAkBD,qBAAa,WAAY,SAAQ,oCAAoC,CAAC,KAAK,CAAC;IACxE,UAAU,aAET;IAED,OAAO,gDAsBN;CACJ"}
@@ -0,0 +1,45 @@
1
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
2
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
3
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
4
+ import { combineClassNames } from "../helpers/combineClassNames.js";
5
+ import { TungstenSimpleInternalStoreComponent } from "../Components.js";
6
+ import { dismissPop, registerPopInstance } from "../pop.js";
7
+ import { jsx as _jsx } from "tungsten/jsxRuntime.js";
8
+ const messageCss = 'padding: 0.3rem 0.75rem; font-size: 0.85rem; max-height: 3rem; background: #1f3a5f;' + ' color: #eaf2ff; border-bottom: 1px solid #16283f; text-align: center; cursor: pointer; overflow: hidden;' + ' transition: max-height 0.2s ease, padding 0.2s ease;';
9
+ const leavingCss = 'max-height: 0; padding-top: 0; padding-bottom: 0; border-bottom-width: 0;';
10
+ // An app mounts this once in its Root, above <MatchedRoute />, so it can push
11
+ // the page down rather than overlay it. clientInit wires the pop() bridge -
12
+ // see pop.ts. Carries its own default look via the css prop: a component
13
+ // shipped as a framework dependency can't rely on Tungsten's Sass/style-
14
+ // scoping build step, which only runs over an app's own source and never
15
+ // node_modules (the same exclude pattern BabelTransformRemoveServerBlocks
16
+ // relies on elsewhere - see rollup.user.prod.config.ts). Override the look
17
+ // with className, style the PopMessages component selector from your own
18
+ // Root (which reaches this.props.className the same way Link does), or pass
19
+ // unstyled to drop the built-in css entirely.
20
+ export class PopMessages extends TungstenSimpleInternalStoreComponent {
21
+ constructor(...args) {
22
+ super(...args);
23
+ _defineProperty(this, "clientInit", () => {
24
+ registerPopInstance(this.__instance);
25
+ });
26
+ _defineProperty(this, "content", () => {
27
+ const popMessages = this.store.popMessages.sync();
28
+ if (popMessages.length === 0) return null;
29
+ const {
30
+ className,
31
+ messageClassName,
32
+ unstyled = false
33
+ } = this.props;
34
+ return _jsx("div", {
35
+ className: combineClassNames('pop-messages', className),
36
+ children: popMessages.map(message => _jsx("div", {
37
+ className: combineClassNames('pop-message', message.leaving === true && 'leaving', messageClassName),
38
+ css: unstyled ? undefined : messageCss + (message.leaving === true ? leavingCss : ''),
39
+ onClick: () => dismissPop(message.id),
40
+ children: message.text
41
+ }, message.id))
42
+ });
43
+ });
44
+ }
45
+ }
@@ -15,6 +15,9 @@ export declare const defaultConfig: {
15
15
  apiPath: string;
16
16
  suppressNoHeadWarning: false;
17
17
  suppressOriginMismatchWarning: false;
18
+ warnOnFrameworkChange: true;
19
+ hmr: true;
20
+ csr: false;
18
21
  };
19
22
  export type FrameworkConfigDefault = typeof defaultConfig;
20
23
  //# sourceMappingURL=defaultConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaultConfig.d.ts","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;CAqBS,CAAA;AAEnC,MAAM,MAAM,sBAAsB,GAAG,OAAO,aAAa,CAAA"}
1
+ {"version":3,"file":"defaultConfig.d.ts","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;CAwBS,CAAA;AAEnC,MAAM,MAAM,sBAAsB,GAAG,OAAO,aAAa,CAAA"}
@@ -20,5 +20,8 @@ export const defaultConfig = {
20
20
  apiPath: '/api',
21
21
  //debug: false // moved to env
22
22
  suppressNoHeadWarning: false,
23
- suppressOriginMismatchWarning: false
23
+ suppressOriginMismatchWarning: false,
24
+ warnOnFrameworkChange: true,
25
+ hmr: true,
26
+ csr: false
24
27
  };
@@ -1,8 +1,9 @@
1
1
  import type { TungstenCorePrivateEnv } from '../Servers/tungstenCorePrivateEnvSchema.js';
2
+ import type { TungstenCorePublicEnv } from '../Servers/tungstenCorePublicEnvSchema.js';
2
3
  declare global {
3
4
  interface TungstenPrivateEnv extends TungstenCorePrivateEnv {
4
5
  }
5
- export interface TungstenPublicEnv {
6
+ export interface TungstenPublicEnv extends TungstenCorePublicEnv {
6
7
  }
7
8
  }
8
9
  //# sourceMappingURL=Interfaces.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Interfaces.d.ts","sourceRoot":"","sources":["../../src/env/Interfaces.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAA;AAExF,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,kBAAmB,SAAQ,sBAAsB;KAAG;IAC9D,MAAM,WAAW,iBAAiB;KAAG;CACxC"}
1
+ {"version":3,"file":"Interfaces.d.ts","sourceRoot":"","sources":["../../src/env/Interfaces.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAA;AACxF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAA;AAEtF,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,kBAAmB,SAAQ,sBAAsB;KAAG;IAC9D,MAAM,WAAW,iBAAkB,SAAQ,qBAAqB;KAAG;CACtE"}
@@ -3,7 +3,7 @@ import { ZodType } from 'zod';
3
3
  import { TungstenEnv } from './types.js';
4
4
  export type EnvSchemas = {
5
5
  privateEnvSchema?: ZodType<TungstenEnv & TungstenPrivateEnv>;
6
- publicEnvSchema?: ZodType<TungstenEnv>;
6
+ publicEnvSchema?: ZodType<TungstenEnv & TungstenPublicEnv>;
7
7
  };
8
8
  export declare function getEnvSchemas(config: FrameworkConfigComplete, iteration: number, dev: 'dev'): Promise<EnvSchemas>;
9
9
  export declare function getEnvSchemas(config: FrameworkConfigComplete, iteration?: null, dev?: 'prod'): Promise<EnvSchemas>;
@@ -1 +1 @@
1
- {"version":3,"file":"getEnvSchemas.d.ts","sourceRoot":"","sources":["../../src/env/getEnvSchemas.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAEpE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAI7B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGxC,MAAM,MAAM,UAAU,GAAG;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC,WAAW,GAAG,kBAAkB,CAAC,CAAC;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CAC1C,CAAA;AAKD,wBAAsB,aAAa,CAAC,MAAM,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,GAChG,OAAO,CAAC,UAAU,CAAC,CAAA;AACrB,wBAAsB,aAAa,CAAC,MAAM,EAAE,uBAAuB,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,GACjG,OAAO,CAAC,UAAU,CAAC,CAAA;AAoErB,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,uBAGlF"}
1
+ {"version":3,"file":"getEnvSchemas.d.ts","sourceRoot":"","sources":["../../src/env/getEnvSchemas.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAEpE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,CAAA;AAK7B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAGxC,MAAM,MAAM,UAAU,GAAG;IACrB,gBAAgB,CAAC,EAAE,OAAO,CAAC,WAAW,GAAG,kBAAkB,CAAC,CAAC;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAC,WAAW,GAAG,iBAAiB,CAAC,CAAC;CAC9D,CAAA;AAKD,wBAAsB,aAAa,CAAC,MAAM,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,GAChG,OAAO,CAAC,UAAU,CAAC,CAAA;AACrB,wBAAsB,aAAa,CAAC,MAAM,EAAE,uBAAuB,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,MAAM,GACjG,OAAO,CAAC,UAAU,CAAC,CAAA;AAoErB,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,EAAE,SAAS,EAAE,MAAM,uBAGlF"}
@@ -2,6 +2,7 @@ import { join } from 'path';
2
2
  import { fixExtension } from "../fixExtension.js";
3
3
  import { throwError } from "../throwError.js";
4
4
  import { iterationQueryString } from "../iterationQueryString.js";
5
+ import { importDevModuleWithRetry } from "../importDevModuleWithRetry.js";
5
6
  export async function getEnvSchemas(config, iteration = null, mode = 'prod') {
6
7
  const {
7
8
  envSchemasLocation
@@ -16,7 +17,7 @@ export async function getEnvSchemas(config, iteration = null, mode = 'prod') {
16
17
  if (iteration === null) throwError('getEnvSchemas()', 'iteration is null');
17
18
  //if (!load) throwError('getEnvSchemas()', 'load is null')
18
19
  //module = await load(fullFilePath)
19
- module = await import(iterationQueryString(fullFilePath, iteration));
20
+ module = await importDevModuleWithRetry(iterationQueryString(fullFilePath, iteration));
20
21
  } else {
21
22
  module = await import(fullFilePath);
22
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"publicEnv.d.ts","sourceRoot":"","sources":["../../src/env/publicEnv.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,iBAAiB,GAAG,OAAO,CAG/D"}
1
+ {"version":3,"file":"publicEnv.d.ts","sourceRoot":"","sources":["../../src/env/publicEnv.ts"],"names":[],"mappings":"AAGA,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,iBAAiB,GAAG,OAAO,CAK/D"}
@@ -1,5 +1,8 @@
1
1
  import { throwError } from "../throwError.js";
2
2
  export function publicEnv(key) {
3
- if (tungstenPublicEnv === undefined) throwError('publicEnv', 'Tungsten Public Env is undefined - do you have a .env.public file?');
3
+ if (tungstenPublicEnv === undefined) {
4
+ // eslint-disable-line @typescript-eslint/no-unnecessary-condition
5
+ throwError('publicEnv', 'Tungsten Public Env is undefined - do you have a .env.public file?');
6
+ }
4
7
  return tungstenPublicEnv[key];
5
8
  }
@@ -42,6 +42,7 @@ declare const frameworkConfigWithRootComponentValidator: import("arktype/interna
42
42
  serverMiddleware?: [string, string, string];
43
43
  apiRoutes?: string;
44
44
  apiPath?: string;
45
+ csr?: boolean;
45
46
  rootComponent: string;
46
47
  useRootComponent?: true;
47
48
  }, {}>;
@@ -87,6 +88,7 @@ declare const frameworkConfigWithoutRootComponentValidator: import("arktype/inte
87
88
  serverMiddleware?: [string, string, string];
88
89
  apiRoutes?: string;
89
90
  apiPath?: string;
91
+ csr?: boolean;
90
92
  useRootComponent: false;
91
93
  }, {}>;
92
94
  export declare const frameworkConfigValidator: import("arktype/internal/variants/object.ts").ObjectType<{
@@ -131,6 +133,7 @@ export declare const frameworkConfigValidator: import("arktype/internal/variants
131
133
  serverMiddleware?: [string, string, string];
132
134
  apiRoutes?: string;
133
135
  apiPath?: string;
136
+ csr?: boolean;
134
137
  rootComponent: string;
135
138
  useRootComponent?: true;
136
139
  } | {
@@ -175,6 +178,7 @@ export declare const frameworkConfigValidator: import("arktype/internal/variants
175
178
  serverMiddleware?: [string, string, string];
176
179
  apiRoutes?: string;
177
180
  apiPath?: string;
181
+ csr?: boolean;
178
182
  useRootComponent: false;
179
183
  }, {}>;
180
184
  type ArkFrameworkConfigWithRootComponent = typeof frameworkConfigWithRootComponentValidator.infer;
@@ -1 +1 @@
1
- {"version":3,"file":"frameworkConfigSchema.d.ts","sourceRoot":"","sources":["../src/frameworkConfigSchema.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,IAAI,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAyDnD,QAAA,MAAM,yCAAyC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAK7C,CAAA;AAEF,QAAA,MAAM,4CAA4C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAIhD,CAAA;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAEoB,CAAA;AAEzD,KAAK,mCAAmC,GAAG,OAAO,yCAAyC,CAAC,KAAK,CAAA;AACjG,KAAK,sCAAsC,GAAG,OAAO,4CAA4C,CAAC,KAAK,CAAA;AAIvG,UAAU,gCACN,SAAQ,IAAI,CAAC,mCAAmC,EAAE,cAAc,GAAG,cAAc,CAAC;IAClF,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,CAAC,EAAE,kBAAkB,CAAA;CACpC;AAED,UAAU,mCACN,SAAQ,IAAI,CAAC,sCAAsC,EAAE,cAAc,GAAG,cAAc,CAAC;IACrF,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,CAAC,EAAE,kBAAkB,CAAA;CACpC;AAED,MAAM,MAAM,eAAe,GAAG,gCAAgC,GAAG,mCAAmC,CAAA"}
1
+ {"version":3,"file":"frameworkConfigSchema.d.ts","sourceRoot":"","sources":["../src/frameworkConfigSchema.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,IAAI,kBAAkB,EAAE,MAAM,eAAe,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AA0DnD,QAAA,MAAM,yCAAyC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAK7C,CAAA;AAEF,QAAA,MAAM,4CAA4C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAIhD,CAAA;AAEF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAEoB,CAAA;AAEzD,KAAK,mCAAmC,GAAG,OAAO,yCAAyC,CAAC,KAAK,CAAA;AACjG,KAAK,sCAAsC,GAAG,OAAO,4CAA4C,CAAC,KAAK,CAAA;AAIvG,UAAU,gCACN,SAAQ,IAAI,CAAC,mCAAmC,EAAE,cAAc,GAAG,cAAc,CAAC;IAClF,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,CAAC,EAAE,kBAAkB,CAAA;CACpC;AAED,UAAU,mCACN,SAAQ,IAAI,CAAC,sCAAsC,EAAE,cAAc,GAAG,cAAc,CAAC;IACrF,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,YAAY,CAAC,EAAE,kBAAkB,CAAA;CACpC;AAED,MAAM,MAAM,eAAe,GAAG,gCAAgC,GAAG,mCAAmC,CAAA"}