@prisma-next/psl-parser 0.14.0-dev.5 → 0.14.0-dev.51
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/README.md +28 -10
- package/dist/declarations-DR6To8_k.mjs +1060 -0
- package/dist/declarations-DR6To8_k.mjs.map +1 -0
- package/dist/format.d.mts +1 -1
- package/dist/format.mjs +2 -1
- package/dist/format.mjs.map +1 -1
- package/dist/index.d.mts +239 -3
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +785 -3
- package/dist/index.mjs.map +1 -1
- package/dist/parse-3-vr14ej.mjs +626 -0
- package/dist/parse-3-vr14ej.mjs.map +1 -0
- package/dist/{parse-BjZ1LPe6.d.mts → parse-BazJr7Ye.d.mts} +128 -51
- package/dist/parse-BazJr7Ye.d.mts.map +1 -0
- package/dist/syntax.d.mts +20 -2
- package/dist/syntax.d.mts.map +1 -1
- package/dist/syntax.mjs +43 -2
- package/dist/syntax.mjs.map +1 -0
- package/package.json +9 -25
- package/src/attribute-spec/combinators/bool.ts +19 -0
- package/src/attribute-spec/combinators/diagnostic.ts +15 -0
- package/src/attribute-spec/combinators/entity-ref.ts +24 -0
- package/src/attribute-spec/combinators/field-ref.ts +36 -0
- package/src/attribute-spec/combinators/identifier.ts +16 -0
- package/src/attribute-spec/combinators/int.ts +19 -0
- package/src/attribute-spec/combinators/list.ts +43 -0
- package/src/attribute-spec/combinators/one-of.ts +29 -0
- package/src/attribute-spec/combinators/record.ts +43 -0
- package/src/attribute-spec/combinators/str.ts +19 -0
- package/src/attribute-spec/field-attribute.ts +27 -0
- package/src/attribute-spec/interpret.ts +154 -0
- package/src/attribute-spec/model-attribute.ts +27 -0
- package/src/attribute-spec/optional.ts +8 -0
- package/src/attribute-spec/types.ts +72 -0
- package/src/block-reconstruction.ts +139 -0
- package/src/exports/index.ts +57 -3
- package/src/exports/syntax.ts +25 -5
- package/src/extension-block.ts +107 -0
- package/src/parse.ts +23 -5
- package/src/resolve.ts +123 -0
- package/src/source-file.ts +25 -0
- package/src/symbol-table.ts +446 -0
- package/src/syntax/ast/attributes.ts +5 -6
- package/src/syntax/ast/declarations.ts +51 -26
- package/src/syntax/ast/expressions.ts +12 -13
- package/src/syntax/ast/identifier.ts +2 -3
- package/src/syntax/ast/qualified-name.ts +28 -19
- package/src/syntax/ast/type-annotation.ts +4 -5
- package/src/syntax/ast-helpers.ts +27 -3
- package/src/syntax/navigation.ts +55 -0
- package/src/syntax/red.ts +317 -42
- package/dist/parse-B_3gIEFd.mjs +0 -1421
- package/dist/parse-B_3gIEFd.mjs.map +0 -1
- package/dist/parse-BjZ1LPe6.d.mts.map +0 -1
- package/dist/parser-CaplKvRs.mjs +0 -1145
- package/dist/parser-CaplKvRs.mjs.map +0 -1
- package/dist/parser-Dfi3Wfdq.d.mts +0 -7
- package/dist/parser-Dfi3Wfdq.d.mts.map +0 -1
- package/dist/parser.d.mts +0 -3
- package/dist/parser.mjs +0 -3
- package/src/exports/parser.ts +0 -4
- package/src/parser.ts +0 -1642
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declarations-DR6To8_k.mjs","names":["#state","#segmentBefore","#segmentAfter","#separatorCount"],"sources":["../src/syntax/red.ts","../src/syntax/ast-helpers.ts","../src/syntax/ast/identifier.ts","../src/syntax/ast/qualified-name.ts","../src/syntax/ast/expressions.ts","../src/syntax/ast/attributes.ts","../src/syntax/ast/type-annotation.ts","../src/syntax/ast/declarations.ts"],"sourcesContent":["import type { Token, TokenKind } from '../tokenizer';\nimport type { GreenElement, GreenNode, GreenToken } from './green';\nimport type { SyntaxKind } from './syntax-kind';\n\n/**\n * A token in the red tree. Unlike the green-layer {@link Token} (kind + text\n * only), a red token also carries its absolute `offset` within the source and a\n * link back to its `parent` {@link SyntaxNode}, so a cursor anchored on a token\n * can walk outward (parent, previous/next token, siblings) without re-scanning\n * from the document root.\n */\nexport class SyntaxToken implements Token {\n readonly green: GreenToken;\n readonly kind: TokenKind;\n readonly text: string;\n readonly offset: number;\n readonly parent: SyntaxNode;\n /** Position within the parent's children, enabling O(1) sibling navigation without rescanning the green layer. */\n readonly index: number;\n\n constructor(green: GreenToken, offset: number, parent: SyntaxNode, index: number) {\n this.green = green;\n this.kind = green.kind;\n this.text = green.text;\n this.offset = offset;\n this.parent = parent;\n this.index = index;\n }\n\n get textLength(): number {\n return this.text.length;\n }\n\n get endOffset(): number {\n return this.offset + this.textLength;\n }\n\n /** Whether `offset` falls within this token, inclusive of both ends. */\n isInside(offset: number): boolean {\n return offset >= this.offset && offset <= this.endOffset;\n }\n\n isOutside(offset: number): boolean {\n return !this.isInside(offset);\n }\n\n /** The sibling element immediately after this token within its parent. */\n get nextSiblingOrToken(): SyntaxElement | undefined {\n return childAt(this.parent, this.index + 1);\n }\n\n /** The sibling element immediately before this token within its parent. */\n get prevSiblingOrToken(): SyntaxElement | undefined {\n return childAt(this.parent, this.index - 1);\n }\n\n /** The next token in document order, crossing node boundaries. */\n get nextToken(): SyntaxToken | undefined {\n for (let el = climbingNext(this); el !== undefined; el = climbingNext(el)) {\n const token = firstToken(el);\n if (token !== undefined) return token;\n }\n return undefined;\n }\n\n /** The previous token in document order, crossing node boundaries. */\n get prevToken(): SyntaxToken | undefined {\n for (let el = climbingPrev(this); el !== undefined; el = climbingPrev(el)) {\n const token = lastToken(el);\n if (token !== undefined) return token;\n }\n return undefined;\n }\n}\n\nexport type SyntaxElement = SyntaxNode | SyntaxToken;\n\n/**\n * The result of {@link SyntaxNode.tokenAtOffset}: an offset can fall outside\n * every token (`none`), strictly inside a single token (`single`), or exactly on\n * the seam between two adjacent tokens (`between`). `leftBiased` / `rightBiased`\n * collapse the seam case to one side; for `single` both return the same token,\n * for `none` both return `undefined`.\n */\ntype TokenAtOffsetState =\n | { readonly kind: 'none' }\n | { readonly kind: 'single'; readonly token: SyntaxToken }\n | { readonly kind: 'between'; readonly left: SyntaxToken; readonly right: SyntaxToken };\n\nexport class TokenAtOffset {\n readonly #state: TokenAtOffsetState;\n\n private constructor(state: TokenAtOffsetState) {\n this.#state = state;\n }\n\n static none(): TokenAtOffset {\n return new TokenAtOffset({ kind: 'none' });\n }\n\n static single(token: SyntaxToken): TokenAtOffset {\n return new TokenAtOffset({ kind: 'single', token });\n }\n\n static between(left: SyntaxToken, right: SyntaxToken): TokenAtOffset {\n return new TokenAtOffset({ kind: 'between', left, right });\n }\n\n get isEmpty(): boolean {\n return this.#state.kind === 'none';\n }\n\n get isBetween(): boolean {\n return this.#state.kind === 'between';\n }\n\n leftBiased(): SyntaxToken | undefined {\n switch (this.#state.kind) {\n case 'none':\n return undefined;\n case 'single':\n return this.#state.token;\n case 'between':\n return this.#state.left;\n }\n }\n\n rightBiased(): SyntaxToken | undefined {\n switch (this.#state.kind) {\n case 'none':\n return undefined;\n case 'single':\n return this.#state.token;\n case 'between':\n return this.#state.right;\n }\n }\n}\n\nexport class SyntaxNode {\n readonly green: GreenNode;\n readonly offset: number;\n readonly parent: SyntaxNode | undefined;\n /** Position within the parent's children, enabling O(1) sibling navigation without rescanning the green layer. */\n readonly index: number;\n\n constructor(green: GreenNode, offset: number, parent: SyntaxNode | undefined, index: number) {\n this.green = green;\n this.offset = offset;\n this.parent = parent;\n this.index = index;\n }\n\n get kind(): SyntaxKind {\n return this.green.kind;\n }\n\n get textLength(): number {\n return this.green.textLength;\n }\n\n get endOffset(): number {\n return this.offset + this.textLength;\n }\n\n /** Whether `offset` falls within this node, inclusive of both ends. */\n isInside(offset: number): boolean {\n return offset >= this.offset && offset <= this.endOffset;\n }\n\n isOutside(offset: number): boolean {\n return !this.isInside(offset);\n }\n\n get firstChild(): SyntaxElement | undefined {\n return childAt(this, 0);\n }\n\n get lastChild(): SyntaxElement | undefined {\n const len = this.green.children.length;\n if (len === 0) return undefined;\n return childAt(this, len - 1);\n }\n\n get nextSibling(): SyntaxElement | undefined {\n return this.parent === undefined ? undefined : childAt(this.parent, this.index + 1);\n }\n\n get prevSibling(): SyntaxElement | undefined {\n return this.parent === undefined ? undefined : childAt(this.parent, this.index - 1);\n }\n\n /** The sibling element immediately after this node within its parent. */\n get nextSiblingOrToken(): SyntaxElement | undefined {\n return this.nextSibling;\n }\n\n /** The sibling element immediately before this node within its parent. */\n get prevSiblingOrToken(): SyntaxElement | undefined {\n return this.prevSibling;\n }\n\n /** The first token in this subtree (depth-first), or `undefined` if empty. */\n get firstToken(): SyntaxToken | undefined {\n return firstToken(this);\n }\n\n /** The last token in this subtree (depth-first), or `undefined` if empty. */\n get lastToken(): SyntaxToken | undefined {\n return lastToken(this);\n }\n\n *children(): Iterable<SyntaxElement> {\n let offset = this.offset;\n let index = 0;\n for (const child of this.green.children) {\n yield wrapElement(child, offset, this, index);\n offset += elementTextLength(child);\n index++;\n }\n }\n\n *childNodes(): Iterable<SyntaxNode> {\n for (const child of this.children()) {\n if (child instanceof SyntaxNode) yield child;\n }\n }\n\n *ancestors(): Iterable<SyntaxNode> {\n let current: SyntaxNode | undefined = this.parent;\n while (current) {\n yield current;\n current = current.parent;\n }\n }\n\n /** The nearest match, testing this node itself before walking its ancestors. */\n findAncestor<T>(cast: (node: SyntaxNode) => T | undefined): T | undefined {\n const self = cast(this);\n if (self !== undefined) {\n return self;\n }\n for (const ancestor of this.ancestors()) {\n const result = cast(ancestor);\n if (result !== undefined) {\n return result;\n }\n }\n return undefined;\n }\n\n *descendants(): Iterable<SyntaxElement> {\n const stack: SyntaxElement[] = [this];\n for (let el = stack.pop(); el !== undefined; el = stack.pop()) {\n yield el;\n if (el instanceof SyntaxNode) {\n const children = Array.from(el.children());\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n if (child !== undefined) {\n stack.push(child);\n }\n }\n }\n }\n }\n\n *tokens(): Iterable<SyntaxToken> {\n for (const el of this.descendants()) {\n if (el instanceof SyntaxToken) {\n yield el;\n }\n }\n }\n\n /**\n * The token(s) at `offset`. The between-two-tokens case (offset exactly on a\n * token seam) is represented explicitly so callers can left/right bias.\n */\n tokenAtOffset(offset: number): TokenAtOffset {\n return tokenAtOffsetOf(this, offset);\n }\n\n /**\n * The smallest element fully containing the range `[start, end]`. At a seam\n * (and for empty ranges) the left-hand element is preferred, matching\n * {@link containsOffset}'s inclusive span.\n */\n coveringElement(start: number, end: number): SyntaxElement {\n let result: SyntaxElement = this;\n for (;;) {\n if (result instanceof SyntaxToken) return result;\n let next: SyntaxElement | undefined;\n for (const child of result.children()) {\n if (containsRange(child, start, end)) {\n next = child;\n break;\n }\n }\n if (next === undefined) return result;\n result = next;\n }\n }\n}\n\nfunction elementTextLength(el: GreenElement): number {\n return el.type === 'token' ? el.text.length : el.textLength;\n}\n\nfunction elementLength(el: SyntaxElement): number {\n return el instanceof SyntaxToken ? el.text.length : el.textLength;\n}\n\n/**\n * Whether `el` contains `offset`. The span is inclusive on both ends so a seam\n * offset touches both neighbours.\n */\nfunction containsOffset(el: SyntaxElement, offset: number): boolean {\n const start = el.offset;\n const len = elementLength(el);\n return offset >= start && offset <= start + len;\n}\n\nfunction containsRange(el: SyntaxElement, start: number, end: number): boolean {\n const elStart = el.offset;\n const len = elementLength(el);\n return elStart <= start && end <= elStart + len;\n}\n\nfunction tokenAtOffsetOf(el: SyntaxElement, offset: number): TokenAtOffset {\n if (el instanceof SyntaxToken) {\n return TokenAtOffset.single(el);\n }\n let left: SyntaxElement | undefined;\n let right: SyntaxElement | undefined;\n for (const child of el.children()) {\n if (!containsOffset(child, offset)) continue;\n if (left === undefined) {\n left = child;\n } else {\n right = child;\n break;\n }\n }\n if (left === undefined) return TokenAtOffset.none();\n if (right === undefined) return tokenAtOffsetOf(left, offset);\n const leftToken = tokenAtOffsetOf(left, offset).rightBiased();\n const rightToken = tokenAtOffsetOf(right, offset).leftBiased();\n if (leftToken !== undefined && rightToken !== undefined) {\n return TokenAtOffset.between(leftToken, rightToken);\n }\n if (leftToken !== undefined) return TokenAtOffset.single(leftToken);\n if (rightToken !== undefined) return TokenAtOffset.single(rightToken);\n return TokenAtOffset.none();\n}\n\nfunction firstToken(el: SyntaxElement): SyntaxToken | undefined {\n if (el instanceof SyntaxToken) return el;\n for (const child of el.children()) {\n const token = firstToken(child);\n if (token !== undefined) return token;\n }\n return undefined;\n}\n\nfunction lastToken(el: SyntaxElement): SyntaxToken | undefined {\n if (el instanceof SyntaxToken) return el;\n const children = Array.from(el.children());\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n if (child !== undefined) {\n const token = lastToken(child);\n if (token !== undefined) return token;\n }\n }\n return undefined;\n}\n\nfunction climbingNext(el: SyntaxElement): SyntaxElement | undefined {\n let current: SyntaxElement = el;\n for (;;) {\n const parent = current.parent;\n if (parent === undefined) return undefined;\n const sibling = childAt(parent, current.index + 1);\n if (sibling !== undefined) return sibling;\n current = parent;\n }\n}\n\nfunction climbingPrev(el: SyntaxElement): SyntaxElement | undefined {\n let current: SyntaxElement = el;\n for (;;) {\n const parent = current.parent;\n if (parent === undefined) return undefined;\n const sibling = childAt(parent, current.index - 1);\n if (sibling !== undefined) return sibling;\n current = parent;\n }\n}\n\nfunction wrapElement(\n green: GreenElement,\n offset: number,\n parent: SyntaxNode,\n index: number,\n): SyntaxElement {\n if (green.type === 'token') {\n return new SyntaxToken(green, offset, parent, index);\n }\n return new SyntaxNode(green, offset, parent, index);\n}\n\nfunction childAt(node: SyntaxNode, index: number): SyntaxElement | undefined {\n const children = node.green.children;\n const target = children[index];\n if (target === undefined) return undefined;\n let offset = node.offset;\n for (let i = 0; i < index; i++) {\n const child = children[i];\n if (child !== undefined) {\n offset += elementTextLength(child);\n }\n }\n return wrapElement(target, offset, node, index);\n}\n\nexport function createSyntaxTree(green: GreenNode): SyntaxNode {\n return new SyntaxNode(green, 0, undefined, 0);\n}\n","import type { TokenKind } from '../tokenizer';\nimport { SyntaxNode, type SyntaxToken } from './red';\n\nexport interface AstNode {\n readonly syntax: SyntaxNode;\n}\n\nexport interface BracedBlock extends AstNode {\n lbrace(): SyntaxToken | undefined;\n rbrace(): SyntaxToken | undefined;\n}\n\nexport function findChildToken(node: SyntaxNode, kind: TokenKind): SyntaxToken | undefined {\n for (const child of node.children()) {\n if (!(child instanceof SyntaxNode) && child.kind === kind) {\n return child;\n }\n }\n return undefined;\n}\n\nexport function findFirstChild<T>(\n node: SyntaxNode,\n cast: (node: SyntaxNode) => T | undefined,\n): T | undefined {\n for (const child of node.childNodes()) {\n const result = cast(child);\n if (result !== undefined) return result;\n }\n return undefined;\n}\n\nexport function* filterChildren<T>(\n node: SyntaxNode,\n cast: (node: SyntaxNode) => T | undefined,\n): Iterable<T> {\n for (const child of node.childNodes()) {\n const result = cast(child);\n if (result !== undefined) yield result;\n }\n}\n\ntype CastTarget<C> = C extends (node: SyntaxNode) => infer R ? Exclude<R, undefined> : never;\n\nexport function any<Casts extends readonly ((node: SyntaxNode) => unknown)[]>(\n ...casts: Casts\n): (node: SyntaxNode) => CastTarget<Casts[number]> | undefined;\nexport function any(\n ...casts: ReadonlyArray<(node: SyntaxNode) => unknown>\n): (node: SyntaxNode) => unknown {\n return (node) => {\n for (const cast of casts) {\n const result = cast(node);\n if (result !== undefined) {\n return result;\n }\n }\n return undefined;\n };\n}\n\n/**\n * Raw source text of a CST node, verbatim (quotes and brackets preserved). For\n * the decoded value of a string literal, decode it instead.\n */\nexport function printSyntax(node: SyntaxNode): string {\n let text = '';\n for (const token of node.tokens()) {\n text += token.text;\n }\n return text;\n}\n","import type { AstNode } from '../ast-helpers';\nimport { findChildToken } from '../ast-helpers';\nimport type { SyntaxNode, SyntaxToken } from '../red';\n\nexport class IdentifierAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n token(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'Ident');\n }\n\n name(): string | undefined {\n return this.token()?.text;\n }\n\n static cast(node: SyntaxNode): IdentifierAst | undefined {\n return node.kind === 'Identifier' ? new IdentifierAst(node) : undefined;\n }\n}\n","import type { AstNode } from '../ast-helpers';\nimport { filterChildren, findChildToken, findFirstChild } from '../ast-helpers';\nimport { SyntaxNode, type SyntaxToken } from '../red';\nimport { IdentifierAst } from './identifier';\n\n/** A namespace-qualified name, e.g. `pgvector.Vector` or `supabase:auth.User`. */\nexport class QualifiedNameAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n #segmentBefore(boundary: number): IdentifierAst | undefined {\n let found: IdentifierAst | undefined;\n for (const segment of filterChildren(this.syntax, IdentifierAst.cast)) {\n if (segment.syntax.offset >= boundary) break;\n found = segment;\n }\n return found;\n }\n\n #segmentAfter(boundary: number): IdentifierAst | undefined {\n for (const segment of filterChildren(this.syntax, IdentifierAst.cast)) {\n if (segment.syntax.offset > boundary) return segment;\n }\n return undefined;\n }\n\n #separatorCount(kind: 'Dot' | 'Colon'): number {\n let count = 0;\n for (const child of this.syntax.children()) {\n if (!(child instanceof SyntaxNode) && child.kind === kind) count++;\n }\n return count;\n }\n\n colon(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'Colon');\n }\n\n dot(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'Dot');\n }\n\n space(): IdentifierAst | undefined {\n const colon = this.colon();\n if (!colon) return undefined;\n return this.#segmentBefore(colon.offset);\n }\n\n namespace(): IdentifierAst | undefined {\n const dot = this.dot();\n if (!dot) return undefined;\n return this.#segmentBefore(dot.offset);\n }\n\n identifier(): IdentifierAst | undefined {\n const dot = this.dot();\n if (dot) return this.#segmentAfter(dot.offset);\n const colon = this.colon();\n if (colon) return this.#segmentAfter(colon.offset);\n return findFirstChild(this.syntax, IdentifierAst.cast);\n }\n\n /**\n * Every identifier segment, in source order. A bare `Vector` yields\n * `['Vector']`; a qualified `pgvector.Vector` yields `['pgvector', 'Vector']`.\n */\n path(): readonly string[] {\n const segments: string[] = [];\n for (const segment of filterChildren(this.syntax, IdentifierAst.cast)) {\n const text = segment.token()?.text;\n if (text !== undefined) segments.push(text);\n }\n return segments;\n }\n\n /** True iff this is a single unqualified identifier whose text equals `name`. */\n isSimpleName(name: string): boolean {\n if (this.dot() !== undefined || this.colon() !== undefined) return false;\n return this.identifier()?.token()?.text === name;\n }\n\n /**\n * Flags a malformed name with more qualifier segments than allowed (a second\n * `:`-space or a second `.`-namespace).\n */\n isOverQualified(): boolean {\n return this.#separatorCount('Dot') > 1 || this.#separatorCount('Colon') > 1;\n }\n\n static cast(node: SyntaxNode): QualifiedNameAst | undefined {\n return node.kind === 'QualifiedName' ? new QualifiedNameAst(node) : undefined;\n }\n}\n","import type { AstNode } from '../ast-helpers';\nimport { filterChildren, findChildToken, findFirstChild } from '../ast-helpers';\nimport { SyntaxNode, type SyntaxToken } from '../red';\nimport { IdentifierAst } from './identifier';\nimport { QualifiedNameAst } from './qualified-name';\n\nexport class FunctionCallAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n /** The qualified-name callee, or `undefined` when identifier segments sit directly under the node. */\n name(): QualifiedNameAst | undefined {\n return findFirstChild(this.syntax, QualifiedNameAst.cast);\n }\n\n /**\n * The dotted call path, in source order. A bare `Vector(…)` yields\n * `['Vector']`; a namespace-qualified `pgvector.Vector(…)` yields\n * `['pgvector', 'Vector']`. Empty when the call carries no identifier.\n */\n path(): readonly string[] {\n const qualified = this.name();\n const segments: string[] = [];\n for (const segment of filterChildren(qualified?.syntax ?? this.syntax, IdentifierAst.cast)) {\n const text = segment.token()?.text;\n if (text !== undefined) segments.push(text);\n }\n return segments;\n }\n\n lparen(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'LParen');\n }\n\n rparen(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'RParen');\n }\n\n *args(): Iterable<AttributeArgAst> {\n yield* filterChildren(this.syntax, AttributeArgAst.cast);\n }\n\n static cast(node: SyntaxNode): FunctionCallAst | undefined {\n return node.kind === 'FunctionCall' ? new FunctionCallAst(node) : undefined;\n }\n}\n\nexport class ArrayLiteralAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n lbracket(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'LBracket');\n }\n\n rbracket(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'RBracket');\n }\n\n *elements(): Iterable<ExpressionAst> {\n yield* filterChildren(this.syntax, castExpression);\n }\n\n static cast(node: SyntaxNode): ArrayLiteralAst | undefined {\n return node.kind === 'ArrayLiteral' ? new ArrayLiteralAst(node) : undefined;\n }\n}\n\nconst HEX = /^[0-9a-fA-F]+$/;\n\nfunction decodeFixedHex(raw: string, start: number, width: number): string | undefined {\n if (start + width > raw.length) return undefined;\n const hex = raw.slice(start, start + width);\n if (!HEX.test(hex)) return undefined;\n return String.fromCharCode(Number.parseInt(hex, 16));\n}\n\nfunction decodeStringLiteral(raw: string): string {\n let out = '';\n let i = 0;\n while (i < raw.length) {\n const ch = raw.charAt(i);\n if (ch !== '\\\\' || i + 1 >= raw.length) {\n out += ch;\n i++;\n continue;\n }\n const next = raw.charAt(i + 1);\n switch (next) {\n case 'n':\n out += '\\n';\n i += 2;\n continue;\n case 'r':\n out += '\\r';\n i += 2;\n continue;\n case 't':\n out += '\\t';\n i += 2;\n continue;\n case '\"':\n out += '\"';\n i += 2;\n continue;\n case \"'\":\n out += \"'\";\n i += 2;\n continue;\n case '\\\\':\n out += '\\\\';\n i += 2;\n continue;\n case 'x': {\n const decoded = decodeFixedHex(raw, i + 2, 2);\n if (decoded === undefined) {\n out += '\\\\x';\n i += 2;\n continue;\n }\n out += decoded;\n i += 4;\n continue;\n }\n case 'u': {\n const decoded = decodeFixedHex(raw, i + 2, 4);\n if (decoded === undefined) {\n out += '\\\\u';\n i += 2;\n continue;\n }\n out += decoded;\n i += 6;\n continue;\n }\n default:\n out += `\\\\${next}`;\n i += 2;\n continue;\n }\n }\n return out;\n}\n\nexport class StringLiteralExprAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n token(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'StringLiteral');\n }\n\n value(): string | undefined {\n const tok = this.token();\n if (!tok) return undefined;\n return decodeStringLiteral(tok.text.slice(1, -1));\n }\n\n static cast(node: SyntaxNode): StringLiteralExprAst | undefined {\n return node.kind === 'StringLiteralExpr' ? new StringLiteralExprAst(node) : undefined;\n }\n}\n\nexport class NumberLiteralExprAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n token(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'NumberLiteral');\n }\n\n value(): number | undefined {\n const tok = this.token();\n if (!tok) return undefined;\n return Number(tok.text);\n }\n\n static cast(node: SyntaxNode): NumberLiteralExprAst | undefined {\n return node.kind === 'NumberLiteralExpr' ? new NumberLiteralExprAst(node) : undefined;\n }\n}\n\nexport class BooleanLiteralExprAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n token(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'Ident');\n }\n\n value(): boolean | undefined {\n const tok = this.token();\n if (!tok) return undefined;\n if (tok.text === 'true') return true;\n if (tok.text === 'false') return false;\n return undefined;\n }\n\n static cast(node: SyntaxNode): BooleanLiteralExprAst | undefined {\n return node.kind === 'BooleanLiteralExpr' ? new BooleanLiteralExprAst(node) : undefined;\n }\n}\n\nexport class ObjectLiteralExprAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n lbrace(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'LBrace');\n }\n\n rbrace(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'RBrace');\n }\n\n *fields(): Iterable<ObjectFieldAst> {\n yield* filterChildren(this.syntax, ObjectFieldAst.cast);\n }\n\n static cast(node: SyntaxNode): ObjectLiteralExprAst | undefined {\n return node.kind === 'ObjectLiteralExpr' ? new ObjectLiteralExprAst(node) : undefined;\n }\n}\n\nexport class ObjectFieldAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n key(): IdentifierAst | undefined {\n for (const child of this.syntax.children()) {\n if (!(child instanceof SyntaxNode)) {\n if (child.kind === 'Colon') break;\n continue;\n }\n return IdentifierAst.cast(child);\n }\n return undefined;\n }\n\n /**\n * The field's logical key name, unquoted. An identifier key (`length:`) yields\n * its text; a string-literal key (`\"length\":`) yields the decoded string.\n * `undefined` when the field carries no key node.\n */\n keyName(): string | undefined {\n for (const child of this.syntax.children()) {\n if (!(child instanceof SyntaxNode)) {\n if (child.kind === 'Colon') break;\n continue;\n }\n const identifier = IdentifierAst.cast(child);\n if (identifier) return identifier.token()?.text;\n const stringKey = StringLiteralExprAst.cast(child);\n if (stringKey) return stringKey.value();\n return undefined;\n }\n return undefined;\n }\n\n colon(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'Colon');\n }\n\n value(): ExpressionAst | undefined {\n if (this.colon()) {\n let pastColon = false;\n for (const child of this.syntax.children()) {\n if (!(child instanceof SyntaxNode)) {\n if (child.kind === 'Colon') pastColon = true;\n continue;\n }\n if (pastColon) {\n const expr = castExpression(child);\n if (expr) return expr;\n }\n }\n return undefined;\n }\n return findFirstChild(this.syntax, castExpression);\n }\n\n static cast(node: SyntaxNode): ObjectFieldAst | undefined {\n return node.kind === 'ObjectField' ? new ObjectFieldAst(node) : undefined;\n }\n}\n\nexport type ExpressionAst =\n | FunctionCallAst\n | ArrayLiteralAst\n | StringLiteralExprAst\n | NumberLiteralExprAst\n | BooleanLiteralExprAst\n | ObjectLiteralExprAst\n | IdentifierAst;\n\nexport function castExpression(node: SyntaxNode): ExpressionAst | undefined {\n return (\n FunctionCallAst.cast(node) ??\n ArrayLiteralAst.cast(node) ??\n StringLiteralExprAst.cast(node) ??\n NumberLiteralExprAst.cast(node) ??\n BooleanLiteralExprAst.cast(node) ??\n ObjectLiteralExprAst.cast(node) ??\n IdentifierAst.cast(node)\n );\n}\n\nexport class AttributeArgAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n name(): IdentifierAst | undefined {\n if (!this.colon()) return undefined;\n return findFirstChild(this.syntax, IdentifierAst.cast);\n }\n\n colon(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'Colon');\n }\n\n value(): ExpressionAst | undefined {\n if (this.colon()) {\n let pastColon = false;\n for (const child of this.syntax.children()) {\n if (!(child instanceof SyntaxNode)) {\n if (child.kind === 'Colon') pastColon = true;\n continue;\n }\n if (pastColon) {\n const expr = castExpression(child);\n if (expr) return expr;\n }\n }\n return undefined;\n }\n return findFirstChild(this.syntax, castExpression);\n }\n\n static cast(node: SyntaxNode): AttributeArgAst | undefined {\n return node.kind === 'AttributeArg' ? new AttributeArgAst(node) : undefined;\n }\n}\n","import type { AstNode } from '../ast-helpers';\nimport { filterChildren, findChildToken, findFirstChild } from '../ast-helpers';\nimport type { SyntaxNode, SyntaxToken } from '../red';\nimport { AttributeArgAst } from './expressions';\nimport { QualifiedNameAst } from './qualified-name';\n\nexport class AttributeArgListAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n lparen(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'LParen');\n }\n\n rparen(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'RParen');\n }\n\n *args(): Iterable<AttributeArgAst> {\n yield* filterChildren(this.syntax, AttributeArgAst.cast);\n }\n\n static cast(node: SyntaxNode): AttributeArgListAst | undefined {\n return node.kind === 'AttributeArgList' ? new AttributeArgListAst(node) : undefined;\n }\n}\n\nexport class FieldAttributeAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n at(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'At');\n }\n\n name(): QualifiedNameAst | undefined {\n return findFirstChild(this.syntax, QualifiedNameAst.cast);\n }\n\n argList(): AttributeArgListAst | undefined {\n return findFirstChild(this.syntax, AttributeArgListAst.cast);\n }\n\n static cast(node: SyntaxNode): FieldAttributeAst | undefined {\n return node.kind === 'FieldAttribute' ? new FieldAttributeAst(node) : undefined;\n }\n}\n\nexport class ModelAttributeAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n doubleAt(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'DoubleAt');\n }\n\n name(): QualifiedNameAst | undefined {\n return findFirstChild(this.syntax, QualifiedNameAst.cast);\n }\n\n argList(): AttributeArgListAst | undefined {\n return findFirstChild(this.syntax, AttributeArgListAst.cast);\n }\n\n static cast(node: SyntaxNode): ModelAttributeAst | undefined {\n return node.kind === 'ModelAttribute' ? new ModelAttributeAst(node) : undefined;\n }\n}\n","import type { AstNode } from '../ast-helpers';\nimport { findChildToken, findFirstChild } from '../ast-helpers';\nimport type { SyntaxNode, SyntaxToken } from '../red';\nimport { AttributeArgListAst } from './attributes';\nimport { QualifiedNameAst } from './qualified-name';\n\nexport class TypeAnnotationAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n /** The annotation's reference, doubling as the constructor callee when an {@link argList} follows. */\n name(): QualifiedNameAst | undefined {\n return findFirstChild(this.syntax, QualifiedNameAst.cast);\n }\n\n /** Present when the annotation is a constructor (`Vector(1536)`) rather than a plain reference. */\n argList(): AttributeArgListAst | undefined {\n return findFirstChild(this.syntax, AttributeArgListAst.cast);\n }\n\n isConstructor(): boolean {\n return this.argList() !== undefined;\n }\n\n lbracket(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'LBracket');\n }\n\n rbracket(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'RBracket');\n }\n\n questionMark(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'Question');\n }\n\n isList(): boolean {\n return this.lbracket() !== undefined;\n }\n\n isOptional(): boolean {\n return this.questionMark() !== undefined;\n }\n\n static cast(node: SyntaxNode): TypeAnnotationAst | undefined {\n return node.kind === 'TypeAnnotation' ? new TypeAnnotationAst(node) : undefined;\n }\n}\n","import type { AstNode, BracedBlock } from '../ast-helpers';\nimport { filterChildren, findChildToken, findFirstChild } from '../ast-helpers';\nimport { SyntaxNode, type SyntaxToken } from '../red';\nimport { FieldAttributeAst, ModelAttributeAst } from './attributes';\nimport type { ExpressionAst } from './expressions';\nimport { castExpression } from './expressions';\nimport { IdentifierAst } from './identifier';\nimport { TypeAnnotationAst } from './type-annotation';\n\n/**\n * What may appear inside a `namespace` block: models, composite types, and\n * extension (block) declarations. `types {}` blocks and nested `namespace`\n * blocks are document-only, so they are not namespace members.\n */\nexport type NamespaceMemberAst =\n | ModelDeclarationAst\n | CompositeTypeDeclarationAst\n | GenericBlockDeclarationAst;\n\nexport type DeclarationAst = NamespaceMemberAst | TypesBlockAst | NamespaceDeclarationAst;\nexport type AttributeAst = FieldAttributeAst | ModelAttributeAst;\nexport type BlockMemberAst = FieldDeclarationAst | ModelAttributeAst;\nexport type GenericBlockMemberAst = KeyValuePairAst | ModelAttributeAst;\n\nfunction castNamespaceMember(node: SyntaxNode): NamespaceMemberAst | undefined {\n return (\n ModelDeclarationAst.cast(node) ??\n CompositeTypeDeclarationAst.cast(node) ??\n GenericBlockDeclarationAst.cast(node)\n );\n}\n\nexport class DocumentAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n *declarations(): Iterable<DeclarationAst> {\n yield* filterChildren(\n this.syntax,\n (node) =>\n castNamespaceMember(node) ?? TypesBlockAst.cast(node) ?? NamespaceDeclarationAst.cast(node),\n );\n }\n\n static cast(node: SyntaxNode): DocumentAst | undefined {\n return node.kind === 'Document' ? new DocumentAst(node) : undefined;\n }\n}\n\nexport class ModelDeclarationAst implements BracedBlock {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n keyword(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'Ident');\n }\n\n name(): IdentifierAst | undefined {\n return findFirstChild(this.syntax, IdentifierAst.cast);\n }\n\n lbrace(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'LBrace');\n }\n\n rbrace(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'RBrace');\n }\n\n *fields(): Iterable<FieldDeclarationAst> {\n yield* filterChildren(this.syntax, FieldDeclarationAst.cast);\n }\n\n *attributes(): Iterable<ModelAttributeAst> {\n yield* filterChildren(this.syntax, ModelAttributeAst.cast);\n }\n\n *members(): Iterable<BlockMemberAst> {\n yield* filterChildren(\n this.syntax,\n (node) => FieldDeclarationAst.cast(node) ?? ModelAttributeAst.cast(node),\n );\n }\n\n static cast(node: SyntaxNode): ModelDeclarationAst | undefined {\n return node.kind === 'ModelDeclaration' ? new ModelDeclarationAst(node) : undefined;\n }\n}\n\nexport class CompositeTypeDeclarationAst implements BracedBlock {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n keyword(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'Ident');\n }\n\n name(): IdentifierAst | undefined {\n return findFirstChild(this.syntax, IdentifierAst.cast);\n }\n\n lbrace(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'LBrace');\n }\n\n rbrace(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'RBrace');\n }\n\n *fields(): Iterable<FieldDeclarationAst> {\n yield* filterChildren(this.syntax, FieldDeclarationAst.cast);\n }\n\n *attributes(): Iterable<ModelAttributeAst> {\n yield* filterChildren(this.syntax, ModelAttributeAst.cast);\n }\n\n *members(): Iterable<BlockMemberAst> {\n yield* filterChildren(\n this.syntax,\n (node) => FieldDeclarationAst.cast(node) ?? ModelAttributeAst.cast(node),\n );\n }\n\n static cast(node: SyntaxNode): CompositeTypeDeclarationAst | undefined {\n return node.kind === 'CompositeTypeDeclaration'\n ? new CompositeTypeDeclarationAst(node)\n : undefined;\n }\n}\n\nexport class NamespaceDeclarationAst implements BracedBlock {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n keyword(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'Ident');\n }\n\n name(): IdentifierAst | undefined {\n return findFirstChild(this.syntax, IdentifierAst.cast);\n }\n\n lbrace(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'LBrace');\n }\n\n rbrace(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'RBrace');\n }\n\n *declarations(): Iterable<NamespaceMemberAst> {\n yield* filterChildren(this.syntax, castNamespaceMember);\n }\n\n static cast(node: SyntaxNode): NamespaceDeclarationAst | undefined {\n return node.kind === 'Namespace' ? new NamespaceDeclarationAst(node) : undefined;\n }\n}\n\nexport class TypesBlockAst implements BracedBlock {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n keyword(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'Ident');\n }\n\n lbrace(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'LBrace');\n }\n\n rbrace(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'RBrace');\n }\n\n *declarations(): Iterable<NamedTypeDeclarationAst> {\n yield* filterChildren(this.syntax, NamedTypeDeclarationAst.cast);\n }\n\n static cast(node: SyntaxNode): TypesBlockAst | undefined {\n return node.kind === 'TypesBlock' ? new TypesBlockAst(node) : undefined;\n }\n}\n\nexport class GenericBlockDeclarationAst implements BracedBlock {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n keyword(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'Ident');\n }\n\n name(): IdentifierAst | undefined {\n return findFirstChild(this.syntax, IdentifierAst.cast);\n }\n\n lbrace(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'LBrace');\n }\n\n rbrace(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'RBrace');\n }\n\n *entries(): Iterable<KeyValuePairAst> {\n yield* filterChildren(this.syntax, KeyValuePairAst.cast);\n }\n\n *attributes(): Iterable<ModelAttributeAst> {\n yield* filterChildren(this.syntax, ModelAttributeAst.cast);\n }\n\n *members(): Iterable<GenericBlockMemberAst> {\n yield* filterChildren(\n this.syntax,\n (node) => KeyValuePairAst.cast(node) ?? ModelAttributeAst.cast(node),\n );\n }\n\n static cast(node: SyntaxNode): GenericBlockDeclarationAst | undefined {\n return node.kind === 'GenericBlockDeclaration'\n ? new GenericBlockDeclarationAst(node)\n : undefined;\n }\n}\n\nexport class KeyValuePairAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n key(): IdentifierAst | undefined {\n return findFirstChild(this.syntax, IdentifierAst.cast);\n }\n\n equals(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'Equals');\n }\n\n value(): ExpressionAst | undefined {\n let pastEquals = false;\n for (const child of this.syntax.children()) {\n if (!(child instanceof SyntaxNode)) {\n if (child.kind === 'Equals') pastEquals = true;\n continue;\n }\n if (pastEquals) {\n const expr = castExpression(child);\n if (expr) return expr;\n }\n }\n return undefined;\n }\n\n static cast(node: SyntaxNode): KeyValuePairAst | undefined {\n return node.kind === 'KeyValuePair' ? new KeyValuePairAst(node) : undefined;\n }\n}\n\nexport class FieldDeclarationAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n name(): IdentifierAst | undefined {\n return findFirstChild(this.syntax, IdentifierAst.cast);\n }\n\n typeAnnotation(): TypeAnnotationAst | undefined {\n return findFirstChild(this.syntax, TypeAnnotationAst.cast);\n }\n\n *attributes(): Iterable<FieldAttributeAst> {\n yield* filterChildren(this.syntax, FieldAttributeAst.cast);\n }\n\n static cast(node: SyntaxNode): FieldDeclarationAst | undefined {\n return node.kind === 'FieldDeclaration' ? new FieldDeclarationAst(node) : undefined;\n }\n}\n\nexport class NamedTypeDeclarationAst implements AstNode {\n readonly syntax: SyntaxNode;\n\n constructor(syntax: SyntaxNode) {\n this.syntax = syntax;\n }\n\n name(): IdentifierAst | undefined {\n return findFirstChild(this.syntax, IdentifierAst.cast);\n }\n\n equals(): SyntaxToken | undefined {\n return findChildToken(this.syntax, 'Equals');\n }\n\n typeAnnotation(): TypeAnnotationAst | undefined {\n return findFirstChild(this.syntax, TypeAnnotationAst.cast);\n }\n\n *attributes(): Iterable<FieldAttributeAst> {\n yield* filterChildren(this.syntax, FieldAttributeAst.cast);\n }\n\n static cast(node: SyntaxNode): NamedTypeDeclarationAst | undefined {\n return node.kind === 'NamedTypeDeclaration' ? new NamedTypeDeclarationAst(node) : undefined;\n }\n}\n"],"mappings":"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"}
|
package/dist/format.d.mts
CHANGED
package/dist/format.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { A as SyntaxNode, a as KeyValuePairAst, c as NamespaceDeclarationAst, i as GenericBlockDeclarationAst, l as TypesBlockAst, o as ModelDeclarationAst, p as ModelAttributeAst, r as FieldDeclarationAst, s as NamedTypeDeclarationAst, t as CompositeTypeDeclarationAst } from "./declarations-DR6To8_k.mjs";
|
|
2
|
+
import { t as parse } from "./parse-3-vr14ej.mjs";
|
|
2
3
|
//#region src/format/error.ts
|
|
3
4
|
var PslFormatError = class extends Error {
|
|
4
5
|
diagnostics;
|
package/dist/format.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"format.mjs","names":["#indentUnit","#newline","#out","#depth","#lastWasBlank","#lineOpen","#prevKind","#line","#hasContent"],"sources":["../src/format/error.ts","../src/format/emit.ts","../src/format/options.ts","../src/format/format.ts"],"sourcesContent":["import type { ParseDiagnostic } from '../parse';\n\nexport class PslFormatError extends Error {\n readonly diagnostics: readonly ParseDiagnostic[];\n\n constructor(diagnostics: readonly ParseDiagnostic[]) {\n const summary = diagnostics[0]?.message ?? 'unknown parse error';\n const more = diagnostics.length > 1 ? ` (and ${diagnostics.length - 1} more)` : '';\n super(`Cannot format PSL with parse errors: ${summary}${more}`);\n this.name = 'PslFormatError';\n this.diagnostics = diagnostics;\n }\n}\n","import { ModelAttributeAst } from '../syntax/ast/attributes';\nimport {\n CompositeTypeDeclarationAst,\n type DocumentAst,\n FieldDeclarationAst,\n GenericBlockDeclarationAst,\n KeyValuePairAst,\n ModelDeclarationAst,\n NamedTypeDeclarationAst,\n NamespaceDeclarationAst,\n TypesBlockAst,\n} from '../syntax/ast/declarations';\nimport { type SyntaxElement, SyntaxNode, type SyntaxToken } from '../syntax/red';\nimport type { TokenKind } from '../tokenizer';\n\nexport function emitDocument(document: DocumentAst, indentUnit: string, newline: string): string {\n const writer = new LineWriter(indentUnit, newline);\n emitTopLevel(writer, document);\n return writer.finish();\n}\n\nclass LineWriter {\n readonly #indentUnit: string;\n readonly #newline: string;\n readonly #out: string[] = [];\n #depth = 0;\n #line = '';\n #lineOpen = false;\n #prevKind: TokenKind | undefined;\n #lastWasBlank = false;\n #hasContent = false;\n\n constructor(indentUnit: string, newline: string) {\n this.#indentUnit = indentUnit;\n this.#newline = newline;\n }\n\n indent(): void {\n this.#depth += 1;\n }\n\n unindent(): void {\n this.#depth = Math.max(0, this.#depth - 1);\n }\n\n lastIsBlank(): boolean {\n return this.#lastWasBlank;\n }\n\n lineOpen(): boolean {\n return this.#lineOpen;\n }\n\n prevKind(): TokenKind | undefined {\n return this.#prevKind;\n }\n\n newline(): void {\n if (!this.#lineOpen) return;\n this.#out.push(`${this.#indentUnit.repeat(this.#depth)}${this.#line}`);\n this.#line = '';\n this.#lineOpen = false;\n this.#prevKind = undefined;\n this.#lastWasBlank = false;\n this.#hasContent = true;\n }\n\n blank(): void {\n this.newline();\n if (!this.#hasContent || this.#lastWasBlank) return;\n this.#out.push('');\n this.#lastWasBlank = true;\n }\n\n write(token: SyntaxToken, space: boolean, padTo?: number): void {\n if (this.#lineOpen && padTo !== undefined) {\n this.#line = this.#line.padEnd(padTo);\n } else if (this.#lineOpen && space) {\n this.#line += ' ';\n }\n this.#line += token.text;\n this.#lineOpen = true;\n this.#prevKind = token.kind;\n }\n\n writeRaw(text: string): void {\n this.#line += text;\n this.#lineOpen = true;\n }\n\n comment(text: string): void {\n if (this.#lineOpen) this.#line += ` ${text}`;\n else this.#line = text;\n this.#lineOpen = true;\n this.newline();\n }\n\n finish(): string {\n this.newline();\n const body = this.#out.join(this.#newline);\n return body.length > 0 ? `${body}${this.#newline}` : '';\n }\n}\n\n// Qualified-name separators hug; argument/object colons keep the usual value space.\nfunction spaceBetween(\n prev: TokenKind | undefined,\n cur: TokenKind,\n inQualifiedName: boolean,\n): boolean {\n if (prev === undefined) return false;\n if (inQualifiedName) return false;\n\n switch (cur) {\n case 'LParen':\n case 'LBracket':\n case 'RParen':\n case 'RBracket':\n case 'Comma':\n case 'Question':\n case 'Dot':\n case 'Colon':\n return false;\n case 'RBrace':\n return prev !== 'LBrace';\n default:\n break;\n }\n switch (prev) {\n case 'LParen':\n case 'LBracket':\n case 'Dot':\n case 'At':\n case 'DoubleAt':\n return false;\n default:\n return true;\n }\n}\n\nfunction streamNode(writer: LineWriter, node: SyntaxNode, padTo?: number): number {\n let continuation = 0;\n let first = true;\n let prevQualified = false;\n\n const walk = (parent: SyntaxNode, qualified: boolean): void => {\n for (const child of parent.children()) {\n if (child instanceof SyntaxNode) {\n walk(child, qualified || child.kind === 'QualifiedName');\n continue;\n }\n if (child.kind === 'Whitespace' || child.kind === 'Newline') continue;\n if (child.kind === 'Comment') {\n writer.comment(child.text);\n writer.indent();\n continuation += 1;\n prevQualified = false;\n first = false;\n continue;\n }\n const pad = first ? padTo : undefined;\n const space = spaceBetween(writer.prevKind(), child.kind, qualified && prevQualified);\n writer.write(child, space, writer.lineOpen() ? pad : undefined);\n prevQualified = qualified;\n first = false;\n }\n };\n\n walk(node, false);\n return continuation;\n}\n\nfunction closeContinuation(writer: LineWriter, count: number): void {\n for (let i = 0; i < count; i++) writer.unindent();\n}\n\nfunction emitField(\n writer: LineWriter,\n field: FieldDeclarationAst,\n columns: AlignmentColumns | undefined,\n): number {\n return streamRow(writer, field.syntax, columns);\n}\n\nfunction emitNamedType(writer: LineWriter, decl: NamedTypeDeclarationAst): number {\n return streamRow(writer, decl.syntax, undefined);\n}\n\nfunction streamRow(\n writer: LineWriter,\n row: SyntaxNode,\n columns: AlignmentColumns | undefined,\n): number {\n let continuation = 0;\n let sawAttribute = false;\n\n for (const child of row.children()) {\n if (child instanceof SyntaxNode) {\n let padTo: number | undefined;\n if (child.kind === 'TypeAnnotation' && continuation === 0) {\n padTo = columns?.typeColumn;\n } else if (child.kind === 'FieldAttribute') {\n if (continuation > 0) writer.newline();\n else if (!sawAttribute) padTo = columns?.attributeColumn;\n sawAttribute = true;\n }\n continuation += streamNode(writer, child, padTo);\n continue;\n }\n if (child.kind === 'Whitespace' || child.kind === 'Newline') continue;\n if (child.kind === 'Comment') {\n writer.comment(child.text);\n writer.indent();\n continuation += 1;\n continue;\n }\n const space = spaceBetween(writer.prevKind(), child.kind, false);\n writer.write(child, space);\n }\n\n return continuation;\n}\n\nfunction emitBlockAttribute(writer: LineWriter, attribute: ModelAttributeAst): number {\n return streamNode(writer, attribute.syntax);\n}\n\nfunction emitKeyValue(writer: LineWriter, pair: KeyValuePairAst): number {\n return streamNode(writer, pair.syntax);\n}\n\ntype MemberCategory = 'regular' | 'blockAttribute' | 'nestedBlock';\n\ninterface BlockMember {\n readonly category: MemberCategory;\n emit(trailing: string | undefined): number;\n}\n\nfunction leafMember(\n writer: LineWriter,\n category: MemberCategory,\n print: () => number,\n): BlockMember {\n return {\n category,\n emit(trailing) {\n const continuation = print();\n if (trailing !== undefined) writer.comment(trailing);\n else writer.newline();\n return continuation;\n },\n };\n}\n\ntype MemberClassifier = (node: SyntaxNode) => BlockMember | undefined;\n\nfunction emitModel(\n writer: LineWriter,\n model: ModelDeclarationAst,\n trailing: string | undefined,\n): void {\n const columns = alignmentMap(model.syntax);\n emitBlockBody(writer, model.syntax, trailing, (node) => {\n const field = FieldDeclarationAst.cast(node);\n if (field) return leafMember(writer, 'regular', () => emitField(writer, field, columns));\n const attribute = ModelAttributeAst.cast(node);\n if (attribute)\n return leafMember(writer, 'blockAttribute', () => emitBlockAttribute(writer, attribute));\n return undefined;\n });\n}\n\nfunction emitCompositeType(\n writer: LineWriter,\n composite: CompositeTypeDeclarationAst,\n trailing: string | undefined,\n): void {\n const columns = alignmentMap(composite.syntax);\n emitBlockBody(writer, composite.syntax, trailing, (node) => {\n const field = FieldDeclarationAst.cast(node);\n if (field) return leafMember(writer, 'regular', () => emitField(writer, field, columns));\n const attribute = ModelAttributeAst.cast(node);\n if (attribute)\n return leafMember(writer, 'blockAttribute', () => emitBlockAttribute(writer, attribute));\n return undefined;\n });\n}\n\nfunction emitGenericBlock(\n writer: LineWriter,\n block: GenericBlockDeclarationAst,\n trailing: string | undefined,\n): void {\n emitBlockBody(writer, block.syntax, trailing, (node) => {\n const entry = KeyValuePairAst.cast(node);\n if (entry) return leafMember(writer, 'regular', () => emitKeyValue(writer, entry));\n const attribute = ModelAttributeAst.cast(node);\n if (attribute)\n return leafMember(writer, 'blockAttribute', () => emitBlockAttribute(writer, attribute));\n return undefined;\n });\n}\n\nfunction emitNamespace(\n writer: LineWriter,\n namespace: NamespaceDeclarationAst,\n trailing: string | undefined,\n): void {\n emitBlockBody(writer, namespace.syntax, trailing, (node) => {\n const declaration = castBlockDeclaration(node);\n if (declaration) return nestedBlockMember(writer, declaration);\n return undefined;\n });\n}\n\nfunction emitTypesBlock(\n writer: LineWriter,\n block: TypesBlockAst,\n trailing: string | undefined,\n): void {\n emitBlockBody(writer, block.syntax, trailing, (node) => {\n const named = NamedTypeDeclarationAst.cast(node);\n if (named) return leafMember(writer, 'regular', () => emitNamedType(writer, named));\n return undefined;\n });\n}\n\nfunction emitTopLevel(writer: LineWriter, document: DocumentAst): void {\n walkRegion(writer, Array.from(document.syntax.children()), undefined, (node) => {\n const declaration = castTopLevelDeclaration(node);\n if (declaration) return nestedBlockMember(writer, declaration);\n return undefined;\n });\n}\n\ntype BlockEmitter = (writer: LineWriter, trailing: string | undefined) => void;\n\nfunction nestedBlockMember(writer: LineWriter, block: BlockEmitter): BlockMember {\n return {\n category: 'nestedBlock',\n emit(trailing) {\n block(writer, trailing);\n return 0;\n },\n };\n}\n\nfunction castBlockDeclaration(node: SyntaxNode): BlockEmitter | undefined {\n const model = ModelDeclarationAst.cast(node);\n if (model) return (writer, trailing) => emitModel(writer, model, trailing);\n const composite = CompositeTypeDeclarationAst.cast(node);\n if (composite) return (writer, trailing) => emitCompositeType(writer, composite, trailing);\n const generic = GenericBlockDeclarationAst.cast(node);\n if (generic) return (writer, trailing) => emitGenericBlock(writer, generic, trailing);\n return undefined;\n}\n\nfunction castTopLevelDeclaration(node: SyntaxNode): BlockEmitter | undefined {\n const block = castBlockDeclaration(node);\n if (block) return block;\n const namespace = NamespaceDeclarationAst.cast(node);\n if (namespace) return (writer, trailing) => emitNamespace(writer, namespace, trailing);\n const types = TypesBlockAst.cast(node);\n if (types) return (writer, trailing) => emitTypesBlock(writer, types, trailing);\n return undefined;\n}\n\nfunction emitBlockBody(\n writer: LineWriter,\n node: SyntaxNode,\n closingTrailing: string | undefined,\n classify: MemberClassifier,\n): void {\n const children = Array.from(node.children());\n const openIndex = children.findIndex((el) => !(el instanceof SyntaxNode) && el.kind === 'LBrace');\n\n streamHeader(writer, node);\n const headerComment = sameLineCommentAfter(children, openIndex);\n if (headerComment !== undefined) writer.comment(headerComment);\n else writer.newline();\n\n writer.indent();\n walkRegion(writer, children, 'RBrace', classify);\n writer.unindent();\n\n writer.writeRaw('}');\n if (closingTrailing !== undefined) writer.comment(closingTrailing);\n else writer.newline();\n}\n\nfunction streamHeader(writer: LineWriter, node: SyntaxNode): void {\n let done = false;\n const walk = (parent: SyntaxNode): void => {\n for (const child of parent.children()) {\n if (done) return;\n if (child instanceof SyntaxNode) {\n walk(child);\n continue;\n }\n if (child.kind === 'Whitespace' || child.kind === 'Newline' || child.kind === 'Comment') {\n continue;\n }\n const space = spaceBetween(writer.prevKind(), child.kind, false);\n writer.write(child, space);\n if (child.kind === 'LBrace') {\n done = true;\n return;\n }\n }\n };\n walk(node);\n}\n\nfunction walkRegion(\n writer: LineWriter,\n elements: readonly SyntaxElement[],\n closeKind: 'RBrace' | undefined,\n classify: MemberClassifier,\n): void {\n let sawOpenBrace = closeKind === undefined;\n let sawContent = false;\n let lastWasRegular = false;\n let ledByComment = false;\n let newlines = 0;\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element === undefined) continue;\n\n if (element instanceof SyntaxNode) {\n if (!sawOpenBrace) continue;\n const member = classify(element);\n if (member === undefined) continue;\n if (!ledByComment) {\n if (newlines >= 2 && sawContent && !writer.lastIsBlank()) writer.blank();\n else if (separationBlankWanted(writer, member.category, sawContent, lastWasRegular)) {\n writer.blank();\n }\n }\n\n const trailing = sameLineTrailingComment(elements, i);\n closeContinuation(writer, member.emit(trailing.text));\n if (trailing.index !== undefined) i = trailing.index;\n sawContent = true;\n lastWasRegular = member.category !== 'blockAttribute';\n ledByComment = false;\n newlines = 0;\n continue;\n }\n\n if (element.kind === 'LBrace' && closeKind === 'RBrace' && !sawOpenBrace) {\n sawOpenBrace = true;\n newlines = 0;\n continue;\n }\n if (!sawOpenBrace) continue;\n if (closeKind === 'RBrace' && element.kind === 'RBrace') break;\n if (element.kind === 'Whitespace') continue;\n if (element.kind === 'Newline') {\n newlines += 1;\n continue;\n }\n if (element.kind === 'Comment') {\n if (closeKind === 'RBrace' && newlines === 0 && !sawContent) {\n // Same-line comment trailing the opening `{`: owned by the block header.\n continue;\n }\n if (newlines >= 2 && sawContent && !writer.lastIsBlank()) writer.blank();\n else if (!ledByComment) {\n const led = leadingMemberAfter(elements, i, classify);\n if (led && separationBlankWanted(writer, led, sawContent, lastWasRegular)) writer.blank();\n }\n writer.writeRaw(element.text);\n writer.newline();\n sawContent = true;\n ledByComment = true;\n newlines = 0;\n }\n }\n}\n\nfunction separationBlankWanted(\n writer: LineWriter,\n category: MemberCategory,\n sawContent: boolean,\n lastWasRegular: boolean,\n): boolean {\n if (!sawContent || writer.lastIsBlank()) return false;\n if (category === 'nestedBlock') return true;\n return category === 'blockAttribute' && lastWasRegular;\n}\n\nfunction leadingMemberAfter(\n elements: readonly SyntaxElement[],\n commentIndex: number,\n classify: MemberClassifier,\n): MemberCategory | undefined {\n for (let i = commentIndex + 1; i < elements.length; i++) {\n const element = elements[i];\n if (element === undefined) continue;\n if (element instanceof SyntaxNode) return classify(element)?.category;\n if (element.kind === 'RBrace') return undefined;\n }\n return undefined;\n}\n\nfunction sameLineTrailingComment(\n elements: readonly SyntaxElement[],\n memberIndex: number,\n): { text: string | undefined; index: number | undefined } {\n for (let i = memberIndex + 1; i < elements.length; i++) {\n const element = elements[i];\n if (element === undefined) continue;\n if (element instanceof SyntaxNode) break;\n if (element.kind === 'Whitespace') continue;\n if (element.kind === 'Comment') return { text: element.text, index: i };\n break;\n }\n return { text: undefined, index: undefined };\n}\n\nfunction sameLineCommentAfter(\n children: readonly SyntaxElement[],\n openIndex: number,\n): string | undefined {\n for (let i = openIndex + 1; i < children.length; i++) {\n const child = children[i];\n if (child === undefined) continue;\n if (child instanceof SyntaxNode) return undefined;\n if (child.kind === 'Whitespace') continue;\n if (child.kind === 'Comment') return child.text;\n return undefined;\n }\n return undefined;\n}\n\ninterface AlignmentColumns {\n readonly typeColumn: number;\n readonly attributeColumn: number;\n}\n\nfunction alignmentMap(block: SyntaxNode): AlignmentColumns | undefined {\n const fields: SyntaxNode[] = [];\n for (const element of block.children()) {\n if (!(element instanceof SyntaxNode)) continue;\n if (FieldDeclarationAst.cast(element) === undefined) continue;\n // Interior comments split rows into continuation lines, so those rows opt out of alignment.\n if (hasInteriorComment(element)) continue;\n fields.push(element);\n }\n if (fields.length === 0) return undefined;\n return alignmentColumns(fields);\n}\n\nfunction alignmentColumns(rows: readonly SyntaxNode[]): AlignmentColumns {\n let nameWidth = 0;\n for (const row of rows) {\n const field = FieldDeclarationAst.cast(row);\n if (!field) continue;\n nameWidth = Math.max(nameWidth, renderTokens(field.name()?.syntax).length);\n }\n const typeColumn = nameWidth + 1;\n let cellEnd = 0;\n for (const row of rows) {\n const field = FieldDeclarationAst.cast(row);\n if (!field) continue;\n const name = renderTokens(field.name()?.syntax);\n const type = renderTokens(field.typeAnnotation()?.syntax);\n cellEnd = Math.max(cellEnd, type.length > 0 ? typeColumn + type.length : name.length);\n }\n return { typeColumn, attributeColumn: cellEnd + 1 };\n}\n\nfunction hasInteriorComment(node: SyntaxNode): boolean {\n for (const token of node.tokens()) {\n if (token.kind === 'Comment') return true;\n }\n return false;\n}\n\nfunction renderTokens(node: SyntaxNode | undefined): string {\n if (!node) return '';\n let out = '';\n let prev: TokenKind | undefined;\n let prevQualified = false;\n const walk = (parent: SyntaxNode, qualified: boolean): void => {\n for (const child of parent.children()) {\n if (child instanceof SyntaxNode) {\n walk(child, qualified || child.kind === 'QualifiedName');\n continue;\n }\n if (child.kind === 'Whitespace' || child.kind === 'Newline' || child.kind === 'Comment') {\n continue;\n }\n if (spaceBetween(prev, child.kind, qualified && prevQualified)) out += ' ';\n out += child.text;\n prev = child.kind;\n prevQualified = qualified;\n }\n };\n walk(node, false);\n return out;\n}\n","export interface FormatOptions {\n readonly indent?: number | 'tab';\n readonly newline?: 'LF' | 'CRLF';\n}\n\nexport interface ResolvedFormatOptions {\n readonly indentUnit: string;\n readonly newline: string;\n}\n\nexport function resolveFormatOptions(options: FormatOptions | undefined): ResolvedFormatOptions {\n const indent = options?.indent ?? 2;\n if (indent !== 'tab' && (typeof indent !== 'number' || !Number.isInteger(indent) || indent < 1)) {\n throw new TypeError(\n `Invalid format options: indent must be a positive integer or 'tab', got ${String(indent)}`,\n );\n }\n const newline = options?.newline ?? 'LF';\n if (newline !== 'LF' && newline !== 'CRLF') {\n throw new TypeError(\n `Invalid format options: newline must be 'LF' or 'CRLF', got ${String(newline)}`,\n );\n }\n return {\n indentUnit: indent === 'tab' ? '\\t' : ' '.repeat(indent),\n newline: newline === 'CRLF' ? '\\r\\n' : '\\n',\n };\n}\n","import { parse } from '../parse';\nimport { emitDocument } from './emit';\nimport { PslFormatError } from './error';\nimport { type FormatOptions, resolveFormatOptions } from './options';\n\nexport function format(source: string, options?: FormatOptions): string {\n const resolved = resolveFormatOptions(options);\n const { document, diagnostics } = parse(source);\n if (diagnostics.length > 0) {\n throw new PslFormatError(diagnostics);\n }\n return emitDocument(document, resolved.indentUnit, resolved.newline);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"format.mjs","names":["#indentUnit","#newline","#out","#depth","#lastWasBlank","#lineOpen","#prevKind","#line","#hasContent"],"sources":["../src/format/error.ts","../src/format/emit.ts","../src/format/options.ts","../src/format/format.ts"],"sourcesContent":["import type { ParseDiagnostic } from '../parse';\n\nexport class PslFormatError extends Error {\n readonly diagnostics: readonly ParseDiagnostic[];\n\n constructor(diagnostics: readonly ParseDiagnostic[]) {\n const summary = diagnostics[0]?.message ?? 'unknown parse error';\n const more = diagnostics.length > 1 ? ` (and ${diagnostics.length - 1} more)` : '';\n super(`Cannot format PSL with parse errors: ${summary}${more}`);\n this.name = 'PslFormatError';\n this.diagnostics = diagnostics;\n }\n}\n","import { ModelAttributeAst } from '../syntax/ast/attributes';\nimport {\n CompositeTypeDeclarationAst,\n type DocumentAst,\n FieldDeclarationAst,\n GenericBlockDeclarationAst,\n KeyValuePairAst,\n ModelDeclarationAst,\n NamedTypeDeclarationAst,\n NamespaceDeclarationAst,\n TypesBlockAst,\n} from '../syntax/ast/declarations';\nimport { type SyntaxElement, SyntaxNode, type SyntaxToken } from '../syntax/red';\nimport type { TokenKind } from '../tokenizer';\n\nexport function emitDocument(document: DocumentAst, indentUnit: string, newline: string): string {\n const writer = new LineWriter(indentUnit, newline);\n emitTopLevel(writer, document);\n return writer.finish();\n}\n\nclass LineWriter {\n readonly #indentUnit: string;\n readonly #newline: string;\n readonly #out: string[] = [];\n #depth = 0;\n #line = '';\n #lineOpen = false;\n #prevKind: TokenKind | undefined;\n #lastWasBlank = false;\n #hasContent = false;\n\n constructor(indentUnit: string, newline: string) {\n this.#indentUnit = indentUnit;\n this.#newline = newline;\n }\n\n indent(): void {\n this.#depth += 1;\n }\n\n unindent(): void {\n this.#depth = Math.max(0, this.#depth - 1);\n }\n\n lastIsBlank(): boolean {\n return this.#lastWasBlank;\n }\n\n lineOpen(): boolean {\n return this.#lineOpen;\n }\n\n prevKind(): TokenKind | undefined {\n return this.#prevKind;\n }\n\n newline(): void {\n if (!this.#lineOpen) return;\n this.#out.push(`${this.#indentUnit.repeat(this.#depth)}${this.#line}`);\n this.#line = '';\n this.#lineOpen = false;\n this.#prevKind = undefined;\n this.#lastWasBlank = false;\n this.#hasContent = true;\n }\n\n blank(): void {\n this.newline();\n if (!this.#hasContent || this.#lastWasBlank) return;\n this.#out.push('');\n this.#lastWasBlank = true;\n }\n\n write(token: SyntaxToken, space: boolean, padTo?: number): void {\n if (this.#lineOpen && padTo !== undefined) {\n this.#line = this.#line.padEnd(padTo);\n } else if (this.#lineOpen && space) {\n this.#line += ' ';\n }\n this.#line += token.text;\n this.#lineOpen = true;\n this.#prevKind = token.kind;\n }\n\n writeRaw(text: string): void {\n this.#line += text;\n this.#lineOpen = true;\n }\n\n comment(text: string): void {\n if (this.#lineOpen) this.#line += ` ${text}`;\n else this.#line = text;\n this.#lineOpen = true;\n this.newline();\n }\n\n finish(): string {\n this.newline();\n const body = this.#out.join(this.#newline);\n return body.length > 0 ? `${body}${this.#newline}` : '';\n }\n}\n\n// Qualified-name separators hug; argument/object colons keep the usual value space.\nfunction spaceBetween(\n prev: TokenKind | undefined,\n cur: TokenKind,\n inQualifiedName: boolean,\n): boolean {\n if (prev === undefined) return false;\n if (inQualifiedName) return false;\n\n switch (cur) {\n case 'LParen':\n case 'LBracket':\n case 'RParen':\n case 'RBracket':\n case 'Comma':\n case 'Question':\n case 'Dot':\n case 'Colon':\n return false;\n case 'RBrace':\n return prev !== 'LBrace';\n default:\n break;\n }\n switch (prev) {\n case 'LParen':\n case 'LBracket':\n case 'Dot':\n case 'At':\n case 'DoubleAt':\n return false;\n default:\n return true;\n }\n}\n\nfunction streamNode(writer: LineWriter, node: SyntaxNode, padTo?: number): number {\n let continuation = 0;\n let first = true;\n let prevQualified = false;\n\n const walk = (parent: SyntaxNode, qualified: boolean): void => {\n for (const child of parent.children()) {\n if (child instanceof SyntaxNode) {\n walk(child, qualified || child.kind === 'QualifiedName');\n continue;\n }\n if (child.kind === 'Whitespace' || child.kind === 'Newline') continue;\n if (child.kind === 'Comment') {\n writer.comment(child.text);\n writer.indent();\n continuation += 1;\n prevQualified = false;\n first = false;\n continue;\n }\n const pad = first ? padTo : undefined;\n const space = spaceBetween(writer.prevKind(), child.kind, qualified && prevQualified);\n writer.write(child, space, writer.lineOpen() ? pad : undefined);\n prevQualified = qualified;\n first = false;\n }\n };\n\n walk(node, false);\n return continuation;\n}\n\nfunction closeContinuation(writer: LineWriter, count: number): void {\n for (let i = 0; i < count; i++) writer.unindent();\n}\n\nfunction emitField(\n writer: LineWriter,\n field: FieldDeclarationAst,\n columns: AlignmentColumns | undefined,\n): number {\n return streamRow(writer, field.syntax, columns);\n}\n\nfunction emitNamedType(writer: LineWriter, decl: NamedTypeDeclarationAst): number {\n return streamRow(writer, decl.syntax, undefined);\n}\n\nfunction streamRow(\n writer: LineWriter,\n row: SyntaxNode,\n columns: AlignmentColumns | undefined,\n): number {\n let continuation = 0;\n let sawAttribute = false;\n\n for (const child of row.children()) {\n if (child instanceof SyntaxNode) {\n let padTo: number | undefined;\n if (child.kind === 'TypeAnnotation' && continuation === 0) {\n padTo = columns?.typeColumn;\n } else if (child.kind === 'FieldAttribute') {\n if (continuation > 0) writer.newline();\n else if (!sawAttribute) padTo = columns?.attributeColumn;\n sawAttribute = true;\n }\n continuation += streamNode(writer, child, padTo);\n continue;\n }\n if (child.kind === 'Whitespace' || child.kind === 'Newline') continue;\n if (child.kind === 'Comment') {\n writer.comment(child.text);\n writer.indent();\n continuation += 1;\n continue;\n }\n const space = spaceBetween(writer.prevKind(), child.kind, false);\n writer.write(child, space);\n }\n\n return continuation;\n}\n\nfunction emitBlockAttribute(writer: LineWriter, attribute: ModelAttributeAst): number {\n return streamNode(writer, attribute.syntax);\n}\n\nfunction emitKeyValue(writer: LineWriter, pair: KeyValuePairAst): number {\n return streamNode(writer, pair.syntax);\n}\n\ntype MemberCategory = 'regular' | 'blockAttribute' | 'nestedBlock';\n\ninterface BlockMember {\n readonly category: MemberCategory;\n emit(trailing: string | undefined): number;\n}\n\nfunction leafMember(\n writer: LineWriter,\n category: MemberCategory,\n print: () => number,\n): BlockMember {\n return {\n category,\n emit(trailing) {\n const continuation = print();\n if (trailing !== undefined) writer.comment(trailing);\n else writer.newline();\n return continuation;\n },\n };\n}\n\ntype MemberClassifier = (node: SyntaxNode) => BlockMember | undefined;\n\nfunction emitModel(\n writer: LineWriter,\n model: ModelDeclarationAst,\n trailing: string | undefined,\n): void {\n const columns = alignmentMap(model.syntax);\n emitBlockBody(writer, model.syntax, trailing, (node) => {\n const field = FieldDeclarationAst.cast(node);\n if (field) return leafMember(writer, 'regular', () => emitField(writer, field, columns));\n const attribute = ModelAttributeAst.cast(node);\n if (attribute)\n return leafMember(writer, 'blockAttribute', () => emitBlockAttribute(writer, attribute));\n return undefined;\n });\n}\n\nfunction emitCompositeType(\n writer: LineWriter,\n composite: CompositeTypeDeclarationAst,\n trailing: string | undefined,\n): void {\n const columns = alignmentMap(composite.syntax);\n emitBlockBody(writer, composite.syntax, trailing, (node) => {\n const field = FieldDeclarationAst.cast(node);\n if (field) return leafMember(writer, 'regular', () => emitField(writer, field, columns));\n const attribute = ModelAttributeAst.cast(node);\n if (attribute)\n return leafMember(writer, 'blockAttribute', () => emitBlockAttribute(writer, attribute));\n return undefined;\n });\n}\n\nfunction emitGenericBlock(\n writer: LineWriter,\n block: GenericBlockDeclarationAst,\n trailing: string | undefined,\n): void {\n emitBlockBody(writer, block.syntax, trailing, (node) => {\n const entry = KeyValuePairAst.cast(node);\n if (entry) return leafMember(writer, 'regular', () => emitKeyValue(writer, entry));\n const attribute = ModelAttributeAst.cast(node);\n if (attribute)\n return leafMember(writer, 'blockAttribute', () => emitBlockAttribute(writer, attribute));\n return undefined;\n });\n}\n\nfunction emitNamespace(\n writer: LineWriter,\n namespace: NamespaceDeclarationAst,\n trailing: string | undefined,\n): void {\n emitBlockBody(writer, namespace.syntax, trailing, (node) => {\n const declaration = castBlockDeclaration(node);\n if (declaration) return nestedBlockMember(writer, declaration);\n return undefined;\n });\n}\n\nfunction emitTypesBlock(\n writer: LineWriter,\n block: TypesBlockAst,\n trailing: string | undefined,\n): void {\n emitBlockBody(writer, block.syntax, trailing, (node) => {\n const named = NamedTypeDeclarationAst.cast(node);\n if (named) return leafMember(writer, 'regular', () => emitNamedType(writer, named));\n return undefined;\n });\n}\n\nfunction emitTopLevel(writer: LineWriter, document: DocumentAst): void {\n walkRegion(writer, Array.from(document.syntax.children()), undefined, (node) => {\n const declaration = castTopLevelDeclaration(node);\n if (declaration) return nestedBlockMember(writer, declaration);\n return undefined;\n });\n}\n\ntype BlockEmitter = (writer: LineWriter, trailing: string | undefined) => void;\n\nfunction nestedBlockMember(writer: LineWriter, block: BlockEmitter): BlockMember {\n return {\n category: 'nestedBlock',\n emit(trailing) {\n block(writer, trailing);\n return 0;\n },\n };\n}\n\nfunction castBlockDeclaration(node: SyntaxNode): BlockEmitter | undefined {\n const model = ModelDeclarationAst.cast(node);\n if (model) return (writer, trailing) => emitModel(writer, model, trailing);\n const composite = CompositeTypeDeclarationAst.cast(node);\n if (composite) return (writer, trailing) => emitCompositeType(writer, composite, trailing);\n const generic = GenericBlockDeclarationAst.cast(node);\n if (generic) return (writer, trailing) => emitGenericBlock(writer, generic, trailing);\n return undefined;\n}\n\nfunction castTopLevelDeclaration(node: SyntaxNode): BlockEmitter | undefined {\n const block = castBlockDeclaration(node);\n if (block) return block;\n const namespace = NamespaceDeclarationAst.cast(node);\n if (namespace) return (writer, trailing) => emitNamespace(writer, namespace, trailing);\n const types = TypesBlockAst.cast(node);\n if (types) return (writer, trailing) => emitTypesBlock(writer, types, trailing);\n return undefined;\n}\n\nfunction emitBlockBody(\n writer: LineWriter,\n node: SyntaxNode,\n closingTrailing: string | undefined,\n classify: MemberClassifier,\n): void {\n const children = Array.from(node.children());\n const openIndex = children.findIndex((el) => !(el instanceof SyntaxNode) && el.kind === 'LBrace');\n\n streamHeader(writer, node);\n const headerComment = sameLineCommentAfter(children, openIndex);\n if (headerComment !== undefined) writer.comment(headerComment);\n else writer.newline();\n\n writer.indent();\n walkRegion(writer, children, 'RBrace', classify);\n writer.unindent();\n\n writer.writeRaw('}');\n if (closingTrailing !== undefined) writer.comment(closingTrailing);\n else writer.newline();\n}\n\nfunction streamHeader(writer: LineWriter, node: SyntaxNode): void {\n let done = false;\n const walk = (parent: SyntaxNode): void => {\n for (const child of parent.children()) {\n if (done) return;\n if (child instanceof SyntaxNode) {\n walk(child);\n continue;\n }\n if (child.kind === 'Whitespace' || child.kind === 'Newline' || child.kind === 'Comment') {\n continue;\n }\n const space = spaceBetween(writer.prevKind(), child.kind, false);\n writer.write(child, space);\n if (child.kind === 'LBrace') {\n done = true;\n return;\n }\n }\n };\n walk(node);\n}\n\nfunction walkRegion(\n writer: LineWriter,\n elements: readonly SyntaxElement[],\n closeKind: 'RBrace' | undefined,\n classify: MemberClassifier,\n): void {\n let sawOpenBrace = closeKind === undefined;\n let sawContent = false;\n let lastWasRegular = false;\n let ledByComment = false;\n let newlines = 0;\n\n for (let i = 0; i < elements.length; i++) {\n const element = elements[i];\n if (element === undefined) continue;\n\n if (element instanceof SyntaxNode) {\n if (!sawOpenBrace) continue;\n const member = classify(element);\n if (member === undefined) continue;\n if (!ledByComment) {\n if (newlines >= 2 && sawContent && !writer.lastIsBlank()) writer.blank();\n else if (separationBlankWanted(writer, member.category, sawContent, lastWasRegular)) {\n writer.blank();\n }\n }\n\n const trailing = sameLineTrailingComment(elements, i);\n closeContinuation(writer, member.emit(trailing.text));\n if (trailing.index !== undefined) i = trailing.index;\n sawContent = true;\n lastWasRegular = member.category !== 'blockAttribute';\n ledByComment = false;\n newlines = 0;\n continue;\n }\n\n if (element.kind === 'LBrace' && closeKind === 'RBrace' && !sawOpenBrace) {\n sawOpenBrace = true;\n newlines = 0;\n continue;\n }\n if (!sawOpenBrace) continue;\n if (closeKind === 'RBrace' && element.kind === 'RBrace') break;\n if (element.kind === 'Whitespace') continue;\n if (element.kind === 'Newline') {\n newlines += 1;\n continue;\n }\n if (element.kind === 'Comment') {\n if (closeKind === 'RBrace' && newlines === 0 && !sawContent) {\n // Same-line comment trailing the opening `{`: owned by the block header.\n continue;\n }\n if (newlines >= 2 && sawContent && !writer.lastIsBlank()) writer.blank();\n else if (!ledByComment) {\n const led = leadingMemberAfter(elements, i, classify);\n if (led && separationBlankWanted(writer, led, sawContent, lastWasRegular)) writer.blank();\n }\n writer.writeRaw(element.text);\n writer.newline();\n sawContent = true;\n ledByComment = true;\n newlines = 0;\n }\n }\n}\n\nfunction separationBlankWanted(\n writer: LineWriter,\n category: MemberCategory,\n sawContent: boolean,\n lastWasRegular: boolean,\n): boolean {\n if (!sawContent || writer.lastIsBlank()) return false;\n if (category === 'nestedBlock') return true;\n return category === 'blockAttribute' && lastWasRegular;\n}\n\nfunction leadingMemberAfter(\n elements: readonly SyntaxElement[],\n commentIndex: number,\n classify: MemberClassifier,\n): MemberCategory | undefined {\n for (let i = commentIndex + 1; i < elements.length; i++) {\n const element = elements[i];\n if (element === undefined) continue;\n if (element instanceof SyntaxNode) return classify(element)?.category;\n if (element.kind === 'RBrace') return undefined;\n }\n return undefined;\n}\n\nfunction sameLineTrailingComment(\n elements: readonly SyntaxElement[],\n memberIndex: number,\n): { text: string | undefined; index: number | undefined } {\n for (let i = memberIndex + 1; i < elements.length; i++) {\n const element = elements[i];\n if (element === undefined) continue;\n if (element instanceof SyntaxNode) break;\n if (element.kind === 'Whitespace') continue;\n if (element.kind === 'Comment') return { text: element.text, index: i };\n break;\n }\n return { text: undefined, index: undefined };\n}\n\nfunction sameLineCommentAfter(\n children: readonly SyntaxElement[],\n openIndex: number,\n): string | undefined {\n for (let i = openIndex + 1; i < children.length; i++) {\n const child = children[i];\n if (child === undefined) continue;\n if (child instanceof SyntaxNode) return undefined;\n if (child.kind === 'Whitespace') continue;\n if (child.kind === 'Comment') return child.text;\n return undefined;\n }\n return undefined;\n}\n\ninterface AlignmentColumns {\n readonly typeColumn: number;\n readonly attributeColumn: number;\n}\n\nfunction alignmentMap(block: SyntaxNode): AlignmentColumns | undefined {\n const fields: SyntaxNode[] = [];\n for (const element of block.children()) {\n if (!(element instanceof SyntaxNode)) continue;\n if (FieldDeclarationAst.cast(element) === undefined) continue;\n // Interior comments split rows into continuation lines, so those rows opt out of alignment.\n if (hasInteriorComment(element)) continue;\n fields.push(element);\n }\n if (fields.length === 0) return undefined;\n return alignmentColumns(fields);\n}\n\nfunction alignmentColumns(rows: readonly SyntaxNode[]): AlignmentColumns {\n let nameWidth = 0;\n for (const row of rows) {\n const field = FieldDeclarationAst.cast(row);\n if (!field) continue;\n nameWidth = Math.max(nameWidth, renderTokens(field.name()?.syntax).length);\n }\n const typeColumn = nameWidth + 1;\n let cellEnd = 0;\n for (const row of rows) {\n const field = FieldDeclarationAst.cast(row);\n if (!field) continue;\n const name = renderTokens(field.name()?.syntax);\n const type = renderTokens(field.typeAnnotation()?.syntax);\n cellEnd = Math.max(cellEnd, type.length > 0 ? typeColumn + type.length : name.length);\n }\n return { typeColumn, attributeColumn: cellEnd + 1 };\n}\n\nfunction hasInteriorComment(node: SyntaxNode): boolean {\n for (const token of node.tokens()) {\n if (token.kind === 'Comment') return true;\n }\n return false;\n}\n\nfunction renderTokens(node: SyntaxNode | undefined): string {\n if (!node) return '';\n let out = '';\n let prev: TokenKind | undefined;\n let prevQualified = false;\n const walk = (parent: SyntaxNode, qualified: boolean): void => {\n for (const child of parent.children()) {\n if (child instanceof SyntaxNode) {\n walk(child, qualified || child.kind === 'QualifiedName');\n continue;\n }\n if (child.kind === 'Whitespace' || child.kind === 'Newline' || child.kind === 'Comment') {\n continue;\n }\n if (spaceBetween(prev, child.kind, qualified && prevQualified)) out += ' ';\n out += child.text;\n prev = child.kind;\n prevQualified = qualified;\n }\n };\n walk(node, false);\n return out;\n}\n","export interface FormatOptions {\n readonly indent?: number | 'tab';\n readonly newline?: 'LF' | 'CRLF';\n}\n\nexport interface ResolvedFormatOptions {\n readonly indentUnit: string;\n readonly newline: string;\n}\n\nexport function resolveFormatOptions(options: FormatOptions | undefined): ResolvedFormatOptions {\n const indent = options?.indent ?? 2;\n if (indent !== 'tab' && (typeof indent !== 'number' || !Number.isInteger(indent) || indent < 1)) {\n throw new TypeError(\n `Invalid format options: indent must be a positive integer or 'tab', got ${String(indent)}`,\n );\n }\n const newline = options?.newline ?? 'LF';\n if (newline !== 'LF' && newline !== 'CRLF') {\n throw new TypeError(\n `Invalid format options: newline must be 'LF' or 'CRLF', got ${String(newline)}`,\n );\n }\n return {\n indentUnit: indent === 'tab' ? '\\t' : ' '.repeat(indent),\n newline: newline === 'CRLF' ? '\\r\\n' : '\\n',\n };\n}\n","import { parse } from '../parse';\nimport { emitDocument } from './emit';\nimport { PslFormatError } from './error';\nimport { type FormatOptions, resolveFormatOptions } from './options';\n\nexport function format(source: string, options?: FormatOptions): string {\n const resolved = resolveFormatOptions(options);\n const { document, diagnostics } = parse(source);\n if (diagnostics.length > 0) {\n throw new PslFormatError(diagnostics);\n }\n return emitDocument(document, resolved.indentUnit, resolved.newline);\n}\n"],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,9 +1,245 @@
|
|
|
1
|
-
import { t as
|
|
2
|
-
import {
|
|
1
|
+
import { $ as Range, H as SyntaxNode, P as AstNode, T as ExpressionAst, b as FieldAttributeAst, c as DocumentAst, et as SourceFile, h as NamespaceDeclarationAst, l as FieldDeclarationAst, m as NamedTypeDeclarationAst, o as CompositeTypeDeclarationAst, p as ModelDeclarationAst, t as ParseDiagnostic, u as GenericBlockDeclarationAst, v as TypeAnnotationAst, x as ModelAttributeAst } from "./parse-BazJr7Ye.mjs";
|
|
2
|
+
import { PslAttribute, PslAttribute as PslAttribute$1, PslAttributeArgument, PslAttributeNamedArgument, PslAttributePositionalArgument, PslAttributeTarget, PslCompositeType, PslDefaultFunctionValue, PslDefaultLiteralValue, PslDefaultValue, PslDiagnostic, PslDiagnostic as PslDiagnostic$1, PslDiagnosticCode, PslDiagnosticCode as PslDiagnosticCode$1, PslDocumentAst, PslExtensionBlock, PslExtensionBlock as PslExtensionBlock$1, PslExtensionBlockAttribute, PslExtensionBlockAttributeArg, PslExtensionBlockParamBare, PslExtensionBlockParamList, PslExtensionBlockParamOption, PslExtensionBlockParamRef, PslExtensionBlockParamScalarValue, PslExtensionBlockParamValue, PslField, PslFieldAttribute, PslModel, PslModelAttribute, PslNamedTypeDeclaration, PslNamespace, PslPosition, PslSpan, PslSpan as PslSpan$1, PslTypeConstructorCall, PslTypesBlock, flatPslModels, namespacePslExtensionBlocks } from "@prisma-next/framework-components/psl-ast";
|
|
3
|
+
import { Result } from "@prisma-next/utils/result";
|
|
4
|
+
import { AuthoringPslBlockDescriptor, AuthoringPslBlockDescriptorNamespace } from "@prisma-next/framework-components/authoring";
|
|
5
|
+
import { Simplify, UnionToIntersection } from "@prisma-next/utils/types";
|
|
6
|
+
import { CodecLookup } from "@prisma-next/framework-components/codec";
|
|
3
7
|
|
|
4
8
|
//#region src/attribute-helpers.d.ts
|
|
5
9
|
declare function getPositionalArgument(attribute: PslAttribute$1, index?: number): string | undefined;
|
|
6
10
|
declare function parseQuotedStringLiteral(value: string): string | undefined;
|
|
7
11
|
//#endregion
|
|
8
|
-
|
|
12
|
+
//#region src/resolve.d.ts
|
|
13
|
+
interface ResolvedAttributeArg {
|
|
14
|
+
readonly kind: 'positional' | 'named';
|
|
15
|
+
readonly name?: string;
|
|
16
|
+
readonly value: string;
|
|
17
|
+
readonly expression?: ExpressionAst;
|
|
18
|
+
readonly span: PslSpan$1;
|
|
19
|
+
}
|
|
20
|
+
interface ResolvedAttribute {
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly args: readonly ResolvedAttributeArg[];
|
|
23
|
+
readonly span: PslSpan$1;
|
|
24
|
+
}
|
|
25
|
+
interface ResolvedTypeConstructorCall {
|
|
26
|
+
readonly path: readonly string[];
|
|
27
|
+
readonly args: readonly ResolvedAttributeArg[];
|
|
28
|
+
readonly span: PslSpan$1;
|
|
29
|
+
}
|
|
30
|
+
declare function readResolvedAttribute(attribute: FieldAttributeAst | ModelAttributeAst, sourceFile: SourceFile): ResolvedAttribute;
|
|
31
|
+
declare function readResolvedAttributes(attributes: Iterable<FieldAttributeAst | ModelAttributeAst>, sourceFile: SourceFile): readonly ResolvedAttribute[];
|
|
32
|
+
declare function readResolvedConstructorCall(annotation: TypeAnnotationAst | undefined, sourceFile: SourceFile): ResolvedTypeConstructorCall | undefined;
|
|
33
|
+
declare function nodePslSpan(node: SyntaxNode, sourceFile: SourceFile): PslSpan$1;
|
|
34
|
+
/** Unsupported-top-level-block diagnostics are anchored to the keyword token. */
|
|
35
|
+
declare function keywordPslSpan(node: SyntaxNode, keyword: string, sourceFile: SourceFile): PslSpan$1;
|
|
36
|
+
declare function rangeToPslSpan(range: Range, sourceFile: SourceFile): PslSpan$1;
|
|
37
|
+
//#endregion
|
|
38
|
+
//#region src/symbol-table.d.ts
|
|
39
|
+
interface SymbolTable {
|
|
40
|
+
readonly topLevel: TopLevelScope;
|
|
41
|
+
}
|
|
42
|
+
interface TopLevelScope {
|
|
43
|
+
readonly namespaces: Record<string, NamespaceSymbol>;
|
|
44
|
+
readonly scalars: Record<string, ScalarSymbol>;
|
|
45
|
+
readonly typeAliases: Record<string, TypeAliasSymbol>;
|
|
46
|
+
readonly blocks: Record<string, BlockSymbol>;
|
|
47
|
+
readonly models: Record<string, ModelSymbol>;
|
|
48
|
+
readonly compositeTypes: Record<string, CompositeTypeSymbol>;
|
|
49
|
+
}
|
|
50
|
+
interface NamespaceSymbol {
|
|
51
|
+
readonly kind: 'namespace';
|
|
52
|
+
readonly name: string;
|
|
53
|
+
readonly node: NamespaceDeclarationAst;
|
|
54
|
+
readonly span: PslSpan$1;
|
|
55
|
+
readonly models: Record<string, ModelSymbol>;
|
|
56
|
+
readonly compositeTypes: Record<string, CompositeTypeSymbol>;
|
|
57
|
+
readonly blocks: Record<string, BlockSymbol>;
|
|
58
|
+
}
|
|
59
|
+
interface ModelSymbol {
|
|
60
|
+
readonly kind: 'model';
|
|
61
|
+
readonly name: string;
|
|
62
|
+
readonly node: ModelDeclarationAst;
|
|
63
|
+
readonly span: PslSpan$1;
|
|
64
|
+
readonly fields: Record<string, FieldSymbol>;
|
|
65
|
+
readonly attributes: readonly ResolvedAttribute[];
|
|
66
|
+
}
|
|
67
|
+
interface CompositeTypeSymbol {
|
|
68
|
+
readonly kind: 'compositeType';
|
|
69
|
+
readonly name: string;
|
|
70
|
+
readonly node: CompositeTypeDeclarationAst;
|
|
71
|
+
readonly span: PslSpan$1;
|
|
72
|
+
readonly fields: Record<string, FieldSymbol>;
|
|
73
|
+
readonly attributes: readonly ResolvedAttribute[];
|
|
74
|
+
}
|
|
75
|
+
interface BlockSymbol {
|
|
76
|
+
readonly kind: 'block';
|
|
77
|
+
readonly name: string;
|
|
78
|
+
readonly keyword: string;
|
|
79
|
+
readonly node: GenericBlockDeclarationAst;
|
|
80
|
+
readonly span: PslSpan$1;
|
|
81
|
+
/** Resolved once so consumers do not independently classify block parameters. */
|
|
82
|
+
readonly block: PslExtensionBlock$1;
|
|
83
|
+
}
|
|
84
|
+
interface ResolvedNamedTypeBinding {
|
|
85
|
+
readonly baseType?: string;
|
|
86
|
+
readonly typeConstructor?: ResolvedTypeConstructorCall;
|
|
87
|
+
readonly isConstructor: boolean;
|
|
88
|
+
readonly attributes: readonly ResolvedAttribute[];
|
|
89
|
+
}
|
|
90
|
+
interface ScalarSymbol extends ResolvedNamedTypeBinding {
|
|
91
|
+
readonly kind: 'scalar';
|
|
92
|
+
readonly name: string;
|
|
93
|
+
readonly node: NamedTypeDeclarationAst;
|
|
94
|
+
readonly span: PslSpan$1;
|
|
95
|
+
}
|
|
96
|
+
interface TypeAliasSymbol extends ResolvedNamedTypeBinding {
|
|
97
|
+
readonly kind: 'typeAlias';
|
|
98
|
+
readonly name: string;
|
|
99
|
+
readonly node: NamedTypeDeclarationAst;
|
|
100
|
+
readonly span: PslSpan$1;
|
|
101
|
+
}
|
|
102
|
+
interface FieldSymbol {
|
|
103
|
+
readonly kind: 'field';
|
|
104
|
+
readonly name: string;
|
|
105
|
+
readonly node: FieldDeclarationAst;
|
|
106
|
+
readonly span: PslSpan$1;
|
|
107
|
+
readonly typeName: string;
|
|
108
|
+
readonly typeNamespaceId?: string;
|
|
109
|
+
readonly typeContractSpaceId?: string;
|
|
110
|
+
readonly optional: boolean;
|
|
111
|
+
readonly list: boolean;
|
|
112
|
+
readonly typeConstructor?: ResolvedTypeConstructorCall;
|
|
113
|
+
readonly attributes: readonly ResolvedAttribute[];
|
|
114
|
+
/** Prevents cascading unsupported-type diagnostics after invalid qualification. */
|
|
115
|
+
readonly malformedType?: boolean;
|
|
116
|
+
}
|
|
117
|
+
interface BuildSymbolTableOptions {
|
|
118
|
+
readonly document: DocumentAst;
|
|
119
|
+
readonly sourceFile: SourceFile;
|
|
120
|
+
readonly scalarTypes: readonly string[];
|
|
121
|
+
readonly pslBlockDescriptors: AuthoringPslBlockDescriptorNamespace;
|
|
122
|
+
}
|
|
123
|
+
interface SymbolTableResult {
|
|
124
|
+
readonly table: SymbolTable;
|
|
125
|
+
readonly diagnostics: readonly ParseDiagnostic[];
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Owns duplicate-declaration detection for all PSL scopes; downstream consumers
|
|
129
|
+
* should consume first-wins symbols rather than re-emitting duplicate diagnostics.
|
|
130
|
+
*/
|
|
131
|
+
declare function buildSymbolTable(options: BuildSymbolTableOptions): SymbolTableResult;
|
|
132
|
+
//#endregion
|
|
133
|
+
//#region src/attribute-spec/types.d.ts
|
|
134
|
+
type AttributeLevel = 'field' | 'model' | 'block';
|
|
135
|
+
interface ArgType<T> {
|
|
136
|
+
readonly kind: string;
|
|
137
|
+
readonly label: string;
|
|
138
|
+
readonly _out?: T;
|
|
139
|
+
parse(arg: ExpressionAst, ctx: InterpretCtx): Result<T, readonly PslDiagnostic$1[]>;
|
|
140
|
+
}
|
|
141
|
+
interface InterpretCtx {
|
|
142
|
+
readonly level: AttributeLevel;
|
|
143
|
+
readonly sourceId: string;
|
|
144
|
+
readonly sourceFile: SourceFile;
|
|
145
|
+
readonly selfModel: ModelSymbol;
|
|
146
|
+
resolveReferencedModel(): ModelSymbol | undefined;
|
|
147
|
+
readonly field?: FieldSymbol;
|
|
148
|
+
}
|
|
149
|
+
interface OptionalArgType<T> extends ArgType<T> {
|
|
150
|
+
readonly optional: true;
|
|
151
|
+
readonly hasDefault: boolean;
|
|
152
|
+
readonly defaultValue?: T;
|
|
153
|
+
}
|
|
154
|
+
type Param<T> = ArgType<T>;
|
|
155
|
+
interface PositionalParam<T = unknown> {
|
|
156
|
+
readonly key: string;
|
|
157
|
+
readonly type: Param<T>;
|
|
158
|
+
}
|
|
159
|
+
interface AttributeSpec<Out> {
|
|
160
|
+
readonly level: AttributeLevel;
|
|
161
|
+
readonly name: string;
|
|
162
|
+
readonly positional: readonly PositionalParam[];
|
|
163
|
+
readonly named: Readonly<Record<string, Param<unknown>>>;
|
|
164
|
+
readonly refine?: (parsed: Out, ctx: InterpretCtx) => readonly PslDiagnostic$1[];
|
|
165
|
+
}
|
|
166
|
+
type OutOf<P> = P extends ArgType<infer T> ? T : never;
|
|
167
|
+
type NamedOut<N extends Record<string, Param<unknown>>> = Simplify<{ [K in keyof N as N[K] extends OptionalArgType<unknown> ? never : K]: OutOf<N[K]> } & { [K in keyof N as N[K] extends OptionalArgType<unknown> ? K : never]?: OutOf<N[K]> }>;
|
|
168
|
+
type PosEntryObject<E extends PositionalParam> = E['type'] extends OptionalArgType<unknown> ? { [K in E['key']]?: OutOf<E['type']> } : { [K in E['key']]: OutOf<E['type']> };
|
|
169
|
+
type PosOut<Pos extends readonly PositionalParam[]> = Simplify<UnionToIntersection<{ [I in keyof Pos]: PosEntryObject<Pos[I]> }[number]>>;
|
|
170
|
+
type AttributeOut<Pos extends readonly PositionalParam[], Named extends Record<string, Param<unknown>>> = Simplify<PosOut<Pos> & NamedOut<Named>>;
|
|
171
|
+
type InferAttr<S> = S extends AttributeSpec<infer Out> ? Out : never;
|
|
172
|
+
//#endregion
|
|
173
|
+
//#region src/attribute-spec/combinators/bool.d.ts
|
|
174
|
+
declare function bool(): ArgType<boolean>;
|
|
175
|
+
//#endregion
|
|
176
|
+
//#region src/attribute-spec/combinators/diagnostic.d.ts
|
|
177
|
+
declare function leafDiagnostic(ctx: InterpretCtx, node: AstNode, message: string): PslDiagnostic$1;
|
|
178
|
+
//#endregion
|
|
179
|
+
//#region src/attribute-spec/combinators/entity-ref.d.ts
|
|
180
|
+
declare function entityRef(): ArgType<string>;
|
|
181
|
+
//#endregion
|
|
182
|
+
//#region src/attribute-spec/combinators/field-ref.d.ts
|
|
183
|
+
type FieldRefScope = 'self' | 'referenced';
|
|
184
|
+
interface FieldRefArgType extends ArgType<string> {
|
|
185
|
+
readonly scope: FieldRefScope;
|
|
186
|
+
}
|
|
187
|
+
declare function fieldRef(scope: FieldRefScope): FieldRefArgType;
|
|
188
|
+
//#endregion
|
|
189
|
+
//#region src/attribute-spec/combinators/identifier.d.ts
|
|
190
|
+
declare function identifier<const N extends string>(name: N): ArgType<N>;
|
|
191
|
+
//#endregion
|
|
192
|
+
//#region src/attribute-spec/combinators/int.d.ts
|
|
193
|
+
declare function int(): ArgType<number>;
|
|
194
|
+
//#endregion
|
|
195
|
+
//#region src/attribute-spec/combinators/list.d.ts
|
|
196
|
+
interface ListOptions {
|
|
197
|
+
readonly nonEmpty?: boolean;
|
|
198
|
+
readonly unique?: boolean;
|
|
199
|
+
}
|
|
200
|
+
declare function list<T>(of: ArgType<T>, opts?: ListOptions): ArgType<T[]>;
|
|
201
|
+
//#endregion
|
|
202
|
+
//#region src/attribute-spec/combinators/one-of.d.ts
|
|
203
|
+
declare function oneOf<Alts extends readonly [ArgType<unknown>, ...ArgType<unknown>[]]>(...alts: Alts): ArgType<OutOf<Alts[number]>>;
|
|
204
|
+
//#endregion
|
|
205
|
+
//#region src/attribute-spec/combinators/record.d.ts
|
|
206
|
+
declare function record<T>(of: ArgType<T>): ArgType<Record<string, T>>;
|
|
207
|
+
//#endregion
|
|
208
|
+
//#region src/attribute-spec/combinators/str.d.ts
|
|
209
|
+
declare function str(): ArgType<string>;
|
|
210
|
+
//#endregion
|
|
211
|
+
//#region src/attribute-spec/field-attribute.d.ts
|
|
212
|
+
interface FieldAttributeConfig<Pos extends readonly PositionalParam[], Named extends Record<string, Param<unknown>>> {
|
|
213
|
+
readonly positional?: Pos;
|
|
214
|
+
readonly named?: Named;
|
|
215
|
+
readonly refine?: (parsed: AttributeOut<Pos, Named>, ctx: InterpretCtx) => readonly PslDiagnostic$1[];
|
|
216
|
+
}
|
|
217
|
+
declare function fieldAttribute<const Pos extends readonly PositionalParam[] = readonly [], const Named extends Record<string, Param<unknown>> = Record<never, never>>(name: string, config: FieldAttributeConfig<Pos, Named>): AttributeSpec<AttributeOut<Pos, Named>>;
|
|
218
|
+
//#endregion
|
|
219
|
+
//#region src/attribute-spec/interpret.d.ts
|
|
220
|
+
declare function interpretAttribute<Out>(attrNode: FieldAttributeAst | ModelAttributeAst, spec: AttributeSpec<Out>, ctx: InterpretCtx): Result<Out, readonly PslDiagnostic$1[]>;
|
|
221
|
+
//#endregion
|
|
222
|
+
//#region src/attribute-spec/model-attribute.d.ts
|
|
223
|
+
interface ModelAttributeConfig<Pos extends readonly PositionalParam[], Named extends Record<string, Param<unknown>>> {
|
|
224
|
+
readonly positional?: Pos;
|
|
225
|
+
readonly named?: Named;
|
|
226
|
+
readonly refine?: (parsed: AttributeOut<Pos, Named>, ctx: InterpretCtx) => readonly PslDiagnostic$1[];
|
|
227
|
+
}
|
|
228
|
+
declare function modelAttribute<const Pos extends readonly PositionalParam[] = readonly [], const Named extends Record<string, Param<unknown>> = Record<never, never>>(name: string, config: ModelAttributeConfig<Pos, Named>): AttributeSpec<AttributeOut<Pos, Named>>;
|
|
229
|
+
//#endregion
|
|
230
|
+
//#region src/attribute-spec/optional.d.ts
|
|
231
|
+
declare function optional<T>(type: ArgType<T>, ...rest: [defaultValue: T] | []): OptionalArgType<T>;
|
|
232
|
+
//#endregion
|
|
233
|
+
//#region src/extension-block.d.ts
|
|
234
|
+
declare function findBlockDescriptor(descriptors: AuthoringPslBlockDescriptorNamespace | undefined, keyword: string): AuthoringPslBlockDescriptor | undefined;
|
|
235
|
+
declare function validateExtensionBlockFromSymbol(input: {
|
|
236
|
+
readonly block: BlockSymbol;
|
|
237
|
+
readonly descriptor: AuthoringPslBlockDescriptor;
|
|
238
|
+
readonly symbolTable: SymbolTable;
|
|
239
|
+
readonly sourceFile: SourceFile;
|
|
240
|
+
readonly sourceId: string;
|
|
241
|
+
readonly codecLookup: CodecLookup;
|
|
242
|
+
}): readonly PslDiagnostic$1[];
|
|
243
|
+
//#endregion
|
|
244
|
+
export { type ArgType, type AttributeLevel, type AttributeOut, type AttributeSpec, type BlockSymbol, type BuildSymbolTableOptions, type CompositeTypeSymbol, type FieldRefArgType, type FieldRefScope, type FieldSymbol, type InferAttr, type InterpretCtx, type ListOptions, type ModelSymbol, type NamedOut, type NamespaceSymbol, type OptionalArgType, type OutOf, type Param, type PosOut, type PositionalParam, type PslAttribute, type PslAttributeArgument, type PslAttributeNamedArgument, type PslAttributePositionalArgument, type PslAttributeTarget, type PslCompositeType, type PslDefaultFunctionValue, type PslDefaultLiteralValue, type PslDefaultValue, type PslDiagnostic, type PslDiagnosticCode, type PslDocumentAst, type PslExtensionBlock, type PslExtensionBlockAttribute, type PslExtensionBlockAttributeArg, type PslExtensionBlockParamBare, type PslExtensionBlockParamList, type PslExtensionBlockParamOption, type PslExtensionBlockParamRef, type PslExtensionBlockParamScalarValue, type PslExtensionBlockParamValue, type PslField, type PslFieldAttribute, type PslModel, type PslModelAttribute, type PslNamedTypeDeclaration, type PslNamespace, type PslPosition, type PslSpan, type PslTypeConstructorCall, type PslTypesBlock, type ResolvedAttribute, type ResolvedAttributeArg, type ResolvedNamedTypeBinding, type ResolvedTypeConstructorCall, type ScalarSymbol, type SymbolTable, type SymbolTableResult, type TopLevelScope, type TypeAliasSymbol, bool, buildSymbolTable, entityRef, fieldAttribute, fieldRef, findBlockDescriptor, flatPslModels, getPositionalArgument, identifier, int, interpretAttribute, keywordPslSpan, leafDiagnostic, list, modelAttribute, namespacePslExtensionBlocks, nodePslSpan, oneOf, optional, parseQuotedStringLiteral, rangeToPslSpan, readResolvedAttribute, readResolvedAttributes, readResolvedConstructorCall, record, str, validateExtensionBlockFromSymbol };
|
|
9
245
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/attribute-helpers.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/attribute-helpers.ts","../src/resolve.ts","../src/symbol-table.ts","../src/attribute-spec/types.ts","../src/attribute-spec/combinators/bool.ts","../src/attribute-spec/combinators/diagnostic.ts","../src/attribute-spec/combinators/entity-ref.ts","../src/attribute-spec/combinators/field-ref.ts","../src/attribute-spec/combinators/identifier.ts","../src/attribute-spec/combinators/int.ts","../src/attribute-spec/combinators/list.ts","../src/attribute-spec/combinators/one-of.ts","../src/attribute-spec/combinators/record.ts","../src/attribute-spec/combinators/str.ts","../src/attribute-spec/field-attribute.ts","../src/attribute-spec/interpret.ts","../src/attribute-spec/model-attribute.ts","../src/attribute-spec/optional.ts","../src/extension-block.ts"],"mappings":"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"}
|