@barefootjs/blade 0.18.5 → 0.18.7

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.
@@ -318,6 +318,16 @@ export declare class BladeAdapter extends BaseAdapter implements IRNodeEmitter<B
318
318
  * const (`const sizeAttrs = size ? {…} : {}`) to its initializer text.
319
319
  */
320
320
  private localConstants;
321
+ /**
322
+ * Every name a `.map()`/`.filter()` loop callback binds as its item/index
323
+ * parameter anywhere in the component (#2208 fable review). A static
324
+ * loop-SOURCE name (e.g. a function-scope `const items = [...]`) must
325
+ * never resolve through `resolveStaticLoopSource` at a use site where a
326
+ * DIFFERENT, enclosing loop's own callback param shadows it — same
327
+ * shadowing hazard, and same coarse-but-safe mitigation, as #2212's
328
+ * `collectLoopBoundNames` use in `collectStringValueNames`.
329
+ */
330
+ private staticLoopSourceBoundNames;
321
331
  /**
322
332
  * Optional, no-default props that are `None` when the caller omits them.
323
333
  * Their bare-reference attribute emission is guarded with a Blade
@@ -369,6 +379,20 @@ export declare class BladeAdapter extends BaseAdapter implements IRNodeEmitter<B
369
379
  private providerObjectLiteralBlade;
370
380
  emitAsync(node: IRAsync, _ctx: BladeRenderCtx, _emit: EmitIRNode<BladeRenderCtx>): string;
371
381
  renderElement(element: IRElement): string;
382
+ /**
383
+ * `dangerouslySetInnerHTML={{ __html: '...' }}` (#2207) — replaces the
384
+ * element's normal children with a compile-time-literal raw-HTML string,
385
+ * spliced directly as template text (never through a `{!! !!}`-style
386
+ * runtime raw-output primitive: the value is already fully known at
387
+ * compile time, so no runtime escape hatch is needed, and using one would
388
+ * reopen a template-source injection surface for no benefit). Returns
389
+ * `null` when the attribute is absent (caller falls through to normal
390
+ * `renderChildren`); a non-`null` string (possibly `''`) means the caller
391
+ * must use it as-is instead — including the dynamic/guard-violation
392
+ * refusal cases, where the empty string is safe filler for a compile that
393
+ * fails anyway.
394
+ */
395
+ private renderDangerousInnerHtml;
372
396
  renderExpression(expr: IRExpression): string;
373
397
  renderConditional(cond: IRConditional): string;
374
398
  private renderNodeOrNull;
@@ -533,8 +557,32 @@ export declare class BladeAdapter extends BaseAdapter implements IRNodeEmitter<B
533
557
  * single-quoted string literal (`const totalPages = 5`, #1897
534
558
  * pagination) — function-scope consts never reach the per-render
535
559
  * context, so a bare reference would resolve to an undefined variable.
