Docs · npm
TypeScript
donly incluye sus propios tipos (.d.ts); no necesitas instalar @types. Esta página reúne lo
específico de TypeScript. El resto de la API está en
Node.js.
Configuración
El paquete es ESM y expone submódulos como
donly/lint o
donly/find mediante
exports. Para que TypeScript los resuelva, usa un
moduleResolution que soporte
exports: NodeNext, Node16 o
Bundler.
{
"compilerOptions": {
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true
}
}
Los ejemplos de esta página compilan sin errores con TypeScript 7.0.2 en
modo strict, con esas tres opciones de
moduleResolution.
Importaciones
Los tipos y las clases salen de los mismos módulos que en JavaScript. Usa
import type (o type en línea) para
lo que solo es un tipo.
import { DON, Directive, HeredocValue } from "donly";
import type { DonPlugin, PluginDirectiveNode, DONParseOptions } from "donly";
import { lint } from "donly/lint";
import type { LintRuleDocument, LintIssue } from "donly/lint";
import { atDirective, findDirective } from "donly/find";
import type { AtPathResult } from "donly/find";
import type { InspectStrategy } from "donly/utils"; Tipos de los argumentos
Directive.args es
(number | string | boolean | HeredocValue)[]. Se estrecha con
typeof e instanceof.
const root = DON.parse('title "hola"');
for (const arg of root.args) {
if (arg instanceof HeredocValue) {
arg.content.toUpperCase(); // HeredocValue
} else if (typeof arg === "string") {
arg.toUpperCase(); // string
} else if (typeof arg === "number") {
arg.toFixed(); // number
} // boolean en el resto
} at() tipado
El tipo de retorno de at depende de la ruta cuando
es un literal: con [N] al final devuelve el valor del argumento y,
si no, la directiva. Ambos casos incluyen
undefined, así que TypeScript te obliga a manejar que no
exista.
const root = DON.parse('server { host "example.com" }');
// Con [N] al final, el tipo es el del argumento
const host = root.at("/server/host[1]");
// ^ string | number | boolean | HeredocValue | undefined
// Sin [N], es la directiva
const node = root.at("/server/host");
// ^ Directive | undefined
// Una ruta que no es un literal no se puede resolver en compilación
declare const path: string;
const unknown = root.at(path);
// ^ Directive | argumento | undefined
const port: number = root.at("/server/port[1]");
// Error: Type 'undefined' is not assignable to type 'number' Plugins
DonPlugin<TContext> tipa el estado que crea
initContext y que reciben los demás hooks.
import { DON, type DonPlugin } from "donly";
interface Context {
seen: string[];
}
const seen: DonPlugin<Context> = {
name: "seen",
initContext: () => ({ seen: [] }),
onDirective(node, ctx) {
ctx.seen.push(String(node.name)); // ctx: Context
},
};
DON.parse(text, { plugins: [seen] }); Reglas de lint
LintRuleDocument valida la forma de las reglas
mientras las escribes.
import { lint, type LintRuleDocument } from "donly/lint";
const rules: LintRuleDocument = {
"/port": { "[1]": { type: "number", gte: 1, lte: 65535 } },
};
const issues = lint(text, rules); // LintIssue[] Estos casos son errores de compilación:
const a: LintRuleDocument = {
"/port": { severity: "fatal" },
// Error: "fatal" no es "error" | "warning" | "info"
};
const b: LintRuleDocument = {
port: {},
// Error: las claves de ruta deben empezar con "/"
};
const c: DonPlugin = {
onDirective() {},
// Error: falta la propiedad "name"
}; Tipos exportados
| Módulo | Tipos |
|---|---|
| donly | Directive, HeredocValue, DONParseOptions, DonPlugin, PluginDirectiveNode, Token, DirectiveReducer, DirectiveJSONEncoderOptions |
| donly/find | AtPathResult |
| donly/utils | InspectStrategy |
| donly/lint | LintRuleDocument, LintRuleArray, RuleBody, ArgumentConstraint, StringArgumentConstraint, NumberArgumentConstraint, BigintArgumentConstraint, BooleanArgumentConstraint, NullArgumentConstraint, HeredocArgumentConstraint, ArgumentType, RuleSeverity, LintIssue, LintSeverity, LintLoc, RenderReportOptions, RenderJSONReportOptions, JSONReport, JSONReportIssue |