@tslite/checker 1.4.0 → 1.6.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,9 +1,12 @@
1
- import { 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, Prop, ScalarSchema, TYPE_EVAL_DEPTH_LIMIT, TupleSchema, TypeEvalLimitError, TypeEvalLimits, TypeForm, TypePosition, UnionSchema, UnionTooComplexError, UnknownSchema, VarCandidates, VarSchema, 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, renameTypeParams, resetInstantiationCount, resetTypeLimits, resolveConditional, resolveOp, resolveTypeOp, restIndex, s, sampleValue, silentNever, substitute, subtype, typeAtPosition, typeDiff, typeFeatures, typeLimits, typeNeedsParens, typeParamArity, unify, widen, widenInferred, widenLiteral, widenOrigin, widenType, withoutUndefined } from './types/index.cjs';
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
3
  import { Scope as Scope$1, BaseNode, 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
+ /** As declarações de tipo nominal: o nome e os type params, em ordem. */
8
+ type Nominals = Readonly<Record<string, readonly VarSchema[]>>;
9
+
7
10
  /**
8
11
  * Um nível de escopo léxico (nome → `Schema`), sobre o `Scope<T>` genérico do
9
12
  * `ast` — a mesma cadeia que o `behavior` usa, com o payload do eixo de tipos.
@@ -73,6 +76,21 @@ interface Env {
73
76
  * especificador) é da app (Proposal 005). Default: nenhum.
74
77
  */
75
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;
76
94
  }
