@barefootjs/go-template 0.5.0 → 0.5.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/go-template-adapter.d.ts +7 -0
- package/dist/adapter/go-template-adapter.d.ts.map +1 -1
- package/dist/adapter/index.js +10 -3
- package/dist/build.js +10 -3
- package/dist/index.js +10 -3
- package/package.json +2 -2
- package/src/__tests__/go-template-adapter.test.ts +181 -0
- package/src/adapter/go-template-adapter.ts +22 -3
|
@@ -619,6 +619,13 @@ export declare class GoTemplateAdapter extends BaseAdapter implements ParsedExpr
|
|
|
619
619
|
private convertConditionToGo;
|
|
620
620
|
private renderConditionExpr;
|
|
621
621
|
renderLoop(loop: IRLoop): string;
|
|
622
|
+
/**
|
|
623
|
+
* Per-item `<!--bf-loop-i-->` / `<!--bf-loop-i:KEY-->` start marker emitted
|
|
624
|
+
* inside a `{{range}}` body. Multi-root Fragment items (#1212) get the bare
|
|
625
|
+
* anchor; whole-item conditional items (#1665) get the key-bearing anchor so
|
|
626
|
+
* the client's `mapArrayAnchored` can hydrate items that render no element.
|
|
627
|
+
*/
|
|
628
|
+
private loopItemMarker;
|
|
622
629
|
/**
|
|
623
630
|
* Find the first component child in a list of nodes
|
|
624
631
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"go-template-adapter.d.ts","sourceRoot":"","sources":["../../src/adapter/go-template-adapter.ts"],"names":[],"mappings":"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
|
|
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
|
@@ -2502,6 +2502,7 @@ Options:
|
|
|
2502
2502
|
}
|
|
2503
2503
|
}
|
|
2504
2504
|
const children = this.renderChildren(loop.children);
|
|
2505
|
+
const itemMarker = this.loopItemMarker(loop);
|
|
2505
2506
|
for (const v of addedLoopVars) {
|
|
2506
2507
|
const rc = (this.loopVarRefCount.get(v) ?? 1) - 1;
|
|
2507
2508
|
if (rc <= 0)
|
|
@@ -2523,12 +2524,18 @@ Options:
|
|
|
2523
2524
|
} else {
|
|
2524
2525
|
filterCond = "true";
|
|
2525
2526
|
}
|
|
2526
|
-
|
|
2527
|
-
return `{{bfComment "loop:${loop.markerId}"}}{{range $${rangeIndex}, $${rangeValue} := ${goArray}}}{{if ${filterCond}}}${itemMarker2}${children}{{end}}{{end}}{{bfComment "/loop:${loop.markerId}"}}`;
|
|
2527
|
+
return `{{bfComment "loop:${loop.markerId}"}}{{range $${rangeIndex}, $${rangeValue} := ${goArray}}}{{if ${filterCond}}}${itemMarker}${children}{{end}}{{end}}{{bfComment "/loop:${loop.markerId}"}}`;
|
|
2528
2528
|
}
|
|
2529
|
-
const itemMarker = loop.bodyIsMultiRoot ? `{{bfComment "bf-loop-i"}}` : "";
|
|
2530
2529
|
return `{{bfComment "loop:${loop.markerId}"}}{{range $${rangeIndex}, $${rangeValue} := ${goArray}}}${itemMarker}${children}{{end}}{{bfComment "/loop:${loop.markerId}"}}`;
|
|
2531
2530
|
}
|
|
2531
|
+
loopItemMarker(loop) {
|
|
2532
|
+
if (loop.bodyIsMultiRoot)
|
|
2533
|
+
return `{{bfComment "bf-loop-i"}}`;
|
|
2534
|
+
if (loop.bodyIsItemConditional && loop.key) {
|
|
2535
|
+
return `{{bfComment (printf "loop-i:%v" ${this.convertExpressionToGo(loop.key)})}}`;
|
|
2536
|
+
}
|
|
2537
|
+
return "";
|
|
2538
|
+
}
|
|
2532
2539
|
findChildComponent(nodes) {
|
|
2533
2540
|
for (const node of nodes) {
|
|
2534
2541
|
if (node.type === "component") {
|
package/dist/build.js
CHANGED
|
@@ -2842,6 +2842,7 @@ Options:
|
|
|
2842
2842
|
}
|
|
2843
2843
|
}
|
|
2844
2844
|
const children = this.renderChildren(loop.children);
|
|
2845
|
+
const itemMarker = this.loopItemMarker(loop);
|
|
2845
2846
|
for (const v of addedLoopVars) {
|
|
2846
2847
|
const rc = (this.loopVarRefCount.get(v) ?? 1) - 1;
|
|
2847
2848
|
if (rc <= 0)
|
|
@@ -2863,12 +2864,18 @@ Options:
|
|
|
2863
2864
|
} else {
|
|
2864
2865
|
filterCond = "true";
|
|
2865
2866
|
}
|
|
2866
|
-
|
|
2867
|
-
return `{{bfComment "loop:${loop.markerId}"}}{{range $${rangeIndex}, $${rangeValue} := ${goArray}}}{{if ${filterCond}}}${itemMarker2}${children}{{end}}{{end}}{{bfComment "/loop:${loop.markerId}"}}`;
|
|
2867
|
+
return `{{bfComment "loop:${loop.markerId}"}}{{range $${rangeIndex}, $${rangeValue} := ${goArray}}}{{if ${filterCond}}}${itemMarker}${children}{{end}}{{end}}{{bfComment "/loop:${loop.markerId}"}}`;
|
|
2868
2868
|
}
|
|
2869
|
-
const itemMarker = loop.bodyIsMultiRoot ? `{{bfComment "bf-loop-i"}}` : "";
|
|
2870
2869
|
return `{{bfComment "loop:${loop.markerId}"}}{{range $${rangeIndex}, $${rangeValue} := ${goArray}}}${itemMarker}${children}{{end}}{{bfComment "/loop:${loop.markerId}"}}`;
|
|
2871
2870
|
}
|
|
2871
|
+
loopItemMarker(loop) {
|
|
2872
|
+
if (loop.bodyIsMultiRoot)
|
|
2873
|
+
return `{{bfComment "bf-loop-i"}}`;
|
|
2874
|
+
if (loop.bodyIsItemConditional && loop.key) {
|
|
2875
|
+
return `{{bfComment (printf "loop-i:%v" ${this.convertExpressionToGo(loop.key)})}}`;
|
|
2876
|
+
}
|
|
2877
|
+
return "";
|
|
2878
|
+
}
|
|
2872
2879
|
findChildComponent(nodes) {
|
|
2873
2880
|
for (const node of nodes) {
|
|
2874
2881
|
if (node.type === "component") {
|
package/dist/index.js
CHANGED
|
@@ -2502,6 +2502,7 @@ Options:
|
|
|
2502
2502
|
}
|
|
2503
2503
|
}
|
|
2504
2504
|
const children = this.renderChildren(loop.children);
|
|
2505
|
+
const itemMarker = this.loopItemMarker(loop);
|
|
2505
2506
|
for (const v of addedLoopVars) {
|
|
2506
2507
|
const rc = (this.loopVarRefCount.get(v) ?? 1) - 1;
|
|
2507
2508
|
if (rc <= 0)
|
|
@@ -2523,12 +2524,18 @@ Options:
|
|
|
2523
2524
|
} else {
|
|
2524
2525
|
filterCond = "true";
|
|
2525
2526
|
}
|
|
2526
|
-
|
|
2527
|
-
return `{{bfComment "loop:${loop.markerId}"}}{{range $${rangeIndex}, $${rangeValue} := ${goArray}}}{{if ${filterCond}}}${itemMarker2}${children}{{end}}{{end}}{{bfComment "/loop:${loop.markerId}"}}`;
|
|
2527
|
+
return `{{bfComment "loop:${loop.markerId}"}}{{range $${rangeIndex}, $${rangeValue} := ${goArray}}}{{if ${filterCond}}}${itemMarker}${children}{{end}}{{end}}{{bfComment "/loop:${loop.markerId}"}}`;
|
|
2528
2528
|
}
|
|
2529
|
-
const itemMarker = loop.bodyIsMultiRoot ? `{{bfComment "bf-loop-i"}}` : "";
|
|
2530
2529
|
return `{{bfComment "loop:${loop.markerId}"}}{{range $${rangeIndex}, $${rangeValue} := ${goArray}}}${itemMarker}${children}{{end}}{{bfComment "/loop:${loop.markerId}"}}`;
|
|
2531
2530
|
}
|
|
2531
|
+
loopItemMarker(loop) {
|
|
2532
|
+
if (loop.bodyIsMultiRoot)
|
|
2533
|
+
return `{{bfComment "bf-loop-i"}}`;
|
|
2534
|
+
if (loop.bodyIsItemConditional && loop.key) {
|
|
2535
|
+
return `{{bfComment (printf "loop-i:%v" ${this.convertExpressionToGo(loop.key)})}}`;
|
|
2536
|
+
}
|
|
2537
|
+
return "";
|
|
2538
|
+
}
|
|
2532
2539
|
findChildComponent(nodes) {
|
|
2533
2540
|
for (const node of nodes) {
|
|
2534
2541
|
if (node.type === "component") {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@barefootjs/go-template",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.1",
|
|
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",
|
|
@@ -54,6 +54,6 @@
|
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@barefootjs/adapter-tests": "0.1.0",
|
|
57
|
-
"@barefootjs/jsx": "0.5.
|
|
57
|
+
"@barefootjs/jsx": "0.5.1"
|
|
58
58
|
}
|
|
59
59
|
}
|
|
@@ -36,6 +36,18 @@ runAdapterConformanceTests({
|
|
|
36
36
|
// template syntax (#1266).
|
|
37
37
|
skipJsx: [
|
|
38
38
|
'return-map',
|
|
39
|
+
// #1665 whole-item loop conditional. The Go adapter correctly emits the
|
|
40
|
+
// per-item `<!--bf-loop-i:KEY-->` anchor, `data-key`, and conditional
|
|
41
|
+
// markers (verified by template-structure tests), but the array signal's
|
|
42
|
+
// initial value is not baked into the generated `NewXxxProps` constructor
|
|
43
|
+
// (`Items: nil`, unlike scalar signals such as `Sel: "b"`), so the Go SSR
|
|
44
|
+
// renders an empty loop. Populating signal-array initial values into the
|
|
45
|
+
// SSR data context is a separate pre-existing Go limitation — every other
|
|
46
|
+
// signal-loop fixture sidesteps it with an empty initial array. The
|
|
47
|
+
// anchored SSR shape with rendered items is covered by Hono + CSR
|
|
48
|
+
// conformance and the runtime hydration tests. Remove this skip once the
|
|
49
|
+
// Go limitation is fixed: https://github.com/piconic-ai/barefootjs/issues/1672
|
|
50
|
+
'loop-item-conditional',
|
|
39
51
|
// #1297 fixed the harness-side IR emission gate (multi-component
|
|
40
52
|
// sources now emit one `ir` file per component, and the harness
|
|
41
53
|
// picks the entry-point IR). The remaining gap is adapter-side:
|
|
@@ -1897,3 +1909,172 @@ describe('GoTemplateAdapter - #1448 Tier A/B fixture-driven lowering pins', () =
|
|
|
1897
1909
|
})
|
|
1898
1910
|
}
|
|
1899
1911
|
})
|
|
1912
|
+
|
|
1913
|
+
// =============================================================================
|
|
1914
|
+
// #1448 — `/* @client */` escape hatch for STILL-UNSUPPORTED methods
|
|
1915
|
+
// =============================================================================
|
|
1916
|
+
//
|
|
1917
|
+
// The catalogue in #1448 documents `/* @client */` as the universal
|
|
1918
|
+
// workaround for any Array/String method shape the template adapters
|
|
1919
|
+
// can't lower. This block pins that contract for the Go adapter: for
|
|
1920
|
+
// every remaining unsupported entry, wrapping the expression in
|
|
1921
|
+
// `/* @client */` must (a) clear the BF021/BF101 build error the bare
|
|
1922
|
+
// form raises and (b) emit a client-only placeholder so the Go SSR
|
|
1923
|
+
// pass renders valid template that the client runtime fills at
|
|
1924
|
+
// hydration.
|
|
1925
|
+
//
|
|
1926
|
+
// Why this matters beyond "no error": the unsupported *string* methods
|
|
1927
|
+
// are a silent footgun. Unlike the unsupported array methods (which
|
|
1928
|
+
// surface BF101 at build time), bare `.startsWith` / `.repeat` / …
|
|
1929
|
+
// lower to a Go method-call expression (`{{.Name.StartsWith "a"}}`)
|
|
1930
|
+
// that passes the adapter's gate with NO diagnostic — then explodes at
|
|
1931
|
+
// `go run` time with `can't evaluate field StartsWith in type string`.
|
|
1932
|
+
// `/* @client */` is the only escape hatch, so these tests pin it.
|
|
1933
|
+
describe('GoTemplateAdapter - #1448 @client escape hatch (unsupported methods)', () => {
|
|
1934
|
+
// Compile a single expression placed in `<div>` text position, with
|
|
1935
|
+
// and without the directive, and return both the build errors and
|
|
1936
|
+
// the emitted template.
|
|
1937
|
+
function emit(expr: string, client: boolean) {
|
|
1938
|
+
const marker = client ? '/* @client */ ' : ''
|
|
1939
|
+
const adapter = new GoTemplateAdapter()
|
|
1940
|
+
const ir = compileToIR(`
|
|
1941
|
+
"use client"
|
|
1942
|
+
import { createSignal } from "@barefootjs/client"
|
|
1943
|
+
export function C() {
|
|
1944
|
+
const [items, setItems] = createSignal<{ name: string; n: number; tags: string[] }[]>([])
|
|
1945
|
+
const [name, setName] = createSignal("x")
|
|
1946
|
+
const myCmp = (a: { n: number }, b: { n: number }) => a.n - b.n
|
|
1947
|
+
return <div>{${marker}${expr}}</div>
|
|
1948
|
+
}
|
|
1949
|
+
`, adapter)
|
|
1950
|
+
const template = adapter.generate(ir).template ?? ''
|
|
1951
|
+
return { errors: adapter.errors ?? [], template }
|
|
1952
|
+
}
|
|
1953
|
+
|
|
1954
|
+
// Same shape but the expression is a `.map()` chain that renders a
|
|
1955
|
+
// loop (sort follow-ups land here). The client placeholder is a
|
|
1956
|
+
// loop comment rather than a text comment.
|
|
1957
|
+
function emitLoop(chain: string, client: boolean) {
|
|
1958
|
+
const marker = client ? '/* @client */ ' : ''
|
|
1959
|
+
const adapter = new GoTemplateAdapter()
|
|
1960
|
+
const ir = compileToIR(`
|
|
1961
|
+
"use client"
|
|
1962
|
+
import { createSignal } from "@barefootjs/client"
|
|
1963
|
+
export function C() {
|
|
1964
|
+
const [items, setItems] = createSignal<{ name: string; n: number }[]>([])
|
|
1965
|
+
const myCmp = (a: { n: number }, b: { n: number }) => a.n - b.n
|
|
1966
|
+
return <ul>{${marker}${chain}}</ul>
|
|
1967
|
+
}
|
|
1968
|
+
`, adapter)
|
|
1969
|
+
const template = adapter.generate(ir).template ?? ''
|
|
1970
|
+
return { errors: adapter.errors ?? [], template }
|
|
1971
|
+
}
|
|
1972
|
+
|
|
1973
|
+
// Tier C array methods — bare form raises BF101 at build time.
|
|
1974
|
+
const unsupportedArray: Array<[string, string]> = [
|
|
1975
|
+
['reduce', `items().reduce((a, b) => a + b.n, 0)`],
|
|
1976
|
+
['flatMap', `items().flatMap(i => i.tags)`],
|
|
1977
|
+
['flat', `items().flat()`],
|
|
1978
|
+
]
|
|
1979
|
+
for (const [name, expr] of unsupportedArray) {
|
|
1980
|
+
test(`array .${name}: bare raises BF101, @client clears it + emits client placeholder`, () => {
|
|
1981
|
+
const bare = emit(expr, false)
|
|
1982
|
+
expect(bare.errors.some(e => e.code === 'BF101')).toBe(true)
|
|
1983
|
+
|
|
1984
|
+
const guarded = emit(expr, true)
|
|
1985
|
+
expect(guarded.errors).toEqual([])
|
|
1986
|
+
// Client-only text slot → `{{bfComment "client:sN"}}` placeholder.
|
|
1987
|
+
expect(guarded.template).toMatch(/bfComment "client:s\d+"/)
|
|
1988
|
+
// The unlowerable expression must NOT survive into the template.
|
|
1989
|
+
expect(guarded.template).not.toContain('.Reduce')
|
|
1990
|
+
expect(guarded.template).not.toContain('.FlatMap')
|
|
1991
|
+
})
|
|
1992
|
+
}
|
|
1993
|
+
|
|
1994
|
+
// Tier B/C string methods — bare form emits an INVALID Go method
|
|
1995
|
+
// call with NO build error (the silent footgun). `@client` is the
|
|
1996
|
+
// only thing that prevents the render-time crash.
|
|
1997
|
+
const unsupportedString: Array<[string, string, string]> = [
|
|
1998
|
+
['split', `name().split(",")`, '.Name.Split'],
|
|
1999
|
+
['startsWith', `name().startsWith("a")`, '.Name.StartsWith'],
|
|
2000
|
+
['endsWith', `name().endsWith("z")`, '.Name.EndsWith'],
|
|
2001
|
+
['replace', `name().replace("a", "b")`, '.Name.Replace'],
|
|
2002
|
+
['repeat', `name().repeat(3)`, '.Name.Repeat'],
|
|
2003
|
+
['padStart', `name().padStart(5, "0")`, '.Name.PadStart'],
|
|
2004
|
+
['padEnd', `name().padEnd(5, "0")`, '.Name.PadEnd'],
|
|
2005
|
+
['charAt', `name().charAt(0)`, '.Name.CharAt'],
|
|
2006
|
+
]
|
|
2007
|
+
for (const [name, expr, badEmit] of unsupportedString) {
|
|
2008
|
+
test(`string .${name}: bare emits invalid Go method call, @client emits client placeholder`, () => {
|
|
2009
|
+
const bare = emit(expr, false)
|
|
2010
|
+
// Documents the footgun: no BF101 guard, invalid template emitted.
|
|
2011
|
+
expect(bare.errors.filter(e => e.code === 'BF101')).toEqual([])
|
|
2012
|
+
expect(bare.template).toContain(badEmit)
|
|
2013
|
+
|
|
2014
|
+
const guarded = emit(expr, true)
|
|
2015
|
+
expect(guarded.errors).toEqual([])
|
|
2016
|
+
expect(guarded.template).toMatch(/bfComment "client:s\d+"/)
|
|
2017
|
+
expect(guarded.template).not.toContain(badEmit)
|
|
2018
|
+
})
|
|
2019
|
+
}
|
|
2020
|
+
|
|
2021
|
+
// Tier B `.sort` / `.toSorted` follow-ups still refused with BF021.
|
|
2022
|
+
const unsupportedSort: Array<[string, string]> = [
|
|
2023
|
+
['function-reference comparator', `items().toSorted(myCmp).map(x => <li key={x.name}>{x.name}</li>)`],
|
|
2024
|
+
['localeCompare locale/options arg', `items().toSorted((a, b) => a.name.localeCompare(b.name, "ja", { numeric: true })).map(x => <li key={x.name}>{x.name}</li>)`],
|
|
2025
|
+
]
|
|
2026
|
+
for (const [label, chain] of unsupportedSort) {
|
|
2027
|
+
test(`sort follow-up (${label}): bare raises BF021, @client clears it`, () => {
|
|
2028
|
+
const bare = compileJSX(`
|
|
2029
|
+
"use client"
|
|
2030
|
+
import { createSignal } from "@barefootjs/client"
|
|
2031
|
+
export function C() {
|
|
2032
|
+
const [items, setItems] = createSignal<{ name: string; n: number }[]>([])
|
|
2033
|
+
const myCmp = (a: { n: number }, b: { n: number }) => a.n - b.n
|
|
2034
|
+
return <ul>{${chain}}</ul>
|
|
2035
|
+
}
|
|
2036
|
+
`.trimStart(), 'test.tsx', { adapter: new GoTemplateAdapter() })
|
|
2037
|
+
expect(bare.errors?.some(e => e.code === 'BF021')).toBe(true)
|
|
2038
|
+
|
|
2039
|
+
const guarded = emitLoop(chain, true)
|
|
2040
|
+
expect(guarded.errors).toEqual([])
|
|
2041
|
+
// Client-only loop → `{{bfComment "loop:lN"}}…{{bfComment "/loop:lN"}}`.
|
|
2042
|
+
expect(guarded.template).toMatch(/bfComment "loop:l\d+"/)
|
|
2043
|
+
})
|
|
2044
|
+
}
|
|
2045
|
+
|
|
2046
|
+
// End-to-end proof via `go run`: the bare unsupported form crashes
|
|
2047
|
+
// the Go template execution, while the `@client` form renders a
|
|
2048
|
+
// `<!--bf-client:sN-->` placeholder. Skipped on hosts without Go.
|
|
2049
|
+
test('e2e: bare string method crashes go render, @client renders placeholder', async () => {
|
|
2050
|
+
const guarded = `
|
|
2051
|
+
"use client"
|
|
2052
|
+
import { createSignal } from "@barefootjs/client"
|
|
2053
|
+
export function C() {
|
|
2054
|
+
const [name, setName] = createSignal("hello")
|
|
2055
|
+
return <div>{/* @client */ name().repeat(3)}</div>
|
|
2056
|
+
}
|
|
2057
|
+
`
|
|
2058
|
+
const bareSrc = guarded.replace('/* @client */ ', '')
|
|
2059
|
+
try {
|
|
2060
|
+
const html = await renderGoTemplateComponent({
|
|
2061
|
+
source: guarded.trimStart(),
|
|
2062
|
+
adapter: new GoTemplateAdapter(),
|
|
2063
|
+
})
|
|
2064
|
+
expect(html).toContain('<!--bf-client:s0-->')
|
|
2065
|
+
} catch (err) {
|
|
2066
|
+
if (err instanceof GoNotAvailableError) {
|
|
2067
|
+
console.log('Skipping #1448 @client e2e: go command not found')
|
|
2068
|
+
return
|
|
2069
|
+
}
|
|
2070
|
+
throw err
|
|
2071
|
+
}
|
|
2072
|
+
// Bare form must fail Go template execution (no @client guard).
|
|
2073
|
+
await expect(
|
|
2074
|
+
renderGoTemplateComponent({
|
|
2075
|
+
source: bareSrc.trimStart(),
|
|
2076
|
+
adapter: new GoTemplateAdapter(),
|
|
2077
|
+
}),
|
|
2078
|
+
).rejects.toThrow(/can't evaluate field Repeat in type string/)
|
|
2079
|
+
})
|
|
2080
|
+
})
|
|
@@ -3983,6 +3983,11 @@ export class GoTemplateAdapter extends BaseAdapter implements ParsedExprEmitter,
|
|
|
3983
3983
|
}
|
|
3984
3984
|
}
|
|
3985
3985
|
const children = this.renderChildren(loop.children)
|
|
3986
|
+
// Build the per-item anchor marker while the loop param is still on the
|
|
3987
|
+
// stack, so a `bodyIsItemConditional` key expression (#1665) resolves
|
|
3988
|
+
// against the range item (`.` context) like `data-key` does — popping
|
|
3989
|
+
// first would rewrite `t.id` to `.T.ID` instead of `.ID`.
|
|
3990
|
+
const itemMarker = this.loopItemMarker(loop)
|
|
3986
3991
|
for (const v of addedLoopVars) {
|
|
3987
3992
|
const rc = (this.loopVarRefCount.get(v) ?? 1) - 1
|
|
3988
3993
|
if (rc <= 0) this.loopVarRefCount.delete(v)
|
|
@@ -4020,15 +4025,29 @@ export class GoTemplateAdapter extends BaseAdapter implements ParsedExprEmitter,
|
|
|
4020
4025
|
filterCond = 'true'
|
|
4021
4026
|
}
|
|
4022
4027
|
|
|
4023
|
-
// Per-item start marker for multi-root Fragment items (#1212).
|
|
4024
|
-
const itemMarker = loop.bodyIsMultiRoot ? `{{bfComment "bf-loop-i"}}` : ''
|
|
4025
4028
|
return `{{bfComment "loop:${loop.markerId}"}}{{range $${rangeIndex}, $${rangeValue} := ${goArray}}}{{if ${filterCond}}}${itemMarker}${children}{{end}}{{end}}{{bfComment "/loop:${loop.markerId}"}}`
|
|
4026
4029
|
}
|
|
4027
4030
|
|
|
4028
|
-
const itemMarker = loop.bodyIsMultiRoot ? `{{bfComment "bf-loop-i"}}` : ''
|
|
4029
4031
|
return `{{bfComment "loop:${loop.markerId}"}}{{range $${rangeIndex}, $${rangeValue} := ${goArray}}}${itemMarker}${children}{{end}}{{bfComment "/loop:${loop.markerId}"}}`
|
|
4030
4032
|
}
|
|
4031
4033
|
|
|
4034
|
+
/**
|
|
4035
|
+
* Per-item `<!--bf-loop-i-->` / `<!--bf-loop-i:KEY-->` start marker emitted
|
|
4036
|
+
* inside a `{{range}}` body. Multi-root Fragment items (#1212) get the bare
|
|
4037
|
+
* anchor; whole-item conditional items (#1665) get the key-bearing anchor so
|
|
4038
|
+
* the client's `mapArrayAnchored` can hydrate items that render no element.
|
|
4039
|
+
*/
|
|
4040
|
+
private loopItemMarker(loop: { bodyIsMultiRoot?: boolean; bodyIsItemConditional?: boolean; key?: string | null }): string {
|
|
4041
|
+
if (loop.bodyIsMultiRoot) return `{{bfComment "bf-loop-i"}}`
|
|
4042
|
+
if (loop.bodyIsItemConditional && loop.key) {
|
|
4043
|
+
// `bfComment` prepends `bf-`, so `printf "loop-i:%v"` yields
|
|
4044
|
+
// `<!--bf-loop-i:KEY-->`. The key expression resolves against the
|
|
4045
|
+
// current range item (`.` context), matching `data-key`'s emission.
|
|
4046
|
+
return `{{bfComment (printf "loop-i:%v" ${this.convertExpressionToGo(loop.key)})}}`
|
|
4047
|
+
}
|
|
4048
|
+
return ''
|
|
4049
|
+
}
|
|
4050
|
+
|
|
4032
4051
|
/**
|
|
4033
4052
|
* Find the first component child in a list of nodes
|
|
4034
4053
|
*/
|