@tslite/checker 1.6.0 → 1.9.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.cts CHANGED
@@ -1,145 +1,14 @@
1
1
  import { VarSchema, Schema, Schemes, TypeScheme, ObjectSchema, Completion } from './types/index.cjs';
2
- export { AnySchema, ApplySchema, ArraySchema, Bindings, DEFAULT_TYPE_LIMITS, Discovery, ElementFlag, FnSchema, GuardSig, INSTANTIATION_COUNT_LIMIT, INSTANTIATION_DEPTH_LIMIT, Incompatibility, IncompatibilityKind, IndexSchema, 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, discover, equals, erasedSignature, expand1, flagAt, format, formatTypeArgs, formatTypeDiff, freeVars, groundVars, inferFromCandidates, inferredTypes, instantiate, 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, typeNeedsParens, typeParamArity, unify, version, widen, widenInferred, widenLiteral, widenOrigin, widenType, withUndefined, withoutUndefined } from './types/index.cjs';
3
- import { Scope as Scope$1, BaseNode, Node, types, SourceLocation, Expression } from '@tslite/ast';
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.cjs';
3
+ import { BaseNode, Scope as Scope$1, Node, types, SourceLocation, Expression } from '@tslite/ast';
4
4
  import { CapabilityProfile, CompiledProfile } from '@tslite/capability';
5
5
  import { Span } from '@tslite/language-service';
6
6
 
7
7
  /** As declarações de tipo nominal: o nome e os type params, em ordem. */
8
8
  type Nominals = Readonly<Record<string, readonly VarSchema[]>>;
9
9
 
