tungsten 0.4.14 → 0.5.1

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 (171) hide show
  1. package/dist/.build-complete +1 -1
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/Components.d.ts +1 -0
  4. package/dist/Components.d.ts.map +1 -1
  5. package/dist/Components.js +2 -0
  6. package/dist/ContentNode.d.ts +8 -2
  7. package/dist/ContentNode.d.ts.map +1 -1
  8. package/dist/ContentNode.js +4 -1
  9. package/dist/Framework.d.ts.map +1 -1
  10. package/dist/Framework.js +12 -6
  11. package/dist/FrameworkConfig.d.ts +0 -3
  12. package/dist/FrameworkConfig.d.ts.map +1 -1
  13. package/dist/FunctionComponentStandIn.d.ts +1 -1
  14. package/dist/FunctionComponentStandIn.d.ts.map +1 -1
  15. package/dist/FunctionComponentStandIn.js +1 -0
  16. package/dist/Instance/Instance.js +2 -2
  17. package/dist/RenderingNode.d.ts +2 -2
  18. package/dist/RenderingNode.d.ts.map +1 -1
  19. package/dist/Script.d.ts +1 -1
  20. package/dist/Script.d.ts.map +1 -1
  21. package/dist/Servers/DevServer.d.ts.map +1 -1
  22. package/dist/Servers/DevServer.js +10 -0
  23. package/dist/Servers/loadEnvsDev.d.ts.map +1 -1
  24. package/dist/Servers/loadEnvsDev.js +16 -11
  25. package/dist/Servers/routing.d.ts.map +1 -1
  26. package/dist/Servers/routing.js +8 -9
  27. package/dist/Store/makeStore.d.ts +4 -4
  28. package/dist/Store/makeStore.d.ts.map +1 -1
  29. package/dist/Store/makeStore.js +23 -57
  30. package/dist/babelPlugins/BabelTransformDocInit.d.ts +9 -0
  31. package/dist/babelPlugins/BabelTransformDocInit.d.ts.map +1 -0
  32. package/dist/babelPlugins/BabelTransformDocInit.js +201 -0
  33. package/dist/babelPlugins/BabelTransformPackageImports.d.ts.map +1 -1
  34. package/dist/babelPlugins/BabelTransformPackageImports.js +1 -10
  35. package/dist/bin/index.d.ts.map +1 -1
  36. package/dist/bin/index.js +82 -75
  37. package/dist/browserStorage.d.ts +56 -18
  38. package/dist/browserStorage.d.ts.map +1 -1
  39. package/dist/browserStorage.js +172 -102
  40. package/dist/build/bundle.d.ts +1 -1
  41. package/dist/build/bundle.d.ts.map +1 -1
  42. package/dist/build/bundle.js +45 -40
  43. package/dist/build/compileJavascript.d.ts.map +1 -1
  44. package/dist/build/compileJavascript.js +0 -1
  45. package/dist/build/makeBabelUserDevConfig.d.ts.map +1 -1
  46. package/dist/build/makeBabelUserDevConfig.js +5 -1
  47. package/dist/build/makeBabelUserProdConfig.d.ts.map +1 -1
  48. package/dist/build/makeBabelUserProdConfig.js +5 -1
  49. package/dist/cliOutput.d.ts +5 -0
  50. package/dist/cliOutput.d.ts.map +1 -1
  51. package/dist/cliOutput.js +22 -0
  52. package/dist/components/Link.d.ts +1 -1
  53. package/dist/components/Link.d.ts.map +1 -1
  54. package/dist/components/NativeHtml.d.ts +10 -0
  55. package/dist/components/NativeHtml.d.ts.map +1 -0
  56. package/dist/components/NativeHtml.js +12 -0
  57. package/dist/components/PopMessages.d.ts +1 -1
  58. package/dist/components/PopMessages.d.ts.map +1 -1
  59. package/dist/components/Protected.d.ts +10 -0
  60. package/dist/components/Protected.d.ts.map +1 -0
  61. package/dist/components/Protected.js +12 -0
  62. package/dist/components/Stylesheet.d.ts +1 -1
  63. package/dist/components/Stylesheet.d.ts.map +1 -1
  64. package/dist/components/bindable/BindableCheckbox.d.ts +1 -1
  65. package/dist/components/bindable/BindableCheckbox.d.ts.map +1 -1
  66. package/dist/components/bindable/BindableInput.d.ts +1 -1
  67. package/dist/components/bindable/BindableInput.d.ts.map +1 -1
  68. package/dist/components/bindable/BindableInputNonString.d.ts +1 -1
  69. package/dist/components/bindable/BindableInputNonString.d.ts.map +1 -1
  70. package/dist/components/bindable/BindableInputString.d.ts +1 -1
  71. package/dist/components/bindable/BindableInputString.d.ts.map +1 -1
  72. package/dist/components/bindable/BindableInputTyped.d.ts +1 -1
  73. package/dist/components/bindable/BindableInputTyped.d.ts.map +1 -1
  74. package/dist/components/bindable/BindableInputTypedLegacy.d.ts +1 -1
  75. package/dist/components/bindable/BindableInputTypedLegacy.d.ts.map +1 -1
  76. package/dist/components/bindable/BindableRadio.d.ts +1 -1
  77. package/dist/components/bindable/BindableRadio.d.ts.map +1 -1
  78. package/dist/components/bindable/BindableSelect.d.ts +1 -1
  79. package/dist/components/bindable/BindableSelect.d.ts.map +1 -1
  80. package/dist/components/bindable/BindableTextarea.d.ts +1 -1
  81. package/dist/components/bindable/BindableTextarea.d.ts.map +1 -1
  82. package/dist/components/library/RichTextEditor/RichTextEditor.d.ts +1 -1
  83. package/dist/components/library/RichTextEditor/RichTextEditor.d.ts.map +1 -1
  84. package/dist/components/library/RichTextEditor/contentTree.d.ts.map +1 -1
  85. package/dist/components/library/RichTextEditor/contentTree.js +2 -1
  86. package/dist/components/library/__StatefulMessage/StatefulMessage.d.ts +1 -1
  87. package/dist/components/library/__StatefulMessage/StatefulMessage.d.ts.map +1 -1
  88. package/dist/defaultConfig.d.ts.map +1 -1
  89. package/dist/defaultConfig.js +0 -1
  90. package/dist/devBanner.d.ts +4 -0
  91. package/dist/devBanner.d.ts.map +1 -0
  92. package/dist/devBanner.js +50 -0
  93. package/dist/docInit.d.ts +16 -0
  94. package/dist/docInit.d.ts.map +1 -0
  95. package/dist/docInit.js +54 -0
  96. package/dist/env/droppedCoreEnvKeys.d.ts +5 -0
  97. package/dist/env/droppedCoreEnvKeys.d.ts.map +1 -0
  98. package/dist/env/droppedCoreEnvKeys.js +9 -0
  99. package/dist/env/getEnvSchemas.d.ts +1 -1
  100. package/dist/env/getEnvSchemas.d.ts.map +1 -1
  101. package/dist/env/getEnvSchemas.js +21 -22
  102. package/dist/env/registerEnvSchemas.d.ts +13 -0
  103. package/dist/env/registerEnvSchemas.d.ts.map +1 -0
  104. package/dist/env/registerEnvSchemas.js +23 -0
  105. package/dist/frameworkConfigSchema.d.ts +11 -2
  106. package/dist/frameworkConfigSchema.d.ts.map +1 -1
  107. package/dist/frameworkConfigSchema.js +14 -2
  108. package/dist/getUserConfig.d.ts.map +1 -1
  109. package/dist/getUserConfig.js +7 -2
  110. package/dist/headChildren.d.ts +2 -0
  111. package/dist/headChildren.d.ts.map +1 -0
  112. package/dist/headChildren.js +16 -0
  113. package/dist/hydrate/hydrate.d.ts.map +1 -1
  114. package/dist/hydrate/hydrate.js +23 -19
  115. package/dist/hydrate/renderHydrationMismatchBanner.d.ts +1 -0
  116. package/dist/hydrate/renderHydrationMismatchBanner.d.ts.map +1 -1
  117. package/dist/hydrate/renderHydrationMismatchBanner.js +11 -63
  118. package/dist/indexInner.d.ts +5 -1
  119. package/dist/indexInner.d.ts.map +1 -1
  120. package/dist/indexInner.js +5 -1
  121. package/dist/jsxRuntime.d.ts +1 -1
  122. package/dist/jsxRuntime.d.ts.map +1 -1
  123. package/dist/jsxRuntime.js +9 -7
  124. package/dist/jsxRuntimeSignals.d.ts +8 -4
  125. package/dist/jsxRuntimeSignals.d.ts.map +1 -1
  126. package/dist/jsxRuntimeSignals.js +8 -6
  127. package/dist/nbsp.d.ts +2 -2
  128. package/dist/nbsp.d.ts.map +1 -1
  129. package/dist/rawHtml/filterContentNode.d.ts.map +1 -1
  130. package/dist/rawHtml/filterContentNode.js +3 -1
  131. package/dist/render/HeadData.d.ts +1 -0
  132. package/dist/render/HeadData.d.ts.map +1 -1
  133. package/dist/render/addImportMap.d.ts.map +1 -1
  134. package/dist/render/addImportMap.js +1 -0
  135. package/dist/render/contentNodeToHtml.d.ts.map +1 -1
  136. package/dist/render/contentNodeToHtml.js +2 -1
  137. package/dist/render/contentToHtml.d.ts.map +1 -1
  138. package/dist/render/contentToHtml.js +3 -1
  139. package/dist/render/contentTreeToRenderingTree.d.ts.map +1 -1
  140. package/dist/render/contentTreeToRenderingTree.js +5 -1
  141. package/dist/render/processHead.d.ts.map +1 -1
  142. package/dist/render/processHead.js +27 -11
  143. package/dist/render/readDocInitScript.d.ts +3 -0
  144. package/dist/render/readDocInitScript.d.ts.map +1 -0
  145. package/dist/render/readDocInitScript.js +15 -0
  146. package/dist/render/rootToHtmlDev.d.ts.map +1 -1
  147. package/dist/routing/Group.d.ts +1 -1
  148. package/dist/routing/Group.d.ts.map +1 -1
  149. package/dist/routing/MatchedRoute.d.ts +1 -1
  150. package/dist/routing/MatchedRoute.d.ts.map +1 -1
  151. package/dist/settings.d.ts +3 -0
  152. package/dist/settings.d.ts.map +1 -1
  153. package/dist/settings.js +4 -0
  154. package/dist/style/styleContentSxy.d.ts.map +1 -1
  155. package/dist/style/styleContentSxy.js +6 -1
  156. package/dist/testing/installTestDocInit.d.ts +2 -0
  157. package/dist/testing/installTestDocInit.d.ts.map +1 -0
  158. package/dist/testing/installTestDocInit.js +6 -0
  159. package/dist/throwError.d.ts.map +1 -1
  160. package/dist/throwError.js +4 -1
  161. package/dist/update/integrateUpdateVdom.d.ts.map +1 -1
  162. package/dist/update/integrateUpdateVdom.js +42 -4
  163. package/package.json +2 -1
  164. package/readme.md +2 -135
  165. package/types/assets.d.ts +21 -0
  166. package/types/index.d.ts +24 -29
  167. package/types/jsx/html.d.ts +0 -1
  168. package/types/jsx/html.global.d.ts +0 -1
  169. package/types/jsx/html.values.d.ts +0 -1
  170. package/types/jsx/jsx.d.ts +8 -8
  171. package/vendor/manifest.json +2 -2