77
95
  /**
78
96
  * O que um `Env` tem além das variáveis. Cada campo espelha o de {@link Env}, e
@@ -85,6 +103,13 @@ interface EnvOptions {
85
103
  readonly asserters?: ReadonlySet<string>;
86
104
  readonly matchers?: ReadonlySet<string>;
87
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;
88
113
  }
89
114
  /**
90
115
  * Um catálogo (`Record<string, Schema>`) passado no lugar das opções é o erro que a
@@ -114,7 +139,7 @@ declare const resolveNamed: (env: Env, name: string) => Schema | undefined;
114
139
  declare const resolveScheme: (env: Env, name: string) => TypeScheme | undefined;
115
140
 
116
141
  type Severity = "error" | "warning";
117
- 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" | "props-mismatch" | "no-matching-overload" | "constraint-violation" | "wrong-type-argument-count" | "unsupported" | "unused-name" | "assign-to-const" | "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";
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";
118
143
  /**
119
144
  * A **classe** do diagnóstico — espelha a divisão de passes do `tsc` (que nós
120
145
  * fundimos num walk só): `semantic` é o que o **binder** do tsc pega (validade do
@@ -162,6 +187,16 @@ type DiagnosticData = {
162
187
  readonly kind: "implicit-coercion";
163
188
  readonly textConvertible: boolean;
164
189
  };
190
+ /**
191
+ * Outro lugar do programa que explica o diagnóstico — o `DiagnosticRelatedInformation` do
192
+ * tsc (`types.ts`), que o `addRelatedInfo` anexa, e o `relatedInformation` do LSP. O nó é
193
+ * por referência, como o do diagnóstico; a mensagem diz o papel dele ("This spread always
194
+ * overwrites this property.").
195
+ */
196
+ interface DiagnosticRelatedInformation {
197
+ readonly node: BaseNode;
198
+ readonly message: string;
199
+ }
165
200
  interface Diagnostic {
166
201
  readonly code: DiagnosticCode;
167
202
  /** A classe do diagnóstico (deriva do `code`) — ver {@link DiagnosticKind}. */
@@ -172,6 +207,8 @@ interface Diagnostic {
172
207
  readonly message: string;
173
208
  /** Ver {@link DiagnosticData}. Presente só onde há o que agir. */
174
209
  readonly data?: DiagnosticData;
210
+ /** Ver {@link DiagnosticRelatedInformation}. Presente só onde o tsc a anexa. */
211
+ readonly relatedInformation?: readonly DiagnosticRelatedInformation[];
175
212
  }
176
213
  /**
177
214
  * Builder genérico de diagnóstico (severidade configurável). Usado pelos
@@ -239,9 +276,75 @@ declare const diag: {
239
276
  spreadArgument: (node: BaseNode) => Diagnostic;
240
277
  requiredAfterOptional: (node: BaseNode) => Diagnostic;
241
278
  notIterable: (node: BaseNode, type: Schema) => Diagnostic;
279
+ /**
280
+ * A fonte não se espalha: o `isValidSpreadType` do tsc (`checker.ts:23342`) a recusa. O
281
+ * código é o do conceito, par do `not-iterable` do padrão de array; a mensagem diz o caso.
282
+ */
283
+ notSpreadable: {
284
+ /** TS2700: o rest de um padrão de objeto (`{ a, ...rest }`), no elemento do rest
285
+ * (`getTypeForBindingElement`, `checker.ts:7439`). D80. */
286
+ rest: (node: BaseNode) => Diagnostic;
287
+ /** TS2698: o spread num literal de objeto (`{ ...x }`), no membro `...x`
288
+ * (`checkObjectLiteral`, `checker.ts:23254`). */
289
+ spread: (node: BaseNode) => Diagnostic;
290
+ };
291
+ /**
292
+ * A chave escrita duas vezes num literal de objeto. O tsc a acusa por três mecanismos, e
293
+ * cada um é um diagnóstico com o texto e o nó dele; o conceito é um só, o do
294
+ * `cannot-redeclare` (D25).
295
+ */
296
+ duplicateKey: {
297
+ /** TS1117: a chave IDENTIFICADOR repetida, no modo estrito (o `bindObjectLiteralExpression`
298
+ * do binder, `binder.ts:2037`), na repetição. */
299
+ strict: (node: BaseNode) => Diagnostic;
300
+ /** TS2300: o nome repetido (o `checkGrammarObjectLiteralExpression`), na repetição, com o
301
+ * texto do nome como escrito. */
302
+ identifier: (node: BaseNode, text: string) => Diagnostic;
303
+ /** TS2718: a chave computada ligada tarde com o nome de uma prop ligada cedo (o
304
+ * `lateBindMember`), na chave tardia. */
305
+ lateBound: (node: BaseNode, name: string) => Diagnostic;
306
+ /** TS2733: a primeira declaração ligada cedo desse nome, no mesmo `lateBindMember`. */
307
+ alsoDeclared: (node: BaseNode, name: string) => Diagnostic;
308
+ };
309
+ /**
310
+ * TS2783: a prop escrita num literal de objeto que um spread seguinte sempre sobrescreve,
311
+ * na prop escrita, com o spread na informação relacionada (TS2785) — o
312
+ * `checkSpreadPropOverrides` do tsc (`checker.ts:23558`).
313
+ */
314
+ overwrittenProperty: (node: BaseNode, name: string, spread: BaseNode) => Diagnostic;
315
+ /**
316
+ * O `any` que ninguém escreveu — o `noImplicitAny` do tsc 3.9.10, que faz parte do
317
+ * `--strict` e está sempre ligado aqui (D81). Um código só, com o texto de cada caso (o
318
+ * `reportImplicitAny`, `checker.ts:18198`, e os sítios do acesso e do `let` evolving): o
319
+ * código é o conceito, a mensagem diz qual é o caso (D2), como o `possibly-nullish`.
320
+ */
321
+ implicitAny: {
322
+ /** TS7006, no nome do parâmetro sem anotação e sem contexto. */
323
+ parameter: (node: BaseNode, name: string) => Diagnostic;
324
+ /** TS7019, no nome do rest sem anotação e sem contexto. */
325
+ rest: (node: BaseNode, name: string) => Diagnostic;
326
+ /** TS7031, em cada folha de um parâmetro-padrão sem anotação nem contexto. */
327
+ bindingElement: (node: BaseNode, name: string) => Diagnostic;
328
+ /** TS7034, no nome do `let` evolving que uma closure lê. */
329
+ evolving: (node: BaseNode, name: string) => Diagnostic;
330
+ /** TS7005, na leitura desse `let` dentro da closure. */
331
+ variable: (node: BaseNode, name: string) => Diagnostic;
332
+ /** TS7053, no acesso inteiro: a chave não indexa o objeto. */
333
+ index: (node: BaseNode, key: Schema, target: Schema) => Diagnostic;
334
+ /** TS7015, na chave: o objeto só tem índice numérico, e a chave não é número. */
335
+ indexNotNumber: (node: BaseNode) => Diagnostic;
336
+ };
337
+ /**
338
+ * A posição de um padrão de array além do comprimento de uma tupla — o TS2493 do tsc, no
339
+ * nome (`getPropertyTypeForIndexType`, `checker.ts:12886`). O código é o `no-such-member`,
340
+ * o mesmo do acesso `t[5]` (TC43): a posição é uma propriedade que a tupla não tem.
341
+ */
342
+ tupleIndexOutOfRange: (node: BaseNode, tuple: Schema, length: number, index: number) => Diagnostic;
242
343
  propsMismatch: (node: BaseNode, props: Schema, detail: string) => Diagnostic;
243
344
  noMatchingOverload: (node: BaseNode, type: Schema, argTypes: readonly Schema[]) => Diagnostic;
244
- constraintViolation: (node: BaseNode, name: string, actual: Schema, bound: Schema) => Diagnostic;
345
+ /** O argumento de tipo fora do bound — o texto do TS2344 da tag, com a constraint no
346
+ * lugar do `{1}`. */
347
+ constraintViolation: (node: BaseNode, actual: Schema, bound: Schema) => Diagnostic;
245
348
  unsupported: (node: BaseNode, what: string) => Diagnostic;
246
349
  /**
247
350
  * Argumento de tipo explícito com aridade errada. Assinatura **sem** type params
@@ -269,11 +372,25 @@ declare const diag: {
269
372
  */
270
373
  assignToConst: (node: BaseNode, name: string, kind: "const" | "import") => Diagnostic;
271
374
  /**
272
- * Escrita num alvo `readonly` (`readonly T[]`). É a outra metade do modificador:
273
- * a relação (TC29) diz quem pode ser ATRIBUÍDO a quem; isto diz quem pode ser
274
- * ESCRITO. Sem os dois, `readonly` seria só decoração. Texto do TS2542.
375
+ * As chaves de um `for…in` não cabem no alvo dele (`let n: number; for (n in o)`). É a
376
+ * relação que falha — o tipo das chaves contra o tipo declarado do alvo —, e por isso
377
+ * o código é o `not-assignable`; o texto é o do TS2405 (`checkForInStatement`).
378
+ */
379
+ forInTarget: (node: BaseNode) => Diagnostic;
380
+ /** `for ([a] in o)` — o alvo de um `for…in` é uma chave, não se desestrutura. TS2491. */
381
+ forInDestructuring: (node: BaseNode) => Diagnostic;
382
+ /**
383
+ * Escrita por um ÍNDICE readonly — `readonly T[]` ou `{ readonly [k: string]: V }`. É
384
+ * a outra metade do modificador: a relação (TC29) diz quem pode ser ATRIBUÍDO a quem;
385
+ * isto diz quem pode ser ESCRITO. Texto do TS2542, no acesso inteiro. Os três casos de
386
+ * escrita recusada pelo `readonly` têm um código só (D77): o nó e o texto são os do tsc.
275
387
  */
276
388
  readonlyWrite: (node: BaseNode, target: Schema) => Diagnostic;
389
+ /** Escrita numa PROPRIEDADE readonly — o TS2540, no nome (`o.a`) ou no argumento
390
+ * (`o["a"]`). O acesso vira o tipo-erro: a atribuição não é checada depois. D77. */
391
+ readonlyProperty: (node: BaseNode, name: string) => Diagnostic;
392
+ /** `delete` de uma PROPRIEDADE readonly — o TS2704, no operando. D77. */
393
+ readonlyDelete: (node: BaseNode) => Diagnostic;
277
394
  /**
278
395
  * Cast (`x as T`) entre tipos que não se sobrepõem na régua do tsc (`castOverlaps`:
279
396
  * literal da origem alargado + comparabilidade). Erro, como o TS2352 — o texto é o
@@ -320,10 +437,23 @@ declare const diag: {
320
437
  */
321
438
  notTextConvertible: (node: BaseNode, t: Schema) => Diagnostic;
322
439
  };