560
+ *
561
+ * The lookup is a flat name match with no notion of AST scope, so a
562
+ * name that any loop callback binds as its item/index param never
563
+ * inlines (#2221) — the occurrence may be the loop's own (shadowing)
564
+ * binding, and substituting the outer const's value there renders every
565
+ * iteration with the same hard-coded literal. Coarse (a genuinely
566
+ * non-shadowed same-named const elsewhere in the component also stops
567
+ * inlining, falling back to the bare identifier) but safe — the same
568
+ * trade-off as #2212's `collectLoopBoundNames` use in
569
+ * `collectStringValueNames`.
536
570
  */
537
571
  private _resolveLiteralConst;
572
+ /**
573
+ * Resolve `IDENT.key` where `IDENT` is a module-scope object-literal const
574
+ * (`variantClasses.ghost`, #1896/#1897) to the looked-up scalar.
575
+ *
576
+ * The lookup is a flat name match on `objectName` with no notion of AST
577
+ * scope, so an enclosing loop callback's own param of the same name
578
+ * (`.map((cfg) => <li>{cfg.x}</li>)` shadowing a module `const cfg = {…}`)
579
+ * still resolved to the OUTER const's member value at every iteration
580
+ * (#2237) — the sibling hazard to #2221's `_resolveLiteralConst`. Same
581
+ * coarse-but-safe `staticLoopSourceBoundNames` guard: any name a loop
582
+ * binds anywhere in the component never inlines, falling back to the bare
583
+ * `data_get($cfg, 'x')` member expression (which a Blade `@foreach`
584
+ * binds correctly at the shadowed occurrences).
585
+ */
538
586
  private _resolveStaticRecordLiteral;
539
587
  private _resolveModuleStringConst;
540
588
  private _recordExprBF101;
@@ -1 +1 @@
1
- {"version":3,"file":"blade-adapter.d.ts","sourceRoot":"","sources":["../../src/adapter/blade-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6OG;AAEH,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EACN,SAAS,EACT,MAAM,EACN,YAAY,EACZ,aAAa,EACb,MAAM,EACN,WAAW,EACX,UAAU,EACV,MAAM,EACN,aAAa,EACb,UAAU,EACV,OAAO,EAKP,yBAAyB,EAE1B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAE3B,KAAK,aAAa,EAClB,KAAK,UAAU,EAyBhB,MAAM,iBAAiB,CAAA;AAKxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAkCpD,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACzD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEzD,qBAAa,YAAa,SAAQ,WAAY,YAAW,aAAa,CAAC,cAAc,CAAC;IACpF,IAAI,SAAU;IACd,SAAS,SAAe;IACxB,qBAAqB,UAAO;IAG5B,kBAAkB,EAAG,cAAc,CAAS;IAE5C;;;;;OAKG;IACH,kBAAkB,EAAE,yBAAyB,CAA2B;IAExE,OAAO,CAAC,aAAa,CAAa;IAClC;;;uCAGmC;IACnC,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAiB;IAC/B;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB,CAAI;IAC/B;;;;;OAKG;IACH,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,WAAW,CAAyB;IAC5C,OAAO,CAAC,iBAAiB,CAAyB;IAClD;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB,CAAyB;IAEjD;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB,CAAiC;IAE3D;;;;;;;OAOG;IACH,OAAO,CAAC,mBAAmB,CAAyB;IAEpD;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB,CAAwB;IAEjD;;;;;OAKG;IACH,OAAO,CAAC,cAAc,CAAmC;IAEzD;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB,CAAyB;IAEtD,YAAY,OAAO,GAAE,mBAAwB,EAM5C;IAED,QAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,aAAa,CA4EzE;IAMD,OAAO,CAAC,2BAA2B;IAuBnC;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/B;IAMD,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,MAAM,CAE5F;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI7B;IAED,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAEzC;IAED,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,MAAM,CAEpG;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,MAAM,CAEtF;IAED,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,MAAM,CAEhG;IAED,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,MAAM,CAE9F;IAED,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7B;IAED,eAAe,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,MAAM,CAEpG;IAED,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,MAAM,CAe9F;IAED,uEAAuE;IACvE,OAAO,CAAC,kBAAkB;IAmB1B;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,0BAA0B;IAYlC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,GAAG,MAAM,CAExF;IAMD,aAAa,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAoCxC;IAMD,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAiB3C;IAMD,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAuC7C;IAED,OAAO,CAAC,gBAAgB;IAOxB;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAcnC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAyP/B;IAMD;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAmCpC;IAED;;;;;;;;;;OAUG;IACH,OAAO,CAAC,2BAA2B;IAUnC;;;;;;;;OAQG;IACH,OAAO,CAAC,4BAA4B;IAepC,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAuHzC;IAED,OAAO,CAAC,sBAAsB,CAAI;IAElC;+DAC2D;IAC3D,OAAO,CAAC,kBAAkB,CAAI;IAE9B,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,UAAU;IAYT,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAa1C;IAMD;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CA2JlC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAmB3B,8EAA8E;IAC9E,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,gBAAgB;IA8BxB,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAIjD;IAED,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvC;IAED,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvC;IAMD;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAuB7B,OAAO,CAAC,kCAAkC;IAkC1C;;;;;OAKG;IACH,OAAO,CAAC,iCAAiC;IAmBzC;;;;;OAKG;IACH,OAAO,CAAC,+BAA+B;IAuBvC;;;;;;;OAOG;IACH,OAAO,KAAK,OAAO,GAUlB;IAED;;;;;OAKG;IACH,OAAO,KAAK,SAAS,GASpB;IAED,sEAAsE;IACtE,OAAO,KAAK,OAAO,GAKlB;IAED,OAAO,CAAC,wBAAwB;IAyEhC;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAK/B;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAI/B;;;uCAGmC;IACnC,OAAO,CAAC,kBAAkB;IAI1B;;;;OAIG;IACH,8BAA8B,CAC5B,IAAI,EAAE,MAAM,GACX;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAgBlD;IAED,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAO3C;IAED;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,aAAa;IAKrB;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,2BAA2B;IAQnC,OAAO,CAAC,yBAAyB;IAUjC,OAAO,CAAC,gBAAgB;IAcxB,iFAAiF;IACjF,OAAO,CAAC,4BAA4B;CAGrC;AAED,eAAO,MAAM,YAAY,cAAqB,CAAA"}
1
+ {"version":3,"file":"blade-adapter.d.ts","sourceRoot":"","sources":["../../src/adapter/blade-adapter.ts"],"names":[],"mappings":"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"}
@@ -187308,7 +187308,13 @@ import {
187308
187308
  prepareLoweringMatchers,
187309
187309
  queryHrefArgs,
187310
187310
  sortComparatorFromArrow as sortComparatorFromArrow2,
187311
- isValidHelperId
187311
+ isValidHelperId,
187312
+ isDangerousInnerHtmlAttr,
187313
+ resolveDangerousInnerHtml,
187314
+ dangerousInnerHtmlMetacharViolation,
187315
+ dangerousInnerHtmlDiagnostic,
187316
+ resolveStaticLoopSource,
187317
+ collectLoopBoundNames as collectLoopBoundNames2
187312
187318
  } from "@barefootjs/jsx";
187313
187319
 
187314
187320
  // src/adapter/boolean-result.ts
@@ -187654,6 +187660,39 @@ function renderFlatMethod(recv, depth, emit) {
187654
187660
  return `$bf->flat(${recv}, ${d})`;
187655
187661
  }
187656
187662
 
187663
+ // src/adapter/lib/static-value.ts
187664
+ function staticValueToBlade(value) {
187665
+ if (value === null || value === undefined)
187666
+ return "null";
187667
+ if (typeof value === "boolean")
187668
+ return value ? "true" : "false";
187669
+ if (typeof value === "number")
187670
+ return String(value);
187671
+ if (typeof value === "string")
187672
+ return `'${escapeBladeSingleQuoted(value)}'`;
187673
+ if (Array.isArray(value)) {
187674
+ const items = [];
187675
+ for (const el of value) {
187676
+ const serialized = staticValueToBlade(el);
187677
+ if (serialized === null)
187678
+ return null;
187679
+ items.push(serialized);
187680
+ }
187681
+ return `[${items.join(", ")}]`;
187682
+ }
187683
+ if (typeof value === "object") {
187684
+ const entries = [];
187685
+ for (const [key, val] of Object.entries(value)) {
187686
+ const serialized = staticValueToBlade(val);
187687
+ if (serialized === null)
187688
+ return null;
187689
+ entries.push(`${bladeHashKey(key)} => ${serialized}`);
187690
+ }
187691
+ return `[${entries.join(", ")}]`;
187692
+ }
187693
+ return null;
187694
+ }
187695
+
187657
187696
  // src/adapter/expr/emitters.ts
187658
187697
  import {
187659
187698
  groupBinaryOperand,
@@ -188193,6 +188232,9 @@ function generateDerivedMemoSeed(ctx, ir) {
188193
188232
  ` : "";
188194
188233
  }
188195
188234
 
188235
+ // src/adapter/props/prop-classes.ts
188236
+ import { collectLoopBoundNames } from "@barefootjs/jsx";
188237
+
188196
188238
  // src/adapter/value/parsed-literal.ts
188197
188239
  import { evalStringArrayJoin } from "@barefootjs/jsx";
188198
188240
  function isStringTypeInfo(type2) {
@@ -188223,6 +188265,12 @@ function collectStringValueNames(ir) {
188223
188265
  if (isStringTypeInfo(p.type))
188224
188266
  names.add(p.name);
188225
188267
  }
188268
+ for (const c of ir.metadata.localConstants) {
188269
+ if (isStringTypeInfo(c.type ?? undefined) || isBareStringLiteral(c.value))
188270
+ names.add(c.name);
188271
+ }
188272
+ for (const bound of collectLoopBoundNames(ir))
188273
+ names.delete(bound);
188226
188274
  return names;
188227
188275
  }
188228
188276
 
@@ -188247,6 +188295,7 @@ class BladeAdapter extends BaseAdapter {
188247
188295
  _searchParamsLocals = new Set;
188248
188296
  _loweringMatchers = [];
188249
188297
  localConstants = [];
188298
+ staticLoopSourceBoundNames = new Set;
188250
188299
  nullableOptionalProps = new Set;
188251
188300
  constructor(options = {}) {
188252
188301
  super();
@@ -188262,6 +188311,7 @@ class BladeAdapter extends BaseAdapter {
188262
188311
  this.propsParams = ir.metadata.propsParams.map((p) => ({ name: p.name }));
188263
188312
  this.booleanTypedProps = collectBooleanTypedProps(ir);
188264
188313
  this.localConstants = ir.metadata.localConstants ?? [];
188314
+ this.staticLoopSourceBoundNames = collectLoopBoundNames2(ir);
188265
188315
  this.nullableOptionalProps = collectNullableOptionalProps(ir);
188266
188316
  this.stringValueNames = collectStringValueNames(ir);
188267
188317
  this.moduleStringConsts = collectModuleStringConsts(ir.metadata.localConstants);
@@ -188383,7 +188433,8 @@ class BladeAdapter extends BaseAdapter {
188383
188433
  renderElement(element) {
188384
188434
  const tag = element.tag;
188385
188435
  const attrs = this.renderAttributes(element);
188386
- const children = this.renderChildren(element.children);
188436
+ const dangerousHtml = this.renderDangerousInnerHtml(element);
188437
+ const children = dangerousHtml !== null ? dangerousHtml : this.renderChildren(element.children);
188387
188438
  let hydrationAttrs = "";
188388
188439
  if (element.needsScope) {
188389
188440
  hydrationAttrs += ` ${this.renderScopeMarker("")}`;
@@ -188418,6 +188469,22 @@ class BladeAdapter extends BaseAdapter {
188418
188469
  }
188419
188470
  return `<${tag}${attrs}${hydrationAttrs}>${children}</${tag}>`;
188420
188471
  }
188472
+ renderDangerousInnerHtml(element) {
188473
+ const resolution = resolveDangerousInnerHtml(element);
188474
+ if (!resolution)
188475
+ return null;
188476
+ if (resolution.kind === "dynamic") {
188477
+ this.errors.push(dangerousInnerHtmlDiagnostic(resolution.expr, resolution.loc));
188478
+ return "";
188479
+ }
188480
+ const violation = dangerousInnerHtmlMetacharViolation(resolution.html, this.name);
188481
+ if (violation) {
188482
+ const attr = element.attrs.find(isDangerousInnerHtmlAttr);
188483
+ this.errors.push(dangerousInnerHtmlDiagnostic(`{ __html: ${JSON.stringify(resolution.html)} }`, attr.loc, violation));
188484
+ return "";
188485
+ }
188486
+ return resolution.html;
188487
+ }
188421
188488
  renderExpression(expr) {
188422
188489
  if (expr.clientOnly) {
188423
188490
  if (expr.slotId) {
@@ -188425,7 +188492,7 @@ class BladeAdapter extends BaseAdapter {
188425
188492
  }
188426
188493
  return "";
188427
188494
  }
188428
- const bladeExpr = `$bf->string(${this.convertExpressionToBlade(expr.expr)})`;
188495
+ const bladeExpr = `$bf->string(${this.convertExpressionToBlade(expr.expr, expr.parsed)})`;
188429
188496
  if (expr.slotId) {
188430
188497
  return `{!! $bf->text_start("${expr.slotId}") !!}{!! e(${bladeExpr}) !!}{!! $bf->text_end() !!}`;
188431
188498
  }
@@ -188516,8 +188583,12 @@ ${whenTrue}
188516
188583
  }
188517
188584
  });
188518
188585
  }
188586
+ const staticItems = resolveStaticLoopSource(loop.arrayParsed, this.localConstants, {
188587
+ isNameShadowed: (name) => this.staticLoopSourceBoundNames.has(name)
188588
+ });
188589
+ const staticArray = staticItems !== null ? staticValueToBlade(staticItems) : null;
188519
188590
  const arrayName = loop.array.trim();
188520
- if (/^[A-Za-z_$][\w$]*$/.test(arrayName)) {
188591
+ if (staticArray === null && /^[A-Za-z_$][\w$]*$/.test(arrayName)) {
188521
188592
  const arrayConst = (this.localConstants ?? []).find((c) => c.name === arrayName);
188522
188593
  if (arrayConst && !arrayConst.isModule && this._resolveLiteralConst(arrayName) === null) {
188523
188594
  this.errors.push({
@@ -188531,7 +188602,7 @@ ${whenTrue}
188531
188602
  });
188532
188603
  }
188533
188604
  }
188534
- const rawArray = this.convertExpressionToBlade(loop.array);
188605
+ const rawArray = staticArray ?? this.convertExpressionToBlade(loop.array);
188535
188606
  let array = rawArray;
188536
188607
  if (loop.sortComparator) {
188537
188608
  const sort = loop.sortComparator;
@@ -188850,6 +188921,8 @@ ${name}="{!! e($bf->string(${val})) !!}"
188850
188921
  for (const attr of element.attrs) {
188851
188922
  if (attr.clientOnly)
188852
188923
  continue;
188924
+ if (isDangerousInnerHtmlAttr(attr))
188925
+ continue;
188853
188926
  let attrName;
188854
188927
  if (attr.name === "className")
188855
188928
  attrName = "class";
@@ -189050,6 +189123,8 @@ Options:
189050
189123
  return isBooleanResultExpr(expr) || isAriaBooleanAttr(name) || this.isBooleanTypedPropRef(expr);
189051
189124
  }
189052
189125
  _resolveLiteralConst(name) {
189126
+ if (this.staticLoopSourceBoundNames.has(name))
189127
+ return null;
189053
189128
  const c = (this.localConstants ?? []).find((lc) => lc.name === name);
189054
189129
  if (c?.value === undefined)
189055
189130
  return null;
@@ -189062,6 +189137,8 @@ Options:
189062
189137
  return null;
189063
189138
  }
189064
189139
  _resolveStaticRecordLiteral(objectName, key) {
189140
+ if (this.staticLoopSourceBoundNames.has(objectName))
189141
+ return null;
189065
189142
  const hit = lookupStaticRecordLiteral(objectName, key, this.localConstants);
189066
189143
  if (!hit)
189067
189144
  return null;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Serialize a compile-time-evaluated JS value (`@barefootjs/jsx`'s
3
+ * `evaluateStaticLiteral`/`resolveStaticLoopSource`, #2208) into a native
4
+ * PHP literal. Used to inline a fully-static loop source (an inline array
5
+ * literal, or a function-scope local const with a static initializer)
6
+ * directly in a `@foreach` header, rather than requiring a bound template
7
+ * variable.
8
+ *
9
+ * Returns `null` for a value this adapter can't represent as a literal —
10
+ * the caller falls back to its existing BF101 refusal instead of guessing.
11
+ */
12
+ export declare function staticValueToBlade(value: unknown): string | null;
13
+ //# sourceMappingURL=static-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-value.d.ts","sourceRoot":"","sources":["../../../src/adapter/lib/static-value.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAwBhE"}
@@ -5,7 +5,7 @@
5
5
  * Pure functions over `ir.metadata` that derive the per-compile prop/name
6
6
  * sets the adapter consults during lowering. No adapter instance state.
7
7
  */
8
- import type { ComponentIR } from '@barefootjs/jsx';
8
+ import { type ComponentIR } from '@barefootjs/jsx';
9
9
  /**
10
10
  * Props whose declared TS type is boolean — a bare binding of one
11
11
  * (`data-active={props.isActive}`) must stringify as JS `String(boolean)`
@@ -21,14 +21,31 @@ export declare function collectBooleanTypedProps(ir: ComponentIR): Set<string>;
21
21
  */
22
22
  export declare function collectNullableOptionalProps(ir: ComponentIR): Set<string>;
23
23
  /**
24
- * String-typed signals and props. A signal is string-typed when its inferred
25
- * type is `string` (or, defensively, when its initial value is a bare string
26
- * literal); a prop when its annotated type is `string`. In the Mojo adapter
27
- * this drives `eq`/`ne` selection for string equality; the Blade emitters
28
- * don't consume the distinction — `===`/`!==` ALWAYS route through
29
- * `bf.eq`/`bf.neq` regardless of operand type (see
30
- * `expr/emitters.ts`'s file header, divergence 4) so this set is carried
31
- * only for parity with the Perl-family adapters.
24
+ * String-typed signals, props, and same-file local consts (#2212). A
25
+ * signal is string-typed when its inferred type is `string` (or,
26
+ * defensively, when its initial value is a bare string literal); a prop
27
+ * when its annotated type is `string`; a local const the same way. Consumed
28
+ * by `isStringConcatBinary`/`isStringTypedOperand` (`@barefootjs/jsx`) to
29
+ * pick `.` over JS `+`'s numeric fallback (#2163, #2212) — including now
30
+ * for a bare identifier operand, not just a prop/getter/literal. In the
31
+ * Mojo adapter this ALSO drives `eq`/`ne` selection for string equality;
32
+ * the Blade emitters don't consume the distinction there — `===`/`!==`
33
+ * ALWAYS route through `bf.eq`/`bf.neq` regardless of operand type (see
34
+ * `expr/emitters.ts`'s file header, divergence 4) — so that half of this
35
+ * set is carried only for parity with the Perl-family adapters.
36
+ *
37
+ * Excludes any name bound as a `.map()`/`.filter()` loop callback's item
38
+ * or index parameter ANYWHERE in the component (Fable review, #2212): the
39
+ * lookup below is a flat, scope-blind `Set<string>` with no notion of a
40
+ * loop param shadowing an outer string-typed binding of the same name
41
+ * (`items.map((name) => 1 + name)` inside a component that also has a
42
+ * string `name` prop) — left unguarded, that shadowed `name` would be
43
+ * misdetected as string-typed and `1 + name` would silently lower to `.`
44
+ * instead of staying numeric `+`. Subtracting loop-bound names is coarse
45
+ * (it also suppresses a genuinely non-shadowed same-named string
46
+ * elsewhere in the component) but safe: the suppressed case just falls
47
+ * back to today's numeric `+` — the same, already-accepted residual as an
48
+ * unresolvable operand — never silently-wrong output.
32
49
  */
33
50
  export declare function collectStringValueNames(ir: ComponentIR): Set<string>;
34
51
  //# sourceMappingURL=prop-classes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prop-classes.d.ts","sourceRoot":"","sources":["../../../src/adapter/props/prop-classes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAGlD;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAMrE;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAWzE;AAED;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAWpE"}
1
+ {"version":3,"file":"prop-classes.d.ts","sourceRoot":"","sources":["../../../src/adapter/props/prop-classes.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAyB,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAGzE;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAMrE;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAWzE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAepE"}
package/dist/build.js CHANGED
@@ -187308,7 +187308,13 @@ import {
187308
187308
  prepareLoweringMatchers,
187309
187309
  queryHrefArgs,
187310
187310
  sortComparatorFromArrow as sortComparatorFromArrow2,
187311
- isValidHelperId
187311
+ isValidHelperId,
187312
+ isDangerousInnerHtmlAttr,
187313
+ resolveDangerousInnerHtml,
187314
+ dangerousInnerHtmlMetacharViolation,
187315
+ dangerousInnerHtmlDiagnostic,
187316
+ resolveStaticLoopSource,
187317
+ collectLoopBoundNames as collectLoopBoundNames2
187312
187318
  } from "@barefootjs/jsx";
187313
187319
 
187314
187320
  // src/adapter/boolean-result.ts
@@ -187654,6 +187660,39 @@ function renderFlatMethod(recv, depth, emit) {
187654
187660
  return `$bf->flat(${recv}, ${d})`;
187655
187661
  }
187656
187662
 
187663
+ // src/adapter/lib/static-value.ts
187664
+ function staticValueToBlade(value) {
187665
+ if (value === null || value === undefined)
187666
+ return "null";
187667
+ if (typeof value === "boolean")
187668
+ return value ? "true" : "false";
187669
+ if (typeof value === "number")
187670
+ return String(value);
187671
+ if (typeof value === "string")
187672
+ return `'${escapeBladeSingleQuoted(value)}'`;
187673
+ if (Array.isArray(value)) {
187674
+ const items = [];
187675
+ for (const el of value) {
187676
+ const serialized = staticValueToBlade(el);
187677
+ if (serialized === null)
187678
+ return null;
187679
+ items.push(serialized);
187680
+ }
187681
+ return `[${items.join(", ")}]`;
187682
+ }
187683
+ if (typeof value === "object") {
187684
+ const entries = [];
187685
+ for (const [key, val] of Object.entries(value)) {
187686
+ const serialized = staticValueToBlade(val);
187687
+ if (serialized === null)
187688
+ return null;
187689
+ entries.push(`${bladeHashKey(key)} => ${serialized}`);
187690
+ }
187691
+ return `[${entries.join(", ")}]`;
187692
+ }
187693
+ return null;
187694
+ }
187695
+
187657
187696
  // src/adapter/expr/emitters.ts
187658
187697
  import {
187659
187698
  groupBinaryOperand,
@@ -188193,6 +188232,9 @@ function generateDerivedMemoSeed(ctx, ir) {
188193
188232
  ` : "";
188194
188233
  }
188195
188234
 
188235
+ // src/adapter/props/prop-classes.ts
188236
+ import { collectLoopBoundNames } from "@barefootjs/jsx";
188237
+
188196
188238
  // src/adapter/value/parsed-literal.ts
188197
188239
  import { evalStringArrayJoin } from "@barefootjs/jsx";
188198
188240
  function isStringTypeInfo(type2) {
@@ -188223,6 +188265,12 @@ function collectStringValueNames(ir) {
188223
188265
  if (isStringTypeInfo(p.type))
188224
188266
  names.add(p.name);
188225
188267
  }
188268
+ for (const c of ir.metadata.localConstants) {
188269
+ if (isStringTypeInfo(c.type ?? undefined) || isBareStringLiteral(c.value))
188270
+ names.add(c.name);
188271
+ }
188272
+ for (const bound of collectLoopBoundNames(ir))
188273
+ names.delete(bound);
188226
188274
  return names;
188227
188275
  }
188228
188276
 
@@ -188247,6 +188295,7 @@ class BladeAdapter extends BaseAdapter {
188247
188295
  _searchParamsLocals = new Set;
188248
188296
  _loweringMatchers = [];
188249
188297
  localConstants = [];
188298
+ staticLoopSourceBoundNames = new Set;
188250
188299
  nullableOptionalProps = new Set;
188251
188300
  constructor(options = {}) {
188252
188301
  super();
@@ -188262,6 +188311,7 @@ class BladeAdapter extends BaseAdapter {
188262
188311
  this.propsParams = ir.metadata.propsParams.map((p) => ({ name: p.name }));
188263
188312
  this.booleanTypedProps = collectBooleanTypedProps(ir);
188264
188313
  this.localConstants = ir.metadata.localConstants ?? [];
188314
+ this.staticLoopSourceBoundNames = collectLoopBoundNames2(ir);
188265
188315
  this.nullableOptionalProps = collectNullableOptionalProps(ir);
188266
188316
  this.stringValueNames = collectStringValueNames(ir);
188267
188317
  this.moduleStringConsts = collectModuleStringConsts(ir.metadata.localConstants);
@@ -188383,7 +188433,8 @@ class BladeAdapter extends BaseAdapter {
188383
188433
  renderElement(element) {
188384
188434
  const tag = element.tag;
188385
188435
  const attrs = this.renderAttributes(element);
188386
- const children = this.renderChildren(element.children);
188436
+ const dangerousHtml = this.renderDangerousInnerHtml(element);
188437
+ const children = dangerousHtml !== null ? dangerousHtml : this.renderChildren(element.children);
188387
188438
  let hydrationAttrs = "";
188388
188439
  if (element.needsScope) {
188389
188440
  hydrationAttrs += ` ${this.renderScopeMarker("")}`;
@@ -188418,6 +188469,22 @@ class BladeAdapter extends BaseAdapter {
188418
188469
  }
188419
188470
  return `<${tag}${attrs}${hydrationAttrs}>${children}</${tag}>`;
188420
188471
  }
188472
+ renderDangerousInnerHtml(element) {
188473
+ const resolution = resolveDangerousInnerHtml(element);
188474
+ if (!resolution)
188475
+ return null;
188476
+ if (resolution.kind === "dynamic") {
188477
+ this.errors.push(dangerousInnerHtmlDiagnostic(resolution.expr, resolution.loc));
188478
+ return "";
188479
+ }
188480
+ const violation = dangerousInnerHtmlMetacharViolation(resolution.html, this.name);
188481
+ if (violation) {
188482
+ const attr = element.attrs.find(isDangerousInnerHtmlAttr);
188483
+ this.errors.push(dangerousInnerHtmlDiagnostic(`{ __html: ${JSON.stringify(resolution.html)} }`, attr.loc, violation));
188484
+ return "";
188485
+ }
188486
+ return resolution.html;
188487
+ }
188421
188488
  renderExpression(expr) {
188422
188489
  if (expr.clientOnly) {
188423
188490
  if (expr.slotId) {
@@ -188425,7 +188492,7 @@ class BladeAdapter extends BaseAdapter {
188425
188492
  }
188426
188493
  return "";
188427
188494
  }
188428
- const bladeExpr = `$bf->string(${this.convertExpressionToBlade(expr.expr)})`;
188495
+ const bladeExpr = `$bf->string(${this.convertExpressionToBlade(expr.expr, expr.parsed)})`;
188429
188496
  if (expr.slotId) {
188430
188497
  return `{!! $bf->text_start("${expr.slotId}") !!}{!! e(${bladeExpr}) !!}{!! $bf->text_end() !!}`;
188431
188498
  }
@@ -188516,8 +188583,12 @@ ${whenTrue}
188516
188583
  }
188517
188584
  });
188518
188585
  }
188586
+ const staticItems = resolveStaticLoopSource(loop.arrayParsed, this.localConstants, {
188587
+ isNameShadowed: (name) => this.staticLoopSourceBoundNames.has(name)
188588
+ });
188589
+ const staticArray = staticItems !== null ? staticValueToBlade(staticItems) : null;
188519
188590
  const arrayName = loop.array.trim();
188520
- if (/^[A-Za-z_$][\w$]*$/.test(arrayName)) {
188591
+ if (staticArray === null && /^[A-Za-z_$][\w$]*$/.test(arrayName)) {
188521
188592
  const arrayConst = (this.localConstants ?? []).find((c) => c.name === arrayName);
188522
188593
  if (arrayConst && !arrayConst.isModule && this._resolveLiteralConst(arrayName) === null) {
188523
188594
  this.errors.push({
@@ -188531,7 +188602,7 @@ ${whenTrue}
188531
188602
  });
188532
188603
  }
188533
188604
  }
188534
- const rawArray = this.convertExpressionToBlade(loop.array);
188605
+ const rawArray = staticArray ?? this.convertExpressionToBlade(loop.array);
188535
188606
  let array = rawArray;
188536
188607
  if (loop.sortComparator) {
188537
188608
  const sort = loop.sortComparator;
@@ -188850,6 +188921,8 @@ ${name}="{!! e($bf->string(${val})) !!}"
188850
188921
  for (const attr of element.attrs) {
188851
188922
  if (attr.clientOnly)
188852
188923
  continue;
188924
+ if (isDangerousInnerHtmlAttr(attr))
188925
+ continue;
188853
188926
  let attrName;
188854
188927
  if (attr.name === "className")
188855
188928
  attrName = "class";
@@ -189050,6 +189123,8 @@ Options:
189050
189123
  return isBooleanResultExpr(expr) || isAriaBooleanAttr(name) || this.isBooleanTypedPropRef(expr);
189051
189124
  }
189052
189125
  _resolveLiteralConst(name) {
189126
+ if (this.staticLoopSourceBoundNames.has(name))
189127
+ return null;
189053
189128
  const c = (this.localConstants ?? []).find((lc) => lc.name === name);
189054
189129
  if (c?.value === undefined)
189055
189130
  return null;
@@ -189062,6 +189137,8 @@ Options:
189062
189137
  return null;
189063
189138
  }
189064
189139
  _resolveStaticRecordLiteral(objectName, key) {
189140
+ if (this.staticLoopSourceBoundNames.has(objectName))
189141
+ return null;
189065
189142
  const hit = lookupStaticRecordLiteral(objectName, key, this.localConstants);
189066
189143
  if (!hit)
189067
189144
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"conformance-pins.d.ts","sourceRoot":"","sources":["../src/conformance-pins.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,eAAO,MAAM,eAAe,EAAE,eA+E7B,CAAA"}
1
+ {"version":3,"file":"conformance-pins.d.ts","sourceRoot":"","sources":["../src/conformance-pins.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,eAAO,MAAM,eAAe,EAAE,eA4E7B,CAAA"}