@barefootjs/mojolicious 0.19.0 → 0.20.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.
@@ -1 +1 @@
1
- {"version":3,"file":"array-method.d.ts","sourceRoot":"","sources":["../../../src/adapter/expr/array-method.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,SAAS,EACV,MAAM,iBAAiB,CAAA;AAExB;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,UAAU,EAAE,EAClB,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,GAC9B,MAAM,CAgOR;AA6BD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,GAC9B,MAAM,GAAG,IAAI,CAOf;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,GAAG,OAAO,EAC3B,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,GAC9B,MAAM,GAAG,IAAI,CAmBf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,UAAU,EACrB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,EAC/B,OAAO,CAAC,EAAE,OAAO,GAChB,MAAM,GAAG,IAAI,CAMf;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,GAC9B,MAAM,GAAG,IAAI,CAKf;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,GAC9B,MAAM,GAAG,IAAI,CAKf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,GAAG,MAAM,CAaxE;AAKD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,EACvC,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,GAC9B,MAAM,CAoBR"}
1
+ {"version":3,"file":"array-method.d.ts","sourceRoot":"","sources":["../../../src/adapter/expr/array-method.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,cAAc,EACd,SAAS,EACV,MAAM,iBAAiB,CAAA;AAExB;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,UAAU,EAAE,EAClB,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,GAC9B,MAAM,CAsOR;AA6BD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,GAC9B,MAAM,GAAG,IAAI,CAOf;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,MAAM,GAAG,OAAO,EAC3B,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,GAC9B,MAAM,GAAG,IAAI,CAmBf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,UAAU,EACrB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,EAC/B,OAAO,CAAC,EAAE,OAAO,GAChB,MAAM,GAAG,IAAI,CAMf;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,GAC9B,MAAM,GAAG,IAAI,CAKf;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,GAC9B,MAAM,GAAG,IAAI,CAKf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,GAAG,MAAM,CAaxE;AAKD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,EACvC,IAAI,EAAE,CAAC,CAAC,EAAE,UAAU,KAAK,MAAM,GAC9B,MAAM,CAoBR"}
@@ -1 +1 @@
1
- {"version":3,"file":"emitters.d.ts","sourceRoot":"","sources":["../../../src/adapter/expr/emitters.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"emitters.d.ts","sourceRoot":"","sources":["../../../src/adapter/expr/emitters.ts"],"names":[],"mappings":"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"}
@@ -93,7 +93,8 @@ var MOJO_TEMPLATE_PRIMITIVES = {
93
93
  "Math.round": { arity: 1, emit: (args) => `bf->round(${args[0]})` },
94
94
  "Math.min": { arity: 2, emit: (args) => `bf->min(${args[0]}, ${args[1]})` },
95
95
  "Math.max": { arity: 2, emit: (args) => `bf->max(${args[0]}, ${args[1]})` },
96
- "Math.abs": { arity: 1, emit: (args) => `bf->abs(${args[0]})` }
96
+ "Math.abs": { arity: 1, emit: (args) => `bf->abs(${args[0]})` },
97
+ isValidElement: { arity: 1, emit: (args) => `bf->is_element(${args[0]})` }
97
98
  };
98
99
  var MOJO_PRIMITIVE_EMIT_MAP = Object.fromEntries(Object.entries(MOJO_TEMPLATE_PRIMITIVES).map(([k, v]) => [k, v.emit]));
99
100
 
@@ -148,7 +149,7 @@ function renderArrayMethod(method, object, args, emit) {
148
149
  case "join": {
149
150
  const obj = emit(object);
150
151
  const sep = args.length >= 1 ? emit(args[0]) : `','`;
151
- return `join(${sep}, @{${obj}})`;
152
+ return `bf->join(${obj}, ${sep})`;
152
153
  }
153
154
  case "includes": {
154
155
  const obj = emit(object);
@@ -586,7 +587,7 @@ class MojoTopLevelEmitter {
586
587
  const isStr = (e) => isStringTypedOperand2(e, (n) => this.ctx._isStringValueName(n));
587
588
  const isStringReceiver = isStr(object) || object.kind === "identifier" && this.ctx._isStringValueName(object.name);
588
589
  if (isStringReceiver)
589
- return `length(${obj})`;
590
+ return `bf->length(${obj})`;
590
591
  return `scalar(@{${obj}})`;
591
592
  }
592
593
  return `${obj}->{${property}}`;
@@ -1709,10 +1710,11 @@ ${children}`;
1709
1710
  if (e.kind === "expr" && !isSupported(parseExpression2(e.expr)).supported)
1710
1711
  return null;
1711
1712
  }
1712
- return entries.map((e) => e.kind === "literal" ? `${this.escapeAttrText(e.cssKey)}:${this.escapeAttrText(e.value)}` : `${this.escapeAttrText(e.cssKey)}:<%= ${this.convertExpressionToPerl(e.expr)} %>`).join(";");
1713
- }
1714
- escapeAttrText(s) {
1715
- return s.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
1713
+ const args = entries.flatMap((e) => [
1714
+ `'${e.cssKey.replace(/[\\']/g, (m) => `\\${m}`)}'`,
1715
+ e.kind === "literal" ? `'${e.value.replace(/[\\']/g, (m) => `\\${m}`)}'` : this.convertExpressionToPerl(e.expr)
1716
+ ]);
1717
+ return `<%== bf->style_object(${args.join(", ")}) %>`;
1716
1718
  }
