@barefootjs/go-template 0.20.0 → 0.21.2
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/go-template-adapter.d.ts +11 -0
- package/dist/adapter/go-template-adapter.d.ts.map +1 -1
- package/dist/adapter/index.js +15 -1
- package/dist/adapter/lib/compile-state.d.ts +9 -0
- package/dist/adapter/lib/compile-state.d.ts.map +1 -1
- package/dist/build.js +15 -1
- package/dist/index.js +15 -1
- package/package.json +3 -3
- package/src/__tests__/go-template-adapter.test.ts +44 -0
- package/src/adapter/go-template-adapter.ts +41 -2
- package/src/adapter/lib/compile-state.ts +10 -0
- package/src/test-render.ts +14 -0
|
@@ -182,6 +182,17 @@ export declare class GoTemplateAdapter extends BaseAdapter implements ParsedExpr
|
|
|
182
182
|
* stays map-rooted for `bf_get` too.
|
|
183
183
|
*/
|
|
184
184
|
private isMapRootedContextChain;
|
|
185
|
+
/**
|
|
186
|
+
* True when `node` is a non-computed member chain rooted in an
|
|
187
|
+
* inline-object-typed prop (`props.cfg` where `cfg: { id: number }`, an
|
|
188
|
+
* `objectTypedPropNames` entry — #2299). Such a prop is a
|
|
189
|
+
* `map[string]interface{}` Input field, so a nested `.id` must go through
|
|
190
|
+
* the case-tolerant `bf_get` (like `isMapRootedContextChain`), not an
|
|
191
|
+
* exact-case dot path that would `MapIndex("ID")` a JS-cased-`"id"` map and
|
|
192
|
+
* render empty. Recurses: once map-rooted, every further hop reads off an
|
|
193
|
+
* `interface{}` value with no static struct, so it stays map-rooted.
|
|
194
|
+
*/
|
|
195
|
+
private isMapRootedPropChain;
|
|
185
196
|
/** Go type for a context-consumer field, from its `createContext` default's type. */
|
|
186
197
|
private contextConsumerGoType;
|
|
187
198
|
/** Go literal for a context-consumer's default value (the `createContext` arg). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"go-template-adapter.d.ts","sourceRoot":"","sources":["../../src/adapter/go-template-adapter.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAIpE,OAAO,KAAK,EACV,WAAW,EACX,MAAM,EACN,SAAS,EACT,MAAM,EACN,YAAY,EACZ,aAAa,EACb,MAAM,EAEN,WAAW,EACX,UAAU,EACV,MAAM,EAKN,aAAa,EAEb,UAAU,EACV,qBAAqB,EAGrB,SAAS,EACT,YAAY,EACZ,aAAa,EACb,UAAU,EACV,OAAO,EAEP,yBAAyB,EAE1B,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,WAAW,EACX,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAE3B,KAAK,iBAAiB,EAEtB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EA+BhB,MAAM,iBAAiB,CAAA;AA8BxB,OAAO,KAAK,EACV,WAAW,EAOX,wBAAwB,EACzB,MAAM,gBAAgB,CAAA;AAyBvB,YAAY,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AA2B9D,qBAAa,iBAAkB,SAAQ,WAAY,YAAW,iBAAiB,EAAE,aAAa,CAAC,WAAW,CAAC;IACzG,IAAI,SAAgB;IACpB,SAAS,SAAU;IAInB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAA0B;IAChE,kBAAkB,EAAG,cAAc,CAAS;IAM5C,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,qBAAqB,CAAQ;IAErC;;;;;;;;;OASG;IACH,kBAAkB,EAAE,yBAAyB,CAG1C;IAEH;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAGtC;IAEH,OAAO,CAAC,OAAO,CAAoC;IAEnD,kIAAkI;IAClI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;IAE3C;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAUvB;IAED,wHAAwH;IACxH,IAAI,MAAM,IAAI,aAAa,EAAE,CAE5B;IAED,OAAO,CAAC,MAAM,CAAiB;IAC/B;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,yBAAyB,CAAiD;IAClF,OAAO,CAAC,cAAc,CAAe;IACrC;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB,CAAe;IACxC;;;;OAIG;IACH,OAAO,CAAC,mBAAmB,CAAgB;IAC3C;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,eAAe,CAAiC;IACxD;;;;;oEAKgE;IAChE,OAAO,CAAC,gBAAgB,CAAiC;IACzD;;;;;;;;;;OAUG;IACH,OAAO,CAAC,oBAAoB,CAAoE;IAChG;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,mBAAmB,CAA8C;IACzE;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB,CAAQ;IAEpC;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB,CAA8C;IAE1E,8FAA8F;IAC9F,OAAO,CAAC,qBAAqB,CAA4C;IAGzE,YAAY,OAAO,GAAE,wBAA6B,EAOjD;IAED;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;
|
|
1
|
+
{"version":3,"file":"go-template-adapter.d.ts","sourceRoot":"","sources":["../../src/adapter/go-template-adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/adapter/index.js
CHANGED
|
@@ -360,6 +360,7 @@ class CompileState {
|
|
|
360
360
|
currentMemos = [];
|
|
361
361
|
currentTypeDefinitions = [];
|
|
362
362
|
contextConsumers = [];
|
|
363
|
+
objectTypedPropNames = new Set;
|
|
363
364
|
searchParamsLocals = new Set;
|
|
364
365
|
envSignalReadersByLocal = new Map;
|
|
365
366
|
ssrSeedPlan = { baseScope: [], steps: [] };
|
|
@@ -2636,6 +2637,7 @@ class GoTemplateAdapter extends BaseAdapter {
|
|
|
2636
2637
|
primeCompileState(ir) {
|
|
2637
2638
|
this.state.propsObjectName = ir.metadata.propsObjectName;
|
|
2638
2639
|
this.state.restPropsName = ir.metadata.restPropsName ?? null;
|
|
2640
|
+
this.state.objectTypedPropNames = new Set((ir.metadata.propsParams ?? []).filter((p) => p.type.kind === "object").map((p) => p.name));
|
|
2639
2641
|
this.state.moduleStringConsts = this.collectModuleStringConsts(ir.metadata.localConstants);
|
|
2640
2642
|
this.state.localConstants = ir.metadata.localConstants ?? [];
|
|
2641
2643
|
this.state.staticLoopSourceBoundNames = collectLoopBoundNames2(ir);
|
|
@@ -2832,6 +2834,15 @@ ${scriptRegistrations}${templateBody}
|
|
|
2832
2834
|
}
|
|
2833
2835
|
return false;
|
|
2834
2836
|
}
|
|
2837
|
+
isMapRootedPropChain(node) {
|
|
2838
|
+
if (node.kind !== "member" || node.computed)
|
|
2839
|
+
return false;
|
|
2840
|
+
const obj = node.object;
|
|
2841
|
+
if (obj.kind === "identifier" && obj.name === this.state.propsObjectName) {
|
|
2842
|
+
return this.state.objectTypedPropNames.has(node.property);
|
|
2843
|
+
}
|
|
2844
|
+
return this.isMapRootedPropChain(obj);
|
|
2845
|
+
}
|
|
2835
2846
|
contextConsumerGoType(c) {
|
|
2836
2847
|
if (typeof c.defaultValue === "number")
|
|
2837
2848
|
return "int";
|
|
@@ -4580,6 +4591,9 @@ ${goFields.join(`
|
|
|
4580
4591
|
if (optional) {
|
|
4581
4592
|
return `bf_get ${wrapIfMultiToken(obj)} ${JSON.stringify(goFieldNameForKey(property))}`;
|
|
4582
4593
|
}
|
|
4594
|
+
if (this.isMapRootedPropChain(object)) {
|
|
4595
|
+
return `bf_get ${wrapIfMultiToken(obj)} ${JSON.stringify(property)}`;
|
|
4596
|
+
}
|
|
4583
4597
|
return `${obj}.${goFieldNameForKey(property)}`;
|
|
4584
4598
|
}
|
|
4585
4599
|
indexAccess(object, index, emit) {
|
|
@@ -5944,7 +5958,7 @@ ${goFields.join(`
|
|
|
5944
5958
|
renderFragment(fragment) {
|
|
5945
5959
|
const children = this.renderChildren(fragment.children);
|
|
5946
5960
|
if (fragment.needsScopeComment) {
|
|
5947
|
-
return `{{bfScopeComment .}}${children}`;
|
|
5961
|
+
return `{{bfScopeComment .}}${children}{{bfScopeCommentEnd .}}`;
|
|
5948
5962
|
}
|
|
5949
5963
|
return children;
|
|
5950
5964
|
}
|
|
@@ -70,6 +70,15 @@ export declare class CompileState {
|
|
|
70
70
|
* a struct field defaulted to the `createContext` default.
|
|
71
71
|
*/
|
|
72
72
|
contextConsumers: ContextConsumer[];
|
|
73
|
+
/**
|
|
74
|
+
* Names of props whose type is an inline object literal (`cfg: { id:
|
|
75
|
+
* number }`) — they lower to a `map[string]interface{}` Input field
|
|
76
|
+
* (`typeInfoToGo`'s 'object' case), not a named struct, so a nested member
|
|
77
|
+
* access (`props.cfg.id`) must route through the case-tolerant `bf_get`
|
|
78
|
+
* runtime getter instead of an exact-case Go-template dot path (#2299). See
|
|
79
|
+
* `member()`'s `isMapRootedPropChain` branch.
|
|
80
|
+
*/
|
|
81
|
+
objectTypedPropNames: Set<string>;
|
|
73
82
|
/**
|
|
74
83
|
* Local binding names the request-scoped `searchParams()` env signal is
|
|
75
84
|
* imported under (handles `import { searchParams as sp }`).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-state.d.ts","sourceRoot":"","sources":["../../../src/adapter/lib/compile-state.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"compile-state.d.ts","sourceRoot":"","sources":["../../../src/adapter/lib/compile-state.ts"],"names":[],"mappings":"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"}
|
package/dist/build.js
CHANGED
|
@@ -700,6 +700,7 @@ class CompileState {
|
|
|
700
700
|
currentMemos = [];
|
|
701
701
|
currentTypeDefinitions = [];
|
|
702
702
|
contextConsumers = [];
|
|
703
|
+
objectTypedPropNames = new Set;
|
|
703
704
|
searchParamsLocals = new Set;
|
|
704
705
|
envSignalReadersByLocal = new Map;
|
|
705
706
|
ssrSeedPlan = { baseScope: [], steps: [] };
|
|
@@ -2976,6 +2977,7 @@ class GoTemplateAdapter extends BaseAdapter {
|
|
|
2976
2977
|
primeCompileState(ir) {
|
|
2977
2978
|
this.state.propsObjectName = ir.metadata.propsObjectName;
|
|
2978
2979
|
this.state.restPropsName = ir.metadata.restPropsName ?? null;
|
|
2980
|
+
this.state.objectTypedPropNames = new Set((ir.metadata.propsParams ?? []).filter((p) => p.type.kind === "object").map((p) => p.name));
|
|
2979
2981
|
this.state.moduleStringConsts = this.collectModuleStringConsts(ir.metadata.localConstants);
|
|
2980
2982
|
this.state.localConstants = ir.metadata.localConstants ?? [];
|
|
2981
2983
|
this.state.staticLoopSourceBoundNames = collectLoopBoundNames2(ir);
|
|
@@ -3172,6 +3174,15 @@ ${scriptRegistrations}${templateBody}
|
|
|
3172
3174
|
}
|
|
3173
3175
|
return false;
|
|
3174
3176
|
}
|
|
3177
|
+
isMapRootedPropChain(node) {
|
|
3178
|
+
if (node.kind !== "member" || node.computed)
|
|
3179
|
+
return false;
|
|
3180
|
+
const obj = node.object;
|
|
3181
|
+
if (obj.kind === "identifier" && obj.name === this.state.propsObjectName) {
|
|
3182
|
+
return this.state.objectTypedPropNames.has(node.property);
|
|
3183
|
+
}
|
|
3184
|
+
return this.isMapRootedPropChain(obj);
|
|
3185
|
+
}
|
|
3175
3186
|
contextConsumerGoType(c) {
|
|
3176
3187
|
if (typeof c.defaultValue === "number")
|
|
3177
3188
|
return "int";
|
|
@@ -4920,6 +4931,9 @@ ${goFields.join(`
|
|
|
4920
4931
|
if (optional) {
|
|
4921
4932
|
return `bf_get ${wrapIfMultiToken(obj)} ${JSON.stringify(goFieldNameForKey(property))}`;
|
|
4922
4933
|
}
|
|
4934
|
+
if (this.isMapRootedPropChain(object)) {
|
|
4935
|
+
return `bf_get ${wrapIfMultiToken(obj)} ${JSON.stringify(property)}`;
|
|
4936
|
+
}
|
|
4923
4937
|
return `${obj}.${goFieldNameForKey(property)}`;
|
|
4924
4938
|
}
|
|
4925
4939
|
indexAccess(object, index, emit) {
|
|
@@ -6284,7 +6298,7 @@ ${goFields.join(`
|
|
|
6284
6298
|
renderFragment(fragment) {
|
|
6285
6299
|
const children = this.renderChildren(fragment.children);
|
|
6286
6300
|
if (fragment.needsScopeComment) {
|
|
6287
|
-
return `{{bfScopeComment .}}${children}`;
|
|
6301
|
+
return `{{bfScopeComment .}}${children}{{bfScopeCommentEnd .}}`;
|
|
6288
6302
|
}
|
|
6289
6303
|
return children;
|
|
6290
6304
|
}
|
package/dist/index.js
CHANGED
|
@@ -360,6 +360,7 @@ class CompileState {
|
|
|
360
360
|
currentMemos = [];
|
|
361
361
|
currentTypeDefinitions = [];
|
|
362
362
|
contextConsumers = [];
|
|
363
|
+
objectTypedPropNames = new Set;
|
|
363
364
|
searchParamsLocals = new Set;
|
|
364
365
|
envSignalReadersByLocal = new Map;
|
|
365
366
|
ssrSeedPlan = { baseScope: [], steps: [] };
|
|
@@ -2636,6 +2637,7 @@ class GoTemplateAdapter extends BaseAdapter {
|
|
|
2636
2637
|
primeCompileState(ir) {
|
|
2637
2638
|
this.state.propsObjectName = ir.metadata.propsObjectName;
|
|
2638
2639
|
this.state.restPropsName = ir.metadata.restPropsName ?? null;
|
|
2640
|
+
this.state.objectTypedPropNames = new Set((ir.metadata.propsParams ?? []).filter((p) => p.type.kind === "object").map((p) => p.name));
|
|
2639
2641
|
this.state.moduleStringConsts = this.collectModuleStringConsts(ir.metadata.localConstants);
|
|
2640
2642
|
this.state.localConstants = ir.metadata.localConstants ?? [];
|
|
2641
2643
|
this.state.staticLoopSourceBoundNames = collectLoopBoundNames2(ir);
|
|
@@ -2832,6 +2834,15 @@ ${scriptRegistrations}${templateBody}
|
|
|
2832
2834
|
}
|
|
2833
2835
|
return false;
|
|
2834
2836
|
}
|
|
2837
|
+
isMapRootedPropChain(node) {
|
|
2838
|
+
if (node.kind !== "member" || node.computed)
|
|
2839
|
+
return false;
|
|
2840
|
+
const obj = node.object;
|
|
2841
|
+
if (obj.kind === "identifier" && obj.name === this.state.propsObjectName) {
|
|
2842
|
+
return this.state.objectTypedPropNames.has(node.property);
|
|
2843
|
+
}
|
|
2844
|
+
return this.isMapRootedPropChain(obj);
|
|
2845
|
+
}
|
|
2835
2846
|
contextConsumerGoType(c) {
|
|
2836
2847
|
if (typeof c.defaultValue === "number")
|
|
2837
2848
|
return "int";
|
|
@@ -4580,6 +4591,9 @@ ${goFields.join(`
|
|
|
4580
4591
|
if (optional) {
|
|
4581
4592
|
return `bf_get ${wrapIfMultiToken(obj)} ${JSON.stringify(goFieldNameForKey(property))}`;
|
|
4582
4593
|
}
|
|
4594
|
+
if (this.isMapRootedPropChain(object)) {
|
|
4595
|
+
return `bf_get ${wrapIfMultiToken(obj)} ${JSON.stringify(property)}`;
|
|
4596
|
+
}
|
|
4583
4597
|
return `${obj}.${goFieldNameForKey(property)}`;
|
|
4584
4598
|
}
|
|
4585
4599
|
indexAccess(object, index, emit) {
|
|
@@ -5944,7 +5958,7 @@ ${goFields.join(`
|
|
|
5944
5958
|
renderFragment(fragment) {
|
|
5945
5959
|
const children = this.renderChildren(fragment.children);
|
|
5946
5960
|
if (fragment.needsScopeComment) {
|
|
5947
|
-
return `{{bfScopeComment .}}${children}`;
|
|
5961
|
+
return `{{bfScopeComment .}}${children}{{bfScopeCommentEnd .}}`;
|
|
5948
5962
|
}
|
|
5949
5963
|
return children;
|
|
5950
5964
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@barefootjs/go-template",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.2",
|
|
4
4
|
"description": "Go html/template adapter for BarefootJS - generates Go template files from IR",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"directory": "packages/adapter-go-template"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@barefootjs/shared": "0.
|
|
52
|
+
"@barefootjs/shared": "0.21.2"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
55
|
"@barefootjs/jsx": ">=0.2.0",
|
|
@@ -57,6 +57,6 @@
|
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@barefootjs/adapter-tests": "0.1.0",
|
|
60
|
-
"@barefootjs/jsx": "0.
|
|
60
|
+
"@barefootjs/jsx": "0.21.2"
|
|
61
61
|
}
|
|
62
62
|
}
|
|
@@ -2191,6 +2191,50 @@ export function ConditionalComponent(props: { variant: string }) {
|
|
|
2191
2191
|
const scopeCommentCount = (template.match(/\{\{bfScopeComment \.\}\}/g) ?? []).length
|
|
2192
2192
|
expect(scopeCommentCount).toBeGreaterThanOrEqual(2)
|
|
2193
2193
|
})
|
|
2194
|
+
|
|
2195
|
+
test('non-transparent fragment root outputs paired begin/end scope comments (#2289)', () => {
|
|
2196
|
+
const result = compileAndGenerate(`
|
|
2197
|
+
"use client"
|
|
2198
|
+
import { createSignal } from "@barefootjs/client"
|
|
2199
|
+
|
|
2200
|
+
export function Wrapper({ children }) {
|
|
2201
|
+
const [open, setOpen] = createSignal(false)
|
|
2202
|
+
return (
|
|
2203
|
+
<>
|
|
2204
|
+
<div>Header</div>
|
|
2205
|
+
{children}
|
|
2206
|
+
</>
|
|
2207
|
+
)
|
|
2208
|
+
}
|
|
2209
|
+
`)
|
|
2210
|
+
// The end marker closes the scope range so a later sibling's markup
|
|
2211
|
+
// isn't swept into this fragment's client-side query (#2289).
|
|
2212
|
+
expect(result.template).toContain('{{bfScopeComment .}}')
|
|
2213
|
+
expect(result.template).toContain('{{bfScopeCommentEnd .}}')
|
|
2214
|
+
// Both markers are driven off the same context (`.`), so they carry
|
|
2215
|
+
// the same ScopeID at render time — assert ordering: end follows the
|
|
2216
|
+
// fragment's rendered children, not interleaved with them.
|
|
2217
|
+
const beginIndex = result.template.indexOf('{{bfScopeComment .}}')
|
|
2218
|
+
const endIndex = result.template.indexOf('{{bfScopeCommentEnd .}}')
|
|
2219
|
+
expect(beginIndex).toBeGreaterThanOrEqual(0)
|
|
2220
|
+
expect(endIndex).toBeGreaterThan(beginIndex)
|
|
2221
|
+
})
|
|
2222
|
+
|
|
2223
|
+
test('transparent fragment root (single children passthrough) does NOT output scope comments', () => {
|
|
2224
|
+
// <>{children}</> is transparent (jsx-to-ir.ts) — scope is carried by
|
|
2225
|
+
// the child's own markup, so no begin/end pair should be emitted.
|
|
2226
|
+
const result = compileAndGenerate(`
|
|
2227
|
+
"use client"
|
|
2228
|
+
import { createSignal } from "@barefootjs/client"
|
|
2229
|
+
|
|
2230
|
+
export function DialogRoot({ children }) {
|
|
2231
|
+
const [open, setOpen] = createSignal(false)
|
|
2232
|
+
return <>{children}</>
|
|
2233
|
+
}
|
|
2234
|
+
`)
|
|
2235
|
+
expect(result.template).not.toContain('bfScopeComment')
|
|
2236
|
+
expect(result.template).not.toContain('bfScopeCommentEnd')
|
|
2237
|
+
})
|
|
2194
2238
|
})
|
|
2195
2239
|
|
|
2196
2240
|
describe('script registration - asset paths', () => {
|
|
@@ -355,6 +355,14 @@ export class GoTemplateAdapter extends BaseAdapter implements ParsedExprEmitter,
|
|
|
355
355
|
private primeCompileState(ir: ComponentIR): void {
|
|
356
356
|
this.state.propsObjectName = ir.metadata.propsObjectName
|
|
357
357
|
this.state.restPropsName = ir.metadata.restPropsName ?? null
|
|
358
|
+
// Inline-object-typed props (`cfg: { id: number }`) bake as
|
|
359
|
+
// `map[string]interface{}`; `member()` routes a nested access on them
|
|
360
|
+
// through `bf_get` rather than an exact-case dot path (#2299).
|
|
361
|
+
this.state.objectTypedPropNames = new Set(
|
|
362
|
+
(ir.metadata.propsParams ?? [])
|
|
363
|
+
.filter(p => p.type.kind === 'object')
|
|
364
|
+
.map(p => p.name),
|
|
365
|
+
)
|
|
358
366
|
this.state.moduleStringConsts = this.collectModuleStringConsts(ir.metadata.localConstants)
|
|
359
367
|
this.state.localConstants = ir.metadata.localConstants ?? []
|
|
360
368
|
// #2208 fable review: every name a `.map()`/`.filter()` loop callback
|
|
@@ -660,6 +668,25 @@ export class GoTemplateAdapter extends BaseAdapter implements ParsedExprEmitter,
|
|
|
660
668
|
return false
|
|
661
669
|
}
|
|
662
670
|
|
|
671
|
+
/**
|
|
672
|
+
* True when `node` is a non-computed member chain rooted in an
|
|
673
|
+
* inline-object-typed prop (`props.cfg` where `cfg: { id: number }`, an
|
|
674
|
+
* `objectTypedPropNames` entry — #2299). Such a prop is a
|
|
675
|
+
* `map[string]interface{}` Input field, so a nested `.id` must go through
|
|
676
|
+
* the case-tolerant `bf_get` (like `isMapRootedContextChain`), not an
|
|
677
|
+
* exact-case dot path that would `MapIndex("ID")` a JS-cased-`"id"` map and
|
|
678
|
+
* render empty. Recurses: once map-rooted, every further hop reads off an
|
|
679
|
+
* `interface{}` value with no static struct, so it stays map-rooted.
|
|
680
|
+
*/
|
|
681
|
+
private isMapRootedPropChain(node: ParsedExpr): boolean {
|
|
682
|
+
if (node.kind !== 'member' || node.computed) return false
|
|
683
|
+
const obj = node.object
|
|
684
|
+
if (obj.kind === 'identifier' && obj.name === this.state.propsObjectName) {
|
|
685
|
+
return this.state.objectTypedPropNames.has(node.property)
|
|
686
|
+
}
|
|
687
|
+
return this.isMapRootedPropChain(obj)
|
|
688
|
+
}
|
|
689
|
+
|
|
663
690
|
/** Go type for a context-consumer field, from its `createContext` default's type. */
|
|
664
691
|
private contextConsumerGoType(c: ContextConsumer): string {
|
|
665
692
|
if (typeof c.defaultValue === 'number') return 'int'
|
|
@@ -3575,6 +3602,16 @@ export class GoTemplateAdapter extends BaseAdapter implements ParsedExprEmitter,
|
|
|
3575
3602
|
if (optional) {
|
|
3576
3603
|
return `bf_get ${wrapIfMultiToken(obj)} ${JSON.stringify(goFieldNameForKey(property))}`
|
|
3577
3604
|
}
|
|
3605
|
+
// A plain member access rooted in an inline-object-typed prop
|
|
3606
|
+
// (`props.cfg.id`, #2299) reads off a `map[string]interface{}` field:
|
|
3607
|
+
// route through the case-tolerant `bf_get` with the JS-cased key (the map
|
|
3608
|
+
// is baked with source-cased keys), not the exact-case `.Cfg.ID` dot path
|
|
3609
|
+
// below that would `MapIndex("ID")` a `"id"` map and render empty. Placed
|
|
3610
|
+
// after the `length`/`optional` special cases so it only intercepts the
|
|
3611
|
+
// otherwise-untyped dot access.
|
|
3612
|
+
if (this.isMapRootedPropChain(object)) {
|
|
3613
|
+
return `bf_get ${wrapIfMultiToken(obj)} ${JSON.stringify(property)}`
|
|
3614
|
+
}
|
|
3578
3615
|
return `${obj}.${goFieldNameForKey(property)}`
|
|
3579
3616
|
}
|
|
3580
3617
|
|
|
@@ -6003,8 +6040,10 @@ export class GoTemplateAdapter extends BaseAdapter implements ParsedExprEmitter,
|
|
|
6003
6040
|
private renderFragment(fragment: IRFragment): string {
|
|
6004
6041
|
const children = this.renderChildren(fragment.children)
|
|
6005
6042
|
if (fragment.needsScopeComment) {
|
|
6006
|
-
// Comment-based scope marker for fragment roots.
|
|
6007
|
-
|
|
6043
|
+
// Comment-based scope marker for fragment roots. The end marker
|
|
6044
|
+
// bounds the scope range so client-side queries don't leak onto
|
|
6045
|
+
// later siblings (#2289).
|
|
6046
|
+
return `{{bfScopeComment .}}${children}{{bfScopeCommentEnd .}}`
|
|
6008
6047
|
}
|
|
6009
6048
|
return children
|
|
6010
6049
|
}
|
|
@@ -95,6 +95,16 @@ export class CompileState {
|
|
|
95
95
|
*/
|
|
96
96
|
contextConsumers: ContextConsumer[] = []
|
|
97
97
|
|
|
98
|
+
/**
|
|
99
|
+
* Names of props whose type is an inline object literal (`cfg: { id:
|
|
100
|
+
* number }`) — they lower to a `map[string]interface{}` Input field
|
|
101
|
+
* (`typeInfoToGo`'s 'object' case), not a named struct, so a nested member
|
|
102
|
+
* access (`props.cfg.id`) must route through the case-tolerant `bf_get`
|
|
103
|
+
* runtime getter instead of an exact-case Go-template dot path (#2299). See
|
|
104
|
+
* `member()`'s `isMapRootedPropChain` branch.
|
|
105
|
+
*/
|
|
106
|
+
objectTypedPropNames: Set<string> = new Set()
|
|
107
|
+
|
|
98
108
|
/**
|
|
99
109
|
* Local binding names the request-scoped `searchParams()` env signal is
|
|
100
110
|
* imported under (handles `import { searchParams as sp }`).
|
package/src/test-render.ts
CHANGED
|
@@ -704,6 +704,15 @@ function buildGoPropsInit(
|
|
|
704
704
|
lines.push(`\t\t${goField}: ${value},`)
|
|
705
705
|
} else if (typeof value === 'boolean') {
|
|
706
706
|
lines.push(`\t\t${goField}: ${value},`)
|
|
707
|
+
} else if (value instanceof Date) {
|
|
708
|
+
// A Date prop crosses the language boundary as its ISO-8601 string;
|
|
709
|
+
// the field's unresolved fallback type (`interface{}`/`any`) holds a
|
|
710
|
+
// string fine, and the shared `date()` runtime helper (#2274/#2288)
|
|
711
|
+
// accepts an ISO string as well as the backend's native date type.
|
|
712
|
+
// MUST come before `Array.isArray`/plain-object below — those would
|
|
713
|
+
// otherwise rebuild/inspect a Date's (non-enumerable) internals and
|
|
714
|
+
// silently erase it.
|
|
715
|
+
lines.push(`\t\t${goField}: ${goStringLit(value.toISOString())},`)
|
|
707
716
|
} else if (Array.isArray(value)) {
|
|
708
717
|
// Array → Go slice literal. Fixtures that exercise array-receiver
|
|
709
718
|
// methods (`items.every(...)`, `items.join(' - ')`, etc. — #1448
|
|
@@ -788,6 +797,7 @@ function goSliceElemType(
|
|
|
788
797
|
*/
|
|
789
798
|
function goTypedSliceLiteralFromArray(arr: unknown[], elemType: string): string {
|
|
790
799
|
const entries = arr.map(v => {
|
|
800
|
+
if (v instanceof Date) return goStringLit(v.toISOString())
|
|
791
801
|
if (v && typeof v === 'object' && !Array.isArray(v)) {
|
|
792
802
|
return goStructLiteral(v as Record<string, unknown>, elemType)
|
|
793
803
|
}
|
|
@@ -812,6 +822,7 @@ function goTypedSliceLiteralFromArray(arr: unknown[], elemType: string): string
|
|
|
812
822
|
*/
|
|
813
823
|
function goTypedMapSliceLiteralFromArray(arr: unknown[], elemType: string): string {
|
|
814
824
|
const entries = arr.map(v => {
|
|
825
|
+
if (v instanceof Date) return goStringLit(v.toISOString())
|
|
815
826
|
if (v && typeof v === 'object' && !Array.isArray(v)) {
|
|
816
827
|
return goMapLiteralFromObject(v as Record<string, unknown>, true)
|
|
817
828
|
}
|
|
@@ -853,6 +864,7 @@ function goStructLiteral(obj: Record<string, unknown>, typeName: string): string
|
|
|
853
864
|
if (typeof v === 'string') fields.push(`${goField}: ${goStringLit(v)}`)
|
|
854
865
|
else if (typeof v === 'number' || typeof v === 'boolean') fields.push(`${goField}: ${v}`)
|
|
855
866
|
else if (v === null) fields.push(`${goField}: nil`)
|
|
867
|
+
else if (v instanceof Date) fields.push(`${goField}: ${goStringLit(v.toISOString())}`)
|
|
856
868
|
else if (Array.isArray(v)) fields.push(`${goField}: ${goArrayLiteralFromArray(v)}`)
|
|
857
869
|
else if (v && typeof v === 'object') fields.push(`${goField}: ${goMapLiteralFromObject(v as Record<string, unknown>, true)}`)
|
|
858
870
|
}
|
|
@@ -866,6 +878,7 @@ function goArrayLiteralFromArray(arr: unknown[]): string {
|
|
|
866
878
|
else if (typeof v === 'number') entries.push(String(v))
|
|
867
879
|
else if (typeof v === 'boolean') entries.push(String(v))
|
|
868
880
|
else if (v === null) entries.push('nil')
|
|
881
|
+
else if (v instanceof Date) entries.push(goStringLit(v.toISOString()))
|
|
869
882
|
else if (Array.isArray(v)) entries.push(goArrayLiteralFromArray(v))
|
|
870
883
|
else if (v && typeof v === 'object') {
|
|
871
884
|
// Objects inside arrays are accessed via Go-struct-style
|
|
@@ -904,6 +917,7 @@ function goMapLiteralFromObject(
|
|
|
904
917
|
else if (typeof v === 'number') entries.push(`${key}: ${v}`)
|
|
905
918
|
else if (typeof v === 'boolean') entries.push(`${key}: ${v}`)
|
|
906
919
|
else if (v === null) entries.push(`${key}: nil`)
|
|
920
|
+
else if (v instanceof Date) entries.push(`${key}: ${goStringLit(v.toISOString())}`)
|
|
907
921
|
else if (Array.isArray(v)) {
|
|
908
922
|
// Array-valued field inside an object-in-array (e.g. the `tags`
|
|
909
923
|
// of `items.flatMap(i => i.tags)`). Without this branch the field
|