323
- /** Coletor de diagnósticos — acumula durante o walk, sem `throw`. */
440
+ /**
441
+ * Coletor de diagnósticos — acumula durante o walk, sem `throw`.
442
+ *
443
+ * Guarda cada diagnóstico UMA vez: um segundo com o mesmo nó, o mesmo código, a mesma
444
+ * mensagem e a mesma informação relacionada não entra. É a coleção do tsc
445
+ * (`createDiagnosticCollection`, que insere pelo `insertSorted` e não repete o que o
446
+ * `compareDiagnostics` acha igual — ele compara também o `relatedInformation`), e é o que
447
+ * deixa um argumento ser tipado mais de uma vez — as rodadas da chamada (D53, D81) — sem
448
+ * que o erro de dentro dele saia duas vezes. Dois diagnósticos que só diferem na
449
+ * informação relacionada são dois: `{ a: 1, ...o1, ...o2 }` acusa o `a` uma vez por spread.
450
+ */
324
451
  interface DiagnosticSink {
325
- /** Diagnósticos coletados, na ordem em que foram reportados. */
452
+ /** Diagnósticos coletados, na ordem em que foram reportados, sem repetição. */
326
453
  readonly all: readonly Diagnostic[];
454
+ /** Quantas vezes o `report` foi chamado, as repetições inclusive: é o que responde "esta
455
+ * operação acusou algo?", mesmo quando o que ela acusou já tinha sido acusado. */
456
+ readonly reported: number;
327
457
  report(d: Diagnostic): void;
328
458
  /** `true` se há ao menos um diagnóstico de severidade `error`. */
329
459
  hasErrors(): boolean;
@@ -380,6 +510,13 @@ interface CheckResult {
380
510
  * paralelas divergem.
381
511
  */
382
512
  readonly schemes: Schemes;
513
+ /**
514
+ * Os tipos NOMINAIS que um texto de tipo pode citar (`Promise`, `Array`, e os do
515
+ * host), com os type params de cada um — os que nenhum scheme sombreia. Publicado
516
+ * pela mesma razão dos `schemes`: é a outra metade do catálogo de nomes de tipo
517
+ * (D79).
518
+ */
519
+ readonly nominals: Nominals;
383
520
  }
384
521
  /**
385
522
  * Tipa `node` no ambiente `env` (a borda da DI: data, states, funções globais).
@@ -782,4 +919,4 @@ declare function anchorDiagnostics<A>(root: object, diagnostics: readonly Diagno
782
919
  */
783
920
  declare function spanOf(text: string, loc: SourceLocation | null | undefined): Span | undefined;
784
921
 
785
- 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 DiagnosticSink, type Env, type EnvOptions, FUNCTION_KINDS, type Guard, type GuardContext, LOGICAL_OPS, type LogicalOpSpec, type LowerValueOptions, type MissingProperty, 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, 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 };
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 };
package/dist/index.d.ts CHANGED
@@ -1,9 +1,12 @@
1
- import { Schema, Schemes, TypeScheme, ObjectSchema, Completion } from './types/index.js';
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, Prop, ScalarSchema, TYPE_EVAL_DEPTH_LIMIT, TupleSchema, TypeEvalLimitError, TypeEvalLimits, TypeForm, TypePosition, UnionSchema, UnionTooComplexError, UnknownSchema, VarCandidates, VarSchema, 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, renameTypeParams, resetInstantiationCount, resetTypeLimits, resolveConditional, resolveOp, resolveTypeOp, restIndex, s, sampleValue, silentNever, substitute, subtype, typeAtPosition, typeDiff, typeFeatures, typeLimits, typeNeedsParens, typeParamArity, unify, widen, widenInferred, widenLiteral, widenOrigin, widenType, withoutUndefined } from './types/index.js';
1
+ import { VarSchema, Schema, Schemes, TypeScheme, ObjectSchema, Completion } from './types/index.js';
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.js';
3
3
  import { Scope as Scope$1, BaseNode, 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
+ /** As declarações de tipo nominal: o nome e os type params, em ordem. */
8
+ type Nominals = Readonly<Record<string, readonly VarSchema[]>>;
9
+
7
10
  /**
8
11
  * Um nível de escopo léxico (nome → `Schema`), sobre o `Scope<T>` genérico do
9
12
  * `ast` — a mesma cadeia que o `behavior` usa, com o payload do eixo de tipos.
@@ -73,6 +76,21 @@ interface Env {
73
76
  * especificador) é da app (Proposal 005). Default: nenhum.
74
77
  */
75
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;
76
94
  }