1717
1719
  renderAttributes(element) {
1718
1720
  const parts = [];
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/adapter/lib/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAUlE,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,CAG5E,CAAA"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/adapter/lib/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAkBlE,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,CAG5E,CAAA"}
@@ -268,15 +268,18 @@ export declare class MojoAdapter extends BaseAdapter implements IRNodeEmitter<Mo
268
268
  */
269
269
  private readonly elementAttrEmitter;
270
270
  /**
271
- * Lower a `style={{ … }}` object literal to a CSS string with dynamic values
272
- * interpolated as EP actions, e.g. `{ backgroundColor: color, padding: '8px' }`
273
- * → `background-color:<%= $color %>;padding:8px`. Returns null when the shape
274
- * is unsupported or any value can't be lowered (caller then falls through to
271
+ * Lower a `style={{ … }}` object literal to a `bf->style_object(...)` call,
272
+ * e.g. `{ backgroundColor: color }` → `<%== bf->style_object('background-color',
273
+ * $color) %>`. `style_object` is the single oracle-matching sanitizer
274
+ * (ported from Hono's `hasUnsafeStyleValue`, shared with the Xslate
275
+ * adapter via `BarefootJS.pm`): it drops any key:value pair whose value
276
+ * could break out of a CSS declaration and HTML-escapes the rest, so the
277
+ * call uses `<%== %>` (raw) rather than `<%= %>` to avoid double-encoding
278
+ * the already-safe result (#2261). Returns null when the shape is
279
+ * unsupported or any value can't be lowered (caller then falls through to
275
280
  * the BF101 refusal). (#1322)
276
281
  */
277
282
  private tryLowerStyleObject;
278
- /** HTML-attribute escape for static text inlined into a `"..."` attribute. */
279
- private escapeAttrText;
280
283
  private renderAttributes;
281
284
  renderScopeMarker(_instanceIdExpr: string): string;
