foldkit 0.146.0 → 0.147.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +5 -2
  2. package/dist/customElement/index.d.ts.map +1 -1
  3. package/dist/customElement/index.js +23 -0
  4. package/dist/experimental/index.d.ts +1 -0
  5. package/dist/experimental/index.d.ts.map +1 -1
  6. package/dist/experimental/index.js +1 -0
  7. package/dist/experimental/machine/machine.d.ts +22 -3
  8. package/dist/experimental/machine/machine.d.ts.map +1 -1
  9. package/dist/experimental/machine/machine.js +8 -0
  10. package/dist/experimental/server/entry.d.ts +73 -0
  11. package/dist/experimental/server/entry.d.ts.map +1 -0
  12. package/dist/experimental/server/entry.js +41 -0
  13. package/dist/experimental/server/host.d.ts +42 -0
  14. package/dist/experimental/server/host.d.ts.map +1 -0
  15. package/dist/experimental/server/host.js +169 -0
  16. package/dist/experimental/server/index.d.ts +5 -0
  17. package/dist/experimental/server/index.d.ts.map +1 -0
  18. package/dist/experimental/server/index.js +4 -0
  19. package/dist/experimental/server/public.d.ts +3 -0
  20. package/dist/experimental/server/public.d.ts.map +1 -0
  21. package/dist/experimental/server/public.js +1 -0
  22. package/dist/experimental/server/serialize.d.ts +33 -0
  23. package/dist/experimental/server/serialize.d.ts.map +1 -0
  24. package/dist/experimental/server/serialize.js +563 -0
  25. package/dist/experimental/server/server.d.ts +201 -0
  26. package/dist/experimental/server/server.d.ts.map +1 -0
  27. package/dist/experimental/server/server.js +423 -0
  28. package/dist/experimental/server/template.d.ts +45 -0
  29. package/dist/experimental/server/template.d.ts.map +1 -0
  30. package/dist/experimental/server/template.js +182 -0
  31. package/dist/html/index.d.ts +5 -0
  32. package/dist/html/index.d.ts.map +1 -1
  33. package/dist/html/index.js +38 -4
  34. package/dist/hydrate.d.ts +4 -0
  35. package/dist/hydrate.d.ts.map +1 -0
  36. package/dist/hydrate.js +522 -0
  37. package/dist/hydrationMarker.d.ts +10 -0
  38. package/dist/hydrationMarker.d.ts.map +1 -0
  39. package/dist/hydrationMarker.js +9 -0
  40. package/dist/runtime/public.d.ts +2 -2
  41. package/dist/runtime/public.d.ts.map +1 -1
  42. package/dist/runtime/public.js +1 -1
  43. package/dist/runtime/runtime.d.ts +75 -36
  44. package/dist/runtime/runtime.d.ts.map +1 -1
  45. package/dist/runtime/runtime.js +209 -71
  46. package/dist/snabbdom/h.d.ts +1 -0
  47. package/dist/snabbdom/h.d.ts.map +1 -1
  48. package/dist/snabbdom/h.js +85 -4
  49. package/dist/snabbdom/tovnode.d.ts.map +1 -1
  50. package/dist/snabbdom/tovnode.js +5 -1
  51. package/dist/tagName.d.ts +6 -0
  52. package/dist/tagName.d.ts.map +1 -0
  53. package/dist/tagName.js +11 -0
  54. package/dist/vdom.d.ts.map +1 -1
  55. package/dist/vdom.js +25 -1
  56. package/package.json +8 -1
