@tslite/checker 1.8.0 → 1.12.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.d.ts CHANGED
@@ -1,1078 +1 @@
1
- import { VarSchema, Schema, Schemes, TypeScheme, ObjectSchema, Completion } from './types/index.js';
2
- export { AnySchema, ApplySchema, ArraySchema, Bindings, Candidates, DEFAULT_TYPE_LIMITS, Discovery, ElementFlag, FnSchema, GuardSig, INSTANTIATION_COUNT_LIMIT, INSTANTIATION_DEPTH_LIMIT, Incompatibility, IncompatibilityKind, IndexSchema, InferencePriority, Instantiation, InstantiationLimitError, KeyofSchema, LiteralSchema, MappedSchema, OverloadSchema, Param, PathSegment, Prop, ScalarSchema, TYPE_EVAL_DEPTH_LIMIT, TupleSchema, TypeEvalLimitError, TypeEvalLimits, TypeForm, TypePosition, UnionSchema, UnionTooComplexError, UnknownSchema, VarCandidates, WriteKey, apparentType, asLiteralOrigin, baseLiteralType, bindTypeParams, comparable, configureTypeLimits, contravariantInference, covariantInference, createInferences, discover, equals, erasedSignature, expand1, flagAt, format, formatTypeArgs, formatTypeDiff, freeVars, groundVars, inferFromCandidates, inferTypes, inferredBindings, inferredTypes, instantiateInContextOf, instantiateLoose, isMissingType, isNumericLiteralName, isObjectOrArrayLiteral, isScheme, isSerializable, isVariadicTuple, join, joinAll, missingType, normalizeUnion, ownProp, readonlyMember, renameTypeParams, resetInstantiationCount, resetTypeLimits, resolveConditional, resolveOp, resolveTypeOp, restIndex, restTypeAtPosition, s, sampleValue, silentNever, substitute, subtype, typeAtPosition, typeDiff, typeFeatures, typeLimits, typeNameOf, typeNeedsParens, typeParamArity, version, widen, widenInferred, widenLiteral, widenOrigin, widenType, withUndefined, withoutUndefined } from './types/index.js';
3
- import { BaseNode, Scope as Scope$1, Node, types, SourceLocation, Expression } from '@tslite/ast';
4
- import { CapabilityProfile, CompiledProfile } from '@tslite/capability';
5
- import { Span } from '@tslite/language-service';
6
-
7
- /** As declarações de tipo nominal: o nome e os type params, em ordem. */
8
- type Nominals = Readonly<Record<string, readonly VarSchema[]>>;
9
-
10
- /** O que uma declaração de namespace declara com um nome. */
11
- interface NamespaceMember {
12
- /** Visível de fora: tem `export`, ou está num contexto ambiente que exporta tudo. */
13
- readonly exported: boolean;
14
- /** O nome, onde o diagnóstico sobre a declaração pousa; `null` num membro do ambiente,
15
- * que não tem texto. */
16
- readonly id: BaseNode | null;
17
- /** A chave do tipo no catálogo, quando não é o nome qualificado (`path.nome`): a de um
18
- * tipo que outra declaração do mesmo namespace também declara (checker D88). */
19
- readonly key?: string;
20
- }
21
- /** Uma declaração de namespace — um bloco. `namespace A.B { … }` são duas: o `A` e o `B`. */
22
- interface NamespaceDeclaration {
23
- /** O `TSModuleDeclaration`; `null` num namespace do ambiente, que vem das chaves do
24
- * catálogo e não de texto. */
25
- readonly node: BaseNode | null;
26
- /** O caminho qualificado (`app.router`). */
27
- readonly path: string;
28
- /** A declaração de fora, ou `null` no topo. */
29
- readonly parent: NamespaceDeclaration | null;
30
- /** No contexto ambiente (`declare namespace`, e o que está dentro dele). */
31
- readonly ambient: boolean;
32
- /** O bloco tem valores (o `Instantiated` do `getModuleInstanceState`). */
33
- readonly instantiated: boolean;
34
- /** Os tipos que ESTE bloco declara (os locais do tsc, com o sentido de tipo). Um tipo e
35
- * um namespace com o mesmo nome convivem, por isso as duas tabelas. */
36
- readonly types: ReadonlyMap<string, NamespaceMember>;
37
- /** Os namespaces que ESTE bloco declara. */
38
- readonly namespaces: ReadonlyMap<string, NamespaceMember>;
39
- }
40
- /** As declarações de namespace de uma raiz — o programa, ou o ambiente. */
41
- interface Namespaces {
42
- /** As declarações de cada namespace, pelo caminho, na ordem. */
43
- readonly byPath: ReadonlyMap<string, readonly NamespaceDeclaration[]>;
44
- /** A declaração de cada nó `TSModuleDeclaration` que está num lugar permitido. */
45
- readonly byNode: WeakMap<BaseNode, NamespaceDeclaration>;
46
- /** Os aliases escritos num namespace: o nó da declaração do alias → a do namespace. */
47
- readonly aliasOwner: WeakMap<BaseNode, NamespaceDeclaration>;
48
- }
49
-
50
- /**
51
- * Um nível de escopo léxico (nome → `Schema`), sobre o `Scope<T>` genérico do
52
- * `ast` — a mesma cadeia que o `behavior` usa, com o payload do eixo de tipos.
53
- */
54
- type Scope = Scope$1<Schema>;
55
- /** Cria um escopo raiz (sem pai). */
56
- declare const rootScope: (vars?: Record<string, Schema>) => Scope;
57
- /** Estende `parent` com novos bindings, criando um escopo filho. */
58
- declare const childScope: (parent: Scope, vars: Record<string, Schema>) => Scope;
59
- /** Resolve `name` subindo a cadeia léxica. `undefined` se não existir. */
60
- declare const lookup: (scope: Scope, name: string) => Schema | undefined;
61
- /**
62
- * Todos os nomes visíveis a partir de `scope`, com shadowing — o binding mais
63
- * interno vence. É o que alimenta o autocomplete de identificadores. Duas
64
- * chaves moram no mesmo escopo e não são nomes: a que tem `.` é um caminho
65
- * estreitado por guard (`narrow`, D13), e a que termina em `#` é o tipo
66
- * DECLARADO de um binding mutável (D63) — nenhum identificador tem esses
67
- * caracteres.
68
- *
69
- * Um binding do programa tem a chave do SÍMBOLO (`nome@id`, D87), e dois símbolos com
70
- * o mesmo nome são chaves diferentes: o nome visível é o de fora do `@`, e vale o mais
71
- * interno. A cadeia vem de dentro para fora, e um refinamento de um símbolo só existe
72
- * onde o nome dele não está sombreado — então a primeira chave de cada nome é a que ele
73
- * denota ali.
74
- */
75
- declare const visibleNames: (scope: Scope) => Map<string, Schema>;
76
- /**
77
- * `name`, visto de `scope`, denota um nome do AMBIENTE (a DI, a lib) — e não um símbolo
78
- * do programa? É o que o tsc responde olhando a declaração do símbolo resolvido (o
79
- * `defaultLibrary` do `classifier2020`). A primeira ligação do nome, de dentro para fora, é
80
- * a que ele denota ali (ver `visibleNames`); `false` quando nada o liga.
81
- */
82
- declare function resolvesToEnvironment(scope: Scope, name: string): boolean;
83
- /**
84
- * O ambiente injetado pela aplicação — a fronteira de tipos do sistema.
85
- * `scope` é a raiz da DI; `types` resolve tipos nomeados em anotações.
86
- */
87
- /**
88
- * O ambiente é **só tipos** (a fronteira da DI). Capability — o que pode ser
89
- * programado — é ortogonal e mora no `CapabilityProfile` (`@tslite/capability`),
90
- * passado ao `check` por `{ profile }`. Não há mais noção de capability no Env.
91
- */
92
- interface Env {
93
- readonly scope: Scope;
94
- readonly types: Readonly<Record<string, Schema>>;
95
- /** Type schemes parametrizados (`type Pair<A, B> = …`), expandidos sob demanda. */
96
- readonly schemes: Schemes;
97
- /**
98
- * Acessores **indexados por path literal**: nome → schema-base que ele navega.
99
- * Ex.: `get` sobre o schema dos States → `get("hp","value")` tipa como
100
- * `discover(base, ["hp","value"])`. É como a fronteira tipa leituras de estado
101
- * sem `unknown` (o app declara o shape; o checker indexa). Default: nenhum.
102
- */
103
- readonly accessors?: Readonly<Record<string, Schema>>;
104
- /**
105
- * **Asserters** (a fronteira sã): nomes de funções cujo retorno é o **tipo do
106
- * schema nomeado** no 1º argumento. Ex.: com `parse` aqui, `parse(User, x)`
107
- * tipa como `User` (e em runtime o `@tslite/validate` valida o valor). É o
108
- * `parse()` estilo zod: fecha `unknown`/complexidade — o tipo "reseta" limpo
109
- * na fronteira, **provado** em runtime (≠ `as`). Default: nenhum.
110
- */
111
- readonly asserters?: ReadonlySet<string>;
112
- /**
113
- * **Matchers de props** (o diferencial): nomes de funções que checam, em
114
- * edit-time, se um **payload** (saída de um serviço de automação / nocode) é
115
- * **compatível com as props de um componente** react-like. Ex.: com
116
- * `matchesProps` aqui, `matchesProps(Card, request)` extrai as props de `Card`
117
- * (`(props) => Element`, agnóstico ao framework — Element é `apply` opaco) e
118
- * verifica `request ≤ props` (campos a mais no request são OK; faltar/tipo-errado
119
- * em prop obrigatória → diagnóstico `props-mismatch`). Retorna `boolean`. Default:
120
- * nenhum.
121
- */
122
- readonly matchers?: ReadonlySet<string>;
123
- /**
124
- * **Módulos** (a borda DI NOMEADA): especificador → o `object` Schema dos
125
- * exports daquele módulo (`{ map: fn, filter: fn, …, default: … }`). É o D3
126
- * estendido a módulos: `import { map } from "@x/ops"` liga `map` ao
127
- * `modules["@x/ops"].props.map`. O checker **não resolve** o módulo (sem file
128
- * system) — consome o tipo já provido; a *resolução* (qual módulo é o
129
- * especificador) é da app (Proposal 005). Default: nenhum.
130
- */
131
- readonly modules?: Readonly<Record<string, Schema>>;
132
- /**
133
- * Os aliases da **lib padrão** (`Partial`, `Pick`, `Record`, `Omit`, `ReturnType`…),
134
- * o texto do `lib.es5.d.ts` do tsc 3.9.10 com o corte do TSLite (D79). Ficam ABAIXO
135
- * de tudo: um tipo do host ou um alias do programa com o mesmo nome os sombreia.
136
- * Vazio com `noLib`.
137
- */
138
- readonly lib?: Schemes;
139
- /**
140
- * Os tipos **nominais** que um texto de tipo pode citar pelo nome: o nome e os type
141
- * params de cada um. São os `interface` da lib (`Array`, `ReadonlyArray`, `Promise`)
142
- * e os que o host declara (`Map`, `Element`…). Um nominal é o `apply` opaco (types
143
- * TC2): o texto `Promise<User>` e o construtor `s.apply("Promise", [User])` são o
144
- * mesmo tipo, e a aridade é cobrada como a de um alias.
145
- */
146
- readonly nominals?: Nominals;
147
- /**
148
- * Os namespaces do ambiente (D83), lidos das chaves de `types` e `schemes`: um tipo com o
149
- * nome qualificado (`state.Config`) é o membro `Config` do namespace `state`, como num
150
- * `.d.ts` com `declare namespace state { … }`. Os corpos já chegam com os nomes
151
- * resolvidos a partir do namespace de cada um — um `Config` no corpo de `state.Result` é
152
- * o `state.Config` —, sem o host reescrever nada.
153
- */
154
- readonly namespaces?: Namespaces;
155
- }
156
- /**
157
- * O que um `Env` tem além das variáveis. Cada campo espelha o de {@link Env}, e
158
- * todos são opcionais.
159
- */
160
- interface EnvOptions {
161
- readonly types?: Readonly<Record<string, Schema>>;
162
- readonly schemes?: Readonly<Record<string, TypeScheme>>;
163
- readonly accessors?: Readonly<Record<string, Schema>>;
164
- readonly asserters?: ReadonlySet<string>;
165
- readonly matchers?: ReadonlySet<string>;
166
- readonly modules?: Readonly<Record<string, Schema>>;
167
- /** Os nominais do host, somados aos da lib (ver {@link Env.nominals}). */
168
- readonly nominals?: Nominals;
169
- /**
170
- * Sem a lib padrão — nem os aliases, nem os nominais dela. É o `--noLib` do tsc: os
171
- * nomes da lib passam a ser `unknown-name`, como lá.
172
- */
173
- readonly noLib?: boolean;
174
- }
175
- /**
176
- * Um catálogo (`Record<string, Schema>`) passado no lugar das opções é o erro que a
177
- * forma antiga convida (`createEnv(vars, types)`), e o TypeScript o aceitaria em
178
- * silêncio: um tipo com índice de string cabe num objeto de opções todas
179
- * opcionais. Este tipo o recusa na compilação — `keyof` de um catálogo é `string`.
180
- */
181
- type NoCatalog<O> = string extends keyof O ? never : unknown;
182
- /**
183
- * Cria um `Env`: as variáveis injetadas (a raiz da DI) e, por nome, o resto —
184
- * tipos nomeados, type schemes, acessores, asserters, matchers, módulos.
185
- * Capability é separada (passe um `profile` ao `check`).
186
- *
187
- * As opções são NOMEADAS porque a forma posicional já custou um defeito: uma
188
- * chamada que parava no quarto argumento compilava, e o asserter (o quinto) ficava
189
- * fora do ambiente — `parseAs` virava `unknown-name` só naquele lugar. Uma chave
190
- * fora do vocabulário (um catálogo no lugar das opções, um `type` no lugar de
191
- * `types`) é `invalid-env-options`, na montagem: o `Env` não nasce com uma metade
192
- * calada.
193
- */
194
- declare const createEnv: <O extends EnvOptions = EnvOptions>(vars?: Readonly<Record<string, Schema>>, options?: O & NoCatalog<O>) => Env;
195
- /** Os erros que a MONTAGEM do ambiente lança (o `check` em si nunca lança — D2). */
196
- type CheckerErrorCode = "invalid-env-options";
197
- /** Resolve um tipo nomeado (`type User = …`) declarado no ambiente. */
198
- declare const resolveNamed: (env: Env, name: string) => Schema | undefined;
199
- /** Resolve um type scheme (`type Pair<A, B> = …`) declarado no ambiente. */
200
- declare const resolveScheme: (env: Env, name: string) => TypeScheme | undefined;
201
-
202
- type Severity = "error" | "warning";
203
- type DiagnosticCode = "not-assignable" | "unknown-name" | "not-callable" | "no-such-member" | "not-object" | "possibly-nullish" | "unknown-value" | "const-needs-init" | "cannot-redeclare" | "circular-type-alias" | "circular-type-annotation" | "unknown-module" | "not-a-schema" | "type-as-value" | "asserter-needs-name" | "shadows-schema" | "missing-argument" | "excess-argument" | "excess-property" | "spread-argument" | "required-after-optional" | "not-iterable" | "not-spreadable" | "overwritten-property" | "implicit-any" | "props-mismatch" | "no-matching-overload" | "constraint-violation" | "wrong-type-argument-count" | "unsupported" | "unused-name" | "assign-to-const" | "for-in-destructuring" | "for-in-not-object" | "readonly-write" | "cast-unsound" | "unprovable-value" | "not-arithmetic-operand" | "operator-not-applicable" | "no-overlap" | "uncalled-function-check" | "not-comparable" | "misplaced-namespace" | "ambient-initializer" | "ambient-statement" | "used-before-assigned" | "used-before-declaration" | "implicit-coercion" | "node-not-allowed" | "name-not-allowed" | "type-feature-not-allowed" | "any-not-allowed" | "narrowing-cast-not-allowed" | "too-deep" | "too-complex-union" | "too-large" | "wrong-result-type";
204
- /**
205
- * A **classe** do diagnóstico — espelha a divisão de passes do `tsc` (que nós
206
- * fundimos num walk só): `semantic` é o que o **binder** do tsc pega (validade do
207
- * programa, independe de tipos — nome inexistente, redeclaração, módulo, `const`
208
- * sem init, recurso fora da Linguagem); `type` é o que o **checker** de tipos pega
209
- * (relações/compatibilidade); `capability` é política/limite (feature gated, caps).
210
- * O `kind` deriva do `code` (fonte única, mapa `KIND`) — o consumidor (editor/nocode)
211
- * distingue "isto é programa inválido" de "isto é incompatibilidade de tipo".
212
- */
213
- type DiagnosticKind = "semantic" | "type" | "capability";
214
- /**
215
- * Uma propriedade que o tipo esperado exige e o valor não tem.
216
- *
217
- * O `type` é o ESPERADO — é o que permite a quem corrige inserir um valor
218
- * plausível (`""`, `0`, `[]`) em vez de um buraco.
219
- */
220
- interface MissingProperty {
221
- readonly name: string;
222
- readonly type: Schema;
223
- }
224
- /**
225
- * Dado ESTRUTURADO do erro, para quem vai **agir** sobre ele.
226
- *
227
- * É o campo `data` do LSP, que existe exatamente para isto: levar informação do
228
- * diagnóstico até o code action, sem que ninguém precise reconstruí-la. Aqui a
229
- * motivação é concreta — o `notAssignable` já roda o `typeDiff` para escrever a
230
- * mensagem; jogar o resultado fora obrigaria a camada de correção a recomputá-lo,
231
- * e ela **não tem como**: o tipo ESPERADO não está no overlay.
232
- */
233
- type DiagnosticData = {
234
- readonly kind: "missing-properties";
235
- /** As propriedades ausentes na RAIZ do valor (as aninhadas ficam de fora). */
236
- readonly properties: readonly MissingProperty[];
237
- } | {
238
- /**
239
- * `implicit-coercion` (D40): o `+` recusou uma mistura, ou um template
240
- * recebeu algo que não converte.
241
- *
242
- * `textConvertible` diz se o valor culpado **poderia** virar texto (escalar)
243
- * ou se é ESTRUTURA. É o que decide o conserto, e por isso vem estruturado em
244
- * vez de deduzido da prosa: com escalar o auto-fix propõe template literal;
245
- * com estrutura, template não conserta nada — só moveria o erro —, e o
246
- * caminho é `stringify`.
247
- */
248
- readonly kind: "implicit-coercion";
249
- readonly textConvertible: boolean;
250
- };
251
- /**
252
- * Outro lugar do programa que explica o diagnóstico — o `DiagnosticRelatedInformation` do
253
- * tsc (`types.ts`), que o `addRelatedInfo` anexa, e o `relatedInformation` do LSP. O nó é
254
- * por referência, como o do diagnóstico; a mensagem diz o papel dele ("This spread always
255
- * overwrites this property.").
256
- */
257
- interface DiagnosticRelatedInformation {
258
- readonly node: BaseNode;
259
- readonly message: string;
260
- }
261
- interface Diagnostic {
262
- readonly code: DiagnosticCode;
263
- /** A classe do diagnóstico (deriva do `code`) — ver {@link DiagnosticKind}. */
264
- readonly kind: DiagnosticKind;
265
- readonly severity: Severity;
266
- /** O nó culpado — identidade por referência. */
267
- readonly node: BaseNode;
268
- readonly message: string;
269
- /** Ver {@link DiagnosticData}. Presente só onde há o que agir. */
270
- readonly data?: DiagnosticData;
271
- /** Ver {@link DiagnosticRelatedInformation}. Presente só onde o tsc a anexa. */
272
- readonly relatedInformation?: readonly DiagnosticRelatedInformation[];
273
- }
274
- /**
275
- * Builder genérico de diagnóstico (severidade configurável). Usado pelos
276
- * guardrails, que têm seu próprio catálogo de mensagens em `guard`. O `kind`
277
- * deriva do `code` (mesma fonte única).
278
- */
279
- declare const makeDiagnostic: (code: DiagnosticCode, node: BaseNode, message: string, severity?: Severity) => Diagnostic;
280
- /**
281
- * Fábricas de diagnósticos. Mensagens no estilo do tsc, com tipos renderizados
282
- * por `format`.
283
- */
284
- declare const diag: {
285
- notAssignable: (node: BaseNode, actual: Schema, expected: Schema, schemes?: Schemes) => Diagnostic;
286
- unknownName: (node: BaseNode, name: string) => Diagnostic;
287
- notCallable: (node: BaseNode, type: Schema) => Diagnostic;
288
- noSuchMember: (node: BaseNode, type: Schema, key: string) => Diagnostic;
289
- notObject: (node: BaseNode, type: Schema) => Diagnostic;
290
- /**
291
- * Ler ou chamar através de um valor que pode ser `null`/`undefined` — o
292
- * `checkNonNullTypeWithReporter` do tsc (`checker.ts:24098`), que tem uma mensagem por
293
- * combinação, e a variante "Cannot invoke" quando o valor é chamado.
294
- */
295
- possiblyNullish: (node: BaseNode, nullish: {
296
- readonly null: boolean;
297
- readonly undefined: boolean;
298
- }, invoked?: boolean) => Diagnostic;
299
- /**
300
- * Usar um valor `unknown` como objeto — ler dele, chamá-lo, indexá-lo ou operar
301
- * sobre ele. É o mesmo `checkNonNullTypeWithReporter` (`checker.ts:24102`), no ramo
302
- * que vem ANTES do nullish e em três linhas:
303
- *
304
- * if (strictNullChecks && type.flags & TypeFlags.Unknown) {
305
- * error(node, Diagnostics.Object_is_of_type_unknown);
306
- * return errorType;
307
- * }
308
- *
309
- * Um código só e uma mensagem só, para os seis usos (o TS2571 da 3.9.10 — o
310
- * TS18046 é de versão posterior e não existe na tag).
311
- */
312
- unknownValue: (node: BaseNode) => Diagnostic;
313
- constNeedsInit: (node: BaseNode) => Diagnostic;
314
- missingArgument: (node: BaseNode, name: string, expected: Schema) => Diagnostic;
315
- notASchema: (node: BaseNode, name: string) => Diagnostic;
316
- typeAsValue: (node: BaseNode, name: string) => Diagnostic;
317
- asserterNeedsName: (node: BaseNode, asserter: string) => Diagnostic;
318
- shadowsSchema: (node: BaseNode, name: string) => Diagnostic;
319
- unknownModule: (node: BaseNode, source: string) => Diagnostic;
320
- /**
321
- * O mesmo nome declarado de novo onde não pode, com o texto de cada mecanismo do tsc
322
- * 3.9.10. O conceito é um só, o do `cannot-redeclare` (D2), e o nó é o NOME de cada
323
- * declaração acusada.
324
- */
325
- redeclaration: {
326
- /** TS2451: o que está na tabela é variável de escopo de bloco (o `declareSymbol` do
327
- * binder, `binder.ts:476`), em cada declaração. */
328
- blockScoped: (node: BaseNode, name: string) => Diagnostic;
329
- /** TS2300: o que está na tabela é outra coisa (um parâmetro, um import, um alias, um
330
- * namespace), em cada declaração. */
331
- duplicate: (node: BaseNode, name: string) => Diagnostic;
332
- /** TS2440: o import fundido com uma declaração local que ocupa o significado do alvo
333
- * dele (o `checkAliasSymbol`, `checker.ts:34279`), no especificador. */
334
- importConflict: (node: BaseNode, name: string) => Diagnostic;
335
- /** TS2492: o bloco do `catch` declara de novo o binding dele (o `checkTryStatement`,
336
- * `checker.ts:33056`), na declaração do bloco. */
337
- catchClause: (node: BaseNode, name: string) => Diagnostic;
338
- /** TS2395: declarações do mesmo símbolo, umas exportadas e outras locais, no mesmo
339
- * espaço (o `checkExportsOnMergedDeclarations`, `checker.ts:30401`), em cada uma. */
340
- mixedExport: (node: BaseNode, name: string) => Diagnostic;
341
- };
342
- circularTypeAlias: (node: BaseNode, name: string) => Diagnostic;
343
- circularTypeAnnotation: (node: BaseNode, name: string) => Diagnostic;
344
- excessArgument: (node: BaseNode, expected: number, got: number) => Diagnostic;
345
- /**
346
- * A ARIDADE de uma chamada, com o texto do `getArgumentArityError` do tsc
347
- * (`checker.ts:25477`): `Expected {range} arguments, but got {got}.` (TS2554), e
348
- * `Expected at least {min} arguments, but got {got}.` quando a assinatura tem rest
349
- * (TS2555). O `range` é `min` ou `min-max`, e o plural é sempre plural, como lá.
350
- *
351
- * O CÓDIGO continua dizendo a direção — `missing-argument` quando faltam, e
352
- * `excess-argument` quando sobram —, que é informação que o texto do tsc perdeu ao
353
- * usar um único TS2554 para os dois. A régua é a D2: o código é o contrato, a mensagem
354
- * é prosa.
355
- */
356
- argumentArity: (node: BaseNode, range: string, got: number, kind: "missing" | "excess", atLeast?: boolean) => Diagnostic;
357
- excessProperty: (node: BaseNode, name: string, target: Schema) => Diagnostic;
358
- spreadArgument: (node: BaseNode) => Diagnostic;
359
- requiredAfterOptional: (node: BaseNode) => Diagnostic;
360
- notIterable: (node: BaseNode, type: Schema) => Diagnostic;
361
- /**
362
- * A fonte não se espalha: o `isValidSpreadType` do tsc (`checker.ts:23342`) a recusa. O
363
- * código é o do conceito, par do `not-iterable` do padrão de array; a mensagem diz o caso.
364
- */
365
- notSpreadable: {
366
- /** TS2700: o rest de um padrão de objeto (`{ a, ...rest }`), no elemento do rest
367
- * (`getTypeForBindingElement`, `checker.ts:7439`). D80. */
368
- rest: (node: BaseNode) => Diagnostic;
369
- /** TS2698: o spread num literal de objeto (`{ ...x }`), no membro `...x`
370
- * (`checkObjectLiteral`, `checker.ts:23254`). */
371
- spread: (node: BaseNode) => Diagnostic;
372
- };
373
- /**
374
- * A chave escrita duas vezes num literal de objeto. O tsc a acusa por três mecanismos, e
375
- * cada um é um diagnóstico com o texto e o nó dele; o conceito é um só, o do
376
- * `cannot-redeclare` (D25).
377
- */
378
- duplicateKey: {
379
- /** TS1117: a chave IDENTIFICADOR repetida, no modo estrito (o `bindObjectLiteralExpression`
380
- * do binder, `binder.ts:2037`), na repetição. */
381
- strict: (node: BaseNode) => Diagnostic;
382
- /** TS2300: o nome repetido (o `checkGrammarObjectLiteralExpression`), na repetição, com o
383
- * texto do nome como escrito. */
384
- identifier: (node: BaseNode, text: string) => Diagnostic;
385
- /** TS2718: a chave computada ligada tarde com o nome de uma prop ligada cedo (o
386
- * `lateBindMember`), na chave tardia. */
387
- lateBound: (node: BaseNode, name: string) => Diagnostic;
388
- /** TS2733: a primeira declaração ligada cedo desse nome, no mesmo `lateBindMember`. */
389
- alsoDeclared: (node: BaseNode, name: string) => Diagnostic;
390
- };
391
- /**
392
- * TS2783: a prop escrita num literal de objeto que um spread seguinte sempre sobrescreve,
393
- * na prop escrita, com o spread na informação relacionada (TS2785) — o
394
- * `checkSpreadPropOverrides` do tsc (`checker.ts:23558`).
395
- */
396
- overwrittenProperty: (node: BaseNode, name: string, spread: BaseNode) => Diagnostic;
397
- /**
398
- * O `any` que ninguém escreveu — o `noImplicitAny` do tsc 3.9.10, que faz parte do
399
- * `--strict` e está sempre ligado aqui (D81). Um código só, com o texto de cada caso (o
400
- * `reportImplicitAny`, `checker.ts:18198`, e os sítios do acesso e do `let` evolving): o
401
- * código é o conceito, a mensagem diz qual é o caso (D2), como o `possibly-nullish`.
402
- */
403
- implicitAny: {
404
- /** TS7006, no nome do parâmetro sem anotação e sem contexto. */
405
- parameter: (node: BaseNode, name: string) => Diagnostic;
406
- /** TS7019, no nome do rest sem anotação e sem contexto. */
407
- rest: (node: BaseNode, name: string) => Diagnostic;
408
- /** TS7031, em cada folha de um parâmetro-padrão sem anotação nem contexto. */
409
- bindingElement: (node: BaseNode, name: string) => Diagnostic;
410
- /** TS7034, no nome do `let` evolving que uma closure lê. */
411
- evolving: (node: BaseNode, name: string) => Diagnostic;
412
- /** TS7005, na leitura desse `let` dentro da closure. */
413
- variable: (node: BaseNode, name: string) => Diagnostic;
414
- /** TS7053, no acesso inteiro: a chave não indexa o objeto. */
415
- index: (node: BaseNode, key: Schema, target: Schema) => Diagnostic;
416
- /** TS7015, na chave: o objeto só tem índice numérico, e a chave não é número. */
417
- indexNotNumber: (node: BaseNode) => Diagnostic;
418
- };
419
- /**
420
- * A posição de um padrão de array além do comprimento de uma tupla — o TS2493 do tsc, no
421
- * nome (`getPropertyTypeForIndexType`, `checker.ts:12886`). O código é o `no-such-member`,
422
- * o mesmo do acesso `t[5]` (TC43): a posição é uma propriedade que a tupla não tem.
423
- */
424
- tupleIndexOutOfRange: (node: BaseNode, tuple: Schema, length: number, index: number) => Diagnostic;
425
- propsMismatch: (node: BaseNode, props: Schema, detail: string) => Diagnostic;
426
- noMatchingOverload: (node: BaseNode, type: Schema, argTypes: readonly Schema[]) => Diagnostic;
427
- /** O argumento de tipo fora do bound — o texto do TS2344 da tag, com a constraint no
428
- * lugar do `{1}`. */
429
- constraintViolation: (node: BaseNode, actual: Schema, bound: Schema) => Diagnostic;
430
- unsupported: (node: BaseNode, what: string) => Diagnostic;
431
- /**
432
- * O nome usado antes da declaração dele, com o texto de cada mecanismo do tsc 3.9.10. O
433
- * conceito é um só (D2), e o nó é o USO.
434
- */
435
- usedBeforeDeclaration: {
436
- /** TS2448: a variável de escopo de bloco (o `checkResolvedBlockScopedVariable`,
437
- * `checker.ts:2259`), com a declaração na informação relacionada (TS2728). */
438
- blockScoped: (node: BaseNode, name: string, declaration: BaseNode) => Diagnostic;
439
- /** TS2372: o default de um parâmetro cita o próprio parâmetro (`checker.ts:2009`). */
440
- parameterSelf: (node: BaseNode, parameter: string) => Diagnostic;
441
- /** TS2373: o default de um parâmetro cita um declarado depois dele (`checker.ts:2013`). */
442
- parameterAfter: (node: BaseNode, parameter: string, name: string) => Diagnostic;
443
- };
444
- /** TS2454: a leitura de uma variável que, por algum caminho, ainda não recebeu valor. */
445
- usedBeforeAssigned: (node: BaseNode, name: string) => Diagnostic;
446
- /** O namespace (D83), com o texto do tsc em cada um. */
447
- namespace: {
448
- /** TS2503: o primeiro segmento de um nome qualificado não é namespace nenhum. O
449
- * código é o do nome que não existe, como o TS2304. */
450
- notFound: (node: BaseNode, name: string) => Diagnostic;
451
- /** TS2694: o namespace não exporta o membro, no segmento do membro. */
452
- noExportedMember: (node: BaseNode, namespace: string, member: string) => Diagnostic;
453
- /** TS2708: um namespace só de tipos numa posição de valor — o par do TS2693. */
454
- asValue: (node: BaseNode, name: string) => Diagnostic;
455
- /** TS1235: a declaração fora do topo e de outro namespace, no primeiro token. */
456
- misplaced: (node: BaseNode) => Diagnostic;
457
- };
458
- /** O contexto ambiente (`declare namespace`) só declara — o `checkAmbientInitializer` e o
459
- * `checkGrammarStatementInAmbientContext` do tsc, no nó de lá. */
460
- ambient: {
461
- /** TS1039: o inicializador que o contexto ambiente não aceita, nele. */
462
- initializer: (node: BaseNode) => Diagnostic;
463
- /** TS1254: o `const` sem anotação com um inicializador que não é literal, nele. */
464
- constInitializer: (node: BaseNode) => Diagnostic;
465
- /** TS1036: o statement que não é declaração, uma vez por bloco, no primeiro token. */
466
- statement: (node: BaseNode) => Diagnostic;
467
- };
468
- /**
469
- * Argumento de tipo explícito com aridade errada. Assinatura **sem** type params
470
- * declarados conta como `expected: 0` — é o que o tsc faz quando
471
- * `Signature.typeParameters` é `undefined` (ele nunca infere a lista). Com default, o
472
- * esperado é a faixa (`"1-2"`). Mensagem no texto do TS2558, que é sempre plural.
473
- */
474
- wrongTypeArgumentCount: (node: BaseNode, expected: number | string, got: number) => Diagnostic;
475
- /** Nenhuma sobrecarga aceita a aridade, e há uma abaixo e outra acima (≅ TS2743). */
476
- noOverloadTypeArgumentCount: (node: BaseNode, got: number, below: number, above: number) => Diagnostic;
477
- /** Referência a um alias com aridade errada — as frases do tsc: TS2315 para um
478
- * tipo que não é genérico, TS2314 para o resto (com o intervalo quando há default). */
479
- genericTypeArity: (node: BaseNode, name: string, min: number, max: number) => Diagnostic;
480
- /**
481
- * Binding declarado e nunca lido. **Warning**, não erro: é higiene, não
482
- * incompatibilidade — e o consumidor de editor o renderiza APAGADO (marker
483
- * `Unnecessary`), não sublinhado. Mensagem no texto do TS6133.
484
- */
485
- unusedName: (node: BaseNode, name: string) => Diagnostic;
486
- /**
487
- * Reatribuição de um binding IMUTÁVEL. Não é capability: a capability decide se
488
- * `=` existe na Linguagem; se um `const` pode ser reatribuído é outra pergunta, e
489
- * a resposta é sempre não (D9 — o piso é `const`). Mensagem no texto do TS2588 /
490
- * TS2632 (import). Ver `mutation.ts`.
491
- */
492
- assignToConst: (node: BaseNode, name: string, kind: "const" | "import" | "not-a-variable") => Diagnostic;
493
- /**
494
- * As chaves de um `for…in` não cabem no alvo dele (`let n: number; for (n in o)`). É a
495
- * relação que falha — o tipo das chaves contra o tipo declarado do alvo —, e por isso
496
- * o código é o `not-assignable`; o texto é o do TS2405 (`checkForInStatement`).
497
- */
498
- forInTarget: (node: BaseNode) => Diagnostic;
499
- /** `for ([a] in o)` — o alvo de um `for…in` é uma chave, não se desestrutura. TS2491. */
500
- forInDestructuring: (node: BaseNode) => Diagnostic;
501
- /** `for (k in n)` com `n` que não é objeto, `any` nem type param — o TS2407 do
502
- * `checkForInStatement` do tsc (`checker.ts:32148`), no que se percorre, com o tipo sem o
503
- * nulo. */
504
- forInNotObject: (node: BaseNode, type: Schema) => Diagnostic;
505
- /**
506
- * Escrita por um ÍNDICE readonly — `readonly T[]` ou `{ readonly [k: string]: V }`. É
507
- * a outra metade do modificador: a relação (TC29) diz quem pode ser ATRIBUÍDO a quem;
508
- * isto diz quem pode ser ESCRITO. Texto do TS2542, no acesso inteiro. Os três casos de
509
- * escrita recusada pelo `readonly` têm um código só (D77): o nó e o texto são os do tsc.
510
- */
511
- readonlyWrite: (node: BaseNode, target: Schema) => Diagnostic;
512
- /** Escrita numa PROPRIEDADE readonly — o TS2540, no nome (`o.a`) ou no argumento
513
- * (`o["a"]`). O acesso vira o tipo-erro: a atribuição não é checada depois. D77. */
514
- readonlyProperty: (node: BaseNode, name: string) => Diagnostic;
515
- /** `delete` de uma PROPRIEDADE readonly — o TS2704, no operando. D77. */
516
- readonlyDelete: (node: BaseNode) => Diagnostic;
517
- /**
518
- * Cast (`x as T`) entre tipos que não se sobrepõem na régua do tsc (`castOverlaps`:
519
- * literal da origem alargado + comparabilidade). Erro, como o TS2352 — o texto é o
520
- * dele. Se o cast pode estreitar é outra pergunta, de política: o
521
- * `narrowing-cast-not-allowed` do `strict`.
522
- */
523
- castUnsound: (node: BaseNode, from: Schema, to: Schema) => Diagnostic;
524
- /**
525
- * `parseAs(T, v)` em que o tipo de `v` não se sobrepõe a `T` na régua do `as`
526
- * (`castOverlaps`). O asserter não confere o valor em build — a prova é de
527
- * runtime —, mas aqui o build já sabe a resposta: a prova não é incerta, é
528
- * impossível, e falhar é a única coisa que ela pode fazer. Erro, com a mesma
529
- * severidade do `cast-unsound` (TS2352). Ancorado no VALOR: o tipo escolhido
530
- * pode estar certo, e o valor errado é o caso comum.
531
- */
532
- unprovableValue: (node: BaseNode, value: Schema, target: Schema, name: string) => Diagnostic;
533
- /**
534
- * Operando de operação aritmética (`*` `-` `/` `%` `**`, bitwise) ou de `++`/`--`
535
- * que não é numérico. Espelha TS2362 (esquerdo) / TS2363 (direito) / TS2356 (`++`/`--`).
536
- * `bigint`/enum ficam fora do vocabulário do TSL, então a mensagem cita só `number`/`any`.
537
- */
538
- arithmeticOperand: (node: BaseNode, side: "left" | "right" | "operand") => Diagnostic;
539
- /**
540
- * `+` (nenhum lado string, nem ambos numéricos) ou relacional (`<` `>` `<=` `>=`)
541
- * entre tipos incompatíveis. Espelha TS2365.
542
- */
543
- operatorNotApplicable: (node: BaseNode, op: string, left: Schema, right: Schema) => Diagnostic;
544
- /**
545
- * TS2678: o `case` de um `switch` que não é comparável ao discriminante, no `case` — o
546
- * `checkTypeComparableTo` do `checkSwitchStatement` do tsc (`checker.ts:32977`). Os tipos
547
- * chegam como a comparação os viu: alargados até a base, a menos que os dois sejam
548
- * literais. O tsc elabora a relação num objeto (TS2741, TS2740); aqui a mensagem é a do
549
- * TS2678, e o código é o contrato (D2).
550
- */
551
- notComparable: (node: BaseNode, source: Schema, target: Schema) => Diagnostic;
552
- /**
553
- * TS2774: a condição de um `if` ou de um `?:` é uma função que nunca é falsy, e o ramo
554
- * verdadeiro não a usa — o `checkTestingKnownTruthyCallableType` do tsc
555
- * (`checker.ts:31963`), na condição.
556
- */
557
- uncalledFunctionCheck: (node: BaseNode) => Diagnostic;
558
- /**
559
- * TS2367: uma igualdade entre tipos sem sobreposição, cujo resultado já é sabido — o
560
- * `tryGiveBetterPrimaryError` do tsc (`checker.ts`, no `reportOperatorError`): `'false'`
561
- * para `===`/`==`, `'true'` para `!==`/`!=`. Os tipos chegam como a mensagem os mostra
562
- * (as bases, quando os literais também não se relacionam). Com `missingAwait`, os dois
563
- * lados se relacionariam desembrulhando o `Promise`, e a informação relacionada é o
564
- * TS2773 (o `errorAndMaybeSuggestAwait`).
565
- */
566
- noOverlap: (node: BaseNode, op: string, left: Schema, right: Schema, missingAwait: boolean) => Diagnostic;
567
- /**
568
- * `"x" + n` — o `+` não converte para texto (Proposal 009).
569
- *
570
- * A mensagem carrega o CONSERTO porque a recusa é deliberada e **diverge do
571
- * `tsc`**, que aceita: sem dizer o que fazer, o autor lê como defeito nosso. O
572
- * template literal segue coagindo e não alonga o código: `"total: " + n` vira
573
- * `` `total: ${n}` ``, do MESMO tamanho — e a partir de duas interpolações o
574
- * template encurta.
575
- */
576
- implicitCoercion: (node: BaseNode, left: Schema, right: Schema, textConvertible: boolean) => Diagnostic;
577
- /**
578
- * `` `${obj}` `` — o template converte ESCALAR, não estrutura (D40).
579
- *
580
- * Mesmo código do `+` de propósito: é a mesma decisão vista por outra sintaxe, e
581
- * quem filtra por `code` quer as duas juntas. A mensagem é que muda, porque aqui
582
- * o conserto é outro (`stringify`, não template).
583
- */
584
- notTextConvertible: (node: BaseNode, t: Schema) => Diagnostic;
585
- };
586
- /**
587
- * Coletor de diagnósticos — acumula durante o walk, sem `throw`.
588
- *
589
- * Guarda cada diagnóstico UMA vez: um segundo com o mesmo nó, o mesmo código, a mesma
590
- * mensagem e a mesma informação relacionada não entra. É a coleção do tsc
591
- * (`createDiagnosticCollection`, que insere pelo `insertSorted` e não repete o que o
592
- * `compareDiagnostics` acha igual — ele compara também o `relatedInformation`), e é o que
593
- * deixa um argumento ser tipado mais de uma vez — as rodadas da chamada (D53, D81) — sem
594
- * que o erro de dentro dele saia duas vezes. Dois diagnósticos que só diferem na
595
- * informação relacionada são dois: `{ a: 1, ...o1, ...o2 }` acusa o `a` uma vez por spread.
596
- */
597
- interface DiagnosticSink {
598
- /** Diagnósticos coletados, na ordem em que foram reportados, sem repetição. */
599
- readonly all: readonly Diagnostic[];
600
- /** Quantas vezes o `report` foi chamado, as repetições inclusive: é o que responde "esta
601
- * operação acusou algo?", mesmo quando o que ela acusou já tinha sido acusado. */
602
- readonly reported: number;
603
- report(d: Diagnostic): void;
604
- /** `true` se há ao menos um diagnóstico de severidade `error`. */
605
- hasErrors(): boolean;
606
- }
607
- /** Cria um coletor vazio. */
608
- declare function createSink(): DiagnosticSink;
609
-
610
- /** Liga a análise de não-usados. Dois eixos independentes, como no tsc. */
611
- interface UnusedOptions {
612
- /** ≅ `noUnusedLocals`: `const` e `import` nunca lidos. */
613
- readonly locals?: boolean;
614
- /** ≅ `noUnusedParameters`: parâmetros de arrow nunca lidos. */
615
- readonly parameters?: boolean;
616
- }
617
- /**
618
- * Coleta os bindings declarados e nunca lidos, como diagnósticos `unused-name`
619
- * (severidade **warning** — é aviso de higiene, não erro de tipo).
620
- *
621
- * **Fora de escopo, de propósito** (limitação declarada, nunca divergência —
622
- * [[tslite-is-ts-subset]]):
623
- *
624
- * - **`type X = …` não-usado** (o TS6196 do tsc). Num TSLite, um alias de `.d.ts`
625
- * é contrato ENTRE arquivos por construção — a gramática não tem `export type`
626
- * (playground ARCHITECTURE §5), então "não usado neste arquivo" não significa
627
- * não usado. Reportar daria falso-positivo em todo `.d.ts`.
628
- * - **Write-only** (`let x = 1; x = 2` sem leitura — o `noUnusedLocals_writeOnly`
629
- * do tsc). Aqui a atribuição conta como leitura, então reportamos MENOS.
630
- * Mutação é capability gated (D9), então o caso é raro.
631
- *
632
- * **Diferença de MENSAGEM conhecida** (o comportamento bate; a apresentação não —
633
- * mesmo precedente do D2/D18): o tsc agrupa (`All variables are unused` /
634
- * `All destructured elements are unused`) quando TODOS os nomes de uma declaração
635
- * caem. Aqui cada nome sai como um diagnóstico próprio, porque o consumidor é o
636
- * editor: o fade precisa do range POR NOME, e um diagnóstico na lista inteira não
637
- * apagaria os nomes individualmente.
638
- */
639
- declare function collectUnused(root: BaseNode, opts: UnusedOptions): Diagnostic[];
640
-
641
- /** O overlay de tipos: tipo + escopo de cada nó, por referência (ESTree não tem id). */
642
- type TypeOverlay = WeakMap<BaseNode, {
643
- readonly type: Schema;
644
- readonly scope: Scope;
645
- }>;
646
- interface CheckResult {
647
- /** Tipo do nó raiz. */
648
- readonly type: Schema;
649
- readonly overlay: TypeOverlay;
650
- readonly diagnostics: readonly Diagnostic[];
651
- /**
652
- * Os tipos nomeados resolvíveis (`env.types` ∪ `env.schemes`), já unificados na
653
- * forma de scheme. Publicado porque QUEM CONSULTA precisa dele: `discover`
654
- * (completions, navegação de membro) só expande um `apply` se receber este
655
- * catálogo. Sem publicar, cada consumidor re-derivaria a união — e derivações
656
- * paralelas divergem. Num programa sem alias é o catálogo do `Env`, o mesmo objeto em
657
- * toda checagem, e congelado (D87).
658
- */
659
- readonly schemes: Schemes;
660
- /**
661
- * Os tipos NOMINAIS que um texto de tipo pode citar (`Promise`, `Array`, e os do
662
- * host), com os type params de cada um — os que nenhum scheme sombreia. Publicado
663
- * pela mesma razão dos `schemes`: é a outra metade do catálogo de nomes de tipo
664
- * (D79).
665
- */
666
- readonly nominals: Nominals;
667
- }
668
- /**
669
- * Tipa `node` no ambiente `env` (a borda da DI: data, states, funções globais).
670
- * Nunca lança; devolve o overlay e os diagnósticos coletados.
671
- */
672
- /** Opções do `check`. */
673
- interface CheckOptions {
674
- /**
675
- * Capability profile a enforçar. Quando dado, o `check` roda o guard de capability
676
- * (`fromCapability`) além do type-checking e funde os diagnósticos (`node-not-allowed`).
677
- * Sem ele, `check` faz **só type-checking** (sem opinar sobre capability).
678
- *
679
- * Capability **desinstala** features (o que pode existir em runtime — junto do
680
- * interpret/codegen); é ortogonal aos `limits`/`resultType` abaixo, que **validam**.
681
- */
682
- readonly profile?: CapabilityProfile;
683
- /**
684
- * Limites estruturais (anti-DoS) — validações do checker, cada uma opt-in.
685
- * Reportam `too-deep`/`too-large`.
686
- */
687
- readonly limits?: {
688
- /** Profundidade total de aninhamento do AST (qualquer nó). */
689
- readonly maxDepth?: number;
690
- /** Número total de nós (custo/complexidade). */
691
- readonly maxNodes?: number;
692
- /** Argumentos por chamada. */
693
- readonly maxArgs?: number;
694
- /** Aninhamento de funções (função-dentro-de-função). */
695
- readonly maxFunctionNesting?: number;
696
- /** Aninhamento de chamadas (`f(g(h(x)))`). */
697
- readonly maxCallNesting?: number;
698
- /** Profundidade de cadeia de membros (`a.b.c.d`). */
699
- readonly memberDepth?: number;
700
- };
701
- /**
702
- * Contrato de tipo de retorno: o tipo da expressão-raiz deve ser atribuível a
703
- * `resultType`. Reporta `wrong-result-type`. (Ex.: uma condition deve ser `boolean`.)
704
- */
705
- readonly resultType?: Schema;
706
- /**
707
- * Análise de bindings declarados e nunca lidos (`unused-name`, **warning**).
708
- * Opt-in e com dois eixos independentes, como o `noUnusedLocals` /
709
- * `noUnusedParameters` do tsc. Ver [`unused`](./unused.ts) para as isenções.
710
- */
711
- readonly unused?: UnusedOptions;
712
- }
713
- declare function check(node: Node, env: Env, opts?: CheckOptions): CheckResult;
714
- /**
715
- * Extrai o **tipo-superfície** de um módulo (o ".d.ts sem arquivo", o dual do import):
716
- * roda o `check` e projeta os bindings de topo (`const`/`function`) num `object` Schema
717
- * `{ nome: tipoInferido }`. É como o `tsc` faz o declaration emit — só que aqui o checker
718
- * **já infere** os tipos (D5/D6 scope-flow), então é uma projeção do overlay, sem Babel
719
- * nem serialização pra sintaxe. O resultado é exatamente o que outro módulo consome via
720
- * `env.modules[especificador]` — os dois lados se fecham. (Filtragem por `export` explícito
721
- * entra quando `export` for implementado; hoje projeta toda a superfície de topo — o caso
722
- * "inferir o tipo de um algoritmo que não declarou tipos".)
723
- */
724
- declare function extractModuleType(program: Node, env: Env, opts?: CheckOptions): {
725
- type: ObjectSchema;
726
- diagnostics: readonly Diagnostic[];
727
- };
728
- /**
729
- * O DIFERENCIAL — `matchesProps(Component, payload)`: extrai as props do componente
730
- * react-like (`(props) => Element`; agnóstico ao framework, `Element` é `apply` opaco)
731
- * e verifica, em edit-time, se o `payload` (saída de um serviço de automação/nocode) é
732
- * **compatível** com elas: `payload ≤ props`. Campos a MAIS no payload são OK (o
733
- * componente usa um subconjunto); faltar prop obrigatória ou tipo-errado →
734
- * `props-mismatch`. Retorna `boolean` (a resposta de runtime). Componente inválido
735
- * (sem assinatura de função) → não checa.
736
- */
737
- /**
738
- * As props de um componente react-like (`(props) => Element`): a 1ª assinatura, 1º
739
- * param. É o SSOT da extração — o `matchesProps` (D24, VALIDAÇÃO) e o
740
- * `componentProps` (AUTORIA, o matchesProps invertido) consomem os dois. Devolve o
741
- * tipo CRU do param (o `matchesProps` o passa pro `typeDiff`, que resolve).
742
- */
743
- declare function componentPropsOf(componentType: Schema, schemes: Schemes): Schema | undefined;
744
- /**
745
- * As props do componente registrado como `name` no `env`, para AUTORIA — gerar um
746
- * form (um campo por prop). É o `matchesProps` **INVERTIDO** (validação → autoria):
747
- * lê o prop-schema em vez de casar um payload contra ele. Devolve o objeto de props
748
- * JÁ RESOLVIDO (nome → forma), ou `undefined` se `name` não é `(props) => Element`.
749
- */
750
- declare function componentProps(env: Env, name: string): Schema | undefined;
751
-
752
- /** Contexto opcional de um guard — o que as regras type-aware leem do `check`. */
753
- interface GuardContext {
754
- readonly overlay?: TypeOverlay;
755
- /** Os tipos nomeados do programa: sem eles, uma relação sobre `apply` não expande. */
756
- readonly schemes?: Schemes;
757
- }
758
- /** Um guard: percorre `root` e devolve os diagnósticos que encontrar. */
759
- type Guard = (root: BaseNode, ctx: GuardContext) => Diagnostic[];
760
- /** Um profile é uma composição de guards. */
761
- type Profile = readonly Guard[];
762
- /** Roda um profile sobre `root`, concatenando todos os diagnósticos. */
763
- declare function guard(root: BaseNode, profile: Profile, ctx?: GuardContext): Diagnostic[];
764
- /** Os kinds que **definem** uma função. */
765
- declare const FUNCTION_KINDS: readonly ["ArrowFunctionExpression", "FunctionExpression", "FunctionDeclaration"];
766
- /**
767
- * O guard de **capability**: percorre `root` e reporta `node-not-allowed` em todo
768
- * nó proibido por `compiled` — via `nodeViolation`, a **fonte única** de gating
769
- * compartilhada com o interpret e o codegen. É o que `fromCapability` monta (+ o
770
- * host allowlist). Garante que os 3 consumidores concordam por construção.
771
- *
772
- * Cada nó vai com o pai: é ele que separa o `export` de um membro de namespace
773
- * (a visibilidade, como o modificador do tsc) do `export` de módulo do teto
774
- * (capability CP1).
775
- *
776
- * O profile diz o que um lugar da aplicação pode EXECUTAR, e o corpo de um namespace que não
777
- * vira código não executa: o nó do namespace é gateado, e o corpo dele não
778
- * (`bodyDoesNotRun`). Os guards de autoria de tipo, abaixo, julgam o texto escrito e descem
779
- * nele.
780
- */
781
- declare function capabilityNodes(compiled: CompiledProfile, severity?: Severity): Guard;
782
- /**
783
- * O callee de toda chamada deve ser um identificador direto ∈ `names`. É o gate
784
- * do **host** (a família `host.allow` do `CapabilityProfile`): só as funções
785
- * liberadas pela DI podem ser chamadas. Montado por `fromCapability`.
786
- */
787
- declare function calleeAllowlist(names: readonly string[], severity?: Severity): Guard;
788
- /**
789
- * Limita o **aninhamento de um kind** ao longo de qualquer caminho raiz→folha.
790
- * Ex.: `maxNestingOf(FUNCTION_KINDS, 3)` barra a 4ª função aninhada.
791
- */
792
- declare function maxNestingOf(kinds: string | readonly string[], max: number, opts?: {
793
- hint?: string;
794
- severity?: Severity;
795
- }): Guard;
796
- /** Aninhamento de funções (função-dentro-de-função). Padrão: 3 → use um pipe. */
797
- declare const maxFunctionNesting: (max?: number, severity?: Severity) => Guard;
798
- /** Aninhamento de chamadas (`f(g(h(x)))`). */
799
- declare const maxCallNesting: (max: number, severity?: Severity) => Guard;
800
- /** Profundidade de cadeia de membros (`a.b.c.d`). */
801
- declare const memberDepth: (max: number, severity?: Severity) => Guard;
802
- /** Profundidade total de aninhamento do AST (qualquer nó). */
803
- declare function maxDepth(max: number, severity?: Severity): Guard;
804
- /** Número total de nós (custo/complexidade). */
805
- declare function maxNodes(max: number, severity?: Severity): Guard;
806
- /** Número máximo de argumentos por chamada. */
807
- declare function maxArgs(max: number, severity?: Severity): Guard;
808
- /** O tipo da expressão-raiz deve ser atribuível a `expected`. */
809
- declare function resultType(expected: Schema, schemes?: Schemes, severity?: Severity): Guard;
810
-
811
- /** Traduz um `CompiledProfile` (já compilado) num `Profile` de guards. */
812
- declare function guardsFromCompiled(c: CompiledProfile): Profile;
813
- /**
814
- * Compila um `CapabilityProfile` e o traduz num `Profile` de guards. Use com
815
- * `guard(ast, fromCapability(PRESETS.predicate))`. Assume um profile válido
816
- * (rode `validateProfile` antes p/ pegar combinações ilegais).
817
- */
818
- declare function fromCapability(profile: CapabilityProfile): Profile;
819
-
820
- type BinaryOpCategory = "additive" | "arithmetic" | "bitwise" | "relational" | "equality";
821
- /**
822
- * O tipo que o operador PRODUZ — como marcador. `"additive"` é o `+` (condicional:
823
- * `string`|`number`), resolvido no checker. Os demais mapeiam 1:1 num `Schema`.
824
- */
825
- type OpResult = "number" | "boolean" | "string" | "additive";
826
- interface BinaryOpSpec {
827
- readonly op: types.BinaryOperator;
828
- readonly category: BinaryOpCategory;
829
- readonly result: OpResult;
830
- }
831
- /** O catálogo dos binários da Linguagem (o `in`/`instanceof` ficam fora: OO/nicho). */
832
- declare const BINARY_OPS: readonly BinaryOpSpec[];
833
- /** Lookup O(1) por operador. */
834
- declare const BINARY_OP: ReadonlyMap<string, BinaryOpSpec>;
835
- /** O `Schema` que o operador produz — o SSOT do tipo de retorno. `+` (additive) é
836
- * condicional e NÃO tem schema fixo: quem chama trata (ver `binaryType` no checker). */
837
- declare const opResultSchema: (r: Exclude<OpResult, "additive">) => Schema;
838
- interface UnaryOpSpec {
839
- readonly op: types.UnaryOperator;
840
- /** O tipo ao qual o resultado é ASSIGNÁVEL (upper bound). O `unaryType` faz
841
- * folding de literal (`-1`→`-1`, `!0`→`true`), então o real é um subtipo disto. */
842
- readonly result: "number" | "boolean" | "string" | "undefined";
843
- }
844
- declare const UNARY_OPS: readonly UnaryOpSpec[];
845
- interface LogicalOpSpec {
846
- readonly op: types.LogicalOperator;
847
- }
848
- /** Os lógicos COMPÕEM o tipo dos operandos (`a && b` refina; não é tipo fixo) —
849
- * por isso sem `result`. No slot, um lógico serve quando os operandos servem. */
850
- declare const LOGICAL_OPS: readonly LogicalOpSpec[];
851
- /**
852
- * Os operadores BINÁRIOS cujo resultado é assignável a `target` — a base das
853
- * sugestões de um slot. Num slot `boolean`: relacionais + igualdades. Num slot
854
- * `number`: aritméticos/bitwise + `+`. O `+` (additive) serve a slot string OU
855
- * number. `any`/`unknown` no `target` casa tudo (`subtype` já resolve).
856
- */
857
- declare function binaryOpsProducing(target: Schema, schemes?: Schemes): readonly BinaryOpSpec[];
858
- /** Os operadores UNÁRIOS cujo resultado (upper bound) é assignável a `target`. */
859
- declare function unaryOpsProducing(target: Schema, schemes?: Schemes): readonly UnaryOpSpec[];
860
-
861
- /**
862
- * Diagnósticos de reatribuição de binding imutável (`const`, `import`).
863
- *
864
- * **Sempre roda** — não é opt-in nem gateado por capability, porque `const` é o
865
- * piso da Linguagem (D9). Um profile que liga mutação libera `let`, não `const`.
866
- *
867
- * Roda **ANTES** do walk, e devolve também os alvos recusados: o walk pula a
868
- * checagem de assignability neles, para não cascatear. É a ordem do tsc — *"to
869
- * avoid cascading errors check assignability only if 'isReference' check succeeded
870
- * and no errors were reported"* (`checker.ts:41076`). Sem isso `const c = 1; c = 2`
871
- * reportaria DOIS erros, sendo que o segundo (`2 ⊄ 1`) é consequência do primeiro.
872
- */
873
- declare function collectMutations(root: BaseNode): {
874
- readonly diagnostics: readonly Diagnostic[];
875
- readonly invalidTargets: WeakSet<BaseNode>;
876
- };
877
-
878
- /** Referência → o `Identifier` que a DECLARA. Por referência, como o overlay. */
879
- type BindingMap = WeakMap<BaseNode, BaseNode>;
880
- /**
881
- * Mapeia cada REFERÊNCIA ao `Identifier` que a declara.
882
- *
883
- * É a base de "ir para a definição" (e, no futuro, rename / find-references).
884
- * **Não** é chamado pelo `check`: é consulta de editor, e o checker roda
885
- * por-keystroke — quem quer, paga.
886
- *
887
- * **Limites** (ambos por ausência de posição, não por preguiça):
888
- * - **membro** (`obj.price`) não resolve: exigiria a origem do tipo, e `Schema`
889
- * não carrega posição;
890
- * - **nome de tipo em ANOTAÇÃO** (`r: RawViaCep`) não resolve: a anotação é
891
- * `Schema` apagável, não nó (E6). O nome de um `type X = …` resolve.
892
- */
893
- declare function collectBindings(root: BaseNode): BindingMap;
894
-
895
- /** O que um nome denota. */
896
- type ReferenceSymbol = {
897
- readonly kind: "local";
898
- /** O `Identifier` que declara — a identidade, por referência. */
899
- readonly declaration: BaseNode;
900
- } | {
901
- readonly kind: "environment";
902
- /** O caminho a partir da raiz da DI: `["params"]`, `["params", "id"]`. */
903
- readonly path: readonly string[];
904
- };
905
- /**
906
- * Onde o nome aparece como SHORTHAND, e portanto nomeia duas coisas ao mesmo tempo
907
- * — o `prefixText`/`suffixText` do `findRenameLocations` do TypeScript:
908
- *
909
- * - `"property"`: o nome é o valor e também a PROPRIEDADE (`{ x }`, ou `const { x
910
- * } = o` renomeando o `x` local). A propriedade continua com o nome antigo:
911
- * `{ x: x2 }`;
912
- * - `"binding"`: o nome é a propriedade e também um BINDING (`const { id } =
913
- * params`, renomeando o `params.id`). O binding continua com o nome antigo:
914
- * `{ id2: id }`;
915
- * - `"import"`: o nome importado é também o local (`import { a } from "m"`,
916
- * renomeando o local): `import { a as a2 }`.
917
- */
918
- type Shorthand = "property" | "binding" | "import";
919
- /** Uma referência a tipo nomeado escrita numa anotação (a `typeRefs` do parser). */
920
- interface TypeRefSite {
921
- readonly name: string;
922
- readonly loc: SourceLocation;
923
- }
924
- /** Um lugar onde o nome aparece. */
925
- type Occurrence = {
926
- /** O nó cujo texto É o nome: `Identifier`, `JSXIdentifier` ou a chave literal. */
927
- readonly site: "node";
928
- readonly node: BaseNode;
929
- readonly symbol: ReferenceSymbol;
930
- /** A declaração do símbolo, e não um uso. */
931
- readonly isDeclaration?: true;
932
- readonly shorthand?: Shorthand;
933
- } | {
934
- /** Um segmento do `typeof a.b` numa anotação: o nó não tem posição por segmento. */
935
- readonly site: "typeQuery";
936
- readonly node: BaseNode;
937
- readonly segment: number;
938
- readonly symbol: ReferenceSymbol;
939
- } | {
940
- /** Um nome de tipo numa anotação, que não é nó (E6 do editor). */
941
- readonly site: "typeRef";
942
- readonly ref: TypeRefSite;
943
- readonly symbol: ReferenceSymbol;
944
- };
945
- /** Os dois símbolos são o mesmo? */
946
- declare function sameSymbol(a: ReferenceSymbol, b: ReferenceSymbol): boolean;
947
- /**
948
- * Todas as ocorrências de nome do programa, cada uma com o símbolo que denota.
949
- *
950
- * Quem renomeia escolhe o símbolo sob o cursor (`occurrenceAt` do editor) e pega as
951
- * ocorrências com `sameSymbol`; quem renomeia um caminho do ambiente sem cursor (o
952
- * host que renomeou a declaração no `Env`) filtra pelo caminho direto.
953
- */
954
- declare function collectReferences(root: BaseNode): readonly Occurrence[];
955
-
956
- /** Anota uma ligação/parâmetro: `x` → `x: T`. */
957
- declare const annotate: <N extends BaseNode>(node: N, type: Schema) => N & {
958
- typeAnnotation: Schema;
959
- };
960
- /** Anota o retorno de uma função: `() => …` → `(): R => …`. */
961
- declare const annotateReturn: <N extends BaseNode>(fn: N, type: Schema) => N & {
962
- returnType: Schema;
963
- };
964
- /** Cast `x as T` — `{ expression, typeAnnotation }`; tipa a expressão, resulta `T`. */
965
- declare const asExpression: (expression: BaseNode, type: Schema) => BaseNode;
966
-
967
- /** O tipo inferido de `node`, ou `undefined` se o nó não foi tipado. */
968
- declare function typeAt(overlay: TypeOverlay, node: BaseNode): Schema | undefined;
969
- /** O escopo léxico vigente em `node`, ou `undefined` se o nó não foi tipado. */
970
- declare function scopeAt(overlay: TypeOverlay, node: BaseNode): Scope | undefined;
971
- /**
972
- * Completions de **membro**: o que pode seguir a partir do tipo de `node`
973
- * (ex.: após `obj.` → as props de `obj`; após um array → `[]`). Vazio se o nó
974
- * não foi tipado ou se o tipo não tem membros navegáveis.
975
- */
976
- declare function memberCompletions(overlay: TypeOverlay, node: BaseNode): readonly Completion[];
977
- /**
978
- * Completions de **escopo**: os nomes visíveis no contexto de `node` — params,
979
- * `const`s já declaradas acima e as raízes injetadas pela DI. É o que pode
980
- * preencher um slot de expressão livre nesse ponto. O mais interno sombreia o
981
- * externo. Vazio se o nó não foi tipado.
982
- */
983
- declare function scopeCompletions(overlay: TypeOverlay, node: BaseNode): readonly Completion[];
984
- /**
985
- * O tipo CONTEXTUAL de `ancestors[i]` — o que o nó em torno espera ali.
986
- *
987
- * É o `getContextualType` do tsc: **computado sob demanda** a partir da cadeia de
988
- * ancestrais, não gravado no overlay. O overlay guarda o tipo RESULTANTE de cada
989
- * nó; o contextual é outra pergunta ("o que caberia aqui?"), e a resposta vive nas
990
- * anotações do pai — que o parser deixa no nó como `Schema` (`typeAnnotation`,
991
- * `returnType`).
992
- *
993
- * Mora no checker (e não no editor) porque é **semântica**: resolve anotação,
994
- * consulta o overlay e navega tipo nomeado. O editor faz posição→nó e pergunta.
995
- *
996
- * `ancestors` vem do mais interno para o mais externo (`ancestors[i+1]` é o pai de
997
- * `ancestors[i]`). Devolve `undefined` quando o contexto não determina um tipo —
998
- * e aí o consumidor não deve inventar.
999
- */
1000
- declare function contextualTypeAt(ancestors: readonly BaseNode[], i: number, overlay: TypeOverlay, schemes?: Schemes): Schema | undefined;
1001
- /** Os diagnósticos que apontam para `node`. */
1002
- declare function diagnosticsAt(diagnostics: readonly Diagnostic[], node: BaseNode): readonly Diagnostic[];
1003
-
1004
- /** Nó → âncora do domínio. Identidade por referência; `A` é opaca. */
1005
- interface Anchors<A> {
1006
- /** Carimba o nó e o devolve — para carimbar na própria construção. */
1007
- stamp<T extends object>(node: T, anchor: A): T;
1008
- get(node: object): A | undefined;
1009
- }
1010
- declare function createAnchors<A>(): Anchors<A>;
1011
- interface LowerValueOptions<A> {
1012
- /** A âncora de um filho: chave de objeto ou índice de lista. */
1013
- readonly child: (anchor: A, key: string | number) => A;
1014
- /**
1015
- * O nó de uma ilha. Padrão: `fromExprMarker`, carimbado com a âncora da
1016
- * posição. Quem tem os nós em memória (com `loc` no texto do campo — os
1017
- * `islands[].node` do `parseValue` do `@tslite/template`) os entrega aqui, e
1018
- * o span de um erro dentro da ilha passa a existir.
1019
- */
1020
- readonly island?: (marker: object, anchor: A) => Expression;
1021
- }
1022
- /**
1023
- * Um valor JSON com ilhas → uma expressão de nós PRÓPRIOS, carimbados.
1024
- *
1025
- * Por que não entregar o `JsonExpression` ao checker: ele decodifica cada ilha
1026
- * em nós novos para tipá-la, e um erro dentro da ilha aponta um nó que não é do
1027
- * consumidor — o mapa não o conhece, e o diagnóstico cai no fallback. Baixando
1028
- * aqui, o nó é seu, carimbável, e a subida pelos pais alcança.
1029
- *
1030
- * - objeto → `ObjectExpression`; a raiz leva `anchor`; cada chave (um
1031
- * `Literal`, para representar qualquer chave JSON) e cada `Property` levam
1032
- * `child(anchor, key)`, e o valor é baixado com a mesma âncora filha. Um
1033
- * `not-assignable` do objeto inteiro pousa no objeto; um `excess-property`
1034
- * pousa na chave;
1035
- * - array → `ArrayExpression`, com `child(anchor, i)` por elemento;
1036
- * - ilha → `island(marker, anchor)`;
1037
- * - primitivo → `Literal`.
1038
- */
1039
- declare function lowerValue<A>(value: unknown, anchor: A, anchors: Anchors<A>, opts: LowerValueOptions<A>): Expression;
1040
- interface AnchoredDiagnostic<A> {
1041
- /** O diagnóstico do checker, com `node` e `data` — intacto. */
1042
- readonly diagnostic: Diagnostic;
1043
- readonly anchor: A;
1044
- /** Offsets no texto da âncora, quando há texto e o nó tem `loc`. */
1045
- readonly span?: Span;
1046
- }
1047
- interface AnchorDiagnosticsOptions<A> {
1048
- /** A âncora de quem nada responde. Um diagnóstico sem âncora some. */
1049
- readonly fallback: A;
1050
- /** O texto em que a âncora mora — o do campo. Sem ele, não há span. */
1051
- readonly textOf?: (anchor: A) => string | undefined;
1052
- }
1053
- /**
1054
- * Cada diagnóstico, levado à âncora do nó acusado ou do primeiro pai carimbado.
1055
- *
1056
- * A subida existe por correção, não por economia: o checker ancora um erro no nó
1057
- * mais preciso que tem — o literal de uma chave, o argumento de uma chamada —, e
1058
- * nem todo nó precisa ter sido carimbado (um sub-nó que um builder gerou, um
1059
- * nó sintético). Sem nenhum carimbo no caminho, vale o `fallback`.
1060
- *
1061
- * O `data` do diagnóstico atravessa intacto: é dele que o quick-fix de
1062
- * propriedade faltante vive. O span sai do `loc` do nó acusado, convertido no
1063
- * texto da âncora (`textOf`); sem texto ou sem `loc`, não há span — inventar um
1064
- * seria pior que não ter.
1065
- */
1066
- declare function anchorDiagnostics<A>(root: object, diagnostics: readonly Diagnostic[], anchors: Anchors<A>, opts: AnchorDiagnosticsOptions<A>): AnchoredDiagnostic<A>[];
1067
- /**
1068
- * `loc` do AST → offsets num texto.
1069
- *
1070
- * `loc` ausente → sem span (um nó construído por builder não tem posição, e
1071
- * inventar uma seria pior que não ter); `end` ausente → span de tamanho zero no
1072
- * início; posição fora do texto é presa ao tamanho do texto, e o fim nunca fica
1073
- * antes do início. Para converter muitos `loc` sobre o mesmo texto, use
1074
- * `anchorDiagnostics`, que constrói o mapa de posições uma vez por texto.
1075
- */
1076
- declare function spanOf(text: string, loc: SourceLocation | null | undefined): Span | undefined;
1077
-
1078
- export { type AnchorDiagnosticsOptions, type AnchoredDiagnostic, type Anchors, BINARY_OP, BINARY_OPS, type BinaryOpCategory, type BinaryOpSpec, type BindingMap, type CheckOptions, type CheckResult, type CheckerErrorCode, Completion, type Diagnostic, type DiagnosticCode, type DiagnosticData, type DiagnosticKind, type DiagnosticRelatedInformation, type DiagnosticSink, type Env, type EnvOptions, FUNCTION_KINDS, type Guard, type GuardContext, LOGICAL_OPS, type LogicalOpSpec, type LowerValueOptions, type MissingProperty, type Nominals, ObjectSchema, type Occurrence, type OpResult, type Profile, type ReferenceSymbol, Schema, Schemes, type Scope, type Severity, type Shorthand, type TypeOverlay, type TypeRefSite, TypeScheme, UNARY_OPS, type UnaryOpSpec, type UnusedOptions, VarSchema, anchorDiagnostics, annotate, annotateReturn, asExpression, binaryOpsProducing, calleeAllowlist, capabilityNodes, check, childScope, collectBindings, collectMutations, collectReferences, collectUnused, componentProps, componentPropsOf, contextualTypeAt, createAnchors, createEnv, createSink, diag, diagnosticsAt, extractModuleType, fromCapability, guard, guardsFromCompiled, lookup, lowerValue, makeDiagnostic, maxArgs, maxCallNesting, maxDepth, maxFunctionNesting, maxNestingOf, maxNodes, memberCompletions, memberDepth, opResultSchema, resolveNamed, resolveScheme, resolvesToEnvironment, resultType, rootScope, sameSymbol, scopeAt, scopeCompletions, spanOf, typeAt, unaryOpsProducing, visibleNames };
1
+ export * from "./_namespaces/ts.js";