282
285
  renderSlotMarker(slotId: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"mojo-adapter.d.ts","sourceRoot":"","sources":["../../src/adapter/mojo-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mojo-adapter.d.ts","sourceRoot":"","sources":["../../src/adapter/mojo-adapter.ts"],"names":[],"mappings":"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"}
package/dist/build.js CHANGED
@@ -93,7 +93,8 @@ var MOJO_TEMPLATE_PRIMITIVES = {
93
93
  "Math.round": { arity: 1, emit: (args) => `bf->round(${args[0]})` },
94
94
  "Math.min": { arity: 2, emit: (args) => `bf->min(${args[0]}, ${args[1]})` },
95
95
  "Math.max": { arity: 2, emit: (args) => `bf->max(${args[0]}, ${args[1]})` },
96
- "Math.abs": { arity: 1, emit: (args) => `bf->abs(${args[0]})` }
96
+ "Math.abs": { arity: 1, emit: (args) => `bf->abs(${args[0]})` },
97
+ isValidElement: { arity: 1, emit: (args) => `bf->is_element(${args[0]})` }
97
98
  };
98
99
  var MOJO_PRIMITIVE_EMIT_MAP = Object.fromEntries(Object.entries(MOJO_TEMPLATE_PRIMITIVES).map(([k, v]) => [k, v.emit]));
99
100
 
@@ -148,7 +149,7 @@ function renderArrayMethod(method, object, args, emit) {
148
149
  case "join": {
149
150
  const obj = emit(object);
150
151
  const sep = args.length >= 1 ? emit(args[0]) : `','`;
151
- return `join(${sep}, @{${obj}})`;
152
+ return `bf->join(${obj}, ${sep})`;
152
153
  }
153
154
  case "includes": {
154
155
  const obj = emit(object);
@@ -586,7 +587,7 @@ class MojoTopLevelEmitter {
586
587
  const isStr = (e) => isStringTypedOperand2(e, (n) => this.ctx._isStringValueName(n));
587
588
  const isStringReceiver = isStr(object) || object.kind === "identifier" && this.ctx._isStringValueName(object.name);
588
589
  if (isStringReceiver)
589
- return `length(${obj})`;
590
+ return `bf->length(${obj})`;
590
591
  return `scalar(@{${obj}})`;
591
592
  }
592
593
  return `${obj}->{${property}}`;
@@ -1709,10 +1710,11 @@ ${children}`;
1709
1710
  if (e.kind === "expr" && !isSupported(parseExpression2(e.expr)).supported)
1710
1711
  return null;
1711
1712
  }
1712
- return entries.map((e) => e.kind === "literal" ? `${this.escapeAttrText(e.cssKey)}:${this.escapeAttrText(e.value)}` : `${this.escapeAttrText(e.cssKey)}:<%= ${this.convertExpressionToPerl(e.expr)} %>`).join(";");
1713
- }
1714
- escapeAttrText(s) {
1715
- return s.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
1713
+ const args = entries.flatMap((e) => [
1714
+ `'${e.cssKey.replace(/[\\']/g, (m) => `\\${m}`)}'`,
1715
+ e.kind === "literal" ? `'${e.value.replace(/[\\']/g, (m) => `\\${m}`)}'` : this.convertExpressionToPerl(e.expr)
1716
+ ]);
1717
+ return `<%== bf->style_object(${args.join(", ")}) %>`;
1716
1718
  }
1717
1719
  renderAttributes(element) {
1718
1720
  const parts = [];
@@ -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,eAmI7B,CAAA"}
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,eAyI7B,CAAA"}
package/dist/index.js CHANGED
@@ -93,7 +93,8 @@ var MOJO_TEMPLATE_PRIMITIVES = {
93
93
  "Math.round": { arity: 1, emit: (args) => `bf->round(${args[0]})` },
94
94
  "Math.min": { arity: 2, emit: (args) => `bf->min(${args[0]}, ${args[1]})` },
95
95
  "Math.max": { arity: 2, emit: (args) => `bf->max(${args[0]}, ${args[1]})` },
96
- "Math.abs": { arity: 1, emit: (args) => `bf->abs(${args[0]})` }
96
+ "Math.abs": { arity: 1, emit: (args) => `bf->abs(${args[0]})` },
97
+ isValidElement: { arity: 1, emit: (args) => `bf->is_element(${args[0]})` }
97
98
  };
98
99
  var MOJO_PRIMITIVE_EMIT_MAP = Object.fromEntries(Object.entries(MOJO_TEMPLATE_PRIMITIVES).map(([k, v]) => [k, v.emit]));
99
100
 
@@ -148,7 +149,7 @@ function renderArrayMethod(method, object, args, emit) {
148
149
  case "join": {
149
150
  const obj = emit(object);
150
151
  const sep = args.length >= 1 ? emit(args[0]) : `','`;
151
- return `join(${sep}, @{${obj}})`;
152
+ return `bf->join(${obj}, ${sep})`;
152
153
  }
153
154
  case "includes": {
154
155
  const obj = emit(object);
@@ -586,7 +587,7 @@ class MojoTopLevelEmitter {
586
587
  const isStr = (e) => isStringTypedOperand2(e, (n) => this.ctx._isStringValueName(n));
587
588
  const isStringReceiver = isStr(object) || object.kind === "identifier" && this.ctx._isStringValueName(object.name);
588
589
  if (isStringReceiver)
589
- return `length(${obj})`;
590
+ return `bf->length(${obj})`;
590
591
  return `scalar(@{${obj}})`;
591
592
  }
592
593
  return `${obj}->{${property}}`;
@@ -1709,10 +1710,11 @@ ${children}`;
1709
1710
  if (e.kind === "expr" && !isSupported(parseExpression2(e.expr)).supported)
1710
1711
  return null;
1711
1712
  }
1712
- return entries.map((e) => e.kind === "literal" ? `${this.escapeAttrText(e.cssKey)}:${this.escapeAttrText(e.value)}` : `${this.escapeAttrText(e.cssKey)}:<%= ${this.convertExpressionToPerl(e.expr)} %>`).join(";");
1713
- }
1714
- escapeAttrText(s) {
1715
- return s.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
1713
+ const args = entries.flatMap((e) => [
1714
+ `'${e.cssKey.replace(/[\\']/g, (m) => `\\${m}`)}'`,
1715
+ e.kind === "literal" ? `'${e.value.replace(/[\\']/g, (m) => `\\${m}`)}'` : this.convertExpressionToPerl(e.expr)
1716
+ ]);
1717
+ return `<%== bf->style_object(${args.join(", ")}) %>`;
1716
1718
  }
