@barefootjs/erb 0.17.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 (68) hide show
  1. package/dist/adapter/analysis/component-tree.d.ts +24 -0
  2. package/dist/adapter/analysis/component-tree.d.ts.map +1 -0
  3. package/dist/adapter/boolean-result.d.ts +66 -0
  4. package/dist/adapter/boolean-result.d.ts.map +1 -0
  5. package/dist/adapter/emit-context.d.ts +107 -0
  6. package/dist/adapter/emit-context.d.ts.map +1 -0
  7. package/dist/adapter/erb-adapter.d.ts +374 -0
  8. package/dist/adapter/erb-adapter.d.ts.map +1 -0
  9. package/dist/adapter/expr/array-method.d.ts +87 -0
  10. package/dist/adapter/expr/array-method.d.ts.map +1 -0
  11. package/dist/adapter/expr/emitters.d.ts +102 -0
  12. package/dist/adapter/expr/emitters.d.ts.map +1 -0
  13. package/dist/adapter/expr/operand.d.ts +34 -0
  14. package/dist/adapter/expr/operand.d.ts.map +1 -0
  15. package/dist/adapter/index.d.ts +6 -0
  16. package/dist/adapter/index.d.ts.map +1 -0
  17. package/dist/adapter/index.js +189154 -0
  18. package/dist/adapter/lib/constants.d.ts +25 -0
  19. package/dist/adapter/lib/constants.d.ts.map +1 -0
  20. package/dist/adapter/lib/ir-scope.d.ts +27 -0
  21. package/dist/adapter/lib/ir-scope.d.ts.map +1 -0
  22. package/dist/adapter/lib/ruby-naming.d.ts +65 -0
  23. package/dist/adapter/lib/ruby-naming.d.ts.map +1 -0
  24. package/dist/adapter/lib/types.d.ts +28 -0
  25. package/dist/adapter/lib/types.d.ts.map +1 -0
  26. package/dist/adapter/memo/seed.d.ts +35 -0
  27. package/dist/adapter/memo/seed.d.ts.map +1 -0
  28. package/dist/adapter/props/prop-classes.d.ts +50 -0
  29. package/dist/adapter/props/prop-classes.d.ts.map +1 -0
  30. package/dist/adapter/spread/spread-codegen.d.ts +63 -0
  31. package/dist/adapter/spread/spread-codegen.d.ts.map +1 -0
  32. package/dist/adapter/value/parsed-literal.d.ts +21 -0
  33. package/dist/adapter/value/parsed-literal.d.ts.map +1 -0
  34. package/dist/build.d.ts +28 -0
  35. package/dist/build.d.ts.map +1 -0
  36. package/dist/build.js +189174 -0
  37. package/dist/conformance-pins.d.ts +13 -0
  38. package/dist/conformance-pins.d.ts.map +1 -0
  39. package/dist/index.d.ts +9 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +189172 -0
  42. package/lib/barefoot_js/backend/erb.rb +123 -0
  43. package/lib/barefoot_js/dev_reload.rb +159 -0
  44. package/lib/barefoot_js/evaluator.rb +714 -0
  45. package/lib/barefoot_js/search_params.rb +63 -0
  46. package/lib/barefoot_js.rb +1155 -0
  47. package/package.json +67 -0
  48. package/src/__tests__/erb-adapter.test.ts +298 -0
  49. package/src/adapter/analysis/component-tree.ts +122 -0
  50. package/src/adapter/boolean-result.ts +157 -0
  51. package/src/adapter/emit-context.ts +119 -0
  52. package/src/adapter/erb-adapter.ts +1768 -0
  53. package/src/adapter/expr/array-method.ts +424 -0
  54. package/src/adapter/expr/emitters.ts +629 -0
  55. package/src/adapter/expr/operand.ts +55 -0
  56. package/src/adapter/index.ts +6 -0
  57. package/src/adapter/lib/constants.ts +37 -0
  58. package/src/adapter/lib/ir-scope.ts +51 -0
  59. package/src/adapter/lib/ruby-naming.ts +127 -0
  60. package/src/adapter/lib/types.ts +31 -0
  61. package/src/adapter/memo/seed.ts +75 -0
  62. package/src/adapter/props/prop-classes.ts +89 -0
  63. package/src/adapter/spread/spread-codegen.ts +176 -0
  64. package/src/adapter/value/parsed-literal.ts +29 -0
  65. package/src/build.ts +37 -0
  66. package/src/conformance-pins.ts +100 -0
  67. package/src/index.ts +9 -0
  68. package/src/test-render.ts +668 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Per-fixture build-time contracts for shapes the ERB adapter