77
95
  /**
78
96
  * O que um `Env` tem além das variáveis. Cada campo espelha o de {@link Env}, e
@@ -85,6 +103,13 @@ interface EnvOptions {
85
103
  readonly asserters?: ReadonlySet<string>;
86
104
  readonly matchers?: ReadonlySet<string>;
87
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;
88
113
  }
89
114
  /**
90
115
  * Um catálogo (`Record<string, Schema>`) passado no lugar das opções é o erro que a
@@ -114,7 +139,7 @@ declare const resolveNamed: (env: Env, name: string) => Schema | undefined;
114
139
  declare const resolveScheme: (env: Env, name: string) => TypeScheme | undefined;
115
140
 
116
141
  type Severity = "error" | "warning";
117
- 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" | "props-mismatch" | "no-matching-overload" | "constraint-violation" | "wrong-type-argument-count" | "unsupported" | "unused-name" | "assign-to-const" | "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";
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";
118
143
  /**
119
144
  * A **classe** do diagnóstico — espelha a divisão de passes do `tsc` (que nós
120
145
  * fundimos num walk só): `semantic` é o que o **binder** do tsc pega (validade do
@@ -162,6 +187,16 @@ type DiagnosticData = {
162
187
  readonly kind: "implicit-coercion";
163
188
  readonly textConvertible: boolean;
164
189
  };
190
+ /**
191
+ * Outro lugar do programa que explica o diagnóstico — o `DiagnosticRelatedInformation` do
192
+ * tsc (`types.ts`), que o `addRelatedInfo` anexa, e o `relatedInformation` do LSP. O nó é
193
+ * por referência, como o do diagnóstico; a mensagem diz o papel dele ("This spread always
194
+ * overwrites this property.").
195
+ */
196
+ interface DiagnosticRelatedInformation {
197
+ readonly node: BaseNode;
198
+ readonly message: string;
199
+ }
165
200
  interface Diagnostic {
166
201
  readonly code: DiagnosticCode;
167
202
  /** A classe do diagnóstico (deriva do `code`) — ver {@link DiagnosticKind}. */
@@ -172,6 +207,8 @@ interface Diagnostic {
172
207
  readonly message: string;
173
208
  /** Ver {@link DiagnosticData}. Presente só onde há o que agir. */
174
209
  readonly data?: DiagnosticData;
210
+ /** Ver {@link DiagnosticRelatedInformation}. Presente só onde o tsc a anexa. */
211
+ readonly relatedInformation?: readonly DiagnosticRelatedInformation[];
175
212
  }
176
213
  /**
177
214
  * Builder genérico de diagnóstico (severidade configurável). Usado pelos
@@ -239,9 +276,75 @@ declare const diag: {
239
276
  spreadArgument: (node: BaseNode) => Diagnostic;
240
277
  requiredAfterOptional: (node: BaseNode) => Diagnostic;
241
278
  notIterable: (node: BaseNode, type: Schema) => Diagnostic;
279
+ /**
280
+ * A fonte não se espalha: o `isValidSpreadType` do tsc (`checker.ts:23342`) a recusa. O
281
+ * código é o do conceito, par do `not-iterable` do padrão de array; a mensagem diz o caso.
282
+ */
283
+ notSpreadable: {
284
+ /** TS2700: o rest de um padrão de objeto (`{ a, ...rest }`), no elemento do rest
285
+ * (`getTypeForBindingElement`, `checker.ts:7439`). D80. */
286
+ rest: (node: BaseNode) => Diagnostic;
287
+ /** TS2698: o spread num literal de objeto (`{ ...x }`), no membro `...x`
288
+ * (`checkObjectLiteral`, `checker.ts:23254`). */
289
+ spread: (node: BaseNode) => Diagnostic;
290
+ };
291
+ /**
292
+ * A chave escrita duas vezes num literal de objeto. O tsc a acusa por três mecanismos, e
293
+ * cada um é um diagnóstico com o texto e o nó dele; o conceito é um só, o do
294
+ * `cannot-redeclare` (D25).
295
+ */
296
+ duplicateKey: {
297
+ /** TS1117: a chave IDENTIFICADOR repetida, no modo estrito (o `bindObjectLiteralExpression`
298
+ * do binder, `binder.ts:2037`), na repetição. */
299
+ strict: (node: BaseNode) => Diagnostic;
300
+ /** TS2300: o nome repetido (o `checkGrammarObjectLiteralExpression`), na repetição, com o
301
+ * texto do nome como escrito. */
302
+ identifier: (node: BaseNode, text: string) => Diagnostic;
303
+ /** TS2718: a chave computada ligada tarde com o nome de uma prop ligada cedo (o
304
+ * `lateBindMember`), na chave tardia. */
305
+ lateBound: (node: BaseNode, name: string) => Diagnostic;
306
+ /** TS2733: a primeira declaração ligada cedo desse nome, no mesmo `lateBindMember`. */
307
+ alsoDeclared: (node: BaseNode, name: string) => Diagnostic;
308
+ };
309
+ /**
310
+ * TS2783: a prop escrita num literal de objeto que um spread seguinte sempre sobrescreve,
311
+ * na prop escrita, com o spread na informação relacionada (TS2785) — o
312
+ * `checkSpreadPropOverrides` do tsc (`checker.ts:23558`).
313
+ */
314
+ overwrittenProperty: (node: BaseNode, name: string, spread: BaseNode) => Diagnostic;
315
+ /**
316
+ * O `any` que ninguém escreveu — o `noImplicitAny` do tsc 3.9.10, que faz parte do
317
+ * `--strict` e está sempre ligado aqui (D81). Um código só, com o texto de cada caso (o
318
+ * `reportImplicitAny`, `checker.ts:18198`, e os sítios do acesso e do `let` evolving): o
319
+ * código é o conceito, a mensagem diz qual é o caso (D2), como o `possibly-nullish`.
320
+ */
321
+ implicitAny: {
322
+ /** TS7006, no nome do parâmetro sem anotação e sem contexto. */
323
+ parameter: (node: BaseNode, name: string) => Diagnostic;
324
+ /** TS7019, no nome do rest sem anotação e sem contexto. */
325
+ rest: (node: BaseNode, name: string) => Diagnostic;
326
+ /** TS7031, em cada folha de um parâmetro-padrão sem anotação nem contexto. */
327
+ bindingElement: (node: BaseNode, name: string) => Diagnostic;
328
+ /** TS7034, no nome do `let` evolving que uma closure lê. */
329
+ evolving: (node: BaseNode, name: string) => Diagnostic;
330
+ /** TS7005, na leitura desse `let` dentro da closure. */
331
+ variable: (node: BaseNode, name: string) => Diagnostic;
332
+ /** TS7053, no acesso inteiro: a chave não indexa o objeto. */
333
+ index: (node: BaseNode, key: Schema, target: Schema) => Diagnostic;
334
+ /** TS7015, na chave: o objeto só tem índice numérico, e a chave não é número. */
335
+ indexNotNumber: (node: BaseNode) => Diagnostic;
336
+ };
337
+ /**
338
+ * A posição de um padrão de array além do comprimento de uma tupla — o TS2493 do tsc, no
339
+ * nome (`getPropertyTypeForIndexType`, `checker.ts:12886`). O código é o `no-such-member`,
340
+ * o mesmo do acesso `t[5]` (TC43): a posição é uma propriedade que a tupla não tem.
341
+ */
342
+ tupleIndexOutOfRange: (node: BaseNode, tuple: Schema, length: number, index: number) => Diagnostic;
242
343
  propsMismatch: (node: BaseNode, props: Schema, detail: string) => Diagnostic;
243
344
  noMatchingOverload: (node: BaseNode, type: Schema, argTypes: readonly Schema[]) => Diagnostic;
244
- constraintViolation: (node: BaseNode, name: string, actual: Schema, bound: Schema) => Diagnostic;
345
+ /** O argumento de tipo fora do bound — o texto do TS2344 da tag, com a constraint no
346
+ * lugar do `{1}`. */
347
+ constraintViolation: (node: BaseNode, actual: Schema, bound: Schema) => Diagnostic;
245
348
  unsupported: (node: BaseNode, what: string) => Diagnostic;
246
349
  /**
247
350
  * Argumento de tipo explícito com aridade errada. Assinatura **sem** type params
@@ -269,11 +372,25 @@ declare const diag: {
269
372
  */
270
373
  assignToConst: (node: BaseNode, name: string, kind: "const" | "import") => Diagnostic;
271
374
  /**
272
- * Escrita num alvo `readonly` (`readonly T[]`). É a outra metade do modificador:
273
- * a relação (TC29) diz quem pode ser ATRIBUÍDO a quem; isto diz quem pode ser
274
- * ESCRITO. Sem os dois, `readonly` seria só decoração. Texto do TS2542.
375
+ * As chaves de um `for…in` não cabem no alvo dele (`let n: number; for (n in o)`). É a
376
+ * relação que falha — o tipo das chaves contra o tipo declarado do alvo —, e por isso
377
+ * o código é o `not-assignable`; o texto é o do TS2405 (`checkForInStatement`).
378
+ */
379
+ forInTarget: (node: BaseNode) => Diagnostic;
380
+ /** `for ([a] in o)` — o alvo de um `for…in` é uma chave, não se desestrutura. TS2491. */
381
+ forInDestructuring: (node: BaseNode) => Diagnostic;
382
+ /**
383
+ * Escrita por um ÍNDICE readonly — `readonly T[]` ou `{ readonly [k: string]: V }`. É
384
+ * a outra metade do modificador: a relação (TC29) diz quem pode ser ATRIBUÍDO a quem;
385
+ * isto diz quem pode ser ESCRITO. Texto do TS2542, no acesso inteiro. Os três casos de
386
+ * escrita recusada pelo `readonly` têm um código só (D77): o nó e o texto são os do tsc.
275
387
  */
276
388
  readonlyWrite: (node: BaseNode, target: Schema) => Diagnostic;
389
+ /** Escrita numa PROPRIEDADE readonly — o TS2540, no nome (`o.a`) ou no argumento
390
+ * (`o["a"]`). O acesso vira o tipo-erro: a atribuição não é checada depois. D77. */
391
+ readonlyProperty: (node: BaseNode, name: string) => Diagnostic;
392
+ /** `delete` de uma PROPRIEDADE readonly — o TS2704, no operando. D77. */
393
+ readonlyDelete: (node: BaseNode) => Diagnostic;
277
394
  /**
278
395
  * Cast (`x as T`) entre tipos que não se sobrepõem na régua do tsc (`castOverlaps`:
279
396
  * literal da origem alargado + comparabilidade). Erro, como o TS2352 — o texto é o
@@ -320,10 +437,23 @@ declare const diag: {
320
437
  */
321
438
  notTextConvertible: (node: BaseNode, t: Schema) => Diagnostic;
322
439
  };
