@tslite/checker 0.2.1 → 0.4.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/index.cjs +1 -1
- package/dist/index.d.cts +124 -2
- package/dist/index.d.ts +124 -2
- package/dist/index.js +1 -1
- package/package.json +5 -5
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var typeCore=require('@tslite/type-core'),core=require('@tslite/core'),capability=require('@tslite/capability'),codec=require('@tslite/codec');var $e=(e={})=>core.rootScope(e),T=(e,n)=>core.childScope(e,n),v=(e,n)=>core.lookup(e,n),pe=e=>core.visibleNames(e),wn=(e={},n={},t={},r={},s=new Set,a=new Set,o={})=>({scope:$e(e),types:n,schemes:t,accessors:r,asserters:s,matchers:a,modules:o}),En=(e,n)=>e.types[n],vn=(e,n)=>e.schemes[n];var Le={"unknown-name":"semantic","const-needs-init":"semantic","cannot-redeclare":"semantic","unknown-module":"semantic",unsupported:"semantic","forbidden-member":"semantic","not-assignable":"type","not-callable":"type","no-such-member":"type","not-object":"type","missing-argument":"type","excess-argument":"type","excess-property":"type","spread-argument":"type","props-mismatch":"type","no-matching-overload":"type","constraint-violation":"type","cast-unsound":"type","too-deep":"type","too-complex-union":"type","node-not-allowed":"capability","name-not-allowed":"capability","type-feature-not-allowed":"capability","any-not-allowed":"capability","too-large":"capability","wrong-result-type":"capability"},k=(e,n,t)=>({code:e,kind:Le[e],severity:"error",node:n,message:t}),B=(e,n,t,r="error")=>({code:e,kind:Le[e],severity:r,node:n,message:t}),S={notAssignable:(e,n,t,r={})=>{let s=typeCore.typeDiff(n,t,r).filter(o=>o.path.length>0),a=s.length?` ${typeCore.formatTypeDiff(s)}.`:"";return k("not-assignable",e,`Type '${typeCore.format(n)}' is not assignable to type '${typeCore.format(t)}'.${a}`)},unknownName:(e,n)=>k("unknown-name",e,`Cannot find name '${n}'.`),notCallable:(e,n)=>k("not-callable",e,`Type '${typeCore.format(n)}' is not callable.`),noSuchMember:(e,n,t)=>k("no-such-member",e,`Property '${t}' does not exist on type '${typeCore.format(n)}'.`),notObject:(e,n)=>k("not-object",e,`Type '${typeCore.format(n)}' has no members to access.`),constNeedsInit:e=>k("const-needs-init",e,"'const' declarations must be initialized."),missingArgument:(e,n,t)=>k("missing-argument",e,`Missing argument '${n}' of type '${typeCore.format(t)}'.`),unknownModule:(e,n)=>k("unknown-module",e,`Cannot find module '${n}' or its corresponding type declarations.`),cannotRedeclare:(e,n)=>k("cannot-redeclare",e,`Cannot redeclare block-scoped variable '${n}'.`),excessArgument:(e,n,t)=>k("excess-argument",e,`Expected ${n} argument${n===1?"":"s"}, but got ${t}.`),excessProperty:(e,n,t)=>k("excess-property",e,`Object literal may only specify known properties, and '${n}' does not exist in type '${typeCore.format(t)}'.`),spreadArgument:e=>k("spread-argument",e,"A spread argument must either have a tuple type or be passed to a rest parameter."),propsMismatch:(e,n,t)=>k("props-mismatch",e,`Payload is not compatible with the component props '${typeCore.format(n)}': ${t}.`),noMatchingOverload:(e,n,t)=>k("no-matching-overload",e,`No overload of '${typeCore.format(n)}' matches the arguments (${t.map(r=>typeCore.format(r)).join(", ")}).`),constraintViolation:(e,n,t,r)=>k("constraint-violation",e,`Type '${typeCore.format(t)}' does not satisfy the constraint '${n} extends ${typeCore.format(r)}'.`),unsupported:(e,n)=>k("unsupported",e,`${n} is not supported in this language.`),forbiddenMember:(e,n)=>k("forbidden-member",e,`'${n}' is not a member of the language \u2014 the JS runtime substrate (identity/inheritance) is not vocabulary here (FP / portable IR). Use a factory/operator via DI.`),castUnsound:(e,n,t)=>B("cast-unsound",e,`Conversion of type '${typeCore.format(n)}' to type '${typeCore.format(t)}' may be a mistake \u2014 neither sufficiently overlaps the other. Cast through 'unknown' first if intentional.`,"warning")};function Z(){let e=[];return {all:e,report(n){e.push(n);},hasErrors(){return e.some(n=>n.severity==="error")}}}function ce(e,n,t={}){return n.flatMap(r=>r(e,t))}function U(e,n){let t=r=>{n(r);for(let s of core.childrenOf(r))t(s);};t(e);}var Pn=e=>Array.isArray(e)?e:[e],Ve=["ArrowFunctionExpression","FunctionExpression","FunctionDeclaration"];function me(e,n="error"){return t=>{let r=[];return U(t,s=>{let a=capability.nodeViolation(s,e);a&&r.push(B("node-not-allowed",s,`'${a}' is not allowed by the capability profile.`,n));}),r}}function Ue(e,n="error"){let t=e.typeTier;return r=>{if(t==="author")return [];let s=[];return U(r,a=>{let o=a,i=o.type==="TSTypeAliasDeclaration"?o.id?.name:void 0;for(let l of [o.typeAnnotation,o.returnType]){if(!l)continue;let p=capability.typeFeatureViolations(typeCore.typeFeatures(l,i),t);p.length&&s.push(B("type-feature-not-allowed",a,`authoring type feature${p.length>1?"s":""} '${p.join("', '")}' requires capability tier 'author'.`,n));}}),s}}function N(e,n=new WeakSet){if(!e||typeof e!="object"||n.has(e))return false;switch(n.add(e),e.t){case "any":return true;case "object":return Object.values(e.props).some(t=>N(t.type,n))||!!e.index&&N(e.index.value,n);case "array":return N(e.items,n);case "tuple":return e.elements.some(t=>N(t,n));case "union":case "intersection":return e.of.some(t=>N(t,n));case "fn":return e.params.some(t=>N(t.type,n))||N(e.returns,n);case "overload":return e.signatures.some(t=>t.params.some(r=>N(r.type,n))||N(t.returns,n));case "keyof":return N(e.of,n);case "index":return N(e.obj,n)||N(e.key,n);case "mapped":return N(e.over,n)||N(e.body,n);case "conditional":return N(e.check,n)||N(e.extends,n)||N(e.then,n)||N(e.else,n);case "returnType":case "parameters":return N(e.fn,n);case "apply":return e.args.some(t=>N(t,n));default:return false}}function qe(e,n="error"){return t=>{if(!e.typeStrict)return [];let r=[];return U(t,s=>{let a=s;for(let o of [a.typeAnnotation,a.returnType])if(o&&N(o)){r.push(B("any-not-allowed",s,"'any' is not allowed under 'strict' \u2014 use 'unknown' + validated narrowing (assert/parse).",n));break}}),r}}function ye(e,n="error"){let t=new Set(e);return r=>{let s=[];return U(r,a=>{if(a.type!=="CallExpression")return;let o=a.callee;if(o.type!=="Identifier")s.push(B("name-not-allowed",o,"Only direct calls to allowed functions are permitted.",n));else {let i=o.name;t.has(i)||s.push(B("name-not-allowed",o,`Function '${i}' is not allowed here.`,n));}}),s}}function ee(e,n,t={}){let r=new Set(Pn(e)),s=t.severity??"error",a=[...r].join("/");return o=>{let i=[],l=(p,c)=>{let m=r.has(p.type),h=m?c+1:c;m&&h>n&&i.push(B("too-deep",p,`Nesting of ${a} exceeds ${n}${t.hint?` \u2014 ${t.hint}`:""}.`,s));for(let y of core.childrenOf(p))l(y,h);};return l(o,0),i}}var fe=(e=3,n="error")=>ee(Ve,e,{hint:"use a pipe instead of nesting functions",severity:n}),de=(e,n="error")=>ee("CallExpression",e,{hint:"use a pipe instead of nesting calls",severity:n}),he=(e,n="error")=>ee("MemberExpression",e,{severity:n});function ge(e,n="error"){return t=>{let r=[],s=(a,o)=>{if(o>e){r.push(B("too-deep",a,`Expression nesting exceeds ${e}.`,n));return}for(let i of core.childrenOf(a))s(i,o+1);};return s(t,0),r}}function Se(e,n="error"){return t=>{let r=0;return U(t,()=>{r++;}),r>e?[B("too-large",t,`Expression has ${r} nodes (max ${e}).`,n)]:[]}}function be(e,n="error"){return t=>{let r=[];return U(t,s=>{if(s.type==="CallExpression"){let a=s.arguments;a&&a.length>e&&r.push(B("too-large",s,`Call has ${a.length} arguments (max ${e}).`,n));}}),r}}function Ne(e,n={},t="error"){return (r,s)=>{let a=s.overlay?.get(r)?.type;return a?typeCore.subtype(a,e,n)?[]:[B("wrong-result-type",r,`Result type '${typeCore.format(a)}' is not assignable to the required '${typeCore.format(e)}'.`,t)]:[]}}function ne(e){let n=[me(e),Ue(e),qe(e)];return e.hostAllow!=="*"&&n.push(ye([...e.hostAllow])),n}function Fn(e){return ne(capability.compileProfile(e))}var J=e=>e.typeAnnotation,ke=e=>e.returnType,F=e=>e.type==="Identifier"?e.name:null,Ke=e=>{if(e.type==="VariableDeclaration"){let n=e.declarations[0];return n?F(n.id):null}return F(e)},z=e=>{if(e.computed)return null;let n=e.key;return n.type==="Identifier"?n.name:n.type==="Literal"?String(n.value??""):null};function _e(e){let n=r=>r&&r.type==="Literal"&&typeof r.value=="string"?r.value:null;if(e.length===1&&e[0].type==="ArrayExpression"){let r=[];for(let s of e[0].elements){let a=n(s);if(a===null)return null;r.push(a);}return r}let t=[];for(let r of e){let s=n(r);if(s===null)return null;t.push(s);}return t.length?t:null}function Be(e){if(e.type==="Identifier")return e.name;if(e.type==="MemberExpression"){let n=e;if(n.computed||n.property.type!=="Identifier")return null;let t=Be(n.object);return t===null?null:`${t}.${n.property.name}`}return null}function we(e){let n=e;if(n.regex||n.bigint)return typeCore.s.unknown;let t=n.value;return t===null?typeCore.s.null:t===void 0?typeCore.s.undefined:typeof t=="string"||typeof t=="number"||typeof t=="boolean"?{t:"literal",value:t,fresh:true}:typeCore.s.unknown}var q=e=>{let n=e.value;return n===null?typeCore.s.null:typeof n=="string"||typeof n=="number"||typeof n=="boolean"?typeCore.s.literal(n):we(e)},Ee=e=>e.type==="ArrowFunctionExpression",We=e=>e.t==="apply"&&e.name==="Promise"&&e.args.length===1,se=e=>We(e)?e.args[0]:e,X=e=>We(e)?e:typeCore.s.promise(e);function te(e){return e.t==="tuple"?true:e.t==="array"?te(e.items):e.t==="union"?e.of.some(te):false}function re(e){return e.t==="literal"?true:e.t==="union"?e.of.some(n=>re(n)):e.t==="var"?e.isConst===true||e.bound!==void 0&&re(e.bound):false}var j=(e,n)=>{let t=e;for(let r=0;r<50&&t.t==="apply";r++){let s=typeCore.expand1(t,n);if(s===t||s.t==="apply"&&s.name===t.name)break;t=s;}return t};function Je(e){let n=ke(e);return n?{t:"fn",params:e.params.map((r,s)=>({name:F(r)??`arg${s}`,type:J(r)??typeCore.s.unknown})),returns:e.async?X(n):n}:null}var M={then:{},else:{}},nn=new Set(["string","number","boolean","undefined","function","object"]),ze={string:typeCore.s.string,number:typeCore.s.number,boolean:typeCore.s.boolean,undefined:typeCore.s.undefined};function tn(e,n){switch(n){case "string":return e.t==="string"||e.t==="literal"&&typeof e.value=="string";case "number":return e.t==="number"||e.t==="literal"&&typeof e.value=="number";case "boolean":return e.t==="boolean"||e.t==="literal"&&typeof e.value=="boolean";case "undefined":return e.t==="undefined";case "function":return e.t==="fn"||e.t==="overload";case "object":return e.t==="object"||e.t==="array"||e.t==="tuple"||e.t==="null";default:return false}}var $n=typeCore.s.literal(true),Ln=typeCore.s.literal(false),x=e=>e.t==="union"?[...e.of]:e.t==="boolean"?[$n,Ln]:[e];function Xe(e,n){let t=e,r=n;return e.type==="UnaryExpression"&&t.operator==="typeof"&&t.argument.type==="Identifier"&&n.type==="Literal"&&typeof r.value=="string"?{name:t.argument.name,tag:r.value}:null}function Gn(e,n,t){if(e.t==="unknown"||e.t==="any")return n;let r=x(e).filter(s=>typeCore.subtype(s,n,t));return r.length?typeCore.normalizeUnion(r):n}function Vn(e,n,t){if(e.t==="unknown"||e.t==="any")return null;let r=x(e).filter(s=>!typeCore.subtype(s,n,t));return r.length?typeCore.normalizeUnion(r):null}function Un(e,n){if(!nn.has(n))return null;if(e.t==="unknown"||e.t==="any")return ze[n]??e;let t=x(e).filter(r=>tn(r,n));return t.length?typeCore.normalizeUnion(t):ze[n]??e}function qn(e,n){if(!nn.has(n)||e.t==="unknown"||e.t==="any")return null;let t=x(e).filter(r=>!tn(r,n));return t.length?typeCore.normalizeUnion(t):null}function Ye(e,n){if(e.type==="Identifier"&&n.type==="Literal"){let t=q(n);if(t.t==="literal"||t.t==="null")return {name:e.name,lit:t}}return null}function He(e,n){if(e.type==="MemberExpression"&&!e.computed&&!e.optional&&e.object.type==="Identifier"&&e.property.type==="Identifier"&&n.type==="Literal"){let t=q(n);if(t.t==="literal"||t.t==="null")return {name:e.object.name,prop:e.property.name,lit:t}}return null}function Qe(e,n,t,r,s){let a=x(e),o=l=>l.t==="object"?typeCore.ownProp(l.props,n)?.type:void 0,i=a.filter(l=>{let p=o(l);return r?!!p&&typeCore.subtype(t,p,s):!(p&&typeCore.subtype(p,t,s))});return i.length&&i.length<a.length?typeCore.normalizeUnion(i):null}function Ze(e,n,t){let r=x(e),s=o=>o.t==="object"&&(n in o.props||!!o.index),a=r.filter(o=>t?s(o):!s(o));return a.length&&a.length<r.length?typeCore.normalizeUnion(a):null}function Kn(e,n,t){return e.t==="unknown"||e.t==="any"||typeCore.subtype(n,e,t)?n:null}function _n(e,n,t){let r=x(e),s=r.filter(a=>!typeCore.equals(a,n,t));return s.length&&s.length<r.length?typeCore.normalizeUnion(s):null}var Wn=e=>e.t==="null"||e.t==="undefined",rn=e=>Wn(e)||e.t==="literal"&&!e.value,Jn=e=>{if(e.t==="unknown"||e.t==="any")return null;let n=x(e),t=n.filter(r=>!rn(r));return t.length&&t.length<n.length?typeCore.normalizeUnion(t):null},zn=e=>{let n=x(e),t=n.filter(rn);return t.length&&t.length<n.length?typeCore.normalizeUnion(t):null},en=e=>e.type==="Literal"&&e.value===null?"null":e.type==="Identifier"&&e.name==="undefined"?"undefined":null,O=(e,n,t)=>({then:n?{[e]:n}:{},else:t?{[e]:t}:{}}),Xn=e=>e==="==="||e==="=="||e==="!=="||e==="!=";function Q(e,n,t){if(e.type==="BinaryExpression"){let r=e;if(r.operator==="in"){let y=r.left,b=r.right;if(y.type==="Literal"&&typeof y.value=="string"&&b.type==="Identifier"){let g=b.name,E=v(n,g);if(!E)return M;let V=String(y.value);return O(g,Ze(E,V,true),Ze(E,V,false))}return M}if(!Xn(r.operator))return M;let s=r.operator==="!=="||r.operator==="!=",a=r.left,o=r.right,i=Xe(a,o)??Xe(o,a);if(i){let y=v(n,i.name);if(!y)return M;let b=Un(y,i.tag),g=qn(y,i.tag);return s?O(i.name,g,b):O(i.name,b,g)}let l=en(a),p=en(o),c=l?o:p?a:null;if((l||p)&&c?.type==="Identifier"){let y=c.name,b=v(n,y);if(!b)return M;let E=r.operator==="=="||r.operator==="!="?["null","undefined"]:[l??p],V=x(b),je=V.filter(le=>E.includes(le.t)),ie=V.filter(le=>!E.includes(le.t)),xe=je.length?typeCore.normalizeUnion(je):null,Me=ie.length&&ie.length<V.length?typeCore.normalizeUnion(ie):null;return s?O(y,Me,xe):O(y,xe,Me)}let m=Ye(a,o)??Ye(o,a);if(m){let y=v(n,m.name);if(!y)return M;let b=Kn(y,m.lit,t),g=_n(y,m.lit,t);return s?O(m.name,g,b):O(m.name,b,g)}let h=He(a,o)??He(o,a);if(h){let y=v(n,h.name);if(!y)return M;let b=Qe(y,h.prop,h.lit,true,t),g=Qe(y,h.prop,h.lit,false,t);return s?O(h.name,g,b):O(h.name,b,g)}return M}if(e.type==="UnaryExpression"&&e.operator==="!"){let r=Q(e.argument,n,t);return {then:r.else,else:r.then}}if(e.type==="CallExpression"){let r=Hn(e,n,t);if(r)return r}if(e.type==="Identifier"){let r=e.name,s=v(n,r);if(s)return O(r,Jn(s),zn(s))}return M}function Yn(e,n){if(e.t==="fn")return e.guard??null;if(e.t==="overload"){for(let t of e.signatures)if(t.guard&&t.params.length===n)return t.guard}return null}function Hn(e,n,t){let r=e.callee;if(r.type!=="Identifier")return null;let s=v(n,r.name);if(!s)return null;let a=Yn(s,e.arguments.length);if(!a)return null;let o=e.arguments[a.param];if(!o||o.type!=="Identifier")return null;let i=o.name,l=v(n,i);return l?O(i,Gn(l,a.type,t),Vn(l,a.type,t)):null}var _=(e,n)=>Object.keys(n).length?T(e,n):e;function Y(e){switch(e.type){case "ReturnStatement":case "ThrowStatement":return true;case "BlockStatement":{let n=e.body;return n.length>0&&Y(n[n.length-1])}case "IfStatement":{let n=e;return !!n.alternate&&Y(n.consequent)&&Y(n.alternate)}default:return false}}var yt=e=>{let n={};for(let t of Object.keys(e))n[t]={params:[],body:e[t]};return n};function ft(e){let n=[];return e.maxDepth!==void 0&&n.push(ge(e.maxDepth)),e.maxNodes!==void 0&&n.push(Se(e.maxNodes)),e.maxArgs!==void 0&&n.push(be(e.maxArgs)),e.maxFunctionNesting!==void 0&&n.push(fe(e.maxFunctionNesting)),e.maxCallNesting!==void 0&&n.push(de(e.maxCallNesting)),e.memberDepth!==void 0&&n.push(he(e.memberDepth)),n}function cn(e,n,t={}){let r={...yt(n.types),...n.schemes,...ht(e)},s={overlay:new WeakMap,sink:Z(),env:n,schemes:r,importNames:new Set},a=t.profile?capability.compileProfile(t.profile):void 0;a&&typeCore.configureTypeLimits(a.typeLimits);try{let o,i=gt(e,s);try{o=f(e,i,s);}catch(c){if(c instanceof typeCore.TypeEvalLimitError)s.sink.report(B("too-deep",e,c.message));else if(c instanceof typeCore.UnionTooComplexError)s.sink.report(B("too-complex-union",e,c.message));else throw c;o=typeCore.s.unknown;}let l=[];a&&l.push(...ne(a)),t.limits&&l.push(...ft(t.limits)),t.resultType&&l.push(Ne(t.resultType,r));let p=l.length?[...s.sink.all,...ce(e,l,{overlay:s.overlay})]:s.sink.all;return {type:o,overlay:s.overlay,diagnostics:p}}finally{a&&typeCore.resetTypeLimits();}}function dt(e,n,t={}){let r=cn(e,n,t),s={},a=new Map,o,i=p=>{let c=[];if(p.type==="VariableDeclaration")for(let m of p.declarations){let h=F(m.id),y=r.overlay.get(m);h&&y&&(s[h]=y.type,c.push(h));}else if(p.type==="FunctionDeclaration"){let m=p.id?.name,h=r.overlay.get(p);m&&h&&(s[m]=h.type,c.push(m));}return c};for(let p of e.body??[])if(p.type==="VariableDeclaration"||p.type==="FunctionDeclaration")i(p);else if(p.type==="ExportNamedDeclaration"){let c=p;if(c.declaration)for(let m of i(c.declaration))a.set(m,m);else for(let m of c.specifiers)a.set(m.exported.name,m.local.name);}else if(p.type==="ExportDefaultDeclaration"){let c=r.overlay.get(p.declaration);o=c?c.type:typeCore.s.unknown;}let l={};if(a.size||o!==void 0){for(let[p,c]of a)s[c]&&(l[p]={type:s[c]});o!==void 0&&(l.default={type:o});}else for(let p in s)l[p]={type:s[p]};return {type:{t:"object",props:l},diagnostics:r.diagnostics}}var ht=e=>{let n={};return core.walk(e,{TSTypeAliasDeclaration(t){let r=t;r.id?.name&&r.typeAnnotation&&(n[r.id.name]={params:r.typeParameters??[],body:r.typeAnnotation});}}),n};function gt(e,n){let t=n.env.modules,r={};core.walk(e,{ImportDeclaration(s){let a=s,o=a.source.value,i=typeof o=="string"?t?.[o]:void 0;if(!i){n.sink.report(S.unknownModule(a.source,String(o)));for(let l of a.specifiers)r[l.local.name]=typeCore.s.unknown;return}for(let l of a.specifiers){let p=l.local.name;if(p in r){n.sink.report(S.cannotRedeclare(l.local,p));continue}if(l.type==="ImportNamespaceSpecifier"){r[p]=i;continue}let c=l.type==="ImportSpecifier"?l.imported.name:"default",m=typeCore.discover(i,[c],n.schemes);m?r[p]=m.type:(n.sink.report(S.noSuchMember(l,i,c)),r[p]=typeCore.s.unknown);}}});for(let s in r)n.importNames.add(s);return Object.keys(r).length?T(n.env.scope,r):n.env.scope}var d=(e,n,t,r)=>(e.overlay.set(n,{type:t,scope:r}),t);function f(e,n,t,r){switch(e.type){case mn:return e.schema;case "JSXElement":case "JSXFragment":return d(t,e,f(core.desugarJSX(e,{emptyPropsAsObject:true}),n,t),n);case "Literal":return d(t,e,we(e),n);case "Identifier":{let s=e.name,a=v(n,s);return a===void 0?s==="undefined"?d(t,e,typeCore.s.undefined,n):(t.sink.report(S.unknownName(e,s)),d(t,e,typeCore.s.unknown,n)):d(t,e,a,n)}case "MemberExpression":return d(t,e,Nt(e,n,t),n);case "CallExpression":return d(t,e,Et(e,n,t,r),n);case "ArrowFunctionExpression":return Oe(e,n,t);case "FunctionDeclaration":return t.sink.report(S.unsupported(e,"function declaration (use 'const fn = () => \u2026')")),d(t,e,typeCore.s.unknown,n);case "FunctionExpression":return t.sink.report(S.unsupported(e,"anonymous function (use an arrow)")),d(t,e,typeCore.s.unknown,n);case "ThisExpression":return t.sink.report(S.unsupported(e,"'this'")),d(t,e,typeCore.s.unknown,n);case "BlockStatement":return d(t,e,Pe(e,n,t),n);case "ReturnStatement":{let s=e.argument;return d(t,e,s?f(s,n,t):typeCore.s.unknown,n)}case "IfStatement":return I(e,n,t),t.overlay.get(e)?.type??typeCore.s.unknown;case "ForStatement":case "WhileStatement":case "DoWhileStatement":case "ForOfStatement":case "ForInStatement":case "BreakStatement":case "ContinueStatement":case "ThrowStatement":case "TryStatement":case "SwitchStatement":return I(e,n,t),t.overlay.get(e)?.type??typeCore.s.unknown;case "AssignmentExpression":{let s=e;return f(s.left,n,t),d(t,e,f(s.right,n,t),n)}case "UpdateExpression":return f(e.argument,n,t),d(t,e,typeCore.s.number,n);case "ExpressionStatement":return d(t,e,f(e.expression,n,t),n);case "VariableDeclaration":return ae(e,n,t),d(t,e,typeCore.s.unknown,n);case "TSTypeAliasDeclaration":return d(t,e,typeCore.s.unknown,n);case "BinaryExpression":return d(t,e,xt(e,n,t),n);case "LogicalExpression":{let s=e,a=f(s.left,n,t),o=f(s.right,n,t);return d(t,e,Mt(s.operator,a,o),n)}case "UnaryExpression":return d(t,e,Gt(e,n,t),n);case "ConditionalExpression":{let s=e;f(s.test,n,t);let a=Q(s.test,n,t.schemes),o=f(s.consequent,_(n,a.then),t),i=f(s.alternate,_(n,a.else),t);return d(t,e,typeCore.normalizeUnion([o,i]),n)}case "ObjectExpression":return d(t,e,Vt(e,n,t),n);case "ArrayExpression":return d(t,e,gn(e,n,t),n);case "TemplateLiteral":{for(let s of e.expressions)f(s,n,t);return d(t,e,typeCore.s.string,n)}case "AwaitExpression":{let s=e.argument,a=s?f(s,n,t):typeCore.s.unknown;return d(t,e,se(a),n)}case "Program":return Ie(e.body,n,t,new Set(t.importNames)),d(t,e,typeCore.s.unknown,n);case "JsonExpression":return d(t,e,Ce(e.body,n,t,e),n);case "ChainExpression":return d(t,e,typeCore.normalizeUnion([f(e.expression,n,t),typeCore.s.undefined]),n);case "TSAsExpression":{let s=e,a=f(s.expression,n,t),o=s.typeAnnotation;return !typeCore.subtype(a,o,t.schemes)&&!typeCore.subtype(o,a,t.schemes)&&t.sink.report(S.castUnsound(e,a,o)),d(t,e,o,n)}default:return t.sink.report(S.unsupported(e,`'${e.type}'`)),d(t,e,typeCore.s.unknown,n)}}var St=new Set(["constructor","prototype","__proto__"]);function bt(e){if(!e.computed)return e.property.type==="Identifier"?e.property.name:null;let n=e.property;if(n.type==="Literal"){let t=n.value;if(typeof t=="string")return t}return null}function Nt(e,n,t){let r=f(e.object,n,t),s=bt(e);if(s!==null&&St.has(s))return t.sink.report(S.forbiddenMember(e,s)),typeCore.s.unknown;if(e.computed){let i=f(e.property,n,t),l=typeCore.resolveTypeOp(typeCore.s.index(r,i));return l.t!=="index"?l:(i.t==="literal"&&typeof i.value=="string"&&an(e,r,i.value,t),typeCore.s.unknown)}let a=e.property.name,o=typeCore.discover(r,[a],t.schemes);return o?o.type:(an(e,r,a,t),typeCore.s.unknown)}function an(e,n,t,r){let s=typeCore.isScheme(n,r.schemes)?typeCore.expand1(n,r.schemes):n;s.t==="object"||s.t==="array"||s.t==="tuple"||s.t==="union"?r.sink.report(S.noSuchMember(e,n,t)):s.t!=="any"&&s.t!=="unknown"&&r.sink.report(S.notObject(e,n));}function kt(e,n,t){if(!e||e.type!=="Identifier")return;let r=e.name;if(v(n,r)===void 0)return;let s=t.schemes[r];return s&&s.params.length===0?s.body:void 0}function Bt(e,n,t,r){let s=j(f(n[0],t,r),r.schemes),o=(s.t==="fn"?s:s.t==="overload"?s.signatures[0]:void 0)?.params[0]?.type,i=n.length>1?f(n[1],t,r):typeCore.s.undefined;if(o){let l=typeCore.typeDiff(i,o,r.schemes);l.length&&r.sink.report(S.propsMismatch(n[1]??e,o,typeCore.formatTypeDiff(l)));}return d(r,e,typeCore.s.boolean,t)}var mn="TSLiteSyntheticArg",wt=e=>({type:mn,schema:e});function yn(e,n,t){if(!e.some(a=>a.type==="SpreadElement"))return {nodes:[...e],spread:null};let r=[],s=null;for(let a of e){if(a.type!=="SpreadElement"){r.push(a);continue}let o=a.argument;if(o.type==="ArrayExpression"&&o.elements.every(l=>l&&l.type!=="SpreadElement")){for(let l of o.elements)r.push(l);continue}let i=j(f(o,n,t),t.schemes);if(i.t==="tuple")for(let l of i.elements)r.push(wt(l));else s={elem:i.t==="array"?i.items:typeCore.s.unknown,node:a};}return {nodes:r,spread:s}}function Et(e,n,t,r){let s=e.arguments,a=Be(e.callee);if(a){let p=t.env.accessors?.[a];if(p){let c=_e(s);if(c){let m=typeCore.discover(p,c,t.schemes);return m?m.type:(t.sink.report(S.noSuchMember(e,p,c.join("."))),typeCore.s.unknown)}return s.forEach(m=>f(m,n,t)),typeCore.s.unknown}}if(a&&t.env.asserters?.has(a)){let p=kt(s[0],n,t);for(let c=1;c<s.length;c++)f(s[c],n,t);return p??typeCore.s.unknown}if(a&&t.env.matchers?.has(a))return Bt(e,s,n,t);let o=f(e.callee,n,t);if(o.t==="any")return s.forEach(p=>f(p,n,t)),typeCore.s.any;if(o.t==="overload")return At(e,o,n,t,r);if(o.t!=="fn")return s.forEach(p=>f(p,n,t)),t.sink.report(S.notCallable(e,o)),typeCore.s.unknown;let i=yn(s,n,t),l=i.nodes.map(p=>fn(p,n,t));return dn(e,o,i.nodes,l,n,t,i.spread,r)}function fn(e,n,t){if(Ee(e))return typeCore.s.any;if(e.type!=="CallExpression")return f(e,n,t);let r=Z(),s=f(e,n,{...t,sink:r});return r.hasErrors()?typeCore.s.any:(r.all.forEach(a=>t.sink.report(a)),s)}function dn(e,n,t,r,s,a,o=null,i){let l=m=>{if(!i)return m;let h=typeCore.substitute(n.returns,m);if(h.t==="fn"&&i.t==="fn"){let y=m,b=Math.min(h.params.length,i.params.length);for(let g=0;g<b;g++)y=typeCore.unify(h.params[g].type,i.params[g].type,y)??y;return typeCore.unify(h.returns,i.returns,y)??y}return typeCore.unify(h,i,m)??m},p=l(typeCore.instantiateLoose(n,r).bindings);t.forEach((m,h)=>{if(Ee(m)){let y=typeCore.widenType(typeCore.substitute(n.params[h]?.type??typeCore.s.any,p));r[h]=Oe(m,s,a,y);}else if(m.type==="CallExpression"&&r[h].t==="any")r[h]=f(m,s,a,typeCore.substitute(n.params[h]?.type??typeCore.s.unknown,p));else if(m.type==="Literal"){let y=n.params[h]?.type??typeCore.s.unknown,b=y.t==="var"?y.bound?typeCore.substitute(y.bound,p):y:typeCore.substitute(y,p);re(b)&&(r[h]=d(a,m,q(m),s));}else if(m.type==="ArrayExpression"){let y=typeCore.substitute(n.params[h]?.type??typeCore.s.unknown,p);te(y)&&(r[h]=Sn(m,y,s,a));}});let c=l(typeCore.instantiateLoose(n,r).bindings);return Dt(e,n,c,a),Ot(e,n,r,c,a,t,o),t.forEach((m,h)=>{let y=n.params[h];m.type==="ObjectExpression"&&y&&!y.variadic&&Fe(m,typeCore.substitute(y.type,c),a);}),typeCore.widenInferred(typeCore.groundVars(typeCore.substitute(n.returns,c),a.schemes))}var on=new WeakMap;function vt(e){let n=on.get(e);if(n)return n;let t=new Map,r=new WeakSet;for(let s of e.params)w(s.type,t,r);return w(e.returns,t,r),on.set(e,t),t}function w(e,n,t){switch(e.t){case "var":e.bound&&!n.has(e.name)&&n.set(e.name,e.bound);return;case "array":w(e.items,n,t);return;case "union":for(let r of e.of)w(r,n,t);return;case "object":if(t.has(e))return;t.add(e);for(let r in e.props)w(e.props[r].type,n,t);return;case "fn":if(t.has(e))return;t.add(e);for(let r of e.params)w(r.type,n,t);w(e.returns,n,t);return;case "overload":for(let r of e.signatures){for(let s of r.params)w(s.type,n,t);w(r.returns,n,t);}return;case "apply":for(let r of e.args)w(r,n,t);return;case "keyof":w(e.of,n,t);return;case "index":w(e.obj,n,t),w(e.key,n,t);return;case "mapped":w(e.over,n,t),w(e.body,n,t);return;default:return}}function Dt(e,n,t,r){let s=vt(n);if(s.size!==0)for(let[a,o]of s){let i=t[a];if(!i)continue;let l=typeCore.substitute(o,t);typeCore.subtype(i,l,r.schemes)||r.sink.report(S.constraintViolation(e,a,i,l));}}function At(e,n,t,r,s){let a=yn(e.arguments,t,r),o=a.nodes,i=o.map(c=>fn(c,t,r)),l=c=>a.spread?Ct(c,o.length):Tt(c,o.length),p=n.signatures.find(c=>l(c)&&Rt(c,i,r));if(!p){let c=n.signatures.filter(l);c.length===1?p=c[0]:n.signatures.length===1&&(p=n.signatures[0]);}return p?dn(e,p,o,i,t,r,a.spread,s):(r.sink.report(S.noMatchingOverload(e,n,i)),typeCore.s.unknown)}function Ct(e,n){let t=0,r=false;for(let s of e.params)s.variadic?r=true:s.optional||t++;return n>=t&&(r||n<e.params.length)}function Tt(e,n){let t=0;for(let r of e.params){if(r.variadic)return n>=t;r.optional||t++;}return n>=t&&n<=e.params.length}function Rt(e,n,t){let{bindings:r}=typeCore.instantiateLoose(e,n);for(let s=0;s<e.params.length;s++){let a=e.params[s];if(a.variadic)return true;if(s>=n.length){if(!a.optional)return false;continue}if(!typeCore.subtype(n[s],typeCore.substitute(a.type,r),t.schemes))return false}return true}function Ot(e,n,t,r,s,a=e.arguments??[],o=null){let i=p=>a[p]??e;for(let p=0;p<n.params.length;p++){let c=n.params[p];if(c.variadic)break;let m=typeCore.substitute(c.type,r);if(p>=t.length){!c.optional&&!o&&s.sink.report(S.missingArgument(e,c.name,m));continue}typeCore.subtype(t[p],m,s.schemes)||s.sink.report(S.notAssignable(i(p),t[p],m,s.schemes));}let l=n.params.find(p=>p.variadic);if(o){let p=t.length,c=n.params.filter(m=>!m.optional&&!m.variadic).length;if(!(p>=c&&(l||p<n.params.length))){s.sink.report(S.spreadArgument(o.node));return}if(l){let m=typeCore.substitute(l.type,r),h=m.t==="array"?m.items:typeCore.s.unknown;typeCore.subtype(o.elem,h,s.schemes)||s.sink.report(S.notAssignable(o.node,o.elem,h,s.schemes));}return}!l&&t.length>n.params.length&&s.sink.report(S.excessArgument(i(n.params.length),n.params.length,t.length));}function L(e,n,t,r){let s=j(n,r.schemes);switch(e.type){case "Literal":{let o=q(e);return typeCore.subtype(o,n,r.schemes)||r.sink.report(S.notAssignable(e,o,n,r.schemes)),d(r,e,n,t)}case "ArrayExpression":{if(s.t==="array"){for(let o of e.elements){if(!o)continue;let i=o;i.type==="SpreadElement"?L(i.argument,n,t,r):L(i,s.items,t,r);}return d(r,e,n,t)}break}case "ObjectExpression":{if(s.t==="object"){let o={};for(let l of e.properties){let p=l;if(p.type==="SpreadElement"){f(p.argument,t,r);continue}let c=p,m=z(c),h=m!==null?typeCore.ownProp(s.props,m)?.type:void 0,y=h?L(c.value,h,t,r):f(c.value,t,r);m!==null&&(o[m]={type:y}),d(r,p,y,t);}let i={t:"object",props:o};return typeCore.subtype(i,n,r.schemes)||r.sink.report(S.notAssignable(e,i,n,r.schemes)),d(r,e,n,t)}break}case "ArrowFunctionExpression":{if(s.t==="fn"){let o=Oe(e,t,r,s);return typeCore.subtype(o,n,r.schemes)||r.sink.report(S.notAssignable(e,o,n,r.schemes)),d(r,e,n,t)}break}case "ConditionalExpression":{let o=e;return f(o.test,t,r),L(o.consequent,n,t,r),L(o.alternate,n,t,r),d(r,e,n,t)}}let a=f(e,t,r);return typeCore.subtype(a,n,r.schemes)||r.sink.report(S.notAssignable(e,a,n,r.schemes)),d(r,e,a,t)}function Oe(e,n,t,r){let s=r&&r.t==="fn"?r:void 0,a={},o=e.params.map((h,y)=>{let b=h,g=F(b),E=J(b)??s?.params[y]?.type??typeCore.s.unknown;return g?a[g]=E:b.type!=="Identifier"&&G(b,E,a,n,t),t.overlay.set(b,{type:E,scope:n}),{name:g??`arg${y}`,type:E}}),i=T(n,a),l=e.body,p=ke(e);if(l.type!=="BlockStatement"&&p){let h=e.async?se(p):p;L(l,h,i,t);let y=e.async?X(p):p;return d(t,e,{t:"fn",params:o,returns:y},n)}let c=l.type==="BlockStatement"?d(t,l,Pe(l,i,t,new Set(Object.keys(a))),i):f(l,i,t),m=e.async?X(c):c;if(p){let h=e.async?se(p):p,y=e.async?c:m;typeCore.subtype(y,h,t.schemes)||t.sink.report(S.notAssignable(l,m,p,t.schemes));let b=e.async?X(p):p;return d(t,e,{t:"fn",params:o,returns:b},n)}return d(t,e,{t:"fn",params:o,returns:typeCore.widenType(m)},n)}function W(e){switch(e.type){case "Identifier":return [e];case "ObjectPattern":return e.properties.flatMap(n=>n.type==="RestElement"?W(n.argument):W(n.value));case "ArrayPattern":return e.elements.flatMap(n=>n?n.type==="RestElement"?W(n.argument):W(n):[]);case "AssignmentPattern":return W(e.left);default:return []}}function hn(e){if(e.type==="VariableDeclaration")return e.declarations.flatMap(n=>W(n.id));if(e.type==="FunctionDeclaration"){let n=e.id;return n?[n]:[]}return e.type==="ExportNamedDeclaration"&&e.declaration?hn(e.declaration):[]}function Pe(e,n,t,r=new Set){let{returns:s}=Ie(e.body,n,t,r);return s.length?typeCore.normalizeUnion(s):typeCore.s.unknown}function Ie(e,n,t,r=new Set){let s=n,a=[];for(let o of e){let i=o;for(let l of hn(i))r.has(l.name)?t.sink.report(S.cannotRedeclare(l,l.name)):r.add(l.name);if(i.type==="VariableDeclaration")s=ae(i,s,t);else if(i.type!=="ImportDeclaration")if(i.type==="ExportNamedDeclaration"){let l=i;if(l.declaration?.type==="VariableDeclaration")s=ae(l.declaration,s,t);else if(l.declaration?.type==="FunctionDeclaration"){let p=f(l.declaration,s,t),c=F(l.declaration.id);c&&(s=T(s,{[c]:p}));}else for(let p of l.specifiers)v(s,p.local.name)===void 0&&t.sink.report(S.unknownName(p.local,p.local.name));}else if(i.type==="ExportDefaultDeclaration")f(i.declaration,s,t);else if(i.type==="FunctionDeclaration"){let l=f(i,s,t),p=F(i.id);p&&(s=T(s,{[p]:l}));}else if(i.type==="IfStatement"){a.push(...I(i,s,t));let l=i;!l.alternate&&Y(l.consequent)&&(s=_(s,Q(l.test,s,t.schemes).else));}else a.push(...I(i,s,t));}return {scope:s,returns:a}}function I(e,n,t){switch(e.type){case "ReturnStatement":{let r=e.argument,s=r?f(r,n,t):typeCore.s.unknown;return d(t,e,s,n),[s]}case "IfStatement":{let r=e;f(r.test,n,t);let s=Q(r.test,n,t.schemes),a=I(r.consequent,_(n,s.then),t);return r.alternate&&a.push(...I(r.alternate,_(n,s.else),t)),d(t,e,typeCore.s.unknown,n),a}case "BlockStatement":{let r=Pe(e,n,t);return d(t,e,r,n),r.t==="unknown"?[]:[r]}case "ForStatement":case "WhileStatement":case "DoWhileStatement":{let r=e,s=n;r.init&&(r.init.type==="VariableDeclaration"?s=ae(r.init,s,t):f(r.init,s,t)),r.test&&f(r.test,s,t),r.update&&f(r.update,s,t);let a=I(r.body,s,t);return d(t,e,typeCore.s.unknown,n),a}case "ForOfStatement":case "ForInStatement":{let r=e,s=f(r.right,n,t),a=e.type==="ForOfStatement"?s.t==="array"?s.items:typeCore.s.unknown:typeCore.s.string,o=Ke(r.left),i=o?T(n,{[o]:a}):n,l=I(r.body,i,t);return d(t,e,typeCore.s.unknown,n),l}case "BreakStatement":case "ContinueStatement":return d(t,e,typeCore.s.unknown,n),[];case "ThrowStatement":{let r=e.argument;return r&&f(r,n,t),d(t,e,typeCore.s.unknown,n),[]}case "TryStatement":{let r=e,s=I(r.block,n,t);if(r.handler){let a=r.handler.param,o=a?F(a):null,i=o?T(n,{[o]:typeCore.s.unknown}):n;s.push(...I(r.handler.body,i,t));}return r.finalizer&&s.push(...I(r.finalizer,n,t)),d(t,e,typeCore.s.unknown,n),s}case "SwitchStatement":{let r=e;f(r.discriminant,n,t);let s=n,a=[];for(let o of r.cases){o.test&&f(o.test,s,t);let i=Ie(o.consequent,s,t);s=i.scope,a.push(...i.returns);}return d(t,e,typeCore.s.unknown,n),a}default:return f(e,n,t),[]}}function Pt(e,n,t){let r=typeCore.discover(e,[n],t.schemes);return r?r.type:typeCore.s.unknown}function It(e,n){let t=typeCore.resolveTypeOp(typeCore.s.index(e,typeCore.s.literal(n)));return t.t==="index"?typeCore.s.unknown:t}function Ft(e,n){if(e.t!=="object")return e;let t={};for(let r in e.props)n.includes(r)||(t[r]=e.props[r]);return typeCore.s.object(t,e.index)}function jt(e,n){return e.t==="tuple"?typeCore.s.tuple(e.elements.slice(n)):e.t==="array"?e:typeCore.s.array(typeCore.s.unknown)}function G(e,n,t,r,s){switch(e.type){case "Identifier":{let a=J(e)??n;t[e.name]=a,s.overlay.set(e,{type:a,scope:r});return}case "AssignmentPattern":{let a=e,o=typeCore.widenType(f(a.right,r,s)),{type:i}=typeCore.withoutUndefined(n),l=i.t==="unknown"?o:typeCore.normalizeUnion([i,o]);G(a.left,l,t,r,s);return}case "ObjectPattern":{let a=[];for(let o of e.properties){if(o.type==="RestElement"){G(o.argument,Ft(n,a),t,r,s);continue}let i=o,l=z(i);l!=null&&a.push(l);let p=l!=null?Pt(n,l,s):typeCore.s.unknown;G(i.value,p,t,r,s);}return}case "ArrayPattern":{e.elements.forEach((a,o)=>{if(!a)return;let i=a;i.type==="RestElement"?G(i.argument,jt(n,o),t,r,s):G(i,It(n,o),t,r,s);});return}}}function Fe(e,n,t){let r=j(n,t.schemes),a=(r.t==="union"?r.of.map(o=>j(o,t.schemes)):[r]).filter(o=>o.t==="object"&&!o.index);if(a.length&&!a.some(o=>Object.keys(o.props).length===0))for(let o of e.properties){if(o.type==="SpreadElement")continue;let i=o;if(i.computed)continue;let l=z(i);if(l===null)continue;let p=a.filter(c=>l in c.props);if(!p.length){t.sink.report(S.excessProperty(i.key,l,n));continue}i.value.type==="ObjectExpression"&&Fe(i.value,p[0].props[l].type,t);}}function ae(e,n,t){let r={};for(let s of e.declarations){let a=s.id,o=F(a),i=J(a);if(!s.init){t.sink.report(S.constNeedsInit(s)),o&&(r[o]=i??typeCore.s.unknown);continue}let l=i??(s.init.type==="ArrowFunctionExpression"?Je(s.init):null),p=o&&l?T(n,{[o]:l}):n,c;i?(L(s.init,i,p,t),s.init.type==="ObjectExpression"&&Fe(s.init,i,t),c=i):c=f(s.init,p,t),d(t,s,c,n),o?r[o]=c:G(a,c,r,n,t);}return d(t,e,typeCore.s.unknown,n),T(n,r)}function xt(e,n,t){let r=f(e.left,n,t),s=f(e.right,n,t),a=e.operator;return a==="+"?typeCore.subtype(r,typeCore.s.string)||typeCore.subtype(s,typeCore.s.string)?typeCore.s.string:typeCore.s.number:$t.has(a)?typeCore.s.number:typeCore.s.boolean}var ln={string:typeCore.s.literal(""),number:typeCore.s.literal(0),boolean:typeCore.s.literal(false)},De=e=>e.t==="null"||e.t==="undefined";function Mt(e,n,t){if(n.t==="any"||n.t==="unknown")return typeCore.normalizeUnion([n,t]);let r=n.t==="union"?[...n.of]:n.t==="boolean"?[typeCore.s.literal(true),typeCore.s.literal(false)]:[n];if(e==="??")return typeCore.normalizeUnion([...r.filter(a=>!De(a)),t]);if(e==="||")return typeCore.normalizeUnion([...r.filter(a=>!De(a)&&!(a.t==="literal"&&!a.value)),t]);let s=r.flatMap(a=>De(a)?[a]:a.t==="literal"?a.value?[]:[a]:ln[a.t]?[ln[a.t]]:[]);return typeCore.normalizeUnion([...s,t])}var $t=new Set(["-","*","/","%","**","&","|","^","<<",">>",">>>"]),Lt=typeCore.s.union(["string","number","bigint","boolean","symbol","undefined","object","function"].map(e=>typeCore.s.literal(e)));function Gt(e,n,t){let r=f(e.argument,n,t);switch(e.operator){case "!":return r.t==="literal"?{t:"literal",value:!r.value,fresh:true}:typeCore.s.boolean;case "-":return r.t==="literal"&&typeof r.value=="number"?{t:"literal",value:-r.value,fresh:true}:typeCore.s.number;case "+":case "~":return typeCore.s.number;case "typeof":return Lt;case "delete":return typeCore.s.boolean;case "void":return typeCore.s.undefined;default:return typeCore.s.unknown}}function Vt(e,n,t){let r={},s,a=[],o=[],i=false,l=false;for(let p of e.properties){let c=p;if(c.type==="SpreadElement"){let g=j(f(c.argument,n,t),t.schemes);if(g.t==="object"){for(let E in g.props)r[E]=g.props[E];g.index&&(s={key:g.index.key,type:g.index.value});}continue}let m=c,h=f(m.value,n,t),y=typeCore.widen(h);if(d(t,c,h,n),m.computed){let g=j(f(m.key,n,t),t.schemes);g.t==="literal"&&typeof g.value=="string"?(r[g.value]={type:y},a.push(y)):g.t==="literal"&&typeof g.value=="number"?(r[String(g.value)]={type:y},a.push(y),o.push(y)):g.t==="string"?(i=true,a.push(y)):g.t==="number"&&(l=true,a.push(y),o.push(y));continue}let b=z(m);b!==null&&(r[b]={type:y},a.push(y),/^\d+$/.test(b)&&o.push(y));}return i?s={key:"string",type:typeCore.normalizeUnion(a)}:l&&(s={key:"number",type:typeCore.normalizeUnion(o)}),s?{t:"object",props:r,index:{key:s.key,value:s.type}}:{t:"object",props:r}}function gn(e,n,t){let r=[];for(let s of e.elements){if(!s)continue;let a=s;if(a.type==="SpreadElement"){let o=j(f(a.argument,n,t),t.schemes);o.t==="array"?r.push(o.items):o.t==="tuple"&&r.push(...o.elements);continue}r.push(typeCore.widen(f(a,n,t)));}return typeCore.s.array(r.length?typeCore.normalizeUnion(r):typeCore.s.unknown)}function Sn(e,n,t,r){let s=j(n,r.schemes),a=e.elements,o=a.every(l=>l&&l.type!=="SpreadElement"),i=(l,p)=>l.type==="ArrayExpression"?Sn(l,p,t,r):typeCore.widen(f(l,t,r));if(s.t==="tuple"&&o&&a.length===s.elements.length){let l=a.map((p,c)=>i(p,s.elements[c]));return d(r,e,{t:"tuple",elements:l},t)}if(s.t==="array"){let l=[];for(let p of a){if(!p)continue;let c=p;if(c.type==="SpreadElement"){f(c.argument,t,r);continue}l.push(i(c,s.items));}return d(r,e,typeCore.s.array(l.length?typeCore.normalizeUnion(l):typeCore.s.unknown),t)}return gn(e,t,r)}function Ce(e,n,t,r){if(e===null)return typeCore.s.null;switch(typeof e){case "string":return typeCore.s.string;case "number":return typeCore.s.number;case "boolean":return typeCore.s.boolean;case "object":break;default:return typeCore.s.unknown}if(Array.isArray(e)){let o=e.map(i=>Ce(i,n,t,r));return typeCore.s.array(o.length?typeCore.normalizeUnion(o):typeCore.s.unknown)}let s=e;if(core.AST_MARKER in s){let o;try{o=codec.fromJson(s);}catch{return t.sink.report(S.unsupported(r,`'#ast: ${String(s[core.AST_MARKER])}'`)),typeCore.s.unknown}return f(o,n,t)}let a={};for(let o of Object.keys(s))a[o]={type:Ce(s[o],n,t,r)};return {t:"object",props:a}}var Ut=(e,n)=>({...e,typeAnnotation:n}),qt=(e,n)=>({...e,returnType:n}),Kt=(e,n)=>({type:"TSAsExpression",expression:e,typeAnnotation:n});function Wt(e,n){return e.get(n)?.type}function Jt(e,n){return e.get(n)?.scope}function zt(e,n){let t=e.get(n)?.type;return t?typeCore.discover(t,[])?.completions??[]:[]}function Xt(e,n){let t=e.get(n)?.scope;return t?[...pe(t)].map(([r,s])=>({key:r,type:s,optional:false})):[]}function Yt(e,n){return e.filter(t=>t.node===n)}exports.FUNCTION_KINDS=Ve;exports.annotate=Ut;exports.annotateReturn=qt;exports.asExpression=Kt;exports.calleeAllowlist=ye;exports.capabilityNodes=me;exports.check=cn;exports.childScope=T;exports.createEnv=wn;exports.createSink=Z;exports.diag=S;exports.diagnosticsAt=Yt;exports.extractModuleType=dt;exports.fromCapability=Fn;exports.guard=ce;exports.guardsFromCompiled=ne;exports.lookup=v;exports.makeDiagnostic=B;exports.maxArgs=be;exports.maxCallNesting=de;exports.maxDepth=ge;exports.maxFunctionNesting=fe;exports.maxNestingOf=ee;exports.maxNodes=Se;exports.memberCompletions=zt;exports.memberDepth=he;exports.resolveNamed=En;exports.resolveScheme=vn;exports.resultType=Ne;exports.rootScope=$e;exports.scopeAt=Jt;exports.scopeCompletions=Xt;exports.typeAt=Wt;exports.visibleNames=pe;Object.keys(typeCore).forEach(function(k){if(k!=='default'&&!Object.prototype.hasOwnProperty.call(exports,k))Object.defineProperty(exports,k,{enumerable:true,get:function(){return typeCore[k]}})});
|
|
1
|
+
'use strict';var typeCore=require('@tslite/type-core'),core=require('@tslite/core'),capability=require('@tslite/capability'),codec=require('@tslite/codec');var dn=(e={})=>core.rootScope(e),I=(e,n)=>core.childScope(e,n),C=(e,n)=>core.lookup(e,n),Ee=e=>core.visibleNames(e),ct=(e={},n={},t={},s={},r=new Set,a=new Set,o={})=>({scope:dn(e),types:n,schemes:t,accessors:s,asserters:r,matchers:a,modules:o}),pt=(e,n)=>e.types[n],dt=(e,n)=>e.schemes[n];var fn={"unknown-name":"semantic","const-needs-init":"semantic","cannot-redeclare":"semantic","unknown-module":"semantic",unsupported:"semantic","forbidden-member":"semantic","unused-name":"semantic","assign-to-const":"semantic","readonly-write":"type","not-assignable":"type","not-callable":"type","no-such-member":"type","not-object":"type","missing-argument":"type","excess-argument":"type","excess-property":"type","spread-argument":"type","props-mismatch":"type","no-matching-overload":"type","constraint-violation":"type","wrong-type-argument-count":"type","cast-unsound":"type","too-deep":"type","too-complex-union":"type","node-not-allowed":"capability","name-not-allowed":"capability","type-feature-not-allowed":"capability","any-not-allowed":"capability","too-large":"capability","wrong-result-type":"capability"},k=(e,n,t)=>({code:e,kind:fn[e],severity:"error",node:n,message:t}),v=(e,n,t,s="error")=>({code:e,kind:fn[e],severity:s,node:n,message:t}),S={notAssignable:(e,n,t,s={})=>{let r=typeCore.typeDiff(n,t,s).filter(o=>o.path.length>0),a=r.length?` ${typeCore.formatTypeDiff(r)}.`:"";return k("not-assignable",e,`Type '${typeCore.format(n)}' is not assignable to type '${typeCore.format(t)}'.${a}`)},unknownName:(e,n)=>k("unknown-name",e,`Cannot find name '${n}'.`),notCallable:(e,n)=>k("not-callable",e,`Type '${typeCore.format(n)}' is not callable.`),noSuchMember:(e,n,t)=>k("no-such-member",e,`Property '${t}' does not exist on type '${typeCore.format(n)}'.`),notObject:(e,n)=>k("not-object",e,`Type '${typeCore.format(n)}' has no members to access.`),constNeedsInit:e=>k("const-needs-init",e,"'const' declarations must be initialized."),missingArgument:(e,n,t)=>k("missing-argument",e,`Missing argument '${n}' of type '${typeCore.format(t)}'.`),unknownModule:(e,n)=>k("unknown-module",e,`Cannot find module '${n}' or its corresponding type declarations.`),cannotRedeclare:(e,n)=>k("cannot-redeclare",e,`Cannot redeclare block-scoped variable '${n}'.`),excessArgument:(e,n,t)=>k("excess-argument",e,`Expected ${n} argument${n===1?"":"s"}, but got ${t}.`),excessProperty:(e,n,t)=>k("excess-property",e,`Object literal may only specify known properties, and '${n}' does not exist in type '${typeCore.format(t)}'.`),spreadArgument:e=>k("spread-argument",e,"A spread argument must either have a tuple type or be passed to a rest parameter."),propsMismatch:(e,n,t)=>k("props-mismatch",e,`Payload is not compatible with the component props '${typeCore.format(n)}': ${t}.`),noMatchingOverload:(e,n,t)=>k("no-matching-overload",e,`No overload of '${typeCore.format(n)}' matches the arguments (${t.map(s=>typeCore.format(s)).join(", ")}).`),constraintViolation:(e,n,t,s)=>k("constraint-violation",e,`Type '${typeCore.format(t)}' does not satisfy the constraint '${n} extends ${typeCore.format(s)}'.`),unsupported:(e,n)=>k("unsupported",e,`${n} is not supported in this language.`),wrongTypeArgumentCount:(e,n,t)=>k("wrong-type-argument-count",e,`Expected ${n} type argument${n===1?"":"s"}, but got ${t}.`),forbiddenMember:(e,n)=>k("forbidden-member",e,`'${n}' is not a member of the language \u2014 the JS runtime substrate (identity/inheritance) is not vocabulary here (FP / portable IR). Use a factory/operator via DI.`),unusedName:(e,n)=>v("unused-name",e,`'${n}' is declared but its value is never read.`,"warning"),assignToConst:(e,n,t)=>k("assign-to-const",e,t==="import"?`Cannot assign to '${n}' because it is an import.`:`Cannot assign to '${n}' because it is a constant.`),readonlyWrite:(e,n)=>k("readonly-write",e,`Index signature in type '${typeCore.format(n)}' only permits reading.`),castUnsound:(e,n,t)=>v("cast-unsound",e,`Conversion of type '${typeCore.format(n)}' to type '${typeCore.format(t)}' may be a mistake \u2014 neither sufficiently overlaps the other. Cast through 'unknown' first if intentional.`,"warning")};function ne(){let e=[];return {all:e,report(n){e.push(n);},hasErrors(){return e.some(n=>n.severity==="error")}}}function Ae(e,n,t={}){return n.flatMap(s=>s(e,t))}function Y(e,n){let t=s=>{n(s);for(let r of core.childrenOf(s))t(r);};t(e);}var Nt=e=>Array.isArray(e)?e:[e],yn=["ArrowFunctionExpression","FunctionExpression","FunctionDeclaration"];function De(e,n="error"){return t=>{let s=[];return Y(t,r=>{let a=capability.nodeViolation(r,e);a&&s.push(v("node-not-allowed",r,`'${a}' is not allowed by the capability profile.`,n));}),s}}function hn(e,n="error"){let t=e.typeTier;return s=>{if(t==="author")return [];let r=[];return Y(s,a=>{let o=a,i=o.type==="TSTypeAliasDeclaration"?o.id?.name:void 0;for(let l of [o.typeAnnotation,o.returnType]){if(!l)continue;let u=capability.typeFeatureViolations(typeCore.typeFeatures(l,i),t);u.length&&r.push(v("type-feature-not-allowed",a,`authoring type feature${u.length>1?"s":""} '${u.join("', '")}' requires capability tier 'author'.`,n));}}),r}}function b(e,n=new WeakSet){if(!e||typeof e!="object"||n.has(e))return false;switch(n.add(e),e.t){case "any":return true;case "object":return Object.values(e.props).some(t=>b(t.type,n))||!!e.index&&b(e.index.value,n);case "array":return b(e.items,n);case "tuple":return e.elements.some(t=>b(t,n));case "union":case "intersection":return e.of.some(t=>b(t,n));case "fn":return e.params.some(t=>b(t.type,n))||b(e.returns,n);case "overload":return e.signatures.some(t=>t.params.some(s=>b(s.type,n))||b(t.returns,n));case "keyof":return b(e.of,n);case "index":return b(e.obj,n)||b(e.key,n);case "mapped":return b(e.over,n)||b(e.body,n);case "conditional":return b(e.check,n)||b(e.extends,n)||b(e.then,n)||b(e.else,n);case "returnType":case "parameters":return b(e.fn,n);case "apply":return e.args.some(t=>b(t,n));default:return false}}function gn(e,n="error"){return t=>{if(!e.typeStrict)return [];let s=[];return Y(t,r=>{let a=r;for(let o of [a.typeAnnotation,a.returnType])if(o&&b(o)){s.push(v("any-not-allowed",r,"'any' is not allowed under 'strict' \u2014 use 'unknown' + validated narrowing (assert/parse).",n));break}}),s}}function Ce(e,n="error"){let t=new Set(e);return s=>{let r=[];return Y(s,a=>{if(a.type!=="CallExpression")return;let o=a.callee;if(o.type!=="Identifier")r.push(v("name-not-allowed",o,"Only direct calls to allowed functions are permitted.",n));else {let i=o.name;t.has(i)||r.push(v("name-not-allowed",o,`Function '${i}' is not allowed here.`,n));}}),r}}function fe(e,n,t={}){let s=new Set(Nt(e)),r=t.severity??"error",a=[...s].join("/");return o=>{let i=[],l=(u,c)=>{let p=s.has(u.type),m=p?c+1:c;p&&m>n&&i.push(v("too-deep",u,`Nesting of ${a} exceeds ${n}${t.hint?` \u2014 ${t.hint}`:""}.`,r));for(let f of core.childrenOf(u))l(f,m);};return l(o,0),i}}var Te=(e=3,n="error")=>fe(yn,e,{hint:"use a pipe instead of nesting functions",severity:n}),Re=(e,n="error")=>fe("CallExpression",e,{hint:"use a pipe instead of nesting calls",severity:n}),Me=(e,n="error")=>fe("MemberExpression",e,{severity:n});function Pe(e,n="error"){return t=>{let s=[],r=(a,o)=>{if(o>e){s.push(v("too-deep",a,`Expression nesting exceeds ${e}.`,n));return}for(let i of core.childrenOf(a))r(i,o+1);};return r(t,0),s}}function Fe(e,n="error"){return t=>{let s=0;return Y(t,()=>{s++;}),s>e?[v("too-large",t,`Expression has ${s} nodes (max ${e}).`,n)]:[]}}function Ie(e,n="error"){return t=>{let s=[];return Y(t,r=>{if(r.type==="CallExpression"){let a=r.arguments;a&&a.length>e&&s.push(v("too-large",r,`Call has ${a.length} arguments (max ${e}).`,n));}}),s}}function Oe(e,n={},t="error"){return (s,r)=>{let a=r.overlay?.get(s)?.type;return a?typeCore.subtype(a,e,n)?[]:[v("wrong-result-type",s,`Result type '${typeCore.format(a)}' is not assignable to the required '${typeCore.format(e)}'.`,t)]:[]}}function me(e){let n=[De(e),hn(e),gn(e)];return e.hostAllow!=="*"&&n.push(Ce([...e.hostAllow])),n}function bt(e){return me(capability.compileProfile(e))}var q=e=>({bindings:new Map,parent:e}),Nn=e=>e.charCodeAt(0)===95;function ye(e,n,t,s,r,a){let o=e.bindings.get(t);o&&(o.exempt=true);let i={name:t,node:s,kind:r,exempt:a,used:false};e.bindings.set(t,i),n.all.push(i);}function se(e,n){if(!e||typeof e!="object")return;if(Array.isArray(e)){for(let s of e)se(s,n);return}let t=e;if(t.t==="typeQuery"&&Array.isArray(t.path)){let s=t.path[0];typeof s=="string"&&he(n,s);return}for(let s of Object.keys(t))se(t[s],n);}function Bn(e,n){let t=e;se(t.typeAnnotation,n),se(t.returnType,n);}function he(e,n){for(let t=e;t;t=t.parent){let s=t.bindings.get(n);if(s){s.used=true;return}}}function x(e,n,t,s,r,a){if(e)switch(e.type){case "Identifier":{let o=e.name;Bn(e,n),ye(n,t,o,e,s,r||a&&Nn(o));return}case "ObjectPattern":{let o=e.properties,i=o[o.length-1],l=!!i&&i.type==="RestElement";o.forEach((u,c)=>{let p=l&&c<o.length-1;if(u.type==="RestElement")x(u.argument,n,t,s,r,false);else {let m=u;m.computed&&B(m.key,n,t),x(m.value,n,t,s,r||p,!m.shorthand);}});return}case "ArrayPattern":{for(let o of e.elements){if(!o)continue;let i=o;x(i.type==="RestElement"?i.argument:i,n,t,s,r,true);}return}case "AssignmentPattern":x(e.left,n,t,s,r,a);return;case "RestElement":x(e.argument,n,t,s,r,true);return;default:return}}function te(e,n,t){if(e)switch(e.type){case "AssignmentPattern":B(e.right,n,t),te(e.left,n,t);return;case "ObjectPattern":for(let s of e.properties)te(s.type==="RestElement"?s.argument:s.value,n,t);return;case "ArrayPattern":for(let s of e.elements)s&&te(s,n,t);return;case "RestElement":te(e.argument,n,t);return;default:return}}function Sn(e,n,t,s){for(let r of e.declarations)x(r.id,n,t,"local",s,false),B(r.init,n,t);}function je(e,n,t){let s=e,r=q(n),a=s.params??[];for(let o of a)x(o,r,t,"parameter",false,true);for(let o of a)te(o,r,t);B(s.body,r,t);}function B(e,n,t){if(!(!e||typeof e!="object"||typeof e.type!="string"))switch(Bn(e,n),e.type){case "Identifier":he(n,e.name);return;case "MemberExpression":{let s=e;B(s.object,n,t),s.computed&&B(s.property,n,t);return}case "Property":{let s=e;s.computed&&B(s.key,n,t),B(s.value,n,t);return}case "Program":case "BlockStatement":{let s=q(n);for(let r of e.body??[])B(r,s,t);return}case "ArrowFunctionExpression":case "FunctionExpression":je(e,n,t);return;case "FunctionDeclaration":{let s=e.id;s&&ye(n,t,s.name,s,"local",false),je(e,n,t);return}case "CatchClause":{let s=e,r=q(n);x(s.param,r,t,"local",true,false),B(s.body,r,t);return}case "SwitchStatement":{let s=e;B(s.discriminant,n,t);let r=q(n);for(let a of s.cases){B(a.test,r,t);for(let o of a.consequent??[])B(o,r,t);}return}case "ForStatement":{let s=e,r=q(n);B(s.init,r,t),B(s.test,r,t),B(s.update,r,t),B(s.body,r,t);return}case "ForOfStatement":case "ForInStatement":{let s=e;B(s.right,n,t);let r=q(n),a=s.left;if(a.type==="VariableDeclaration")for(let o of a.declarations)x(o.id,r,t,"local",false,true);else B(a,r,t);B(s.body,r,t);return}case "VariableDeclaration":Sn(e,n,t,false);return;case "ImportDeclaration":{for(let s of e.specifiers){let r=s.local;r&&ye(n,t,r.name,r,"import",Nn(r.name));}return}case "ExportNamedDeclaration":{let s=e;if(s.declaration){let r=s.declaration;if(r.type==="VariableDeclaration")Sn(r,n,t,true);else if(r.type==="FunctionDeclaration"){let a=r.id;a&&ye(n,t,a.name,a,"local",true),je(r,n,t);}else B(r,n,t);}else for(let r of s.specifiers)he(n,r.local.name);return}case "TSAsExpression":B(e.expression,n,t);return;case "TSTypeAliasDeclaration":se(e.typeAnnotation,n);return;case "JsonExpression":Ue(e.body,n,t);return;case "JSXOpeningElement":{let s=e;bn(s.name,n);for(let r of s.attributes??[])B(r,n,t);return}case "JSXClosingElement":return;case "JSXAttribute":B(e.value,n,t);return;default:{let s=core.VisitorKeys[e.type];if(!s)return;let r=e;for(let a of s){let o=r[a];if(Array.isArray(o))for(let i of o)B(i,n,t);else B(o,n,t);}return}}}function bn(e,n,t){e&&(e.type==="JSXIdentifier"?he(n,e.name):e.type==="JSXMemberExpression"&&bn(e.object,n));}function Ue(e,n,t){if(!e||typeof e!="object")return;if(Array.isArray(e)){for(let r of e)Ue(r,n,t);return}let s=e;if(core.AST_MARKER in s){try{B(codec.fromJson(s),n,t);}catch{}return}for(let r of Object.keys(s))Ue(s[r],n,t);}function $e(e,n){if(!n.locals&&!n.parameters)return [];let t={all:[]};B(e,q(void 0),t);let s=[];for(let r of t.all)r.used||r.exempt||(r.kind==="parameter"?n.parameters:n.locals)&&s.push(S.unusedName(r.node,r.name));return s}var At=new Set(["const","import"]),re=e=>({binds:new Map,parent:e});function Dt(e,n){for(let t=e;t;t=t.parent){let s=t.binds.get(n);if(s)return s}}function _(e){if(!e)return [];switch(e.type){case "Identifier":return [e];case "ObjectPattern":return e.properties.flatMap(n=>n.type==="RestElement"?_(n.argument):_(n.value));case "ArrayPattern":return e.elements.flatMap(n=>n?_(n):[]);case "AssignmentPattern":return _(e.left);case "RestElement":return _(e.argument);default:return []}}var ge=(e,n,t)=>{for(let s of _(n))e.binds.set(s.name,t);};function Le(e,n,t){if(!e)return;if(e.type!=="Identifier"){for(let a of _(e))Le(a,n,t);return}let s=e.name,r=Dt(n,s);r&&At.has(r)&&(t.invalid.add(e),t.out.push(S.assignToConst(e,s,r==="import"?"import":"const")));}function R(e,n,t){if(!(!e||typeof e!="object"||typeof e.type!="string"))switch(e.type){case "AssignmentExpression":{let s=e;Le(s.left,n,t),R(s.right,n,t);return}case "UpdateExpression":{Le(e.argument,n,t);return}case "Program":case "BlockStatement":{let s=re(n);for(let r of e.body??[])R(r,s,t);return}case "ArrowFunctionExpression":case "FunctionExpression":case "FunctionDeclaration":{let s=e,r=re(n);for(let a of s.params??[])ge(r,a,"param");R(s.body,r,t);return}case "CatchClause":{let s=e,r=re(n);ge(r,s.param,"param"),R(s.body,r,t);return}case "ForStatement":case "ForOfStatement":case "ForInStatement":{let s=e,r=re(n),a=s.left??s.init;if(a?.type==="VariableDeclaration")for(let o of a.declarations)ge(r,o.id,a.kind);else a&&R(a,r,t);R(s.right,n,t),R(s.test,r,t),R(s.update,r,t),R(s.body,r,t);return}case "VariableDeclaration":{let s=e;for(let r of s.declarations)R(r.init,n,t),ge(n,r.id,s.kind);return}case "ImportDeclaration":{for(let s of e.specifiers){let r=s.local;r&&n.binds.set(r.name,"import");}return}case "ExportNamedDeclaration":{let s=e;s.declaration&&R(s.declaration,n,t);return}case "TSTypeAliasDeclaration":return;case "TSAsExpression":R(e.expression,n,t);return;default:{let s=core.VisitorKeys[e.type];if(!s)return;let r=e;for(let a of s){let o=r[a];if(Array.isArray(o))for(let i of o)R(i,n,t);else R(o,n,t);}return}}}function Ve(e){let n={out:[],invalid:new WeakSet};return R(e,re(void 0),n),{diagnostics:n.out,invalidTargets:n.invalid}}var ae=e=>({decls:new Map,parent:e});function Tt(e,n){for(let t=e;t;t=t.parent){let s=t.decls.get(n);if(s)return s}}function H(e){if(!e)return [];switch(e.type){case "Identifier":return [e];case "ObjectPattern":return e.properties.flatMap(n=>n.type==="RestElement"?H(n.argument):H(n.value));case "ArrayPattern":return e.elements.flatMap(n=>n?H(n):[]);case "AssignmentPattern":return H(e.left);case "RestElement":return H(e.argument);default:return []}}var Se=(e,n)=>{for(let t of H(n))e.decls.set(t.name,t);};function D(e,n,t){if(!(!e||typeof e!="object"||typeof e.type!="string"))switch(e.type){case "Identifier":{let s=Tt(n,e.name);s&&s!==e&&t.set(e,s);return}case "MemberExpression":{let s=e;D(s.object,n,t),s.computed&&D(s.property,n,t);return}case "Property":{let s=e;s.computed&&D(s.key,n,t),D(s.value,n,t);return}case "Program":case "BlockStatement":{let s=ae(n);for(let r of e.body??[])D(r,s,t);return}case "ArrowFunctionExpression":case "FunctionExpression":case "FunctionDeclaration":{let s=e,r=e.id;r&&n.decls.set(r.name,r);let a=ae(n);for(let o of s.params??[])Se(a,o);D(s.body,a,t);return}case "CatchClause":{let s=e,r=ae(n);Se(r,s.param),D(s.body,r,t);return}case "ForStatement":case "ForOfStatement":case "ForInStatement":{let s=e,r=ae(n),a=s.left??s.init;if(a?.type==="VariableDeclaration")for(let o of a.declarations)Se(r,o.id);else a&&D(a,r,t);D(s.right,n,t),D(s.test,r,t),D(s.update,r,t),D(s.body,r,t);return}case "VariableDeclaration":{for(let s of e.declarations)Se(n,s.id),D(s.init,n,t);return}case "ImportDeclaration":{for(let s of e.specifiers){let r=s.local;r&&n.decls.set(r.name,r);}return}case "TSTypeAliasDeclaration":{let s=e.id;s&&n.decls.set(s.name,s);return}case "TSAsExpression":D(e.expression,n,t);return;default:{let s=core.VisitorKeys[e.type];if(!s)return;let r=e;for(let a of s){let o=r[a];if(Array.isArray(o))for(let i of o)D(i,n,t);else D(o,n,t);}return}}}function Rt(e){let n=new WeakMap;return D(e,ae(void 0),n),n}var xe=e=>e.typeAnnotation,Ge=e=>e.returnType,$=e=>e.type==="Identifier"?e.name:null,kn=e=>{if(e.type==="VariableDeclaration"){let n=e.declarations[0];return n?$(n.id):null}return $(e)},ie=e=>{if(e.computed)return null;let n=e.key;return n.type==="Identifier"?n.name:n.type==="Literal"?String(n.value??""):null};function wn(e){let n=s=>s&&s.type==="Literal"&&typeof s.value=="string"?s.value:null;if(e.length===1&&e[0].type==="ArrayExpression"){let s=[];for(let r of e[0].elements){let a=n(r);if(a===null)return null;s.push(a);}return s}let t=[];for(let s of e){let r=n(s);if(r===null)return null;t.push(r);}return t.length?t:null}function Ke(e){if(e.type==="Identifier")return e.name;if(e.type==="MemberExpression"){let n=e;if(n.computed||n.property.type!=="Identifier")return null;let t=Ke(n.object);return t===null?null:`${t}.${n.property.name}`}return null}function We(e){let n=e;if(n.regex||n.bigint)return typeCore.s.unknown;let t=n.value;return t===null?typeCore.s.null:t===void 0?typeCore.s.undefined:typeof t=="string"||typeof t=="number"||typeof t=="boolean"?{t:"literal",value:t,fresh:true}:typeCore.s.unknown}var z=e=>{let n=e.value;return n===null?typeCore.s.null:typeof n=="string"||typeof n=="number"||typeof n=="boolean"?typeCore.s.literal(n):We(e)},Je=e=>e.type==="ArrowFunctionExpression",En=e=>e.t==="apply"&&e.name==="Promise"&&e.args.length===1,Be=e=>En(e)?e.args[0]:e,le=e=>En(e)?e:typeCore.s.promise(e);function oe(e){return e.t==="tuple"?true:e.t==="array"?oe(e.items):e.t==="union"?e.of.some(oe):false}function Ne(e){return e.t==="literal"?true:e.t==="union"?e.of.some(n=>Ne(n)):e.t==="var"?e.isConst===true||e.bound!==void 0&&Ne(e.bound):false}var L=(e,n)=>{let t=e;for(let s=0;s<50&&t.t==="apply";s++){let r=typeCore.expand1(t,n);if(r===t||r.t==="apply"&&r.name===t.name)break;t=r;}return t};function vn(e){let n=Ge(e);return n?{t:"fn",params:e.params.map((s,r)=>({name:$(s)??`arg${r}`,type:xe(s)??typeCore.s.unknown})),returns:e.async?le(n):n}:null}var G={then:{},else:{}},Fn=new Set(["string","number","boolean","undefined","function","object"]),An={string:typeCore.s.string,number:typeCore.s.number,boolean:typeCore.s.boolean,undefined:typeCore.s.undefined};function In(e,n){switch(n){case "string":return e.t==="string"||e.t==="literal"&&typeof e.value=="string";case "number":return e.t==="number"||e.t==="literal"&&typeof e.value=="number";case "boolean":return e.t==="boolean"||e.t==="literal"&&typeof e.value=="boolean";case "undefined":return e.t==="undefined";case "function":return e.t==="fn"||e.t==="overload";case "object":return e.t==="object"||e.t==="array"||e.t==="tuple"||e.t==="null";default:return false}}var It=typeCore.s.literal(true),Ot=typeCore.s.literal(false),V=e=>e.t==="union"?[...e.of]:e.t==="boolean"?[It,Ot]:[e];function Dn(e,n){let t=e,s=n;return e.type==="UnaryExpression"&&t.operator==="typeof"&&t.argument.type==="Identifier"&&n.type==="Literal"&&typeof s.value=="string"?{name:t.argument.name,tag:s.value}:null}function jt(e,n,t){if(e.t==="unknown"||e.t==="any")return n;let s=V(e).filter(r=>typeCore.subtype(r,n,t));return s.length?typeCore.normalizeUnion(s):n}function Ut(e,n,t){if(e.t==="unknown"||e.t==="any")return null;let s=V(e).filter(r=>!typeCore.subtype(r,n,t));return s.length?typeCore.normalizeUnion(s):null}function $t(e,n){if(!Fn.has(n))return null;if(e.t==="unknown"||e.t==="any")return An[n]??e;let t=V(e).filter(s=>In(s,n));return t.length?typeCore.normalizeUnion(t):An[n]??e}function Lt(e,n){if(!Fn.has(n)||e.t==="unknown"||e.t==="any")return null;let t=V(e).filter(s=>!In(s,n));return t.length?typeCore.normalizeUnion(t):null}function Cn(e,n){if(e.type==="Identifier"&&n.type==="Literal"){let t=z(n);if(t.t==="literal"||t.t==="null")return {name:e.name,lit:t}}return null}function Tn(e,n){if(e.type==="MemberExpression"&&!e.computed&&!e.optional&&e.object.type==="Identifier"&&e.property.type==="Identifier"&&n.type==="Literal"){let t=z(n);if(t.t==="literal"||t.t==="null")return {name:e.object.name,prop:e.property.name,lit:t}}return null}function Rn(e,n,t,s,r){let a=V(e),o=l=>l.t==="object"?typeCore.ownProp(l.props,n)?.type:void 0,i=a.filter(l=>{let u=o(l);return s?!!u&&typeCore.subtype(t,u,r):!(u&&typeCore.subtype(u,t,r))});return i.length&&i.length<a.length?typeCore.normalizeUnion(i):null}function Mn(e,n,t){let s=V(e),r=o=>o.t==="object"&&(n in o.props||!!o.index),a=s.filter(o=>t?r(o):!r(o));return a.length&&a.length<s.length?typeCore.normalizeUnion(a):null}function Vt(e,n,t){return e.t==="unknown"||e.t==="any"||typeCore.subtype(n,e,t)?n:null}function xt(e,n,t){let s=V(e),r=s.filter(a=>!typeCore.equals(a,n,t));return r.length&&r.length<s.length?typeCore.normalizeUnion(r):null}var Gt=e=>e.t==="null"||e.t==="undefined",On=e=>Gt(e)||e.t==="literal"&&!e.value,Kt=e=>{if(e.t==="unknown"||e.t==="any")return null;let n=V(e),t=n.filter(s=>!On(s));return t.length&&t.length<n.length?typeCore.normalizeUnion(t):null},Wt=e=>{let n=V(e),t=n.filter(On);return t.length&&t.length<n.length?typeCore.normalizeUnion(t):null},Pn=e=>e.type==="Literal"&&e.value===null?"null":e.type==="Identifier"&&e.name==="undefined"?"undefined":null,O=(e,n,t)=>({then:n?{[e]:n}:{},else:t?{[e]:t}:{}}),Jt=e=>e==="==="||e==="=="||e==="!=="||e==="!=";function ce(e,n,t){if(e.type==="BinaryExpression"){let s=e;if(s.operator==="in"){let f=s.left,N=s.right;if(f.type==="Literal"&&typeof f.value=="string"&&N.type==="Identifier"){let g=N.name,E=C(n,g);if(!E)return G;let w=String(f.value);return O(g,Mn(E,w,true),Mn(E,w,false))}return G}if(!Jt(s.operator))return G;let r=s.operator==="!=="||s.operator==="!=",a=s.left,o=s.right,i=Dn(a,o)??Dn(o,a);if(i){let f=C(n,i.name);if(!f)return G;let N=$t(f,i.tag),g=Lt(f,i.tag);return r?O(i.name,g,N):O(i.name,N,g)}let l=Pn(a),u=Pn(o),c=l?o:u?a:null;if((l||u)&&c?.type==="Identifier"){let f=c.name,N=C(n,f);if(!N)return G;let E=s.operator==="=="||s.operator==="!="?["null","undefined"]:[l??u],w=V(N),un=w.filter(we=>E.includes(we.t)),ke=w.filter(we=>!E.includes(we.t)),cn=un.length?typeCore.normalizeUnion(un):null,pn=ke.length&&ke.length<w.length?typeCore.normalizeUnion(ke):null;return r?O(f,pn,cn):O(f,cn,pn)}let p=Cn(a,o)??Cn(o,a);if(p){let f=C(n,p.name);if(!f)return G;let N=Vt(f,p.lit,t),g=xt(f,p.lit,t);return r?O(p.name,g,N):O(p.name,N,g)}let m=Tn(a,o)??Tn(o,a);if(m){let f=C(n,m.name);if(!f)return G;let N=Rn(f,m.prop,m.lit,true,t),g=Rn(f,m.prop,m.lit,false,t);return r?O(m.name,g,N):O(m.name,N,g)}return G}if(e.type==="UnaryExpression"&&e.operator==="!"){let s=ce(e.argument,n,t);return {then:s.else,else:s.then}}if(e.type==="CallExpression"){let s=_t(e,n,t);if(s)return s}if(e.type==="Identifier"){let s=e.name,r=C(n,s);if(r)return O(s,Kt(r),Wt(r))}return G}function qt(e,n){if(e.t==="fn")return e.guard??null;if(e.t==="overload"){for(let t of e.signatures)if(t.guard&&t.params.length===n)return t.guard}return null}function _t(e,n,t){let s=e.callee;if(s.type!=="Identifier")return null;let r=C(n,s.name);if(!r)return null;let a=qt(r,e.arguments.length);if(!a)return null;let o=e.arguments[a.param];if(!o||o.type!=="Identifier")return null;let i=o.name,l=C(n,i);return l?O(i,jt(l,a.type,t),Ut(l,a.type,t)):null}var W=(e,n)=>Object.keys(n).length?I(e,n):e;function X(e){switch(e.type){case "ReturnStatement":case "ThrowStatement":return true;case "BlockStatement":{let n=e.body;return n.length>0&&X(n[n.length-1])}case "IfStatement":{let n=e;return !!n.alternate&&X(n.consequent)&&X(n.alternate)}default:return false}}var us=e=>{let n={};for(let t of Object.keys(e))n[t]={params:[],body:e[t]};return n};function cs(e){let n=[];return e.maxDepth!==void 0&&n.push(Pe(e.maxDepth)),e.maxNodes!==void 0&&n.push(Fe(e.maxNodes)),e.maxArgs!==void 0&&n.push(Ie(e.maxArgs)),e.maxFunctionNesting!==void 0&&n.push(Te(e.maxFunctionNesting)),e.maxCallNesting!==void 0&&n.push(Re(e.maxCallNesting)),e.memberDepth!==void 0&&n.push(Me(e.memberDepth)),n}function ps(e,n){let t=e.typeRefs;return t?.length?t.filter(s=>!(s.name in n)).map(s=>v("unknown-name",{type:"Identifier",name:s.name,loc:s.loc},`Cannot find name '${s.name}'.`)):[]}function qn(e,n,t={}){let s={...us(n.types),...n.schemes,...fs(e)},r=Ve(e),a={overlay:new WeakMap,sink:ne(),env:n,schemes:s,importNames:new Set,resolvedSchemes:new Set,invalidTargets:r.invalidTargets,evolving:new Set,declaredMut:new Map,assignFlow:new WeakMap},o=t.profile?capability.compileProfile(t.profile):void 0;o&&typeCore.configureTypeLimits(o.typeLimits);try{let i,l=ms(e,a);try{i=y(e,l,a);}catch(p){if(p instanceof typeCore.TypeEvalLimitError)a.sink.report(v("too-deep",e,p.message));else if(p instanceof typeCore.UnionTooComplexError)a.sink.report(v("too-complex-union",e,p.message));else throw p;i=typeCore.s.unknown;}let u=[];o&&u.push(...me(o)),t.limits&&u.push(...cs(t.limits)),t.resultType&&u.push(Oe(t.resultType,s));let c=[...a.sink.all,...r.diagnostics,...ps(e,s),...t.unused?$e(e,t.unused):[],...u.length?Ae(e,u,{overlay:a.overlay}):[]];return {type:i,overlay:a.overlay,diagnostics:c,schemes:a.schemes}}finally{o&&typeCore.resetTypeLimits();}}function ds(e,n,t={}){let s=qn(e,n,t),r={},a=new Map,o,i=u=>{let c=[];if(u.type==="VariableDeclaration")for(let p of u.declarations){let m=$(p.id),f=s.overlay.get(p);m&&f&&(r[m]=f.type,c.push(m));}else if(u.type==="FunctionDeclaration"){let p=u.id?.name,m=s.overlay.get(u);p&&m&&(r[p]=m.type,c.push(p));}return c};for(let u of e.body??[])if(u.type==="VariableDeclaration"||u.type==="FunctionDeclaration")i(u);else if(u.type==="ExportNamedDeclaration"){let c=u;if(c.declaration)for(let p of i(c.declaration))a.set(p,p);else for(let p of c.specifiers)a.set(p.exported.name,p.local.name);}else if(u.type==="ExportDefaultDeclaration"){let c=s.overlay.get(u.declaration);o=c?c.type:typeCore.s.unknown;}let l={};if(a.size||o!==void 0){for(let[u,c]of a)r[c]&&(l[u]={type:r[c]});o!==void 0&&(l.default={type:o});}else for(let u in r)l[u]={type:r[u]};return {type:{t:"object",props:l},diagnostics:s.diagnostics}}var fs=e=>{let n={};return core.walk(e,{TSTypeAliasDeclaration(t){let s=t;s.id?.name&&s.typeAnnotation&&(n[s.id.name]={params:s.typeParameters??[],body:s.typeAnnotation});}}),n};function ms(e,n){let t=n.env.modules,s={};core.walk(e,{ImportDeclaration(r){let a=r,o=a.source.value,i=typeof o=="string"?t?.[o]:void 0;if(!i){n.sink.report(S.unknownModule(a.source,String(o)));for(let l of a.specifiers)s[l.local.name]=typeCore.s.unknown;return}for(let l of a.specifiers){let u=l.local.name;if(u in s){n.sink.report(S.cannotRedeclare(l.local,u));continue}if(l.type==="ImportNamespaceSpecifier"){s[u]=i;continue}let c=l.type==="ImportSpecifier"?l.imported.name:"default",p=typeCore.discover(i,[c],n.schemes);p?s[u]=p.type:(n.sink.report(S.noSuchMember(l,i,c)),s[u]=typeCore.s.unknown);}}});for(let r in s)n.importNames.add(r);return Object.keys(s).length?I(n.env.scope,s):n.env.scope}var h=(e,n,t,s)=>(e.overlay.set(n,{type:t,scope:s}),t);function y(e,n,t,s){switch(e.type){case _n:return e.schema;case "JSXElement":case "JSXFragment":return h(t,e,y(core.desugarJSX(e,{emptyPropsAsObject:true}),n,t),n);case "Literal":return h(t,e,We(e),n);case "Identifier":{let r=e.name,a=C(n,r);return a===void 0?r==="undefined"?h(t,e,typeCore.s.undefined,n):(t.sink.report(S.unknownName(e,r)),h(t,e,typeCore.s.unknown,n)):h(t,e,a,n)}case "MemberExpression":return h(t,e,gs(e,n,t),n);case "CallExpression":return h(t,e,bs(e,n,t,s),n);case "ArrowFunctionExpression":return nn(e,n,t);case "FunctionDeclaration":return t.sink.report(S.unsupported(e,"function declaration (use 'const fn = () => \u2026')")),h(t,e,typeCore.s.unknown,n);case "FunctionExpression":return t.sink.report(S.unsupported(e,"anonymous function (use an arrow)")),h(t,e,typeCore.s.unknown,n);case "ThisExpression":return t.sink.report(S.unsupported(e,"'this'")),h(t,e,typeCore.s.unknown,n);case "BlockStatement":return h(t,e,tn(e,n,t),n);case "ReturnStatement":{let r=e.argument;return h(t,e,r?y(r,n,t):typeCore.s.unknown,n)}case "IfStatement":return U(e,n,t),t.overlay.get(e)?.type??typeCore.s.unknown;case "ForStatement":case "WhileStatement":case "DoWhileStatement":case "ForOfStatement":case "ForInStatement":case "BreakStatement":case "ContinueStatement":case "ThrowStatement":case "TryStatement":case "SwitchStatement":return U(e,n,t),t.overlay.get(e)?.type??typeCore.s.unknown;case "AssignmentExpression":{let r=e,a=r.left,o=y(a,n,t);if(a.type==="MemberExpression"){let c=t.overlay.get(a.object)?.type,p=c&&typeCore.apparentType(c,t.schemes);p&&(p.t==="array"||p.t==="tuple")&&p.readonly&&t.sink.report(S.readonlyWrite(a,p));}let i=a.type==="Identifier"?a.name:null,l=i!==null&&t.evolving.has(i),u=i!==null?t.declaredMut.get(i):void 0;if(r.operator==="="&&!t.invalidTargets.has(a)){if(l&&i!==null){let p=y(r.right,n,t);return t.assignFlow.set(e,typeCore.widenLiteral(p)),h(t,e,p,n)}if(u&&i!==null){let p=y(r.right,n,t);return typeCore.subtype(p,u,t.schemes)||t.sink.report(S.notAssignable(r.right,p,u,t.schemes)),t.assignFlow.set(e,nt(u,p,t.schemes)),h(t,e,p,n)}let c=J(r.right,o,n,t);return h(t,e,c,n)}return h(t,e,y(r.right,n,t),n)}case "UpdateExpression":return y(e.argument,n,t),h(t,e,typeCore.s.number,n);case "ExpressionStatement":return h(t,e,y(e.expression,n,t),n);case "VariableDeclaration":return be(e,n,t),h(t,e,typeCore.s.unknown,n);case "TSTypeAliasDeclaration":{let r=e.id?.name,a=r?t.schemes[r]:void 0;return h(t,e,a?As(a.body,n,t,e,a.params.length>0):typeCore.s.unknown,n)}case "BinaryExpression":return h(t,e,xs(e,n,t),n);case "LogicalExpression":{let r=e,a=y(r.left,n,t),o=y(r.right,n,t);return h(t,e,Gs(r.operator,a,o),n)}case "UnaryExpression":return h(t,e,Js(e,n,t),n);case "ConditionalExpression":{let r=e;y(r.test,n,t);let a=ce(r.test,n,t.schemes),o=y(r.consequent,W(n,a.then),t),i=y(r.alternate,W(n,a.else),t);return h(t,e,typeCore.normalizeUnion([o,i]),n)}case "ObjectExpression":return h(t,e,qs(e,n,t),n);case "ArrayExpression":return h(t,e,rt(e,n,t),n);case "TemplateLiteral":{for(let r of e.expressions)y(r,n,t);return h(t,e,typeCore.s.string,n)}case "AwaitExpression":{let r=e.argument,a=r?y(r,n,t):typeCore.s.unknown;return h(t,e,Be(a),n)}case "Program":{let r=sn(e.body,n,t,new Set(t.importNames)).scope;return h(t,e,typeCore.s.unknown,r)}case "JsonExpression":return h(t,e,Qe(e.body,n,t,e),n);case "ChainExpression":return h(t,e,typeCore.normalizeUnion([y(e.expression,n,t),typeCore.s.undefined]),n);case "TSAsExpression":{let r=e,a=y(r.expression,n,t),o=de(r.typeAnnotation,n,t,e);return !typeCore.subtype(a,o,t.schemes)&&!typeCore.subtype(o,a,t.schemes)&&t.sink.report(S.castUnsound(e,a,o)),h(t,e,o,n)}default:return t.sink.report(S.unsupported(e,`'${e.type}'`)),h(t,e,typeCore.s.unknown,n)}}var ys=new Set(["constructor","prototype","__proto__"]);function hs(e){if(!e.computed)return e.property.type==="Identifier"?e.property.name:null;let n=e.property;if(n.type==="Literal"){let t=n.value;if(typeof t=="string")return t}return null}function gs(e,n,t){let s=y(e.object,n,t),r=hs(e);if(r!==null&&ys.has(r))return t.sink.report(S.forbiddenMember(e,r)),typeCore.s.unknown;if(e.computed){let i=y(e.property,n,t),l=typeCore.resolveTypeOp(typeCore.s.index(s,i));return l.t!=="index"?l:(i.t==="literal"&&typeof i.value=="string"&&Un(e,s,i.value,t),typeCore.s.unknown)}let a=e.property.name,o=typeCore.discover(s,[a],t.schemes);return o?o.type:(Un(e,s,a,t),typeCore.s.unknown)}function Un(e,n,t,s){let r=typeCore.isScheme(n,s.schemes)?typeCore.expand1(n,s.schemes):n;r.t==="object"||r.t==="array"||r.t==="tuple"||r.t==="union"?s.sink.report(S.noSuchMember(e,n,t)):r.t!=="any"&&r.t!=="unknown"&&s.sink.report(S.notObject(e,n));}function Ss(e,n,t){if(!e||e.type!=="Identifier")return;let s=e.name;if(C(n,s)===void 0)return;let r=t.schemes[s];return r&&r.params.length===0?r.body:void 0}function Ns(e,n,t,s){let r=L(y(n[0],t,s),s.schemes),o=(r.t==="fn"?r:r.t==="overload"?r.signatures[0]:void 0)?.params[0]?.type,i=n.length>1?y(n[1],t,s):typeCore.s.undefined;if(o){let l=typeCore.typeDiff(i,o,s.schemes);l.length&&s.sink.report(S.propsMismatch(n[1]??e,o,typeCore.formatTypeDiff(l)));}return h(s,e,typeCore.s.boolean,t)}var _n="TSLiteSyntheticArg",Bs=e=>({type:_n,schema:e});function zn(e,n,t){if(!e.some(a=>a.type==="SpreadElement"))return {nodes:[...e],spread:null};let s=[],r=null;for(let a of e){if(a.type!=="SpreadElement"){s.push(a);continue}let o=a.argument;if(o.type==="ArrayExpression"&&o.elements.every(l=>l&&l.type!=="SpreadElement")){for(let l of o.elements)s.push(l);continue}let i=L(y(o,n,t),t.schemes);if(i.t==="tuple")for(let l of i.elements)s.push(Bs(l));else r={elem:i.t==="array"?i.items:typeCore.s.unknown,node:a};}return {nodes:s,spread:r}}function bs(e,n,t,s){let r=e.arguments,a=Ke(e.callee);if(a){let p=t.env.accessors?.[a];if(p){let m=wn(r);if(m){let f=typeCore.discover(p,m,t.schemes);return f?f.type:(t.sink.report(S.noSuchMember(e,p,m.join("."))),typeCore.s.unknown)}return r.forEach(f=>y(f,n,t)),typeCore.s.unknown}}if(a&&t.env.asserters?.has(a)){let p=Ss(r[0],n,t);for(let m=1;m<r.length;m++)y(r[m],n,t);return p??typeCore.s.unknown}if(a&&t.env.matchers?.has(a))return Ns(e,r,n,t);let o=y(e.callee,n,t);if(o.t==="any")return r.forEach(p=>y(p,n,t)),typeCore.s.any;if(o.t==="overload")return ws(e,o,n,t,s);if(o.t!=="fn")return r.forEach(p=>y(p,n,t)),t.sink.report(S.notCallable(e,o)),typeCore.s.unknown;let i=zn(r,n,t),l=i.nodes.map(p=>Xn(p,n,t)),u=Hn(e),c=!u||Zn(o,u.length);return c||t.sink.report(S.wrongTypeArgumentCount(e,o.typeParams?.length??0,u.length)),Qn(e,o,i.nodes,l,n,t,i.spread,s,c?u:void 0)}function Xn(e,n,t){if(Je(e))return typeCore.s.any;if(e.type!=="CallExpression")return y(e,n,t);let s=ne(),r=y(e,n,{...t,sink:s});return s.hasErrors()?typeCore.s.any:(s.all.forEach(a=>t.sink.report(a)),r)}function Qn(e,n,t,s,r,a,o=null,i,l){let u=f=>{if(!i)return f;let N=typeCore.substitute(n.returns,f);if(N.t==="fn"&&i.t==="fn"){let g=f,E=Math.min(N.params.length,i.params.length);for(let w=0;w<E;w++)g=typeCore.unify(N.params[w].type,i.params[w].type,g)??g;return typeCore.unify(N.returns,i.returns,g)??g}return typeCore.unify(N,i,f)??f},c=l?Cs(e,n,l,a):void 0,p=c??u(typeCore.instantiateLoose(n,s).bindings);t.forEach((f,N)=>{if(Je(f)){let g=typeCore.widenType(typeCore.substitute(n.params[N]?.type??typeCore.s.any,p));s[N]=nn(f,r,a,g);}else if(f.type==="CallExpression"&&s[N].t==="any")s[N]=y(f,r,a,typeCore.substitute(n.params[N]?.type??typeCore.s.unknown,p));else if(f.type==="Literal"){let g=n.params[N]?.type??typeCore.s.unknown,E=g.t==="var"?g.bound?typeCore.substitute(g.bound,p):g:typeCore.substitute(g,p);Ne(E)&&(s[N]=h(a,f,z(f),r));}else if(f.type==="ArrayExpression"){let g=typeCore.substitute(n.params[N]?.type??typeCore.s.unknown,p);oe(g)&&(s[N]=an(f,g,r,a));}});let m=c??u(typeCore.instantiateLoose(n,s).bindings);return c||ks(e,n,m,a),Ps(e,n,s,m,a,t,o),t.forEach((f,N)=>{let g=n.params[N];f.type==="ObjectExpression"&&g&&!g.variadic&&rn(f,typeCore.substitute(g.type,m),a);}),typeCore.widenInferred(typeCore.groundVars(typeCore.substitute(n.returns,m),a.schemes))}var $n=new WeakMap;function Yn(e){let n=$n.get(e);if(n)return n;let t=new Map,s=new WeakSet;for(let r of e.params)M(r.type,t,s);return M(e.returns,t,s),$n.set(e,t),t}function M(e,n,t){switch(e.t){case "var":e.bound&&!n.has(e.name)&&n.set(e.name,e.bound);return;case "array":M(e.items,n,t);return;case "union":for(let s of e.of)M(s,n,t);return;case "object":if(t.has(e))return;t.add(e);for(let s in e.props)M(e.props[s].type,n,t);return;case "fn":if(t.has(e))return;t.add(e);for(let s of e.params)M(s.type,n,t);M(e.returns,n,t);return;case "overload":for(let s of e.signatures){for(let r of s.params)M(r.type,n,t);M(s.returns,n,t);}return;case "apply":for(let s of e.args)M(s,n,t);return;case "keyof":M(e.of,n,t);return;case "index":M(e.obj,n,t),M(e.key,n,t);return;case "mapped":M(e.over,n,t),M(e.body,n,t);return;default:return}}function ks(e,n,t,s){let r=Yn(n);if(r.size!==0)for(let[a,o]of r){let i=t[a];if(!i)continue;let l=typeCore.substitute(o,t);typeCore.subtype(i,l,s.schemes)||s.sink.report(S.constraintViolation(e,a,i,l));}}function ws(e,n,t,s,r){let a=zn(e.arguments,t,s),o=a.nodes,i=o.map(c=>Xn(c,t,s)),l=Hn(e),u=l?n.signatures.filter(c=>Zn(c,l.length)):n.signatures;if(l&&!u.length){let c=n.signatures.reduce((p,m)=>Math.max(p,m.typeParams?.length??0),0);return s.sink.report(S.wrongTypeArgumentCount(e,c,l.length)),Ln(e,n.signatures,a,o,i,t,s,r,void 0)}return Ln(e,u,a,o,i,t,s,r,l)}function Ln(e,n,t,s,r,a,o,i,l){let u={t:"overload",signatures:n},c=m=>t.spread?Ts(m,s.length):Rs(m,s.length),p=u.signatures.find(m=>c(m)&&Ms(m,r,o));if(!p){let m=u.signatures.filter(c);m.length===1?p=m[0]:u.signatures.length===1&&(p=u.signatures[0]);}return p?Qn(e,p,s,r,a,o,t.spread,i,l):(o.sink.report(S.noMatchingOverload(e,u,r)),typeCore.s.unknown)}function Es(e,n,t,s){let r=C(n,e[0]);if(r===void 0)return t.sink.report(S.unknownName(s,e[0])),typeCore.s.unknown;let a=e.slice(1),o=a.length?typeCore.discover(r,a,t.schemes)?.type:r;return o?o.t==="literal"?typeCore.s.literal(o.value):o:(t.sink.report(S.noSuchMember(s,r,a.join("."))),typeCore.s.unknown)}function de(e,n,t,s){let r=a=>{if(Array.isArray(a)){let u=false,c=a.map(p=>{let m=r(p);return m!==p&&(u=true),m});return u?c:a}if(!a||typeof a!="object")return a;let o=a;if(o.t==="typeQuery")return Es(o.path,n,t,s);if(o.t==="apply"&&typeof o.name=="string"&&(vs(o.name,n,t,s),!(o.name in t.schemes)))return typeCore.s.any;let i=false,l={};for(let u of Object.keys(o)){let c=r(o[u]);c!==o[u]&&(i=true),l[u]=c;}return i?l:o};return r(e)}function vs(e,n,t,s){if(t.resolvedSchemes.has(e))return;let r=t.schemes[e];if(!r)return;t.resolvedSchemes.add(e);let a=de(r.body,n,t,s);a!==r.body&&(t.schemes[e]={...r,body:a});}function As(e,n,t,s,r){let a={...t,sink:ne(),resolvedSchemes:new Set(Object.keys(t.schemes))},o=de(e,n,a,s);return a.sink.hasErrors()?e:r?o:typeCore.groundVars(o,t.schemes)}var en=(e,n,t)=>{let s=xe(e);return s===void 0?s:de(s,n,t,e)},Ds=(e,n,t)=>{let s=Ge(e);return s===void 0?s:de(s,n,t,e)},Hn=e=>{let n=e.typeArguments;return n?.length?n:void 0},Zn=(e,n)=>(e.typeParams?.length??0)===n;function Cs(e,n,t,s){let r=n.typeParams??[],a={};r.forEach((i,l)=>a[i]=t[l]);let o=a;for(let[i,l]of Yn(n)){let u=o[i];if(!u)continue;let c=typeCore.groundVars(typeCore.substitute(l,o),s.schemes);typeCore.subtype(u,c,s.schemes)||s.sink.report(S.constraintViolation(e,i,u,c));}return o}function Ts(e,n){let t=0,s=false;for(let r of e.params)r.variadic?s=true:r.optional||t++;return n>=t&&(s||n<e.params.length)}function Rs(e,n){let t=0;for(let s of e.params){if(s.variadic)return n>=t;s.optional||t++;}return n>=t&&n<=e.params.length}function Ms(e,n,t){let{bindings:s}=typeCore.instantiateLoose(e,n);for(let r=0;r<e.params.length;r++){let a=e.params[r];if(a.variadic)return true;if(r>=n.length){if(!a.optional)return false;continue}if(!typeCore.subtype(n[r],typeCore.substitute(a.type,s),t.schemes))return false}return true}function Ps(e,n,t,s,r,a=e.arguments??[],o=null){let i=u=>a[u]??e;for(let u=0;u<n.params.length;u++){let c=n.params[u];if(c.variadic)break;let p=typeCore.substitute(c.type,s);if(u>=t.length){!c.optional&&!o&&r.sink.report(S.missingArgument(e,c.name,p));continue}typeCore.subtype(t[u],p,r.schemes)||r.sink.report(S.notAssignable(i(u),t[u],p,r.schemes));}let l=n.params.find(u=>u.variadic);if(o){let u=t.length,c=n.params.filter(p=>!p.optional&&!p.variadic).length;if(!(u>=c&&(l||u<n.params.length))){r.sink.report(S.spreadArgument(o.node));return}if(l){let p=typeCore.substitute(l.type,s),m=p.t==="array"?p.items:typeCore.s.unknown;typeCore.subtype(o.elem,m,r.schemes)||r.sink.report(S.notAssignable(o.node,o.elem,m,r.schemes));}return}!l&&t.length>n.params.length&&r.sink.report(S.excessArgument(i(n.params.length),n.params.length,t.length));}function J(e,n,t,s){let r=L(n,s.schemes);switch(e.type){case "Literal":{let o=z(e);return typeCore.subtype(o,n,s.schemes)||s.sink.report(S.notAssignable(e,o,n,s.schemes)),h(s,e,n,t)}case "ArrayExpression":{if(oe(r)){let o=an(e,r,t,s);return typeCore.subtype(o,n,s.schemes)||s.sink.report(S.notAssignable(e,o,n,s.schemes)),h(s,e,o,t)}if(r.t==="array"){for(let o of e.elements){if(!o)continue;let i=o;i.type==="SpreadElement"?J(i.argument,n,t,s):J(i,r.items,t,s);}return h(s,e,n,t)}break}case "ObjectExpression":{if(r.t==="object"){let o={};for(let l of e.properties){let u=l;if(u.type==="SpreadElement"){y(u.argument,t,s);continue}let c=u,p=ie(c),m=p!==null?typeCore.ownProp(r.props,p)?.type:void 0,f=m?J(c.value,m,t,s):y(c.value,t,s);p!==null&&(o[p]={type:f}),h(s,u,f,t);}let i={t:"object",props:o};return typeCore.subtype(i,n,s.schemes)||s.sink.report(S.notAssignable(e,i,n,s.schemes)),h(s,e,n,t)}break}case "ArrowFunctionExpression":{if(r.t==="fn"){let o=nn(e,t,s,r);return typeCore.subtype(o,n,s.schemes)||s.sink.report(S.notAssignable(e,o,n,s.schemes)),h(s,e,n,t)}break}case "ConditionalExpression":{let o=e;return y(o.test,t,s),J(o.consequent,n,t,s),J(o.alternate,n,t,s),h(s,e,n,t)}}let a=y(e,t,s);return typeCore.subtype(a,n,s.schemes)||s.sink.report(S.notAssignable(e,a,n,s.schemes)),h(s,e,a,t)}function nn(e,n,t,s){let r=s&&s.t==="fn"?s:void 0,a={},o=new Map,i=e.params.map((f,N)=>{let g=f,E=$(g),w=en(g,n,t)??r?.params[N]?.type??typeCore.s.unknown;return E?(a[E]=w,(w.t==="union"||w.t==="boolean")&&o.set(E,w)):g.type!=="Identifier"&&Q(g,w,a,n,t),t.overlay.set(g,{type:w,scope:n}),{name:E??`arg${N}`,type:w}}),l=I(n,a),u=e.body,c=Ds(e,n,t);if(u.type!=="BlockStatement"&&c){let f=e.async?Be(c):c;J(u,f,l,t);let N=e.async?le(c):c;return h(t,e,{t:"fn",params:i,returns:N},n)}let p=u.type==="BlockStatement"?h(t,u,tn(u,l,t,new Set(Object.keys(a)),o),l):y(u,l,t),m=e.async?le(p):p;if(c){let f=e.async?Be(c):c,N=e.async?p:m;typeCore.subtype(N,f,t.schemes)||t.sink.report(S.notAssignable(u,m,c,t.schemes));let g=e.async?le(c):c;return h(t,e,{t:"fn",params:i,returns:g},n)}return h(t,e,{t:"fn",params:i,returns:typeCore.widenType(m)},n)}function ee(e){switch(e.type){case "Identifier":return [e];case "ObjectPattern":return e.properties.flatMap(n=>n.type==="RestElement"?ee(n.argument):ee(n.value));case "ArrayPattern":return e.elements.flatMap(n=>n?n.type==="RestElement"?ee(n.argument):ee(n):[]);case "AssignmentPattern":return ee(e.left);default:return []}}function et(e){if(e.type==="VariableDeclaration")return e.declarations.flatMap(n=>ee(n.id));if(e.type==="FunctionDeclaration"){let n=e.id;return n?[n]:[]}return e.type==="ExportNamedDeclaration"&&e.declaration?et(e.declaration):[]}function tn(e,n,t,s=new Set,r){let{returns:a}=sn(e.body,n,t,s,r);return a.length?typeCore.normalizeUnion(a):typeCore.s.unknown}var Fs=[typeCore.s.literal(true),typeCore.s.literal(false)];function Is(e){return e.t==="union"?e.of:e.t==="boolean"?Fs:[e]}function nt(e,n,t){let s=Is(e);if(s.length<=1)return e;let r=s.filter(o=>typeCore.subtype(n,o,t));if(r.length===0)return e;let a=typeCore.normalizeUnion(r);return typeCore.subtype(n,a,t)?a:e}function tt(e,n){if(e.type!=="ExpressionStatement")return null;let t=e.expression;if(t.type!=="AssignmentExpression")return null;let s=t,r=s.left;if(s.operator!=="="||r.type!=="Identifier")return null;let a=n.assignFlow.get(t);return a?{name:r.name,type:a}:null}function Xe(e,n,t){switch(e.type){case "BlockStatement":{let s=n;for(let r of e.body){let a=Xe(r,s,t);if(s=a.types,a.exits)return {types:s,exits:true}}return {types:s,exits:false}}case "ExpressionStatement":{let s=tt(e,t);if(!s)return {types:n,exits:false};let r=new Map(n);return r.set(s.name,s.type),{types:r,exits:false}}case "IfStatement":{let s=st(e,n,t);if(s.size===0)return {types:n,exits:X(e)};let r=new Map(n);for(let[a,o]of s)r.set(a,o);return {types:r,exits:X(e)}}case "ReturnStatement":case "ThrowStatement":return {types:n,exits:true};default:return {types:n,exits:false}}}function st(e,n,t){let s=Xe(e.consequent,n,t),r=e.alternate?Xe(e.alternate,n,t):{types:n,exits:false},a=new Set;for(let i of s.types.keys())s.types.get(i)!==n.get(i)&&a.add(i);for(let i of r.types.keys())r.types.get(i)!==n.get(i)&&a.add(i);let o=new Map;for(let i of a){let l=[];s.exits||l.push(s.types.get(i)??n.get(i)),r.exits||l.push(r.types.get(i)??n.get(i)),l.length&&o.set(i,typeCore.normalizeUnion(l));}return o}function Os(e,n){let t=new Map,s=r=>{let a=C(e,r);a!==void 0&&t.set(r,a);};for(let r of n.evolving)s(r);for(let r of n.declaredMut.keys())s(r);return t}function sn(e,n,t,s=new Set,r){if(!(r&&r.size)&&!js(e))return Vn(e,n,t,s);let a=new Set(t.evolving),o=new Map(t.declaredMut);if(r)for(let[i,l]of r)t.declaredMut.set(i,l);try{return Vn(e,n,t,s)}finally{t.evolving.clear();for(let i of a)t.evolving.add(i);t.declaredMut.clear();for(let[i,l]of o)t.declaredMut.set(i,l);}}function js(e){for(let n of e){let t=n;if(t.type==="VariableDeclaration"&&t.kind!=="const")return true;if(t.type==="ExportNamedDeclaration"){let s=t.declaration;if(s?.type==="VariableDeclaration"&&s.kind!=="const")return true}}return false}function Vn(e,n,t,s){let r=n,a=[];for(let o of e){let i=o;for(let l of et(i))s.has(l.name)?t.sink.report(S.cannotRedeclare(l,l.name)):s.add(l.name);if(i.type==="VariableDeclaration")r=be(i,r,t);else if(i.type!=="ImportDeclaration")if(i.type==="ExportNamedDeclaration"){let l=i;if(l.declaration?.type==="VariableDeclaration")r=be(l.declaration,r,t);else if(l.declaration?.type==="FunctionDeclaration"){let u=y(l.declaration,r,t),c=$(l.declaration.id);c&&(r=I(r,{[c]:u}));}else for(let u of l.specifiers)C(r,u.local.name)===void 0&&t.sink.report(S.unknownName(u.local,u.local.name));}else if(i.type==="ExportDefaultDeclaration")y(i.declaration,r,t);else if(i.type==="FunctionDeclaration"){let l=y(i,r,t),u=$(i.id);u&&(r=I(r,{[u]:l}));}else if(i.type==="IfStatement"){let l=i,u=t.evolving.size||t.declaredMut.size?Os(r,t):null;if(a.push(...U(i,r,t)),u&&u.size){let c=st(l,u,t);c.size&&(r=W(r,Object.fromEntries(c)));}!l.alternate&&X(l.consequent)&&(r=W(r,ce(l.test,r,t.schemes).else));}else {a.push(...U(i,r,t));let l=tt(i,t);l&&(r=W(r,{[l.name]:l.type}));}}return {scope:r,returns:a}}function U(e,n,t){switch(e.type){case "ReturnStatement":{let s=e.argument,r=s?y(s,n,t):typeCore.s.unknown;return h(t,e,r,n),[r]}case "IfStatement":{let s=e;y(s.test,n,t);let r=ce(s.test,n,t.schemes),a=U(s.consequent,W(n,r.then),t);return s.alternate&&a.push(...U(s.alternate,W(n,r.else),t)),h(t,e,typeCore.s.unknown,n),a}case "BlockStatement":{let s=tn(e,n,t);return h(t,e,s,n),s.t==="unknown"?[]:[s]}case "ForStatement":case "WhileStatement":case "DoWhileStatement":{let s=e,r=n;s.init&&(s.init.type==="VariableDeclaration"?r=be(s.init,r,t):y(s.init,r,t)),s.test&&y(s.test,r,t),s.update&&y(s.update,r,t);let a=U(s.body,r,t);return h(t,e,typeCore.s.unknown,n),a}case "ForOfStatement":case "ForInStatement":{let s=e,r=y(s.right,n,t),a=e.type==="ForOfStatement"?r.t==="array"?r.items:typeCore.s.unknown:typeCore.s.string,o=kn(s.left),i=o?I(n,{[o]:a}):n,l=U(s.body,i,t);return h(t,e,typeCore.s.unknown,n),l}case "BreakStatement":case "ContinueStatement":return h(t,e,typeCore.s.unknown,n),[];case "ThrowStatement":{let s=e.argument;return s&&y(s,n,t),h(t,e,typeCore.s.unknown,n),[]}case "TryStatement":{let s=e,r=U(s.block,n,t);if(s.handler){let a=s.handler.param,o=a?$(a):null,i=o?I(n,{[o]:typeCore.s.unknown}):n;r.push(...U(s.handler.body,i,t));}return s.finalizer&&r.push(...U(s.finalizer,n,t)),h(t,e,typeCore.s.unknown,n),r}case "SwitchStatement":{let s=e;y(s.discriminant,n,t);let r=n,a=[];for(let o of s.cases){o.test&&y(o.test,r,t);let i=sn(o.consequent,r,t);r=i.scope,a.push(...i.returns);}return h(t,e,typeCore.s.unknown,n),a}default:return y(e,n,t),[]}}function Us(e,n,t){let s=typeCore.discover(e,[n],t.schemes);return s?s.type:typeCore.s.unknown}function $s(e,n){let t=typeCore.resolveTypeOp(typeCore.s.index(e,typeCore.s.literal(n)));return t.t==="index"?typeCore.s.unknown:t}function Ls(e,n){if(e.t!=="object")return e;let t={};for(let s in e.props)n.includes(s)||(t[s]=e.props[s]);return typeCore.s.object(t,e.index)}function Vs(e,n){return e.t==="tuple"?typeCore.s.tuple(e.elements.slice(n)):e.t==="array"?e:typeCore.s.array(typeCore.s.unknown)}function Q(e,n,t,s,r){switch(e.type){case "Identifier":{let a=en(e,s,r)??n;t[e.name]=a,r.overlay.set(e,{type:a,scope:s});return}case "AssignmentPattern":{let a=e,o=typeCore.widenType(y(a.right,s,r)),{type:i}=typeCore.withoutUndefined(n),l=i.t==="unknown"?o:typeCore.normalizeUnion([i,o]);Q(a.left,l,t,s,r);return}case "ObjectPattern":{let a=[];for(let o of e.properties){if(o.type==="RestElement"){Q(o.argument,Ls(n,a),t,s,r);continue}let i=o,l=ie(i);l!=null&&a.push(l);let u=l!=null?Us(n,l,r):typeCore.s.unknown;Q(i.value,u,t,s,r);}return}case "ArrayPattern":{e.elements.forEach((a,o)=>{if(!a)return;let i=a;i.type==="RestElement"?Q(i.argument,Vs(n,o),t,s,r):Q(i,$s(n,o),t,s,r);});return}}}function rn(e,n,t){let s=L(n,t.schemes),a=(s.t==="union"?s.of.map(o=>L(o,t.schemes)):[s]).filter(o=>o.t==="object"&&!o.index);if(a.length&&!a.some(o=>Object.keys(o.props).length===0))for(let o of e.properties){if(o.type==="SpreadElement")continue;let i=o;if(i.computed)continue;let l=ie(i);if(l===null)continue;let u=a.filter(c=>l in c.props);if(!u.length){t.sink.report(S.excessProperty(i.key,l,n));continue}i.value.type==="ObjectExpression"&&rn(i.value,u[0].props[l].type,t);}}function be(e,n,t){let s={};for(let r of e.declarations){let a=r.id,o=$(a),i=en(a,n,t);if(!r.init){if(o&&e.kind!=="const"){i?(s[o]=i,xn(o,i,t)):(s[o]=typeCore.s.undefined,t.evolving.add(o));continue}t.sink.report(S.constNeedsInit(r)),o&&(s[o]=i??typeCore.s.unknown);continue}let l=i??(r.init.type==="ArrowFunctionExpression"?vn(r.init):null),u=o&&l?I(n,{[o]:l}):n,c,p=null;i?(J(r.init,i,u,t),r.init.type==="ObjectExpression"&&rn(r.init,i,t),c=i,p=i,(i.t==="union"||i.t==="boolean")&&r.init.type==="Literal"&&(c=nt(i,z(r.init),t.schemes))):(c=y(r.init,u,t),e.kind!=="const"&&(c=typeCore.widenLiteral(c)),p=c),h(t,r,c,n),o?(s[o]=c,e.kind!=="const"&&p&&xn(o,p,t)):Q(a,c,s,n,t);}return h(t,e,typeCore.s.unknown,n),I(n,s)}function xn(e,n,t){(n.t==="union"||n.t==="boolean")&&t.declaredMut.set(e,n);}function xs(e,n,t){let s=y(e.left,n,t),r=y(e.right,n,t),a=e.operator;return a==="+"?typeCore.subtype(s,typeCore.s.string)||typeCore.subtype(r,typeCore.s.string)?typeCore.s.string:typeCore.s.number:Ks.has(a)?typeCore.s.number:typeCore.s.boolean}var Gn={string:typeCore.s.literal(""),number:typeCore.s.literal(0),boolean:typeCore.s.literal(false)},_e=e=>e.t==="null"||e.t==="undefined";function Gs(e,n,t){if(n.t==="any"||n.t==="unknown")return typeCore.normalizeUnion([n,t]);let s=n.t==="union"?[...n.of]:n.t==="boolean"?[typeCore.s.literal(true),typeCore.s.literal(false)]:[n];if(e==="??")return typeCore.normalizeUnion([...s.filter(a=>!_e(a)),t]);if(e==="||")return typeCore.normalizeUnion([...s.filter(a=>!_e(a)&&!(a.t==="literal"&&!a.value)),t]);let r=s.flatMap(a=>_e(a)?[a]:a.t==="literal"?a.value?[]:[a]:Gn[a.t]?[Gn[a.t]]:[]);return typeCore.normalizeUnion([...r,t])}var Ks=new Set(["-","*","/","%","**","&","|","^","<<",">>",">>>"]),Ws=typeCore.s.union(["string","number","bigint","boolean","symbol","undefined","object","function"].map(e=>typeCore.s.literal(e)));function Js(e,n,t){let s=y(e.argument,n,t);switch(e.operator){case "!":return s.t==="literal"?{t:"literal",value:!s.value,fresh:true}:typeCore.s.boolean;case "-":return s.t==="literal"&&typeof s.value=="number"?{t:"literal",value:-s.value,fresh:true}:typeCore.s.number;case "+":case "~":return typeCore.s.number;case "typeof":return Ws;case "delete":return typeCore.s.boolean;case "void":return typeCore.s.undefined;default:return typeCore.s.unknown}}function qs(e,n,t){let s={},r,a=[],o=[],i=false,l=false;for(let u of e.properties){let c=u;if(c.type==="SpreadElement"){let g=L(y(c.argument,n,t),t.schemes);if(g.t==="object"){for(let E in g.props)s[E]=g.props[E];g.index&&(r={key:g.index.key,type:g.index.value});}continue}let p=c,m=y(p.value,n,t),f=typeCore.widen(m);if(h(t,c,m,n),p.computed){let g=L(y(p.key,n,t),t.schemes);g.t==="literal"&&typeof g.value=="string"?(s[g.value]={type:f},a.push(f)):g.t==="literal"&&typeof g.value=="number"?(s[String(g.value)]={type:f},a.push(f),o.push(f)):g.t==="string"?(i=true,a.push(f)):g.t==="number"&&(l=true,a.push(f),o.push(f));continue}let N=ie(p);N!==null&&(s[N]={type:f},a.push(f),/^\d+$/.test(N)&&o.push(f));}return i?r={key:"string",type:typeCore.normalizeUnion(a)}:l&&(r={key:"number",type:typeCore.normalizeUnion(o)}),r?{t:"object",props:s,index:{key:r.key,value:r.type}}:{t:"object",props:s}}function rt(e,n,t){let s=[];for(let r of e.elements){if(!r)continue;let a=r;if(a.type==="SpreadElement"){let o=L(y(a.argument,n,t),t.schemes);o.t==="array"?s.push(o.items):o.t==="tuple"&&s.push(...o.elements);continue}s.push(typeCore.widen(y(a,n,t)));}return typeCore.s.array(s.length?typeCore.normalizeUnion(s):typeCore.s.unknown)}function an(e,n,t,s){let r=L(n,s.schemes),a=e.elements,o=a.every(l=>l&&l.type!=="SpreadElement"),i=(l,u)=>l.type==="ArrayExpression"?an(l,u,t,s):typeCore.widen(y(l,t,s));if(r.t==="tuple"&&o&&a.length===r.elements.length){let l=a.map((u,c)=>i(u,r.elements[c]));return h(s,e,{t:"tuple",elements:l},t)}if(r.t==="array"){let l=[];for(let u of a){if(!u)continue;let c=u;if(c.type==="SpreadElement"){y(c.argument,t,s);continue}l.push(i(c,r.items));}return h(s,e,typeCore.s.array(l.length?typeCore.normalizeUnion(l):typeCore.s.unknown),t)}return rt(e,t,s)}function Qe(e,n,t,s){if(e===null)return typeCore.s.null;switch(typeof e){case "string":return typeCore.s.string;case "number":return typeCore.s.number;case "boolean":return typeCore.s.boolean;case "object":break;default:return typeCore.s.unknown}if(Array.isArray(e)){let o=e.map(i=>Qe(i,n,t,s));return typeCore.s.array(o.length?typeCore.normalizeUnion(o):typeCore.s.unknown)}let r=e;if(core.AST_MARKER in r){let o;try{o=codec.fromJson(r);}catch{return t.sink.report(S.unsupported(s,`'#ast: ${String(r[core.AST_MARKER])}'`)),typeCore.s.unknown}return y(o,n,t)}let a={};for(let o of Object.keys(r))a[o]={type:Qe(r[o],n,t,s)};return {t:"object",props:a}}var _s=(e,n)=>({...e,typeAnnotation:n}),zs=(e,n)=>({...e,returnType:n}),Xs=(e,n)=>({type:"TSAsExpression",expression:e,typeAnnotation:n});function at(e,n){return e.get(n)?.type}function Qs(e,n){return e.get(n)?.scope}function Ys(e,n){let t=e.get(n)?.type;return t?typeCore.discover(t,[])?.completions??[]:[]}function Hs(e,n){let t=e.get(n)?.scope;return t?[...Ee(t)].map(([s,r])=>({key:s,type:r,optional:false})):[]}var Zs=e=>e.type==="ArrowFunctionExpression"||e.type==="FunctionExpression"||e.type==="FunctionDeclaration";function er(e){if(!e||e.computed)return;let n=e.key;if(n?.type==="Identifier")return n.name;if(n?.type==="Literal"&&typeof n.value=="string")return n.value}function ln(e,n,t,s={}){let r=e[n],a=e[n+1];if(!(!r||!a))switch(a.type){case "ArrowFunctionExpression":case "FunctionExpression":return a.body===r?a.returnType:void 0;case "VariableDeclarator":return a.init===r?a.id?.typeAnnotation:void 0;case "TSAsExpression":return a.typeAnnotation;case "ReturnStatement":return e.slice(n+1).find(Zs)?.returnType;case "CallExpression":case "NewExpression":{let o=(a.arguments??[]).indexOf(r);if(o<0)return;let i=at(t,a.callee);return i?.t==="fn"?i.params?.[o]?.type:void 0}case "Property":{if(a.value!==r||e[n+2]?.type!=="ObjectExpression")return;let i=ln(e,n+2,t,s),l=er(a);return !i||!l?void 0:typeCore.discover(i,[l],s)?.type}case "ArrayExpression":{let o=ln(e,n+1,t,s);return o?typeCore.discover(o,["[]"],s)?.type:void 0}default:return}}function nr(e,n){return e.filter(t=>t.node===n)}exports.FUNCTION_KINDS=yn;exports.annotate=_s;exports.annotateReturn=zs;exports.asExpression=Xs;exports.calleeAllowlist=Ce;exports.capabilityNodes=De;exports.check=qn;exports.childScope=I;exports.collectBindings=Rt;exports.collectMutations=Ve;exports.collectUnused=$e;exports.contextualTypeAt=ln;exports.createEnv=ct;exports.createSink=ne;exports.diag=S;exports.diagnosticsAt=nr;exports.extractModuleType=ds;exports.fromCapability=bt;exports.guard=Ae;exports.guardsFromCompiled=me;exports.lookup=C;exports.makeDiagnostic=v;exports.maxArgs=Ie;exports.maxCallNesting=Re;exports.maxDepth=Pe;exports.maxFunctionNesting=Te;exports.maxNestingOf=fe;exports.maxNodes=Fe;exports.memberCompletions=Ys;exports.memberDepth=Me;exports.resolveNamed=pt;exports.resolveScheme=dt;exports.resultType=Oe;exports.rootScope=dn;exports.scopeAt=Qs;exports.scopeCompletions=Hs;exports.typeAt=at;exports.visibleNames=Ee;Object.keys(typeCore).forEach(function(k){if(k!=='default'&&!Object.prototype.hasOwnProperty.call(exports,k))Object.defineProperty(exports,k,{enumerable:true,get:function(){return typeCore[k]}})});
|
package/dist/index.d.cts
CHANGED
|
@@ -80,7 +80,7 @@ declare const resolveNamed: (env: Env, name: string) => Schema | undefined;
|
|
|
80
80
|
declare const resolveScheme: (env: Env, name: string) => TypeScheme | undefined;
|
|
81
81
|
|
|
82
82
|
type Severity = "error" | "warning";
|
|
83
|
-
type DiagnosticCode = "not-assignable" | "unknown-name" | "not-callable" | "no-such-member" | "not-object" | "const-needs-init" | "cannot-redeclare" | "unknown-module" | "missing-argument" | "excess-argument" | "excess-property" | "spread-argument" | "props-mismatch" | "no-matching-overload" | "constraint-violation" | "unsupported" | "forbidden-member" | "cast-unsound" | "node-not-allowed" | "name-not-allowed" | "type-feature-not-allowed" | "any-not-allowed" | "too-deep" | "too-complex-union" | "too-large" | "wrong-result-type";
|
|
83
|
+
type DiagnosticCode = "not-assignable" | "unknown-name" | "not-callable" | "no-such-member" | "not-object" | "const-needs-init" | "cannot-redeclare" | "unknown-module" | "missing-argument" | "excess-argument" | "excess-property" | "spread-argument" | "props-mismatch" | "no-matching-overload" | "constraint-violation" | "wrong-type-argument-count" | "unsupported" | "forbidden-member" | "unused-name" | "assign-to-const" | "readonly-write" | "cast-unsound" | "node-not-allowed" | "name-not-allowed" | "type-feature-not-allowed" | "any-not-allowed" | "too-deep" | "too-complex-union" | "too-large" | "wrong-result-type";
|
|
84
84
|
/**
|
|
85
85
|
* A **classe** do diagnóstico — espelha a divisão de passes do `tsc` (que nós
|
|
86
86
|
* fundimos num walk só): `semantic` é o que o **binder** do tsc pega (validade do
|
|
@@ -127,7 +127,33 @@ declare const diag: {
|
|
|
127
127
|
noMatchingOverload: (node: BaseNode, type: Schema, argTypes: readonly Schema[]) => Diagnostic;
|
|
128
128
|
constraintViolation: (node: BaseNode, name: string, actual: Schema, bound: Schema) => Diagnostic;
|
|
129
129
|
unsupported: (node: BaseNode, what: string) => Diagnostic;
|
|
130
|
+
/**
|
|
131
|
+
* Argumento de tipo explícito com aridade errada. Assinatura **sem** type params
|
|
132
|
+
* declarados conta como `expected: 0` — é o que o tsc faz quando
|
|
133
|
+
* `Signature.typeParameters` é `undefined` (ele nunca infere a lista). Mensagem no
|
|
134
|
+
* texto do TS2558.
|
|
135
|
+
*/
|
|
136
|
+
wrongTypeArgumentCount: (node: BaseNode, expected: number, got: number) => Diagnostic;
|
|
130
137
|
forbiddenMember: (node: BaseNode, key: string) => Diagnostic;
|
|
138
|
+
/**
|
|
139
|
+
* Binding declarado e nunca lido. **Warning**, não erro: é higiene, não
|
|
140
|
+
* incompatibilidade — e o consumidor de editor o renderiza APAGADO (marker
|
|
141
|
+
* `Unnecessary`), não sublinhado. Mensagem no texto do TS6133.
|
|
142
|
+
*/
|
|
143
|
+
unusedName: (node: BaseNode, name: string) => Diagnostic;
|
|
144
|
+
/**
|
|
145
|
+
* Reatribuição de um binding IMUTÁVEL. Não é capability: a capability decide se
|
|
146
|
+
* `=` existe na Linguagem; se um `const` pode ser reatribuído é outra pergunta, e
|
|
147
|
+
* a resposta é sempre não (D9 — o piso é `const`). Mensagem no texto do TS2588 /
|
|
148
|
+
* TS2632 (import). Ver `mutation.ts`.
|
|
149
|
+
*/
|
|
150
|
+
assignToConst: (node: BaseNode, name: string, kind: "const" | "import") => Diagnostic;
|
|
151
|
+
/**
|
|
152
|
+
* Escrita num alvo `readonly` (`readonly T[]`). É a outra metade do modificador:
|
|
153
|
+
* a relação (TC29) diz quem pode ser ATRIBUÍDO a quem; isto diz quem pode ser
|
|
154
|
+
* ESCRITO. Sem os dois, `readonly` seria só decoração. Texto do TS2542.
|
|
155
|
+
*/
|
|
156
|
+
readonlyWrite: (node: BaseNode, target: Schema) => Diagnostic;
|
|
131
157
|
/**
|
|
132
158
|
* Cast (`x as T`) entre tipos que não se sobrepõem em nenhum sentido. Warning
|
|
133
159
|
* (não erro): o cast é um escape-hatch explícito — `unknown`/`any` passam
|
|
@@ -146,6 +172,37 @@ interface DiagnosticSink {
|
|
|
146
172
|
/** Cria um coletor vazio. */
|
|
147
173
|
declare function createSink(): DiagnosticSink;
|
|
148
174
|
|
|
175
|
+
/** Liga a análise de não-usados. Dois eixos independentes, como no tsc. */
|
|
176
|
+
interface UnusedOptions {
|
|
177
|
+
/** ≅ `noUnusedLocals`: `const` e `import` nunca lidos. */
|
|
178
|
+
readonly locals?: boolean;
|
|
179
|
+
/** ≅ `noUnusedParameters`: parâmetros de arrow nunca lidos. */
|
|
180
|
+
readonly parameters?: boolean;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Coleta os bindings declarados e nunca lidos, como diagnósticos `unused-name`
|
|
184
|
+
* (severidade **warning** — é aviso de higiene, não erro de tipo).
|
|
185
|
+
*
|
|
186
|
+
* **Fora de escopo, de propósito** (limitação declarada, nunca divergência —
|
|
187
|
+
* [[tslite-is-ts-subset]]):
|
|
188
|
+
*
|
|
189
|
+
* - **`type X = …` não-usado** (o TS6196 do tsc). Num TSLite, um alias de `.d.ts`
|
|
190
|
+
* é contrato ENTRE arquivos por construção — a gramática não tem `export type`
|
|
191
|
+
* (playground ARCHITECTURE §5), então "não usado neste arquivo" não significa
|
|
192
|
+
* não usado. Reportar daria falso-positivo em todo `.d.ts`.
|
|
193
|
+
* - **Write-only** (`let x = 1; x = 2` sem leitura — o `noUnusedLocals_writeOnly`
|
|
194
|
+
* do tsc). Aqui a atribuição conta como leitura, então reportamos MENOS.
|
|
195
|
+
* Mutação é capability gated (D9), então o caso é raro.
|
|
196
|
+
*
|
|
197
|
+
* **Diferença de MENSAGEM conhecida** (o comportamento bate; a apresentação não —
|
|
198
|
+
* mesmo precedente do D2/D18): o tsc agrupa (`All variables are unused` /
|
|
199
|
+
* `All destructured elements are unused`) quando TODOS os nomes de uma declaração
|
|
200
|
+
* caem. Aqui cada nome sai como um diagnóstico próprio, porque o consumidor é o
|
|
201
|
+
* editor: o fade precisa do range POR NOME, e um diagnóstico na lista inteira não
|
|
202
|
+
* apagaria os nomes individualmente.
|
|
203
|
+
*/
|
|
204
|
+
declare function collectUnused(root: BaseNode, opts: UnusedOptions): Diagnostic[];
|
|
205
|
+
|
|
149
206
|
/** O overlay de tipos: tipo + escopo de cada nó, por referência (ESTree não tem id). */
|
|
150
207
|
type TypeOverlay = WeakMap<BaseNode, {
|
|
151
208
|
readonly type: Schema;
|
|
@@ -156,6 +213,14 @@ interface CheckResult {
|
|
|
156
213
|
readonly type: Schema;
|
|
157
214
|
readonly overlay: TypeOverlay;
|
|
158
215
|
readonly diagnostics: readonly Diagnostic[];
|
|
216
|
+
/**
|
|
217
|
+
* Os tipos nomeados resolvíveis (`env.types` ∪ `env.schemes`), já unificados na
|
|
218
|
+
* forma de scheme. Publicado porque QUEM CONSULTA precisa dele: `discover`
|
|
219
|
+
* (completions, navegação de membro) só expande um `apply` se receber este
|
|
220
|
+
* catálogo. Sem publicar, cada consumidor re-derivaria a união — e derivações
|
|
221
|
+
* paralelas divergem.
|
|
222
|
+
*/
|
|
223
|
+
readonly schemes: Schemes;
|
|
159
224
|
}
|
|
160
225
|
/**
|
|
161
226
|
* Tipa `node` no ambiente `env` (a borda da DI: data, states, funções globais).
|
|
@@ -195,6 +260,12 @@ interface CheckOptions {
|
|
|
195
260
|
* `resultType`. Reporta `wrong-result-type`. (Ex.: uma condition deve ser `boolean`.)
|
|
196
261
|
*/
|
|
197
262
|
readonly resultType?: Schema;
|
|
263
|
+
/**
|
|
264
|
+
* Análise de bindings declarados e nunca lidos (`unused-name`, **warning**).
|
|
265
|
+
* Opt-in e com dois eixos independentes, como o `noUnusedLocals` /
|
|
266
|
+
* `noUnusedParameters` do tsc. Ver [`unused`](./unused.ts) para as isenções.
|
|
267
|
+
*/
|
|
268
|
+
readonly unused?: UnusedOptions;
|
|
198
269
|
}
|
|
199
270
|
declare function check(node: Node, env: Env, opts?: CheckOptions): CheckResult;
|
|
200
271
|
/**
|
|
@@ -269,6 +340,40 @@ declare function guardsFromCompiled(c: CompiledProfile): Profile;
|
|
|
269
340
|
*/
|
|
270
341
|
declare function fromCapability(profile: CapabilityProfile): Profile;
|
|
271
342
|
|
|
343
|
+
/**
|
|
344
|
+
* Diagnósticos de reatribuição de binding imutável (`const`, `import`).
|
|
345
|
+
*
|
|
346
|
+
* **Sempre roda** — não é opt-in nem gateado por capability, porque `const` é o
|
|
347
|
+
* piso da Linguagem (D9). Um profile que liga mutação libera `let`, não `const`.
|
|
348
|
+
*
|
|
349
|
+
* Roda **ANTES** do walk, e devolve também os alvos recusados: o walk pula a
|
|
350
|
+
* checagem de assignability neles, para não cascatear. É a ordem do tsc — *"to
|
|
351
|
+
* avoid cascading errors check assignability only if 'isReference' check succeeded
|
|
352
|
+
* and no errors were reported"* (`checker.ts:41076`). Sem isso `const c = 1; c = 2`
|
|
353
|
+
* reportaria DOIS erros, sendo que o segundo (`2 ⊄ 1`) é consequência do primeiro.
|
|
354
|
+
*/
|
|
355
|
+
declare function collectMutations(root: BaseNode): {
|
|
356
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
357
|
+
readonly invalidTargets: WeakSet<BaseNode>;
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
/** Referência → o `Identifier` que a DECLARA. Por referência, como o overlay. */
|
|
361
|
+
type BindingMap = WeakMap<BaseNode, BaseNode>;
|
|
362
|
+
/**
|
|
363
|
+
* Mapeia cada REFERÊNCIA ao `Identifier` que a declara.
|
|
364
|
+
*
|
|
365
|
+
* É a base de "ir para a definição" (e, no futuro, rename / find-references).
|
|
366
|
+
* **Não** é chamado pelo `check`: é consulta de editor, e o checker roda
|
|
367
|
+
* por-keystroke — quem quer, paga.
|
|
368
|
+
*
|
|
369
|
+
* **Limites** (ambos por ausência de posição, não por preguiça):
|
|
370
|
+
* - **membro** (`obj.price`) não resolve: exigiria a origem do tipo, e `Schema`
|
|
371
|
+
* não carrega posição;
|
|
372
|
+
* - **nome de tipo em ANOTAÇÃO** (`r: RawViaCep`) não resolve: a anotação é
|
|
373
|
+
* `Schema` apagável, não nó (E6). O nome de um `type X = …` resolve.
|
|
374
|
+
*/
|
|
375
|
+
declare function collectBindings(root: BaseNode): BindingMap;
|
|
376
|
+
|
|
272
377
|
/** Anota uma ligação/parâmetro: `x` → `x: T`. */
|
|
273
378
|
declare const annotate: <N extends BaseNode>(node: N, type: Schema) => N & {
|
|
274
379
|
typeAnnotation: Schema;
|
|
@@ -297,7 +402,24 @@ declare function memberCompletions(overlay: TypeOverlay, node: BaseNode): readon
|
|
|
297
402
|
* externo. Vazio se o nó não foi tipado.
|
|
298
403
|
*/
|
|
299
404
|
declare function scopeCompletions(overlay: TypeOverlay, node: BaseNode): readonly Completion[];
|
|
405
|
+
/**
|
|
406
|
+
* O tipo CONTEXTUAL de `ancestors[i]` — o que o nó em torno espera ali.
|
|
407
|
+
*
|
|
408
|
+
* É o `getContextualType` do tsc: **computado sob demanda** a partir da cadeia de
|
|
409
|
+
* ancestrais, não gravado no overlay. O overlay guarda o tipo RESULTANTE de cada
|
|
410
|
+
* nó; o contextual é outra pergunta ("o que caberia aqui?"), e a resposta vive nas
|
|
411
|
+
* anotações do pai — que o parser deixa no nó como `Schema` (`typeAnnotation`,
|
|
412
|
+
* `returnType`).
|
|
413
|
+
*
|
|
414
|
+
* Mora no checker (e não no editor) porque é **semântica**: resolve anotação,
|
|
415
|
+
* consulta o overlay e navega tipo nomeado. O editor faz posição→nó e pergunta.
|
|
416
|
+
*
|
|
417
|
+
* `ancestors` vem do mais interno para o mais externo (`ancestors[i+1]` é o pai de
|
|
418
|
+
* `ancestors[i]`). Devolve `undefined` quando o contexto não determina um tipo —
|
|
419
|
+
* e aí o consumidor não deve inventar.
|
|
420
|
+
*/
|
|
421
|
+
declare function contextualTypeAt(ancestors: readonly BaseNode[], i: number, overlay: TypeOverlay, schemes?: Schemes): Schema | undefined;
|
|
300
422
|
/** Os diagnósticos que apontam para `node`. */
|
|
301
423
|
declare function diagnosticsAt(diagnostics: readonly Diagnostic[], node: BaseNode): readonly Diagnostic[];
|
|
302
424
|
|
|
303
|
-
export { type CheckOptions, type CheckResult, type Diagnostic, type DiagnosticCode, type DiagnosticKind, type DiagnosticSink, type Env, FUNCTION_KINDS, type Guard, type GuardContext, type Profile, type Scope, type Severity, type TypeOverlay, annotate, annotateReturn, asExpression, calleeAllowlist, capabilityNodes, check, childScope, createEnv, createSink, diag, diagnosticsAt, extractModuleType, fromCapability, guard, guardsFromCompiled, lookup, makeDiagnostic, maxArgs, maxCallNesting, maxDepth, maxFunctionNesting, maxNestingOf, maxNodes, memberCompletions, memberDepth, resolveNamed, resolveScheme, resultType, rootScope, scopeAt, scopeCompletions, typeAt, visibleNames };
|
|
425
|
+
export { type BindingMap, type CheckOptions, type CheckResult, type Diagnostic, type DiagnosticCode, type DiagnosticKind, type DiagnosticSink, type Env, FUNCTION_KINDS, type Guard, type GuardContext, type Profile, type Scope, type Severity, type TypeOverlay, type UnusedOptions, annotate, annotateReturn, asExpression, calleeAllowlist, capabilityNodes, check, childScope, collectBindings, collectMutations, collectUnused, contextualTypeAt, createEnv, createSink, diag, diagnosticsAt, extractModuleType, fromCapability, guard, guardsFromCompiled, lookup, makeDiagnostic, maxArgs, maxCallNesting, maxDepth, maxFunctionNesting, maxNestingOf, maxNodes, memberCompletions, memberDepth, resolveNamed, resolveScheme, resultType, rootScope, scopeAt, scopeCompletions, typeAt, visibleNames };
|
package/dist/index.d.ts
CHANGED
|
@@ -80,7 +80,7 @@ declare const resolveNamed: (env: Env, name: string) => Schema | undefined;
|
|
|
80
80
|
declare const resolveScheme: (env: Env, name: string) => TypeScheme | undefined;
|
|
81
81
|
|
|
82
82
|
type Severity = "error" | "warning";
|
|
83
|
-
type DiagnosticCode = "not-assignable" | "unknown-name" | "not-callable" | "no-such-member" | "not-object" | "const-needs-init" | "cannot-redeclare" | "unknown-module" | "missing-argument" | "excess-argument" | "excess-property" | "spread-argument" | "props-mismatch" | "no-matching-overload" | "constraint-violation" | "unsupported" | "forbidden-member" | "cast-unsound" | "node-not-allowed" | "name-not-allowed" | "type-feature-not-allowed" | "any-not-allowed" | "too-deep" | "too-complex-union" | "too-large" | "wrong-result-type";
|
|
83
|
+
type DiagnosticCode = "not-assignable" | "unknown-name" | "not-callable" | "no-such-member" | "not-object" | "const-needs-init" | "cannot-redeclare" | "unknown-module" | "missing-argument" | "excess-argument" | "excess-property" | "spread-argument" | "props-mismatch" | "no-matching-overload" | "constraint-violation" | "wrong-type-argument-count" | "unsupported" | "forbidden-member" | "unused-name" | "assign-to-const" | "readonly-write" | "cast-unsound" | "node-not-allowed" | "name-not-allowed" | "type-feature-not-allowed" | "any-not-allowed" | "too-deep" | "too-complex-union" | "too-large" | "wrong-result-type";
|
|
84
84
|
/**
|
|
85
85
|
* A **classe** do diagnóstico — espelha a divisão de passes do `tsc` (que nós
|
|
86
86
|
* fundimos num walk só): `semantic` é o que o **binder** do tsc pega (validade do
|
|
@@ -127,7 +127,33 @@ declare const diag: {
|
|
|
127
127
|
noMatchingOverload: (node: BaseNode, type: Schema, argTypes: readonly Schema[]) => Diagnostic;
|
|
128
128
|
constraintViolation: (node: BaseNode, name: string, actual: Schema, bound: Schema) => Diagnostic;
|
|
129
129
|
unsupported: (node: BaseNode, what: string) => Diagnostic;
|
|
130
|
+
/**
|
|
131
|
+
* Argumento de tipo explícito com aridade errada. Assinatura **sem** type params
|
|
132
|
+
* declarados conta como `expected: 0` — é o que o tsc faz quando
|
|
133
|
+
* `Signature.typeParameters` é `undefined` (ele nunca infere a lista). Mensagem no
|
|
134
|
+
* texto do TS2558.
|
|
135
|
+
*/
|
|
136
|
+
wrongTypeArgumentCount: (node: BaseNode, expected: number, got: number) => Diagnostic;
|
|
130
137
|
forbiddenMember: (node: BaseNode, key: string) => Diagnostic;
|
|
138
|
+
/**
|
|
139
|
+
* Binding declarado e nunca lido. **Warning**, não erro: é higiene, não
|
|
140
|
+
* incompatibilidade — e o consumidor de editor o renderiza APAGADO (marker
|
|
141
|
+
* `Unnecessary`), não sublinhado. Mensagem no texto do TS6133.
|
|
142
|
+
*/
|
|
143
|
+
unusedName: (node: BaseNode, name: string) => Diagnostic;
|
|
144
|
+
/**
|
|
145
|
+
* Reatribuição de um binding IMUTÁVEL. Não é capability: a capability decide se
|
|
146
|
+
* `=` existe na Linguagem; se um `const` pode ser reatribuído é outra pergunta, e
|
|
147
|
+
* a resposta é sempre não (D9 — o piso é `const`). Mensagem no texto do TS2588 /
|
|
148
|
+
* TS2632 (import). Ver `mutation.ts`.
|
|
149
|
+
*/
|
|
150
|
+
assignToConst: (node: BaseNode, name: string, kind: "const" | "import") => Diagnostic;
|
|
151
|
+
/**
|
|
152
|
+
* Escrita num alvo `readonly` (`readonly T[]`). É a outra metade do modificador:
|
|
153
|
+
* a relação (TC29) diz quem pode ser ATRIBUÍDO a quem; isto diz quem pode ser
|
|
154
|
+
* ESCRITO. Sem os dois, `readonly` seria só decoração. Texto do TS2542.
|
|
155
|
+
*/
|
|
156
|
+
readonlyWrite: (node: BaseNode, target: Schema) => Diagnostic;
|
|
131
157
|
/**
|
|
132
158
|
* Cast (`x as T`) entre tipos que não se sobrepõem em nenhum sentido. Warning
|
|
133
159
|
* (não erro): o cast é um escape-hatch explícito — `unknown`/`any` passam
|
|
@@ -146,6 +172,37 @@ interface DiagnosticSink {
|
|
|
146
172
|
/** Cria um coletor vazio. */
|
|
147
173
|
declare function createSink(): DiagnosticSink;
|
|
148
174
|
|
|
175
|
+
/** Liga a análise de não-usados. Dois eixos independentes, como no tsc. */
|
|
176
|
+
interface UnusedOptions {
|
|
177
|
+
/** ≅ `noUnusedLocals`: `const` e `import` nunca lidos. */
|
|
178
|
+
readonly locals?: boolean;
|
|
179
|
+
/** ≅ `noUnusedParameters`: parâmetros de arrow nunca lidos. */
|
|
180
|
+
readonly parameters?: boolean;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Coleta os bindings declarados e nunca lidos, como diagnósticos `unused-name`
|
|
184
|
+
* (severidade **warning** — é aviso de higiene, não erro de tipo).
|
|
185
|
+
*
|
|
186
|
+
* **Fora de escopo, de propósito** (limitação declarada, nunca divergência —
|
|
187
|
+
* [[tslite-is-ts-subset]]):
|
|
188
|
+
*
|
|
189
|
+
* - **`type X = …` não-usado** (o TS6196 do tsc). Num TSLite, um alias de `.d.ts`
|
|
190
|
+
* é contrato ENTRE arquivos por construção — a gramática não tem `export type`
|
|
191
|
+
* (playground ARCHITECTURE §5), então "não usado neste arquivo" não significa
|
|
192
|
+
* não usado. Reportar daria falso-positivo em todo `.d.ts`.
|
|
193
|
+
* - **Write-only** (`let x = 1; x = 2` sem leitura — o `noUnusedLocals_writeOnly`
|
|
194
|
+
* do tsc). Aqui a atribuição conta como leitura, então reportamos MENOS.
|
|
195
|
+
* Mutação é capability gated (D9), então o caso é raro.
|
|
196
|
+
*
|
|
197
|
+
* **Diferença de MENSAGEM conhecida** (o comportamento bate; a apresentação não —
|
|
198
|
+
* mesmo precedente do D2/D18): o tsc agrupa (`All variables are unused` /
|
|
199
|
+
* `All destructured elements are unused`) quando TODOS os nomes de uma declaração
|
|
200
|
+
* caem. Aqui cada nome sai como um diagnóstico próprio, porque o consumidor é o
|
|
201
|
+
* editor: o fade precisa do range POR NOME, e um diagnóstico na lista inteira não
|
|
202
|
+
* apagaria os nomes individualmente.
|
|
203
|
+
*/
|
|
204
|
+
declare function collectUnused(root: BaseNode, opts: UnusedOptions): Diagnostic[];
|
|
205
|
+
|
|
149
206
|
/** O overlay de tipos: tipo + escopo de cada nó, por referência (ESTree não tem id). */
|
|
150
207
|
type TypeOverlay = WeakMap<BaseNode, {
|
|
151
208
|
readonly type: Schema;
|
|
@@ -156,6 +213,14 @@ interface CheckResult {
|
|
|
156
213
|
readonly type: Schema;
|
|
157
214
|
readonly overlay: TypeOverlay;
|
|
158
215
|
readonly diagnostics: readonly Diagnostic[];
|
|
216
|
+
/**
|
|
217
|
+
* Os tipos nomeados resolvíveis (`env.types` ∪ `env.schemes`), já unificados na
|
|
218
|
+
* forma de scheme. Publicado porque QUEM CONSULTA precisa dele: `discover`
|
|
219
|
+
* (completions, navegação de membro) só expande um `apply` se receber este
|
|
220
|
+
* catálogo. Sem publicar, cada consumidor re-derivaria a união — e derivações
|
|
221
|
+
* paralelas divergem.
|
|
222
|
+
*/
|
|
223
|
+
readonly schemes: Schemes;
|
|
159
224
|
}
|
|
160
225
|
/**
|
|
161
226
|
* Tipa `node` no ambiente `env` (a borda da DI: data, states, funções globais).
|
|
@@ -195,6 +260,12 @@ interface CheckOptions {
|
|
|
195
260
|
* `resultType`. Reporta `wrong-result-type`. (Ex.: uma condition deve ser `boolean`.)
|
|
196
261
|
*/
|
|
197
262
|
readonly resultType?: Schema;
|
|
263
|
+
/**
|
|
264
|
+
* Análise de bindings declarados e nunca lidos (`unused-name`, **warning**).
|
|
265
|
+
* Opt-in e com dois eixos independentes, como o `noUnusedLocals` /
|
|
266
|
+
* `noUnusedParameters` do tsc. Ver [`unused`](./unused.ts) para as isenções.
|
|
267
|
+
*/
|
|
268
|
+
readonly unused?: UnusedOptions;
|
|
198
269
|
}
|
|
199
270
|
declare function check(node: Node, env: Env, opts?: CheckOptions): CheckResult;
|
|
200
271
|
/**
|
|
@@ -269,6 +340,40 @@ declare function guardsFromCompiled(c: CompiledProfile): Profile;
|
|
|
269
340
|
*/
|
|
270
341
|
declare function fromCapability(profile: CapabilityProfile): Profile;
|
|
271
342
|
|
|
343
|
+
/**
|
|
344
|
+
* Diagnósticos de reatribuição de binding imutável (`const`, `import`).
|
|
345
|
+
*
|
|
346
|
+
* **Sempre roda** — não é opt-in nem gateado por capability, porque `const` é o
|
|
347
|
+
* piso da Linguagem (D9). Um profile que liga mutação libera `let`, não `const`.
|
|
348
|
+
*
|
|
349
|
+
* Roda **ANTES** do walk, e devolve também os alvos recusados: o walk pula a
|
|
350
|
+
* checagem de assignability neles, para não cascatear. É a ordem do tsc — *"to
|
|
351
|
+
* avoid cascading errors check assignability only if 'isReference' check succeeded
|
|
352
|
+
* and no errors were reported"* (`checker.ts:41076`). Sem isso `const c = 1; c = 2`
|
|
353
|
+
* reportaria DOIS erros, sendo que o segundo (`2 ⊄ 1`) é consequência do primeiro.
|
|
354
|
+
*/
|
|
355
|
+
declare function collectMutations(root: BaseNode): {
|
|
356
|
+
readonly diagnostics: readonly Diagnostic[];
|
|
357
|
+
readonly invalidTargets: WeakSet<BaseNode>;
|
|
358
|
+
};
|
|
359
|
+
|
|
360
|
+
/** Referência → o `Identifier` que a DECLARA. Por referência, como o overlay. */
|
|
361
|
+
type BindingMap = WeakMap<BaseNode, BaseNode>;
|
|
362
|
+
/**
|
|
363
|
+
* Mapeia cada REFERÊNCIA ao `Identifier` que a declara.
|
|
364
|
+
*
|
|
365
|
+
* É a base de "ir para a definição" (e, no futuro, rename / find-references).
|
|
366
|
+
* **Não** é chamado pelo `check`: é consulta de editor, e o checker roda
|
|
367
|
+
* por-keystroke — quem quer, paga.
|
|
368
|
+
*
|
|
369
|
+
* **Limites** (ambos por ausência de posição, não por preguiça):
|
|
370
|
+
* - **membro** (`obj.price`) não resolve: exigiria a origem do tipo, e `Schema`
|
|
371
|
+
* não carrega posição;
|
|
372
|
+
* - **nome de tipo em ANOTAÇÃO** (`r: RawViaCep`) não resolve: a anotação é
|
|
373
|
+
* `Schema` apagável, não nó (E6). O nome de um `type X = …` resolve.
|
|
374
|
+
*/
|
|
375
|
+
declare function collectBindings(root: BaseNode): BindingMap;
|
|
376
|
+
|
|
272
377
|
/** Anota uma ligação/parâmetro: `x` → `x: T`. */
|
|
273
378
|
declare const annotate: <N extends BaseNode>(node: N, type: Schema) => N & {
|
|
274
379
|
typeAnnotation: Schema;
|
|
@@ -297,7 +402,24 @@ declare function memberCompletions(overlay: TypeOverlay, node: BaseNode): readon
|
|
|
297
402
|
* externo. Vazio se o nó não foi tipado.
|
|
298
403
|
*/
|
|
299
404
|
declare function scopeCompletions(overlay: TypeOverlay, node: BaseNode): readonly Completion[];
|
|
405
|
+
/**
|
|
406
|
+
* O tipo CONTEXTUAL de `ancestors[i]` — o que o nó em torno espera ali.
|
|
407
|
+
*
|
|
408
|
+
* É o `getContextualType` do tsc: **computado sob demanda** a partir da cadeia de
|
|
409
|
+
* ancestrais, não gravado no overlay. O overlay guarda o tipo RESULTANTE de cada
|
|
410
|
+
* nó; o contextual é outra pergunta ("o que caberia aqui?"), e a resposta vive nas
|
|
411
|
+
* anotações do pai — que o parser deixa no nó como `Schema` (`typeAnnotation`,
|
|
412
|
+
* `returnType`).
|
|
413
|
+
*
|
|
414
|
+
* Mora no checker (e não no editor) porque é **semântica**: resolve anotação,
|
|
415
|
+
* consulta o overlay e navega tipo nomeado. O editor faz posição→nó e pergunta.
|
|
416
|
+
*
|
|
417
|
+
* `ancestors` vem do mais interno para o mais externo (`ancestors[i+1]` é o pai de
|
|
418
|
+
* `ancestors[i]`). Devolve `undefined` quando o contexto não determina um tipo —
|
|
419
|
+
* e aí o consumidor não deve inventar.
|
|
420
|
+
*/
|
|
421
|
+
declare function contextualTypeAt(ancestors: readonly BaseNode[], i: number, overlay: TypeOverlay, schemes?: Schemes): Schema | undefined;
|
|
300
422
|
/** Os diagnósticos que apontam para `node`. */
|
|
301
423
|
declare function diagnosticsAt(diagnostics: readonly Diagnostic[], node: BaseNode): readonly Diagnostic[];
|
|
302
424
|
|
|
303
|
-
export { type CheckOptions, type CheckResult, type Diagnostic, type DiagnosticCode, type DiagnosticKind, type DiagnosticSink, type Env, FUNCTION_KINDS, type Guard, type GuardContext, type Profile, type Scope, type Severity, type TypeOverlay, annotate, annotateReturn, asExpression, calleeAllowlist, capabilityNodes, check, childScope, createEnv, createSink, diag, diagnosticsAt, extractModuleType, fromCapability, guard, guardsFromCompiled, lookup, makeDiagnostic, maxArgs, maxCallNesting, maxDepth, maxFunctionNesting, maxNestingOf, maxNodes, memberCompletions, memberDepth, resolveNamed, resolveScheme, resultType, rootScope, scopeAt, scopeCompletions, typeAt, visibleNames };
|
|
425
|
+
export { type BindingMap, type CheckOptions, type CheckResult, type Diagnostic, type DiagnosticCode, type DiagnosticKind, type DiagnosticSink, type Env, FUNCTION_KINDS, type Guard, type GuardContext, type Profile, type Scope, type Severity, type TypeOverlay, type UnusedOptions, annotate, annotateReturn, asExpression, calleeAllowlist, capabilityNodes, check, childScope, collectBindings, collectMutations, collectUnused, contextualTypeAt, createEnv, createSink, diag, diagnosticsAt, extractModuleType, fromCapability, guard, guardsFromCompiled, lookup, makeDiagnostic, maxArgs, maxCallNesting, maxDepth, maxFunctionNesting, maxNestingOf, maxNodes, memberCompletions, memberDepth, resolveNamed, resolveScheme, resultType, rootScope, scopeAt, scopeCompletions, typeAt, visibleNames };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {s,format,typeDiff,formatTypeDiff,subtype,configureTypeLimits,TypeEvalLimitError,UnionTooComplexError,resetTypeLimits,discover,normalizeUnion,resolveTypeOp,isScheme,expand1,instantiateLoose,widenType,substitute,widenInferred,groundVars,withoutUndefined,widen,unify,ownProp,equals,typeFeatures}from'@tslite/type-core';export*from'@tslite/type-core';import {rootScope,childScope,lookup,visibleNames,walk,desugarJSX,AST_MARKER,childrenOf}from'@tslite/core';import {compileProfile,nodeViolation,typeFeatureViolations}from'@tslite/capability';import {fromJson}from'@tslite/codec';var $e=(e={})=>rootScope(e),T=(e,n)=>childScope(e,n),v=(e,n)=>lookup(e,n),pe=e=>visibleNames(e),wn=(e={},n={},t={},r={},s=new Set,a=new Set,o={})=>({scope:$e(e),types:n,schemes:t,accessors:r,asserters:s,matchers:a,modules:o}),En=(e,n)=>e.types[n],vn=(e,n)=>e.schemes[n];var Le={"unknown-name":"semantic","const-needs-init":"semantic","cannot-redeclare":"semantic","unknown-module":"semantic",unsupported:"semantic","forbidden-member":"semantic","not-assignable":"type","not-callable":"type","no-such-member":"type","not-object":"type","missing-argument":"type","excess-argument":"type","excess-property":"type","spread-argument":"type","props-mismatch":"type","no-matching-overload":"type","constraint-violation":"type","cast-unsound":"type","too-deep":"type","too-complex-union":"type","node-not-allowed":"capability","name-not-allowed":"capability","type-feature-not-allowed":"capability","any-not-allowed":"capability","too-large":"capability","wrong-result-type":"capability"},k=(e,n,t)=>({code:e,kind:Le[e],severity:"error",node:n,message:t}),B=(e,n,t,r="error")=>({code:e,kind:Le[e],severity:r,node:n,message:t}),S={notAssignable:(e,n,t,r={})=>{let s=typeDiff(n,t,r).filter(o=>o.path.length>0),a=s.length?` ${formatTypeDiff(s)}.`:"";return k("not-assignable",e,`Type '${format(n)}' is not assignable to type '${format(t)}'.${a}`)},unknownName:(e,n)=>k("unknown-name",e,`Cannot find name '${n}'.`),notCallable:(e,n)=>k("not-callable",e,`Type '${format(n)}' is not callable.`),noSuchMember:(e,n,t)=>k("no-such-member",e,`Property '${t}' does not exist on type '${format(n)}'.`),notObject:(e,n)=>k("not-object",e,`Type '${format(n)}' has no members to access.`),constNeedsInit:e=>k("const-needs-init",e,"'const' declarations must be initialized."),missingArgument:(e,n,t)=>k("missing-argument",e,`Missing argument '${n}' of type '${format(t)}'.`),unknownModule:(e,n)=>k("unknown-module",e,`Cannot find module '${n}' or its corresponding type declarations.`),cannotRedeclare:(e,n)=>k("cannot-redeclare",e,`Cannot redeclare block-scoped variable '${n}'.`),excessArgument:(e,n,t)=>k("excess-argument",e,`Expected ${n} argument${n===1?"":"s"}, but got ${t}.`),excessProperty:(e,n,t)=>k("excess-property",e,`Object literal may only specify known properties, and '${n}' does not exist in type '${format(t)}'.`),spreadArgument:e=>k("spread-argument",e,"A spread argument must either have a tuple type or be passed to a rest parameter."),propsMismatch:(e,n,t)=>k("props-mismatch",e,`Payload is not compatible with the component props '${format(n)}': ${t}.`),noMatchingOverload:(e,n,t)=>k("no-matching-overload",e,`No overload of '${format(n)}' matches the arguments (${t.map(r=>format(r)).join(", ")}).`),constraintViolation:(e,n,t,r)=>k("constraint-violation",e,`Type '${format(t)}' does not satisfy the constraint '${n} extends ${format(r)}'.`),unsupported:(e,n)=>k("unsupported",e,`${n} is not supported in this language.`),forbiddenMember:(e,n)=>k("forbidden-member",e,`'${n}' is not a member of the language \u2014 the JS runtime substrate (identity/inheritance) is not vocabulary here (FP / portable IR). Use a factory/operator via DI.`),castUnsound:(e,n,t)=>B("cast-unsound",e,`Conversion of type '${format(n)}' to type '${format(t)}' may be a mistake \u2014 neither sufficiently overlaps the other. Cast through 'unknown' first if intentional.`,"warning")};function Z(){let e=[];return {all:e,report(n){e.push(n);},hasErrors(){return e.some(n=>n.severity==="error")}}}function ce(e,n,t={}){return n.flatMap(r=>r(e,t))}function U(e,n){let t=r=>{n(r);for(let s of childrenOf(r))t(s);};t(e);}var Pn=e=>Array.isArray(e)?e:[e],Ve=["ArrowFunctionExpression","FunctionExpression","FunctionDeclaration"];function me(e,n="error"){return t=>{let r=[];return U(t,s=>{let a=nodeViolation(s,e);a&&r.push(B("node-not-allowed",s,`'${a}' is not allowed by the capability profile.`,n));}),r}}function Ue(e,n="error"){let t=e.typeTier;return r=>{if(t==="author")return [];let s=[];return U(r,a=>{let o=a,i=o.type==="TSTypeAliasDeclaration"?o.id?.name:void 0;for(let l of [o.typeAnnotation,o.returnType]){if(!l)continue;let p=typeFeatureViolations(typeFeatures(l,i),t);p.length&&s.push(B("type-feature-not-allowed",a,`authoring type feature${p.length>1?"s":""} '${p.join("', '")}' requires capability tier 'author'.`,n));}}),s}}function N(e,n=new WeakSet){if(!e||typeof e!="object"||n.has(e))return false;switch(n.add(e),e.t){case "any":return true;case "object":return Object.values(e.props).some(t=>N(t.type,n))||!!e.index&&N(e.index.value,n);case "array":return N(e.items,n);case "tuple":return e.elements.some(t=>N(t,n));case "union":case "intersection":return e.of.some(t=>N(t,n));case "fn":return e.params.some(t=>N(t.type,n))||N(e.returns,n);case "overload":return e.signatures.some(t=>t.params.some(r=>N(r.type,n))||N(t.returns,n));case "keyof":return N(e.of,n);case "index":return N(e.obj,n)||N(e.key,n);case "mapped":return N(e.over,n)||N(e.body,n);case "conditional":return N(e.check,n)||N(e.extends,n)||N(e.then,n)||N(e.else,n);case "returnType":case "parameters":return N(e.fn,n);case "apply":return e.args.some(t=>N(t,n));default:return false}}function qe(e,n="error"){return t=>{if(!e.typeStrict)return [];let r=[];return U(t,s=>{let a=s;for(let o of [a.typeAnnotation,a.returnType])if(o&&N(o)){r.push(B("any-not-allowed",s,"'any' is not allowed under 'strict' \u2014 use 'unknown' + validated narrowing (assert/parse).",n));break}}),r}}function ye(e,n="error"){let t=new Set(e);return r=>{let s=[];return U(r,a=>{if(a.type!=="CallExpression")return;let o=a.callee;if(o.type!=="Identifier")s.push(B("name-not-allowed",o,"Only direct calls to allowed functions are permitted.",n));else {let i=o.name;t.has(i)||s.push(B("name-not-allowed",o,`Function '${i}' is not allowed here.`,n));}}),s}}function ee(e,n,t={}){let r=new Set(Pn(e)),s=t.severity??"error",a=[...r].join("/");return o=>{let i=[],l=(p,c)=>{let m=r.has(p.type),h=m?c+1:c;m&&h>n&&i.push(B("too-deep",p,`Nesting of ${a} exceeds ${n}${t.hint?` \u2014 ${t.hint}`:""}.`,s));for(let y of childrenOf(p))l(y,h);};return l(o,0),i}}var fe=(e=3,n="error")=>ee(Ve,e,{hint:"use a pipe instead of nesting functions",severity:n}),de=(e,n="error")=>ee("CallExpression",e,{hint:"use a pipe instead of nesting calls",severity:n}),he=(e,n="error")=>ee("MemberExpression",e,{severity:n});function ge(e,n="error"){return t=>{let r=[],s=(a,o)=>{if(o>e){r.push(B("too-deep",a,`Expression nesting exceeds ${e}.`,n));return}for(let i of childrenOf(a))s(i,o+1);};return s(t,0),r}}function Se(e,n="error"){return t=>{let r=0;return U(t,()=>{r++;}),r>e?[B("too-large",t,`Expression has ${r} nodes (max ${e}).`,n)]:[]}}function be(e,n="error"){return t=>{let r=[];return U(t,s=>{if(s.type==="CallExpression"){let a=s.arguments;a&&a.length>e&&r.push(B("too-large",s,`Call has ${a.length} arguments (max ${e}).`,n));}}),r}}function Ne(e,n={},t="error"){return (r,s)=>{let a=s.overlay?.get(r)?.type;return a?subtype(a,e,n)?[]:[B("wrong-result-type",r,`Result type '${format(a)}' is not assignable to the required '${format(e)}'.`,t)]:[]}}function ne(e){let n=[me(e),Ue(e),qe(e)];return e.hostAllow!=="*"&&n.push(ye([...e.hostAllow])),n}function Fn(e){return ne(compileProfile(e))}var J=e=>e.typeAnnotation,ke=e=>e.returnType,F=e=>e.type==="Identifier"?e.name:null,Ke=e=>{if(e.type==="VariableDeclaration"){let n=e.declarations[0];return n?F(n.id):null}return F(e)},z=e=>{if(e.computed)return null;let n=e.key;return n.type==="Identifier"?n.name:n.type==="Literal"?String(n.value??""):null};function _e(e){let n=r=>r&&r.type==="Literal"&&typeof r.value=="string"?r.value:null;if(e.length===1&&e[0].type==="ArrayExpression"){let r=[];for(let s of e[0].elements){let a=n(s);if(a===null)return null;r.push(a);}return r}let t=[];for(let r of e){let s=n(r);if(s===null)return null;t.push(s);}return t.length?t:null}function Be(e){if(e.type==="Identifier")return e.name;if(e.type==="MemberExpression"){let n=e;if(n.computed||n.property.type!=="Identifier")return null;let t=Be(n.object);return t===null?null:`${t}.${n.property.name}`}return null}function we(e){let n=e;if(n.regex||n.bigint)return s.unknown;let t=n.value;return t===null?s.null:t===void 0?s.undefined:typeof t=="string"||typeof t=="number"||typeof t=="boolean"?{t:"literal",value:t,fresh:true}:s.unknown}var q=e=>{let n=e.value;return n===null?s.null:typeof n=="string"||typeof n=="number"||typeof n=="boolean"?s.literal(n):we(e)},Ee=e=>e.type==="ArrowFunctionExpression",We=e=>e.t==="apply"&&e.name==="Promise"&&e.args.length===1,se=e=>We(e)?e.args[0]:e,X=e=>We(e)?e:s.promise(e);function te(e){return e.t==="tuple"?true:e.t==="array"?te(e.items):e.t==="union"?e.of.some(te):false}function re(e){return e.t==="literal"?true:e.t==="union"?e.of.some(n=>re(n)):e.t==="var"?e.isConst===true||e.bound!==void 0&&re(e.bound):false}var j=(e,n)=>{let t=e;for(let r=0;r<50&&t.t==="apply";r++){let s=expand1(t,n);if(s===t||s.t==="apply"&&s.name===t.name)break;t=s;}return t};function Je(e){let n=ke(e);return n?{t:"fn",params:e.params.map((r,s$1)=>({name:F(r)??`arg${s$1}`,type:J(r)??s.unknown})),returns:e.async?X(n):n}:null}var M={then:{},else:{}},nn=new Set(["string","number","boolean","undefined","function","object"]),ze={string:s.string,number:s.number,boolean:s.boolean,undefined:s.undefined};function tn(e,n){switch(n){case "string":return e.t==="string"||e.t==="literal"&&typeof e.value=="string";case "number":return e.t==="number"||e.t==="literal"&&typeof e.value=="number";case "boolean":return e.t==="boolean"||e.t==="literal"&&typeof e.value=="boolean";case "undefined":return e.t==="undefined";case "function":return e.t==="fn"||e.t==="overload";case "object":return e.t==="object"||e.t==="array"||e.t==="tuple"||e.t==="null";default:return false}}var $n=s.literal(true),Ln=s.literal(false),x=e=>e.t==="union"?[...e.of]:e.t==="boolean"?[$n,Ln]:[e];function Xe(e,n){let t=e,r=n;return e.type==="UnaryExpression"&&t.operator==="typeof"&&t.argument.type==="Identifier"&&n.type==="Literal"&&typeof r.value=="string"?{name:t.argument.name,tag:r.value}:null}function Gn(e,n,t){if(e.t==="unknown"||e.t==="any")return n;let r=x(e).filter(s=>subtype(s,n,t));return r.length?normalizeUnion(r):n}function Vn(e,n,t){if(e.t==="unknown"||e.t==="any")return null;let r=x(e).filter(s=>!subtype(s,n,t));return r.length?normalizeUnion(r):null}function Un(e,n){if(!nn.has(n))return null;if(e.t==="unknown"||e.t==="any")return ze[n]??e;let t=x(e).filter(r=>tn(r,n));return t.length?normalizeUnion(t):ze[n]??e}function qn(e,n){if(!nn.has(n)||e.t==="unknown"||e.t==="any")return null;let t=x(e).filter(r=>!tn(r,n));return t.length?normalizeUnion(t):null}function Ye(e,n){if(e.type==="Identifier"&&n.type==="Literal"){let t=q(n);if(t.t==="literal"||t.t==="null")return {name:e.name,lit:t}}return null}function He(e,n){if(e.type==="MemberExpression"&&!e.computed&&!e.optional&&e.object.type==="Identifier"&&e.property.type==="Identifier"&&n.type==="Literal"){let t=q(n);if(t.t==="literal"||t.t==="null")return {name:e.object.name,prop:e.property.name,lit:t}}return null}function Qe(e,n,t,r,s){let a=x(e),o=l=>l.t==="object"?ownProp(l.props,n)?.type:void 0,i=a.filter(l=>{let p=o(l);return r?!!p&&subtype(t,p,s):!(p&&subtype(p,t,s))});return i.length&&i.length<a.length?normalizeUnion(i):null}function Ze(e,n,t){let r=x(e),s=o=>o.t==="object"&&(n in o.props||!!o.index),a=r.filter(o=>t?s(o):!s(o));return a.length&&a.length<r.length?normalizeUnion(a):null}function Kn(e,n,t){return e.t==="unknown"||e.t==="any"||subtype(n,e,t)?n:null}function _n(e,n,t){let r=x(e),s=r.filter(a=>!equals(a,n,t));return s.length&&s.length<r.length?normalizeUnion(s):null}var Wn=e=>e.t==="null"||e.t==="undefined",rn=e=>Wn(e)||e.t==="literal"&&!e.value,Jn=e=>{if(e.t==="unknown"||e.t==="any")return null;let n=x(e),t=n.filter(r=>!rn(r));return t.length&&t.length<n.length?normalizeUnion(t):null},zn=e=>{let n=x(e),t=n.filter(rn);return t.length&&t.length<n.length?normalizeUnion(t):null},en=e=>e.type==="Literal"&&e.value===null?"null":e.type==="Identifier"&&e.name==="undefined"?"undefined":null,O=(e,n,t)=>({then:n?{[e]:n}:{},else:t?{[e]:t}:{}}),Xn=e=>e==="==="||e==="=="||e==="!=="||e==="!=";function Q(e,n,t){if(e.type==="BinaryExpression"){let r=e;if(r.operator==="in"){let y=r.left,b=r.right;if(y.type==="Literal"&&typeof y.value=="string"&&b.type==="Identifier"){let g=b.name,E=v(n,g);if(!E)return M;let V=String(y.value);return O(g,Ze(E,V,true),Ze(E,V,false))}return M}if(!Xn(r.operator))return M;let s=r.operator==="!=="||r.operator==="!=",a=r.left,o=r.right,i=Xe(a,o)??Xe(o,a);if(i){let y=v(n,i.name);if(!y)return M;let b=Un(y,i.tag),g=qn(y,i.tag);return s?O(i.name,g,b):O(i.name,b,g)}let l=en(a),p=en(o),c=l?o:p?a:null;if((l||p)&&c?.type==="Identifier"){let y=c.name,b=v(n,y);if(!b)return M;let E=r.operator==="=="||r.operator==="!="?["null","undefined"]:[l??p],V=x(b),je=V.filter(le=>E.includes(le.t)),ie=V.filter(le=>!E.includes(le.t)),xe=je.length?normalizeUnion(je):null,Me=ie.length&&ie.length<V.length?normalizeUnion(ie):null;return s?O(y,Me,xe):O(y,xe,Me)}let m=Ye(a,o)??Ye(o,a);if(m){let y=v(n,m.name);if(!y)return M;let b=Kn(y,m.lit,t),g=_n(y,m.lit,t);return s?O(m.name,g,b):O(m.name,b,g)}let h=He(a,o)??He(o,a);if(h){let y=v(n,h.name);if(!y)return M;let b=Qe(y,h.prop,h.lit,true,t),g=Qe(y,h.prop,h.lit,false,t);return s?O(h.name,g,b):O(h.name,b,g)}return M}if(e.type==="UnaryExpression"&&e.operator==="!"){let r=Q(e.argument,n,t);return {then:r.else,else:r.then}}if(e.type==="CallExpression"){let r=Hn(e,n,t);if(r)return r}if(e.type==="Identifier"){let r=e.name,s=v(n,r);if(s)return O(r,Jn(s),zn(s))}return M}function Yn(e,n){if(e.t==="fn")return e.guard??null;if(e.t==="overload"){for(let t of e.signatures)if(t.guard&&t.params.length===n)return t.guard}return null}function Hn(e,n,t){let r=e.callee;if(r.type!=="Identifier")return null;let s=v(n,r.name);if(!s)return null;let a=Yn(s,e.arguments.length);if(!a)return null;let o=e.arguments[a.param];if(!o||o.type!=="Identifier")return null;let i=o.name,l=v(n,i);return l?O(i,Gn(l,a.type,t),Vn(l,a.type,t)):null}var _=(e,n)=>Object.keys(n).length?T(e,n):e;function Y(e){switch(e.type){case "ReturnStatement":case "ThrowStatement":return true;case "BlockStatement":{let n=e.body;return n.length>0&&Y(n[n.length-1])}case "IfStatement":{let n=e;return !!n.alternate&&Y(n.consequent)&&Y(n.alternate)}default:return false}}var yt=e=>{let n={};for(let t of Object.keys(e))n[t]={params:[],body:e[t]};return n};function ft(e){let n=[];return e.maxDepth!==void 0&&n.push(ge(e.maxDepth)),e.maxNodes!==void 0&&n.push(Se(e.maxNodes)),e.maxArgs!==void 0&&n.push(be(e.maxArgs)),e.maxFunctionNesting!==void 0&&n.push(fe(e.maxFunctionNesting)),e.maxCallNesting!==void 0&&n.push(de(e.maxCallNesting)),e.memberDepth!==void 0&&n.push(he(e.memberDepth)),n}function cn(e,n,t={}){let r={...yt(n.types),...n.schemes,...ht(e)},s$1={overlay:new WeakMap,sink:Z(),env:n,schemes:r,importNames:new Set},a=t.profile?compileProfile(t.profile):void 0;a&&configureTypeLimits(a.typeLimits);try{let o,i=gt(e,s$1);try{o=f(e,i,s$1);}catch(c){if(c instanceof TypeEvalLimitError)s$1.sink.report(B("too-deep",e,c.message));else if(c instanceof UnionTooComplexError)s$1.sink.report(B("too-complex-union",e,c.message));else throw c;o=s.unknown;}let l=[];a&&l.push(...ne(a)),t.limits&&l.push(...ft(t.limits)),t.resultType&&l.push(Ne(t.resultType,r));let p=l.length?[...s$1.sink.all,...ce(e,l,{overlay:s$1.overlay})]:s$1.sink.all;return {type:o,overlay:s$1.overlay,diagnostics:p}}finally{a&&resetTypeLimits();}}function dt(e,n,t={}){let r=cn(e,n,t),s$1={},a=new Map,o,i=p=>{let c=[];if(p.type==="VariableDeclaration")for(let m of p.declarations){let h=F(m.id),y=r.overlay.get(m);h&&y&&(s$1[h]=y.type,c.push(h));}else if(p.type==="FunctionDeclaration"){let m=p.id?.name,h=r.overlay.get(p);m&&h&&(s$1[m]=h.type,c.push(m));}return c};for(let p of e.body??[])if(p.type==="VariableDeclaration"||p.type==="FunctionDeclaration")i(p);else if(p.type==="ExportNamedDeclaration"){let c=p;if(c.declaration)for(let m of i(c.declaration))a.set(m,m);else for(let m of c.specifiers)a.set(m.exported.name,m.local.name);}else if(p.type==="ExportDefaultDeclaration"){let c=r.overlay.get(p.declaration);o=c?c.type:s.unknown;}let l={};if(a.size||o!==void 0){for(let[p,c]of a)s$1[c]&&(l[p]={type:s$1[c]});o!==void 0&&(l.default={type:o});}else for(let p in s$1)l[p]={type:s$1[p]};return {type:{t:"object",props:l},diagnostics:r.diagnostics}}var ht=e=>{let n={};return walk(e,{TSTypeAliasDeclaration(t){let r=t;r.id?.name&&r.typeAnnotation&&(n[r.id.name]={params:r.typeParameters??[],body:r.typeAnnotation});}}),n};function gt(e,n){let t=n.env.modules,r={};walk(e,{ImportDeclaration(s$1){let a=s$1,o=a.source.value,i=typeof o=="string"?t?.[o]:void 0;if(!i){n.sink.report(S.unknownModule(a.source,String(o)));for(let l of a.specifiers)r[l.local.name]=s.unknown;return}for(let l of a.specifiers){let p=l.local.name;if(p in r){n.sink.report(S.cannotRedeclare(l.local,p));continue}if(l.type==="ImportNamespaceSpecifier"){r[p]=i;continue}let c=l.type==="ImportSpecifier"?l.imported.name:"default",m=discover(i,[c],n.schemes);m?r[p]=m.type:(n.sink.report(S.noSuchMember(l,i,c)),r[p]=s.unknown);}}});for(let s in r)n.importNames.add(s);return Object.keys(r).length?T(n.env.scope,r):n.env.scope}var d=(e,n,t,r)=>(e.overlay.set(n,{type:t,scope:r}),t);function f(e,n,t,r){switch(e.type){case mn:return e.schema;case "JSXElement":case "JSXFragment":return d(t,e,f(desugarJSX(e,{emptyPropsAsObject:true}),n,t),n);case "Literal":return d(t,e,we(e),n);case "Identifier":{let s$1=e.name,a=v(n,s$1);return a===void 0?s$1==="undefined"?d(t,e,s.undefined,n):(t.sink.report(S.unknownName(e,s$1)),d(t,e,s.unknown,n)):d(t,e,a,n)}case "MemberExpression":return d(t,e,Nt(e,n,t),n);case "CallExpression":return d(t,e,Et(e,n,t,r),n);case "ArrowFunctionExpression":return Oe(e,n,t);case "FunctionDeclaration":return t.sink.report(S.unsupported(e,"function declaration (use 'const fn = () => \u2026')")),d(t,e,s.unknown,n);case "FunctionExpression":return t.sink.report(S.unsupported(e,"anonymous function (use an arrow)")),d(t,e,s.unknown,n);case "ThisExpression":return t.sink.report(S.unsupported(e,"'this'")),d(t,e,s.unknown,n);case "BlockStatement":return d(t,e,Pe(e,n,t),n);case "ReturnStatement":{let s$1=e.argument;return d(t,e,s$1?f(s$1,n,t):s.unknown,n)}case "IfStatement":return I(e,n,t),t.overlay.get(e)?.type??s.unknown;case "ForStatement":case "WhileStatement":case "DoWhileStatement":case "ForOfStatement":case "ForInStatement":case "BreakStatement":case "ContinueStatement":case "ThrowStatement":case "TryStatement":case "SwitchStatement":return I(e,n,t),t.overlay.get(e)?.type??s.unknown;case "AssignmentExpression":{let s=e;return f(s.left,n,t),d(t,e,f(s.right,n,t),n)}case "UpdateExpression":return f(e.argument,n,t),d(t,e,s.number,n);case "ExpressionStatement":return d(t,e,f(e.expression,n,t),n);case "VariableDeclaration":return ae(e,n,t),d(t,e,s.unknown,n);case "TSTypeAliasDeclaration":return d(t,e,s.unknown,n);case "BinaryExpression":return d(t,e,xt(e,n,t),n);case "LogicalExpression":{let s=e,a=f(s.left,n,t),o=f(s.right,n,t);return d(t,e,Mt(s.operator,a,o),n)}case "UnaryExpression":return d(t,e,Gt(e,n,t),n);case "ConditionalExpression":{let s=e;f(s.test,n,t);let a=Q(s.test,n,t.schemes),o=f(s.consequent,_(n,a.then),t),i=f(s.alternate,_(n,a.else),t);return d(t,e,normalizeUnion([o,i]),n)}case "ObjectExpression":return d(t,e,Vt(e,n,t),n);case "ArrayExpression":return d(t,e,gn(e,n,t),n);case "TemplateLiteral":{for(let s of e.expressions)f(s,n,t);return d(t,e,s.string,n)}case "AwaitExpression":{let s$1=e.argument,a=s$1?f(s$1,n,t):s.unknown;return d(t,e,se(a),n)}case "Program":return Ie(e.body,n,t,new Set(t.importNames)),d(t,e,s.unknown,n);case "JsonExpression":return d(t,e,Ce(e.body,n,t,e),n);case "ChainExpression":return d(t,e,normalizeUnion([f(e.expression,n,t),s.undefined]),n);case "TSAsExpression":{let s=e,a=f(s.expression,n,t),o=s.typeAnnotation;return !subtype(a,o,t.schemes)&&!subtype(o,a,t.schemes)&&t.sink.report(S.castUnsound(e,a,o)),d(t,e,o,n)}default:return t.sink.report(S.unsupported(e,`'${e.type}'`)),d(t,e,s.unknown,n)}}var St=new Set(["constructor","prototype","__proto__"]);function bt(e){if(!e.computed)return e.property.type==="Identifier"?e.property.name:null;let n=e.property;if(n.type==="Literal"){let t=n.value;if(typeof t=="string")return t}return null}function Nt(e,n,t){let r=f(e.object,n,t),s$1=bt(e);if(s$1!==null&&St.has(s$1))return t.sink.report(S.forbiddenMember(e,s$1)),s.unknown;if(e.computed){let i=f(e.property,n,t),l=resolveTypeOp(s.index(r,i));return l.t!=="index"?l:(i.t==="literal"&&typeof i.value=="string"&&an(e,r,i.value,t),s.unknown)}let a=e.property.name,o=discover(r,[a],t.schemes);return o?o.type:(an(e,r,a,t),s.unknown)}function an(e,n,t,r){let s=isScheme(n,r.schemes)?expand1(n,r.schemes):n;s.t==="object"||s.t==="array"||s.t==="tuple"||s.t==="union"?r.sink.report(S.noSuchMember(e,n,t)):s.t!=="any"&&s.t!=="unknown"&&r.sink.report(S.notObject(e,n));}function kt(e,n,t){if(!e||e.type!=="Identifier")return;let r=e.name;if(v(n,r)===void 0)return;let s=t.schemes[r];return s&&s.params.length===0?s.body:void 0}function Bt(e,n,t,r){let s$1=j(f(n[0],t,r),r.schemes),o=(s$1.t==="fn"?s$1:s$1.t==="overload"?s$1.signatures[0]:void 0)?.params[0]?.type,i=n.length>1?f(n[1],t,r):s.undefined;if(o){let l=typeDiff(i,o,r.schemes);l.length&&r.sink.report(S.propsMismatch(n[1]??e,o,formatTypeDiff(l)));}return d(r,e,s.boolean,t)}var mn="TSLiteSyntheticArg",wt=e=>({type:mn,schema:e});function yn(e,n,t){if(!e.some(a=>a.type==="SpreadElement"))return {nodes:[...e],spread:null};let r=[],s$1=null;for(let a of e){if(a.type!=="SpreadElement"){r.push(a);continue}let o=a.argument;if(o.type==="ArrayExpression"&&o.elements.every(l=>l&&l.type!=="SpreadElement")){for(let l of o.elements)r.push(l);continue}let i=j(f(o,n,t),t.schemes);if(i.t==="tuple")for(let l of i.elements)r.push(wt(l));else s$1={elem:i.t==="array"?i.items:s.unknown,node:a};}return {nodes:r,spread:s$1}}function Et(e,n,t,r){let s$1=e.arguments,a=Be(e.callee);if(a){let p=t.env.accessors?.[a];if(p){let c=_e(s$1);if(c){let m=discover(p,c,t.schemes);return m?m.type:(t.sink.report(S.noSuchMember(e,p,c.join("."))),s.unknown)}return s$1.forEach(m=>f(m,n,t)),s.unknown}}if(a&&t.env.asserters?.has(a)){let p=kt(s$1[0],n,t);for(let c=1;c<s$1.length;c++)f(s$1[c],n,t);return p??s.unknown}if(a&&t.env.matchers?.has(a))return Bt(e,s$1,n,t);let o=f(e.callee,n,t);if(o.t==="any")return s$1.forEach(p=>f(p,n,t)),s.any;if(o.t==="overload")return At(e,o,n,t,r);if(o.t!=="fn")return s$1.forEach(p=>f(p,n,t)),t.sink.report(S.notCallable(e,o)),s.unknown;let i=yn(s$1,n,t),l=i.nodes.map(p=>fn(p,n,t));return dn(e,o,i.nodes,l,n,t,i.spread,r)}function fn(e,n,t){if(Ee(e))return s.any;if(e.type!=="CallExpression")return f(e,n,t);let r=Z(),s$1=f(e,n,{...t,sink:r});return r.hasErrors()?s.any:(r.all.forEach(a=>t.sink.report(a)),s$1)}function dn(e,n,t,r,s$1,a,o=null,i){let l=m=>{if(!i)return m;let h=substitute(n.returns,m);if(h.t==="fn"&&i.t==="fn"){let y=m,b=Math.min(h.params.length,i.params.length);for(let g=0;g<b;g++)y=unify(h.params[g].type,i.params[g].type,y)??y;return unify(h.returns,i.returns,y)??y}return unify(h,i,m)??m},p=l(instantiateLoose(n,r).bindings);t.forEach((m,h)=>{if(Ee(m)){let y=widenType(substitute(n.params[h]?.type??s.any,p));r[h]=Oe(m,s$1,a,y);}else if(m.type==="CallExpression"&&r[h].t==="any")r[h]=f(m,s$1,a,substitute(n.params[h]?.type??s.unknown,p));else if(m.type==="Literal"){let y=n.params[h]?.type??s.unknown,b=y.t==="var"?y.bound?substitute(y.bound,p):y:substitute(y,p);re(b)&&(r[h]=d(a,m,q(m),s$1));}else if(m.type==="ArrayExpression"){let y=substitute(n.params[h]?.type??s.unknown,p);te(y)&&(r[h]=Sn(m,y,s$1,a));}});let c=l(instantiateLoose(n,r).bindings);return Dt(e,n,c,a),Ot(e,n,r,c,a,t,o),t.forEach((m,h)=>{let y=n.params[h];m.type==="ObjectExpression"&&y&&!y.variadic&&Fe(m,substitute(y.type,c),a);}),widenInferred(groundVars(substitute(n.returns,c),a.schemes))}var on=new WeakMap;function vt(e){let n=on.get(e);if(n)return n;let t=new Map,r=new WeakSet;for(let s of e.params)w(s.type,t,r);return w(e.returns,t,r),on.set(e,t),t}function w(e,n,t){switch(e.t){case "var":e.bound&&!n.has(e.name)&&n.set(e.name,e.bound);return;case "array":w(e.items,n,t);return;case "union":for(let r of e.of)w(r,n,t);return;case "object":if(t.has(e))return;t.add(e);for(let r in e.props)w(e.props[r].type,n,t);return;case "fn":if(t.has(e))return;t.add(e);for(let r of e.params)w(r.type,n,t);w(e.returns,n,t);return;case "overload":for(let r of e.signatures){for(let s of r.params)w(s.type,n,t);w(r.returns,n,t);}return;case "apply":for(let r of e.args)w(r,n,t);return;case "keyof":w(e.of,n,t);return;case "index":w(e.obj,n,t),w(e.key,n,t);return;case "mapped":w(e.over,n,t),w(e.body,n,t);return;default:return}}function Dt(e,n,t,r){let s=vt(n);if(s.size!==0)for(let[a,o]of s){let i=t[a];if(!i)continue;let l=substitute(o,t);subtype(i,l,r.schemes)||r.sink.report(S.constraintViolation(e,a,i,l));}}function At(e,n,t,r,s$1){let a=yn(e.arguments,t,r),o=a.nodes,i=o.map(c=>fn(c,t,r)),l=c=>a.spread?Ct(c,o.length):Tt(c,o.length),p=n.signatures.find(c=>l(c)&&Rt(c,i,r));if(!p){let c=n.signatures.filter(l);c.length===1?p=c[0]:n.signatures.length===1&&(p=n.signatures[0]);}return p?dn(e,p,o,i,t,r,a.spread,s$1):(r.sink.report(S.noMatchingOverload(e,n,i)),s.unknown)}function Ct(e,n){let t=0,r=false;for(let s of e.params)s.variadic?r=true:s.optional||t++;return n>=t&&(r||n<e.params.length)}function Tt(e,n){let t=0;for(let r of e.params){if(r.variadic)return n>=t;r.optional||t++;}return n>=t&&n<=e.params.length}function Rt(e,n,t){let{bindings:r}=instantiateLoose(e,n);for(let s=0;s<e.params.length;s++){let a=e.params[s];if(a.variadic)return true;if(s>=n.length){if(!a.optional)return false;continue}if(!subtype(n[s],substitute(a.type,r),t.schemes))return false}return true}function Ot(e,n,t,r,s$1,a=e.arguments??[],o=null){let i=p=>a[p]??e;for(let p=0;p<n.params.length;p++){let c=n.params[p];if(c.variadic)break;let m=substitute(c.type,r);if(p>=t.length){!c.optional&&!o&&s$1.sink.report(S.missingArgument(e,c.name,m));continue}subtype(t[p],m,s$1.schemes)||s$1.sink.report(S.notAssignable(i(p),t[p],m,s$1.schemes));}let l=n.params.find(p=>p.variadic);if(o){let p=t.length,c=n.params.filter(m=>!m.optional&&!m.variadic).length;if(!(p>=c&&(l||p<n.params.length))){s$1.sink.report(S.spreadArgument(o.node));return}if(l){let m=substitute(l.type,r),h=m.t==="array"?m.items:s.unknown;subtype(o.elem,h,s$1.schemes)||s$1.sink.report(S.notAssignable(o.node,o.elem,h,s$1.schemes));}return}!l&&t.length>n.params.length&&s$1.sink.report(S.excessArgument(i(n.params.length),n.params.length,t.length));}function L(e,n,t,r){let s=j(n,r.schemes);switch(e.type){case "Literal":{let o=q(e);return subtype(o,n,r.schemes)||r.sink.report(S.notAssignable(e,o,n,r.schemes)),d(r,e,n,t)}case "ArrayExpression":{if(s.t==="array"){for(let o of e.elements){if(!o)continue;let i=o;i.type==="SpreadElement"?L(i.argument,n,t,r):L(i,s.items,t,r);}return d(r,e,n,t)}break}case "ObjectExpression":{if(s.t==="object"){let o={};for(let l of e.properties){let p=l;if(p.type==="SpreadElement"){f(p.argument,t,r);continue}let c=p,m=z(c),h=m!==null?ownProp(s.props,m)?.type:void 0,y=h?L(c.value,h,t,r):f(c.value,t,r);m!==null&&(o[m]={type:y}),d(r,p,y,t);}let i={t:"object",props:o};return subtype(i,n,r.schemes)||r.sink.report(S.notAssignable(e,i,n,r.schemes)),d(r,e,n,t)}break}case "ArrowFunctionExpression":{if(s.t==="fn"){let o=Oe(e,t,r,s);return subtype(o,n,r.schemes)||r.sink.report(S.notAssignable(e,o,n,r.schemes)),d(r,e,n,t)}break}case "ConditionalExpression":{let o=e;return f(o.test,t,r),L(o.consequent,n,t,r),L(o.alternate,n,t,r),d(r,e,n,t)}}let a=f(e,t,r);return subtype(a,n,r.schemes)||r.sink.report(S.notAssignable(e,a,n,r.schemes)),d(r,e,a,t)}function Oe(e,n,t,r){let s$1=r&&r.t==="fn"?r:void 0,a={},o=e.params.map((h,y)=>{let b=h,g=F(b),E=J(b)??s$1?.params[y]?.type??s.unknown;return g?a[g]=E:b.type!=="Identifier"&&G(b,E,a,n,t),t.overlay.set(b,{type:E,scope:n}),{name:g??`arg${y}`,type:E}}),i=T(n,a),l=e.body,p=ke(e);if(l.type!=="BlockStatement"&&p){let h=e.async?se(p):p;L(l,h,i,t);let y=e.async?X(p):p;return d(t,e,{t:"fn",params:o,returns:y},n)}let c=l.type==="BlockStatement"?d(t,l,Pe(l,i,t,new Set(Object.keys(a))),i):f(l,i,t),m=e.async?X(c):c;if(p){let h=e.async?se(p):p,y=e.async?c:m;subtype(y,h,t.schemes)||t.sink.report(S.notAssignable(l,m,p,t.schemes));let b=e.async?X(p):p;return d(t,e,{t:"fn",params:o,returns:b},n)}return d(t,e,{t:"fn",params:o,returns:widenType(m)},n)}function W(e){switch(e.type){case "Identifier":return [e];case "ObjectPattern":return e.properties.flatMap(n=>n.type==="RestElement"?W(n.argument):W(n.value));case "ArrayPattern":return e.elements.flatMap(n=>n?n.type==="RestElement"?W(n.argument):W(n):[]);case "AssignmentPattern":return W(e.left);default:return []}}function hn(e){if(e.type==="VariableDeclaration")return e.declarations.flatMap(n=>W(n.id));if(e.type==="FunctionDeclaration"){let n=e.id;return n?[n]:[]}return e.type==="ExportNamedDeclaration"&&e.declaration?hn(e.declaration):[]}function Pe(e,n,t,r=new Set){let{returns:s$1}=Ie(e.body,n,t,r);return s$1.length?normalizeUnion(s$1):s.unknown}function Ie(e,n,t,r=new Set){let s=n,a=[];for(let o of e){let i=o;for(let l of hn(i))r.has(l.name)?t.sink.report(S.cannotRedeclare(l,l.name)):r.add(l.name);if(i.type==="VariableDeclaration")s=ae(i,s,t);else if(i.type!=="ImportDeclaration")if(i.type==="ExportNamedDeclaration"){let l=i;if(l.declaration?.type==="VariableDeclaration")s=ae(l.declaration,s,t);else if(l.declaration?.type==="FunctionDeclaration"){let p=f(l.declaration,s,t),c=F(l.declaration.id);c&&(s=T(s,{[c]:p}));}else for(let p of l.specifiers)v(s,p.local.name)===void 0&&t.sink.report(S.unknownName(p.local,p.local.name));}else if(i.type==="ExportDefaultDeclaration")f(i.declaration,s,t);else if(i.type==="FunctionDeclaration"){let l=f(i,s,t),p=F(i.id);p&&(s=T(s,{[p]:l}));}else if(i.type==="IfStatement"){a.push(...I(i,s,t));let l=i;!l.alternate&&Y(l.consequent)&&(s=_(s,Q(l.test,s,t.schemes).else));}else a.push(...I(i,s,t));}return {scope:s,returns:a}}function I(e,n,t){switch(e.type){case "ReturnStatement":{let r=e.argument,s$1=r?f(r,n,t):s.unknown;return d(t,e,s$1,n),[s$1]}case "IfStatement":{let r=e;f(r.test,n,t);let s$1=Q(r.test,n,t.schemes),a=I(r.consequent,_(n,s$1.then),t);return r.alternate&&a.push(...I(r.alternate,_(n,s$1.else),t)),d(t,e,s.unknown,n),a}case "BlockStatement":{let r=Pe(e,n,t);return d(t,e,r,n),r.t==="unknown"?[]:[r]}case "ForStatement":case "WhileStatement":case "DoWhileStatement":{let r=e,s$1=n;r.init&&(r.init.type==="VariableDeclaration"?s$1=ae(r.init,s$1,t):f(r.init,s$1,t)),r.test&&f(r.test,s$1,t),r.update&&f(r.update,s$1,t);let a=I(r.body,s$1,t);return d(t,e,s.unknown,n),a}case "ForOfStatement":case "ForInStatement":{let r=e,s$1=f(r.right,n,t),a=e.type==="ForOfStatement"?s$1.t==="array"?s$1.items:s.unknown:s.string,o=Ke(r.left),i=o?T(n,{[o]:a}):n,l=I(r.body,i,t);return d(t,e,s.unknown,n),l}case "BreakStatement":case "ContinueStatement":return d(t,e,s.unknown,n),[];case "ThrowStatement":{let r=e.argument;return r&&f(r,n,t),d(t,e,s.unknown,n),[]}case "TryStatement":{let r=e,s$1=I(r.block,n,t);if(r.handler){let a=r.handler.param,o=a?F(a):null,i=o?T(n,{[o]:s.unknown}):n;s$1.push(...I(r.handler.body,i,t));}return r.finalizer&&s$1.push(...I(r.finalizer,n,t)),d(t,e,s.unknown,n),s$1}case "SwitchStatement":{let r=e;f(r.discriminant,n,t);let s$1=n,a=[];for(let o of r.cases){o.test&&f(o.test,s$1,t);let i=Ie(o.consequent,s$1,t);s$1=i.scope,a.push(...i.returns);}return d(t,e,s.unknown,n),a}default:return f(e,n,t),[]}}function Pt(e,n,t){let r=discover(e,[n],t.schemes);return r?r.type:s.unknown}function It(e,n){let t=resolveTypeOp(s.index(e,s.literal(n)));return t.t==="index"?s.unknown:t}function Ft(e,n){if(e.t!=="object")return e;let t={};for(let r in e.props)n.includes(r)||(t[r]=e.props[r]);return s.object(t,e.index)}function jt(e,n){return e.t==="tuple"?s.tuple(e.elements.slice(n)):e.t==="array"?e:s.array(s.unknown)}function G(e,n,t,r,s$1){switch(e.type){case "Identifier":{let a=J(e)??n;t[e.name]=a,s$1.overlay.set(e,{type:a,scope:r});return}case "AssignmentPattern":{let a=e,o=widenType(f(a.right,r,s$1)),{type:i}=withoutUndefined(n),l=i.t==="unknown"?o:normalizeUnion([i,o]);G(a.left,l,t,r,s$1);return}case "ObjectPattern":{let a=[];for(let o of e.properties){if(o.type==="RestElement"){G(o.argument,Ft(n,a),t,r,s$1);continue}let i=o,l=z(i);l!=null&&a.push(l);let p=l!=null?Pt(n,l,s$1):s.unknown;G(i.value,p,t,r,s$1);}return}case "ArrayPattern":{e.elements.forEach((a,o)=>{if(!a)return;let i=a;i.type==="RestElement"?G(i.argument,jt(n,o),t,r,s$1):G(i,It(n,o),t,r,s$1);});return}}}function Fe(e,n,t){let r=j(n,t.schemes),a=(r.t==="union"?r.of.map(o=>j(o,t.schemes)):[r]).filter(o=>o.t==="object"&&!o.index);if(a.length&&!a.some(o=>Object.keys(o.props).length===0))for(let o of e.properties){if(o.type==="SpreadElement")continue;let i=o;if(i.computed)continue;let l=z(i);if(l===null)continue;let p=a.filter(c=>l in c.props);if(!p.length){t.sink.report(S.excessProperty(i.key,l,n));continue}i.value.type==="ObjectExpression"&&Fe(i.value,p[0].props[l].type,t);}}function ae(e,n,t){let r={};for(let s$1 of e.declarations){let a=s$1.id,o=F(a),i=J(a);if(!s$1.init){t.sink.report(S.constNeedsInit(s$1)),o&&(r[o]=i??s.unknown);continue}let l=i??(s$1.init.type==="ArrowFunctionExpression"?Je(s$1.init):null),p=o&&l?T(n,{[o]:l}):n,c;i?(L(s$1.init,i,p,t),s$1.init.type==="ObjectExpression"&&Fe(s$1.init,i,t),c=i):c=f(s$1.init,p,t),d(t,s$1,c,n),o?r[o]=c:G(a,c,r,n,t);}return d(t,e,s.unknown,n),T(n,r)}function xt(e,n,t){let r=f(e.left,n,t),s$1=f(e.right,n,t),a=e.operator;return a==="+"?subtype(r,s.string)||subtype(s$1,s.string)?s.string:s.number:$t.has(a)?s.number:s.boolean}var ln={string:s.literal(""),number:s.literal(0),boolean:s.literal(false)},De=e=>e.t==="null"||e.t==="undefined";function Mt(e,n,t){if(n.t==="any"||n.t==="unknown")return normalizeUnion([n,t]);let r=n.t==="union"?[...n.of]:n.t==="boolean"?[s.literal(true),s.literal(false)]:[n];if(e==="??")return normalizeUnion([...r.filter(a=>!De(a)),t]);if(e==="||")return normalizeUnion([...r.filter(a=>!De(a)&&!(a.t==="literal"&&!a.value)),t]);let s$1=r.flatMap(a=>De(a)?[a]:a.t==="literal"?a.value?[]:[a]:ln[a.t]?[ln[a.t]]:[]);return normalizeUnion([...s$1,t])}var $t=new Set(["-","*","/","%","**","&","|","^","<<",">>",">>>"]),Lt=s.union(["string","number","bigint","boolean","symbol","undefined","object","function"].map(e=>s.literal(e)));function Gt(e,n,t){let r=f(e.argument,n,t);switch(e.operator){case "!":return r.t==="literal"?{t:"literal",value:!r.value,fresh:true}:s.boolean;case "-":return r.t==="literal"&&typeof r.value=="number"?{t:"literal",value:-r.value,fresh:true}:s.number;case "+":case "~":return s.number;case "typeof":return Lt;case "delete":return s.boolean;case "void":return s.undefined;default:return s.unknown}}function Vt(e,n,t){let r={},s,a=[],o=[],i=false,l=false;for(let p of e.properties){let c=p;if(c.type==="SpreadElement"){let g=j(f(c.argument,n,t),t.schemes);if(g.t==="object"){for(let E in g.props)r[E]=g.props[E];g.index&&(s={key:g.index.key,type:g.index.value});}continue}let m=c,h=f(m.value,n,t),y=widen(h);if(d(t,c,h,n),m.computed){let g=j(f(m.key,n,t),t.schemes);g.t==="literal"&&typeof g.value=="string"?(r[g.value]={type:y},a.push(y)):g.t==="literal"&&typeof g.value=="number"?(r[String(g.value)]={type:y},a.push(y),o.push(y)):g.t==="string"?(i=true,a.push(y)):g.t==="number"&&(l=true,a.push(y),o.push(y));continue}let b=z(m);b!==null&&(r[b]={type:y},a.push(y),/^\d+$/.test(b)&&o.push(y));}return i?s={key:"string",type:normalizeUnion(a)}:l&&(s={key:"number",type:normalizeUnion(o)}),s?{t:"object",props:r,index:{key:s.key,value:s.type}}:{t:"object",props:r}}function gn(e,n,t){let r=[];for(let s of e.elements){if(!s)continue;let a=s;if(a.type==="SpreadElement"){let o=j(f(a.argument,n,t),t.schemes);o.t==="array"?r.push(o.items):o.t==="tuple"&&r.push(...o.elements);continue}r.push(widen(f(a,n,t)));}return s.array(r.length?normalizeUnion(r):s.unknown)}function Sn(e,n,t,r){let s$1=j(n,r.schemes),a=e.elements,o=a.every(l=>l&&l.type!=="SpreadElement"),i=(l,p)=>l.type==="ArrayExpression"?Sn(l,p,t,r):widen(f(l,t,r));if(s$1.t==="tuple"&&o&&a.length===s$1.elements.length){let l=a.map((p,c)=>i(p,s$1.elements[c]));return d(r,e,{t:"tuple",elements:l},t)}if(s$1.t==="array"){let l=[];for(let p of a){if(!p)continue;let c=p;if(c.type==="SpreadElement"){f(c.argument,t,r);continue}l.push(i(c,s$1.items));}return d(r,e,s.array(l.length?normalizeUnion(l):s.unknown),t)}return gn(e,t,r)}function Ce(e,n,t,r){if(e===null)return s.null;switch(typeof e){case "string":return s.string;case "number":return s.number;case "boolean":return s.boolean;case "object":break;default:return s.unknown}if(Array.isArray(e)){let o=e.map(i=>Ce(i,n,t,r));return s.array(o.length?normalizeUnion(o):s.unknown)}let s$1=e;if(AST_MARKER in s$1){let o;try{o=fromJson(s$1);}catch{return t.sink.report(S.unsupported(r,`'#ast: ${String(s$1[AST_MARKER])}'`)),s.unknown}return f(o,n,t)}let a={};for(let o of Object.keys(s$1))a[o]={type:Ce(s$1[o],n,t,r)};return {t:"object",props:a}}var Ut=(e,n)=>({...e,typeAnnotation:n}),qt=(e,n)=>({...e,returnType:n}),Kt=(e,n)=>({type:"TSAsExpression",expression:e,typeAnnotation:n});function Wt(e,n){return e.get(n)?.type}function Jt(e,n){return e.get(n)?.scope}function zt(e,n){let t=e.get(n)?.type;return t?discover(t,[])?.completions??[]:[]}function Xt(e,n){let t=e.get(n)?.scope;return t?[...pe(t)].map(([r,s])=>({key:r,type:s,optional:false})):[]}function Yt(e,n){return e.filter(t=>t.node===n)}export{Ve as FUNCTION_KINDS,Ut as annotate,qt as annotateReturn,Kt as asExpression,ye as calleeAllowlist,me as capabilityNodes,cn as check,T as childScope,wn as createEnv,Z as createSink,S as diag,Yt as diagnosticsAt,dt as extractModuleType,Fn as fromCapability,ce as guard,ne as guardsFromCompiled,v as lookup,B as makeDiagnostic,be as maxArgs,de as maxCallNesting,ge as maxDepth,fe as maxFunctionNesting,ee as maxNestingOf,Se as maxNodes,zt as memberCompletions,he as memberDepth,En as resolveNamed,vn as resolveScheme,Ne as resultType,$e as rootScope,Jt as scopeAt,Xt as scopeCompletions,Wt as typeAt,pe as visibleNames};
|
|
1
|
+
import {s,format,typeDiff,formatTypeDiff,subtype,configureTypeLimits,TypeEvalLimitError,UnionTooComplexError,resetTypeLimits,discover,normalizeUnion,apparentType,widenLiteral,resolveTypeOp,isScheme,expand1,instantiateLoose,widenType,substitute,widenInferred,groundVars,ownProp,withoutUndefined,widen,unify,equals,typeFeatures}from'@tslite/type-core';export*from'@tslite/type-core';import {rootScope,childScope,lookup,visibleNames,walk,desugarJSX,AST_MARKER,childrenOf,VisitorKeys}from'@tslite/core';import {compileProfile,nodeViolation,typeFeatureViolations}from'@tslite/capability';import {fromJson}from'@tslite/codec';var dn=(e={})=>rootScope(e),I=(e,n)=>childScope(e,n),C=(e,n)=>lookup(e,n),Ee=e=>visibleNames(e),ct=(e={},n={},t={},s={},r=new Set,a=new Set,o={})=>({scope:dn(e),types:n,schemes:t,accessors:s,asserters:r,matchers:a,modules:o}),pt=(e,n)=>e.types[n],dt=(e,n)=>e.schemes[n];var fn={"unknown-name":"semantic","const-needs-init":"semantic","cannot-redeclare":"semantic","unknown-module":"semantic",unsupported:"semantic","forbidden-member":"semantic","unused-name":"semantic","assign-to-const":"semantic","readonly-write":"type","not-assignable":"type","not-callable":"type","no-such-member":"type","not-object":"type","missing-argument":"type","excess-argument":"type","excess-property":"type","spread-argument":"type","props-mismatch":"type","no-matching-overload":"type","constraint-violation":"type","wrong-type-argument-count":"type","cast-unsound":"type","too-deep":"type","too-complex-union":"type","node-not-allowed":"capability","name-not-allowed":"capability","type-feature-not-allowed":"capability","any-not-allowed":"capability","too-large":"capability","wrong-result-type":"capability"},k=(e,n,t)=>({code:e,kind:fn[e],severity:"error",node:n,message:t}),v=(e,n,t,s="error")=>({code:e,kind:fn[e],severity:s,node:n,message:t}),S={notAssignable:(e,n,t,s={})=>{let r=typeDiff(n,t,s).filter(o=>o.path.length>0),a=r.length?` ${formatTypeDiff(r)}.`:"";return k("not-assignable",e,`Type '${format(n)}' is not assignable to type '${format(t)}'.${a}`)},unknownName:(e,n)=>k("unknown-name",e,`Cannot find name '${n}'.`),notCallable:(e,n)=>k("not-callable",e,`Type '${format(n)}' is not callable.`),noSuchMember:(e,n,t)=>k("no-such-member",e,`Property '${t}' does not exist on type '${format(n)}'.`),notObject:(e,n)=>k("not-object",e,`Type '${format(n)}' has no members to access.`),constNeedsInit:e=>k("const-needs-init",e,"'const' declarations must be initialized."),missingArgument:(e,n,t)=>k("missing-argument",e,`Missing argument '${n}' of type '${format(t)}'.`),unknownModule:(e,n)=>k("unknown-module",e,`Cannot find module '${n}' or its corresponding type declarations.`),cannotRedeclare:(e,n)=>k("cannot-redeclare",e,`Cannot redeclare block-scoped variable '${n}'.`),excessArgument:(e,n,t)=>k("excess-argument",e,`Expected ${n} argument${n===1?"":"s"}, but got ${t}.`),excessProperty:(e,n,t)=>k("excess-property",e,`Object literal may only specify known properties, and '${n}' does not exist in type '${format(t)}'.`),spreadArgument:e=>k("spread-argument",e,"A spread argument must either have a tuple type or be passed to a rest parameter."),propsMismatch:(e,n,t)=>k("props-mismatch",e,`Payload is not compatible with the component props '${format(n)}': ${t}.`),noMatchingOverload:(e,n,t)=>k("no-matching-overload",e,`No overload of '${format(n)}' matches the arguments (${t.map(s=>format(s)).join(", ")}).`),constraintViolation:(e,n,t,s)=>k("constraint-violation",e,`Type '${format(t)}' does not satisfy the constraint '${n} extends ${format(s)}'.`),unsupported:(e,n)=>k("unsupported",e,`${n} is not supported in this language.`),wrongTypeArgumentCount:(e,n,t)=>k("wrong-type-argument-count",e,`Expected ${n} type argument${n===1?"":"s"}, but got ${t}.`),forbiddenMember:(e,n)=>k("forbidden-member",e,`'${n}' is not a member of the language \u2014 the JS runtime substrate (identity/inheritance) is not vocabulary here (FP / portable IR). Use a factory/operator via DI.`),unusedName:(e,n)=>v("unused-name",e,`'${n}' is declared but its value is never read.`,"warning"),assignToConst:(e,n,t)=>k("assign-to-const",e,t==="import"?`Cannot assign to '${n}' because it is an import.`:`Cannot assign to '${n}' because it is a constant.`),readonlyWrite:(e,n)=>k("readonly-write",e,`Index signature in type '${format(n)}' only permits reading.`),castUnsound:(e,n,t)=>v("cast-unsound",e,`Conversion of type '${format(n)}' to type '${format(t)}' may be a mistake \u2014 neither sufficiently overlaps the other. Cast through 'unknown' first if intentional.`,"warning")};function ne(){let e=[];return {all:e,report(n){e.push(n);},hasErrors(){return e.some(n=>n.severity==="error")}}}function Ae(e,n,t={}){return n.flatMap(s=>s(e,t))}function Y(e,n){let t=s=>{n(s);for(let r of childrenOf(s))t(r);};t(e);}var Nt=e=>Array.isArray(e)?e:[e],yn=["ArrowFunctionExpression","FunctionExpression","FunctionDeclaration"];function De(e,n="error"){return t=>{let s=[];return Y(t,r=>{let a=nodeViolation(r,e);a&&s.push(v("node-not-allowed",r,`'${a}' is not allowed by the capability profile.`,n));}),s}}function hn(e,n="error"){let t=e.typeTier;return s=>{if(t==="author")return [];let r=[];return Y(s,a=>{let o=a,i=o.type==="TSTypeAliasDeclaration"?o.id?.name:void 0;for(let l of [o.typeAnnotation,o.returnType]){if(!l)continue;let u=typeFeatureViolations(typeFeatures(l,i),t);u.length&&r.push(v("type-feature-not-allowed",a,`authoring type feature${u.length>1?"s":""} '${u.join("', '")}' requires capability tier 'author'.`,n));}}),r}}function b(e,n=new WeakSet){if(!e||typeof e!="object"||n.has(e))return false;switch(n.add(e),e.t){case "any":return true;case "object":return Object.values(e.props).some(t=>b(t.type,n))||!!e.index&&b(e.index.value,n);case "array":return b(e.items,n);case "tuple":return e.elements.some(t=>b(t,n));case "union":case "intersection":return e.of.some(t=>b(t,n));case "fn":return e.params.some(t=>b(t.type,n))||b(e.returns,n);case "overload":return e.signatures.some(t=>t.params.some(s=>b(s.type,n))||b(t.returns,n));case "keyof":return b(e.of,n);case "index":return b(e.obj,n)||b(e.key,n);case "mapped":return b(e.over,n)||b(e.body,n);case "conditional":return b(e.check,n)||b(e.extends,n)||b(e.then,n)||b(e.else,n);case "returnType":case "parameters":return b(e.fn,n);case "apply":return e.args.some(t=>b(t,n));default:return false}}function gn(e,n="error"){return t=>{if(!e.typeStrict)return [];let s=[];return Y(t,r=>{let a=r;for(let o of [a.typeAnnotation,a.returnType])if(o&&b(o)){s.push(v("any-not-allowed",r,"'any' is not allowed under 'strict' \u2014 use 'unknown' + validated narrowing (assert/parse).",n));break}}),s}}function Ce(e,n="error"){let t=new Set(e);return s=>{let r=[];return Y(s,a=>{if(a.type!=="CallExpression")return;let o=a.callee;if(o.type!=="Identifier")r.push(v("name-not-allowed",o,"Only direct calls to allowed functions are permitted.",n));else {let i=o.name;t.has(i)||r.push(v("name-not-allowed",o,`Function '${i}' is not allowed here.`,n));}}),r}}function fe(e,n,t={}){let s=new Set(Nt(e)),r=t.severity??"error",a=[...s].join("/");return o=>{let i=[],l=(u,c)=>{let p=s.has(u.type),m=p?c+1:c;p&&m>n&&i.push(v("too-deep",u,`Nesting of ${a} exceeds ${n}${t.hint?` \u2014 ${t.hint}`:""}.`,r));for(let f of childrenOf(u))l(f,m);};return l(o,0),i}}var Te=(e=3,n="error")=>fe(yn,e,{hint:"use a pipe instead of nesting functions",severity:n}),Re=(e,n="error")=>fe("CallExpression",e,{hint:"use a pipe instead of nesting calls",severity:n}),Me=(e,n="error")=>fe("MemberExpression",e,{severity:n});function Pe(e,n="error"){return t=>{let s=[],r=(a,o)=>{if(o>e){s.push(v("too-deep",a,`Expression nesting exceeds ${e}.`,n));return}for(let i of childrenOf(a))r(i,o+1);};return r(t,0),s}}function Fe(e,n="error"){return t=>{let s=0;return Y(t,()=>{s++;}),s>e?[v("too-large",t,`Expression has ${s} nodes (max ${e}).`,n)]:[]}}function Ie(e,n="error"){return t=>{let s=[];return Y(t,r=>{if(r.type==="CallExpression"){let a=r.arguments;a&&a.length>e&&s.push(v("too-large",r,`Call has ${a.length} arguments (max ${e}).`,n));}}),s}}function Oe(e,n={},t="error"){return (s,r)=>{let a=r.overlay?.get(s)?.type;return a?subtype(a,e,n)?[]:[v("wrong-result-type",s,`Result type '${format(a)}' is not assignable to the required '${format(e)}'.`,t)]:[]}}function me(e){let n=[De(e),hn(e),gn(e)];return e.hostAllow!=="*"&&n.push(Ce([...e.hostAllow])),n}function bt(e){return me(compileProfile(e))}var q=e=>({bindings:new Map,parent:e}),Nn=e=>e.charCodeAt(0)===95;function ye(e,n,t,s,r,a){let o=e.bindings.get(t);o&&(o.exempt=true);let i={name:t,node:s,kind:r,exempt:a,used:false};e.bindings.set(t,i),n.all.push(i);}function se(e,n){if(!e||typeof e!="object")return;if(Array.isArray(e)){for(let s of e)se(s,n);return}let t=e;if(t.t==="typeQuery"&&Array.isArray(t.path)){let s=t.path[0];typeof s=="string"&&he(n,s);return}for(let s of Object.keys(t))se(t[s],n);}function Bn(e,n){let t=e;se(t.typeAnnotation,n),se(t.returnType,n);}function he(e,n){for(let t=e;t;t=t.parent){let s=t.bindings.get(n);if(s){s.used=true;return}}}function x(e,n,t,s,r,a){if(e)switch(e.type){case "Identifier":{let o=e.name;Bn(e,n),ye(n,t,o,e,s,r||a&&Nn(o));return}case "ObjectPattern":{let o=e.properties,i=o[o.length-1],l=!!i&&i.type==="RestElement";o.forEach((u,c)=>{let p=l&&c<o.length-1;if(u.type==="RestElement")x(u.argument,n,t,s,r,false);else {let m=u;m.computed&&B(m.key,n,t),x(m.value,n,t,s,r||p,!m.shorthand);}});return}case "ArrayPattern":{for(let o of e.elements){if(!o)continue;let i=o;x(i.type==="RestElement"?i.argument:i,n,t,s,r,true);}return}case "AssignmentPattern":x(e.left,n,t,s,r,a);return;case "RestElement":x(e.argument,n,t,s,r,true);return;default:return}}function te(e,n,t){if(e)switch(e.type){case "AssignmentPattern":B(e.right,n,t),te(e.left,n,t);return;case "ObjectPattern":for(let s of e.properties)te(s.type==="RestElement"?s.argument:s.value,n,t);return;case "ArrayPattern":for(let s of e.elements)s&&te(s,n,t);return;case "RestElement":te(e.argument,n,t);return;default:return}}function Sn(e,n,t,s){for(let r of e.declarations)x(r.id,n,t,"local",s,false),B(r.init,n,t);}function je(e,n,t){let s=e,r=q(n),a=s.params??[];for(let o of a)x(o,r,t,"parameter",false,true);for(let o of a)te(o,r,t);B(s.body,r,t);}function B(e,n,t){if(!(!e||typeof e!="object"||typeof e.type!="string"))switch(Bn(e,n),e.type){case "Identifier":he(n,e.name);return;case "MemberExpression":{let s=e;B(s.object,n,t),s.computed&&B(s.property,n,t);return}case "Property":{let s=e;s.computed&&B(s.key,n,t),B(s.value,n,t);return}case "Program":case "BlockStatement":{let s=q(n);for(let r of e.body??[])B(r,s,t);return}case "ArrowFunctionExpression":case "FunctionExpression":je(e,n,t);return;case "FunctionDeclaration":{let s=e.id;s&&ye(n,t,s.name,s,"local",false),je(e,n,t);return}case "CatchClause":{let s=e,r=q(n);x(s.param,r,t,"local",true,false),B(s.body,r,t);return}case "SwitchStatement":{let s=e;B(s.discriminant,n,t);let r=q(n);for(let a of s.cases){B(a.test,r,t);for(let o of a.consequent??[])B(o,r,t);}return}case "ForStatement":{let s=e,r=q(n);B(s.init,r,t),B(s.test,r,t),B(s.update,r,t),B(s.body,r,t);return}case "ForOfStatement":case "ForInStatement":{let s=e;B(s.right,n,t);let r=q(n),a=s.left;if(a.type==="VariableDeclaration")for(let o of a.declarations)x(o.id,r,t,"local",false,true);else B(a,r,t);B(s.body,r,t);return}case "VariableDeclaration":Sn(e,n,t,false);return;case "ImportDeclaration":{for(let s of e.specifiers){let r=s.local;r&&ye(n,t,r.name,r,"import",Nn(r.name));}return}case "ExportNamedDeclaration":{let s=e;if(s.declaration){let r=s.declaration;if(r.type==="VariableDeclaration")Sn(r,n,t,true);else if(r.type==="FunctionDeclaration"){let a=r.id;a&&ye(n,t,a.name,a,"local",true),je(r,n,t);}else B(r,n,t);}else for(let r of s.specifiers)he(n,r.local.name);return}case "TSAsExpression":B(e.expression,n,t);return;case "TSTypeAliasDeclaration":se(e.typeAnnotation,n);return;case "JsonExpression":Ue(e.body,n,t);return;case "JSXOpeningElement":{let s=e;bn(s.name,n);for(let r of s.attributes??[])B(r,n,t);return}case "JSXClosingElement":return;case "JSXAttribute":B(e.value,n,t);return;default:{let s=VisitorKeys[e.type];if(!s)return;let r=e;for(let a of s){let o=r[a];if(Array.isArray(o))for(let i of o)B(i,n,t);else B(o,n,t);}return}}}function bn(e,n,t){e&&(e.type==="JSXIdentifier"?he(n,e.name):e.type==="JSXMemberExpression"&&bn(e.object,n));}function Ue(e,n,t){if(!e||typeof e!="object")return;if(Array.isArray(e)){for(let r of e)Ue(r,n,t);return}let s=e;if(AST_MARKER in s){try{B(fromJson(s),n,t);}catch{}return}for(let r of Object.keys(s))Ue(s[r],n,t);}function $e(e,n){if(!n.locals&&!n.parameters)return [];let t={all:[]};B(e,q(void 0),t);let s=[];for(let r of t.all)r.used||r.exempt||(r.kind==="parameter"?n.parameters:n.locals)&&s.push(S.unusedName(r.node,r.name));return s}var At=new Set(["const","import"]),re=e=>({binds:new Map,parent:e});function Dt(e,n){for(let t=e;t;t=t.parent){let s=t.binds.get(n);if(s)return s}}function _(e){if(!e)return [];switch(e.type){case "Identifier":return [e];case "ObjectPattern":return e.properties.flatMap(n=>n.type==="RestElement"?_(n.argument):_(n.value));case "ArrayPattern":return e.elements.flatMap(n=>n?_(n):[]);case "AssignmentPattern":return _(e.left);case "RestElement":return _(e.argument);default:return []}}var ge=(e,n,t)=>{for(let s of _(n))e.binds.set(s.name,t);};function Le(e,n,t){if(!e)return;if(e.type!=="Identifier"){for(let a of _(e))Le(a,n,t);return}let s=e.name,r=Dt(n,s);r&&At.has(r)&&(t.invalid.add(e),t.out.push(S.assignToConst(e,s,r==="import"?"import":"const")));}function R(e,n,t){if(!(!e||typeof e!="object"||typeof e.type!="string"))switch(e.type){case "AssignmentExpression":{let s=e;Le(s.left,n,t),R(s.right,n,t);return}case "UpdateExpression":{Le(e.argument,n,t);return}case "Program":case "BlockStatement":{let s=re(n);for(let r of e.body??[])R(r,s,t);return}case "ArrowFunctionExpression":case "FunctionExpression":case "FunctionDeclaration":{let s=e,r=re(n);for(let a of s.params??[])ge(r,a,"param");R(s.body,r,t);return}case "CatchClause":{let s=e,r=re(n);ge(r,s.param,"param"),R(s.body,r,t);return}case "ForStatement":case "ForOfStatement":case "ForInStatement":{let s=e,r=re(n),a=s.left??s.init;if(a?.type==="VariableDeclaration")for(let o of a.declarations)ge(r,o.id,a.kind);else a&&R(a,r,t);R(s.right,n,t),R(s.test,r,t),R(s.update,r,t),R(s.body,r,t);return}case "VariableDeclaration":{let s=e;for(let r of s.declarations)R(r.init,n,t),ge(n,r.id,s.kind);return}case "ImportDeclaration":{for(let s of e.specifiers){let r=s.local;r&&n.binds.set(r.name,"import");}return}case "ExportNamedDeclaration":{let s=e;s.declaration&&R(s.declaration,n,t);return}case "TSTypeAliasDeclaration":return;case "TSAsExpression":R(e.expression,n,t);return;default:{let s=VisitorKeys[e.type];if(!s)return;let r=e;for(let a of s){let o=r[a];if(Array.isArray(o))for(let i of o)R(i,n,t);else R(o,n,t);}return}}}function Ve(e){let n={out:[],invalid:new WeakSet};return R(e,re(void 0),n),{diagnostics:n.out,invalidTargets:n.invalid}}var ae=e=>({decls:new Map,parent:e});function Tt(e,n){for(let t=e;t;t=t.parent){let s=t.decls.get(n);if(s)return s}}function H(e){if(!e)return [];switch(e.type){case "Identifier":return [e];case "ObjectPattern":return e.properties.flatMap(n=>n.type==="RestElement"?H(n.argument):H(n.value));case "ArrayPattern":return e.elements.flatMap(n=>n?H(n):[]);case "AssignmentPattern":return H(e.left);case "RestElement":return H(e.argument);default:return []}}var Se=(e,n)=>{for(let t of H(n))e.decls.set(t.name,t);};function D(e,n,t){if(!(!e||typeof e!="object"||typeof e.type!="string"))switch(e.type){case "Identifier":{let s=Tt(n,e.name);s&&s!==e&&t.set(e,s);return}case "MemberExpression":{let s=e;D(s.object,n,t),s.computed&&D(s.property,n,t);return}case "Property":{let s=e;s.computed&&D(s.key,n,t),D(s.value,n,t);return}case "Program":case "BlockStatement":{let s=ae(n);for(let r of e.body??[])D(r,s,t);return}case "ArrowFunctionExpression":case "FunctionExpression":case "FunctionDeclaration":{let s=e,r=e.id;r&&n.decls.set(r.name,r);let a=ae(n);for(let o of s.params??[])Se(a,o);D(s.body,a,t);return}case "CatchClause":{let s=e,r=ae(n);Se(r,s.param),D(s.body,r,t);return}case "ForStatement":case "ForOfStatement":case "ForInStatement":{let s=e,r=ae(n),a=s.left??s.init;if(a?.type==="VariableDeclaration")for(let o of a.declarations)Se(r,o.id);else a&&D(a,r,t);D(s.right,n,t),D(s.test,r,t),D(s.update,r,t),D(s.body,r,t);return}case "VariableDeclaration":{for(let s of e.declarations)Se(n,s.id),D(s.init,n,t);return}case "ImportDeclaration":{for(let s of e.specifiers){let r=s.local;r&&n.decls.set(r.name,r);}return}case "TSTypeAliasDeclaration":{let s=e.id;s&&n.decls.set(s.name,s);return}case "TSAsExpression":D(e.expression,n,t);return;default:{let s=VisitorKeys[e.type];if(!s)return;let r=e;for(let a of s){let o=r[a];if(Array.isArray(o))for(let i of o)D(i,n,t);else D(o,n,t);}return}}}function Rt(e){let n=new WeakMap;return D(e,ae(void 0),n),n}var xe=e=>e.typeAnnotation,Ge=e=>e.returnType,$=e=>e.type==="Identifier"?e.name:null,kn=e=>{if(e.type==="VariableDeclaration"){let n=e.declarations[0];return n?$(n.id):null}return $(e)},ie=e=>{if(e.computed)return null;let n=e.key;return n.type==="Identifier"?n.name:n.type==="Literal"?String(n.value??""):null};function wn(e){let n=s=>s&&s.type==="Literal"&&typeof s.value=="string"?s.value:null;if(e.length===1&&e[0].type==="ArrayExpression"){let s=[];for(let r of e[0].elements){let a=n(r);if(a===null)return null;s.push(a);}return s}let t=[];for(let s of e){let r=n(s);if(r===null)return null;t.push(r);}return t.length?t:null}function Ke(e){if(e.type==="Identifier")return e.name;if(e.type==="MemberExpression"){let n=e;if(n.computed||n.property.type!=="Identifier")return null;let t=Ke(n.object);return t===null?null:`${t}.${n.property.name}`}return null}function We(e){let n=e;if(n.regex||n.bigint)return s.unknown;let t=n.value;return t===null?s.null:t===void 0?s.undefined:typeof t=="string"||typeof t=="number"||typeof t=="boolean"?{t:"literal",value:t,fresh:true}:s.unknown}var z=e=>{let n=e.value;return n===null?s.null:typeof n=="string"||typeof n=="number"||typeof n=="boolean"?s.literal(n):We(e)},Je=e=>e.type==="ArrowFunctionExpression",En=e=>e.t==="apply"&&e.name==="Promise"&&e.args.length===1,Be=e=>En(e)?e.args[0]:e,le=e=>En(e)?e:s.promise(e);function oe(e){return e.t==="tuple"?true:e.t==="array"?oe(e.items):e.t==="union"?e.of.some(oe):false}function Ne(e){return e.t==="literal"?true:e.t==="union"?e.of.some(n=>Ne(n)):e.t==="var"?e.isConst===true||e.bound!==void 0&&Ne(e.bound):false}var L=(e,n)=>{let t=e;for(let s=0;s<50&&t.t==="apply";s++){let r=expand1(t,n);if(r===t||r.t==="apply"&&r.name===t.name)break;t=r;}return t};function vn(e){let n=Ge(e);return n?{t:"fn",params:e.params.map((s$1,r)=>({name:$(s$1)??`arg${r}`,type:xe(s$1)??s.unknown})),returns:e.async?le(n):n}:null}var G={then:{},else:{}},Fn=new Set(["string","number","boolean","undefined","function","object"]),An={string:s.string,number:s.number,boolean:s.boolean,undefined:s.undefined};function In(e,n){switch(n){case "string":return e.t==="string"||e.t==="literal"&&typeof e.value=="string";case "number":return e.t==="number"||e.t==="literal"&&typeof e.value=="number";case "boolean":return e.t==="boolean"||e.t==="literal"&&typeof e.value=="boolean";case "undefined":return e.t==="undefined";case "function":return e.t==="fn"||e.t==="overload";case "object":return e.t==="object"||e.t==="array"||e.t==="tuple"||e.t==="null";default:return false}}var It=s.literal(true),Ot=s.literal(false),V=e=>e.t==="union"?[...e.of]:e.t==="boolean"?[It,Ot]:[e];function Dn(e,n){let t=e,s=n;return e.type==="UnaryExpression"&&t.operator==="typeof"&&t.argument.type==="Identifier"&&n.type==="Literal"&&typeof s.value=="string"?{name:t.argument.name,tag:s.value}:null}function jt(e,n,t){if(e.t==="unknown"||e.t==="any")return n;let s=V(e).filter(r=>subtype(r,n,t));return s.length?normalizeUnion(s):n}function Ut(e,n,t){if(e.t==="unknown"||e.t==="any")return null;let s=V(e).filter(r=>!subtype(r,n,t));return s.length?normalizeUnion(s):null}function $t(e,n){if(!Fn.has(n))return null;if(e.t==="unknown"||e.t==="any")return An[n]??e;let t=V(e).filter(s=>In(s,n));return t.length?normalizeUnion(t):An[n]??e}function Lt(e,n){if(!Fn.has(n)||e.t==="unknown"||e.t==="any")return null;let t=V(e).filter(s=>!In(s,n));return t.length?normalizeUnion(t):null}function Cn(e,n){if(e.type==="Identifier"&&n.type==="Literal"){let t=z(n);if(t.t==="literal"||t.t==="null")return {name:e.name,lit:t}}return null}function Tn(e,n){if(e.type==="MemberExpression"&&!e.computed&&!e.optional&&e.object.type==="Identifier"&&e.property.type==="Identifier"&&n.type==="Literal"){let t=z(n);if(t.t==="literal"||t.t==="null")return {name:e.object.name,prop:e.property.name,lit:t}}return null}function Rn(e,n,t,s,r){let a=V(e),o=l=>l.t==="object"?ownProp(l.props,n)?.type:void 0,i=a.filter(l=>{let u=o(l);return s?!!u&&subtype(t,u,r):!(u&&subtype(u,t,r))});return i.length&&i.length<a.length?normalizeUnion(i):null}function Mn(e,n,t){let s=V(e),r=o=>o.t==="object"&&(n in o.props||!!o.index),a=s.filter(o=>t?r(o):!r(o));return a.length&&a.length<s.length?normalizeUnion(a):null}function Vt(e,n,t){return e.t==="unknown"||e.t==="any"||subtype(n,e,t)?n:null}function xt(e,n,t){let s=V(e),r=s.filter(a=>!equals(a,n,t));return r.length&&r.length<s.length?normalizeUnion(r):null}var Gt=e=>e.t==="null"||e.t==="undefined",On=e=>Gt(e)||e.t==="literal"&&!e.value,Kt=e=>{if(e.t==="unknown"||e.t==="any")return null;let n=V(e),t=n.filter(s=>!On(s));return t.length&&t.length<n.length?normalizeUnion(t):null},Wt=e=>{let n=V(e),t=n.filter(On);return t.length&&t.length<n.length?normalizeUnion(t):null},Pn=e=>e.type==="Literal"&&e.value===null?"null":e.type==="Identifier"&&e.name==="undefined"?"undefined":null,O=(e,n,t)=>({then:n?{[e]:n}:{},else:t?{[e]:t}:{}}),Jt=e=>e==="==="||e==="=="||e==="!=="||e==="!=";function ce(e,n,t){if(e.type==="BinaryExpression"){let s=e;if(s.operator==="in"){let f=s.left,N=s.right;if(f.type==="Literal"&&typeof f.value=="string"&&N.type==="Identifier"){let g=N.name,E=C(n,g);if(!E)return G;let w=String(f.value);return O(g,Mn(E,w,true),Mn(E,w,false))}return G}if(!Jt(s.operator))return G;let r=s.operator==="!=="||s.operator==="!=",a=s.left,o=s.right,i=Dn(a,o)??Dn(o,a);if(i){let f=C(n,i.name);if(!f)return G;let N=$t(f,i.tag),g=Lt(f,i.tag);return r?O(i.name,g,N):O(i.name,N,g)}let l=Pn(a),u=Pn(o),c=l?o:u?a:null;if((l||u)&&c?.type==="Identifier"){let f=c.name,N=C(n,f);if(!N)return G;let E=s.operator==="=="||s.operator==="!="?["null","undefined"]:[l??u],w=V(N),un=w.filter(we=>E.includes(we.t)),ke=w.filter(we=>!E.includes(we.t)),cn=un.length?normalizeUnion(un):null,pn=ke.length&&ke.length<w.length?normalizeUnion(ke):null;return r?O(f,pn,cn):O(f,cn,pn)}let p=Cn(a,o)??Cn(o,a);if(p){let f=C(n,p.name);if(!f)return G;let N=Vt(f,p.lit,t),g=xt(f,p.lit,t);return r?O(p.name,g,N):O(p.name,N,g)}let m=Tn(a,o)??Tn(o,a);if(m){let f=C(n,m.name);if(!f)return G;let N=Rn(f,m.prop,m.lit,true,t),g=Rn(f,m.prop,m.lit,false,t);return r?O(m.name,g,N):O(m.name,N,g)}return G}if(e.type==="UnaryExpression"&&e.operator==="!"){let s=ce(e.argument,n,t);return {then:s.else,else:s.then}}if(e.type==="CallExpression"){let s=_t(e,n,t);if(s)return s}if(e.type==="Identifier"){let s=e.name,r=C(n,s);if(r)return O(s,Kt(r),Wt(r))}return G}function qt(e,n){if(e.t==="fn")return e.guard??null;if(e.t==="overload"){for(let t of e.signatures)if(t.guard&&t.params.length===n)return t.guard}return null}function _t(e,n,t){let s=e.callee;if(s.type!=="Identifier")return null;let r=C(n,s.name);if(!r)return null;let a=qt(r,e.arguments.length);if(!a)return null;let o=e.arguments[a.param];if(!o||o.type!=="Identifier")return null;let i=o.name,l=C(n,i);return l?O(i,jt(l,a.type,t),Ut(l,a.type,t)):null}var W=(e,n)=>Object.keys(n).length?I(e,n):e;function X(e){switch(e.type){case "ReturnStatement":case "ThrowStatement":return true;case "BlockStatement":{let n=e.body;return n.length>0&&X(n[n.length-1])}case "IfStatement":{let n=e;return !!n.alternate&&X(n.consequent)&&X(n.alternate)}default:return false}}var us=e=>{let n={};for(let t of Object.keys(e))n[t]={params:[],body:e[t]};return n};function cs(e){let n=[];return e.maxDepth!==void 0&&n.push(Pe(e.maxDepth)),e.maxNodes!==void 0&&n.push(Fe(e.maxNodes)),e.maxArgs!==void 0&&n.push(Ie(e.maxArgs)),e.maxFunctionNesting!==void 0&&n.push(Te(e.maxFunctionNesting)),e.maxCallNesting!==void 0&&n.push(Re(e.maxCallNesting)),e.memberDepth!==void 0&&n.push(Me(e.memberDepth)),n}function ps(e,n){let t=e.typeRefs;return t?.length?t.filter(s=>!(s.name in n)).map(s=>v("unknown-name",{type:"Identifier",name:s.name,loc:s.loc},`Cannot find name '${s.name}'.`)):[]}function qn(e,n,t={}){let s$1={...us(n.types),...n.schemes,...fs(e)},r=Ve(e),a={overlay:new WeakMap,sink:ne(),env:n,schemes:s$1,importNames:new Set,resolvedSchemes:new Set,invalidTargets:r.invalidTargets,evolving:new Set,declaredMut:new Map,assignFlow:new WeakMap},o=t.profile?compileProfile(t.profile):void 0;o&&configureTypeLimits(o.typeLimits);try{let i,l=ms(e,a);try{i=y(e,l,a);}catch(p){if(p instanceof TypeEvalLimitError)a.sink.report(v("too-deep",e,p.message));else if(p instanceof UnionTooComplexError)a.sink.report(v("too-complex-union",e,p.message));else throw p;i=s.unknown;}let u=[];o&&u.push(...me(o)),t.limits&&u.push(...cs(t.limits)),t.resultType&&u.push(Oe(t.resultType,s$1));let c=[...a.sink.all,...r.diagnostics,...ps(e,s$1),...t.unused?$e(e,t.unused):[],...u.length?Ae(e,u,{overlay:a.overlay}):[]];return {type:i,overlay:a.overlay,diagnostics:c,schemes:a.schemes}}finally{o&&resetTypeLimits();}}function ds(e,n,t={}){let s$1=qn(e,n,t),r={},a=new Map,o,i=u=>{let c=[];if(u.type==="VariableDeclaration")for(let p of u.declarations){let m=$(p.id),f=s$1.overlay.get(p);m&&f&&(r[m]=f.type,c.push(m));}else if(u.type==="FunctionDeclaration"){let p=u.id?.name,m=s$1.overlay.get(u);p&&m&&(r[p]=m.type,c.push(p));}return c};for(let u of e.body??[])if(u.type==="VariableDeclaration"||u.type==="FunctionDeclaration")i(u);else if(u.type==="ExportNamedDeclaration"){let c=u;if(c.declaration)for(let p of i(c.declaration))a.set(p,p);else for(let p of c.specifiers)a.set(p.exported.name,p.local.name);}else if(u.type==="ExportDefaultDeclaration"){let c=s$1.overlay.get(u.declaration);o=c?c.type:s.unknown;}let l={};if(a.size||o!==void 0){for(let[u,c]of a)r[c]&&(l[u]={type:r[c]});o!==void 0&&(l.default={type:o});}else for(let u in r)l[u]={type:r[u]};return {type:{t:"object",props:l},diagnostics:s$1.diagnostics}}var fs=e=>{let n={};return walk(e,{TSTypeAliasDeclaration(t){let s=t;s.id?.name&&s.typeAnnotation&&(n[s.id.name]={params:s.typeParameters??[],body:s.typeAnnotation});}}),n};function ms(e,n){let t=n.env.modules,s$1={};walk(e,{ImportDeclaration(r){let a=r,o=a.source.value,i=typeof o=="string"?t?.[o]:void 0;if(!i){n.sink.report(S.unknownModule(a.source,String(o)));for(let l of a.specifiers)s$1[l.local.name]=s.unknown;return}for(let l of a.specifiers){let u=l.local.name;if(u in s$1){n.sink.report(S.cannotRedeclare(l.local,u));continue}if(l.type==="ImportNamespaceSpecifier"){s$1[u]=i;continue}let c=l.type==="ImportSpecifier"?l.imported.name:"default",p=discover(i,[c],n.schemes);p?s$1[u]=p.type:(n.sink.report(S.noSuchMember(l,i,c)),s$1[u]=s.unknown);}}});for(let r in s$1)n.importNames.add(r);return Object.keys(s$1).length?I(n.env.scope,s$1):n.env.scope}var h=(e,n,t,s)=>(e.overlay.set(n,{type:t,scope:s}),t);function y(e,n,t,s$1){switch(e.type){case _n:return e.schema;case "JSXElement":case "JSXFragment":return h(t,e,y(desugarJSX(e,{emptyPropsAsObject:true}),n,t),n);case "Literal":return h(t,e,We(e),n);case "Identifier":{let r=e.name,a=C(n,r);return a===void 0?r==="undefined"?h(t,e,s.undefined,n):(t.sink.report(S.unknownName(e,r)),h(t,e,s.unknown,n)):h(t,e,a,n)}case "MemberExpression":return h(t,e,gs(e,n,t),n);case "CallExpression":return h(t,e,bs(e,n,t,s$1),n);case "ArrowFunctionExpression":return nn(e,n,t);case "FunctionDeclaration":return t.sink.report(S.unsupported(e,"function declaration (use 'const fn = () => \u2026')")),h(t,e,s.unknown,n);case "FunctionExpression":return t.sink.report(S.unsupported(e,"anonymous function (use an arrow)")),h(t,e,s.unknown,n);case "ThisExpression":return t.sink.report(S.unsupported(e,"'this'")),h(t,e,s.unknown,n);case "BlockStatement":return h(t,e,tn(e,n,t),n);case "ReturnStatement":{let r=e.argument;return h(t,e,r?y(r,n,t):s.unknown,n)}case "IfStatement":return U(e,n,t),t.overlay.get(e)?.type??s.unknown;case "ForStatement":case "WhileStatement":case "DoWhileStatement":case "ForOfStatement":case "ForInStatement":case "BreakStatement":case "ContinueStatement":case "ThrowStatement":case "TryStatement":case "SwitchStatement":return U(e,n,t),t.overlay.get(e)?.type??s.unknown;case "AssignmentExpression":{let r=e,a=r.left,o=y(a,n,t);if(a.type==="MemberExpression"){let c=t.overlay.get(a.object)?.type,p=c&&apparentType(c,t.schemes);p&&(p.t==="array"||p.t==="tuple")&&p.readonly&&t.sink.report(S.readonlyWrite(a,p));}let i=a.type==="Identifier"?a.name:null,l=i!==null&&t.evolving.has(i),u=i!==null?t.declaredMut.get(i):void 0;if(r.operator==="="&&!t.invalidTargets.has(a)){if(l&&i!==null){let p=y(r.right,n,t);return t.assignFlow.set(e,widenLiteral(p)),h(t,e,p,n)}if(u&&i!==null){let p=y(r.right,n,t);return subtype(p,u,t.schemes)||t.sink.report(S.notAssignable(r.right,p,u,t.schemes)),t.assignFlow.set(e,nt(u,p,t.schemes)),h(t,e,p,n)}let c=J(r.right,o,n,t);return h(t,e,c,n)}return h(t,e,y(r.right,n,t),n)}case "UpdateExpression":return y(e.argument,n,t),h(t,e,s.number,n);case "ExpressionStatement":return h(t,e,y(e.expression,n,t),n);case "VariableDeclaration":return be(e,n,t),h(t,e,s.unknown,n);case "TSTypeAliasDeclaration":{let r=e.id?.name,a=r?t.schemes[r]:void 0;return h(t,e,a?As(a.body,n,t,e,a.params.length>0):s.unknown,n)}case "BinaryExpression":return h(t,e,xs(e,n,t),n);case "LogicalExpression":{let r=e,a=y(r.left,n,t),o=y(r.right,n,t);return h(t,e,Gs(r.operator,a,o),n)}case "UnaryExpression":return h(t,e,Js(e,n,t),n);case "ConditionalExpression":{let r=e;y(r.test,n,t);let a=ce(r.test,n,t.schemes),o=y(r.consequent,W(n,a.then),t),i=y(r.alternate,W(n,a.else),t);return h(t,e,normalizeUnion([o,i]),n)}case "ObjectExpression":return h(t,e,qs(e,n,t),n);case "ArrayExpression":return h(t,e,rt(e,n,t),n);case "TemplateLiteral":{for(let r of e.expressions)y(r,n,t);return h(t,e,s.string,n)}case "AwaitExpression":{let r=e.argument,a=r?y(r,n,t):s.unknown;return h(t,e,Be(a),n)}case "Program":{let r=sn(e.body,n,t,new Set(t.importNames)).scope;return h(t,e,s.unknown,r)}case "JsonExpression":return h(t,e,Qe(e.body,n,t,e),n);case "ChainExpression":return h(t,e,normalizeUnion([y(e.expression,n,t),s.undefined]),n);case "TSAsExpression":{let r=e,a=y(r.expression,n,t),o=de(r.typeAnnotation,n,t,e);return !subtype(a,o,t.schemes)&&!subtype(o,a,t.schemes)&&t.sink.report(S.castUnsound(e,a,o)),h(t,e,o,n)}default:return t.sink.report(S.unsupported(e,`'${e.type}'`)),h(t,e,s.unknown,n)}}var ys=new Set(["constructor","prototype","__proto__"]);function hs(e){if(!e.computed)return e.property.type==="Identifier"?e.property.name:null;let n=e.property;if(n.type==="Literal"){let t=n.value;if(typeof t=="string")return t}return null}function gs(e,n,t){let s$1=y(e.object,n,t),r=hs(e);if(r!==null&&ys.has(r))return t.sink.report(S.forbiddenMember(e,r)),s.unknown;if(e.computed){let i=y(e.property,n,t),l=resolveTypeOp(s.index(s$1,i));return l.t!=="index"?l:(i.t==="literal"&&typeof i.value=="string"&&Un(e,s$1,i.value,t),s.unknown)}let a=e.property.name,o=discover(s$1,[a],t.schemes);return o?o.type:(Un(e,s$1,a,t),s.unknown)}function Un(e,n,t,s){let r=isScheme(n,s.schemes)?expand1(n,s.schemes):n;r.t==="object"||r.t==="array"||r.t==="tuple"||r.t==="union"?s.sink.report(S.noSuchMember(e,n,t)):r.t!=="any"&&r.t!=="unknown"&&s.sink.report(S.notObject(e,n));}function Ss(e,n,t){if(!e||e.type!=="Identifier")return;let s=e.name;if(C(n,s)===void 0)return;let r=t.schemes[s];return r&&r.params.length===0?r.body:void 0}function Ns(e,n,t,s$1){let r=L(y(n[0],t,s$1),s$1.schemes),o=(r.t==="fn"?r:r.t==="overload"?r.signatures[0]:void 0)?.params[0]?.type,i=n.length>1?y(n[1],t,s$1):s.undefined;if(o){let l=typeDiff(i,o,s$1.schemes);l.length&&s$1.sink.report(S.propsMismatch(n[1]??e,o,formatTypeDiff(l)));}return h(s$1,e,s.boolean,t)}var _n="TSLiteSyntheticArg",Bs=e=>({type:_n,schema:e});function zn(e,n,t){if(!e.some(a=>a.type==="SpreadElement"))return {nodes:[...e],spread:null};let s$1=[],r=null;for(let a of e){if(a.type!=="SpreadElement"){s$1.push(a);continue}let o=a.argument;if(o.type==="ArrayExpression"&&o.elements.every(l=>l&&l.type!=="SpreadElement")){for(let l of o.elements)s$1.push(l);continue}let i=L(y(o,n,t),t.schemes);if(i.t==="tuple")for(let l of i.elements)s$1.push(Bs(l));else r={elem:i.t==="array"?i.items:s.unknown,node:a};}return {nodes:s$1,spread:r}}function bs(e,n,t,s$1){let r=e.arguments,a=Ke(e.callee);if(a){let p=t.env.accessors?.[a];if(p){let m=wn(r);if(m){let f=discover(p,m,t.schemes);return f?f.type:(t.sink.report(S.noSuchMember(e,p,m.join("."))),s.unknown)}return r.forEach(f=>y(f,n,t)),s.unknown}}if(a&&t.env.asserters?.has(a)){let p=Ss(r[0],n,t);for(let m=1;m<r.length;m++)y(r[m],n,t);return p??s.unknown}if(a&&t.env.matchers?.has(a))return Ns(e,r,n,t);let o=y(e.callee,n,t);if(o.t==="any")return r.forEach(p=>y(p,n,t)),s.any;if(o.t==="overload")return ws(e,o,n,t,s$1);if(o.t!=="fn")return r.forEach(p=>y(p,n,t)),t.sink.report(S.notCallable(e,o)),s.unknown;let i=zn(r,n,t),l=i.nodes.map(p=>Xn(p,n,t)),u=Hn(e),c=!u||Zn(o,u.length);return c||t.sink.report(S.wrongTypeArgumentCount(e,o.typeParams?.length??0,u.length)),Qn(e,o,i.nodes,l,n,t,i.spread,s$1,c?u:void 0)}function Xn(e,n,t){if(Je(e))return s.any;if(e.type!=="CallExpression")return y(e,n,t);let s$1=ne(),r=y(e,n,{...t,sink:s$1});return s$1.hasErrors()?s.any:(s$1.all.forEach(a=>t.sink.report(a)),r)}function Qn(e,n,t,s$1,r,a,o=null,i,l){let u=f=>{if(!i)return f;let N=substitute(n.returns,f);if(N.t==="fn"&&i.t==="fn"){let g=f,E=Math.min(N.params.length,i.params.length);for(let w=0;w<E;w++)g=unify(N.params[w].type,i.params[w].type,g)??g;return unify(N.returns,i.returns,g)??g}return unify(N,i,f)??f},c=l?Cs(e,n,l,a):void 0,p=c??u(instantiateLoose(n,s$1).bindings);t.forEach((f,N)=>{if(Je(f)){let g=widenType(substitute(n.params[N]?.type??s.any,p));s$1[N]=nn(f,r,a,g);}else if(f.type==="CallExpression"&&s$1[N].t==="any")s$1[N]=y(f,r,a,substitute(n.params[N]?.type??s.unknown,p));else if(f.type==="Literal"){let g=n.params[N]?.type??s.unknown,E=g.t==="var"?g.bound?substitute(g.bound,p):g:substitute(g,p);Ne(E)&&(s$1[N]=h(a,f,z(f),r));}else if(f.type==="ArrayExpression"){let g=substitute(n.params[N]?.type??s.unknown,p);oe(g)&&(s$1[N]=an(f,g,r,a));}});let m=c??u(instantiateLoose(n,s$1).bindings);return c||ks(e,n,m,a),Ps(e,n,s$1,m,a,t,o),t.forEach((f,N)=>{let g=n.params[N];f.type==="ObjectExpression"&&g&&!g.variadic&&rn(f,substitute(g.type,m),a);}),widenInferred(groundVars(substitute(n.returns,m),a.schemes))}var $n=new WeakMap;function Yn(e){let n=$n.get(e);if(n)return n;let t=new Map,s=new WeakSet;for(let r of e.params)M(r.type,t,s);return M(e.returns,t,s),$n.set(e,t),t}function M(e,n,t){switch(e.t){case "var":e.bound&&!n.has(e.name)&&n.set(e.name,e.bound);return;case "array":M(e.items,n,t);return;case "union":for(let s of e.of)M(s,n,t);return;case "object":if(t.has(e))return;t.add(e);for(let s in e.props)M(e.props[s].type,n,t);return;case "fn":if(t.has(e))return;t.add(e);for(let s of e.params)M(s.type,n,t);M(e.returns,n,t);return;case "overload":for(let s of e.signatures){for(let r of s.params)M(r.type,n,t);M(s.returns,n,t);}return;case "apply":for(let s of e.args)M(s,n,t);return;case "keyof":M(e.of,n,t);return;case "index":M(e.obj,n,t),M(e.key,n,t);return;case "mapped":M(e.over,n,t),M(e.body,n,t);return;default:return}}function ks(e,n,t,s){let r=Yn(n);if(r.size!==0)for(let[a,o]of r){let i=t[a];if(!i)continue;let l=substitute(o,t);subtype(i,l,s.schemes)||s.sink.report(S.constraintViolation(e,a,i,l));}}function ws(e,n,t,s,r){let a=zn(e.arguments,t,s),o=a.nodes,i=o.map(c=>Xn(c,t,s)),l=Hn(e),u=l?n.signatures.filter(c=>Zn(c,l.length)):n.signatures;if(l&&!u.length){let c=n.signatures.reduce((p,m)=>Math.max(p,m.typeParams?.length??0),0);return s.sink.report(S.wrongTypeArgumentCount(e,c,l.length)),Ln(e,n.signatures,a,o,i,t,s,r,void 0)}return Ln(e,u,a,o,i,t,s,r,l)}function Ln(e,n,t,s$1,r,a,o,i,l){let u={t:"overload",signatures:n},c=m=>t.spread?Ts(m,s$1.length):Rs(m,s$1.length),p=u.signatures.find(m=>c(m)&&Ms(m,r,o));if(!p){let m=u.signatures.filter(c);m.length===1?p=m[0]:u.signatures.length===1&&(p=u.signatures[0]);}return p?Qn(e,p,s$1,r,a,o,t.spread,i,l):(o.sink.report(S.noMatchingOverload(e,u,r)),s.unknown)}function Es(e,n,t,s$1){let r=C(n,e[0]);if(r===void 0)return t.sink.report(S.unknownName(s$1,e[0])),s.unknown;let a=e.slice(1),o=a.length?discover(r,a,t.schemes)?.type:r;return o?o.t==="literal"?s.literal(o.value):o:(t.sink.report(S.noSuchMember(s$1,r,a.join("."))),s.unknown)}function de(e,n,t,s$1){let r=a=>{if(Array.isArray(a)){let u=false,c=a.map(p=>{let m=r(p);return m!==p&&(u=true),m});return u?c:a}if(!a||typeof a!="object")return a;let o=a;if(o.t==="typeQuery")return Es(o.path,n,t,s$1);if(o.t==="apply"&&typeof o.name=="string"&&(vs(o.name,n,t,s$1),!(o.name in t.schemes)))return s.any;let i=false,l={};for(let u of Object.keys(o)){let c=r(o[u]);c!==o[u]&&(i=true),l[u]=c;}return i?l:o};return r(e)}function vs(e,n,t,s){if(t.resolvedSchemes.has(e))return;let r=t.schemes[e];if(!r)return;t.resolvedSchemes.add(e);let a=de(r.body,n,t,s);a!==r.body&&(t.schemes[e]={...r,body:a});}function As(e,n,t,s,r){let a={...t,sink:ne(),resolvedSchemes:new Set(Object.keys(t.schemes))},o=de(e,n,a,s);return a.sink.hasErrors()?e:r?o:groundVars(o,t.schemes)}var en=(e,n,t)=>{let s=xe(e);return s===void 0?s:de(s,n,t,e)},Ds=(e,n,t)=>{let s=Ge(e);return s===void 0?s:de(s,n,t,e)},Hn=e=>{let n=e.typeArguments;return n?.length?n:void 0},Zn=(e,n)=>(e.typeParams?.length??0)===n;function Cs(e,n,t,s){let r=n.typeParams??[],a={};r.forEach((i,l)=>a[i]=t[l]);let o=a;for(let[i,l]of Yn(n)){let u=o[i];if(!u)continue;let c=groundVars(substitute(l,o),s.schemes);subtype(u,c,s.schemes)||s.sink.report(S.constraintViolation(e,i,u,c));}return o}function Ts(e,n){let t=0,s=false;for(let r of e.params)r.variadic?s=true:r.optional||t++;return n>=t&&(s||n<e.params.length)}function Rs(e,n){let t=0;for(let s of e.params){if(s.variadic)return n>=t;s.optional||t++;}return n>=t&&n<=e.params.length}function Ms(e,n,t){let{bindings:s}=instantiateLoose(e,n);for(let r=0;r<e.params.length;r++){let a=e.params[r];if(a.variadic)return true;if(r>=n.length){if(!a.optional)return false;continue}if(!subtype(n[r],substitute(a.type,s),t.schemes))return false}return true}function Ps(e,n,t,s$1,r,a=e.arguments??[],o=null){let i=u=>a[u]??e;for(let u=0;u<n.params.length;u++){let c=n.params[u];if(c.variadic)break;let p=substitute(c.type,s$1);if(u>=t.length){!c.optional&&!o&&r.sink.report(S.missingArgument(e,c.name,p));continue}subtype(t[u],p,r.schemes)||r.sink.report(S.notAssignable(i(u),t[u],p,r.schemes));}let l=n.params.find(u=>u.variadic);if(o){let u=t.length,c=n.params.filter(p=>!p.optional&&!p.variadic).length;if(!(u>=c&&(l||u<n.params.length))){r.sink.report(S.spreadArgument(o.node));return}if(l){let p=substitute(l.type,s$1),m=p.t==="array"?p.items:s.unknown;subtype(o.elem,m,r.schemes)||r.sink.report(S.notAssignable(o.node,o.elem,m,r.schemes));}return}!l&&t.length>n.params.length&&r.sink.report(S.excessArgument(i(n.params.length),n.params.length,t.length));}function J(e,n,t,s){let r=L(n,s.schemes);switch(e.type){case "Literal":{let o=z(e);return subtype(o,n,s.schemes)||s.sink.report(S.notAssignable(e,o,n,s.schemes)),h(s,e,n,t)}case "ArrayExpression":{if(oe(r)){let o=an(e,r,t,s);return subtype(o,n,s.schemes)||s.sink.report(S.notAssignable(e,o,n,s.schemes)),h(s,e,o,t)}if(r.t==="array"){for(let o of e.elements){if(!o)continue;let i=o;i.type==="SpreadElement"?J(i.argument,n,t,s):J(i,r.items,t,s);}return h(s,e,n,t)}break}case "ObjectExpression":{if(r.t==="object"){let o={};for(let l of e.properties){let u=l;if(u.type==="SpreadElement"){y(u.argument,t,s);continue}let c=u,p=ie(c),m=p!==null?ownProp(r.props,p)?.type:void 0,f=m?J(c.value,m,t,s):y(c.value,t,s);p!==null&&(o[p]={type:f}),h(s,u,f,t);}let i={t:"object",props:o};return subtype(i,n,s.schemes)||s.sink.report(S.notAssignable(e,i,n,s.schemes)),h(s,e,n,t)}break}case "ArrowFunctionExpression":{if(r.t==="fn"){let o=nn(e,t,s,r);return subtype(o,n,s.schemes)||s.sink.report(S.notAssignable(e,o,n,s.schemes)),h(s,e,n,t)}break}case "ConditionalExpression":{let o=e;return y(o.test,t,s),J(o.consequent,n,t,s),J(o.alternate,n,t,s),h(s,e,n,t)}}let a=y(e,t,s);return subtype(a,n,s.schemes)||s.sink.report(S.notAssignable(e,a,n,s.schemes)),h(s,e,a,t)}function nn(e,n,t,s$1){let r=s$1&&s$1.t==="fn"?s$1:void 0,a={},o=new Map,i=e.params.map((f,N)=>{let g=f,E=$(g),w=en(g,n,t)??r?.params[N]?.type??s.unknown;return E?(a[E]=w,(w.t==="union"||w.t==="boolean")&&o.set(E,w)):g.type!=="Identifier"&&Q(g,w,a,n,t),t.overlay.set(g,{type:w,scope:n}),{name:E??`arg${N}`,type:w}}),l=I(n,a),u=e.body,c=Ds(e,n,t);if(u.type!=="BlockStatement"&&c){let f=e.async?Be(c):c;J(u,f,l,t);let N=e.async?le(c):c;return h(t,e,{t:"fn",params:i,returns:N},n)}let p=u.type==="BlockStatement"?h(t,u,tn(u,l,t,new Set(Object.keys(a)),o),l):y(u,l,t),m=e.async?le(p):p;if(c){let f=e.async?Be(c):c,N=e.async?p:m;subtype(N,f,t.schemes)||t.sink.report(S.notAssignable(u,m,c,t.schemes));let g=e.async?le(c):c;return h(t,e,{t:"fn",params:i,returns:g},n)}return h(t,e,{t:"fn",params:i,returns:widenType(m)},n)}function ee(e){switch(e.type){case "Identifier":return [e];case "ObjectPattern":return e.properties.flatMap(n=>n.type==="RestElement"?ee(n.argument):ee(n.value));case "ArrayPattern":return e.elements.flatMap(n=>n?n.type==="RestElement"?ee(n.argument):ee(n):[]);case "AssignmentPattern":return ee(e.left);default:return []}}function et(e){if(e.type==="VariableDeclaration")return e.declarations.flatMap(n=>ee(n.id));if(e.type==="FunctionDeclaration"){let n=e.id;return n?[n]:[]}return e.type==="ExportNamedDeclaration"&&e.declaration?et(e.declaration):[]}function tn(e,n,t,s$1=new Set,r){let{returns:a}=sn(e.body,n,t,s$1,r);return a.length?normalizeUnion(a):s.unknown}var Fs=[s.literal(true),s.literal(false)];function Is(e){return e.t==="union"?e.of:e.t==="boolean"?Fs:[e]}function nt(e,n,t){let s=Is(e);if(s.length<=1)return e;let r=s.filter(o=>subtype(n,o,t));if(r.length===0)return e;let a=normalizeUnion(r);return subtype(n,a,t)?a:e}function tt(e,n){if(e.type!=="ExpressionStatement")return null;let t=e.expression;if(t.type!=="AssignmentExpression")return null;let s=t,r=s.left;if(s.operator!=="="||r.type!=="Identifier")return null;let a=n.assignFlow.get(t);return a?{name:r.name,type:a}:null}function Xe(e,n,t){switch(e.type){case "BlockStatement":{let s=n;for(let r of e.body){let a=Xe(r,s,t);if(s=a.types,a.exits)return {types:s,exits:true}}return {types:s,exits:false}}case "ExpressionStatement":{let s=tt(e,t);if(!s)return {types:n,exits:false};let r=new Map(n);return r.set(s.name,s.type),{types:r,exits:false}}case "IfStatement":{let s=st(e,n,t);if(s.size===0)return {types:n,exits:X(e)};let r=new Map(n);for(let[a,o]of s)r.set(a,o);return {types:r,exits:X(e)}}case "ReturnStatement":case "ThrowStatement":return {types:n,exits:true};default:return {types:n,exits:false}}}function st(e,n,t){let s=Xe(e.consequent,n,t),r=e.alternate?Xe(e.alternate,n,t):{types:n,exits:false},a=new Set;for(let i of s.types.keys())s.types.get(i)!==n.get(i)&&a.add(i);for(let i of r.types.keys())r.types.get(i)!==n.get(i)&&a.add(i);let o=new Map;for(let i of a){let l=[];s.exits||l.push(s.types.get(i)??n.get(i)),r.exits||l.push(r.types.get(i)??n.get(i)),l.length&&o.set(i,normalizeUnion(l));}return o}function Os(e,n){let t=new Map,s=r=>{let a=C(e,r);a!==void 0&&t.set(r,a);};for(let r of n.evolving)s(r);for(let r of n.declaredMut.keys())s(r);return t}function sn(e,n,t,s=new Set,r){if(!(r&&r.size)&&!js(e))return Vn(e,n,t,s);let a=new Set(t.evolving),o=new Map(t.declaredMut);if(r)for(let[i,l]of r)t.declaredMut.set(i,l);try{return Vn(e,n,t,s)}finally{t.evolving.clear();for(let i of a)t.evolving.add(i);t.declaredMut.clear();for(let[i,l]of o)t.declaredMut.set(i,l);}}function js(e){for(let n of e){let t=n;if(t.type==="VariableDeclaration"&&t.kind!=="const")return true;if(t.type==="ExportNamedDeclaration"){let s=t.declaration;if(s?.type==="VariableDeclaration"&&s.kind!=="const")return true}}return false}function Vn(e,n,t,s){let r=n,a=[];for(let o of e){let i=o;for(let l of et(i))s.has(l.name)?t.sink.report(S.cannotRedeclare(l,l.name)):s.add(l.name);if(i.type==="VariableDeclaration")r=be(i,r,t);else if(i.type!=="ImportDeclaration")if(i.type==="ExportNamedDeclaration"){let l=i;if(l.declaration?.type==="VariableDeclaration")r=be(l.declaration,r,t);else if(l.declaration?.type==="FunctionDeclaration"){let u=y(l.declaration,r,t),c=$(l.declaration.id);c&&(r=I(r,{[c]:u}));}else for(let u of l.specifiers)C(r,u.local.name)===void 0&&t.sink.report(S.unknownName(u.local,u.local.name));}else if(i.type==="ExportDefaultDeclaration")y(i.declaration,r,t);else if(i.type==="FunctionDeclaration"){let l=y(i,r,t),u=$(i.id);u&&(r=I(r,{[u]:l}));}else if(i.type==="IfStatement"){let l=i,u=t.evolving.size||t.declaredMut.size?Os(r,t):null;if(a.push(...U(i,r,t)),u&&u.size){let c=st(l,u,t);c.size&&(r=W(r,Object.fromEntries(c)));}!l.alternate&&X(l.consequent)&&(r=W(r,ce(l.test,r,t.schemes).else));}else {a.push(...U(i,r,t));let l=tt(i,t);l&&(r=W(r,{[l.name]:l.type}));}}return {scope:r,returns:a}}function U(e,n,t){switch(e.type){case "ReturnStatement":{let s$1=e.argument,r=s$1?y(s$1,n,t):s.unknown;return h(t,e,r,n),[r]}case "IfStatement":{let s$1=e;y(s$1.test,n,t);let r=ce(s$1.test,n,t.schemes),a=U(s$1.consequent,W(n,r.then),t);return s$1.alternate&&a.push(...U(s$1.alternate,W(n,r.else),t)),h(t,e,s.unknown,n),a}case "BlockStatement":{let s=tn(e,n,t);return h(t,e,s,n),s.t==="unknown"?[]:[s]}case "ForStatement":case "WhileStatement":case "DoWhileStatement":{let s$1=e,r=n;s$1.init&&(s$1.init.type==="VariableDeclaration"?r=be(s$1.init,r,t):y(s$1.init,r,t)),s$1.test&&y(s$1.test,r,t),s$1.update&&y(s$1.update,r,t);let a=U(s$1.body,r,t);return h(t,e,s.unknown,n),a}case "ForOfStatement":case "ForInStatement":{let s$1=e,r=y(s$1.right,n,t),a=e.type==="ForOfStatement"?r.t==="array"?r.items:s.unknown:s.string,o=kn(s$1.left),i=o?I(n,{[o]:a}):n,l=U(s$1.body,i,t);return h(t,e,s.unknown,n),l}case "BreakStatement":case "ContinueStatement":return h(t,e,s.unknown,n),[];case "ThrowStatement":{let s$1=e.argument;return s$1&&y(s$1,n,t),h(t,e,s.unknown,n),[]}case "TryStatement":{let s$1=e,r=U(s$1.block,n,t);if(s$1.handler){let a=s$1.handler.param,o=a?$(a):null,i=o?I(n,{[o]:s.unknown}):n;r.push(...U(s$1.handler.body,i,t));}return s$1.finalizer&&r.push(...U(s$1.finalizer,n,t)),h(t,e,s.unknown,n),r}case "SwitchStatement":{let s$1=e;y(s$1.discriminant,n,t);let r=n,a=[];for(let o of s$1.cases){o.test&&y(o.test,r,t);let i=sn(o.consequent,r,t);r=i.scope,a.push(...i.returns);}return h(t,e,s.unknown,n),a}default:return y(e,n,t),[]}}function Us(e,n,t){let s$1=discover(e,[n],t.schemes);return s$1?s$1.type:s.unknown}function $s(e,n){let t=resolveTypeOp(s.index(e,s.literal(n)));return t.t==="index"?s.unknown:t}function Ls(e,n){if(e.t!=="object")return e;let t={};for(let s in e.props)n.includes(s)||(t[s]=e.props[s]);return s.object(t,e.index)}function Vs(e,n){return e.t==="tuple"?s.tuple(e.elements.slice(n)):e.t==="array"?e:s.array(s.unknown)}function Q(e,n,t,s$1,r){switch(e.type){case "Identifier":{let a=en(e,s$1,r)??n;t[e.name]=a,r.overlay.set(e,{type:a,scope:s$1});return}case "AssignmentPattern":{let a=e,o=widenType(y(a.right,s$1,r)),{type:i}=withoutUndefined(n),l=i.t==="unknown"?o:normalizeUnion([i,o]);Q(a.left,l,t,s$1,r);return}case "ObjectPattern":{let a=[];for(let o of e.properties){if(o.type==="RestElement"){Q(o.argument,Ls(n,a),t,s$1,r);continue}let i=o,l=ie(i);l!=null&&a.push(l);let u=l!=null?Us(n,l,r):s.unknown;Q(i.value,u,t,s$1,r);}return}case "ArrayPattern":{e.elements.forEach((a,o)=>{if(!a)return;let i=a;i.type==="RestElement"?Q(i.argument,Vs(n,o),t,s$1,r):Q(i,$s(n,o),t,s$1,r);});return}}}function rn(e,n,t){let s=L(n,t.schemes),a=(s.t==="union"?s.of.map(o=>L(o,t.schemes)):[s]).filter(o=>o.t==="object"&&!o.index);if(a.length&&!a.some(o=>Object.keys(o.props).length===0))for(let o of e.properties){if(o.type==="SpreadElement")continue;let i=o;if(i.computed)continue;let l=ie(i);if(l===null)continue;let u=a.filter(c=>l in c.props);if(!u.length){t.sink.report(S.excessProperty(i.key,l,n));continue}i.value.type==="ObjectExpression"&&rn(i.value,u[0].props[l].type,t);}}function be(e,n,t){let s$1={};for(let r of e.declarations){let a=r.id,o=$(a),i=en(a,n,t);if(!r.init){if(o&&e.kind!=="const"){i?(s$1[o]=i,xn(o,i,t)):(s$1[o]=s.undefined,t.evolving.add(o));continue}t.sink.report(S.constNeedsInit(r)),o&&(s$1[o]=i??s.unknown);continue}let l=i??(r.init.type==="ArrowFunctionExpression"?vn(r.init):null),u=o&&l?I(n,{[o]:l}):n,c,p=null;i?(J(r.init,i,u,t),r.init.type==="ObjectExpression"&&rn(r.init,i,t),c=i,p=i,(i.t==="union"||i.t==="boolean")&&r.init.type==="Literal"&&(c=nt(i,z(r.init),t.schemes))):(c=y(r.init,u,t),e.kind!=="const"&&(c=widenLiteral(c)),p=c),h(t,r,c,n),o?(s$1[o]=c,e.kind!=="const"&&p&&xn(o,p,t)):Q(a,c,s$1,n,t);}return h(t,e,s.unknown,n),I(n,s$1)}function xn(e,n,t){(n.t==="union"||n.t==="boolean")&&t.declaredMut.set(e,n);}function xs(e,n,t){let s$1=y(e.left,n,t),r=y(e.right,n,t),a=e.operator;return a==="+"?subtype(s$1,s.string)||subtype(r,s.string)?s.string:s.number:Ks.has(a)?s.number:s.boolean}var Gn={string:s.literal(""),number:s.literal(0),boolean:s.literal(false)},_e=e=>e.t==="null"||e.t==="undefined";function Gs(e,n,t){if(n.t==="any"||n.t==="unknown")return normalizeUnion([n,t]);let s$1=n.t==="union"?[...n.of]:n.t==="boolean"?[s.literal(true),s.literal(false)]:[n];if(e==="??")return normalizeUnion([...s$1.filter(a=>!_e(a)),t]);if(e==="||")return normalizeUnion([...s$1.filter(a=>!_e(a)&&!(a.t==="literal"&&!a.value)),t]);let r=s$1.flatMap(a=>_e(a)?[a]:a.t==="literal"?a.value?[]:[a]:Gn[a.t]?[Gn[a.t]]:[]);return normalizeUnion([...r,t])}var Ks=new Set(["-","*","/","%","**","&","|","^","<<",">>",">>>"]),Ws=s.union(["string","number","bigint","boolean","symbol","undefined","object","function"].map(e=>s.literal(e)));function Js(e,n,t){let s$1=y(e.argument,n,t);switch(e.operator){case "!":return s$1.t==="literal"?{t:"literal",value:!s$1.value,fresh:true}:s.boolean;case "-":return s$1.t==="literal"&&typeof s$1.value=="number"?{t:"literal",value:-s$1.value,fresh:true}:s.number;case "+":case "~":return s.number;case "typeof":return Ws;case "delete":return s.boolean;case "void":return s.undefined;default:return s.unknown}}function qs(e,n,t){let s={},r,a=[],o=[],i=false,l=false;for(let u of e.properties){let c=u;if(c.type==="SpreadElement"){let g=L(y(c.argument,n,t),t.schemes);if(g.t==="object"){for(let E in g.props)s[E]=g.props[E];g.index&&(r={key:g.index.key,type:g.index.value});}continue}let p=c,m=y(p.value,n,t),f=widen(m);if(h(t,c,m,n),p.computed){let g=L(y(p.key,n,t),t.schemes);g.t==="literal"&&typeof g.value=="string"?(s[g.value]={type:f},a.push(f)):g.t==="literal"&&typeof g.value=="number"?(s[String(g.value)]={type:f},a.push(f),o.push(f)):g.t==="string"?(i=true,a.push(f)):g.t==="number"&&(l=true,a.push(f),o.push(f));continue}let N=ie(p);N!==null&&(s[N]={type:f},a.push(f),/^\d+$/.test(N)&&o.push(f));}return i?r={key:"string",type:normalizeUnion(a)}:l&&(r={key:"number",type:normalizeUnion(o)}),r?{t:"object",props:s,index:{key:r.key,value:r.type}}:{t:"object",props:s}}function rt(e,n,t){let s$1=[];for(let r of e.elements){if(!r)continue;let a=r;if(a.type==="SpreadElement"){let o=L(y(a.argument,n,t),t.schemes);o.t==="array"?s$1.push(o.items):o.t==="tuple"&&s$1.push(...o.elements);continue}s$1.push(widen(y(a,n,t)));}return s.array(s$1.length?normalizeUnion(s$1):s.unknown)}function an(e,n,t,s$1){let r=L(n,s$1.schemes),a=e.elements,o=a.every(l=>l&&l.type!=="SpreadElement"),i=(l,u)=>l.type==="ArrayExpression"?an(l,u,t,s$1):widen(y(l,t,s$1));if(r.t==="tuple"&&o&&a.length===r.elements.length){let l=a.map((u,c)=>i(u,r.elements[c]));return h(s$1,e,{t:"tuple",elements:l},t)}if(r.t==="array"){let l=[];for(let u of a){if(!u)continue;let c=u;if(c.type==="SpreadElement"){y(c.argument,t,s$1);continue}l.push(i(c,r.items));}return h(s$1,e,s.array(l.length?normalizeUnion(l):s.unknown),t)}return rt(e,t,s$1)}function Qe(e,n,t,s$1){if(e===null)return s.null;switch(typeof e){case "string":return s.string;case "number":return s.number;case "boolean":return s.boolean;case "object":break;default:return s.unknown}if(Array.isArray(e)){let o=e.map(i=>Qe(i,n,t,s$1));return s.array(o.length?normalizeUnion(o):s.unknown)}let r=e;if(AST_MARKER in r){let o;try{o=fromJson(r);}catch{return t.sink.report(S.unsupported(s$1,`'#ast: ${String(r[AST_MARKER])}'`)),s.unknown}return y(o,n,t)}let a={};for(let o of Object.keys(r))a[o]={type:Qe(r[o],n,t,s$1)};return {t:"object",props:a}}var _s=(e,n)=>({...e,typeAnnotation:n}),zs=(e,n)=>({...e,returnType:n}),Xs=(e,n)=>({type:"TSAsExpression",expression:e,typeAnnotation:n});function at(e,n){return e.get(n)?.type}function Qs(e,n){return e.get(n)?.scope}function Ys(e,n){let t=e.get(n)?.type;return t?discover(t,[])?.completions??[]:[]}function Hs(e,n){let t=e.get(n)?.scope;return t?[...Ee(t)].map(([s,r])=>({key:s,type:r,optional:false})):[]}var Zs=e=>e.type==="ArrowFunctionExpression"||e.type==="FunctionExpression"||e.type==="FunctionDeclaration";function er(e){if(!e||e.computed)return;let n=e.key;if(n?.type==="Identifier")return n.name;if(n?.type==="Literal"&&typeof n.value=="string")return n.value}function ln(e,n,t,s={}){let r=e[n],a=e[n+1];if(!(!r||!a))switch(a.type){case "ArrowFunctionExpression":case "FunctionExpression":return a.body===r?a.returnType:void 0;case "VariableDeclarator":return a.init===r?a.id?.typeAnnotation:void 0;case "TSAsExpression":return a.typeAnnotation;case "ReturnStatement":return e.slice(n+1).find(Zs)?.returnType;case "CallExpression":case "NewExpression":{let o=(a.arguments??[]).indexOf(r);if(o<0)return;let i=at(t,a.callee);return i?.t==="fn"?i.params?.[o]?.type:void 0}case "Property":{if(a.value!==r||e[n+2]?.type!=="ObjectExpression")return;let i=ln(e,n+2,t,s),l=er(a);return !i||!l?void 0:discover(i,[l],s)?.type}case "ArrayExpression":{let o=ln(e,n+1,t,s);return o?discover(o,["[]"],s)?.type:void 0}default:return}}function nr(e,n){return e.filter(t=>t.node===n)}export{yn as FUNCTION_KINDS,_s as annotate,zs as annotateReturn,Xs as asExpression,Ce as calleeAllowlist,De as capabilityNodes,qn as check,I as childScope,Rt as collectBindings,Ve as collectMutations,$e as collectUnused,ln as contextualTypeAt,ct as createEnv,ne as createSink,S as diag,nr as diagnosticsAt,ds as extractModuleType,bt as fromCapability,Ae as guard,me as guardsFromCompiled,C as lookup,v as makeDiagnostic,Ie as maxArgs,Re as maxCallNesting,Pe as maxDepth,Te as maxFunctionNesting,fe as maxNestingOf,Fe as maxNodes,Ys as memberCompletions,Me as memberDepth,pt as resolveNamed,dt as resolveScheme,Oe as resultType,dn as rootScope,Qs as scopeAt,Hs as scopeCompletions,at as typeAt,Ee as visibleNames};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tslite/checker",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "TSLite type system — a structural type checker over the AST (the 'TypeScript of TSLite')",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -39,13 +39,13 @@
|
|
|
39
39
|
"access": "public"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@tslite/
|
|
42
|
+
"@tslite/codec": "0.2.1",
|
|
43
|
+
"@tslite/core": "0.3.0",
|
|
43
44
|
"@tslite/capability": "0.2.0",
|
|
44
|
-
"@tslite/
|
|
45
|
-
"@tslite/type-core": "0.2.0"
|
|
45
|
+
"@tslite/type-core": "0.3.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@tslite/parser": "0.
|
|
48
|
+
"@tslite/parser": "0.4.0"
|
|
49
49
|
},
|
|
50
50
|
"scripts": {
|
|
51
51
|
"build": "tsup",
|