@barefootjs/xslate 0.31.6 → 0.31.8

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.
@@ -1,9 +1,10 @@
1
1
  /**
2
- * Per-fixture build-time contracts for shapes the Xslate adapter
3
- * intentionally refuses to lower. Mirrors mojo's set the lowering
4
- * gates are shared code paths in the ported adapter. Consumed by this
5
- * package's own conformance test (as `expectedDiagnostics`) and by
6
- * `bf compat` (issue-URL attribution).
2
+ * Per-fixture build-time contracts for shapes this adapter intentionally
3
+ * refuses to lower. Declared per adapter, not on the shared fixtures, so
4
+ * adding a new adapter never touches a cross-adapter file. Per-fixture
5
+ * rationale lives on each fixture's docstring
6
+ * (`packages/adapter-tests/fixtures/<id>.ts`) and spec/callback-fidelity.md;
7
+ * comments below only mark where this adapter's set diverges from siblings.
7
8
  */
8
9
  import type { ConformancePins } from '@barefootjs/jsx';
9
10
  export declare const conformancePins: ConformancePins;
@@ -1 +1 @@
1
- {"version":3,"file":"conformance-pins.d.ts","sourceRoot":"","sources":["../src/conformance-pins.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,eAAO,MAAM,eAAe,EAAE,eAkK7B,CAAA"}
1
+ {"version":3,"file":"conformance-pins.d.ts","sourceRoot":"","sources":["../src/conformance-pins.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,eAAO,MAAM,eAAe,EAAE,eA+C7B,CAAA"}
package/dist/index.js CHANGED
@@ -189183,7 +189183,8 @@ var conformancePins = {
189183
189183
  { code: "BF101", severity: "error", issue: "https://github.com/piconic-ai/barefootjs/issues/2320" }
189184
189184
  ],
189185
189185
  "filter-nested-find-predicate": [{ code: "BF101", severity: "error", issue: "https://github.com/piconic-ai/barefootjs/issues/2320" }],
189186
- "date-method-uncatalogued": [{ code: "BF021", severity: "error", issue: "https://github.com/piconic-ai/barefootjs/issues/2356" }]
189186
+ "date-method-uncatalogued": [{ code: "BF021", severity: "error", issue: "https://github.com/piconic-ai/barefootjs/issues/2356" }],
189187
+ "rich-prop-client-read": [{ code: "BF049", severity: "error", issue: "https://github.com/piconic-ai/barefootjs/issues/2648" }]
189187
189188
  };
189188
189189
  // src/render-divergences.ts
189189
189190
  var renderDivergences = {};
@@ -1,15 +1,10 @@
1
1
  /**
2
- * Render-level divergences against the shared conformance corpus
3
- * (Priority-12 edge-case sweep, #2168): fixtures that COMPILE clean on
4
- * this adapter but whose rendered output diverges from the Hono
5
- * reference on real Text::Xslate.
6
- *
7
- * Consumed by this package's conformance test (its `skipJsx` set is
8
- * derived from these keys, so the skip list and this declaration can't
9
- * drift) and by `packages/compat`, which publishes the entries in the
10
- * fixture-divergences section of `ui/compat.lock.json` — surfaced on
11
- * the docs compatibility-matrix page. Graduating an entry means fixing
12
- * the adapter (or the shared compiler layer) and deleting the line.
2
+ * Fixtures that compile clean on this adapter but render divergent from the
3
+ * Hono reference on real Text::Xslate. The conformance `skipJsx` set and
4
+ * `packages/compat`'s published fixture-divergences both derive from this
5
+ * one object, so the skip list and the declaration can't drift. Keep the
6
+ * file even when the set is empty — the next divergence lands here, not in
7
+ * a re-created file.
13
8
  */
14
9
  import type { RenderDivergences } from '@barefootjs/jsx';
15
10
  export declare const renderDivergences: RenderDivergences;
@@ -1 +1 @@
1
- {"version":3,"file":"render-divergences.d.ts","sourceRoot":"","sources":["../src/render-divergences.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAExD,eAAO,MAAM,iBAAiB,EAAE,iBAM/B,CAAA"}
1
+ {"version":3,"file":"render-divergences.d.ts","sourceRoot":"","sources":["../src/render-divergences.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAExD,eAAO,MAAM,iBAAiB,EAAE,iBAC/B,CAAA"}
package/dist/vite.js CHANGED
@@ -2258,6 +2258,7 @@ var ErrorCodes = {
2258
2258
  COMPONENT_REQUIRED_PROP_MISSING: "BF046",
2259
2259
  JSX_BRANCH_LOCAL_IN_CALLBACK: "BF047",
2260
2260
  SIBLING_COMPONENT_NOT_COMPILED: "BF048",
2261
+ RICH_TYPE_PROP_NOT_HYDRATABLE: "BF049",
2261
2262
  SHARED_PROGRAM_REQUIRED: "BF050",
2262
2263
  WRONG_PACKAGE_IMPORT: "BF051",
2263
2264
  BUILTIN_REQUIRES_IMPORT: "BF054",
@@ -2288,6 +2289,7 @@ var errorMessages = {
2288
2289
  [ErrorCodes.COMPONENT_REQUIRED_PROP_MISSING]: "Built-in component is missing a required prop.",
2289
2290
  [ErrorCodes.JSX_BRANCH_LOCAL_IN_CALLBACK]: "JSX-typed local declared inside an `if`-block cannot be referenced from a callback body (ref / event handler). " + "Render it as a child instead: `<div ref={...}>{local}</div>`.",
2290
2291
  [ErrorCodes.SIBLING_COMPONENT_NOT_COMPILED]: "Referenced component did not compile to a template, so this reference would throw " + "`ReferenceError` at render time. Multi-return JSX dispatch (a `switch` or `if`/`else` " + "chain across multiple JSX-returning branches) cannot compile as a component in a " + `'use client' file. Extract it to a separate non-"use client" file (where it is preserved ` + "verbatim, see #932), or rewrite it as a single-return ternary/conditional chain so the " + "component pipeline can compile it.",
2292
+ [ErrorCodes.RICH_TYPE_PROP_NOT_HYDRATABLE]: "Rich-typed prop cannot cross the bf-p hydration boundary as JSON.",
2291
2293
  [ErrorCodes.SHARED_PROGRAM_REQUIRED]: "Shared ts.Program required for type-based reactivity classification. This source imports a Reactive<T>-branded library (e.g. @barefootjs/form) whose getters cannot be classified by regex alone. Pass `options.program` (built via `createProgramForCorpus`) so the analyzer can resolve the brand through the TypeChecker.",
2292
2294
  [ErrorCodes.WRONG_PACKAGE_IMPORT]: "Import from wrong package.",
2293
2295
  [ErrorCodes.BUILTIN_REQUIRES_IMPORT]: "Built-in <Async> / <Region> must be imported from '@barefootjs/client'. " + "The compiler recognises these tags by their import (not by tag name), " + "so an unimported tag with this name is treated as an undeclared component.",
@@ -2321,6 +2323,8 @@ var HOST_RICH_TYPE_NAMES = new Set([
2321
2323
  "BigInt",
2322
2324
  "Function"
2323
2325
  ]);
2326
+ var JSON_REVIVABLE_RICH_TYPE_NAMES = new Set(["Date", "URL"]);
2327
+ var JSON_UNSAFE_RICH_TYPE_NAMES = new Set([...HOST_RICH_TYPE_NAMES].filter((n) => !JSON_REVIVABLE_RICH_TYPE_NAMES.has(n)));
2324
2328
  function baseTypeName(raw) {
2325
2329
  const idx = raw.indexOf("<");
2326
2330
  return (idx === -1 ? raw : raw.slice(0, idx)).trim();
@@ -1,5 +1,5 @@
1
1
  package BarefootJS::Backend::Xslate;
2
- our $VERSION = "0.31.5";
2
+ our $VERSION = "0.31.7";
3
3
  use strict;
4
4
  use warnings;
5
5
  use utf8;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@barefootjs/xslate",
3
- "version": "0.31.6",
3
+ "version": "0.31.8",
4
4
  "description": "Text::Xslate (Kolon) adapter for BarefootJS — compiles IR to .tx templates and ships the Xslate rendering backend; runs under any PSGI/Plack app",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -55,7 +55,7 @@
55
55
  "directory": "packages/adapter-xslate"
56
56
  },
57
57
  "dependencies": {
58
- "@barefootjs/shared": "0.31.6"
58
+ "@barefootjs/shared": "0.31.8"
59
59
  },
60
60
  "peerDependencies": {
61
61
  "@barefootjs/jsx": ">=0.2.0",
@@ -72,9 +72,9 @@
72
72
  },
73
73
  "devDependencies": {
74
74
  "@barefootjs/adapter-tests": "0.1.0",
75
- "@barefootjs/jsx": "0.31.6",
76
- "@barefootjs/vite": "0.31.6",
77
- "@barefootjs/client": "0.31.6",
75
+ "@barefootjs/jsx": "0.31.8",
76
+ "@barefootjs/vite": "0.31.8",
77
+ "@barefootjs/client": "0.31.8",
78
78
  "typescript": "^5.0.0",
79
79
  "vite": "^6.0.0"
80
80
  }
@@ -1,77 +1,33 @@
1
1
  /**
2
- * Per-fixture build-time contracts for shapes the Xslate adapter
3
- * intentionally refuses to lower. Mirrors mojo's set the lowering
4
- * gates are shared code paths in the ported adapter. Consumed by this
5
- * package's own conformance test (as `expectedDiagnostics`) and by
6
- * `bf compat` (issue-URL attribution).
2
+ * Per-fixture build-time contracts for shapes this adapter intentionally
3
+ * refuses to lower. Declared per adapter, not on the shared fixtures, so
4
+ * adding a new adapter never touches a cross-adapter file. Per-fixture
5
+ * rationale lives on each fixture's docstring
6
+ * (`packages/adapter-tests/fixtures/<id>.ts`) and spec/callback-fidelity.md;
7
+ * comments below only mark where this adapter's set diverges from siblings.
7
8
  */
8
9
 
9
10
  import type { ConformancePins } from '@barefootjs/jsx'
10
11
 
11
12
  export const conformancePins: ConformancePins = {
12
- // Off-subset filter predicate (`typeof`) the compiler can't lower; a
13
- // JS-runtime target runs it, a DSL adapter surfaces BF021 + `/* @client */`.
14
- // See spec/callback-fidelity.md.
15
13
  'filter-typeof-predicate': [{ code: 'BF021', severity: 'error' }],
16
- // Array-builder `.map()` body (imperative `push`-into-array preamble):
17
- // BF021, with a verified `/* @client */` escape — `map-array-builder-
18
- // body-client` (#2613). See that fixture's docstring.
19
14
  'map-array-builder-body': [{ code: 'BF021', severity: 'error' }],
20
15
  'map-array-builder-escaping': [{ code: 'BF021', severity: 'error' }],
21
- // `.fill(value)` mutates the receiver in place — no template lowering
22
- // on any DSL adapter; a JS-runtime target runs it, a DSL adapter
23
- // surfaces BF101 + `/* @client */`. See spec/callback-fidelity.md.
24
16
  'fill-unsupported': [{ code: 'BF101', severity: 'error' }],
25
- // Off-subset `.find()` / `.some()` / `.every()` predicate (`typeof`) the
26
- // compiler can't lower; a JS-runtime target runs it, a DSL adapter
27
- // surfaces BF101 + `/* @client */`. See spec/callback-fidelity.md.
28
17
  'find-typeof-predicate': [{ code: 'BF101', severity: 'error' }],
29
18
  'some-typeof-predicate': [{ code: 'BF101', severity: 'error' }],
30
19
  'every-typeof-predicate': [{ code: 'BF101', severity: 'error' }],
31
- // Off-subset `.reduce()` / `.reduceRight()` body / `.flatMap()`
32
- // projection (`typeof`) the compiler can't lower; a JS-runtime target
33
- // runs it, a DSL adapter surfaces BF101 + `/* @client */`.
34
- // See spec/callback-fidelity.md.
35
20
  'reduce-typeof-body': [{ code: 'BF101', severity: 'error' }],
36
21
  'reduce-right-typeof-body': [{ code: 'BF101', severity: 'error' }],
37
22
  'flatmap-typeof-projection': [{ code: 'BF101', severity: 'error' }],
38
- // JSX-returning `.flatMap()` body carried as structured segments i.e.
39
- // one with STATEMENTS (early returns, consts): a JS runtime executes it
40
- // verbatim; a DSL template runtime can't, so it refuses with BF021 +
41
- // `/* @client */` (pre-gate this emitted an empty loop body — silent
42
- // divergence). A pure PROJECTION body (`flatMap(it => it.tags.map(...))`,
43
- // e.g. the `flatmap-expression-body` fixture) is NOT pinned: it lowers to
44
- // neutral nested-loop IR this adapter templatizes natively.
45
- // See spec/callback-fidelity.md.
23
+ // A pure PROJECTION flatMap body (`flatmap-expression-body`) is NOT pinned
24
+ // it lowers to neutral nested-loop IR this adapter templatizes natively;
25
+ // only the statement-carrying body refuses.
46
26
  'tag-cloud': [{ code: 'BF021', severity: 'error' }],
47
- // A keyed `.map()` row body whose preamble builds a JSX leaf from item
48
- // state (`cells.push(<td>{stateLabel}</td>)`) embedded as `{cells}` — the
49
- // Stage 3 array-builder carrier, jsRuntime-only: a JS runtime runs it
50
- // verbatim (and patches the region on same-key updates, #2389), a DSL
51
- // adapter refuses with BF021 + `/* @client */`. See spec/callback-fidelity.md.
52
27
  'preamble-cells': [{ code: 'BF021', severity: 'error' }],
53
- // `todo-app` / `todo-app-ssr` no longer pinned (#2205) the conformance
54
- // harness now passes `siblingTemplatesRegistered: true` for fixtures with
55
- // sibling `components`, matching `bf build`'s real semantics, so the
56
- // BF103 loop-body cross-template check no longer fires spuriously. (Both
57
- // fixtures are still skipped on this adapter via `render-divergences.ts`
58
- // — #2209 — for an unrelated signal-seeding gap.)
59
- // `static-array-children` no longer pinned (#2208) — `items`'s
60
- // array-literal initializer is now recognized as fully-static
61
- // (`resolveStaticLoopSource`) and inlined as a native Kolon array/hash
62
- // literal in the `for EXPR -> $item` header, the same way a module-scope
63
- // const's value is already seeded.
64
- // `([emoji, users]) => ...` / `([id, t]) => ...` are plain array-index
65
- // (tuple) destructures, no rest — #2087 Phase B's `segments`-walking
66
- // accessor lowers both to `$__bf_item[0]` / `$__bf_item[1]` `: my` locals
67
- // like any other fixed binding, so BF104 no longer fires for either
68
- // fixture. Each now hits a DIFFERENT, pre-existing, orthogonal gap
69
- // instead: the loop array (`entries`) is a function-scope local const
70
- // with a computed initializer (`Object.entries(props.x ?? {}).filter(...)`)
71
- // that the adapter can't bind as a template variable — see the dedicated
72
- // `arrayConst` BF101 check in `renderLoop`. This was always true; it was
73
- // simply unreachable before because BF104 refused the destructure shape
74
- // first.
28
+ // Refused for the COMPUTED loop array (`const entries = Object.entries(...)
29
+ // .filter(...)`), not the destructure param (that lowers, #2087) — loud
30
+ // BF101 instead of silently iterating an unbound name zero times.
75
31
  'static-array-from-props': [
76
32
  {
77
33
  code: 'BF101',
@@ -79,10 +35,7 @@ export const conformancePins: ConformancePins = {
79
35
  issue: 'https://github.com/piconic-ai/barefootjs/issues/2321',
80
36
  },
81
37
  ],
82
- // The BF101 above fires; BF104 no longer does (see above), and BF103
83
- // (sibling-imported `<Tag>` child component in the loop body) no longer
84
- // does either now that the conformance harness passes
85
- // `siblingTemplatesRegistered: true` (#2205).
38
+ // No BF103 pin: the harness registers sibling templates (#2205).
86
39
  'static-array-from-props-with-component': [
87
40
  {
88
41
  code: 'BF101',
@@ -90,84 +43,17 @@ export const conformancePins: ConformancePins = {
90
43
  issue: 'https://github.com/piconic-ai/barefootjs/issues/2321',
91
44
  },
92
45
  ],
93
- // #1310 / #2087: rest destructure in .map() callback. All four shapes now
94
- // lower via #2087 Phase B's `segments`-walking accessor:
95
- // - object-rest read via member access (`rest-destructure-object-in-map`):
96
- // `$bf.omit($__bf_item, [...exclude keys...])`, `$rest.flag` reads the
97
- // residual hashref.
98
- // - object-rest spread onto the root element
99
- // (`rest-destructure-object-spread-in-map`): same `$bf.omit(...)`
100
- // residual, forwarded via the existing `$bf.spread_attrs($rest)` path.
101
- // - array-rest (`rest-destructure-array-in-map`): `$bf.slice($__bf_item,
102
- // N, nil)` — the same runtime helper `.slice()` JS-method calls use.
103
- // - nested rest inside an object pattern (`rest-destructure-nested-in-map`):
104
- // the parent-prefix accessor (`$__bf_item.cells`) feeds the same
105
- // `$bf.slice(...)` call.
106
- // None of these are pinned here anymore.
107
- // (button/kbd graduated: the site/ui Button/Kbd `<Slot>` `{...props}` /
108
- // `{...children.props}` component-spread now lowers via Kolon's builtin
109
- // `.merge(...)` method chain — see `xslate-adapter.ts`'s
110
- // `renderComponent` — instead of refusing with BF101, so these two no
111
- // longer need a pin here.)
112
- // #1467 demo-corpus context providers (`radio-group`, `select`,
113
- // `dropdown-menu`, `combobox`, `command`) are no longer pinned — an
114
- // object-literal provider value (`{ value: currentValue,
115
- // onValueChange: (v) => {…} }`) lowers to a Kolon hashref via
116
- // `parseProviderObjectLiteral` (#1897): getter members snapshot
117
- // their body's SSR value, handler / function-shaped members lower
118
- // to `nil`. The command demo's `ref={(el) => {…}}` function prop on
119
- // an imported component is skipped at SSR like `on*` handlers.
120
- //
121
- // #1467 Phase 2e: `data-table` is no longer pinned here — it
122
- // compiles clean now (`selected()[index]` → `index-access`,
123
- // `.toFixed(2)` → `$bf.to_fixed`, `/* @client */` memo SSR-folded)
124
- // and renders to Hono parity on real Text::Xslate. The keyed-loop
125
- // scope-ID divergence (#1896) was fixed by the body-children
126
- // `inLoop` reset (loop-item children get `_bf_slot`); data-table is
127
- // off `skipJsx` entirely and only kept in `skipMarkerConformance`
128
- // below for the shared `/* @client */` keyed-map slot-id elision
129
- // contract (same as `todo-app`), not a render or BF101 gap.
130
- // `style-3-signals` / `style-object-dynamic` no longer pinned — a
131
- // `style={{ … }}` object literal now lowers to a CSS string with dynamic
132
- // values interpolated (`background-color:<: $color :>;padding:8px`) via
133
- // `tryLowerStyleObject` (#1322).
134
- // (`tagged-template-classname` graduated by #2092 — the tag resolves
135
- // through the interleave-tag catalogue and desugars to an untagged
136
- // template literal, so it lowers like any other className template.)
137
- // #2038: a filter predicate whose body contains a NESTED callback call
138
- // (`t => !picked().some(p => …)` / `t => picked().find(p => …)`). Kolon
139
- // has no inline `grep` form, so `XslateFilterEmitter.callbackMethod` used
140
- // to degrade the inner call to its receiver, silently changing predicate
141
- // semantics — the compiler is loud instead of lossy. (Mojo is pinned only
142
- // for the `.find` variant: it lowers a nested `.some` to a real inline
143
- // Perl `grep`.) The `/* @client */` twin
144
- // (`filter-nested-callback-predicate-client`) has no pin here: it must
145
- // render clean on every adapter, which asserts the suppression contract.
146
- // Faithful lowering tracked: https://github.com/piconic-ai/barefootjs/issues/2320 (successor to #2038)
46
+ // #2038: Kolon has no inline `grep` form (unlike mojo, which lowers a
47
+ // nested `.some` to a real inline Perl `grep`) — loud BF101 instead of the
48
+ // old silent degradation to the receiver.
147
49
  'filter-nested-callback-predicate': [
148
50
  { code: 'BF101', severity: 'error', issue: 'https://github.com/piconic-ai/barefootjs/issues/2320' },
149
51
  ],
150
52
  'filter-nested-find-predicate': [{ code: 'BF101', severity: 'error', issue: 'https://github.com/piconic-ai/barefootjs/issues/2320' }],
151
- // NB: TOP-LEVEL `.find` / `.findIndex` / `.findLast` / `.findLastIndex`
152
- // (text position) are NOT pinned here — unlike mojo (which refuses them),
153
- // Xslate lowers them to `$bf.find` / `find_index` / `find_last` /
154
- // `find_last_index` via the same Kolon-lambda mechanism as `.filter` /
155
- // `.every` / `.some`, so they render. Only the NESTED-in-a-predicate form
156
- // above is refused (#2038).
157
- // `array-map-function-reference` no longer pinned — a bare-identifier
158
- // `.map(format)` callback now resolves one hop to its declaration
159
- // (`resolveCallbackMethodFunctionReferences`, #2206), the same mechanism
160
- // #2090 established for `.sort(fnref)`.
161
- // `dangerous-inner-html` no longer pinned — a compile-time string-literal
162
- // `dangerouslySetInnerHTML={{ __html: '...' }}` is spliced directly into
163
- // the template as trusted raw text (`resolveDangerousInnerHtml`, #2207).
164
- // A dynamic/signal-derived value now lowers through Kolon's `mark_raw`
165
- // filter (#2319) — `dangerous-inner-html-dynamic` is no longer pinned and
166
- // renders to Hono parity, same as the static case.
167
- // #2273: a method call on a prop typed as a built-in host rich type
168
- // (Date, Map, …) has no catalogued lowering in any adapter — this is a
169
- // compiler-level refusal (`checkRichTypeMethodCalls`, wired ahead of
170
- // `adapter.generate()`), not an adapter-specific gap, so it is pinned
171
- // identically across every adapter package including Hono.
53
+ // Top-level `.find`/`.findIndex`/`.findLast`/`.findLastIndex` are NOT
54
+ // pinned — unlike mojo (which refuses them), Xslate lowers them via the
55
+ // same Kolon-lambda mechanism as `.filter`/`.some`. Only the nested form
56
+ // above is refused.
172
57
  'date-method-uncatalogued': [{ code: 'BF021', severity: 'error', issue: 'https://github.com/piconic-ai/barefootjs/issues/2356' }],
58
+ 'rich-prop-client-read': [{ code: 'BF049', severity: 'error', issue: 'https://github.com/piconic-ai/barefootjs/issues/2648' }],
173
59
  }
@@ -1,23 +1,13 @@
1
1
  /**
2
- * Render-level divergences against the shared conformance corpus
3
- * (Priority-12 edge-case sweep, #2168): fixtures that COMPILE clean on
4
- * this adapter but whose rendered output diverges from the Hono
5
- * reference on real Text::Xslate.
6
- *
7
- * Consumed by this package's conformance test (its `skipJsx` set is
8
- * derived from these keys, so the skip list and this declaration can't
9
- * drift) and by `packages/compat`, which publishes the entries in the
10
- * fixture-divergences section of `ui/compat.lock.json` — surfaced on
11
- * the docs compatibility-matrix page. Graduating an entry means fixing
12
- * the adapter (or the shared compiler layer) and deleting the line.
2
+ * Fixtures that compile clean on this adapter but render divergent from the
3
+ * Hono reference on real Text::Xslate. The conformance `skipJsx` set and
4
+ * `packages/compat`'s published fixture-divergences both derive from this
5
+ * one object, so the skip list and the declaration can't drift. Keep the
6
+ * file even when the set is empty — the next divergence lands here, not in
7
+ * a re-created file.
13
8
  */
14
9
 
15
10
  import type { RenderDivergences } from '@barefootjs/jsx'
16
11
 
17
12
  export const renderDivergences: RenderDivergences = {
18
- // `todo-app` / `todo-app-ssr` no longer diverge (#2209) — the shared
19
- // `evaluateSignalInit` (`@barefootjs/jsx`, sandboxed real-JS evaluation
20
- // instead of a fixed regex-shape catalogue) now correctly seeds `todos`
21
- // from `(props.initialTodos ?? []).map(t => ({ ...t, editing: false }))`.
22
-
23
13
  }