10
- /**
11
- * Um nível de escopo léxico (nome → `Schema`), sobre o `Scope<T>` genérico do
12
- * `ast` — a mesma cadeia que o `behavior` usa, com o payload do eixo de tipos.
13
- */
14
- type Scope = Scope$1<Schema>;
15
- /** Cria um escopo raiz (sem pai). */
16
- declare const rootScope: (vars?: Record<string, Schema>) => Scope;
17
- /** Estende `parent` com novos bindings, criando um escopo filho. */
18
- declare const childScope: (parent: Scope, vars: Record<string, Schema>) => Scope;
19
- /** Resolve `name` subindo a cadeia léxica. `undefined` se não existir. */
20
- declare const lookup: (scope: Scope, name: string) => Schema | undefined;
21
- /**
22
- * Todos os nomes visíveis a partir de `scope`, com shadowing — o binding mais
23
- * interno vence. É o que alimenta o autocomplete de identificadores. Duas
24
- * chaves moram no mesmo escopo e não são nomes: a que tem `.` é um caminho
25
- * estreitado por guard (`narrow`, D13), e a que termina em `#` é o tipo
26
- * DECLARADO de um binding mutável (D63) — nenhum identificador tem esses
27
- * caracteres.
28
- */
29
- declare const visibleNames: (scope: Scope) => Map<string, Schema>;
30
- /**
31
- * O ambiente injetado pela aplicação — a fronteira de tipos do sistema.
32
- * `scope` é a raiz da DI; `types` resolve tipos nomeados em anotações.
33
- */
34
- /**
35
- * O ambiente é **só tipos** (a fronteira da DI). Capability — o que pode ser
36
- * programado — é ortogonal e mora no `CapabilityProfile` (`@tslite/capability`),
37
- * passado ao `check` por `{ profile }`. Não há mais noção de capability no Env.
38
- */
39
- interface Env {
40
- readonly scope: Scope;
41
- readonly types: Readonly<Record<string, Schema>>;
42
- /** Type schemes parametrizados (`type Pair<A, B> = …`), expandidos sob demanda. */
43
- readonly schemes: Schemes;
44
- /**
45
- * Acessores **indexados por path literal**: nome → schema-base que ele navega.
46
- * Ex.: `get` sobre o schema dos States → `get("hp","value")` tipa como
47
- * `discover(base, ["hp","value"])`. É como a fronteira tipa leituras de estado
48
- * sem `unknown` (o app declara o shape; o checker indexa). Default: nenhum.
49
- */
50
- readonly accessors?: Readonly<Record<string, Schema>>;
51
- /**
52
- * **Asserters** (a fronteira sã): nomes de funções cujo retorno é o **tipo do
53
- * schema nomeado** no 1º argumento. Ex.: com `parse` aqui, `parse(User, x)`
54
- * tipa como `User` (e em runtime o `@tslite/validate` valida o valor). É o
55
- * `parse()` estilo zod: fecha `unknown`/complexidade — o tipo "reseta" limpo
56
- * na fronteira, **provado** em runtime (≠ `as`). Default: nenhum.
57
- */
58
- readonly asserters?: ReadonlySet<string>;
59
- /**
60
- * **Matchers de props** (o diferencial): nomes de funções que checam, em
61
- * edit-time, se um **payload** (saída de um serviço de automação / nocode) é
62
- * **compatível com as props de um componente** react-like. Ex.: com
63
- * `matchesProps` aqui, `matchesProps(Card, request)` extrai as props de `Card`
64
- * (`(props) => Element`, agnóstico ao framework — Element é `apply` opaco) e
65
- * verifica `request ≤ props` (campos a mais no request são OK; faltar/tipo-errado
66
- * em prop obrigatória → diagnóstico `props-mismatch`). Retorna `boolean`. Default:
67
- * nenhum.
68
- */
69
- readonly matchers?: ReadonlySet<string>;
70
- /**
71
- * **Módulos** (a borda DI NOMEADA): especificador → o `object` Schema dos
72
- * exports daquele módulo (`{ map: fn, filter: fn, …, default: … }`). É o D3
73
- * estendido a módulos: `import { map } from "@x/ops"` liga `map` ao
74
- * `modules["@x/ops"].props.map`. O checker **não resolve** o módulo (sem file
75
- * system) — consome o tipo já provido; a *resolução* (qual módulo é o
76
- * especificador) é da app (Proposal 005). Default: nenhum.
77
- */
78
- readonly modules?: Readonly<Record<string, Schema>>;
79
- /**
80
- * Os aliases da **lib padrão** (`Partial`, `Pick`, `Record`, `Omit`, `ReturnType`…),
81
- * o texto do `lib.es5.d.ts` do tsc 3.9.10 com o corte do TSLite (D79). Ficam ABAIXO
82
- * de tudo: um tipo do host ou um alias do programa com o mesmo nome os sombreia.
83
- * Vazio com `noLib`.
84
- */
85
- readonly lib?: Schemes;
86
- /**
87
- * Os tipos **nominais** que um texto de tipo pode citar pelo nome: o nome e os type
88
- * params de cada um. São os `interface` da lib (`Array`, `ReadonlyArray`, `Promise`)
89
- * e os que o host declara (`Map`, `Element`…). Um nominal é o `apply` opaco (types
90
- * TC2): o texto `Promise<User>` e o construtor `s.apply("Promise", [User])` são o
91
- * mesmo tipo, e a aridade é cobrada como a de um alias.
92
- */
93
- readonly nominals?: Nominals;
94
- }
95
- /**
96
- * O que um `Env` tem além das variáveis. Cada campo espelha o de {@link Env}, e
97
- * todos são opcionais.
98
- */
99
- interface EnvOptions {
100
- readonly types?: Readonly<Record<string, Schema>>;
101
- readonly schemes?: Readonly<Record<string, TypeScheme>>;
102
- readonly accessors?: Readonly<Record<string, Schema>>;
103
- readonly asserters?: ReadonlySet<string>;
104
- readonly matchers?: ReadonlySet<string>;
105
- readonly modules?: Readonly<Record<string, Schema>>;
106
- /** Os nominais do host, somados aos da lib (ver {@link Env.nominals}). */
107
- readonly nominals?: Nominals;
108
- /**
109
- * Sem a lib padrão — nem os aliases, nem os nominais dela. É o `--noLib` do tsc: os
110
- * nomes da lib passam a ser `unknown-name`, como lá.
111
- */
112
- readonly noLib?: boolean;
113
- }
114
- /**
115
- * Um catálogo (`Record<string, Schema>`) passado no lugar das opções é o erro que a
116
- * forma antiga convida (`createEnv(vars, types)`), e o TypeScript o aceitaria em
117
- * silêncio: um tipo com índice de string cabe num objeto de opções todas
118
- * opcionais. Este tipo o recusa na compilação — `keyof` de um catálogo é `string`.
119
- */
120
- type NoCatalog<O> = string extends keyof O ? never : unknown;
121
- /**
122
- * Cria um `Env`: as variáveis injetadas (a raiz da DI) e, por nome, o resto —
123
- * tipos nomeados, type schemes, acessores, asserters, matchers, módulos.
124
- * Capability é separada (passe um `profile` ao `check`).
125
- *
126
- * As opções são NOMEADAS porque a forma posicional já custou um defeito: uma
127
- * chamada que parava no quarto argumento compilava, e o asserter (o quinto) ficava
128
- * fora do ambiente — `parseAs` virava `unknown-name` só naquele lugar. Uma chave
129
- * fora do vocabulário (um catálogo no lugar das opções, um `type` no lugar de
130
- * `types`) é `invalid-env-options`, na montagem: o `Env` não nasce com uma metade
131
- * calada.
132
- */
133
- declare const createEnv: <O extends EnvOptions = EnvOptions>(vars?: Readonly<Record<string, Schema>>, options?: O & NoCatalog<O>) => Env;
134
- /** Os erros que a MONTAGEM do ambiente lança (o `check` em si nunca lança — D2). */
135
- type CheckerErrorCode = "invalid-env-options";
136
- /** Resolve um tipo nomeado (`type User = …`) declarado no ambiente. */
137
- declare const resolveNamed: (env: Env, name: string) => Schema | undefined;
138
- /** Resolve um type scheme (`type Pair<A, B> = …`) declarado no ambiente. */
139
- declare const resolveScheme: (env: Env, name: string) => TypeScheme | undefined;
140
-
141
10
  type Severity = "error" | "warning";