1717
1719
  renderAttributes(element) {
1718
1720
  const parts = [];
@@ -1910,7 +1912,8 @@ var conformancePins = {
1910
1912
  "filter-nested-find-predicate": [
1911
1913
  { code: "BF101", severity: "error", issue: "https://github.com/piconic-ai/barefootjs/issues/2038" }
1912
1914
  ],
1913
- "dangerous-inner-html-dynamic": [{ code: "BF101", severity: "error", issue: "https://github.com/piconic-ai/barefootjs/issues/2215" }]
1915
+ "dangerous-inner-html-dynamic": [{ code: "BF101", severity: "error", issue: "https://github.com/piconic-ai/barefootjs/issues/2215" }],
1916
+ "date-method-uncatalogued": [{ code: "BF021", severity: "error", issue: "https://github.com/piconic-ai/barefootjs/issues/2274" }]
1914
1917
  };
1915
1918
  // src/render-divergences.ts
1916
1919
  var renderDivergences = {};
@@ -1,5 +1,5 @@
1
1
  package BarefootJS::Backend::Mojo;
2
- our $VERSION = "0.18.7";
2
+ our $VERSION = "0.19.1";
3
3
  use Mojo::Base -base, -signatures;
4
4
 
5
5
  use Mojo::ByteStream qw(b);
@@ -1,5 +1,5 @@
1
1
  package Mojolicious::Plugin::BarefootJS::DevReload;
2
- our $VERSION = "0.18.7";
2
+ our $VERSION = "0.19.1";
3
3
  use Mojo::Base 'Mojolicious::Plugin', -signatures;
4
4
 
5
5
  =head1 NAME
@@ -1,5 +1,5 @@
1
1
  package Mojolicious::Plugin::BarefootJS;
2
- our $VERSION = "0.18.7";
2
+ our $VERSION = "0.19.1";
3
3
  use Mojo::Base 'Mojolicious::Plugin', -signatures;
4
4
 
5
5
  use Mojo::File qw(path);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@barefootjs/mojolicious",
3
- "version": "0.19.0",
3
+ "version": "0.20.0",
4
4
  "description": "Mojolicious EP template adapter for BarefootJS - generates .html.ep files from IR",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -52,7 +52,7 @@
52
52
  "directory": "packages/adapter-mojolicious"
53
53
  },
54
54
  "dependencies": {
55
- "@barefootjs/shared": "0.19.0"
55
+ "@barefootjs/shared": "0.20.0"
56
56
  },
57
57
  "peerDependencies": {
58
58
  "@barefootjs/jsx": ">=0.2.0",
@@ -60,6 +60,6 @@
60
60
  },
61
61
  "devDependencies": {
62
62
  "@barefootjs/adapter-tests": "0.1.0",
63
- "@barefootjs/jsx": "0.19.0"
63
+ "@barefootjs/jsx": "0.20.0"
64
64
  }
65
65
  }
@@ -59,28 +59,7 @@ runAdapterConformanceTests({
59
59
  // #1467 Phase 2e: same `/* @client */` keyed-map elision (data-table).
60
60
  'data-table',
61
61
  ]),
