@barefootjs/jinja 0.31.9 → 0.31.10

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.
package/dist/vite.js CHANGED
@@ -3968,6 +3968,38 @@ function classify(name, origin, expr, parsed, available) {
3968
3968
  }
3969
3969
  return { kind: "derived", name, origin, expr, parsed, frees: [...frees] };
3970
3970
  }
3971
+ function localConstExprsByName(metadata) {
3972
+ const out = new Map;
3973
+ for (const c of metadata.localConstants ?? []) {
3974
+ if (c.isModule || c.declarationKind !== "const" || c.value === undefined)
3975
+ continue;
3976
+ out.set(c.name, c.parsed ?? parseExpression(c.value.trim()));
3977
+ }
3978
+ return out;
3979
+ }
3980
+ function resolveThroughLocalConsts(parsed, localConsts) {
3981
+ let current = parsed;
3982
+ const maxIter = localConsts.size + 1;
3983
+ for (let i = 0;i < maxIter; i++) {
3984
+ const frees = freeIdentifiers(current);
3985
+ if (frees === null)
3986
+ break;
3987
+ let changed = false;
3988
+ for (const name of frees) {
3989
+ const value = localConsts.get(name);
3990
+ if (!value)
3991
+ continue;
3992
+ const inlined = inlineBinding(current, name, value);
3993
+ if (inlined === null)
3994
+ continue;
3995
+ current = inlined;
3996
+ changed = true;
3997
+ }
3998
+ if (!changed)
3999
+ break;
4000
+ }
4001
+ return current;
4002
+ }
3971
4003
  function computeSsrSeedPlan(metadata) {
3972
4004
  const baseScope = metadata.propsParams.map((p) => p.name);
3973
4005
  if (metadata.propsObjectName)
@@ -3976,6 +4008,7 @@ function computeSsrSeedPlan(metadata) {
3976
4008
  baseScope.push(name);
3977
4009
  }
3978
4010
  const available = new Set(baseScope);
4011
+ const localConsts = localConstExprsByName(metadata);
3979
4012
  const steps = [];
3980
4013
  for (const signal of metadata.signals) {
3981
4014
  if (signal.envReader) {
@@ -3987,13 +4020,13 @@ function computeSsrSeedPlan(metadata) {
3987
4020
  }
3988
4021
  }
3989
4022
  const expr = signal.initialValue.trim();
3990
- steps.push(expr === "" ? { kind: "opaque", name: signal.getter, origin: "signal" } : classify(signal.getter, "signal", expr, parseExpression(expr), available));
4023
+ steps.push(expr === "" ? { kind: "opaque", name: signal.getter, origin: "signal" } : classify(signal.getter, "signal", expr, resolveThroughLocalConsts(parseExpression(expr), localConsts), available));
3991
4024
  available.add(signal.getter);
3992
4025
  }
3993
4026
  for (const memo of metadata.memos) {
3994
4027
  const body = extractArrowBodyExpression(memo.computation);
3995
4028
  const expr = body?.trim() ?? "";
3996
- steps.push(expr === "" ? { kind: "opaque", name: memo.name, origin: "memo" } : classify(memo.name, "memo", expr, memo.parsed ?? parseExpression(expr), available));
4029
+ steps.push(expr === "" ? { kind: "opaque", name: memo.name, origin: "memo" } : classify(memo.name, "memo", expr, resolveThroughLocalConsts(memo.parsed ?? parseExpression(expr), localConsts), available));
3997
4030
  available.add(memo.name);
3998
4031
  }
3999
4032
  return { baseScope, steps };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@barefootjs/jinja",
3
- "version": "0.31.9",
3
+ "version": "0.31.10",
4
4
  "description": "Jinja2 adapter for BarefootJS — compiles IR to .jinja templates and ships the Python BarefootJS rendering runtime; runs under any Python web framework (Flask, etc.)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -53,7 +53,7 @@
53
53
  "directory": "packages/adapter-jinja"
54
54
  },
55
55
  "dependencies": {
56
- "@barefootjs/shared": "0.31.9"
56
+ "@barefootjs/shared": "0.31.10"
57
57
  },
58
58
  "peerDependencies": {
59
59
  "@barefootjs/jsx": ">=0.2.0",
@@ -70,9 +70,9 @@
70
70
  },
71
71
  "devDependencies": {
72
72
  "@barefootjs/adapter-tests": "0.1.0",
73
- "@barefootjs/jsx": "0.31.9",
74
- "@barefootjs/vite": "0.31.9",
75
- "@barefootjs/client": "0.31.9",
73
+ "@barefootjs/jsx": "0.31.10",
74
+ "@barefootjs/vite": "0.31.10",
75
+ "@barefootjs/client": "0.31.10",
76
76
  "typescript": "^5.0.0",
77
77
  "vite": "^6.0.0"
78
78
  }
@@ -600,6 +600,12 @@ function buildPythonProps(
600
600
  // Env signals (#2057) are bound below via `SearchParams('')`, not from a
601
601
  // static initial value.
602
602
  if (signal.envReader) continue
603
+ // #2669: a self-derivation collision already got the correct RAW-prop
604
+ // seed above via `derivedProps` — `extractSsrDefaults` marks that with
605
+ // a `propName`-carrying entry (see its docstring's invariant). Skip
606
+ // re-seeding here or this harness's own `evaluateSignalInit` recompute
607
+ // clobbers the correctly-derived caller value.
608
+ if (rootSsrDefaults[signal.getter]?.propName !== undefined) continue
603
609
  const value = evaluateSignalInit(signal.initialValue.trim(), props)
604
610
  if (value !== null) {
605
611
  fullEntries.push(`${pyStr(signal.getter)}: ${toPyLiteral(value)}`)
@@ -609,6 +615,8 @@ function buildPythonProps(
609
615
  // Memo values seeded from the statically-evaluated ssrDefaults, same
610
616
  // as the production plugin's before_render hook.
611
617
  for (const memo of ir.metadata.memos) {
618
+ // #2669: same self-derivation skip as the signal loop above.
619
+ if (rootSsrDefaults[memo.name]?.propName !== undefined) continue
612
620
  const entry = rootSsrDefaults[memo.name]
613
621
  const value = entry ? entry.value : 0
614
622
  fullEntries.push(`${pyStr(memo.name)}: ${toPyLiteral(value ?? 0)}`)