@wairon/cli 5.1.1-dev.45 → 5.1.1-dev.47
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/cli/index.js +69 -32
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +71 -32
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1222,7 +1222,7 @@ var init_defaults = __esm({
|
|
|
1222
1222
|
copilot: ".github/prompts",
|
|
1223
1223
|
codex: ".codex/agents"
|
|
1224
1224
|
};
|
|
1225
|
-
WAIRON_VERSION = "5.1.1-dev.
|
|
1225
|
+
WAIRON_VERSION = "5.1.1-dev.47";
|
|
1226
1226
|
GITHUB_REPO = "SYW-Apps/Waffle-AIron";
|
|
1227
1227
|
ARCHITECT_AGENT_ID = "agent-architect";
|
|
1228
1228
|
ARCHITECT_TEMPLATE_ID = "architect";
|
|
@@ -2230,8 +2230,12 @@ var init_specs = __esm({
|
|
|
2230
2230
|
* so a lower detail dial no longer vouches for everything the component
|
|
2231
2231
|
* declares. Each entry gets the same target validation a `call` step gets
|
|
2232
2232
|
* (the component resolves, the caller declares it, the method is on its
|
|
2233
|
-
* contract)
|
|
2234
|
-
*
|
|
2233
|
+
* contract) AND the same code↔spec reading (call-conformance, both
|
|
2234
|
+
* directions): an entry asserts the same call a step does, minus the
|
|
2235
|
+
* position in the flow that check never reads, so it can no more buy
|
|
2236
|
+
* reachability without the code than a step can. Refused beside a non-empty
|
|
2237
|
+
* narrative, where the steps already say what is called and a second
|
|
2238
|
+
* spelling could only disagree.
|
|
2235
2239
|
*/
|
|
2236
2240
|
calls: import_zod8.z.array(import_zod8.z.string().min(1)).optional(),
|
|
2237
2241
|
/**
|
|
@@ -2961,7 +2965,10 @@ function importBindingOf(facts, name) {
|
|
|
2961
2965
|
return ownEntry(facts.importBindings, name);
|
|
2962
2966
|
}
|
|
2963
2967
|
function fieldTypesOf(facts, field) {
|
|
2964
|
-
return ownEntry(facts.fieldTypes, field) ??
|
|
2968
|
+
return ownEntry(facts.fieldTypes, field) ?? NO_DECLARED_TYPES;
|
|
2969
|
+
}
|
|
2970
|
+
function localTypesOf(facts, name) {
|
|
2971
|
+
return ownEntry(facts.localTypes, name) ?? NO_DECLARED_TYPES;
|
|
2965
2972
|
}
|
|
2966
2973
|
function typeBindingOf(facts, name) {
|
|
2967
2974
|
return ownEntry(facts.typeOnlyBindings, name) ?? ownEntry(facts.importBindings, name)?.from;
|
|
@@ -2990,12 +2997,12 @@ function resolveImport(fromFile, specifier, knownPaths) {
|
|
|
2990
2997
|
}
|
|
2991
2998
|
return void 0;
|
|
2992
2999
|
}
|
|
2993
|
-
var path5,
|
|
3000
|
+
var path5, NO_DECLARED_TYPES;
|
|
2994
3001
|
var init_code_model = __esm({
|
|
2995
3002
|
"src/models/code-model.ts"() {
|
|
2996
3003
|
"use strict";
|
|
2997
3004
|
path5 = __toESM(require("path"));
|
|
2998
|
-
|
|
3005
|
+
NO_DECLARED_TYPES = [];
|
|
2999
3006
|
}
|
|
3000
3007
|
});
|
|
3001
3008
|
|
|
@@ -9097,7 +9104,7 @@ function buildCodeIndex(model) {
|
|
|
9097
9104
|
};
|
|
9098
9105
|
const possibleOriginsOf = (site, from) => {
|
|
9099
9106
|
const proven = originOf(site, from);
|
|
9100
|
-
if (!site.field && !site.constructed) return proven;
|
|
9107
|
+
if (!site.field && !site.constructed && !site.via) return proven;
|
|
9101
9108
|
const resolved = scopeOf(site, from);
|
|
9102
9109
|
if (!resolved) return proven;
|
|
9103
9110
|
const { path: scope, facts: f } = resolved;
|
|
@@ -9106,10 +9113,10 @@ function buildCodeIndex(model) {
|
|
|
9106
9113
|
const landings = specifier !== void 0 ? landingFrom(scope, specifier) : declarationsAt(scope).has(name) ? republishedFrom(scope) : NO_ORIGIN;
|
|
9107
9114
|
for (const candidate of landings) out.add(candidate);
|
|
9108
9115
|
};
|
|
9109
|
-
|
|
9110
|
-
|
|
9111
|
-
}
|
|
9116
|
+
const widenThroughType = (typeName) => widenThrough(typeName, typeBindingOf(f, typeName));
|
|
9117
|
+
if (site.field) for (const typeName of fieldTypesOf(f, site.field)) widenThroughType(typeName);
|
|
9112
9118
|
if (site.constructed) widenThrough(site.constructed, importBindingOf(f, site.constructed)?.from);
|
|
9119
|
+
if (site.via) for (const typeName of localTypesOf(f, site.via)) widenThroughType(typeName);
|
|
9113
9120
|
return out;
|
|
9114
9121
|
};
|
|
9115
9122
|
const declarationsAt = (path27) => namesAt(declarations, pathKey(path27), (f) => /* @__PURE__ */ new Set([...f.declaredNames, ...f.exportedNames]));
|
|
@@ -13559,6 +13566,18 @@ function resolveCallTarget(ctx, componentId, methodName) {
|
|
|
13559
13566
|
}
|
|
13560
13567
|
return { accepted, files };
|
|
13561
13568
|
}
|
|
13569
|
+
function claimsOf(implMethod) {
|
|
13570
|
+
const claims = [];
|
|
13571
|
+
for (const step of implMethod.narrative) {
|
|
13572
|
+
if (step.type !== "call" || !step.targetComponent || !step.targetMethod) continue;
|
|
13573
|
+
claims.push({ step: step.stepNumber, component: step.targetComponent, method: step.targetMethod });
|
|
13574
|
+
}
|
|
13575
|
+
for (const ref of implMethod.calls ?? []) {
|
|
13576
|
+
const parsed = parseDeclaredCall(ref);
|
|
13577
|
+
if (parsed) claims.push({ component: parsed.compId, method: parsed.methodName });
|
|
13578
|
+
}
|
|
13579
|
+
return claims;
|
|
13580
|
+
}
|
|
13562
13581
|
function describeSite(site) {
|
|
13563
13582
|
if (!site.member) return `${site.name}(\u2026)`;
|
|
13564
13583
|
if (site.via) return `${site.via}.${site.name}(\u2026)`;
|
|
@@ -13567,23 +13586,26 @@ function describeSite(site) {
|
|
|
13567
13586
|
return `<receiver>.${site.name}(\u2026)`;
|
|
13568
13587
|
}
|
|
13569
13588
|
function describeMiss(m) {
|
|
13570
|
-
const
|
|
13589
|
+
const where = m.step === void 0 ? "declared call" : `step ${m.step}`;
|
|
13590
|
+
const head = `${where} \u2192 ${m.target} (looked for ${m.accepted.map((a) => `"${a}"`).join(" / ")}`;
|
|
13571
13591
|
if (m.miss.kind === "elsewhere") return `${head}, called but resolved to ${m.miss.landed.map((p) => `"${p}"`).join(", ")})`;
|
|
13572
13592
|
if (m.miss.kind === "unresolved") return `${head}, written as ${m.miss.shapes.map((s) => `\`${s}\``).join(" / ")})`;
|
|
13573
13593
|
return `${head})`;
|
|
13574
13594
|
}
|
|
13575
|
-
var callConformanceRule;
|
|
13595
|
+
var unitOf, claimNoun, callConformanceRule;
|
|
13576
13596
|
var init_call_conformance = __esm({
|
|
13577
13597
|
"src/core/rules/conformance/call-conformance.ts"() {
|
|
13578
13598
|
"use strict";
|
|
13579
13599
|
init_models();
|
|
13600
|
+
unitOf = (m) => m.step === void 0 ? m.target : `${m.step}:${m.target}`;
|
|
13601
|
+
claimNoun = (implMethod) => implMethod.narrative.length ? "narrative call step(s)" : "declared call(s)";
|
|
13580
13602
|
callConformanceRule = {
|
|
13581
13603
|
name: "call-conformance",
|
|
13582
|
-
description: "Code\u2194spec Level 3: the
|
|
13604
|
+
description: "Code\u2194spec Level 3: the CLAIMED call \u2194 realized call relation, judged both ways against the method's own source file (its sourcePath, else the implementation's), at exact analysis grade only. A method claims a call two ways and they face one check: a narrative `call` step, and an entry of the declared `calls` a narrative-less method reaches its collaborators through. They assert the same thing, and the step number is no part of the claim \u2014 this check never reads order, so it is only how a finding points at one. Forward: every claim must be realized by a call whose callee RESOLVES TO one of the target method's own source files \u2014 the target's contract name or a per-method `symbol` override, closed transitively over the named helpers the realized function calls, and resolved against every file the call CAN have reached: a `this.<field>.<method>()` receiver followed through the field's DECLARED TYPE, a `new Class(...).<method>()` receiver through the module its CLASS NAME came from, and a plain `<name>.<method>()` receiver through the type the file ANNOTATES that name with \u2014 a parameter's, or an annotated variable's, which is how a module that wires its collaborators as closures writes every one of its calls. A matching call whose origin a pure model cannot resolve is reported apart as CALL_ORIGIN_UNRESOLVED, which NAMES the shape it could not follow and asks for nothing \u2014 a coverage hole in the reader, reported for the reason CONFORMANCE_DEGRADED is: a silently degraded gate is worse than a degraded one. A finding names a landing only from the PROVEN tier so that widening what a call reached can accept a claim but never accuse one, and a target that names no file of its own falls back to name membership. Converse: a call that resolves to a modelled method of ANOTHER component in the SAME file crosses a component boundary while looking local, so the method must claim it \u2014 in a step or in `calls` (UNDECLARED_COLOCATED_CALL) \u2014 judged on the proven tier alone, and a same-file private helper is no modelled method and is never reported. A method that claims nothing at all is judged in neither direction: what it leaves unsaid is UNUSED_*'s subject. Order, arguments and conditions stay unverified, dispatch steps (runtime-table routed) are no claim about a call site, a malformed declared reference is MALFORMED_DECLARED_CALL's finding and names no target here, the conformance dial (off) skips, and weaker analysis grades never guess.",
|
|
13583
13605
|
codes: [
|
|
13584
|
-
{ code: "CALL_STEP_UNREALIZED", defaultSeverity: "warning", summary: "Narrative call step realized by no call that resolves to the target method's own source file \u2014 the call is absent, or it lands in another module", carryable: true },
|
|
13585
|
-
{ code: "CALL_ORIGIN_UNRESOLVED", defaultSeverity: "warning", summary: "Narrative call step whose target name IS called, but only from call sites written in a shape this analysis cannot resolve to a file \u2014 the
|
|
13586
|
-
{ code: "UNDECLARED_COLOCATED_CALL", defaultSeverity: "warning", summary: "The realized function calls a modelled method of another component living in the same source file, and
|
|
13606
|
+
{ code: "CALL_STEP_UNREALIZED", defaultSeverity: "warning", summary: "Narrative call step or declared call realized by no call that resolves to the target method's own source file \u2014 the call is absent, or it lands in another module", carryable: true },
|
|
13607
|
+
{ code: "CALL_ORIGIN_UNRESOLVED", defaultSeverity: "warning", summary: "Narrative call step or declared call whose target name IS called, but only from call sites written in a shape this analysis cannot resolve to a file \u2014 the claim was not checked, and is neither proven realized nor accused", carryable: true },
|
|
13608
|
+
{ code: "UNDECLARED_COLOCATED_CALL", defaultSeverity: "warning", summary: "The realized function calls a modelled method of another component living in the same source file, and neither a narrative step nor a declared call names it", carryable: true }
|
|
13587
13609
|
],
|
|
13588
13610
|
check(ctx) {
|
|
13589
13611
|
const code = ctx.codeIndex();
|
|
@@ -13600,7 +13622,7 @@ var init_call_conformance = __esm({
|
|
|
13600
13622
|
const { implementation: impl, method: implMethod, component, sourceFile: file } = entry;
|
|
13601
13623
|
const tier = implMethod.conformance ?? impl.conformance ?? defaultConformanceTier(component);
|
|
13602
13624
|
if (tier === "off") continue;
|
|
13603
|
-
if (!implMethod.narrative.length) continue;
|
|
13625
|
+
if (!implMethod.narrative.length && !implMethod.calls?.length) continue;
|
|
13604
13626
|
if (!file) continue;
|
|
13605
13627
|
const facts = code.factsAt(file);
|
|
13606
13628
|
if (!facts || facts.status !== "analyzed" || facts.analysisGrade !== "exact") continue;
|
|
@@ -13610,16 +13632,15 @@ var init_call_conformance = __esm({
|
|
|
13610
13632
|
const sites = closedCallSites(code, file, fnSymbol);
|
|
13611
13633
|
if (!sites) continue;
|
|
13612
13634
|
const missed = [];
|
|
13613
|
-
for (const
|
|
13614
|
-
if (
|
|
13615
|
-
|
|
13616
|
-
const target = resolveCallTarget(ctx, step.targetComponent, step.targetMethod);
|
|
13635
|
+
for (const claim of claimsOf(implMethod)) {
|
|
13636
|
+
if (!ctx.componentMap.has(claim.component)) continue;
|
|
13637
|
+
const target = resolveCallTarget(ctx, claim.component, claim.method);
|
|
13617
13638
|
if (target.accepted.has(fnSymbol)) continue;
|
|
13618
13639
|
const matching = sites.filter((s) => target.accepted.has(s.name));
|
|
13619
|
-
const ref = `${
|
|
13640
|
+
const ref = `${claim.component}.${claim.method}`;
|
|
13620
13641
|
if (target.files.size === 0) {
|
|
13621
13642
|
if (matching.length === 0) {
|
|
13622
|
-
missed.push({ step: step
|
|
13643
|
+
missed.push({ step: claim.step, target: ref, accepted: [...target.accepted], miss: { kind: "absent" } });
|
|
13623
13644
|
}
|
|
13624
13645
|
continue;
|
|
13625
13646
|
}
|
|
@@ -13633,7 +13654,7 @@ var init_call_conformance = __esm({
|
|
|
13633
13654
|
}
|
|
13634
13655
|
if (realized) continue;
|
|
13635
13656
|
const miss = matching.length === 0 ? { kind: "absent" } : landed.size === 0 ? { kind: "unresolved", shapes: [...new Set(matching.map(describeSite))].sort() } : { kind: "elsewhere", landed: [...landed].sort() };
|
|
13636
|
-
missed.push({ step: step
|
|
13657
|
+
missed.push({ step: claim.step, target: ref, accepted: [...target.accepted], miss });
|
|
13637
13658
|
}
|
|
13638
13659
|
const unrealized = missed.filter((m) => m.miss.kind !== "unresolved");
|
|
13639
13660
|
const unresolved = missed.filter((m) => m.miss.kind === "unresolved");
|
|
@@ -13641,30 +13662,36 @@ var init_call_conformance = __esm({
|
|
|
13641
13662
|
ctx.addIssue(
|
|
13642
13663
|
"warning",
|
|
13643
13664
|
"CALL_STEP_UNREALIZED",
|
|
13644
|
-
`Method "${implMethod.name}" in implementation "${impl.id}": ${unrealized.length}
|
|
13665
|
+
`Method "${implMethod.name}" in implementation "${impl.id}": ${unrealized.length} ${claimNoun(implMethod)} are realized by no call of the function "${fnSymbol}" in "${file}" that resolves to the target's own source file \u2014 ${unrealized.map(describeMiss).join("; ")}. Callees are closed over the named helpers the function calls, and each call site is resolved through this file's import bindings (order, arguments and conditions are not checked). Realize the calls, fix what the method claims, or map code names via per-method symbols on the targets.`,
|
|
13645
13666
|
impl.id,
|
|
13646
13667
|
entry.draftContext,
|
|
13647
13668
|
void 0,
|
|
13648
|
-
//
|
|
13649
|
-
//
|
|
13650
|
-
|
|
13669
|
+
// One claim, named the way the register names a unit: a step by its
|
|
13670
|
+
// number and target, a declaration by its target alone. What the
|
|
13671
|
+
// register carries is ONE unrealized claim, never "this method's
|
|
13672
|
+
// calls".
|
|
13673
|
+
{ at: implMethod.name, covers: unrealized.map(unitOf) }
|
|
13651
13674
|
);
|
|
13652
13675
|
}
|
|
13653
13676
|
if (unresolved.length) {
|
|
13654
13677
|
ctx.addIssue(
|
|
13655
13678
|
"warning",
|
|
13656
13679
|
"CALL_ORIGIN_UNRESOLVED",
|
|
13657
|
-
`Method "${implMethod.name}" in implementation "${impl.id}": ${unresolved.length}
|
|
13680
|
+
`Method "${implMethod.name}" in implementation "${impl.id}": ${unresolved.length} ${claimNoun(implMethod)} ARE called by name inside the function "${fnSymbol}" in "${file}", but every site calling them is written in a shape this analysis cannot resolve to a file \u2014 ${unresolved.map(describeMiss).join("; ")}. What resolves is a name bound to a module of THIS project: a bare or namespaced call through such an import binding, a \`this.<field>\` receiver whose declared type names one, a \`new Class(\u2026)\` receiver whose class does, and a receiver NAME the file annotates with a type that does. What does not: an import from a PACKAGE specifier, a receiver holding a value the module assembled, a receiver this model records no name for, and one the file annotates with nothing. This reports what was not checked, not what is wrong \u2014 the claim is neither proven realized nor accused of being missing, and no working call is asked to be rewritten to suit the reader.`,
|
|
13658
13681
|
impl.id,
|
|
13659
13682
|
entry.draftContext,
|
|
13660
13683
|
void 0,
|
|
13661
|
-
{ at: implMethod.name, covers: unresolved.map(
|
|
13684
|
+
{ at: implMethod.name, covers: unresolved.map(unitOf) }
|
|
13662
13685
|
);
|
|
13663
13686
|
}
|
|
13664
13687
|
const declared = /* @__PURE__ */ new Set();
|
|
13665
13688
|
for (const step of implMethod.narrative) {
|
|
13666
13689
|
if (step.targetComponent && step.targetMethod) declared.add(`${step.targetComponent}.${step.targetMethod}`);
|
|
13667
13690
|
}
|
|
13691
|
+
for (const ref of implMethod.calls ?? []) {
|
|
13692
|
+
const parsed = parseDeclaredCall(ref);
|
|
13693
|
+
if (parsed) declared.add(`${parsed.compId}.${parsed.methodName}`);
|
|
13694
|
+
}
|
|
13668
13695
|
const crossings = /* @__PURE__ */ new Map();
|
|
13669
13696
|
for (const site of closedCallSites(code, file, fnSymbol, new Set(colocated.keys())) ?? []) {
|
|
13670
13697
|
const owner = colocated.get(site.name);
|
|
@@ -13679,7 +13706,7 @@ var init_call_conformance = __esm({
|
|
|
13679
13706
|
ctx.addIssue(
|
|
13680
13707
|
"warning",
|
|
13681
13708
|
"UNDECLARED_COLOCATED_CALL",
|
|
13682
|
-
`Method "${implMethod.name}" in implementation "${impl.id}": the function "${fnSymbol}" in "${file}" calls ${crossings.size} modelled method(s) of OTHER components living in that same file, and
|
|
13709
|
+
`Method "${implMethod.name}" in implementation "${impl.id}": the function "${fnSymbol}" in "${file}" calls ${crossings.size} modelled method(s) of OTHER components living in that same file, and neither a narrative step nor a declared call names it \u2014 ${detail}. Sharing a file does not make the hop internal: it crosses a component boundary nothing imports, so no file-level check can see it. Narrate the call, declare it in \`calls\`, or move the code so the boundary is real.`,
|
|
13683
13710
|
impl.id,
|
|
13684
13711
|
entry.draftContext,
|
|
13685
13712
|
void 0,
|
|
@@ -15842,6 +15869,7 @@ function walkExact(ts, sourceText, fileName) {
|
|
|
15842
15869
|
const importBindings = /* @__PURE__ */ new Map();
|
|
15843
15870
|
const typeOnlyBindings = /* @__PURE__ */ new Map();
|
|
15844
15871
|
const fieldTypes = /* @__PURE__ */ new Map();
|
|
15872
|
+
const localTypes = /* @__PURE__ */ new Map();
|
|
15845
15873
|
const mutableBindings = /* @__PURE__ */ new Set();
|
|
15846
15874
|
const receiverKey = (site) => site.via ?? (site.field ? `this.${site.field}` : site.constructed ? `new ${site.constructed}` : "");
|
|
15847
15875
|
const siteKey = (site) => `${site.member ? "m" : "b"}:${receiverKey(site)}:${site.name}`;
|
|
@@ -15869,6 +15897,13 @@ function walkExact(ts, sourceText, fileName) {
|
|
|
15869
15897
|
named.add(typeName);
|
|
15870
15898
|
fieldTypes.set(field, named);
|
|
15871
15899
|
};
|
|
15900
|
+
const recordLocalType = (name, type) => {
|
|
15901
|
+
const typeName = typeReferenceName(type);
|
|
15902
|
+
if (!typeName || !ts.isIdentifier(name)) return;
|
|
15903
|
+
const named = localTypes.get(name.text) ?? /* @__PURE__ */ new Set();
|
|
15904
|
+
named.add(typeName);
|
|
15905
|
+
localTypes.set(name.text, named);
|
|
15906
|
+
};
|
|
15872
15907
|
const hasExportModifier = (node) => {
|
|
15873
15908
|
const mods = node.modifiers;
|
|
15874
15909
|
return !!mods?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
|
|
@@ -15936,6 +15971,7 @@ function walkExact(ts, sourceText, fileName) {
|
|
|
15936
15971
|
else if (ts.isParameter(node) && node.parent && ts.isConstructorDeclaration(node.parent) && isParameterProperty(node)) {
|
|
15937
15972
|
recordFieldType(node.name, node.type);
|
|
15938
15973
|
}
|
|
15974
|
+
if (ts.isParameter(node) || ts.isVariableDeclaration(node)) recordLocalType(node.name, node.type);
|
|
15939
15975
|
if (ts.isFunctionDeclaration(node) || ts.isClassDeclaration(node) || ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node) || ts.isEnumDeclaration(node) || ts.isModuleDeclaration(node)) {
|
|
15940
15976
|
const name = node.name && ts.isIdentifier(node.name) ? node.name.text : void 0;
|
|
15941
15977
|
if (name) {
|
|
@@ -16012,7 +16048,7 @@ function walkExact(ts, sourceText, fileName) {
|
|
|
16012
16048
|
};
|
|
16013
16049
|
visit(sf);
|
|
16014
16050
|
const reexportOnly = sf.statements.length > 0 && sf.statements.every((st) => ts.isExportDeclaration(st) && !!st.moduleSpecifier);
|
|
16015
|
-
return { declared, anchors, exported, imports, reexports, starExports, namedReexports, complexity, calls, importBindings, typeOnlyBindings, fieldTypes, mutableBindings, reexportOnly };
|
|
16051
|
+
return { declared, anchors, exported, imports, reexports, starExports, namedReexports, complexity, calls, importBindings, typeOnlyBindings, fieldTypes, localTypes, mutableBindings, reexportOnly };
|
|
16016
16052
|
}
|
|
16017
16053
|
function resolveRelativeModule(fromFile, specifier) {
|
|
16018
16054
|
if (!specifier.startsWith(".")) return null;
|
|
@@ -16193,6 +16229,7 @@ function buildCodeModel(implementations, types, projectRoot, sourceRoots = [], e
|
|
|
16193
16229
|
importBindings: Object.fromEntries(facts.importBindings),
|
|
16194
16230
|
typeOnlyBindings: Object.fromEntries(facts.typeOnlyBindings),
|
|
16195
16231
|
fieldTypes: Object.fromEntries([...facts.fieldTypes].map(([k, v]) => [k, [...v]])),
|
|
16232
|
+
localTypes: Object.fromEntries([...facts.localTypes].map(([k, v]) => [k, [...v]])),
|
|
16196
16233
|
topLevelMutableBindings: [...facts.mutableBindings],
|
|
16197
16234
|
reexportOnly: facts.reexportOnly
|
|
16198
16235
|
};
|
|
@@ -27417,6 +27454,7 @@ __export(src_exports, {
|
|
|
27417
27454
|
loadTypeSpec: () => loadTypeSpec,
|
|
27418
27455
|
loadTypeSpecs: () => loadTypeSpecs,
|
|
27419
27456
|
localApprover: () => localApprover,
|
|
27457
|
+
localTypesOf: () => localTypesOf,
|
|
27420
27458
|
logger: () => logger,
|
|
27421
27459
|
makeScopeFilter: () => makeScopeFilter,
|
|
27422
27460
|
markSelectionsBundled: () => markSelectionsBundled,
|
|
@@ -28156,6 +28194,7 @@ function loadProjectConfig4() {
|
|
|
28156
28194
|
loadTypeSpec,
|
|
28157
28195
|
loadTypeSpecs,
|
|
28158
28196
|
localApprover,
|
|
28197
|
+
localTypesOf,
|
|
28159
28198
|
logger,
|
|
28160
28199
|
makeScopeFilter,
|
|
28161
28200
|
markSelectionsBundled,
|