@@ -11,6 +11,7 @@ export function addImportMap(head, importAliases, clientImportAliases) {
11
11
  head[$props].children.unshift({
12
12
  [$type]: 'script',
13
13
  [$props]: {
14
+ 'data--t-internal': true,
14
15
  type: 'importmap',
15
16
  //noEscape: true,
16
17
  children: [`{
@@ -1 +1 @@
1
- {"version":3,"file":"contentNodeToHtml.d.ts","sourceRoot":"","sources":["../../src/render/contentNodeToHtml.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAapD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CA+C3D"}
1
+ {"version":3,"file":"contentNodeToHtml.d.ts","sourceRoot":"","sources":["../../src/render/contentNodeToHtml.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAapD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAgD3D"}
@@ -1,4 +1,4 @@
1
- import { ContentNodeIsComponent } from '../ContentNode.js';
1
+ import { ContentNodeIsComponent, ContentNodeIsFragment } from '../ContentNode.js';
2
2
  import { booleanAttributeValue } from '../booleanAttributeValue.js';
3
3
  import { $props, $type } from '../contentNodeSymbols.js';
4
4
  import { htmlEntities } from '../htmlEntities.js';
@@ -28,6 +28,7 @@ export function contentNodeToHtml(node) {
28
28
  if (node === undefined || node === null || node === false || node === true) return '';
29
29
  if (Array.isArray(node)) return node.map(contentNodeToHtml).join('');
30
30
  if (typeof node === 'string' || typeof node === 'number') return htmlEntities(node.toString());
31
+ if (ContentNodeIsFragment(node)) return contentNodeToHtml(node[$props].children);
31
32
  if (ContentNodeIsComponent(node)) {
32
33
  throwError('contentNodeToHtml', `component nodes are not supported - encountered one of type ` + `${String(typeof node[$type] === 'string' ? node[$type] : node[$type].name)}.`);
33
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"contentToHtml.d.ts","sourceRoot":"","sources":["../../src/render/contentToHtml.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAY,YAAY,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAIvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAG9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAGrE,wBAAsB,aAAa,CAC/B,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,aAAa,EACpE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EACxC,MAAM,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,YAAY,EACnE,iBAAiB,GAAE,sBAAkC,EAAE,GAAG,UAAQ,GACnE,OAAO,CAAC,MAAM,CAAC,CAuDjB"}
1
+ {"version":3,"file":"contentToHtml.d.ts","sourceRoot":"","sources":["../../src/render/contentToHtml.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAK,EAAY,YAAY,EAAE,MAAM,eAAe,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAIvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAI9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAA;AAGrE,wBAAsB,aAAa,CAC/B,eAAe,EAAE,eAAe,EAAE,mBAAmB,EAAE,aAAa,EACpE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EACxC,MAAM,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,YAAY,EACnE,iBAAiB,GAAE,sBAAkC,EAAE,GAAG,UAAQ,GACnE,OAAO,CAAC,MAAM,CAAC,CAwDjB"}
@@ -2,6 +2,7 @@ import { renderingNodeToHtml } from './renderingTreeToHtml.js';
2
2
  import { TungstenError } from '../TungstenError.js';
3
3
  import { RenderingNodeIsElement } from '../RenderingNode.js';
4
4
  import { contentTreeToRenderingTree } from './contentTreeToRenderingTree.js';
5
+ import { readDocInitScript } from './readDocInitScript.js';
5
6
  import { cliWarn } from 'tungsten/cliOutput.js';
6
7
  export async function contentToHtml(compilationInfo, clientImportAliases, content, instance, config, siteBasePathOverride, tungstenPublicEnv = undefined, dev = false) {
7
8
  // const rootNode = { // eslint-disable-line @typescript-eslint/no-unsafe-type-assertion
@@ -25,7 +26,8 @@ export async function contentToHtml(compilationInfo, clientImportAliases, conten
25
26
  tungstenPublicEnv,
26
27
  siteBasePath: siteBasePathOverride,
27
28
  hmr: config.hmr,
28
- csr: config.csr
29
+ csr: config.csr,
30
+ docInitScript: readDocInitScript(compilationInfo.buildLocation)
29
31
  };
30
32
  //console.log('rendering tree', inspect(tree, { depth: 99 } ))
31
33
  let html = await renderingNodeToHtml(tree, false, headData, null);
@@ -1 +1 @@
1
- {"version":3,"file":"contentTreeToRenderingTree.d.ts","sourceRoot":"","sources":["../../src/render/contentTreeToRenderingTree.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EACH,KAAK,WAAW,EAEnB,MAAM,mBAAmB,CAAA;AAS1B,wBAAsB,0BAA0B,CAC5C,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,GAAG,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAC9F,OAAO,CAAC,aAAa,CAAC,CA2EzB"}
1
+ {"version":3,"file":"contentTreeToRenderingTree.d.ts","sourceRoot":"","sources":["../../src/render/contentTreeToRenderingTree.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EACH,KAAK,WAAW,EAEnB,MAAM,mBAAmB,CAAA;AAS1B,wBAAsB,0BAA0B,CAC5C,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,GAAG,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAC9F,OAAO,CAAC,aAAa,CAAC,CAgFzB"}
@@ -1,4 +1,4 @@
1
- import { ContentNodeIsLiteral, ContentNodeElementIsComponent, ContentNodeElementIsHtml } from '../ContentNode.js';
1
+ import { ContentNodeIsLiteral, ContentNodeElementIsComponent, ContentNodeElementIsHtml, ContentNodeIsFragment } from '../ContentNode.js';
2
2
  import { validChildren } from '../validChildren.js';
3
3
  import { debug } from './debug.js';
4
4
  import { throwError } from '../throwError.js';
@@ -25,6 +25,10 @@ export async function contentTreeToRenderingTree(node, parentComponent, instance
25
25
  if (ContentNodeIsLiteral(node)) {
26
26
  return node.toString();
27
27
  }
28
+ // a fragment renders as its children; the rendering tree never holds one
29
+ if (ContentNodeIsFragment(node)) {
30
+ return contentTreeToRenderingTree(node[$props].children, parentComponent, instance, noEscape);
31
+ }
28
32
  debug('typeof type', typeof node[$type]);
29
33
  if (ContentNodeElementIsHtml(node)) {
30
34
  processHtmlNode(node);
@@ -1 +1 @@
1
- {"version":3,"file":"processHead.d.ts","sourceRoot":"","sources":["../../src/render/processHead.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAK7C,OAAO,EAAE,oBAAoB,EAAqB,MAAM,qBAAqB,CAAA;AAQ7E,wBAAgB,WAAW,CACvB,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,QAAQ,QA6IrB"}
1
+ {"version":3,"file":"processHead.d.ts","sourceRoot":"","sources":["../../src/render/processHead.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAK7C,OAAO,EAAE,oBAAoB,EAAqB,MAAM,qBAAqB,CAAA;AAY7E,wBAAgB,WAAW,CACvB,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,QAAQ,QA0JrB"}
@@ -6,7 +6,11 @@ import { windowGlobalEnvStatement } from 'tungsten/env/windowGlobalEnvStatement.
6
6
  import { devErrorPageClearRetryScript } from '../Servers/devErrorPageAutoRetry.js';
7
7
  // process the tree returned by the root component
8
8
  // doing things like ensuring there is are html and head elements,
9
- // and adding necessary style and script tags
9
+ // and adding necessary style and script tags.
10
+ // Every node added here is unshifted in front of the app's own head children and carries
11
+ // data--t-internal (a bare attribute: a true value renders as one), which is how hydration and
12
+ // updates find where the app's children start (appHeadChildrenStart). data--t-persist marks the
13
+ // ones a head re-created on the client keeps.
10
14
  export function processHead(headNode, headData) {
11
15
  const {
12
16
  instance,
@@ -22,7 +26,7 @@ export function processHead(headNode, headData) {
22
26
  headNode[$props].children.unshift({
23
27
  [$type]: 'link',
24
28
  [$props]: {
25
- 'data--t-internal': undefined,
29
+ 'data--t-internal': true,
26
30
  'data--t-persist': true,
27
31
  rel: 'stylesheet',
28
32
  href: `${siteBasePath}/${componentCssFolder}/${componentCssFile}`
@@ -33,7 +37,7 @@ export function processHead(headNode, headData) {
33
37
  headNode[$props].children.unshift({
34
38
  [$type]: 'link',
35
39
  [$props]: {
36
- 'data--t-internal': undefined,
40
+ 'data--t-internal': true,
37
41
  'data--t-persist': true,
38
42
  rel: 'stylesheet',
39
43
  href: `${siteBasePath}${frameworkCss}`
@@ -44,19 +48,29 @@ export function processHead(headNode, headData) {
44
48
  const scriptNode = {
45
49
  [$type]: 'script',
46
50
  [$props]: {
47
- 'data--t-internal': undefined,
51
+ 'data--t-internal': true,
48
52
  src: dev ? `/${clientFolder}/client.js` : `${siteBasePath}/bundle/clientWithEnv.js`
49
53
  }
50
54
  };
51
55
  if (dev) scriptNode[$props].type = 'module';else scriptNode[$props].defer = true;
52
56
  headNode[$props].children.unshift(scriptNode);
57
+ // DocInit functions: a sync inline script, so they run before <body> and before the entry
58
+ if (headData.docInitScript !== undefined) {
59
+ headNode[$props].children.unshift({
60
+ [$type]: 'script',
61
+ [$props]: {
62
+ 'data--t-internal': true,
63
+ children: headData.docInitScript
64
+ }
65
+ });
66
+ }
53
67
  // public env
54
68
  if (dev) {
55
69
  if (headData.tungstenPublicEnv !== undefined) {
56
70
  const envScriptNode = {
57
71
  [$type]: 'script',
58
72
  [$props]: {
59
- 'data--t-internal': undefined,
73
+ 'data--t-internal': true,
60
74
  children: windowGlobalEnvStatement('tungstenPublicEnv', headData.tungstenPublicEnv)
61
75
  }
62
76
  };
@@ -68,7 +82,7 @@ export function processHead(headNode, headData) {
68
82
  const cjsHelpersScriptNode = {
69
83
  [$type]: 'script',
70
84
  [$props]: {
71
- 'data--t-internal': undefined,
85
+ 'data--t-internal': true,
72
86
  src: `${siteBasePath}/${clientFolder}/cjsHelpers.js`
73
87
  }
74
88
  };
@@ -81,7 +95,7 @@ export function processHead(headNode, headData) {
81
95
  const clearErrorRetryScriptNode = {
82
96
  [$type]: 'script',
83
97
  [$props]: {
84
- 'data--t-internal': undefined,
98
+ 'data--t-internal': true,
85
99
  children: devErrorPageClearRetryScript
86
100
  }
87
101
  };
@@ -93,7 +107,7 @@ export function processHead(headNode, headData) {
93
107
  const liveReloadScriptNode = {
94
108
  [$type]: 'script',
95
109
  [$props]: {
96
- 'data--t-internal': undefined,
110
+ 'data--t-internal': true,
97
111
  type: 'module',
98
112
  src: `${siteBasePath}/${clientFolder}/${hmr === true ? 'hmr.js' : 'liveReload.js'}`
99
113
  }
@@ -117,6 +131,7 @@ export function processHead(headNode, headData) {
117
131
  const varsScriptNode = {
118
132
  [$type]: 'script',
119
133
  [$props]: {
134
+ 'data--t-internal': true,
120
135
  children: varsScriptContent
121
136
  }
122
137
  };
@@ -124,14 +139,15 @@ export function processHead(headNode, headData) {
124
139
  const contentTypeMetaNode = {
125
140
  [$type]: 'meta',
126
141
  [$props]: {
127
- 'data--t-internal': undefined,
142
+ 'data--t-internal': true,
128
143
  'data--t-persist': true,
129
144
  'http-equiv': 'Content-Type',
130
145
  content: 'text/html; charset=utf-8'
131
146
  }
132
147
  };
133
148
  headNode[$props].children.unshift(contentTypeMetaNode);
134
- // we get in here and shift any elements marked with a "before" prop to the top,
135
- // to let them run before others
149
+ // Idea, not built (2023): a "before" prop on an app head child would hoist it above the
150
+ // framework's nodes, so its script runs first. If built, appHeadChildrenStart's leading-run
151
+ // skip no longer holds: the app's children would then sit on both sides of the marked ones.
136
152
  if (dev) addImportMap(headNode, importAliases, clientImportAliases);
137
153
  }
@@ -0,0 +1,3 @@
1
+ export declare function docInitFileLocation(buildLocation: string): string;
2
+ export declare function readDocInitScript(buildLocation: string): string | undefined;
3
+ //# sourceMappingURL=readDocInitScript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readDocInitScript.d.ts","sourceRoot":"","sources":["../../src/render/readDocInitScript.ts"],"names":[],"mappings":"AAKA,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEjE;AAID,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM3E"}
@@ -0,0 +1,15 @@
1
+ import { existsSync, readFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { clientFolder, docInitFile } from '../settings.js';
4
+ export function docInitFileLocation(buildLocation) {
5
+ return join(buildLocation, clientFolder, docInitFile);
6
+ }
7
+ // The generated head script, ready to inline; undefined when nothing uses DocInit. Read per render:
8
+ // the dev compile rewrites the file on every change, and it is a few lines.
9
+ export function readDocInitScript(buildLocation) {
10
+ const location = docInitFileLocation(buildLocation);
11
+ if (!existsSync(location)) return undefined;
12
+ const content = readFileSync(location, 'utf8').trim();
13
+ if (content === '') return undefined;
14
+ return content.replaceAll('</script', '<\\/script');
15
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"rootToHtmlDev.d.ts","sourceRoot":"","sources":["../../src/render/rootToHtmlDev.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAI,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAI,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,KAAI,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,KAAI,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAGpE,wBAAsB,aAAa,CAC/B,eAAe,EAAE,eAAe,EAAG,mBAAmB,EAAE,aAAa,EACrE,kBAAkB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,uBAAuB,EACzF,kBAAkB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,YAAY,mBAMjF"}
1
+ {"version":3,"file":"rootToHtmlDev.d.ts","sourceRoot":"","sources":["../../src/render/rootToHtmlDev.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,KAAI,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC7D,OAAO,KAAI,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,KAAI,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,KAAI,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AAGpE,wBAAsB,aAAa,CAC/B,eAAe,EAAE,eAAe,EAAG,mBAAmB,EAAE,aAAa,EACrE,kBAAkB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,uBAAuB,EACzF,kBAAkB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,YAAY,mBAMjF"}
@@ -7,6 +7,6 @@ export type GroupProps = {
7
7
  data?: RouteDataFunction<any, any>;
8
8
  };
9
9
  export declare class Group extends TungstenSimpleComponent<GroupProps> {
10
- content: () => string | number | boolean | import("../ContentNode.js").ContentNodeHtml | import("../ContentNode.js").ContentNodeClassComponent | import("../ContentNode.js").ContentNodeFunctionComponent | import("../ContentNode.js").ContentNodeArray | null;
10
+ content: () => string | number | boolean | import("../ContentNode.js").ContentNodeHtml | import("../ContentNode.js").ContentNodeClassComponent | import("../ContentNode.js").ContentNodeFunctionComponent | import("../ContentNode.js").ContentNodeFragment | import("../ContentNode.js").ContentNodeArray | null;
11
11
  }
12
12
  //# sourceMappingURL=Group.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Group.d.ts","sourceRoot":"","sources":["../../src/routing/Group.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAE/D,MAAM,MAAM,UAAU,GAAG;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,WAAW,CAAA;IACtB,IAAI,CAAC,EAAE,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;CAErC,CAAA;AAED,qBAAa,KAAM,SAAQ,uBAAuB,CAAC,UAAU,CAAC;IAC1D,OAAO,yPAGN;CACJ"}
1
+ {"version":3,"file":"Group.d.ts","sourceRoot":"","sources":["../../src/routing/Group.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAA;AAE/D,MAAM,MAAM,UAAU,GAAG;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,WAAW,CAAA;IACtB,IAAI,CAAC,EAAE,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;CAErC,CAAA;AAED,qBAAa,KAAM,SAAQ,uBAAuB,CAAC,UAAU,CAAC;IAC1D,OAAO,2SAGN;CACJ"}
@@ -9,6 +9,6 @@ export type MatchedRouteProps = {
9
9
  };
10
10
  export declare class MatchedRoute extends TungstenSimpleInternalStoreComponent<MatchedRouteProps> {
11
11
  init: () => void;
12
- content: () => string | number | boolean | import("../ContentNode.js").ContentNodeHtml | import("../ContentNode.js").ContentNodeClassComponent | import("../ContentNode.js").ContentNodeFunctionComponent | import("../ContentNode.js").ContentNodeArray | null | undefined;
12
+ content: () => string | number | boolean | import("../ContentNode.js").ContentNodeHtml | import("../ContentNode.js").ContentNodeClassComponent | import("../ContentNode.js").ContentNodeFunctionComponent | import("../ContentNode.js").ContentNodeFragment | import("../ContentNode.js").ContentNodeArray | null | undefined;
13
13
  }
14
14
  //# sourceMappingURL=MatchedRoute.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MatchedRoute.d.ts","sourceRoot":"","sources":["../../src/routing/MatchedRoute.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,oCAAoC,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,EAAE,WAAW,EAA0B,MAAM,mBAAmB,CAAA;AAIvE,MAAM,MAAM,iBAAiB,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,WAAW,CAAA;IACtB,KAAK,CAAC,EAAE,aAAa,CAAA;CACxB,CAAA;AACD,qBAAa,YAAa,SAAQ,oCAAoC,CAAC,iBAAiB,CAAC;IACrF,IAAI,aAA4C;IAChD,OAAO,qQAaN;CACJ"}
1
+ {"version":3,"file":"MatchedRoute.d.ts","sourceRoot":"","sources":["../../src/routing/MatchedRoute.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,oCAAoC,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,EAAE,WAAW,EAA0B,MAAM,mBAAmB,CAAA;AAIvE,MAAM,MAAM,iBAAiB,GAAG;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,WAAW,CAAA;IACtB,KAAK,CAAC,EAAE,aAAa,CAAA;CACxB,CAAA;AACD,qBAAa,YAAa,SAAQ,oCAAoC,CAAC,iBAAiB,CAAC;IACrF,IAAI,aAA4C;IAChD,OAAO,uTAaN;CACJ"}
@@ -21,6 +21,9 @@ export declare const componentCssFile = "ccss.css";
21
21
  export declare const frameworkCssFolder = ".tungstenCss";
22
22
  export declare const frameworkCssFile = "tungsten.css";
23
23
  export declare const packagesFolder = ".packages";
24
+ export declare const docInitFile = "docInit.js";
25
+ export declare const docInitWindowKey = "__t_docInit";
26
+ export declare const docInitErrorsWindowKey = "__t_docInitErrors";
24
27
  export declare const unusedStyleReporting: boolean;
25
28
  export declare const defaultBrowserTargets = "since 2020";
26
29
  export declare const packageName = "tungsten";
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,cAAc,CAAA;AACtC,eAAO,MAAM,gBAAgB,SAAS,CAAA;AACtC,eAAO,MAAM,mBAAmB,kBAAuB,CAAA;AACvD,eAAO,MAAM,cAAc,uBAA+C,CAAA;AAC1E,eAAO,MAAM,eAAe,mBAAwB,CAAA;AACpD,eAAO,MAAM,mBAAmB,wBAA2C,CAAA;AAG3E,eAAO,MAAM,iBAAiB,sBAA2B,CAAA;AACzD,eAAO,MAAM,kBAAkB,uBAA4B,CAAA;AAC3D,eAAO,MAAM,YAAY,2BAA+B,CAAA;AACxD,eAAO,MAAM,gBAAgB,yBAA8B,CAAA;AAC3D,eAAO,MAAM,mBAAmB,4BAAiC,CAAA;AACjE,eAAO,MAAM,qBAAqB,cAAc,CAAA;AAEhD,eAAO,MAAM,iBAAiB,0BAA+B,CAAA;AAC7D,eAAO,MAAM,YAAY,WAAW,CAAA;AAEpC,eAAO,MAAM,YAAY,YAAY,CAAA;AACrC,eAAO,MAAM,YAAY,YAAY,CAAA;AACrC,eAAO,MAAM,YAAY,YAAY,CAAA;AACrC,eAAO,MAAM,YAAY,YAAY,CAAA;AACrC,eAAO,MAAM,kBAAkB,kBAAkB,CAAA;AACjD,eAAO,MAAM,gBAAgB,aAAa,CAAA;AAE1C,eAAO,MAAM,kBAAkB,iBAAiB,CAAA;AAChD,eAAO,MAAM,gBAAgB,iBAAiB,CAAA;AAC9C,eAAO,MAAM,cAAc,cAAc,CAAA;AAEzC,eAAO,MAAM,oBAAoB,EAAE,OAAe,CAAA;AAIlD,eAAO,MAAM,qBAAqB,eAAe,CAAA;AAEjD,eAAO,MAAM,WAAW,aAAa,CAAA;AACrC,eAAO,MAAM,sBAAsB,aAAa,CAAA;AAChD,eAAO,MAAM,qBAAqB,YAAY,CAAA;AAC9C,eAAO,MAAM,mBAAmB,SAAS,CAAA"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,cAAc,CAAA;AACtC,eAAO,MAAM,gBAAgB,SAAS,CAAA;AACtC,eAAO,MAAM,mBAAmB,kBAAuB,CAAA;AACvD,eAAO,MAAM,cAAc,uBAA+C,CAAA;AAC1E,eAAO,MAAM,eAAe,mBAAwB,CAAA;AACpD,eAAO,MAAM,mBAAmB,wBAA2C,CAAA;AAG3E,eAAO,MAAM,iBAAiB,sBAA2B,CAAA;AACzD,eAAO,MAAM,kBAAkB,uBAA4B,CAAA;AAC3D,eAAO,MAAM,YAAY,2BAA+B,CAAA;AACxD,eAAO,MAAM,gBAAgB,yBAA8B,CAAA;AAC3D,eAAO,MAAM,mBAAmB,4BAAiC,CAAA;AACjE,eAAO,MAAM,qBAAqB,cAAc,CAAA;AAEhD,eAAO,MAAM,iBAAiB,0BAA+B,CAAA;AAC7D,eAAO,MAAM,YAAY,WAAW,CAAA;AAEpC,eAAO,MAAM,YAAY,YAAY,CAAA;AACrC,eAAO,MAAM,YAAY,YAAY,CAAA;AACrC,eAAO,MAAM,YAAY,YAAY,CAAA;AACrC,eAAO,MAAM,YAAY,YAAY,CAAA;AACrC,eAAO,MAAM,kBAAkB,kBAAkB,CAAA;AACjD,eAAO,MAAM,gBAAgB,aAAa,CAAA;AAE1C,eAAO,MAAM,kBAAkB,iBAAiB,CAAA;AAChD,eAAO,MAAM,gBAAgB,iBAAiB,CAAA;AAC9C,eAAO,MAAM,cAAc,cAAc,CAAA;AAEzC,eAAO,MAAM,WAAW,eAAe,CAAA;AACvC,eAAO,MAAM,gBAAgB,gBAAgB,CAAA;AAC7C,eAAO,MAAM,sBAAsB,sBAAsB,CAAA;AAEzD,eAAO,MAAM,oBAAoB,EAAE,OAAe,CAAA;AAIlD,eAAO,MAAM,qBAAqB,eAAe,CAAA;AAEjD,eAAO,MAAM,WAAW,aAAa,CAAA;AACrC,eAAO,MAAM,sBAAsB,aAAa,CAAA;AAChD,eAAO,MAAM,qBAAqB,YAAY,CAAA;AAC9C,eAAO,MAAM,mBAAmB,SAAS,CAAA"}
package/dist/settings.js CHANGED
@@ -26,6 +26,10 @@ export const componentCssFile = 'ccss.css';
26
26
  export const frameworkCssFolder = '.tungstenCss';
27
27
  export const frameworkCssFile = 'tungsten.css';
28
28
  export const packagesFolder = '.packages';
29
+ // the head script BabelTransformDocInit generates, in clientFolder; the window key its entries live under
30
+ export const docInitFile = 'docInit.js';
31
+ export const docInitWindowKey = '__t_docInit';
32
+ export const docInitErrorsWindowKey = '__t_docInitErrors';
29
33
  export const unusedStyleReporting = false;
30
34
  // the production bundle's browser floor when the config sets no `targets`: a browserslist query
31
35
  // for every browser version released since 2020. Dev applies no floor at all.
@@ -1 +1 @@
1
- {"version":3,"file":"styleContentSxy.d.ts","sourceRoot":"","sources":["../../src/style/styleContentSxy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EACH,KAAK,WAAW,EACnB,MAAM,mBAAmB,CAAA;AAc1B,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,eAIrE"}
1
+ {"version":3,"file":"styleContentSxy.d.ts","sourceRoot":"","sources":["../../src/style/styleContentSxy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EACH,KAAK,WAAW,EAEnB,MAAM,mBAAmB,CAAA;AAc1B,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,eAIrE"}
@@ -1,5 +1,5 @@
1
1
  import { count } from 'sxy-lib/objects.js';
2
- import { ContentNodeElementIsHtml, ContentNodeElementIsComponent } from '../ContentNode.js';
2
+ import { ContentNodeElementIsHtml, ContentNodeElementIsComponent, ContentNodeIsFragment } from '../ContentNode.js';
3
3
  import { warn } from '../output.js';
4
4
  import { TungstenError } from '../TungstenError.js';
5
5
  import { componentBumpClass } from '../componentClassName.js';
@@ -44,6 +44,11 @@ function processItem(element, styles, usage) {
44
44
  }
45
45
  return;
46
46
  }
47
+ // a fragment gets no class of its own; its children are styled as if they sat in its place
48
+ if (ContentNodeIsFragment(element)) {
49
+ processItem(element[$props].children, styles, usage);
50
+ return;
51
+ }
47
52
  debug('Element must be an element. Type: ', typeof element);
48
53
  // element is a ContentNodeElement
49
54
  let tagName;
@@ -0,0 +1,2 @@
1
+ export declare function installTestDocInit(): void;
2
+ //# sourceMappingURL=installTestDocInit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"installTestDocInit.d.ts","sourceRoot":"","sources":["../../src/testing/installTestDocInit.ts"],"names":[],"mappings":"AAGA,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC"}
@@ -0,0 +1,6 @@
1
+ // DocInit is compiled away by BabelTransformDocInit in an app build. Tests run tsc output, where
2
+ // the global is the throwing stand-in docInit.ts installs. This makes the same split the compiled
3
+ // form does: run the function where a document exists, else hand back the server value.
4
+ export function installTestDocInit() {
5
+ globalThis.DocInit = (fn, serverValue) => typeof document !== 'undefined' ? fn() : serverValue; // eslint-disable-line @typescript-eslint/no-unsafe-type-assertion -- the void overload has no server value
6
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"throwError.d.ts","sourceRoot":"","sources":["../src/throwError.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAEnE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAErE"}
1
+ {"version":3,"file":"throwError.d.ts","sourceRoot":"","sources":["../src/throwError.ts"],"names":[],"mappings":"AAGA,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAKnE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAErE"}
@@ -1,7 +1,10 @@
1
1
  import { TungstenError } from './TungstenError.js';
2
2
  import { packageNameCapitalized } from './settings.js';
3
3
  export function throwError(location, message) {
4
- throw new TungstenError(errorMessage(location, message));
4
+ const error = new TungstenError(errorMessage(location, message));
5
+ // V8 only (Chrome, Node): start the stack at the caller, not here. Elsewhere the frame stays.
6
+ Error.captureStackTrace?.(error, throwError); // eslint-disable-line @typescript-eslint/no-unnecessary-condition -- absent outside V8
7
+ throw error;
5
8
  }
6
9
  export function errorMessage(location, message) {
7
10
  return `${packageNameCapitalized} ${location} error: ${message}`;
@@ -1 +1 @@
1
- {"version":3,"file":"integrateUpdateVdom.d.ts","sourceRoot":"","sources":["../../src/update/integrateUpdateVdom.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"integrateUpdateVdom.d.ts","sourceRoot":"","sources":["../../src/update/integrateUpdateVdom.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import { IsHTMLElement } from '../DomNodes.js';
2
2
  import { DomRegion } from '../DomRegion.js';
3
3
  import { DomPointer } from '../DomPointer.js';
4
- import { ContentNodeComponentIsClassComponent, ContentNodeIsNonRendered, ContentNodeIsLiteral, ContentNodeIsHtml, ContentNodeIsComponent, ContentNodeIsArray, ContentNodeIsElement, ContentNodeElementHasValidKey } from '../ContentNode.js';
4
+ import { appHeadChildrenStart } from '../headChildren.js';
5
+ import { ContentNodeComponentIsClassComponent, ContentNodeIsNonRendered, ContentNodeIsLiteral, ContentNodeIsHtml, ContentNodeIsComponent, ContentNodeIsArray, ContentNodeIsFragment, ContentNodeIsElement, ContentNodeElementHasValidKey } from '../ContentNode.js';
5
6
  import { StringIsHtmlEvent, htmlEvents } from '../htmlEvents.js';
6
7
  import { out, warn } from '../appOutput.js';
7
8
  import { getStyledContentFromFunctionComponent } from '../getStyledContentFromFunctionComponent.js';
@@ -207,6 +208,17 @@ export async function applyUpdate({
207
208
  debug('DD delete node because current node is non rendered');
208
209
  deleteNodeIfRendered(oldNode);
209
210
  return makeRenderedContentNodeNonRendered();
211
+ } else if (ContentNodeIsFragment(newNode)) {
212
+ // a fragment is its children to the reconciler; the rendered side never holds one
213
+ return applyUpdate({
214
+ tungstenElement,
215
+ instance,
216
+ newNode: newNode[$props].children,
217
+ oldNode,
218
+ domRegion,
219
+ domPointer,
220
+ parentNode
221
+ });
210
222
  } else if (ContentNodeIsArray(newNode)) {
211
223
  //newNode
212
224
  debug('*** Content node is array');
@@ -417,7 +429,8 @@ export async function applyUpdate({
417
429
  if (WideRenderedContentNodeIsHtml(oldNode)) {
418
430
  debug('node types', newNode[$type].toLocaleLowerCase(), oldNode[$type].toLocaleLowerCase(), newNode[$type].toLocaleLowerCase() === oldNode[$type].toLocaleLowerCase());
419
431
  }
420
- if (WideRenderedContentNodeIsHtml(oldNode) && newNode[$type].toLocaleLowerCase() === oldNode[$type].toLocaleLowerCase()) {
432
+ if (WideRenderedContentNodeIsHtml(oldNode) && newNode[$type].toLocaleLowerCase() === oldNode[$type].toLocaleLowerCase() && oldNode[$key] === newNode[$key] // a changed, gained or lost key is a new element
433
+ ) {
421
434
  return updateHtmlElement(tungstenElement, instance, newNode, oldNode, domPointer);
422
435
  } else {
423
436
  //console.log('deleting node and creating html', newNode[$type], oldNode)
@@ -429,7 +442,12 @@ export async function applyUpdate({
429
442
  }
430
443
  } else if (ContentNodeIsComponent(newNode)) {
431
444
  //console.log('Comp A', WideRenderedContentNodeIsComponent(oldNode))
432
- if (WideRenderedContentNodeIsComponent(oldNode) && newNode[$type] === oldNode[$type] && (oldNode[$key] !== undefined && newNode[$key] !== undefined || oldNode[$key] === newNode[$key])) {
445
+ if (WideRenderedContentNodeIsComponent(oldNode) && newNode[$type] === oldNode[$type] &&
446
+ // this code survived for years without issue
447
+ // but probably the simple equality check below is right
448
+ // (oldNode[$key] !== undefined && newNode[$key] !== undefined)
449
+ // || oldNode[$key] === newNode[$key]
450
+ oldNode[$key] === newNode[$key]) {
433
451
  //console.log('updating tu el', newNode, oldNode[$key], newNode[$key])
434
452
  // update
435
453
  return updateComponent({
@@ -490,7 +508,8 @@ async function updateHtmlElement(tungstenElement, instance, newNode, oldNode, do
490
508
  newNode: newChildren,
491
509
  oldNode: oldChildren,
492
510
  domRegion: new DomRegion(domNode),
493
- domPointer: new DomPointer(domNode, 0),
511
+ // the head's children start past what the server added to it
512
+ domPointer: new DomPointer(domNode, newNode[$type] === 'head' ? appHeadChildrenStart(domNode) : 0),
494
513
  parentNode: newNode
495
514
  });
496
515
  // Reapply the controlled value after reconciling the options. Updating the
@@ -639,6 +658,14 @@ async function createNode({
639
658
  if (ContentNodeIsNonRendered(newNode)) {
640
659
  debug('node is NonRendered');
641
660
  return makeRenderedContentNodeNonRendered();
661
+ } else if (ContentNodeIsFragment(newNode)) {
662
+ return createNode({
663
+ tungstenElement,
664
+ instance,
665
+ newNode: newNode[$props].children,
666
+ domPointer,
667
+ parentNode
668
+ });
642
669
  } else if (ContentNodeIsArray(newNode)) {
643
670
  debug('node is array');
644
671
  const renderedNodes = [];
@@ -1293,6 +1320,17 @@ async function updateClassComponent({
1293
1320
  // not fire: the component did not update.
1294
1321
  //console.log('old props', element.props)
1295
1322
  //console.log('new props', newNode[$props])
1323
+ // an opaque class (static __opaque) renders once and then owns its dom: its parent never
1324
+ // re-renders it, and its region is measured live because hand-added nodes change its length
1325
+ if (element.constructor.__opaque === true) {
1326
+ // eslint-disable-line @typescript-eslint/no-unsafe-type-assertion -- the static declared on TungstenBaseComponent
1327
+ markRendered(element);
1328
+ const length = element.__domRegion?.length();
1329
+ if (length !== undefined) {
1330
+ domPointer.increment(length);
1331
+ return oldNode;
1332
+ }
1333
+ }
1296
1334
  if (propsAreEqual(element.props, newNode[$props], renderedAt(element))) {
1297
1335
  if (tracing()) trace('SKIP', element.constructor.name, '(props unchanged since tick', renderedAt(element), ')');
1298
1336
  // the dom is current for these props, so the baseline moves with it -- otherwise a
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tungsten",
3
- "version": "0.4.14",
3
+ "version": "0.5.1",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "bin": {
@@ -38,6 +38,7 @@
38
38
  "@babel/preset-react": "^7.28.5",
39
39
  "@babel/preset-typescript": "^7.29.7",
40
40
  "@babel/types": "^7.29.0",
41
+ "@jridgewell/trace-mapping": "^0.3.31",
41
42
  "@rollup/plugin-babel": "^6.1.0",
42
43
  "@rollup/plugin-commonjs": "^28.0.9",
43
44
  "@rollup/plugin-json": "^6.1.0",
package/readme.md CHANGED
@@ -2,139 +2,6 @@
2
2
 
3
3
  [Docs](https://robertsandiford.co.uk/tungsten)
4
4
 
5
- ## Component testing
5
+ ## Agents
6
6
 
7
- Test-specific APIs are available from `tungsten/testing` and are not exported
8
- from Tungsten's main entry point. A test project supplies its own DOM
9
- implementation, such as happy-dom or jsdom:
10
-
11
- ```tsx
12
- import { Window } from 'happy-dom'
13
- import { createTestApp } from 'tungsten/testing'
14
-
15
- describe('RootComponent', () => {
16
- it('responds to a button click', async () => {
17
- const window = new Window()
18
- const testApp = await createTestApp(RootComponent, {
19
- document: window.document as unknown as Document,
20
- props: { initialName: 'Robert' },
21
- location: '/',
22
- })
23
-
24
- try {
25
- const button = testApp.container.querySelector('button')
26
- expect(button).not.toBeNull()
27
-
28
- button!.dispatchEvent(new window.Event('click') as unknown as Event)
29
- await testApp.resolved()
30
-
31
- expect(testApp.container.textContent).toContain('Robert')
32
- } finally {
33
- await testApp.unmount()
34
- }
35
- })
36
- })
37
- ```
38
-
39
- The casts are only needed when a DOM package publishes types which are not
40
- structurally compatible with the TypeScript DOM library version used by the
41
- test project.
42
-
43
- `createTestApp()` completes the initial client render before returning.
44
- `resolved()` subsequently waits for Tungsten updates, DOM reconciliation,
45
- lifecycle-triggered updates, and promises returned by registered event
46
- handlers. It does not wait for unrelated timers, network requests, or promises
47
- which the application has not returned to Tungsten.
48
-
49
- An automatically created container is appended to the supplied document body
50
- and removed by `unmount()`. A caller-supplied container must be empty; it is
51
- emptied but retained during unmount.
52
-
53
- Registered stores are created independently for each test application. Use
54
- `testStore()` to initialize one before the root component starts:
55
-
56
- ```ts
57
- import { createTestApp, testStore } from 'tungsten/testing'
58
-
59
- const testApp = await createTestApp(RootComponent, {
60
- document,
61
- stores: [testStore(userStore, store => {
62
- store.user.set(mockUser)
63
- })],
64
- })
65
- ```
66
-
67
- Tests containing Tungsten JSX must be compiled through `tungsten compile` so
68
- they use Tungsten's JSX runtime and application transforms.
69
-
70
- ## Preparing code for tests
71
-
72
- Run a one-shot development compilation without starting a server:
73
-
74
- ```sh
75
- tungsten compile
76
- ```
77
-
78
- By default this compiles JavaScript (including JSX and Tungsten's Babel
79
- transforms), stylesheets, client support files, assets, and public files into
80
- `.tungsten/dev`.
81
- Each selected target's existing generated output is cleaned before the initial
82
- compilation, including when watch mode is used. Pass `--no-clean` to preserve
83
- existing output.
84
-
85
- Use `--output` to select an independent output root. The layout below that root
86
- is the same as `.tungsten/dev`, including `code`, `.client`, `.static`,
87
- `.assets`, `.public`, `.componentCss`, and `.packages`:
88
-
89
- ```sh
90
- tungsten compile --output .tungsten/test
91
- tungsten compile --output .tungsten/test --watch
92
- ```
93
-
94
- Cleaning and generated package-cache data are scoped to the selected output.
95
- Limit the work with one or more options:
96
-
97
- ```sh
98
- tungsten compile --js
99
- tungsten compile --css
100
- tungsten compile --client
101
- tungsten compile --assets
102
- tungsten compile --public
103
- tungsten compile --js --css
104
- ```
105
-
106
- `--all` explicitly selects all five targets.
107
-
108
- Add `--watch` to keep the JavaScript, stylesheet, asset, and/or public-file
109
- compiler running after the initial pass. Client support files are still
110
- generated once:
111
-
112
- ```sh
113
- tungsten compile --watch
114
- tungsten compile --js --watch
115
- ```
116
-
117
- For process orchestration, `--ready-file <file>` writes a small JSON file only
118
- after the initial compilation succeeds. A failed JavaScript watch cycle removes
119
- the file, and a later successful cycle recreates it. `--quiet` suppresses
120
- per-file transformation messages while retaining errors and cycle status:
121
-
122
- ```sh
123
- tungsten compile --watch --output .tungsten/test \
124
- --ready-file .tungsten/test.ready --quiet
125
- ```
126
-
127
- ## Preserving package imports in selected files
128
-
129
- Use `skipPackageCompilation` in `tungsten.config.js` for files that should be
130
- transformed and emitted without Tungsten traversing or copying their package
131
- dependencies. Bare package imports in matching files are left unchanged:
132
-
133
- ```js
134
- export default {
135
- skipPackageCompilation: '**/*.domTest.js'
136
- }
137
- ```
138
-
139
- The option accepts one glob or an array of globs. Patterns match the actual
140
- JavaScript files received by Tungsten; extensions are not translated.
7
+ If you are an agent, read [AGENTS.md](AGENTS.md)