@barefootjs/go-template 0.18.7 → 0.19.0
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/emit-context.d.ts +11 -5
- package/dist/adapter/emit-context.d.ts.map +1 -1
- package/dist/adapter/go-template-adapter.d.ts +37 -4
- package/dist/adapter/go-template-adapter.d.ts.map +1 -1
- package/dist/adapter/index.js +175 -21
- package/dist/adapter/lib/compile-state.d.ts +16 -0
- package/dist/adapter/lib/compile-state.d.ts.map +1 -1
- package/dist/adapter/lib/types.d.ts +9 -0
- package/dist/adapter/lib/types.d.ts.map +1 -1
- package/dist/adapter/props/prop-types.d.ts +45 -0
- package/dist/adapter/props/prop-types.d.ts.map +1 -1
- package/dist/build.js +175 -21
- package/dist/index.js +175 -21
- package/package.json +3 -3
- package/src/__tests__/go-template-adapter.test.ts +169 -18
- package/src/adapter/emit-context.ts +14 -5
- package/src/adapter/go-template-adapter.ts +185 -20
- package/src/adapter/lib/compile-state.ts +18 -0
- package/src/adapter/lib/types.ts +9 -0
- package/src/adapter/props/prop-types.ts +178 -1
- package/src/adapter/value/value-lowering.ts +1 -1
- package/src/test-render.ts +18 -4
|
@@ -33,13 +33,19 @@ export interface GoEmitContext {
|
|
|
33
33
|
condition: string;
|
|
34
34
|
preamble: string;
|
|
35
35
|
};
|
|
36
|
-
/** Extract the prop name from a `props.X ?? …` initial value, or null. */
|
|
37
|
-
extractPropNameFromInitialValue(initialValue: string): string | null;
|
|
38
36
|
/**
|
|
39
|
-
*
|
|
40
|
-
*
|
|
37
|
+
* Extract the prop name from a `props.X ?? …` initial value — or, given
|
|
38
|
+
* `preParsed` in a destructured component, an `x ?? …` identifier form —
|
|
39
|
+
* or null. Callers validate the name against `propsParams`.
|
|
41
40
|
*/
|
|
42
|
-
|
|
41
|
+
extractPropNameFromInitialValue(initialValue: string, preParsed?: ParsedExpr): string | null;
|
|
42
|
+
/**
|
|
43
|
+
* Parse a signal-time initial value `props.X ?? <literal>` (or the
|
|
44
|
+
* destructured `x ?? <literal>` form when `preParsed` is given) into the
|
|
45
|
+
* source prop name and the Go-formatted fallback, or null when it isn't
|
|
46
|
+
* that shape. Callers validate the name against `propsParams`.
|
|
47
|
+
*/
|
|
48
|
+
extractPropFallback(initialValue: string, preParsed?: ParsedExpr): {
|
|
43
49
|
propName: string;
|
|
44
50
|
goFallback: string;
|
|
45
51
|
} | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit-context.d.ts","sourceRoot":"","sources":["../../src/adapter/emit-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAE1D,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;IAE5B;;;OAGG;IACH,qBAAqB,CACnB,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,UAAU,CAAA;KAAE,EAC7B,SAAS,CAAC,EAAE,UAAU,GACrB,MAAM,CAAA;IAET;;;OAGG;IACH,oBAAoB,CAClB,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,UAAU,GACrB;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAE1C
|
|
1
|
+
{"version":3,"file":"emit-context.d.ts","sourceRoot":"","sources":["../../src/adapter/emit-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAE1D,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;IAE5B;;;OAGG;IACH,qBAAqB,CACnB,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,UAAU,CAAA;KAAE,EAC7B,SAAS,CAAC,EAAE,UAAU,GACrB,MAAM,CAAA;IAET;;;OAGG;IACH,oBAAoB,CAClB,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,UAAU,GACrB;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAE1C;;;;OAIG;IACH,+BAA+B,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAAA;IAE5F;;;;;OAKG;IACH,mBAAmB,CACjB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,UAAU,GACrB;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAElD;;;;OAIG;IACH,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;CACtD"}
|
|
@@ -374,18 +374,32 @@ export declare class GoTemplateAdapter extends BaseAdapter implements ParsedExpr
|
|
|
374
374
|
*/
|
|
375
375
|
private collectPropFallbackVars;
|
|
376
376
|
/**
|
|
377
|
-
* Parse a signal-time initial value of the form `props.X ?? <literal>`
|
|
378
|
-
*
|
|
379
|
-
*
|
|
380
|
-
* the fallback isn't a simple literal `goPropDefault`
|
|
377
|
+
* Parse a signal-time initial value of the form `props.X ?? <literal>` —
|
|
378
|
+
* or, for destructured components, `x ?? <literal>` — into the source prop
|
|
379
|
+
* name and the Go-formatted fallback. Returns null when the expression
|
|
380
|
+
* isn't that shape or the fallback isn't a simple literal `goPropDefault`
|
|
381
|
+
* can translate.
|
|
382
|
+
*
|
|
383
|
+
* `preParsed` (the signal's best-effort `ParsedExpr`) is matched
|
|
384
|
+
* structurally when available; the regex handles only the props-object
|
|
385
|
+
* member form for callers without a tree (memo computations). A bare
|
|
386
|
+
* identifier can shadow a same-named prop (loop/callback params — the
|
|
387
|
+
* `collectNullishConsumedPropNames` limitation class), so every caller
|
|
388
|
+
* validates the returned name against `ir.metadata.propsParams`.
|
|
381
389
|
*
|
|
382
390
|
* Keeps the original prop reference (not just the resolved value) so
|
|
383
391
|
* caller-supplied non-zero inputs are honoured.
|
|
384
392
|
*/
|
|
385
393
|
private extractPropFallback;
|
|
394
|
+
/** Structural half of {@link extractPropFallback}. */
|
|
395
|
+
private extractPropFallbackFromParsed;
|
|
386
396
|
/**
|
|
387
397
|
* Extract the prop name from a signal's `props.xxx`-pattern initialValue,
|
|
388
398
|
* e.g. `"props.initial ?? 0"` → `"initial"`, `"props.checked"` → `"checked"`.
|
|
399
|
+
* For destructured components (`propsObjectName` null) the same shapes are
|
|
400
|
+
* matched structurally on `preParsed` with an identifier left operand
|
|
401
|
+
* (`size ?? 0` → `"size"`); callers validate the name against
|
|
402
|
+
* `propsParams`, which filters shadowing locals.
|
|
389
403
|
*/
|
|
390
404
|
private extractPropNameFromInitialValue;
|
|
391
405
|
/**
|
|
@@ -541,6 +555,25 @@ export declare class GoTemplateAdapter extends BaseAdapter implements ParsedExpr
|
|
|
541
555
|
private _isStringValueName;
|
|
542
556
|
unary(op: string, argument: ParsedExpr, emit: (e: ParsedExpr) => string): string;
|
|
543
557
|
logical(op: '&&' | '||' | '??', left: ParsedExpr, right: ParsedExpr, emit: (e: ParsedExpr) => string): string;
|
|
558
|
+
/**
|
|
559
|
+
* The nillable-prop name a `??` left operand refers to, or null. Matches
|
|
560
|
+
* the two prop-reference shapes (`label` destructured, `props.label`
|
|
561
|
+
* object-style) against `nullishConsumedPropNames ∩ nillablePropNames`.
|
|
562
|
+
*
|
|
563
|
+
* The intersection matters: `nillablePropNames` alone OVERAPPROXIMATES —
|
|
564
|
+
* it is collected before local type aliases are registered, so an
|
|
565
|
+
* alias-typed prop (`placement?: TooltipPlacement`) can sit in the set
|
|
566
|
+
* while its emitted struct field is the concrete alias type. On such a
|
|
567
|
+
* concrete field "absent" is invisible (the zero value), so the
|
|
568
|
+
* truthiness-based `or` is the correct approximation and `bf_nullish`
|
|
569
|
+
* would wrongly KEEP the zero value (e.g. Tooltip's
|
|
570
|
+
* `placementClasses[props.placement ?? 'top']` would resolve to no
|
|
571
|
+
* class for an omitted placement). Requiring `nullishConsumedPropNames`
|
|
572
|
+
* membership pins the
|
|
573
|
+
* gate to props the `??` analysis actually saw — the same set that drives
|
|
574
|
+
* the `interface{}` flip in `resolvePropGoType`.
|
|
575
|
+
*/
|
|
576
|
+
private nillablePropNameOf;
|
|
544
577
|
conditional(test: ParsedExpr, consequent: ParsedExpr, alternate: ParsedExpr, emit: (e: ParsedExpr) => string): string;
|
|
545
578
|
templateLiteral(parts: TemplatePart[], emit: (e: ParsedExpr) => string): string;
|
|
546
579
|
arrow(params: string[], _body: ParsedExpr, _emit: (e: ParsedExpr) => string): string;
|
|
@@ -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,
|
|
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
|
@@ -24,7 +24,7 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
24
24
|
// src/adapter/go-template-adapter.ts
|
|
25
25
|
import {
|
|
26
26
|
BaseAdapter,
|
|
27
|
-
isBooleanAttr,
|
|
27
|
+
isBooleanAttr as isBooleanAttr2,
|
|
28
28
|
parseExpression as parseExpression4,
|
|
29
29
|
stringifyParsedExpr as stringifyParsedExpr2,
|
|
30
30
|
parseStyleObjectEntries,
|
|
@@ -366,6 +366,8 @@ class CompileState {
|
|
|
366
366
|
hoistedMemoLocals = new Map;
|
|
367
367
|
loweringMatchers = [];
|
|
368
368
|
nillablePropNames = new Set;
|
|
369
|
+
nullishConsumedPropNames = new Set;
|
|
370
|
+
omittableAttrConsumedPropNames = new Set;
|
|
369
371
|
stringValueNames = new Set;
|
|
370
372
|
rootScopeNodes = new Set;
|
|
371
373
|
memoBackedLoopSlice = new Map;
|
|
@@ -1115,7 +1117,7 @@ function convertInitialValue(ctx, value, typeInfo, propsParams, preParsed) {
|
|
|
1115
1117
|
return `in.${capitalizeFieldName(value)}`;
|
|
1116
1118
|
}
|
|
1117
1119
|
}
|
|
1118
|
-
const propName = ctx.extractPropNameFromInitialValue(value);
|
|
1120
|
+
const propName = ctx.extractPropNameFromInitialValue(value, preParsed);
|
|
1119
1121
|
if (propName && propsParams?.some((p) => p.name === propName)) {
|
|
1120
1122
|
return `in.${capitalizeFieldName(propName)}`;
|
|
1121
1123
|
}
|
|
@@ -2259,11 +2261,12 @@ function recordIndexAccessToGoMap(ctx, val, ir) {
|
|
|
2259
2261
|
}
|
|
2260
2262
|
|
|
2261
2263
|
// src/adapter/props/prop-types.ts
|
|
2264
|
+
import { isBooleanAttr } from "@barefootjs/jsx";
|
|
2262
2265
|
function buildPropTypeOverrides(ctx, ir) {
|
|
2263
2266
|
const overrides = new Map;
|
|
2264
2267
|
for (const signal of ir.metadata.signals) {
|
|
2265
2268
|
const propNames = [signal.initialValue];
|
|
2266
|
-
const extracted = ctx.extractPropNameFromInitialValue(signal.initialValue);
|
|
2269
|
+
const extracted = ctx.extractPropNameFromInitialValue(signal.initialValue, signal.parsed);
|
|
2267
2270
|
if (extracted)
|
|
2268
2271
|
propNames.push(extracted);
|
|
2269
2272
|
for (const propName of propNames) {
|
|
@@ -2320,11 +2323,96 @@ function collectToFixedPropNames(root) {
|
|
|
2320
2323
|
walk(root);
|
|
2321
2324
|
return names;
|
|
2322
2325
|
}
|
|
2326
|
+
var NULLISH_SCALAR_GO_TYPES = new Set(["string", "int", "float64", "bool"]);
|
|
2327
|
+
function collectNullishConsumedPropNames(ctx, ir) {
|
|
2328
|
+
const names = new Set;
|
|
2329
|
+
const optionalParams = new Set(ir.metadata.propsParams.filter((p) => p.optional && p.defaultValue == null).map((p) => p.name));
|
|
2330
|
+
if (optionalParams.size === 0)
|
|
2331
|
+
return names;
|
|
2332
|
+
const propsObject = ctx.state.propsObjectName;
|
|
2333
|
+
const propNameOfLeft = (left) => {
|
|
2334
|
+
if (left.kind === "identifier")
|
|
2335
|
+
return left.name;
|
|
2336
|
+
if (left.kind === "member" && !left.computed && left.object.kind === "identifier" && left.object.name === propsObject) {
|
|
2337
|
+
return left.property;
|
|
2338
|
+
}
|
|
2339
|
+
return null;
|
|
2340
|
+
};
|
|
2341
|
+
const isZeroEquivalentLiteral = (right) => right.kind === "literal" && (right.value === "" || right.value === false || right.value === null || right.literalType === "number" && Number(right.value) === 0);
|
|
2342
|
+
const walk = (node) => {
|
|
2343
|
+
if (!node || typeof node !== "object")
|
|
2344
|
+
return;
|
|
2345
|
+
if (Array.isArray(node)) {
|
|
2346
|
+
for (const item of node)
|
|
2347
|
+
walk(item);
|
|
2348
|
+
return;
|
|
2349
|
+
}
|
|
2350
|
+
const rec = node;
|
|
2351
|
+
if (rec.kind === "logical" && rec.op === "??" && rec.left && rec.right) {
|
|
2352
|
+
const propName = propNameOfLeft(rec.left);
|
|
2353
|
+
if (propName && optionalParams.has(propName) && !isZeroEquivalentLiteral(rec.right)) {
|
|
2354
|
+
names.add(propName);
|
|
2355
|
+
}
|
|
2356
|
+
}
|
|
2357
|
+
for (const value of Object.values(rec))
|
|
2358
|
+
walk(value);
|
|
2359
|
+
};
|
|
2360
|
+
walk(ir.root);
|
|
2361
|
+
for (const signal of ir.metadata.signals) {
|
|
2362
|
+
const match = ctx.extractPropFallback(signal.initialValue, signal.parsed);
|
|
2363
|
+
if (!match || !optionalParams.has(match.propName))
|
|
2364
|
+
continue;
|
|
2365
|
+
const f = match.goFallback;
|
|
2366
|
+
if (f === '""' || f === "false" || f === "nil" || Number(f) === 0)
|
|
2367
|
+
continue;
|
|
2368
|
+
names.add(match.propName);
|
|
2369
|
+
}
|
|
2370
|
+
return names;
|
|
2371
|
+
}
|
|
2372
|
+
function collectOmittableAttrConsumedPropNames(ctx, ir) {
|
|
2373
|
+
const names = new Set;
|
|
2374
|
+
const optionalParams = new Set(ir.metadata.propsParams.filter((p) => p.optional && p.defaultValue == null).map((p) => p.name));
|
|
2375
|
+
if (optionalParams.size === 0)
|
|
2376
|
+
return names;
|
|
2377
|
+
const propsObject = ctx.state.propsObjectName;
|
|
2378
|
+
const walk = (node) => {
|
|
2379
|
+
if (!node || typeof node !== "object")
|
|
2380
|
+
return;
|
|
2381
|
+
if (Array.isArray(node)) {
|
|
2382
|
+
for (const item of node)
|
|
2383
|
+
walk(item);
|
|
2384
|
+
return;
|
|
2385
|
+
}
|
|
2386
|
+
const rec = node;
|
|
2387
|
+
if (rec.type === "element" && Array.isArray(rec.attrs)) {
|
|
2388
|
+
for (const attr of rec.attrs) {
|
|
2389
|
+
if (attr.name === "class" || attr.name === "className" || attr.name === "style")
|
|
2390
|
+
continue;
|
|
2391
|
+
if (isBooleanAttr(attr.name))
|
|
2392
|
+
continue;
|
|
2393
|
+
if (attr.value?.kind !== "expression" || attr.value.presenceOrUndefined)
|
|
2394
|
+
continue;
|
|
2395
|
+
const bareId = String(attr.value.expr ?? "").trim();
|
|
2396
|
+
const propName = propsObject && bareId.startsWith(`${propsObject}.`) ? bareId.slice(propsObject.length + 1) : bareId;
|
|
2397
|
+
if (/^[A-Za-z_$][\w$]*$/.test(propName) && optionalParams.has(propName)) {
|
|
2398
|
+
names.add(propName);
|
|
2399
|
+
}
|
|
2400
|
+
}
|
|
2401
|
+
}
|
|
2402
|
+
for (const value of Object.values(rec))
|
|
2403
|
+
walk(value);
|
|
2404
|
+
};
|
|
2405
|
+
walk(ir.root);
|
|
2406
|
+
return names;
|
|
2407
|
+
}
|
|
2323
2408
|
function resolvePropGoType(ctx, param, propTypeOverrides) {
|
|
2324
2409
|
const base = propTypeOverrides.get(param.name) ?? typeInfoToGo(ctx, param.type, param.defaultValue);
|
|
2325
2410
|
if (param.optional && ctx.state.localStructFields.has(base)) {
|
|
2326
2411
|
return "map[string]interface{}";
|
|
2327
2412
|
}
|
|
2413
|
+
if (param.optional && param.type.kind === "primitive" && (ctx.state.nullishConsumedPropNames.has(param.name) || ctx.state.omittableAttrConsumedPropNames.has(param.name)) && NULLISH_SCALAR_GO_TYPES.has(base)) {
|
|
2414
|
+
return "interface{}";
|
|
2415
|
+
}
|
|
2328
2416
|
return base;
|
|
2329
2417
|
}
|
|
2330
2418
|
function collectNillablePropNames(ctx, ir) {
|
|
@@ -2403,8 +2491,8 @@ class GoTemplateAdapter extends BaseAdapter {
|
|
|
2403
2491
|
state: this.state,
|
|
2404
2492
|
convertExpressionToGo: (jsExpr, out, preParsed) => this.convertExpressionToGo(jsExpr, out, preParsed),
|
|
2405
2493
|
convertConditionToGo: (jsCondition, preParsed) => this.convertConditionToGo(jsCondition, preParsed),
|
|
2406
|
-
extractPropNameFromInitialValue: (initialValue) => this.extractPropNameFromInitialValue(initialValue),
|
|
2407
|
-
extractPropFallback: (initialValue) => this.extractPropFallback(initialValue),
|
|
2494
|
+
extractPropNameFromInitialValue: (initialValue, preParsed) => this.extractPropNameFromInitialValue(initialValue, preParsed),
|
|
2495
|
+
extractPropFallback: (initialValue, preParsed) => this.extractPropFallback(initialValue, preParsed),
|
|
2408
2496
|
resolveModuleStringConst: (name) => this.resolveModuleStringConst(name)
|
|
2409
2497
|
};
|
|
2410
2498
|
get errors() {
|
|
@@ -2456,6 +2544,10 @@ class GoTemplateAdapter extends BaseAdapter {
|
|
|
2456
2544
|
}
|
|
2457
2545
|
this.state.loweringMatchers = prepareLoweringMatchers(ir.metadata);
|
|
2458
2546
|
augmentInheritedPropAccesses(ir);
|
|
2547
|
+
this.buildLocalTypeTables(ir, ir.metadata.componentName);
|
|
2548
|
+
this.state.nullishConsumedPropNames = collectNullishConsumedPropNames(this.emitCtx, ir);
|
|
2549
|
+
this.state.omittableAttrConsumedPropNames = collectOmittableAttrConsumedPropNames(this.emitCtx, ir);
|
|
2550
|
+
this.state.nillablePropNames = collectNillablePropNames(this.emitCtx, ir);
|
|
2459
2551
|
}
|
|
2460
2552
|
generate(ir, options) {
|
|
2461
2553
|
this.state.componentName = ir.metadata.componentName;
|
|
@@ -2464,7 +2556,6 @@ class GoTemplateAdapter extends BaseAdapter {
|
|
|
2464
2556
|
this.state.templateVarCounter = 0;
|
|
2465
2557
|
this.state.pendingChildrenDefines = [];
|
|
2466
2558
|
this.primeCompileState(ir);
|
|
2467
|
-
this.state.nillablePropNames = collectNillablePropNames(this.emitCtx, ir);
|
|
2468
2559
|
this.state.stringValueNames = collectStringValueNames(ir);
|
|
2469
2560
|
if (!options?.siblingTemplatesRegistered) {
|
|
2470
2561
|
this.checkImportedLoopChildComponents(ir);
|
|
@@ -2983,10 +3074,18 @@ ${goFields.join(`
|
|
|
2983
3074
|
this.emitStaticBodyWrappers(lines, ir, componentName, staticWithBody, emittedWrapperVars);
|
|
2984
3075
|
const propFallbackVars = this.collectPropFallbackVars(ir);
|
|
2985
3076
|
for (const [, info] of propFallbackVars) {
|
|
2986
|
-
|
|
2987
|
-
|
|
2988
|
-
|
|
2989
|
-
|
|
3077
|
+
if (info.assertType) {
|
|
3078
|
+
const deref = info.assertType === "int" ? `bf.ToInt(in.${info.fieldName})` : info.assertType === "float64" ? `bf.ToFloat64(in.${info.fieldName})` : `in.${info.fieldName}.(${info.assertType})`;
|
|
3079
|
+
lines.push(` var ${info.varName} ${info.assertType} = ${info.goFallback}`);
|
|
3080
|
+
lines.push(` if in.${info.fieldName} != nil {`);
|
|
3081
|
+
lines.push(` ${info.varName} = ${deref}`);
|
|
3082
|
+
lines.push(` }`);
|
|
3083
|
+
} else {
|
|
3084
|
+
lines.push(` ${info.varName} := in.${info.fieldName}`);
|
|
3085
|
+
lines.push(` if ${info.varName} == ${info.zeroLiteral} {`);
|
|
3086
|
+
lines.push(` ${info.varName} = ${info.goFallback}`);
|
|
3087
|
+
lines.push(` }`);
|
|
3088
|
+
}
|
|
2990
3089
|
}
|
|
2991
3090
|
if (propFallbackVars.size > 0)
|
|
2992
3091
|
lines.push("");
|
|
@@ -3066,7 +3165,7 @@ ${goFields.join(`
|
|
|
3066
3165
|
const fieldName = capitalizeFieldName(signal.getter);
|
|
3067
3166
|
if (propFieldNames.has(fieldName))
|
|
3068
3167
|
continue;
|
|
3069
|
-
const fallbackMatch = this.extractPropFallback(signal.initialValue);
|
|
3168
|
+
const fallbackMatch = this.extractPropFallback(signal.initialValue, signal.parsed);
|
|
3070
3169
|
const hoisted = fallbackMatch ? propFallbackVars.get(fallbackMatch.propName) : undefined;
|
|
3071
3170
|
if (hoisted) {
|
|
3072
3171
|
lines.push(` ${fieldName}: ${hoisted.varName},`);
|
|
@@ -3912,8 +4011,9 @@ ${goFields.join(`
|
|
|
3912
4011
|
for (const nested of findNestedComponents(ir.root)) {
|
|
3913
4012
|
localTaken.add(`${nested.name.charAt(0).toLowerCase()}${nested.name.slice(1)}s`);
|
|
3914
4013
|
}
|
|
4014
|
+
const propTypeOverrides = buildPropTypeOverrides(this.emitCtx, ir);
|
|
3915
4015
|
for (const signal of ir.metadata.signals) {
|
|
3916
|
-
const match = this.extractPropFallback(signal.initialValue);
|
|
4016
|
+
const match = this.extractPropFallback(signal.initialValue, signal.parsed);
|
|
3917
4017
|
if (!match)
|
|
3918
4018
|
continue;
|
|
3919
4019
|
if (result.has(match.propName))
|
|
@@ -3924,6 +4024,8 @@ ${goFields.join(`
|
|
|
3924
4024
|
if (goPropDefault(param.defaultValue) !== null)
|
|
3925
4025
|
continue;
|
|
3926
4026
|
const fieldName = capitalizeFieldName(match.propName);
|
|
4027
|
+
const concreteType = propTypeOverrides.get(param.name) ?? typeInfoToGo(this.emitCtx, param.type, param.defaultValue);
|
|
4028
|
+
const nullishLowered = NULLISH_SCALAR_GO_TYPES.has(concreteType) && resolvePropGoType(this.emitCtx, param, propTypeOverrides) === "interface{}";
|
|
3927
4029
|
let zeroLiteral;
|
|
3928
4030
|
if (match.goFallback === "true" || match.goFallback === "false") {
|
|
3929
4031
|
zeroLiteral = "false";
|
|
@@ -3934,20 +4036,31 @@ ${goFields.join(`
|
|
|
3934
4036
|
} else {
|
|
3935
4037
|
continue;
|
|
3936
4038
|
}
|
|
3937
|
-
if (
|
|
3938
|
-
|
|
3939
|
-
|
|
3940
|
-
|
|
4039
|
+
if (!nullishLowered) {
|
|
4040
|
+
if (match.goFallback === zeroLiteral)
|
|
4041
|
+
continue;
|
|
4042
|
+
if (zeroLiteral === "0" && Number(match.goFallback) === 0)
|
|
4043
|
+
continue;
|
|
4044
|
+
}
|
|
3941
4045
|
let varName = match.propName;
|
|
3942
4046
|
while (localTaken.has(varName) || GO_KEYWORDS.has(varName)) {
|
|
3943
4047
|
varName += "_";
|
|
3944
4048
|
}
|
|
3945
4049
|
localTaken.add(varName);
|
|
3946
|
-
result.set(match.propName, {
|
|
4050
|
+
result.set(match.propName, {
|
|
4051
|
+
varName,
|
|
4052
|
+
fieldName,
|
|
4053
|
+
goFallback: match.goFallback,
|
|
4054
|
+
zeroLiteral,
|
|
4055
|
+
...nullishLowered ? { assertType: concreteType } : {}
|
|
4056
|
+
});
|
|
3947
4057
|
}
|
|
3948
4058
|
return result;
|
|
3949
4059
|
}
|
|
3950
|
-
extractPropFallback(initialValue) {
|
|
4060
|
+
extractPropFallback(initialValue, preParsed) {
|
|
4061
|
+
const structural = preParsed ? this.extractPropFallbackFromParsed(preParsed) : null;
|
|
4062
|
+
if (structural)
|
|
4063
|
+
return structural;
|
|
3951
4064
|
if (!this.state.propsObjectName)
|
|
3952
4065
|
return null;
|
|
3953
4066
|
const trimmed = initialValue.trim();
|
|
@@ -3961,9 +4074,38 @@ ${goFields.join(`
|
|
|
3961
4074
|
return null;
|
|
3962
4075
|
return { propName: m[1], goFallback };
|
|
3963
4076
|
}
|
|
3964
|
-
|
|
3965
|
-
if (
|
|
4077
|
+
extractPropFallbackFromParsed(preParsed) {
|
|
4078
|
+
if (preParsed.kind !== "logical" || preParsed.op !== "??")
|
|
4079
|
+
return null;
|
|
4080
|
+
const left = preParsed.left;
|
|
4081
|
+
const propName = left.kind === "identifier" && !this.state.propsObjectName ? left.name : left.kind === "member" && !left.computed && left.object.kind === "identifier" && left.object.name === this.state.propsObjectName ? left.property : null;
|
|
4082
|
+
if (!propName)
|
|
4083
|
+
return null;
|
|
4084
|
+
let right = preParsed.right;
|
|
4085
|
+
let negate = "";
|
|
4086
|
+
if (right.kind === "unary" && right.op === "-") {
|
|
4087
|
+
negate = "-";
|
|
4088
|
+
right = right.argument;
|
|
4089
|
+
}
|
|
4090
|
+
if (right.kind !== "literal")
|
|
4091
|
+
return null;
|
|
4092
|
+
if (negate && right.literalType !== "number")
|
|
4093
|
+
return null;
|
|
4094
|
+
if (right.literalType === "string") {
|
|
4095
|
+
return { propName, goFallback: JSON.stringify(right.value) };
|
|
4096
|
+
}
|
|
4097
|
+
const goFallback = goPropDefault(negate + (right.raw ?? String(right.value)));
|
|
4098
|
+
if (goFallback === null)
|
|
3966
4099
|
return null;
|
|
4100
|
+
return { propName, goFallback };
|
|
4101
|
+
}
|
|
4102
|
+
extractPropNameFromInitialValue(initialValue, preParsed) {
|
|
4103
|
+
if (!this.state.propsObjectName) {
|
|
4104
|
+
if (preParsed?.kind === "logical" && (preParsed.op === "??" || preParsed.op === "||") && preParsed.left.kind === "identifier") {
|
|
4105
|
+
return preParsed.left.name;
|
|
4106
|
+
}
|
|
4107
|
+
return null;
|
|
4108
|
+
}
|
|
3967
4109
|
const trimmed = initialValue.trim();
|
|
3968
4110
|
const name = this.state.propsObjectName;
|
|
3969
4111
|
const direct = new RegExp(`^${name}\\.(\\w+)(?:\\s*(?:\\?\\?|\\|\\|)\\s*.+)?$`);
|
|
@@ -4375,8 +4517,20 @@ ${goFields.join(`
|
|
|
4375
4517
|
const wrapRight = wrapIfMultiToken(emit(right));
|
|
4376
4518
|
if (op === "&&")
|
|
4377
4519
|
return `and ${wrapLeft} ${wrapRight}`;
|
|
4520
|
+
if (op === "??" && this.nillablePropNameOf(left) !== null) {
|
|
4521
|
+
return `bf_nullish ${wrapLeft} ${wrapRight}`;
|
|
4522
|
+
}
|
|
4378
4523
|
return `or ${wrapLeft} ${wrapRight}`;
|
|
4379
4524
|
}
|
|
4525
|
+
nillablePropNameOf(expr) {
|
|
4526
|
+
let name = null;
|
|
4527
|
+
if (expr.kind === "identifier") {
|
|
4528
|
+
name = expr.name;
|
|
4529
|
+
} else if (expr.kind === "member" && !expr.computed && expr.object.kind === "identifier" && expr.object.name === this.state.propsObjectName) {
|
|
4530
|
+
name = expr.property;
|
|
4531
|
+
}
|
|
4532
|
+
return name !== null && this.state.nullishConsumedPropNames.has(name) && this.state.nillablePropNames.has(name) ? name : null;
|
|
4533
|
+
}
|
|
4380
4534
|
conditional(test, consequent, alternate, emit) {
|
|
4381
4535
|
const t = emit(test);
|
|
4382
4536
|
const c = this.renderConditionalBranch(consequent);
|
|
@@ -5682,7 +5836,7 @@ ${children}`;
|
|
|
5682
5836
|
if (css !== null)
|
|
5683
5837
|
return `style="${css}"`;
|
|
5684
5838
|
}
|
|
5685
|
-
if (
|
|
5839
|
+
if (isBooleanAttr2(name) || value.presenceOrUndefined) {
|
|
5686
5840
|
const { condition: goCond, preamble } = this.convertConditionToGo(value.expr, value.parsed);
|
|
5687
5841
|
const body = name.startsWith("aria-") ? `${name}="true"` : name;
|
|
5688
5842
|
return `${preamble}{{if ${goCond}}}${body}{{end}}`;
|
|
@@ -115,6 +115,22 @@ export declare class CompileState {
|
|
|
115
115
|
* whose value is a bare reference to such a prop when it's nil.
|
|
116
116
|
*/
|
|
117
117
|
nillablePropNames: Set<string>;
|
|
118
|
+
/**
|
|
119
|
+
* OPTIONAL prop names consumed nullish-sensitively (`??` left operand in a
|
|
120
|
+
* parsed expression tree, or a signal's `props.X ?? <literal>` seed) —
|
|
121
|
+
* #2248. Consulted by `resolvePropGoType` to flip an optional scalar to the
|
|
122
|
+
* nillable `interface{}` representation, so it MUST be populated before the
|
|
123
|
+
* first `resolvePropGoType` call of a compile (see `generate()`'s ordering
|
|
124
|
+
* against `collectNillablePropNames`).
|
|
125
|
+
*/
|
|
126
|
+
nullishConsumedPropNames: Set<string>;
|
|
127
|
+
/**
|
|
128
|
+
* OPTIONAL no-default prop names consumed as a BARE omittable-attribute
|
|
129
|
+
* value (`rows={rows}`) — #2259. Same `resolvePropGoType` flip and same
|
|
130
|
+
* populate-before-first-resolve ordering as `nullishConsumedPropNames`:
|
|
131
|
+
* the attribute-omission guard (`{{if ne .X nil}}`) needs a nillable field.
|
|
132
|
+
*/
|
|
133
|
+
omittableAttrConsumedPropNames: Set<string>;
|
|
118
134
|
/**
|
|
119
135
|
* String-typed signal getter / prop names (#2168 string-concat-plus).
|
|
120
136
|
* Feeds `isStringName` for `isStringConcatBinary`, which decides whether a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compile-state.d.ts","sourceRoot":"","sources":["../../../src/adapter/lib/compile-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,eAAe,EACf,UAAU,EACV,MAAM,EACN,eAAe,EACf,QAAQ,EACR,WAAW,EACX,cAAc,EACd,QAAQ,EACT,MAAM,iBAAiB,CAAA;AAExB,qBAAa,YAAY;IAGvB,aAAa,EAAE,MAAM,CAAK;IAC1B,MAAM,EAAE,aAAa,EAAE,CAAK;IAE5B;;+CAE2C;IAC3C,uBAAuB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAEhD,kBAAkB,EAAE,MAAM,CAAI;IAE9B;;;OAGG;IACH,sBAAsB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAK;IAErE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAO;IAErC;;;;OAIG;IACH,aAAa,EAAE,MAAM,GAAG,IAAI,CAAO;IAEnC;;;;;OAKG;IACH,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAY;IAEnD;;;;OAIG;IACH,cAAc,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAK;IAEjD;;;;;;OAMG;IACH,0BAA0B,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAEnD;;;OAGG;IACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAEzC;;qFAEiF;IACjF,YAAY,EAAE,QAAQ,EAAE,CAAK;IAE7B,0FAA0F;IAC1F,sBAAsB,EAAE,cAAc,EAAE,CAAK;IAE7C;;;OAGG;IACH,gBAAgB,EAAE,eAAe,EAAE,CAAK;IAExC;;;OAGG;IACH,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAE3C;;;;;;OAMG;IACH,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAY;IAEjE;;;;;;;;OAQG;IACH,WAAW,EAAE,WAAW,CAA+B;IAEvD;;;;;;OAMG;IACH,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAY;IAElD;;;;;;OAMG;IACH,gBAAgB,EAAE,eAAe,EAAE,CAAK;IAExC;;;;OAIG;IACH,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAE1C;;;;;OAKG;IACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAEzC;gBACY;IACZ,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAEvC;;4DAEwD;IACxD,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAY;IAIpD;sEACkE;IAClE,gBAAgB,EAAE,OAAO,CAAQ;IAEjC;sCACkC;IAClC,OAAO,EAAE,OAAO,CAAQ;IAExB,uFAAuF;IACvF,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAEvC,mFAAmF;IACnF,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAY;IAEjD;;;;OAIG;IACH,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAY;IAE/D;;;OAGG;IACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAY;IAEnD;yEACqE;IACrE,kBAAkB,UAAQ;CAC3B"}
|
|
1
|
+
{"version":3,"file":"compile-state.d.ts","sourceRoot":"","sources":["../../../src/adapter/lib/compile-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,eAAe,EACf,UAAU,EACV,MAAM,EACN,eAAe,EACf,QAAQ,EACR,WAAW,EACX,cAAc,EACd,QAAQ,EACT,MAAM,iBAAiB,CAAA;AAExB,qBAAa,YAAY;IAGvB,aAAa,EAAE,MAAM,CAAK;IAC1B,MAAM,EAAE,aAAa,EAAE,CAAK;IAE5B;;+CAE2C;IAC3C,uBAAuB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAEhD,kBAAkB,EAAE,MAAM,CAAI;IAE9B;;;OAGG;IACH,sBAAsB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAK;IAErE,eAAe,EAAE,MAAM,GAAG,IAAI,CAAO;IAErC;;;;OAIG;IACH,aAAa,EAAE,MAAM,GAAG,IAAI,CAAO;IAEnC;;;;;OAKG;IACH,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAY;IAEnD;;;;OAIG;IACH,cAAc,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAK;IAEjD;;;;;;OAMG;IACH,0BAA0B,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAEnD;;;OAGG;IACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAEzC;;qFAEiF;IACjF,YAAY,EAAE,QAAQ,EAAE,CAAK;IAE7B,0FAA0F;IAC1F,sBAAsB,EAAE,cAAc,EAAE,CAAK;IAE7C;;;OAGG;IACH,gBAAgB,EAAE,eAAe,EAAE,CAAK;IAExC;;;OAGG;IACH,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAE3C;;;;;;OAMG;IACH,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAY;IAEjE;;;;;;;;OAQG;IACH,WAAW,EAAE,WAAW,CAA+B;IAEvD;;;;;;OAMG;IACH,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAY;IAElD;;;;;;OAMG;IACH,gBAAgB,EAAE,eAAe,EAAE,CAAK;IAExC;;;;OAIG;IACH,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAE1C;;;;;;;OAOG;IACH,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAEjD;;;;;OAKG;IACH,8BAA8B,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAEvD;;;;;OAKG;IACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAEzC;gBACY;IACZ,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAEvC;;4DAEwD;IACxD,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAY;IAIpD;sEACkE;IAClE,gBAAgB,EAAE,OAAO,CAAQ;IAEjC;sCACkC;IAClC,OAAO,EAAE,OAAO,CAAQ;IAExB,uFAAuF;IACvF,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAY;IAEvC,mFAAmF;IACnF,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAY;IAEjD;;;;OAIG;IACH,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAY;IAE/D;;;OAGG;IACH,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAY;IAEnD;yEACqE;IACrE,kBAAkB,UAAQ;CAC3B"}
|
|
@@ -127,6 +127,15 @@ export interface PropFallbackVar {
|
|
|
127
127
|
goFallback: string;
|
|
128
128
|
/** Go zero literal for the prop's type (`0`, `""`, etc.). */
|
|
129
129
|
zeroLiteral: string;
|
|
130
|
+
/**
|
|
131
|
+
* Set when the prop lowered to the nillable `interface{}` representation
|
|
132
|
+
* (#2248): the concrete scalar Go type (`string`/`int`/`float64`/`bool`)
|
|
133
|
+
* the constructor materializes the hoisted local as. Presence switches
|
|
134
|
+
* the emission from the zero-value check (`if v == 0`) to a nil check
|
|
135
|
+
* (`if in.X != nil`), which is what makes an explicit `''`/`0` input
|
|
136
|
+
* distinguishable from an absent one.
|
|
137
|
+
*/
|
|
138
|
+
assertType?: string;
|
|
130
139
|
}
|
|
131
140
|
/**
|
|
132
141
|
* Scope for `lowerCtorExpr` — lowering a JS expression to Go in the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapter/lib/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/adapter/lib/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,51 @@ import type { GoEmitContext } from '../emit-context.ts';
|
|
|
13
13
|
* generic prop types (containing `interface{}`) are overridden.
|
|
14
14
|
*/
|
|
15
15
|
export declare function buildPropTypeOverrides(ctx: GoEmitContext, ir: ComponentIR): Map<string, string>;
|
|
16
|
+
/**
|
|
17
|
+
* Concrete scalar Go types eligible for the nullish (`??`) nillable flip in
|
|
18
|
+
* `resolvePropGoType`. Only these can round-trip through an `interface{}`
|
|
19
|
+
* field and back via a constructor type assertion / `bf.ToInt`-style
|
|
20
|
+
* coercion (see the fallback-var emission in `generateNewPropsFunction`).
|
|
21
|
+
*/
|
|
22
|
+
export declare const NULLISH_SCALAR_GO_TYPES: ReadonlySet<string>;
|
|
23
|
+
/**
|
|
24
|
+
* Names of OPTIONAL props consumed nullish-sensitively — the left operand of
|
|
25
|
+
* a `??` anywhere in the component's parsed expression trees, or a signal's
|
|
26
|
+
* `props.X ?? <literal>` initial value (#2248).
|
|
27
|
+
*
|
|
28
|
+
* Why this matters: JS `??` falls back only on `null`/`undefined`, keeping
|
|
29
|
+
* `''`/`0`/`false`. A Go zero-valued scalar field cannot represent "absent",
|
|
30
|
+
* so a `??`-consumed optional scalar must lower to the adapter's established
|
|
31
|
+
* nillable representation (`interface{}`) for the distinction to exist at
|
|
32
|
+
* render time. `resolvePropGoType` applies that flip using this set.
|
|
33
|
+
*
|
|
34
|
+
* The IR walk is generic (any nested object/array is descended, so parsed
|
|
35
|
+
* trees inside expressions, conditions, attributes, and loops are all seen)
|
|
36
|
+
* and the match is shape-precise: `identifier` left (destructured props) or
|
|
37
|
+
* `<propsObject>.<name>` member left. KNOWN LIMITATION (same class as
|
|
38
|
+
* `collectToFixedPropNames`): an `identifier` left shadowed by a same-named
|
|
39
|
+
* loop/callback param is misattributed to the prop — the flip is then merely
|
|
40
|
+
* unnecessary, not incorrect.
|
|
41
|
+
*/
|
|
42
|
+
export declare function collectNullishConsumedPropNames(ctx: GoEmitContext, ir: ComponentIR): Set<string>;
|
|
43
|
+
/**
|
|
44
|
+
* Names of OPTIONAL no-default props consumed as the BARE value of an
|
|
45
|
+
* omittable attribute (`rows={rows}` / `rows={props.rows}`) anywhere in the
|
|
46
|
+
* component's element tree.
|
|
47
|
+
*
|
|
48
|
+
* Why this matters: Hono omits an attribute whose value is `undefined`, and
|
|
49
|
+
* the adapter's `emitExpression` mirrors that with a `{{if ne .X nil}}` guard
|
|
50
|
+
* — which needs a nillable field to test. A concrete scalar field would
|
|
51
|
+
* render the zero value (`rows="0"`) instead of dropping the attribute, so
|
|
52
|
+
* these props take the same `interface{}` flip as `??` consumption
|
|
53
|
+
* (`resolvePropGoType`). The match mirrors `emitExpression`'s guard branch:
|
|
54
|
+
* bare identifiers / `<propsObject>.<name>` only, skipping `class`/`style`
|
|
55
|
+
* (own lowerings) and boolean/presence attrs (truthiness-tested, where a nil
|
|
56
|
+
* and a zero value already coincide). Same shadowing caveat as
|
|
57
|
+
* `collectNullishConsumedPropNames`: a same-named loop/callback param can
|
|
58
|
+
* misattribute, making the flip merely unnecessary, not incorrect.
|
|
59
|
+
*/
|
|
60
|
+
export declare function collectOmittableAttrConsumedPropNames(ctx: GoEmitContext, ir: ComponentIR): Set<string>;
|
|
16
61
|
/**
|
|
17
62
|
* Resolve a prop param's Go struct-field type using the SAME logic
|
|
18
63
|
* `generatePropsStruct` / `generateInputStruct` use: a `propTypeOverrides` entry
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prop-types.d.ts","sourceRoot":"","sources":["../../../src/adapter/props/prop-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAsB,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"prop-types.d.ts","sourceRoot":"","sources":["../../../src/adapter/props/prop-types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAsB,MAAM,iBAAiB,CAAA;AAGlF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAGvD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAwC/F;AAkDD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,CAAiD,CAAA;AAEzG;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CA+DhG;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qCAAqC,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAkCtG;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,EACxC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,MAAM,CA8CR;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CASzF"}
|