62
- skipDataPoints: new Set<string>([
63
- // #2255 — Perl length() counts codepoints under utf8; JS counts
64
- // UTF-16 code units, so a surrogate-pair character is 2 in JS, 1 here.
65
- 'string-length-text:astral',
66
- // #2260 — controlled boolean props: the SSR seed evaluates only the
67
- // static fallback of `props.X ?? internal()` chains.
68
- 'toggle:gen:pressed:true',
69
- 'switch:gen:checked:true',
70
- 'checkbox:gen:checked:true',
71
- // #2261 — invalid dynamic CSS value kept (escaped) where the oracle
72
- // drops the property.
73
- 'style-object-dynamic:gen:color:markup',
74
- // #2262 — dynamic `.flat` depth 0/negative violates the documented
75
- // shallow-copy contract.
76
- 'array-flat-dynamic-depth:gen:depth:zero',
77
- 'array-flat-dynamic-depth:gen:depth:negative',
78
- // #2266 — asChild=true with plain-text children breaks the Slot
79
- // rendering path (same class as the Go Slot define; observed on the
80
- // real-Perl CI run).
81
- 'button:gen:asChild:true',
82
- 'kbd:gen:asChild:true',
83
- ]),
62
+ skipDataPoints: new Set<string>(),
84
63
  onRenderError: (err, id) => {
85
64
  if (err instanceof PerlNotAvailableError) {
86
65
  console.log(`Skipping [${id}]: ${err.message}`)
@@ -926,7 +905,7 @@ export function C() {
926
905
  // filter, `.join`) hit a separate refusal gate and the chain
927
906
  // emitted BF101 — making the scaffold `<Button>` / `<Card>`
928
907
  // unusable on Mojo. The fix lowers all three to Embedded Perl
929
- // (`join(' ', @{[grep { $_ } @{[...]}]})`), unblocking the
908
+ // (`bf->join([grep { $_ } @{[...]}], ' ')`), unblocking the
930
909
  // registry surface. The #1421 recursion guard stays in place
931
910
  // as defence in depth for other unsupported shapes, but this
932
911
  // specific chain no longer reaches the loop because the parser
@@ -949,7 +928,7 @@ export { Slot }
949
928
  )
950
929
  expect(result.errors?.filter(e => e.code === 'BF101') ?? []).toEqual([])
951
930
  const template = result.files.find(f => f.path.endsWith('.html.ep'))?.content ?? ''
952
- expect(template).toContain(`join(' ', @{[grep { $_ } @{[$className]}]})`)
931
+ expect(template).toContain(`bf->join([grep { $_ } @{[$className]}], ' ')`)
953
932
  })
954
933
 
955
934
  test('lowers .includes(x) on an array prop via bf->includes(...) (#1448 Tier A)', () => {
@@ -1179,7 +1158,7 @@ export { A }`, 'A.tsx', { adapter })
1179
1158
  export { A }`, 'A.tsx', { adapter })
1180
1159
  expect(result.errors?.filter(e => e.code === 'BF101') ?? []).toEqual([])
1181
1160
  const template = result.files.find(f => f.path.endsWith('.html.ep'))?.content ?? ''
1182
- expect(template).toContain("join(' ', @{bf->reverse($items)})")
1161
+ expect(template).toContain("bf->join(bf->reverse($items), ' ')")
1183
1162
  expect(template).not.toContain('$bf->reverse')
1184
1163
  })
1185
1164
 
@@ -1191,7 +1170,7 @@ export { A }`, 'A.tsx', { adapter })
1191
1170
  export { A }`, 'A.tsx', { adapter })
1192
1171
  expect(result.errors?.filter(e => e.code === 'BF101') ?? []).toEqual([])
1193
1172
  const template = result.files.find(f => f.path.endsWith('.html.ep'))?.content ?? ''
1194
- expect(template).toContain("join(' ', @{bf->reverse($items)})")
1173
+ expect(template).toContain("bf->join(bf->reverse($items), ' ')")
1195
1174
  })
1196
1175
 
1197
1176
  test('lowers .slice(start, end).join(\' \') via bf->slice + join (#1448 Tier A)', () => {
@@ -1203,7 +1182,7 @@ export { A }`, 'A.tsx', { adapter })
1203
1182
  export { A }`, 'A.tsx', { adapter })
1204
1183
  expect(result.errors?.filter(e => e.code === 'BF101') ?? []).toEqual([])
1205
1184
  const template = result.files.find(f => f.path.endsWith('.html.ep'))?.content ?? ''
1206
- expect(template).toContain("join(' ', @{bf->slice($items, 1, 3)})")
1185
+ expect(template).toContain("bf->join(bf->slice($items, 1, 3), ' ')")
1207
1186
  expect(template).not.toContain('$bf->slice')
1208
1187
  })
1209
1188
 
@@ -1217,7 +1196,7 @@ export { A }`, 'A.tsx', { adapter })
1217
1196
  export { A }`, 'A.tsx', { adapter })
1218
1197
  expect(result.errors?.filter(e => e.code === 'BF101') ?? []).toEqual([])
1219
1198
  const template = result.files.find(f => f.path.endsWith('.html.ep'))?.content ?? ''