142
- 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" | "readonly-write" | "cast-unsound" | "unprovable-value" | "not-arithmetic-operand" | "operator-not-applicable" | "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";
11
+ 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" | "misplaced-modifier" | "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";
143
12
  /**
144
13
  * A **classe** do diagnóstico — espelha a divisão de passes do `tsc` (que nós
145
14
  * fundimos num walk só): `semantic` é o que o **binder** do tsc pega (validade do
@@ -216,6 +85,22 @@ interface Diagnostic {
216
85
  * deriva do `code` (mesma fonte única).
217
86
  */
218
87
  declare const makeDiagnostic: (code: DiagnosticCode, node: BaseNode, message: string, severity?: Severity) => Diagnostic;
88
+ /**
89
+ * Um diagnóstico do AMBIENTE (D93): o erro no contrato que o host declara pelo `createEnv` —
90
+ * o equivalente dos erros de um `.d.ts` no tsc, que são do arquivo de declarações, e não do
91
+ * programa que o usa. O ambiente não tem nó: o lugar é o caminho dentro das opções do
92
+ * `createEnv` — a opção, a chave, e o caminho no `Schema` até o nome (`["vars",
93
+ * "state.phase"]`, `["schemes", "state.R", "body", "props", "a", "type"]`).
94
+ */
95
+ interface EnvDiagnostic {
96
+ readonly code: DiagnosticCode;
97
+ /** A classe do diagnóstico (deriva do `code`) — ver {@link DiagnosticKind}. */
98
+ readonly kind: DiagnosticKind;
99
+ readonly severity: Severity;
100
+ readonly message: string;
101
+ /** Onde, no ambiente: a opção, a chave e o caminho no `Schema`. */
102
+ readonly path: readonly (string | number)[];
103
+ }
219
104
  /**
220
105
  * Fábricas de diagnósticos. Mensagens no estilo do tsc, com tipos renderizados
221
106
  * por `format`.
@@ -250,13 +135,37 @@ declare const diag: {
250
135
  */
251
136
  unknownValue: (node: BaseNode) => Diagnostic;
252
137
  constNeedsInit: (node: BaseNode) => Diagnostic;
138
+ /** TS1182: o padrão sem valor, de qualquer kind, fora do contexto ambiente — o
139
+ * `checkGrammarVariableDeclaration` o testa antes do TS1155. */
140
+ destructuringNeedsInit: (node: BaseNode) => Diagnostic;
253
141
  missingArgument: (node: BaseNode, name: string, expected: Schema) => Diagnostic;
254
142
  notASchema: (node: BaseNode, name: string) => Diagnostic;
255
143
  typeAsValue: (node: BaseNode, name: string) => Diagnostic;
256
144
  asserterNeedsName: (node: BaseNode, asserter: string) => Diagnostic;
257
145
  shadowsSchema: (node: BaseNode, name: string) => Diagnostic;
258
146
  unknownModule: (node: BaseNode, source: string) => Diagnostic;
259
- cannotRedeclare: (node: BaseNode, name: string) => Diagnostic;
147
+ /**
148
+ * O mesmo nome declarado de novo onde não pode, com o texto de cada mecanismo do tsc
149
+ * 3.9.10. O conceito é um só, o do `cannot-redeclare` (D2), e o nó é o NOME de cada
150
+ * declaração acusada.
151
+ */
152
+ redeclaration: {
153
+ /** TS2451: o que está na tabela é variável de escopo de bloco (o `declareSymbol` do
154
+ * binder, `binder.ts:476`), em cada declaração. */
155
+ blockScoped: (node: BaseNode, name: string) => Diagnostic;
156
+ /** TS2300: o que está na tabela é outra coisa (um parâmetro, um import, um alias, um
157
+ * namespace), em cada declaração. */
158
+ duplicate: (node: BaseNode, name: string) => Diagnostic;
159
+ /** TS2440: o import fundido com uma declaração local que ocupa o significado do alvo
160
+ * dele (o `checkAliasSymbol`, `checker.ts:34279`), no especificador. */
161
+ importConflict: (node: BaseNode, name: string) => Diagnostic;
162
+ /** TS2492: o bloco do `catch` declara de novo o binding dele (o `checkTryStatement`,
163
+ * `checker.ts:33056`), na declaração do bloco. */
164
+ catchClause: (node: BaseNode, name: string) => Diagnostic;
165
+ /** TS2395: declarações do mesmo símbolo, umas exportadas e outras locais, no mesmo
166
+ * espaço (o `checkExportsOnMergedDeclarations`, `checker.ts:30401`), em cada uma. */
167
+ mixedExport: (node: BaseNode, name: string) => Diagnostic;
168
+ };
260
169
  circularTypeAlias: (node: BaseNode, name: string) => Diagnostic;
261
170
  circularTypeAnnotation: (node: BaseNode, name: string) => Diagnostic;
262
171
  excessArgument: (node: BaseNode, expected: number, got: number) => Diagnostic;