@@ -0,0 +1,11 @@
1
+ /** Extracts the tag name from a snabbdom selector, dropping any `#id` or
2
+ * `.class` suffix. Foldkit builds bare-tag selectors, so in practice this
3
+ * returns the selector unchanged, but the id/class handling keeps it correct
4
+ * for any selector snabbdom itself would accept. */
5
+ export const tagNameFromSelector = (selector) => {
6
+ const hashIndex = selector.indexOf('#');
7
+ const dotIndex = selector.indexOf('.');
8
+ const hashEnd = hashIndex > 0 ? hashIndex : selector.length;
9
+ const dotEnd = dotIndex > 0 ? dotIndex : selector.length;
10
+ return selector.slice(0, Math.min(hashEnd, dotEnd));
11
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"vdom.d.ts","sourceRoot":"","sources":["../src/vdom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAa,MAAM,QAAQ,CAAA;AAG1C,OAAO,EACL,KAAK,KAAK,EAQV,OAAO,EACR,MAAM,qBAAqB,CAAA;AAE5B,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,CAAA;AAElB,eAAO,MAAM,KAAK,uEAOhB,CAAA;AAsBF,eAAO,MAAM,cAAc,gBAAuB,CAAA;AA2ClD;;;;mBAImB;AACnB,eAAO,MAAM,kBAAkB,GAC7B,MAAM,KAAK,EACX,OAAM,GAAG,CAAC,MAAM,CAAa,KAC5B,KAA0B,CAAA;AAE7B;;;;;mBAKmB;AACnB,eAAO,MAAM,oBAAoB,GAC/B,MAAM,KAAK,EACX,OAAM,GAAG,CAAC,MAAM,CAAa,KAC5B,KAMF,CAAA;AAED,eAAO,MAAM,YAAY,GACvB,mBAAmB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EACvC,WAAW,KAAK,GAAG,IAAI,EACvB,WAAW,WAAW,EACtB,OAAO,GAAG,CAAC,MAAM,CAAC,KACjB,KASF,CAAA"}
1
+ {"version":3,"file":"vdom.d.ts","sourceRoot":"","sources":["../src/vdom.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAa,MAAM,QAAQ,CAAA;AAG1C,OAAO,EACL,KAAK,KAAK,EAQV,OAAO,EACR,MAAM,qBAAqB,CAAA;AAE5B,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,CAAA;AASlB,eAAO,MAAM,KAAK,uEAOhB,CAAA;AAsBF,eAAO,MAAM,cAAc,gBAAuB,CAAA;AA2ClD;;;;mBAImB;AACnB,eAAO,MAAM,kBAAkB,GAC7B,MAAM,KAAK,EACX,OAAM,GAAG,CAAC,MAAM,CAAa,KAC5B,KAA0B,CAAA;AAE7B;;;;;mBAKmB;AACnB,eAAO,MAAM,oBAAoB,GAC/B,MAAM,KAAK,EACX,OAAM,GAAG,CAAC,MAAM,CAAa,KAC5B,KAMF,CAAA;AAoBD,eAAO,MAAM,YAAY,GACvB,mBAAmB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EACvC,WAAW,KAAK,GAAG,IAAI,EACvB,WAAW,WAAW,EACtB,OAAO,GAAG,CAAC,MAAM,CAAC,KACjB,KASF,CAAA"}
package/dist/vdom.js CHANGED
@@ -2,6 +2,13 @@ import { Option, Predicate } from 'effect';
2
2
  import { propsModule } from './propsModule.js';
3
3
  import { attributesModule, classModule, datasetModule, eventListenersModule, h, init, styleModule, toVNode, } from './snabbdom/index.js';
4
4
  export { toVNode };
5
+ // NOTE: module order is load-bearing for hydration. `attributesModule` must run
6
+ // before `propsModule`. When a controlled input is adopted, the seeded server
7
+ // `value` attribute is removed by the attrs module first, which resets
8
+ // `elm.value`; only then does the props module reassert the model value, its
9
+ // `elm[key] !== cur` guard now seeing a cleared value. In the reverse order the
10
+ // props write is skipped as a no-op and the later attribute removal blanks the
11
+ // input. The controlled-input hydration tests fail if this order is changed.
5
12
  export const patch = init([
6
13
  attributesModule,
7
14
  classModule,
@@ -85,12 +92,29 @@ export const dedupeMemoizedResult = (root, seen = new Set()) => {
85
92
  const nextChildren = dedupeChildList(root.children, seen);
86
93
  return nextChildren === undefined ? root : { ...root, children: nextChildren };
87
94
  };
95
+ // NOTE: a fresh boot builds the whole tree so snabbdom fires every insert hook,
96
+ // which is what runs Mounts. Patching `toVNode(container)` directly would let
97
+ // snabbdom reuse a container whose existing DOM happens to match the new tree (a
98
+ // fresh `run` over server-rendered DOM, or an HMR restore), leaving those hooks
99
+ // unfired and Mounts unattached. Patching against a comment placed where the
100
+ // container was is never `sameVnode` with an element, so `createElm` builds the
101
+ // tree fresh and replaces the container, exactly as a boot into an empty
102
+ // container does.
103
+ const patchFreshInto = (container, nextVNode) => {
104
+ const parent = container.parentNode;
105
+ if (parent === null) {
106
+ return patch(toVNode(container), nextVNode);
107
+ }
108
+ const placeholder = container.ownerDocument.createComment('');
109
+ parent.replaceChild(placeholder, container);
110
+ return patch(toVNode(placeholder), nextVNode);
111
+ };
88
112
  export const __patchVNode = (maybeCurrentVNode, nextVNode, container, seen) => {
89
113
  const dedupedVNode = Predicate.isNotNull(nextVNode)
90
114
  ? dedupeSharedVNodes(nextVNode, seen)
91
115
  : h('!');
92
116
  return Option.match(maybeCurrentVNode, {
93
- onNone: () => patch(toVNode(container), dedupedVNode),
117
+ onNone: () => patchFreshInto(container, dedupedVNode),
94
118
  onSome: currentVNode => patch(currentVNode, dedupedVNode),
95
119
  });
96
120
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foldkit",
3
- "version": "0.146.0",
3
+ "version": "0.147.0",
4
4
  "description": "A TypeScript frontend framework, built on Effect and architected like Elm",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -47,6 +47,10 @@
47
47
  "types": "./dist/experimental/machine/public.d.ts",
48
48
  "import": "./dist/experimental/machine/public.js"
49
49
  },
50
+ "./experimental/server": {
51
+ "types": "./dist/experimental/server/public.d.ts",
52
+ "import": "./dist/experimental/server/public.js"
53
+ },
50
54
  "./html": {
51
55
  "types": "./dist/html/public.d.ts",
52
56
  "import": "./dist/html/public.js"
@@ -153,6 +157,9 @@
153
157
  "dist",
154
158
  "THIRD-PARTY-NOTICES.md"
155
159
  ],
160
+ "dependencies": {
161
+ "parse5": "^8.0.1"
162
+ },
156
163
  "peerDependencies": {
157
164
  "effect": "4.0.0-rc.109"
158
165
  },