@barefootjs/mojolicious 0.17.0 → 0.17.1
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/adapter/expr/array-method.d.ts +10 -0
- package/dist/adapter/expr/array-method.d.ts.map +1 -1
- package/dist/adapter/expr/emitters.d.ts +2 -1
- package/dist/adapter/expr/emitters.d.ts.map +1 -1
- package/dist/adapter/index.js +44 -55
- package/dist/adapter/lib/ir-scope.d.ts +0 -7
- package/dist/adapter/lib/ir-scope.d.ts.map +1 -1
- package/dist/adapter/memo/seed.d.ts +10 -19
- package/dist/adapter/memo/seed.d.ts.map +1 -1
- package/dist/adapter/mojo-adapter.d.ts.map +1 -1
- package/dist/build.js +44 -55
- package/dist/index.js +44 -55
- package/lib/BarefootJS/Backend/Mojo.pm +1 -1
- package/lib/Mojolicious/Plugin/BarefootJS/DevReload.pm +1 -1
- package/lib/Mojolicious/Plugin/BarefootJS.pm +1 -1
- package/package.json +3 -3
- package/src/__tests__/mojo-adapter.test.ts +165 -12
- package/src/adapter/expr/array-method.ts +21 -0
- package/src/adapter/expr/emitters.ts +36 -4
- package/src/adapter/lib/ir-scope.ts +0 -13
- package/src/adapter/memo/seed.ts +20 -73
- package/src/adapter/mojo-adapter.ts +25 -9
|
@@ -58,6 +58,16 @@ export declare function renderPredicateEval(funcName: string, recv: string, pred
|
|
|
58
58
|
* evaluator surface, and the caller records BF101.
|
|
59
59
|
*/
|
|
60
60
|
export declare function renderFlatMapEval(recv: string, body: ParsedExpr, param: string, emit: (e: ParsedExpr) => string): string | null;
|
|
61
|
+
/**
|
|
62
|
+
* Emit a value-producing `.map(cb)` via the runtime evaluator (#2073): the
|
|
63
|
+
* projection `body` serializes to JSON and `bf->map_eval` projects each
|
|
64
|
+
* element, one result per element (no flatten — the JS `.map` contract).
|
|
65
|
+
* Composes through the array-method chain (`.map(cb).join(' ')`). Returns
|
|
66
|
+
* null when the projection is outside the evaluator surface, and the caller
|
|
67
|
+
* records BF101. The JSX-returning `.map` is an IRLoop upstream and never
|
|
68
|
+
* reaches this emit.
|
|
69
|
+
*/
|
|
70
|
+
export declare function renderMapEval(recv: string, body: ParsedExpr, param: string, emit: (e: ParsedExpr) => string): string | null;
|
|
61
71
|
/**
|
|
62
72
|
* Shared Mojo emit for `.sort(cmp)` / `.toSorted(cmp)` (#1448 Tier B).
|
|
63
73
|
* Used by both the filter-context emitter and the top-level emitter,
|
|
@@ -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,CA6MR;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;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,GAAG,MAAM,CAaxE;AAKD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAGvE"}
|
|
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,CA6MR;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,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAGvE"}
|
|
@@ -16,7 +16,8 @@ export declare class MojoFilterEmitter implements ParsedExprEmitter {
|
|
|
16
16
|
private readonly param;
|
|
17
17
|
private readonly localVarMap;
|
|
18
18
|
private readonly isStringName;
|
|
19
|
-
|
|
19
|
+
private readonly onUnsupported?;
|
|
20
|
+
constructor(param: string, localVarMap: Map<string, string>, isStringName?: (n: string) => boolean, onUnsupported?: ((message: string, reason?: string) => void) | undefined);
|
|
20
21
|
identifier(name: string): string;
|
|
21
22
|
literal(value: string | number | boolean | null, literalType: LiteralType): string;
|
|
22
23
|
member(object: ParsedExpr, property: string, _computed: boolean, emit: (e: ParsedExpr) => string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emitters.d.ts","sourceRoot":"","sources":["../../../src/adapter/expr/emitters.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EACd,KAAK,YAAY,EAMlB,MAAM,iBAAiB,CAAA;AAExB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"emitters.d.ts","sourceRoot":"","sources":["../../../src/adapter/expr/emitters.ts"],"names":[],"mappings":"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"}
|
package/dist/adapter/index.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import {
|
|
3
3
|
BaseAdapter,
|
|
4
4
|
isBooleanAttr,
|
|
5
|
-
parseExpression as
|
|
5
|
+
parseExpression as parseExpression2,
|
|
6
6
|
stringifyParsedExpr as stringifyParsedExpr2,
|
|
7
7
|
parseStyleObjectEntries,
|
|
8
|
-
isSupported
|
|
8
|
+
isSupported,
|
|
9
9
|
exprToString,
|
|
10
10
|
parseProviderObjectLiteral,
|
|
11
11
|
emitParsedExpr as emitParsedExpr2,
|
|
@@ -128,13 +128,6 @@ function collectRootScopeNodes(node) {
|
|
|
128
128
|
visit(node);
|
|
129
129
|
return out;
|
|
130
130
|
}
|
|
131
|
-
function referencedVarsAreAvailable(expr, available) {
|
|
132
|
-
for (const m of expr.matchAll(/\$([A-Za-z_]\w*)/g)) {
|
|
133
|
-
if (!available.has(m[1]))
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
return true;
|
|
137
|
-
}
|
|
138
131
|
|
|
139
132
|
// src/adapter/expr/array-method.ts
|
|
140
133
|
import {
|
|
@@ -307,6 +300,13 @@ function renderFlatMapEval(recv, body, param, emit) {
|
|
|
307
300
|
const env = emitEvalEnvArg(body, [param], emit);
|
|
308
301
|
return `bf->flat_map_eval(${recv}, '${escapePerlSingleQuote(json)}', '${param}', ${env})`;
|
|
309
302
|
}
|
|
303
|
+
function renderMapEval(recv, body, param, emit) {
|
|
304
|
+
const json = serializeParsedExpr(body);
|
|
305
|
+
if (json === null)
|
|
306
|
+
return null;
|
|
307
|
+
const env = emitEvalEnvArg(body, [param], emit);
|
|
308
|
+
return `bf->map_eval(${recv}, '${escapePerlSingleQuote(json)}', '${param}', ${env})`;
|
|
309
|
+
}
|
|
310
310
|
function renderSortMethod(recv, c) {
|
|
311
311
|
const keyHashes = c.keys.map((k) => {
|
|
312
312
|
const keyEntry = k.key.kind === "self" ? `key_kind => 'self'` : `key_kind => 'field', key => '${k.key.field}'`;
|
|
@@ -360,10 +360,12 @@ class MojoFilterEmitter {
|
|
|
360
360
|
param;
|
|
361
361
|
localVarMap;
|
|
362
362
|
isStringName;
|
|
363
|
-
|
|
363
|
+
onUnsupported;
|
|
364
|
+
constructor(param, localVarMap, isStringName = () => false, onUnsupported) {
|
|
364
365
|
this.param = param;
|
|
365
366
|
this.localVarMap = localVarMap;
|
|
366
367
|
this.isStringName = isStringName;
|
|
368
|
+
this.onUnsupported = onUnsupported;
|
|
367
369
|
}
|
|
368
370
|
identifier(name) {
|
|
369
371
|
if (name === this.param)
|
|
@@ -442,12 +444,14 @@ class MojoFilterEmitter {
|
|
|
442
444
|
return `(${l} // ${r})`;
|
|
443
445
|
}
|
|
444
446
|
callbackMethod(method, object, arrow, _restArgs, emit) {
|
|
445
|
-
if (!PREDICATE_METHODS.has(method))
|
|
447
|
+
if (!PREDICATE_METHODS.has(method)) {
|
|
448
|
+
this.onUnsupported?.(`Filter predicate contains a nested '.${method}(...)' callback, which has no Perl scalar form`, `Rewrite the predicate without a nested callback method, or add /* @client */ for client-only evaluation (no SSR).`);
|
|
446
449
|
return "1";
|
|
450
|
+
}
|
|
447
451
|
const param = arrow.params[0];
|
|
448
452
|
const predicate = arrow.body;
|
|
449
453
|
const arrayExpr = emit(object);
|
|
450
|
-
const predBody = emitParsedExpr(predicate, new MojoFilterEmitter(param, this.localVarMap, this.isStringName));
|
|
454
|
+
const predBody = emitParsedExpr(predicate, new MojoFilterEmitter(param, this.localVarMap, this.isStringName, this.onUnsupported));
|
|
451
455
|
const grepBody = predBody.replace(new RegExp(`\\$${param}\\b`, "g"), "$_");
|
|
452
456
|
if (method === "filter")
|
|
453
457
|
return `[grep { ${grepBody} } @{${arrayExpr}}]`;
|
|
@@ -455,6 +459,7 @@ class MojoFilterEmitter {
|
|
|
455
459
|
return `!(grep { !(${grepBody}) } @{${arrayExpr}})`;
|
|
456
460
|
if (method === "some")
|
|
457
461
|
return `!!(grep { ${grepBody} } @{${arrayExpr}})`;
|
|
462
|
+
this.onUnsupported?.(`Filter predicate contains a nested '.${method}(...)' callback, which has no Perl scalar form`, `Rewrite the predicate without a nested callback method, or add /* @client */ for client-only evaluation (no SSR).`);
|
|
458
463
|
return arrayExpr;
|
|
459
464
|
}
|
|
460
465
|
arrayLiteral(elements, emit) {
|
|
@@ -620,6 +625,13 @@ class MojoTopLevelEmitter {
|
|
|
620
625
|
this.ctx._recordExprBF101(`.flatMap(...) projection is not lowerable to a template flat-map`, `Pre-compute the projection in the route handler, or mark the loop @client-only.`);
|
|
621
626
|
return "''";
|
|
622
627
|
}
|
|
628
|
+
if (method === "map") {
|
|
629
|
+
const evalForm = renderMapEval(recv, body, params[0], emit);
|
|
630
|
+
if (evalForm !== null)
|
|
631
|
+
return evalForm;
|
|
632
|
+
this.ctx._recordExprBF101(`.map(...) projection is not lowerable to a template map`, `Pre-compute the projection in the route handler, or mark the position @client-only.`);
|
|
633
|
+
return "''";
|
|
634
|
+
}
|
|
623
635
|
const cb = {
|
|
624
636
|
method,
|
|
625
637
|
object,
|
|
@@ -863,9 +875,7 @@ function recordIndexAccessToPerl(ctx, val) {
|
|
|
863
875
|
// src/adapter/memo/seed.ts
|
|
864
876
|
import {
|
|
865
877
|
collectContextConsumers,
|
|
866
|
-
|
|
867
|
-
isSupported,
|
|
868
|
-
parseExpression as parseExpression2
|
|
878
|
+
computeSsrSeedPlan
|
|
869
879
|
} from "@barefootjs/jsx";
|
|
870
880
|
function contextDefaultPerl(c) {
|
|
871
881
|
const d = c.defaultValue;
|
|
@@ -886,42 +896,20 @@ function generateContextConsumerSeed(ir) {
|
|
|
886
896
|
`;
|
|
887
897
|
}
|
|
888
898
|
function generateDerivedMemoSeed(ctx, ir) {
|
|
889
|
-
const
|
|
890
|
-
const signals = ir.metadata.signals ?? [];
|
|
891
|
-
if (memos.length === 0 && signals.length === 0)
|
|
892
|
-
return "";
|
|
893
|
-
const available = new Set(ir.metadata.propsParams.map((p) => p.name));
|
|
899
|
+
const plan = ir.metadata.ssrSeedPlan ?? computeSsrSeedPlan(ir.metadata);
|
|
894
900
|
const lines = [];
|
|
895
|
-
for (const
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
const body = extractArrowBodyExpression(memo.computation);
|
|
903
|
-
if (body !== null) {
|
|
904
|
-
const perl = tryLowerToPerl(ctx, body, available);
|
|
905
|
-
if (perl !== null)
|
|
906
|
-
lines.push(`% my $${memo.name} = ${perl};`);
|
|
907
|
-
}
|
|
908
|
-
available.add(memo.name);
|
|
901
|
+
for (const step of plan.steps) {
|
|
902
|
+
if (step.kind !== "derived")
|
|
903
|
+
continue;
|
|
904
|
+
const perl = ctx.convertExpressionToPerl(step.expr, step.parsed);
|
|
905
|
+
if (perl === "" || !/\$[A-Za-z_]\w*/.test(perl))
|
|
906
|
+
continue;
|
|
907
|
+
lines.push(`% my $${step.name} = ${perl};`);
|
|
909
908
|
}
|
|
910
909
|
return lines.length > 0 ? lines.join(`
|
|
911
910
|
`) + `
|
|
912
911
|
` : "";
|
|
913
912
|
}
|
|
914
|
-
function tryLowerToPerl(ctx, expr, available) {
|
|
915
|
-
const trimmed = expr.trim();
|
|
916
|
-
if (!trimmed)
|
|
917
|
-
return null;
|
|
918
|
-
if (!isSupported(parseExpression2(trimmed)).supported)
|
|
919
|
-
return null;
|
|
920
|
-
const perl = ctx.convertExpressionToPerl(trimmed);
|
|
921
|
-
if (perl === "" || !/\$[A-Za-z_]\w*/.test(perl))
|
|
922
|
-
return null;
|
|
923
|
-
return referencedVarsAreAvailable(perl, available) ? perl : null;
|
|
924
|
-
}
|
|
925
913
|
|
|
926
914
|
// src/adapter/value/parsed-literal.ts
|
|
927
915
|
function isStringTypeInfo(type) {
|
|
@@ -1043,7 +1031,7 @@ class MojoAdapter extends BaseAdapter {
|
|
|
1043
1031
|
return this.booleanTypedProps.has(bare);
|
|
1044
1032
|
}
|
|
1045
1033
|
parseUndefinedAlternateTernary(expr) {
|
|
1046
|
-
const parsed =
|
|
1034
|
+
const parsed = parseExpression2(expr.trim());
|
|
1047
1035
|
if (parsed?.kind !== "conditional")
|
|
1048
1036
|
return null;
|
|
1049
1037
|
const alt = parsed.alternate;
|
|
@@ -1291,8 +1279,9 @@ ${whenTrue}
|
|
|
1291
1279
|
return `<%== bf->comment("cond-start:${condId}") %>${content}<%== bf->comment("cond-end:${condId}") %>`;
|
|
1292
1280
|
}
|
|
1293
1281
|
renderLoop(loop) {
|
|
1294
|
-
if (loop.clientOnly)
|
|
1295
|
-
return ""
|
|
1282
|
+
if (loop.clientOnly) {
|
|
1283
|
+
return `<%== bf->comment("loop:${loop.markerId}") %><%== bf->comment("/loop:${loop.markerId}") %>`;
|
|
1284
|
+
}
|
|
1296
1285
|
const destructure = !!(loop.paramBindings && loop.paramBindings.length > 0);
|
|
1297
1286
|
const supportableDestructure = destructure && isLowerableObjectRestDestructure(loop);
|
|
1298
1287
|
if (destructure && !supportableDestructure) {
|
|
@@ -1547,7 +1536,7 @@ ${children}`;
|
|
|
1547
1536
|
if (localConst?.value !== undefined) {
|
|
1548
1537
|
const initTrimmed = localConst.value.trim();
|
|
1549
1538
|
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(initTrimmed)) {
|
|
1550
|
-
const resolved = conditionalSpreadToPerl(this.spreadCtx,
|
|
1539
|
+
const resolved = conditionalSpreadToPerl(this.spreadCtx, parseExpression2(initTrimmed));
|
|
1551
1540
|
if (resolved !== null) {
|
|
1552
1541
|
return `<%== bf->spread_attrs(${resolved}) %>`;
|
|
1553
1542
|
}
|
|
@@ -1565,7 +1554,7 @@ ${children}`;
|
|
|
1565
1554
|
if (!entries)
|
|
1566
1555
|
return null;
|
|
1567
1556
|
for (const e of entries) {
|
|
1568
|
-
if (e.kind === "expr" && !
|
|
1557
|
+
if (e.kind === "expr" && !isSupported(parseExpression2(e.expr)).supported)
|
|
1569
1558
|
return null;
|
|
1570
1559
|
}
|
|
1571
1560
|
return entries.map((e) => e.kind === "literal" ? `${this.escapeAttrText(e.cssKey)}:${this.escapeAttrText(e.value)}` : `${this.escapeAttrText(e.cssKey)}:<%= ${this.convertExpressionToPerl(e.expr)} %>`).join(";");
|
|
@@ -1601,7 +1590,7 @@ ${children}`;
|
|
|
1601
1590
|
return `${BF_COND}="${condId}"`;
|
|
1602
1591
|
}
|
|
1603
1592
|
renderPerlFilterExpr(expr, param, localVarMap = new Map) {
|
|
1604
|
-
return emitParsedExpr2(expr, new MojoFilterEmitter(param, localVarMap, (n) => this._isStringValueName(n)));
|
|
1593
|
+
return emitParsedExpr2(expr, new MojoFilterEmitter(param, localVarMap, (n) => this._isStringValueName(n), (message, reason) => this._recordExprBF101(message, reason)));
|
|
1605
1594
|
}
|
|
1606
1595
|
convertTemplateLiteralPartsToPerl(literalParts) {
|
|
1607
1596
|
const parts = [];
|
|
@@ -1646,8 +1635,8 @@ ${children}`;
|
|
|
1646
1635
|
const hasTaggedTemplate = /[A-Za-z_$][\w$]*\s*`/.test(probe);
|
|
1647
1636
|
if (!startsAsObjectLiteral && !hasTaggedTemplate)
|
|
1648
1637
|
return false;
|
|
1649
|
-
const parsed =
|
|
1650
|
-
const support =
|
|
1638
|
+
const parsed = parseExpression2(expr.trim());
|
|
1639
|
+
const support = isSupported(parsed);
|
|
1651
1640
|
if (parsed.kind !== "unsupported" && support.supported)
|
|
1652
1641
|
return false;
|
|
1653
1642
|
const reason = support.reason ?? (parsed.kind === "unsupported" ? parsed.reason : undefined);
|
|
@@ -1695,7 +1684,7 @@ ${reason}` : "";
|
|
|
1695
1684
|
const trimmed = expr.trim();
|
|
1696
1685
|
if (trimmed === "")
|
|
1697
1686
|
return "''";
|
|
1698
|
-
parsed =
|
|
1687
|
+
parsed = parseExpression2(trimmed);
|
|
1699
1688
|
}
|
|
1700
1689
|
if (parsed.kind === "call") {
|
|
1701
1690
|
for (const matcher of this._loweringMatchers) {
|
|
@@ -1706,7 +1695,7 @@ ${reason}` : "";
|
|
|
1706
1695
|
}
|
|
1707
1696
|
}
|
|
1708
1697
|
}
|
|
1709
|
-
const support =
|
|
1698
|
+
const support = isSupported(parsed);
|
|
1710
1699
|
if (!support.supported) {
|
|
1711
1700
|
this.errors.push({
|
|
1712
1701
|
code: "BF101",
|
|
@@ -30,11 +30,4 @@ export declare function resolveJsxChildrenProp(props: readonly IRProp[]): IRNode
|
|
|
30
30
|
* `if (…) return <A/>` still resolves to `<A>`. (#1297)
|
|
31
31
|
*/
|
|
32
32
|
export declare function collectRootScopeNodes(node: IRNode): Set<IRNode>;
|
|
33
|
-
/**
|
|
34
|
-
* True when every `$var` the lowered (Perl / Kolon) expression references is
|
|
35
|
-
* in the available set — i.e. the template already has that var in scope.
|
|
36
|
-
* Guards in-template memo seeding from referencing an out-of-scope binding
|
|
37
|
-
* (which would trip Perl strict mode). (#1297)
|
|
38
|
-
*/
|
|
39
|
-
export declare function referencedVarsAreAvailable(expr: string, available: ReadonlySet<string>): boolean;
|
|
40
33
|
//# sourceMappingURL=ir-scope.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ir-scope.d.ts","sourceRoot":"","sources":["../../../src/adapter/lib/ir-scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAA6B,MAAM,iBAAiB,CAAA;AAEhF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAKzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAiB/D
|
|
1
|
+
{"version":3,"file":"ir-scope.d.ts","sourceRoot":"","sources":["../../../src/adapter/lib/ir-scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAA6B,MAAM,iBAAiB,CAAA;AAEhF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAKzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAiB/D"}
|
|
@@ -19,25 +19,16 @@ export declare function contextDefaultPerl(c: ContextConsumer): string;
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function generateContextConsumerSeed(ir: ComponentIR): string;
|
|
21
21
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
22
|
+
* Emit `% my $<name> = <perl>;` seed lines for every `derived` step of the
|
|
23
|
+
* backend-neutral SSR seed plan — the scope/availability/ordering analysis
|
|
24
|
+
* lives in `computeSsrSeedPlan` (packages/jsx/src/ssr-seed-plan.ts); this
|
|
25
|
+
* only lowers each step's expression to Perl and applies the two
|
|
26
|
+
* backend-specific emit guards: skip an empty lowering, and skip a lowering
|
|
27
|
+
* that references no `$var` at all (a constant init/body — e.g. a `derived`
|
|
28
|
+
* step with empty `frees` — keeps the existing static ssr-defaults seed
|
|
29
|
+
* instead). `env-reader` and `opaque` steps emit nothing (the runtime
|
|
30
|
+
* supplies the reader, or the adapter's ssr-defaults path already covers it).
|
|
31
|
+
* (#1297, #2075)
|
|
31
32
|
*/
|
|
32
33
|
export declare function generateDerivedMemoSeed(ctx: MojoMemoContext, ir: ComponentIR): string;
|
|
33
|
-
/**
|
|
34
|
-
* Lower a signal init / memo body to Perl for an in-template SSR seed, or
|
|
35
|
-
* `null` when it shouldn't be seeded this way. Returns null — without
|
|
36
|
-
* recording a BF101 — when the expression isn't a supported shape
|
|
37
|
-
* (`isSupported` pre-check, so object/array literals don't fail the build),
|
|
38
|
-
* when the lowering references no in-scope var (a constant — keep the
|
|
39
|
-
* existing ssr-defaults seeding), or when it references an out-of-scope
|
|
40
|
-
* binding. (#1297)
|
|
41
|
-
*/
|
|
42
|
-
export declare function tryLowerToPerl(ctx: MojoMemoContext, expr: string, available: ReadonlySet<string>): string | null;
|
|
43
34
|
//# sourceMappingURL=seed.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../../src/adapter/memo/seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../../src/adapter/memo/seed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,eAAe,EAGrB,MAAM,iBAAiB,CAAA;AAExB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAM7D;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,WAAW,GAAG,MAAM,CAWnE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,WAAW,GAAG,MAAM,CAarF"}
|
|
@@ -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
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import {
|
|
3
3
|
BaseAdapter,
|
|
4
4
|
isBooleanAttr,
|
|
5
|
-
parseExpression as
|
|
5
|
+
parseExpression as parseExpression2,
|
|
6
6
|
stringifyParsedExpr as stringifyParsedExpr2,
|
|
7
7
|
parseStyleObjectEntries,
|
|
8
|
-
isSupported
|
|
8
|
+
isSupported,
|
|
9
9
|
exprToString,
|
|
10
10
|
parseProviderObjectLiteral,
|
|
11
11
|
emitParsedExpr as emitParsedExpr2,
|
|
@@ -128,13 +128,6 @@ function collectRootScopeNodes(node) {
|
|
|
128
128
|
visit(node);
|
|
129
129
|
return out;
|
|
130
130
|
}
|
|
131
|
-
function referencedVarsAreAvailable(expr, available) {
|
|
132
|
-
for (const m of expr.matchAll(/\$([A-Za-z_]\w*)/g)) {
|
|
133
|
-
if (!available.has(m[1]))
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
136
|
-
return true;
|
|
137
|
-
}
|
|
138
131
|
|
|
139
132
|
// src/adapter/expr/array-method.ts
|
|
140
133
|
import {
|
|
@@ -307,6 +300,13 @@ function renderFlatMapEval(recv, body, param, emit) {
|
|
|
307
300
|
const env = emitEvalEnvArg(body, [param], emit);
|
|
308
301
|
return `bf->flat_map_eval(${recv}, '${escapePerlSingleQuote(json)}', '${param}', ${env})`;
|
|
309
302
|
}
|
|
303
|
+
function renderMapEval(recv, body, param, emit) {
|
|
304
|
+
const json = serializeParsedExpr(body);
|
|
305
|
+
if (json === null)
|
|
306
|
+
return null;
|
|
307
|
+
const env = emitEvalEnvArg(body, [param], emit);
|
|
308
|
+
return `bf->map_eval(${recv}, '${escapePerlSingleQuote(json)}', '${param}', ${env})`;
|
|
309
|
+
}
|
|
310
310
|
function renderSortMethod(recv, c) {
|
|
311
311
|
const keyHashes = c.keys.map((k) => {
|
|
312
312
|
const keyEntry = k.key.kind === "self" ? `key_kind => 'self'` : `key_kind => 'field', key => '${k.key.field}'`;
|
|
@@ -360,10 +360,12 @@ class MojoFilterEmitter {
|
|
|
360
360
|
param;
|
|
361
361
|
localVarMap;
|
|
362
362
|
isStringName;
|
|
363
|
-
|
|
363
|
+
onUnsupported;
|
|
364
|
+
constructor(param, localVarMap, isStringName = () => false, onUnsupported) {
|
|
364
365
|
this.param = param;
|
|
365
366
|
this.localVarMap = localVarMap;
|
|
366
367
|
this.isStringName = isStringName;
|
|
368
|
+
this.onUnsupported = onUnsupported;
|
|
367
369
|
}
|
|
368
370
|
identifier(name) {
|
|
369
371
|
if (name === this.param)
|
|
@@ -442,12 +444,14 @@ class MojoFilterEmitter {
|
|
|
442
444
|
return `(${l} // ${r})`;
|
|
443
445
|
}
|
|
444
446
|
callbackMethod(method, object, arrow, _restArgs, emit) {
|
|
445
|
-
if (!PREDICATE_METHODS.has(method))
|
|
447
|
+
if (!PREDICATE_METHODS.has(method)) {
|
|
448
|
+
this.onUnsupported?.(`Filter predicate contains a nested '.${method}(...)' callback, which has no Perl scalar form`, `Rewrite the predicate without a nested callback method, or add /* @client */ for client-only evaluation (no SSR).`);
|
|
446
449
|
return "1";
|
|
450
|
+
}
|
|
447
451
|
const param = arrow.params[0];
|
|
448
452
|
const predicate = arrow.body;
|
|
449
453
|
const arrayExpr = emit(object);
|
|
450
|
-
const predBody = emitParsedExpr(predicate, new MojoFilterEmitter(param, this.localVarMap, this.isStringName));
|
|
454
|
+
const predBody = emitParsedExpr(predicate, new MojoFilterEmitter(param, this.localVarMap, this.isStringName, this.onUnsupported));
|
|
451
455
|
const grepBody = predBody.replace(new RegExp(`\\$${param}\\b`, "g"), "$_");
|
|
452
456
|
if (method === "filter")
|
|
453
457
|
return `[grep { ${grepBody} } @{${arrayExpr}}]`;
|
|
@@ -455,6 +459,7 @@ class MojoFilterEmitter {
|
|
|
455
459
|
return `!(grep { !(${grepBody}) } @{${arrayExpr}})`;
|
|
456
460
|
if (method === "some")
|
|
457
461
|
return `!!(grep { ${grepBody} } @{${arrayExpr}})`;
|
|
462
|
+
this.onUnsupported?.(`Filter predicate contains a nested '.${method}(...)' callback, which has no Perl scalar form`, `Rewrite the predicate without a nested callback method, or add /* @client */ for client-only evaluation (no SSR).`);
|
|
458
463
|
return arrayExpr;
|
|
459
464
|
}
|
|
460
465
|
arrayLiteral(elements, emit) {
|
|
@@ -620,6 +625,13 @@ class MojoTopLevelEmitter {
|
|
|
620
625
|
this.ctx._recordExprBF101(`.flatMap(...) projection is not lowerable to a template flat-map`, `Pre-compute the projection in the route handler, or mark the loop @client-only.`);
|
|
621
626
|
return "''";
|
|
622
627
|
}
|
|
628
|
+
if (method === "map") {
|
|
629
|
+
const evalForm = renderMapEval(recv, body, params[0], emit);
|
|
630
|
+
if (evalForm !== null)
|
|
631
|
+
return evalForm;
|
|
632
|
+
this.ctx._recordExprBF101(`.map(...) projection is not lowerable to a template map`, `Pre-compute the projection in the route handler, or mark the position @client-only.`);
|
|
633
|
+
return "''";
|
|
634
|
+
}
|
|
623
635
|
const cb = {
|
|
624
636
|
method,
|
|
625
637
|
object,
|
|
@@ -863,9 +875,7 @@ function recordIndexAccessToPerl(ctx, val) {
|
|
|
863
875
|
// src/adapter/memo/seed.ts
|
|
864
876
|
import {
|
|
865
877
|
collectContextConsumers,
|
|
866
|
-
|
|
867
|
-
isSupported,
|
|
868
|
-
parseExpression as parseExpression2
|
|
878
|
+
computeSsrSeedPlan
|
|
869
879
|
} from "@barefootjs/jsx";
|
|
870
880
|
function contextDefaultPerl(c) {
|
|
871
881
|
const d = c.defaultValue;
|
|
@@ -886,42 +896,20 @@ function generateContextConsumerSeed(ir) {
|
|
|
886
896
|
`;
|
|
887
897
|
}
|
|
888
898
|
function generateDerivedMemoSeed(ctx, ir) {
|
|
889
|
-
const
|
|
890
|
-
const signals = ir.metadata.signals ?? [];
|
|
891
|
-
if (memos.length === 0 && signals.length === 0)
|
|
892
|
-
return "";
|
|
893
|
-
const available = new Set(ir.metadata.propsParams.map((p) => p.name));
|
|
899
|
+
const plan = ir.metadata.ssrSeedPlan ?? computeSsrSeedPlan(ir.metadata);
|
|
894
900
|
const lines = [];
|
|
895
|
-
for (const
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
const body = extractArrowBodyExpression(memo.computation);
|
|
903
|
-
if (body !== null) {
|
|
904
|
-
const perl = tryLowerToPerl(ctx, body, available);
|
|
905
|
-
if (perl !== null)
|
|
906
|
-
lines.push(`% my $${memo.name} = ${perl};`);
|
|
907
|
-
}
|
|
908
|
-
available.add(memo.name);
|
|
901
|
+
for (const step of plan.steps) {
|
|
902
|
+
if (step.kind !== "derived")
|
|
903
|
+
continue;
|
|
904
|
+
const perl = ctx.convertExpressionToPerl(step.expr, step.parsed);
|
|
905
|
+
if (perl === "" || !/\$[A-Za-z_]\w*/.test(perl))
|
|
906
|
+
continue;
|
|
907
|
+
lines.push(`% my $${step.name} = ${perl};`);
|
|
909
908
|
}
|
|
910
909
|
return lines.length > 0 ? lines.join(`
|
|
911
910
|
`) + `
|
|
912
911
|
` : "";
|
|
913
912
|
}
|
|
914
|
-
function tryLowerToPerl(ctx, expr, available) {
|
|
915
|
-
const trimmed = expr.trim();
|
|
916
|
-
if (!trimmed)
|
|
917
|
-
return null;
|
|
918
|
-
if (!isSupported(parseExpression2(trimmed)).supported)
|
|
919
|
-
return null;
|
|
920
|
-
const perl = ctx.convertExpressionToPerl(trimmed);
|
|
921
|
-
if (perl === "" || !/\$[A-Za-z_]\w*/.test(perl))
|
|
922
|
-
return null;
|
|
923
|
-
return referencedVarsAreAvailable(perl, available) ? perl : null;
|
|
924
|
-
}
|
|
925
913
|
|
|
926
914
|
// src/adapter/value/parsed-literal.ts
|
|
927
915
|
function isStringTypeInfo(type) {
|
|
@@ -1043,7 +1031,7 @@ class MojoAdapter extends BaseAdapter {
|
|
|
1043
1031
|
return this.booleanTypedProps.has(bare);
|
|
1044
1032
|
}
|
|
1045
1033
|
parseUndefinedAlternateTernary(expr) {
|
|
1046
|
-
const parsed =
|
|
1034
|
+
const parsed = parseExpression2(expr.trim());
|
|
1047
1035
|
if (parsed?.kind !== "conditional")
|
|
1048
1036
|
return null;
|
|
1049
1037
|
const alt = parsed.alternate;
|
|
@@ -1291,8 +1279,9 @@ ${whenTrue}
|
|
|
1291
1279
|
return `<%== bf->comment("cond-start:${condId}") %>${content}<%== bf->comment("cond-end:${condId}") %>`;
|
|
1292
1280
|
}
|
|
1293
1281
|
renderLoop(loop) {
|
|
1294
|
-
if (loop.clientOnly)
|
|
1295
|
-
return ""
|
|
1282
|
+
if (loop.clientOnly) {
|
|
1283
|
+
return `<%== bf->comment("loop:${loop.markerId}") %><%== bf->comment("/loop:${loop.markerId}") %>`;
|
|
1284
|
+
}
|
|
1296
1285
|
const destructure = !!(loop.paramBindings && loop.paramBindings.length > 0);
|
|
1297
1286
|
const supportableDestructure = destructure && isLowerableObjectRestDestructure(loop);
|
|
1298
1287
|
if (destructure && !supportableDestructure) {
|
|
@@ -1547,7 +1536,7 @@ ${children}`;
|
|
|
1547
1536
|
if (localConst?.value !== undefined) {
|
|
1548
1537
|
const initTrimmed = localConst.value.trim();
|
|
1549
1538
|
if (!/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(initTrimmed)) {
|
|
1550
|
-
const resolved = conditionalSpreadToPerl(this.spreadCtx,
|
|
1539
|
+
const resolved = conditionalSpreadToPerl(this.spreadCtx, parseExpression2(initTrimmed));
|
|
1551
1540
|
if (resolved !== null) {
|
|
1552
1541
|
return `<%== bf->spread_attrs(${resolved}) %>`;
|
|
1553
1542
|
}
|
|
@@ -1565,7 +1554,7 @@ ${children}`;
|
|
|
1565
1554
|
if (!entries)
|
|
1566
1555
|
return null;
|
|
1567
1556
|
for (const e of entries) {
|
|
1568
|
-
if (e.kind === "expr" && !
|
|
1557
|
+
if (e.kind === "expr" && !isSupported(parseExpression2(e.expr)).supported)
|
|
1569
1558
|
return null;
|
|
1570
1559
|
}
|
|
1571
1560
|
return entries.map((e) => e.kind === "literal" ? `${this.escapeAttrText(e.cssKey)}:${this.escapeAttrText(e.value)}` : `${this.escapeAttrText(e.cssKey)}:<%= ${this.convertExpressionToPerl(e.expr)} %>`).join(";");
|
|
@@ -1601,7 +1590,7 @@ ${children}`;
|
|
|
1601
1590
|
return `${BF_COND}="${condId}"`;
|
|
1602
1591
|
}
|
|
1603
1592
|
renderPerlFilterExpr(expr, param, localVarMap = new Map) {
|
|
1604
|
-
return emitParsedExpr2(expr, new MojoFilterEmitter(param, localVarMap, (n) => this._isStringValueName(n)));
|
|
1593
|
+
return emitParsedExpr2(expr, new MojoFilterEmitter(param, localVarMap, (n) => this._isStringValueName(n), (message, reason) => this._recordExprBF101(message, reason)));
|
|
1605
1594
|
}
|
|
1606
1595
|
convertTemplateLiteralPartsToPerl(literalParts) {
|
|
1607
1596
|
const parts = [];
|
|
@@ -1646,8 +1635,8 @@ ${children}`;
|
|
|
1646
1635
|
const hasTaggedTemplate = /[A-Za-z_$][\w$]*\s*`/.test(probe);
|
|
1647
1636
|
if (!startsAsObjectLiteral && !hasTaggedTemplate)
|
|
1648
1637
|
return false;
|
|
1649
|
-
const parsed =
|
|
1650
|
-
const support =
|
|
1638
|
+
const parsed = parseExpression2(expr.trim());
|
|
1639
|
+
const support = isSupported(parsed);
|
|
1651
1640
|
if (parsed.kind !== "unsupported" && support.supported)
|
|
1652
1641
|
return false;
|
|
1653
1642
|
const reason = support.reason ?? (parsed.kind === "unsupported" ? parsed.reason : undefined);
|
|
@@ -1695,7 +1684,7 @@ ${reason}` : "";
|
|
|
1695
1684
|
const trimmed = expr.trim();
|
|
1696
1685
|
if (trimmed === "")
|
|
1697
1686
|
return "''";
|
|
1698
|
-
parsed =
|
|
1687
|
+
parsed = parseExpression2(trimmed);
|
|
1699
1688
|
}
|
|
1700
1689
|
if (parsed.kind === "call") {
|
|
1701
1690
|
for (const matcher of this._loweringMatchers) {
|
|
@@ -1706,7 +1695,7 @@ ${reason}` : "";
|
|
|
1706
1695
|
}
|
|
1707
1696
|
}
|
|
1708
1697
|
}
|
|
1709
|
-
const support =
|
|
1698
|
+
const support = isSupported(parsed);
|
|
1710
1699
|
if (!support.supported) {
|
|
1711
1700
|
this.errors.push({
|
|
1712
1701
|
code: "BF101",
|