1220
- expect(template).toContain("join(' ', @{bf->slice($items, 2, undef)})")
1199
+ expect(template).toContain("bf->join(bf->slice($items, 2, undef), ' ')")
1221
1200
  })
1222
1201
 
1223
1202
  test('lowers .concat(other).join(\' \') via bf->concat + join (#1448 Tier A)', () => {
@@ -1233,7 +1212,7 @@ export { A }`, 'A.tsx', { adapter })
1233
1212
  export { A }`, 'A.tsx', { adapter })
1234
1213
  expect(result.errors?.filter(e => e.code === 'BF101') ?? []).toEqual([])
1235
1214
  const template = result.files.find(f => f.path.endsWith('.html.ep'))?.content ?? ''
1236
- expect(template).toContain("join(' ', @{bf->concat($left, $right)})")
1215
+ expect(template).toContain("bf->join(bf->concat($left, $right), ' ')")
1237
1216
  expect(template).not.toContain('$bf->concat')
1238
1217
  })
1239
1218
 
@@ -1345,7 +1324,7 @@ export function Foo(props: { v: string }) {
1345
1324
  // list rather than replace.
1346
1325
  const a = new MojoAdapter()
1347
1326
  const keys = Object.keys(a.templatePrimitives ?? {}).sort()
1348
- expect(keys).toEqual(['JSON.stringify', 'Math.abs', 'Math.ceil', 'Math.floor', 'Math.max', 'Math.min', 'Math.round', 'Number', 'String'])
1327
+ expect(keys).toEqual(['JSON.stringify', 'Math.abs', 'Math.ceil', 'Math.floor', 'Math.max', 'Math.min', 'Math.round', 'Number', 'String', 'isValidElement'])
1349
1328
  })
1350
1329
 
