import type { Config, types as t } from "@marko/compiler"; export interface AttributeDefinition { allowExpressions: boolean; filePath: string; name: string; type?: string; html?: boolean; enum?: string[]; pattern?: RegExp; required: boolean; defaultValue: unknown; description?: string; deprecated: boolean; autocomplete: Array<{ displayText: string; snippet: string; description: string; descriptionMoreURL?: string; }>; } export interface PluginDefinition { path?: string; hook: Plugin; } export interface TagDefinition { dir: string; filePath: string; attributeGroups?: string[]; patternAttributes?: AttributeDefinition[]; attributes: { [x: string]: AttributeDefinition }; description?: string; nestedTags?: { [x: string]: TagDefinition & { isNestedTag: true; isRepeated: boolean; targetProperty: string; }; }; autocomplete?: Array<{ displayText: string; snippet: string; description: string; descriptionMoreURL?: string; }>; htmlType?: "html" | "svg" | "math"; html: boolean; name: string; isNestedTag?: boolean; isRepeated?: boolean; targetProperty?: string; taglibId: string; types?: string; template?: string; renderer?: string; deprecated: boolean; openTagOnly: boolean; analyzer?: PluginDefinition; translator?: PluginDefinition; parser?: PluginDefinition; transformers?: PluginDefinition[]; migrators?: PluginDefinition[]; parseOptions?: { text?: boolean; statement?: boolean; controlFlow?: boolean; openTagOnly?: boolean; rawOpenTag?: boolean; preserveWhitespace?: boolean; }; } export interface TaglibLookup { getTagsSorted(): TagDefinition[]; getTag(tagName: string): undefined | TagDefinition; getAttribute( tagName: string, attrName: string, ): undefined | AttributeDefinition; forEachAttribute( tagName: string, callback: (attr: AttributeDefinition, tag: TagDefinition) => void, ): void; } export interface Attribute { allowExpressions?: boolean; type?: string; html?: boolean; enum?: string[]; pattern?: RegExp; required?: boolean; defaultValue?: unknown; description?: string; deprecated?: boolean; autocomplete?: Array<{ displayText?: string; snippet?: string; description?: string; descriptionMoreURL?: string; }>; } export interface Tag { attributeGroups?: string[]; patternAttributes?: Attribute[]; attributes?: { [x: string]: Attribute }; description?: string; nestedTags?: { [x: string]: Tag & { isRepeated?: boolean; targetProperty?: string; }; }; autocomplete?: Array<{ displayText?: string; snippet?: string; description?: string; descriptionMoreURL?: string; }>; htmlType?: "html" | "svg" | "math"; html?: boolean; types?: string; template?: string; renderer?: string; deprecated?: boolean; openTagOnly?: boolean; analyze?: Plugin; translate?: Plugin; parse?: Plugin; transform?: Plugin[]; migrate?: Plugin[]; parseOptions?: { rootOnly?: boolean; rawOpenTag?: boolean; openTagOnly?: boolean; controlFlow?: boolean; ignoreAttributes?: boolean; relaxRequireCommas?: boolean; text?: boolean; }; } export function defineTag(tag: T): T; export type FunctionPlugin = ( path: t.NodePath, types: typeof t, ) => void; export type EnterExitPlugin = { enter?(path: t.NodePath, types: typeof t): void; exit?(path: t.NodePath, types: typeof t): void; }; export type ModulePlugin = { default: EnterExitPlugin | FunctionPlugin; }; export type Plugin = | ModulePlugin | EnterExitPlugin | FunctionPlugin; export function assertAllowedAttributes( path: t.NodePath, allowed: string[], ): void; export function assertNoArgs(path: t.NodePath): void; export function assertNoVar(path: t.NodePath): void; export function assertNoAttributes(path: t.NodePath): void; export function assertNoParams(path: t.NodePath): void; export function assertNoAttributeTags(path: t.NodePath): void; export function assertAttributesOrArgs(path: t.NodePath): void; export function assertAttributesOrSingleArg(path: t.NodePath): void; export function isNativeTag(path: t.NodePath): boolean; export function isMacroTag(path: t.NodePath): boolean; export function isDynamicTag(path: t.NodePath): boolean; export function isAttributeTag( path: t.NodePath, ): path is t.NodePath; export function isTransparentTag( path: t.NodePath, ): path is t.NodePath; export function isLoopTag( path: t.NodePath, ): path is t.NodePath; export function registerMacro(path: t.NodePath, name: string): void; export function hasMacro(path: t.NodePath, name: string): boolean; export function getMacroIdentifierForName( path: t.NodePath, name: string, ): t.Identifier; export function getMacroIdentifier(path: t.NodePath): t.Identifier; export function getTagTemplate( path: t.NodePath, ): string | undefined; export function getTagDef( path: t.NodePath, ): TagDefinition | undefined; export function getFullyResolvedTagName(path: t.NodePath): string; export function findParentTag( path: t.NodePath, ): t.NodePath | undefined; export function findAttributeTags( path: t.NodePath, ): Array>; export function getArgOrSequence( path: t.NodePath, ): t.Expression; export function loadFileForTag( path: t.NodePath, ): t.BabelFile | undefined; export function loadFileForImport( file: t.BabelFile, template: string, ): t.BabelFile | undefined; export function normalizeTemplateString( quasis: Array, ...expressions: t.Expression[] ): t.TemplateLiteral; type Loc = { line: number; column: number; index?: number }; type LocRange = { start: Loc; end: Loc }; export function getStart(file: t.BabelFile, node: t.Node): number | null; export function getEnd(file: t.BabelFile, node: t.Node): number | null; export function getLoc(file: t.BabelFile, pos: number): Loc; export function getLocRange( file: t.BabelFile, start: number, end: number, ): LocRange; export function withLoc( file: t.BabelFile, node: T, start: number, end: number, ): T; export function parseStatements( file: t.BabelFile, str: string, sourceStart?: null | number, sourceEnd?: null | number, sourceOffset?: null | number, ): T; export function parseExpression( file: t.BabelFile, str: string, sourceStart?: null | number, sourceEnd?: null | number, sourceOffset?: null | number, ): T; export function parseParams( file: t.BabelFile, str: string, sourceStart?: null | number, sourceEnd?: null | number, ): t.Function["params"]; export function parseArgs( file: t.BabelFile, str: string, sourceStart?: null | number, sourceEnd?: null | number, ): t.CallExpression["arguments"]; export function parseVar( file: t.BabelFile, str: string, sourceStart?: null | number, sourceEnd?: null | number, ): t.VariableDeclarator["id"]; export function parseTemplateLiteral( file: t.BabelFile, str: string, sourceStart?: null | number, sourceEnd?: null | number, ): t.TemplateLiteral; export function resolveRelativePath(file: t.BabelFile, request: string): string; export function importDefault( file: t.BabelFile, request: string, nameHint?: string, ): t.Identifier; export function importStar( file: t.BabelFile, request: string, nameHint?: string, ): t.Identifier; export function importNamed( file: t.BabelFile, request: string, name: string, nameHint?: string, ): t.Identifier; export function getTaglibLookup(file: t.BabelFile): TaglibLookup; export function getTagDefForTagName( file: t.BabelFile, tagName: string, ): TagDefinition | undefined; export function getTemplateId( optimize: boolean | Config, request: string, child?: string, ): string; export function resolveTagImport( path: t.NodePath, request: string, ): string | undefined; export enum DiagnosticType { Error = "error", Warning = "warning", Deprecation = "deprecation", Suggestion = "suggestion", } export interface Diagnostic { type: DiagnosticType; label: string; loc: undefined | false | LocRange; fix: boolean | ConfirmFix | SelectFix; } export interface DiagnosticOptions { label: string; loc?: undefined | false | LocRange; fix?: | undefined | (() => void) | (ConfirmFix & { apply(confirmed: boolean | undefined): void; }) | (SelectFix & { apply(selected: string | undefined): void; }); } export function diagnosticError( path: t.NodePath, options: DiagnosticOptions, ): void; export function diagnosticWarn( path: t.NodePath, options: DiagnosticOptions, ): void; export function diagnosticDeprecate( path: t.NodePath, options: DiagnosticOptions, ): void; export function diagnosticSuggest( path: t.NodePath, options: DiagnosticOptions, ): void; interface ConfirmFix { type: "confirm"; message: string; initialValue?: boolean; } interface SelectFix { type: "select"; message: string; options: { value: string; label?: string; }[]; initialValue?: string; } type Computed = | undefined | number | string | boolean | RegExp | bigint | null | { [x: string]: Computed } | Computed[]; export function computeNode(node: t.Node): undefined | { value: Computed }; export function getFile(): t.BabelFile; export function getProgram(): t.NodePath;