3
+ * intentionally refuses to lower. Mirrors mojo's set — the lowering
4
+ * gates (`isLowerableLoopDestructure`, `collectImportedLoopChild
5
+ * ComponentErrors`, `refuseUnsupportedAttrExpression`, the #2038
6
+ * nested-higher-order-callback gate) are shared code in `@barefootjs/jsx`
7
+ * that every EP/ERB-family adapter reuses verbatim. Consumed by this
8
+ * package's own conformance test (as `expectedDiagnostics`) and by
9
+ * `bf compat` (issue-URL attribution).
10
+ */
11
+
12
+ import type { ConformancePins } from '@barefootjs/jsx'
13
+
14
+ export const conformancePins: ConformancePins = {
15
+ // Sibling-imported child component in a loop body: emits a
16
+ // cross-template call needing separate registration. BF103 makes
17
+ // the requirement loud (same as mojo).
18
+ 'static-array-children': [{ code: 'BF103', severity: 'error' }],
19
+ // TodoApp / TodoAppSSR import `TodoItem` from a sibling file and
20
+ // call it inside a keyed `.map`. Same BF103 surface as the
21
+ // synthetic `static-array-children` above — pinned at adapter
22
+ // level so the shared-component corpus stays adapter-neutral.
23
+ 'todo-app': [{ code: 'BF103', severity: 'error' }],
24
+ 'todo-app-ssr': [{ code: 'BF103', severity: 'error' }],
25
+ // `static-array-from-props` / `static-array-from-props-with-component`:
26
+ // the `.map(([emoji, users]) => …)` / `.map(([id, t]) => …)` callback is
27
+ // a plain array-index destructure (the `.filter(...)` runs on a
28
+ // separate `const entries = …` statement, so `loop.filterPredicate` is
29
+ // unset — this is not the `.filter().map(destructure)` chain
30
+ // `isLowerableLoopDestructure` still refuses), and #2087 Phase B's
31
+ // segments-walking accessor DOES lower it natively. But both fixtures'
32
+ // loop array is that same `entries` — a component-scope `const`
33
+ // computed from `Object.entries(props.x).filter(...)`, a runtime
34
+ // expression the ERB adapter has no mechanism to evaluate at SSR
35
+ // render time (only a pure-literal or module-string const is ever
36
+ // inlined; a computed const falls through to an unseeded `v[:entries]`
37
+ // and crashes). This is a pre-existing, orthogonal gap the widened
38
+ // destructure gate merely exposes — it reproduces identically with a
39
+ // non-destructured param (verified) — not a destructure-lowering
40
+ // limitation, so it is NOT part of #2087's scope. Tracked as its own
41
+ // gap under https://github.com/piconic-ai/barefootjs/issues/2087;
42
+ // pinned honestly as BF101 (the adapter's own check, see `renderLoop`'s
43
+ // "Loop array is a bare identifier..." comment) rather than faked as
44
+ // BF104 or silently producing broken Ruby.
45
+ 'static-array-from-props': [
46
+ { code: 'BF101', severity: 'error', issue: 'https://github.com/piconic-ai/barefootjs/issues/2087' },
47
+ ],
48
+ 'static-array-from-props-with-component': [
49
+ { code: 'BF103', severity: 'error' },
50
+ { code: 'BF101', severity: 'error', issue: 'https://github.com/piconic-ai/barefootjs/issues/2087' },
51
+ ],
52
+ // #2087 Phase B: `isLowerableLoopDestructure` now admits every fixed-
53
+ // binding shape (any field/index depth — `destructure-array-index-in-map`,
54
+ // `destructure-nested-object-in-map`), array-rest (`rest-destructure-
55
+ // array-in-map`, native `bf.slice`), and object-rest whose every use is a
56
+ // member read or a `{...rest}` spread onto an intrinsic element
57
+ // (`rest-destructure-object-in-map`, `rest-destructure-object-spread-in-
58
+ // map`, `rest-destructure-nested-in-map` — native `Hash#except` builds a
59
+ // true residual Hash). None of the six destructure-in-map fixtures are
60
+ // pinned here any more; all render to Hono parity. See
61
+ // `rubyAccessorFromSegments` / the object-rest-in-loop branch in
62
+ // `erb-adapter.ts`'s `renderLoop`.
63
+ // #2038: a filter predicate containing a nested `.find(...)` callback.
64
+ // `find*` returns an element, not a boolean — there is no inline
65
+ // predicate form, and the emitter used to silently degrade the call to
66
+ // its receiver. The nested `.some` sibling
67
+ // (`filter-nested-callback-predicate`) is NOT pinned: like mojo, ERB
68
+ // lowers it to a real inline Ruby block predicate and must render to
69
+ // Hono parity instead.
70
+ // https://github.com/piconic-ai/barefootjs/issues/2038
71
+ 'filter-nested-find-predicate': [
72
+ { code: 'BF101', severity: 'error', issue: 'https://github.com/piconic-ai/barefootjs/issues/2038' },
73
+ ],
74
+ // #1467 demo-corpus context providers (`radio-group`, `accordion`,
75
+ // `dialog`, `popover`, `select`, `dropdown-menu`, `combobox`,
76
+ // `command`) are NOT pinned — an object-literal provider value lowers
77
+ // to a Ruby Hash via `parseProviderObjectLiteral` (#1897): getter
78
+ // members snapshot their body's SSR value, handler / function-shaped
79
+ // members lower to `nil`.
80
+ //
81
+ // `button` / `kbd` are NOT pinned (unlike xslate): the auto-inferred
82
+ // `<Slot>` sibling's `{...props}` / `{...children.props}` spread onto
83
+ // its root element lowers via Ruby's native `**hash` double-splat in
84
+ // the component-invocation Hash literal — the same shape mojo's EP
85
+ // `%{$props}` flatten already handles.
86
+ //
87
+ // `data-table` is NOT pinned here either — it compiles clean
88
+ // (`selected()[index]` → `index-access`, `.toFixed(2)` →
89
+ // `bf.to_fixed`, `/* @client */` memo SSR-folded) and renders to Hono
90
+ // parity. It stays in `skipMarkerConformance` below for the shared
91
+ // `/* @client */` keyed-map slot-id elision contract only (same as
92
+ // `todo-app`), not a render or BF101 gap.
93
+ //
94
+ // #2073 follow-up: a function-reference `.map(format)` callback has no
95
+ // arrow body to serialize — not a CALLBACK_METHODS shape — so the
96
+ // UNSUPPORTED_METHODS gate (shared `@barefootjs/jsx` code) refuses it
97
+ // with BF101 rather than emitting a broken template. Same pin as
98
+ // mojo/xslate.
99
+ 'array-map-function-reference': [{ code: 'BF101', severity: 'error' }],
100
+ }
package/src/index.ts ADDED
@@ -0,0 +1,9 @@
1
+ /**
2
+ * BarefootJS ERB (Embedded Ruby) Template Adapter
3
+ *
4
+ * Generates ERB template files (.erb) from BarefootJS IR.
5
+ */
6
+
7
+ export { ErbAdapter, erbAdapter } from './adapter/index.ts'
8
+ export type { ErbAdapterOptions } from './adapter/index.ts'
9
+ export { conformancePins } from './conformance-pins.ts'