@tslite/checker 1.8.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/{chunk-O7NTTIOJ.js → chunk-NXZILQOD.js} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +250 -196
- package/dist/index.d.ts +250 -196
- package/dist/index.js +1 -1
- package/dist/types/index.cjs +1 -1
- package/dist/types/index.d.cts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js +1 -1
- package/package.json +4 -4
package/dist/index.d.ts
CHANGED
|
@@ -7,200 +7,8 @@ import { Span } from '@tslite/language-service';
|
|
|
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
|
-
/** 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
10
|
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";
|
|
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";
|
|
204
12
|
/**
|
|
205
13
|
* A **classe** do diagnóstico — espelha a divisão de passes do `tsc` (que nós
|
|
206
14
|
* fundimos num walk só): `semantic` é o que o **binder** do tsc pega (validade do
|
|
@@ -277,6 +85,22 @@ interface Diagnostic {
|
|
|
277
85
|
* deriva do `code` (mesma fonte única).
|
|
278
86
|
*/
|
|
279
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
|
+
}
|
|
280
104
|
/**
|
|
281
105
|
* Fábricas de diagnósticos. Mensagens no estilo do tsc, com tipos renderizados
|
|
282
106
|
* por `format`.
|
|
@@ -311,6 +135,9 @@ declare const diag: {
|
|
|
311
135
|
*/
|
|
312
136
|
unknownValue: (node: BaseNode) => Diagnostic;
|
|
313
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;
|
|
314
141
|
missingArgument: (node: BaseNode, name: string, expected: Schema) => Diagnostic;
|
|
315
142
|
notASchema: (node: BaseNode, name: string) => Diagnostic;
|
|
316
143
|
typeAsValue: (node: BaseNode, name: string) => Diagnostic;
|
|
@@ -455,8 +282,17 @@ declare const diag: {
|
|
|
455
282
|
/** TS1235: a declaração fora do topo e de outro namespace, no primeiro token. */
|
|
456
283
|
misplaced: (node: BaseNode) => Diagnostic;
|
|
457
284
|
};
|
|
458
|
-
/** O
|
|
459
|
-
*
|
|
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á. */
|
|
460
296
|
ambient: {
|
|
461
297
|
/** TS1039: o inicializador que o contexto ambiente não aceita, nele. */
|
|
462
298
|
initializer: (node: BaseNode) => Diagnostic;
|
|
@@ -607,6 +443,224 @@ interface DiagnosticSink {
|
|
|
607
443
|
/** Cria um coletor vazio. */
|
|
608
444
|
declare function createSink(): DiagnosticSink;
|
|
609
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
|
+
|
|
610
664
|
/** Liga a análise de não-usados. Dois eixos independentes, como no tsc. */
|
|
611
665
|
interface UnusedOptions {
|
|
612
666
|
/** ≅ `noUnusedLocals`: `const` e `import` nunca lidos. */
|
|
@@ -1075,4 +1129,4 @@ declare function anchorDiagnostics<A>(root: object, diagnostics: readonly Diagno
|
|
|
1075
1129
|
*/
|
|
1076
1130
|
declare function spanOf(text: string, loc: SourceLocation | null | undefined): Span | undefined;
|
|
1077
1131
|
|
|
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 };
|
|
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 };
|