323
- /** Coletor de diagnósticos — acumula durante o walk, sem `throw`. */
440
+ /**
441
+ * Coletor de diagnósticos — acumula durante o walk, sem `throw`.
442
+ *
443
+ * Guarda cada diagnóstico UMA vez: um segundo com o mesmo nó, o mesmo código, a mesma
444
+ * mensagem e a mesma informação relacionada não entra. É a coleção do tsc
445
+ * (`createDiagnosticCollection`, que insere pelo `insertSorted` e não repete o que o
446
+ * `compareDiagnostics` acha igual — ele compara também o `relatedInformation`), e é o que
447
+ * deixa um argumento ser tipado mais de uma vez — as rodadas da chamada (D53, D81) — sem
448
+ * que o erro de dentro dele saia duas vezes. Dois diagnósticos que só diferem na
449
+ * informação relacionada são dois: `{ a: 1, ...o1, ...o2 }` acusa o `a` uma vez por spread.
450
+ */
324
451
  interface DiagnosticSink {
325
- /** Diagnósticos coletados, na ordem em que foram reportados. */
452
+ /** Diagnósticos coletados, na ordem em que foram reportados, sem repetição. */
326
453
  readonly all: readonly Diagnostic[];
454
+ /** Quantas vezes o `report` foi chamado, as repetições inclusive: é o que responde "esta
455
+ * operação acusou algo?", mesmo quando o que ela acusou já tinha sido acusado. */
456
+ readonly reported: number;
327
457
  report(d: Diagnostic): void;
328
458
  /** `true` se há ao menos um diagnóstico de severidade `error`. */
329
459
  hasErrors(): boolean;
@@ -380,6 +510,13 @@ interface CheckResult {
380
510
  * paralelas divergem.
381
511
  */
382
512
  readonly schemes: Schemes;
513
+ /**
514
+ * Os tipos NOMINAIS que um texto de tipo pode citar (`Promise`, `Array`, e os do
515
+ * host), com os type params de cada um — os que nenhum scheme sombreia. Publicado
516
+ * pela mesma razão dos `schemes`: é a outra metade do catálogo de nomes de tipo
517
+ * (D79).
518
+ */
519
+ readonly nominals: Nominals;
383
520
  }
384
521
  /**
385
522
  * Tipa `node` no ambiente `env` (a borda da DI: data, states, funções globais).
@@ -782,4 +919,4 @@ declare function anchorDiagnostics<A>(root: object, diagnostics: readonly Diagno
782
919
  */
783
920
  declare function spanOf(text: string, loc: SourceLocation | null | undefined): Span | undefined;
784
921
 
785
- 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 DiagnosticSink, type Env, type EnvOptions, FUNCTION_KINDS, type Guard, type GuardContext, LOGICAL_OPS, type LogicalOpSpec, type LowerValueOptions, type MissingProperty, 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, 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 };
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 };