@@ -346,6 +255,52 @@ declare const diag: {
346
255
  * lugar do `{1}`. */
347
256
  constraintViolation: (node: BaseNode, actual: Schema, bound: Schema) => Diagnostic;
348
257
  unsupported: (node: BaseNode, what: string) => Diagnostic;
258
+ /**
259
+ * O nome usado antes da declaração dele, com o texto de cada mecanismo do tsc 3.9.10. O
260
+ * conceito é um só (D2), e o nó é o USO.
261
+ */
262
+ usedBeforeDeclaration: {
263
+ /** TS2448: a variável de escopo de bloco (o `checkResolvedBlockScopedVariable`,
264
+ * `checker.ts:2259`), com a declaração na informação relacionada (TS2728). */
265
+ blockScoped: (node: BaseNode, name: string, declaration: BaseNode) => Diagnostic;
266
+ /** TS2372: o default de um parâmetro cita o próprio parâmetro (`checker.ts:2009`). */
267
+ parameterSelf: (node: BaseNode, parameter: string) => Diagnostic;
268
+ /** TS2373: o default de um parâmetro cita um declarado depois dele (`checker.ts:2013`). */
269
+ parameterAfter: (node: BaseNode, parameter: string, name: string) => Diagnostic;
270
+ };
271
+ /** TS2454: a leitura de uma variável que, por algum caminho, ainda não recebeu valor. */
272
+ usedBeforeAssigned: (node: BaseNode, name: string) => Diagnostic;
273
+ /** O namespace (D83), com o texto do tsc em cada um. */
274
+ namespace: {
275
+ /** TS2503: o primeiro segmento de um nome qualificado não é namespace nenhum. O
276
+ * código é o do nome que não existe, como o TS2304. */
277
+ notFound: (node: BaseNode, name: string) => Diagnostic;
278
+ /** TS2694: o namespace não exporta o membro, no segmento do membro. */
279
+ noExportedMember: (node: BaseNode, namespace: string, member: string) => Diagnostic;
280
+ /** TS2708: um namespace só de tipos numa posição de valor — o par do TS2693. */
281
+ asValue: (node: BaseNode, name: string) => Diagnostic;
282
+ /** TS1235: a declaração fora do topo e de outro namespace, no primeiro token. */
283
+ misplaced: (node: BaseNode) => Diagnostic;
284
+ };
285
+ /** O lugar do modificador `declare` — o `checkGrammarModifiers` do tsc, no primeiro token
286
+ * da declaração, que é o `declare`. */
287
+ modifier: {
288
+ /** TS1184: o `declare` numa declaração fora do topo e do bloco de um namespace. */
289
+ cannotAppearHere: (node: BaseNode) => Diagnostic;
290
+ /** TS1038: o `declare` numa declaração que já está num contexto ambiente. */
291
+ alreadyAmbient: (node: BaseNode) => Diagnostic;
292
+ };
293
+ /** O contexto ambiente (`declare namespace`, e a declaração com `declare`) só declara — o
294
+ * `checkAmbientInitializer` e o `checkGrammarStatementInAmbientContext` do tsc, no nó de
295
+ * lá. */
296
+ ambient: {
297
+ /** TS1039: o inicializador que o contexto ambiente não aceita, nele. */
298
+ initializer: (node: BaseNode) => Diagnostic;
299
+ /** TS1254: o `const` sem anotação com um inicializador que não é literal, nele. */
300
+ constInitializer: (node: BaseNode) => Diagnostic;
301
+ /** TS1036: o statement que não é declaração, uma vez por bloco, no primeiro token. */
302
+ statement: (node: BaseNode) => Diagnostic;
303
+ };
349
304
  /**
350
305
  * Argumento de tipo explícito com aridade errada. Assinatura **sem** type params
351
306
  * declarados conta como `expected: 0` — é o que o tsc faz quando
@@ -370,7 +325,7 @@ declare const diag: {
370
325
  * a resposta é sempre não (D9 — o piso é `const`). Mensagem no texto do TS2588 /
371
326
  * TS2632 (import). Ver `mutation.ts`.
372
327
  */
373
- assignToConst: (node: BaseNode, name: string, kind: "const" | "import") => Diagnostic;
328
+ assignToConst: (node: BaseNode, name: string, kind: "const" | "import" | "not-a-variable") => Diagnostic;
374
329
  /**
375
330
  * As chaves de um `for…in` não cabem no alvo dele (`let n: number; for (n in o)`). É a
376
331
  * relação que falha — o tipo das chaves contra o tipo declarado do alvo —, e por isso
@@ -379,6 +334,10 @@ declare const diag: {
379
334
  forInTarget: (node: BaseNode) => Diagnostic;
380
335
  /** `for ([a] in o)` — o alvo de um `for…in` é uma chave, não se desestrutura. TS2491. */
381
336
  forInDestructuring: (node: BaseNode) => Diagnostic;
337
+ /** `for (k in n)` com `n` que não é objeto, `any` nem type param — o TS2407 do
338
+ * `checkForInStatement` do tsc (`checker.ts:32148`), no que se percorre, com o tipo sem o
339
+ * nulo. */
340
+ forInNotObject: (node: BaseNode, type: Schema) => Diagnostic;
382
341
  /**
383
342
  * Escrita por um ÍNDICE readonly — `readonly T[]` ou `{ readonly [k: string]: V }`. É
384
343
  * a outra metade do modificador: a relação (TC29) diz quem pode ser ATRIBUÍDO a quem;
@@ -418,6 +377,29 @@ declare const diag: {
418
377
  * entre tipos incompatíveis. Espelha TS2365.
419
378
  */
420
379
  operatorNotApplicable: (node: BaseNode, op: string, left: Schema, right: Schema) => Diagnostic;
380
+ /**
381
+ * TS2678: o `case` de um `switch` que não é comparável ao discriminante, no `case` — o
382
+ * `checkTypeComparableTo` do `checkSwitchStatement` do tsc (`checker.ts:32977`). Os tipos
383
+ * chegam como a comparação os viu: alargados até a base, a menos que os dois sejam
384
+ * literais. O tsc elabora a relação num objeto (TS2741, TS2740); aqui a mensagem é a do
385
+ * TS2678, e o código é o contrato (D2).
386
+ */
387
+ notComparable: (node: BaseNode, source: Schema, target: Schema) => Diagnostic;
388
+ /**
389
+ * TS2774: a condição de um `if` ou de um `?:` é uma função que nunca é falsy, e o ramo
390
+ * verdadeiro não a usa — o `checkTestingKnownTruthyCallableType` do tsc
391
+ * (`checker.ts:31963`), na condição.
392
+ */
393
+ uncalledFunctionCheck: (node: BaseNode) => Diagnostic;
394
+ /**
395
+ * TS2367: uma igualdade entre tipos sem sobreposição, cujo resultado já é sabido — o
396
+ * `tryGiveBetterPrimaryError` do tsc (`checker.ts`, no `reportOperatorError`): `'false'`
397
+ * para `===`/`==`, `'true'` para `!==`/`!=`. Os tipos chegam como a mensagem os mostra
398
+ * (as bases, quando os literais também não se relacionam). Com `missingAwait`, os dois
399
+ * lados se relacionariam desembrulhando o `Promise`, e a informação relacionada é o
400
+ * TS2773 (o `errorAndMaybeSuggestAwait`).
401
+ */
402
+ noOverlap: (node: BaseNode, op: string, left: Schema, right: Schema, missingAwait: boolean) => Diagnostic;
421
403
  /**
422
404
  * `"x" + n` — o `+` não converte para texto (Proposal 009).
423
405
  *
@@ -461,6 +443,224 @@ interface DiagnosticSink {
461
443
  /** Cria um coletor vazio. */
462
444
  declare function createSink(): DiagnosticSink;
463
445
 
446
+ /** O que uma declaração de namespace declara com um nome. */
447
+ interface NamespaceMember {
448
+ /** Visível de fora: tem `export`, ou está num contexto ambiente que exporta tudo. */
449
+ readonly exported: boolean;
450
+ /** O nome, onde o diagnóstico sobre a declaração pousa; `null` num membro do ambiente,
451
+ * que não tem texto. */
452
+ readonly id: BaseNode | null;
453
+ /** A chave do tipo no catálogo, quando não é o nome qualificado (`path.nome`): a de um
454
+ * tipo que outra declaração do mesmo namespace também declara (checker D88). */
455
+ readonly key?: string;
456
+ }
457
+ /** Uma declaração de namespace — um bloco. `namespace A.B { … }` são duas: o `A` e o `B`. */
458
+ interface NamespaceDeclaration {
459
+ /** O `TSModuleDeclaration`; `null` num namespace do ambiente, que vem das chaves do
460
+ * catálogo e não de texto. */
461
+ readonly node: BaseNode | null;
462
+ /** O caminho qualificado (`app.router`). */
463
+ readonly path: string;
464
+ /** A declaração de fora, ou `null` no topo. */
465
+ readonly parent: NamespaceDeclaration | null;
466
+ /** No contexto ambiente (`declare namespace`, e o que está dentro dele). */
467
+ readonly ambient: boolean;
468
+ /** O bloco tem valores (o `Instantiated` do `getModuleInstanceState`). */
469
+ readonly instantiated: boolean;
470
+ /** Os tipos que ESTE bloco declara (os locais do tsc, com o sentido de tipo). Um tipo e
471
+ * um namespace com o mesmo nome convivem, por isso as duas tabelas. */
472
+ readonly types: ReadonlyMap<string, NamespaceMember>;
473
+ /** Os namespaces que ESTE bloco declara. */
474
+ readonly namespaces: ReadonlyMap<string, NamespaceMember>;
475
+ /** Os valores que ESTE bloco declara — só no namespace do AMBIENTE (as variáveis do host
476
+ * com o nome qualificado, D93). Os do programa são tipados pelo walk (D90). */
477
+ readonly values?: ReadonlyMap<string, NamespaceMember>;
478
+ }
479
+ /** As declarações de namespace de uma raiz — o programa, ou o ambiente. */
480
+ interface Namespaces {
481
+ /** As declarações de cada namespace, pelo caminho, na ordem. */
482
+ readonly byPath: ReadonlyMap<string, readonly NamespaceDeclaration[]>;
483
+ /** A declaração de cada nó `TSModuleDeclaration` que está num lugar permitido. */
484
+ readonly byNode: WeakMap<BaseNode, NamespaceDeclaration>;
485
+ /** Os aliases escritos num namespace: o nó da declaração do alias → a do namespace. */
486
+ readonly aliasOwner: WeakMap<BaseNode, NamespaceDeclaration>;
487
+ }
488
+
489
+ /**
490
+ * Um nível de escopo léxico (nome → `Schema`), sobre o `Scope<T>` genérico do
491
+ * `ast` — a mesma cadeia que o `behavior` usa, com o payload do eixo de tipos.
492
+ */
493
+ type Scope = Scope$1<Schema>;
494
+ /** Cria um escopo raiz (sem pai). */
495
+ declare const rootScope: (vars?: Record<string, Schema>) => Scope;
496
+ /** Estende `parent` com novos bindings, criando um escopo filho. */
497
+ declare const childScope: (parent: Scope, vars: Record<string, Schema>) => Scope;
498
+ /** Resolve `name` subindo a cadeia léxica. `undefined` se não existir. */
499
+ declare const lookup: (scope: Scope, name: string) => Schema | undefined;
500
+ /**
501
+ * Todos os nomes visíveis a partir de `scope`, com shadowing — o binding mais
502
+ * interno vence. É o que alimenta o autocomplete de identificadores. Duas
503
+ * chaves moram no mesmo escopo e não são nomes: a que tem `.` é um caminho
504
+ * estreitado por guard (`narrow`, D13), e a que termina em `#` é o tipo
505
+ * DECLARADO de um binding mutável (D63) — nenhum identificador tem esses
506
+ * caracteres.
507
+ *
508
+ * Um binding do programa tem a chave do SÍMBOLO (`nome@id`, D87), e dois símbolos com
509
+ * o mesmo nome são chaves diferentes: o nome visível é o de fora do `@`, e vale o mais
510
+ * interno. A cadeia vem de dentro para fora, e um refinamento de um símbolo só existe
511
+ * onde o nome dele não está sombreado — então a primeira chave de cada nome é a que ele
512
+ * denota ali.
513
+ */
514
+ declare const visibleNames: (scope: Scope) => Map<string, Schema>;
515
+ /**
516
+ * `name`, visto de `scope`, denota um nome do AMBIENTE (a DI, a lib) — e não um símbolo
517
+ * do programa? É o que o tsc responde olhando a declaração do símbolo resolvido (o
518
+ * `defaultLibrary` do `classifier2020`). A primeira ligação do nome, de dentro para fora, é
519
+ * a que ele denota ali (ver `visibleNames`); `false` quando nada o liga.
520
+ */
521
+ declare function resolvesToEnvironment(scope: Scope, name: string): boolean;
522
+ /**
523
+ * O ambiente injetado pela aplicação — a fronteira de tipos do sistema.
524
+ * `scope` é a raiz da DI; `types` resolve tipos nomeados em anotações.
525
+ */
526
+ /**
527
+ * O ambiente é **só tipos** (a fronteira da DI). Capability — o que pode ser
528
+ * programado — é ortogonal e mora no `CapabilityProfile` (`@tslite/capability`),
529
+ * passado ao `check` por `{ profile }`. Não há mais noção de capability no Env.
530
+ */
531
+ interface Env {
532
+ readonly scope: Scope;
533
+ readonly types: Readonly<Record<string, Schema>>;
534
+ /** Type schemes parametrizados (`type Pair<A, B> = …`), expandidos sob demanda. */
535
+ readonly schemes: Schemes;
536
+ /**
537
+ * Acessores **indexados por path literal**: nome → schema-base que ele navega.
538
+ * Ex.: `get` sobre o schema dos States → `get("hp","value")` tipa como
539
+ * `discover(base, ["hp","value"])`. É como a fronteira tipa leituras de estado
540
+ * sem `unknown` (o app declara o shape; o checker indexa). Default: nenhum.
541
+ */
542
+ readonly accessors?: Readonly<Record<string, Schema>>;
543
+ /**
544
+ * **Asserters** (a fronteira sã): nomes de funções cujo retorno é o **tipo do
545
+ * schema nomeado** no 1º argumento. Ex.: com `parse` aqui, `parse(User, x)`
546
+ * tipa como `User` (e em runtime o `@tslite/validate` valida o valor). É o
547
+ * `parse()` estilo zod: fecha `unknown`/complexidade — o tipo "reseta" limpo
548
+ * na fronteira, **provado** em runtime (≠ `as`). Default: nenhum.
549
+ */
550
+ readonly asserters?: ReadonlySet<string>;
551
+ /**
552
+ * **Matchers de props** (o diferencial): nomes de funções que checam, em
553
+ * edit-time, se um **payload** (saída de um serviço de automação / nocode) é
554
+ * **compatível com as props de um componente** react-like. Ex.: com
555
+ * `matchesProps` aqui, `matchesProps(Card, request)` extrai as props de `Card`
556
+ * (`(props) => Element`, agnóstico ao framework — Element é `apply` opaco) e
557
+ * verifica `request ≤ props` (campos a mais no request são OK; faltar/tipo-errado
558
+ * em prop obrigatória → diagnóstico `props-mismatch`). Retorna `boolean`. Default:
559
+ * nenhum.
560
+ */
561
+ readonly matchers?: ReadonlySet<string>;
562
+ /**
563
+ * **Módulos** (a borda DI NOMEADA): especificador → o `object` Schema dos
564
+ * exports daquele módulo (`{ map: fn, filter: fn, …, default: … }`). É o D3
565
+ * estendido a módulos: `import { map } from "@x/ops"` liga `map` ao
566
+ * `modules["@x/ops"].props.map`. O checker **não resolve** o módulo (sem file
567
+ * system) — consome o tipo já provido; a *resolução* (qual módulo é o
568
+ * especificador) é da app (Proposal 005). Default: nenhum.
569
+ */
570
+ readonly modules?: Readonly<Record<string, Schema>>;
571
+ /**
572
+ * Os aliases da **lib padrão** (`Partial`, `Pick`, `Record`, `Omit`, `ReturnType`…),
573
+ * o texto do `lib.es5.d.ts` do tsc 3.9.10 com o corte do TSLite (D79). Ficam ABAIXO
574
+ * de tudo: um tipo do host ou um alias do programa com o mesmo nome os sombreia.
575
+ * Vazio com `noLib`.
576
+ */
577
+ readonly lib?: Schemes;
578
+ /**
579
+ * Os tipos **nominais** que um texto de tipo pode citar pelo nome: o nome e os type
580
+ * params de cada um. São os `interface` da lib (`Array`, `ReadonlyArray`, `Promise`)
581
+ * e os que o host declara (`Map`, `Element`…). Um nominal é o `apply` opaco (types
582
+ * TC2): o texto `Promise<User>` e o construtor `s.apply("Promise", [User])` são o
583
+ * mesmo tipo, e a aridade é cobrada como a de um alias.
584
+ */
585
+ readonly nominals?: Nominals;
586
+ /**
587
+ * Os namespaces do ambiente (D83), lidos das chaves de `types` e `schemes`: um tipo com o
588
+ * nome qualificado (`state.Config`) é o membro `Config` do namespace `state`, como num
589
+ * `.d.ts` com `declare namespace state { … }`. Os corpos já chegam com os nomes
590
+ * resolvidos a partir do namespace de cada um — um `Config` no corpo de `state.Result` é
591
+ * o `state.Config` —, sem o host reescrever nada.
592
+ */
593
+ readonly namespaces?: Namespaces;
594
+ /**
595
+ * Os erros do contrato que o host declarou (D93) — o equivalente dos erros de um `.d.ts`
596
+ * no tsc, que são do arquivo de declarações e não do programa que o usa. Achados uma vez,
597
+ * no `createEnv`; o `check` não os repete. Um nome que não resolve em lugar nenhum do
598
+ * ambiente é o `unknown-name` (TS2304), e vale o tipo-erro.
599
+ */
600
+ readonly diagnostics?: readonly EnvDiagnostic[];
601
+ }
602
+ /**
603
+ * O que um `Env` tem além das variáveis. Cada campo espelha o de {@link Env}, e
604
+ * todos são opcionais.
605
+ */
606
+ interface EnvOptions {
607
+ readonly types?: Readonly<Record<string, Schema>>;
608
+ readonly schemes?: Readonly<Record<string, TypeScheme>>;
609
+ readonly accessors?: Readonly<Record<string, Schema>>;
610
+ readonly asserters?: ReadonlySet<string>;
611
+ readonly matchers?: ReadonlySet<string>;
612
+ readonly modules?: Readonly<Record<string, Schema>>;
613
+ /** Os nominais do host, somados aos da lib (ver {@link Env.nominals}). */
614
+ readonly nominals?: Nominals;
615
+ /**
616
+ * Sem a lib padrão — nem os aliases, nem os nominais dela. É o `--noLib` do tsc: os
617
+ * nomes da lib passam a ser `unknown-name`, como lá.
618
+ */
619
+ readonly noLib?: boolean;
620
+ }
621
+ /**
622
+ * Um catálogo (`Record<string, Schema>`) passado no lugar das opções é o erro que a
623
+ * forma antiga convida (`createEnv(vars, types)`), e o TypeScript o aceitaria em
624
+ * silêncio: um tipo com índice de string cabe num objeto de opções todas
625
+ * opcionais. Este tipo o recusa na compilação — `keyof` de um catálogo é `string`.
626
+ */
627
+ type NoCatalog<O> = string extends keyof O ? never : unknown;
628
+ /**
629
+ * Cria um `Env`: as variáveis injetadas (a raiz da DI) e, por nome, o resto —
630
+ * tipos nomeados, type schemes, acessores, asserters, matchers, módulos.
631
+ * Capability é separada (passe um `profile` ao `check`).
632
+ *
633
+ * As opções são NOMEADAS porque a forma posicional já custou um defeito: uma
634
+ * chamada que parava no quarto argumento compilava, e o asserter (o quinto) ficava
635
+ * fora do ambiente — `parseAs` virava `unknown-name` só naquele lugar. Uma chave
636
+ * fora do vocabulário (um catálogo no lugar das opções, um `type` no lugar de
637
+ * `types`) é `invalid-env-options`, na montagem: o `Env` não nasce com uma metade
638
+ * calada.
639
+ */
640
+ declare const createEnv: <O extends EnvOptions = EnvOptions>(vars?: Readonly<Record<string, Schema>>, options?: O & NoCatalog<O>) => Env;
641
+ /**
642
+ * Um `Schema` como se estivesse escrito DENTRO do namespace `namespace` do ambiente
643
+ * (`"state"`, `"app.router"`; `null` na raiz): os nomes dele resolvidos como os do `createEnv`
644
+ * — no namespace e nos de fora, depois entre os tipos do ambiente e da lib (D83, D93) —, com o
645
+ * nome qualificado no lugar. É o `getTypeFromTypeNode` do tsc, que resolve um tipo pelo
646
+ * contêiner em que ele está escrito; aqui o contêiner é dito, porque o `Schema` não tem
647
+ * posição. Serve ao host que monta tipos por código e os publica no namespace do dono.
648
+ *
649
+ * O que não resolve vale o tipo-erro, e volta em `diagnostics`, com o caminho a partir da raiz
650
+ * do `Schema`. Um namespace que o ambiente não declara resolve como o mais próximo de fora que
651
+ * ele declara. O mesmo `Schema` volta quando nada muda (os caches são por referência, TC17).
652
+ */
653
+ declare function resolveTypeNamesIn(env: Env, namespace: string | null, type: Schema): {
654
+ readonly type: Schema;
655
+ readonly diagnostics: readonly EnvDiagnostic[];
656
+ };
657
+ /** Os erros que a MONTAGEM do ambiente lança (o `check` em si nunca lança — D2). */
658
+ type CheckerErrorCode = "invalid-env-options";
659
+ /** Resolve um tipo nomeado (`type User = …`) declarado no ambiente. */
660
+ declare const resolveNamed: (env: Env, name: string) => Schema | undefined;
661
+ /** Resolve um type scheme (`type Pair<A, B> = …`) declarado no ambiente. */
662
+ declare const resolveScheme: (env: Env, name: string) => TypeScheme | undefined;
663
+
464
664
  /** Liga a análise de não-usados. Dois eixos independentes, como no tsc. */
465
665
  interface UnusedOptions {
466
666
  /** ≅ `noUnusedLocals`: `const` e `import` nunca lidos. */
@@ -507,7 +707,8 @@ interface CheckResult {
507
707
  * forma de scheme. Publicado porque QUEM CONSULTA precisa dele: `discover`
508
708
  * (completions, navegação de membro) só expande um `apply` se receber este
509
709
  * catálogo. Sem publicar, cada consumidor re-derivaria a união — e derivações
510
- * paralelas divergem.
710
+ * paralelas divergem. Num programa sem alias é o catálogo do `Env`, o mesmo objeto em
711
+ * toda checagem, e congelado (D87).
511
712
  */
512
713
  readonly schemes: Schemes;
513
714
  /**
@@ -621,6 +822,15 @@ declare const FUNCTION_KINDS: readonly ["ArrowFunctionExpression", "FunctionExpr
621
822
  * nó proibido por `compiled` — via `nodeViolation`, a **fonte única** de gating
622
823
  * compartilhada com o interpret e o codegen. É o que `fromCapability` monta (+ o
623
824
  * host allowlist). Garante que os 3 consumidores concordam por construção.
825
+ *
826
+ * Cada nó vai com o pai: é ele que separa o `export` de um membro de namespace
827
+ * (a visibilidade, como o modificador do tsc) do `export` de módulo do teto
828
+ * (capability CP1).
829
+ *
830
+ * O profile diz o que um lugar da aplicação pode EXECUTAR, e o corpo de um namespace que não
831
+ * vira código não executa: o nó do namespace é gateado, e o corpo dele não
832
+ * (`bodyDoesNotRun`). Os guards de autoria de tipo, abaixo, julgam o texto escrito e descem
833
+ * nele.
624
834
  */
625
835
  declare function capabilityNodes(compiled: CompiledProfile, severity?: Severity): Guard;
626
836
  /**
@@ -919,4 +1129,4 @@ declare function anchorDiagnostics<A>(root: object, diagnostics: readonly Diagno
919
1129
  */
920
1130
  declare function spanOf(text: string, loc: SourceLocation | null | undefined): Span | undefined;
921
1131
 
922
- 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, resultType, rootScope, sameSymbol, scopeAt, scopeCompletions, spanOf, typeAt, unaryOpsProducing, visibleNames };
1132
+ 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 EnvDiagnostic, 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, resolveTypeNamesIn, resolvesToEnvironment, resultType, rootScope, sameSymbol, scopeAt, scopeCompletions, spanOf, typeAt, unaryOpsProducing, visibleNames };