1351
1330
  test('unregistered identifier-path callee is NOT accepted', () => {
@@ -1495,10 +1474,10 @@ describe('MojoAdapter - #1448 Tier A/B fixture-driven lowering pins', () => {
1495
1474
  { fixture: arraySliceFixture, expect: 'bf->slice($items, 1, 3)' },
1496
1475
  // #1448 full-arity — zero-arg defaults.
1497
1476
  { fixture: arraySliceCopyFixture, expect: 'bf->slice($items, 0, undef)' },
1498
- { fixture: arrayJoinDefaultFixture, expect: `join(',', @{$items})` },
1477
+ { fixture: arrayJoinDefaultFixture, expect: `bf->join($items, ',')` },
1499
1478
  // `.at()` → index 0; `.concat()` → the receiver (shallow copy).
1500
1479
  { fixture: arrayAtDefaultFixture, expect: 'bf->at($items, 0)' },
1501
- { fixture: arrayConcatCopyFixture, expect: `join('|', @{$items})` },
1480
+ { fixture: arrayConcatCopyFixture, expect: `bf->join($items, '|')` },
1502
1481
  { fixture: arrayReverseFixture, expect: 'bf->reverse($items)' },
1503
1482
  // .toReversed shares the helper with .reverse — pinning both
1504
1483
  // routings catches a future divergence between them.
@@ -1508,7 +1487,7 @@ describe('MojoAdapter - #1448 Tier A/B fixture-driven lowering pins', () => {
1508
1487
  { fixture: stringTrimFixture, expect: 'bf->trim($value)' },
1509
1488
  // #1448 Tier B — string → array. `.split(',')` lowers to
1510
1489
  // `bf->split`, here chained into `.join('|')` so the array ref is
1511
- // observable (`join('|', @{bf->split($value, ',')})`).
1490
+ // observable (`bf->join(bf->split($value, ','), '|')`).
1512
1491
  { fixture: stringSplitFixture, expect: `bf->split($value, ',')` },
1513
1492
  { fixture: stringSplitLimitFixture, expect: `bf->split($value, ',', 2)` },
1514
1493
  // #1448 Tier B — string → boolean at condition position (`% if`).
@@ -1698,7 +1677,7 @@ export { C }
1698
1677
  // projects each element (no flatten) and composes through `.join`.
1699
1678
  test('.map(t => `#${t}`).join(" ") emits bf->map_eval composed into join', () => {
1700
1679
  const t = emitMap("tags.map(t => `#${t}`).join(' ')")
1701
- expect(t).toContain(`join(' ', @{bf->map_eval($tags,`)
1680
+ expect(t).toContain(`bf->join(bf->map_eval($tags,`)
1702
1681
  expect(t).toContain(`"kind":"template-literal"`)
1703
1682
  })
1704
1683
 
@@ -35,14 +35,20 @@ export function renderArrayMethod(
35
35
  ): string {
36
36
  switch (method) {
37
37
  case 'join': {
38
- // arr.join(sep) → join(sep, @{arr}). The default `${obj}->{join}`
39
- // hash-lookup fallback would emit invalid Perl, which is why the
40
- // IR carves out a dedicated method node instead of routing
41
- // through the generic call dispatcher. `.join()` defaults the
42
- // separator to `,` (JS) and ignores any extra argument.
38
+ // arr.join(sep) → bf->join(arr, sep), NOT Perl's native `join`
39
+ // builtin directly on `@{arr}` a nested-array element (e.g.
40
+ // `.flat(0)`'s shallow copy) would stringify to its Perl memory
41
+ // address ("ARRAY(0x...)") under native `join`'s scalar coercion
42
+ // instead of JS's recursive comma-join (#2262/#2272). `bf->join`
43
+ // (BarefootJS.pm) routes each element through `string()` first.
44
+ // The default `${obj}->{join}` hash-lookup fallback would emit
45
+ // invalid Perl, which is why the IR carves out a dedicated method
46
+ // node instead of routing through the generic call dispatcher.
47
+ // `.join()` defaults the separator to `,` (JS) and ignores any
48
+ // extra argument.
43
49
  const obj = emit(object)
44
50
  const sep = args.length >= 1 ? emit(args[0]) : `','`
45
- return `join(${sep}, @{${obj}})`
51
+ return `bf->join(${obj}, ${sep})`
46
52
  }
47
53
  case 'includes': {
48
54
  // Both `arr.includes(x)` and `str.includes(sub)` route here —
@@ -351,7 +351,12 @@ export class MojoTopLevelEmitter implements ParsedExprEmitter {
351
351
  const isStringReceiver =
352
352
  isStr(object) ||
353
353
  (object.kind === 'identifier' && this.ctx._isStringValueName(object.name))
354
- if (isStringReceiver) return `length(${obj})`
354
+ // A string receiver routes through the shared `bf->length` (NOT
355
+ // Perl's builtin `length()`) because JS `.length` counts UTF-16
356
+ // CODE UNITS, not Perl's codepoint-counting `length()` (#2255) — an
357
+ // astral codepoint (a surrogate pair in UTF-16, e.g. '👍') counts as
358
+ // 2, not 1.
359
+ if (isStringReceiver) return `bf->length(${obj})`
355
360
  return `scalar(@{${obj}})`
356
361
  }
357
362
  return `${obj}->{${property}}`
@@ -29,6 +29,14 @@ export const MOJO_TEMPLATE_PRIMITIVES: Record<string, PrimitiveSpec> = {
29
29
  'Math.min': { arity: 2, emit: (args) => `bf->min(${args[0]}, ${args[1]})` },
30
30
  'Math.max': { arity: 2, emit: (args) => `bf->max(${args[0]}, ${args[1]})` },
31
31
  'Math.abs': { arity: 1, emit: (args) => `bf->abs(${args[0]})` },
32
+ // `isValidElement(x)` — the framework "is this a renderable element (not
33
+ // plain text)?" predicate `Slot`'s `asChild` pattern uses (#2266). A
34
+ // passed-through JSX child is represented as pre-rendered markup on
35
+ // Mojolicious's SSR model too, so a plain STRING child must NOT read as
36
+ // "valid" (mirrors JS's `'tag' in x && 'props' in x`) — previously this
37
+ // callee had no primitive entry at all and fell through to an undeclared
38
+ // `$isValidElement` stash lookup, dying under `use strict`/`vars => 1`.
39
+ 'isValidElement': { arity: 1, emit: (args) => `bf->is_element(${args[0]})` },
32
40
  }
33
41
 
34
42
  /**
@@ -1508,10 +1508,15 @@ export class MojoAdapter extends BaseAdapter implements IRNodeEmitter<MojoRender
1508
1508
  }
1509
1509
 
1510
1510
  /**
1511
- * Lower a `style={{ … }}` object literal to a CSS string with dynamic values
1512
- * interpolated as EP actions, e.g. `{ backgroundColor: color, padding: '8px' }`
1513
- * → `background-color:<%= $color %>;padding:8px`. Returns null when the shape
1514
- * is unsupported or any value can't be lowered (caller then falls through to
1511
+ * Lower a `style={{ … }}` object literal to a `bf->style_object(...)` call,
1512
+ * e.g. `{ backgroundColor: color }` → `<%== bf->style_object('background-color',
1513
+ * $color) %>`. `style_object` is the single oracle-matching sanitizer
1514
+ * (ported from Hono's `hasUnsafeStyleValue`, shared with the Xslate
1515
+ * adapter via `BarefootJS.pm`): it drops any key:value pair whose value
1516
+ * could break out of a CSS declaration and HTML-escapes the rest, so the
1517
+ * call uses `<%== %>` (raw) rather than `<%= %>` to avoid double-encoding
1518
+ * the already-safe result (#2261). Returns null when the shape is
1519
+ * unsupported or any value can't be lowered (caller then falls through to
1515
1520
  * the BF101 refusal). (#1322)
1516
1521
  */
1517
1522
  private tryLowerStyleObject(expr: string): string | null {
@@ -1520,27 +1525,11 @@ export class MojoAdapter extends BaseAdapter implements IRNodeEmitter<MojoRender
1520
1525
  for (const e of entries) {
1521
1526
  if (e.kind === 'expr' && !isSupported(parseExpression(e.expr)).supported) return null
1522
1527
  }
1523
- // The static CSS key + literal value are inlined into a double-quoted
1524
- // `style="..."` attribute as raw template text, so HTML-attr escape them
1525
- // (a value like `'"'` would otherwise break the attribute / inject
1526
- // markup). The dynamic arm's `<%= … %>` is HTML-escaped by Mojo's EP.
1527
- return entries
1528
- .map(e =>
1529
- e.kind === 'literal'
1530
- ? `${this.escapeAttrText(e.cssKey)}:${this.escapeAttrText(e.value)}`
1531
- : `${this.escapeAttrText(e.cssKey)}:<%= ${this.convertExpressionToPerl(e.expr)} %>`,
1532
- )
1533
- .join(';')
1534
- }
1535
-
1536
- /** HTML-attribute escape for static text inlined into a `"..."` attribute. */
1537
- private escapeAttrText(s: string): string {
1538
- return s
1539
- .replace(/&/g, '&amp;')
1540
- .replace(/"/g, '&quot;')
1541
- .replace(/'/g, '&#39;')
1542
- .replace(/</g, '&lt;')
1543
- .replace(/>/g, '&gt;')
1528
+ const args = entries.flatMap(e => [
1529
+ `'${e.cssKey.replace(/[\\']/g, m => `\\${m}`)}'`,
1530
+ e.kind === 'literal' ? `'${e.value.replace(/[\\']/g, m => `\\${m}`)}'` : this.convertExpressionToPerl(e.expr),
1531
+ ])
1532
+ return `<%== bf->style_object(${args.join(', ')}) %>`
1544
1533
  }
1545
1534
 
1546
1535
  private renderAttributes(element: IRElement): string {
@@ -88,7 +88,7 @@ export const conformancePins: ConformancePins = {
88
88
  // below for the shared `/* @client */` keyed-map slot-id elision
89
89
  // contract (same as `todo-app`), not a render or BF101 gap.
90
90
  // #1443: `[a, b].filter(Boolean).join(' ')` (the registry Slot's
91
- // shape) now lowers to `join(' ', @{[grep { $_ } @{[$a, $b]}]})`.
91
+ // shape) now lowers to `bf->join([grep { $_ } @{[$a, $b]}], ' ')`.
92
92
  // No BF101 expected — pinned positively via the
93
93
  // `branch-local-filter-join` template-output test below.
94
94
  //
@@ -139,4 +139,10 @@ export const conformancePins: ConformancePins = {
139
139
  // A dynamic/signal-derived value still refuses with BF101 — see the
140
140
  // `dangerous-inner-html-dynamic` fixture/pin below (tracked: #2215).
141
141
  'dangerous-inner-html-dynamic': [{ code: 'BF101', severity: 'error', issue: 'https://github.com/piconic-ai/barefootjs/issues/2215' }],
142
+ // #2273: a method call on a prop typed as a built-in host rich type
143
+ // (Date, Map, …) has no catalogued lowering in any adapter — this is a
144
+ // compiler-level refusal (`checkRichTypeMethodCalls`, wired ahead of
145
+ // `adapter.generate()`), not an adapter-specific gap, so it is pinned
146
+ // identically across every adapter package including Hono.
147
+ 'date-method-uncatalogued': [{ code: 'BF021', severity: 'error', issue: 'https://github.com/piconic-ai/barefootjs/issues/2274' }],
142
148
  }