@prisma-next/psl-parser 0.5.0-dev.66 → 0.5.0-dev.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { t as parsePslDocument } from "./parser-CvQgL2C_.mjs";
1
+ import { t as parsePslDocument } from "./parser-Bjdnhl7C.mjs";
2
2
  import { ParsePslDocumentInput, ParsePslDocumentResult, PslAttribute, PslAttribute as PslAttribute$1, PslAttributeArgument, PslAttributeNamedArgument, PslAttributePositionalArgument, PslAttributeTarget, PslCompositeType, PslDefaultFunctionValue, PslDefaultLiteralValue, PslDefaultValue, PslDiagnostic, PslDiagnosticCode, PslDocumentAst, PslEnum, PslEnumValue, PslField, PslFieldAttribute, PslModel, PslModelAttribute, PslNamedTypeDeclaration, PslPosition, PslSpan, PslTypeConstructorCall, PslTypesBlock } from "@prisma-next/framework-components/psl-ast";
3
3
 
4
4
  //#region src/attribute-helpers.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/attribute-helpers.ts"],"sourcesContent":[],"mappings":";;;;iBAEgB,qBAAA,YAAiC;iBAKjC,wBAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/attribute-helpers.ts"],"mappings":";;;;iBAEgB,qBAAA,CAAsB,SAAA,EAAW,cAAA,EAAc,KAAA;AAAA,iBAK/C,wBAAA,CAAyB,KAAA"}
package/dist/index.mjs CHANGED
@@ -1,5 +1,4 @@
1
- import { t as parsePslDocument } from "./parser-D3Wqx9uF.mjs";
2
-
1
+ import { t as parsePslDocument } from "./parser-1DZHweIq.mjs";
3
2
  //#region src/attribute-helpers.ts
4
3
  function getPositionalArgument(attribute, index = 0) {
5
4
  return attribute.args.filter((arg) => arg.kind === "positional")[index]?.value;
@@ -9,7 +8,7 @@ function parseQuotedStringLiteral(value) {
9
8
  if (!match) return void 0;
10
9
  return match[2] ?? "";
11
10
  }
12
-
13
11
  //#endregion
14
12
  export { getPositionalArgument, parsePslDocument, parseQuotedStringLiteral };
13
+
15
14
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/attribute-helpers.ts"],"sourcesContent":["import type { PslAttribute } from '@prisma-next/framework-components/psl-ast';\n\nexport function getPositionalArgument(attribute: PslAttribute, index = 0): string | undefined {\n const entries = attribute.args.filter((arg) => arg.kind === 'positional');\n return entries[index]?.value;\n}\n\nexport function parseQuotedStringLiteral(value: string): string | undefined {\n const trimmed = value.trim();\n const match = trimmed.match(/^(['\"])(.*)\\1$/);\n if (!match) return undefined;\n return match[2] ?? '';\n}\n"],"mappings":";;;AAEA,SAAgB,sBAAsB,WAAyB,QAAQ,GAAuB;AAE5F,QADgB,UAAU,KAAK,QAAQ,QAAQ,IAAI,SAAS,aAAa,CAC1D,QAAQ;;AAGzB,SAAgB,yBAAyB,OAAmC;CAE1E,MAAM,QADU,MAAM,MAAM,CACN,MAAM,iBAAiB;AAC7C,KAAI,CAAC,MAAO,QAAO;AACnB,QAAO,MAAM,MAAM"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/attribute-helpers.ts"],"sourcesContent":["import type { PslAttribute } from '@prisma-next/framework-components/psl-ast';\n\nexport function getPositionalArgument(attribute: PslAttribute, index = 0): string | undefined {\n const entries = attribute.args.filter((arg) => arg.kind === 'positional');\n return entries[index]?.value;\n}\n\nexport function parseQuotedStringLiteral(value: string): string | undefined {\n const trimmed = value.trim();\n const match = trimmed.match(/^(['\"])(.*)\\1$/);\n if (!match) return undefined;\n return match[2] ?? '';\n}\n"],"mappings":";;AAEA,SAAgB,sBAAsB,WAAyB,QAAQ,GAAuB;CAE5F,OADgB,UAAU,KAAK,QAAQ,QAAQ,IAAI,SAAS,aAC9C,CAAC,QAAQ;;AAGzB,SAAgB,yBAAyB,OAAmC;CAE1E,MAAM,QADU,MAAM,MACD,CAAC,MAAM,iBAAiB;CAC7C,IAAI,CAAC,OAAO,OAAO,KAAA;CACnB,OAAO,MAAM,MAAM"}
@@ -1,5 +1,4 @@
1
1
  import { ifDefined } from "@prisma-next/utils/defined";
2
-
3
2
  //#region src/parser.ts
4
3
  const SCALAR_TYPES = new Set([
5
4
  "String",
@@ -926,7 +925,7 @@ function pushDiagnostic(context, diagnostic) {
926
925
  sourceId: context.sourceId
927
926
  });
928
927
  }
929
-
930
928
  //#endregion
931
929
  export { parsePslDocument as t };
932
- //# sourceMappingURL=parser-D3Wqx9uF.mjs.map
930
+
931
+ //# sourceMappingURL=parser-1DZHweIq.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-1DZHweIq.mjs","names":[],"sources":["../src/parser.ts"],"sourcesContent":["import type {\n ParsePslDocumentInput,\n ParsePslDocumentResult,\n PslAttribute,\n PslAttributeArgument,\n PslAttributeTarget,\n PslCompositeType,\n PslDiagnostic,\n PslDiagnosticCode,\n PslDocumentAst,\n PslEnum,\n PslEnumValue,\n PslField,\n PslFieldAttribute,\n PslModel,\n PslModelAttribute,\n PslNamedTypeDeclaration,\n PslPosition,\n PslSpan,\n PslTypeConstructorCall,\n PslTypesBlock,\n} from '@prisma-next/framework-components/psl-ast';\nimport { ifDefined } from '@prisma-next/utils/defined';\n\nconst SCALAR_TYPES = new Set([\n 'String',\n 'Boolean',\n 'Int',\n 'BigInt',\n 'Float',\n 'Decimal',\n 'DateTime',\n 'Json',\n 'Bytes',\n]);\n\ninterface BlockBounds {\n readonly startLine: number;\n readonly endLine: number;\n readonly closed: boolean;\n}\n\ninterface ParserContext {\n readonly schema: string;\n readonly sourceId: string;\n readonly lines: readonly string[];\n readonly lineOffsets: readonly number[];\n readonly diagnostics: PslDiagnostic[];\n}\n\nexport function parsePslDocument(input: ParsePslDocumentInput): ParsePslDocumentResult {\n const normalizedSchema = input.schema.replaceAll('\\r\\n', '\\n');\n const lines = normalizedSchema.split('\\n');\n const lineOffsets = computeLineOffsets(normalizedSchema);\n const diagnostics: PslDiagnostic[] = [];\n const context: ParserContext = {\n schema: normalizedSchema,\n sourceId: input.sourceId,\n lines,\n lineOffsets,\n diagnostics,\n };\n\n const models: PslModel[] = [];\n const enums: PslEnum[] = [];\n const compositeTypes: PslCompositeType[] = [];\n let typesBlock: PslTypesBlock | undefined;\n\n let lineIndex = 0;\n while (lineIndex < lines.length) {\n const rawLine = lines[lineIndex] ?? '';\n const line = stripInlineComment(rawLine).trim();\n if (line.length === 0) {\n lineIndex += 1;\n continue;\n }\n\n const modelMatch = line.match(/^model\\s+([A-Za-z_]\\w*)\\s*\\{$/);\n if (modelMatch) {\n const bounds = findBlockBounds(context, lineIndex);\n const name = modelMatch[1] ?? '';\n if (name.length === 0) {\n lineIndex = bounds.endLine + 1;\n continue;\n }\n models.push(parseModelBlock(context, name, bounds));\n lineIndex = bounds.endLine + 1;\n continue;\n }\n\n const enumMatch = line.match(/^enum\\s+([A-Za-z_]\\w*)\\s*\\{$/);\n if (enumMatch) {\n const bounds = findBlockBounds(context, lineIndex);\n const name = enumMatch[1] ?? '';\n if (name.length === 0) {\n lineIndex = bounds.endLine + 1;\n continue;\n }\n enums.push(parseEnumBlock(context, name, bounds));\n lineIndex = bounds.endLine + 1;\n continue;\n }\n\n const compositeTypeMatch = line.match(/^type\\s+([A-Za-z_]\\w*)\\s*\\{$/);\n if (compositeTypeMatch) {\n const bounds = findBlockBounds(context, lineIndex);\n const name = compositeTypeMatch[1] ?? '';\n if (name.length === 0) {\n lineIndex = bounds.endLine + 1;\n continue;\n }\n compositeTypes.push(parseCompositeTypeBlock(context, name, bounds));\n lineIndex = bounds.endLine + 1;\n continue;\n }\n\n if (/^types\\s*\\{$/.test(line)) {\n const bounds = findBlockBounds(context, lineIndex);\n typesBlock = parseTypesBlock(context, bounds);\n lineIndex = bounds.endLine + 1;\n continue;\n }\n\n if (line.includes('{')) {\n const blockName = line.split(/\\s+/)[0] ?? 'block';\n pushDiagnostic(context, {\n code: 'PSL_UNSUPPORTED_TOP_LEVEL_BLOCK',\n message: `Unsupported top-level block \"${blockName}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n const bounds = findBlockBounds(context, lineIndex);\n lineIndex = bounds.endLine + 1;\n continue;\n }\n\n pushDiagnostic(context, {\n code: 'PSL_UNSUPPORTED_TOP_LEVEL_BLOCK',\n message: `Unsupported top-level declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n lineIndex += 1;\n }\n\n const namedTypeNames = new Set(\n (typesBlock?.declarations ?? []).map((declaration) => declaration.name),\n );\n const modelNames = new Set(models.map((model) => model.name));\n const enumNames = new Set(enums.map((enumBlock) => enumBlock.name));\n const compositeTypeNames = new Set(compositeTypes.map((ct) => ct.name));\n for (const declaration of typesBlock?.declarations ?? []) {\n if (SCALAR_TYPES.has(declaration.name)) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_TYPES_MEMBER',\n message: `Named type \"${declaration.name}\" conflicts with scalar type \"${declaration.name}\"`,\n span: declaration.span,\n });\n continue;\n }\n if (modelNames.has(declaration.name)) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_TYPES_MEMBER',\n message: `Named type \"${declaration.name}\" conflicts with model name \"${declaration.name}\"`,\n span: declaration.span,\n });\n continue;\n }\n if (enumNames.has(declaration.name)) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_TYPES_MEMBER',\n message: `Named type \"${declaration.name}\" conflicts with enum name \"${declaration.name}\"`,\n span: declaration.span,\n });\n }\n }\n const normalizedModels = models.map((model) => ({\n ...model,\n fields: model.fields.map((field) => {\n if (!namedTypeNames.has(field.typeName)) {\n return field;\n }\n const hasRelationAttribute = field.attributes.some(\n (attribute) => attribute.name === 'relation',\n );\n if (\n hasRelationAttribute ||\n modelNames.has(field.typeName) ||\n enumNames.has(field.typeName) ||\n compositeTypeNames.has(field.typeName) ||\n SCALAR_TYPES.has(field.typeName)\n ) {\n return field;\n }\n return {\n ...field,\n typeRef: field.typeName,\n };\n }),\n }));\n\n const ast: PslDocumentAst = {\n kind: 'document',\n sourceId: input.sourceId,\n models: normalizedModels,\n enums,\n compositeTypes,\n ...ifDefined('types', typesBlock),\n span: {\n start: createPosition(context, 0, 0),\n end: createPosition(\n context,\n Math.max(lines.length - 1, 0),\n (lines[Math.max(lines.length - 1, 0)] ?? '').length,\n ),\n },\n };\n\n return {\n ast,\n diagnostics,\n ok: diagnostics.length === 0,\n };\n}\n\nfunction parseModelBlock(context: ParserContext, name: string, bounds: BlockBounds): PslModel {\n const fields: PslField[] = [];\n const attributes: PslModelAttribute[] = [];\n\n for (let lineIndex = bounds.startLine + 1; lineIndex < bounds.endLine; lineIndex += 1) {\n const raw = context.lines[lineIndex] ?? '';\n const line = stripInlineComment(raw).trim();\n if (line.length === 0) {\n continue;\n }\n\n if (line.startsWith('@@')) {\n const attribute = parseModelAttribute(context, line, lineIndex);\n if (attribute) {\n attributes.push(attribute);\n }\n continue;\n }\n\n const field = parseField(context, line, lineIndex);\n if (field) {\n fields.push(field);\n }\n }\n\n return {\n kind: 'model',\n name,\n fields,\n attributes,\n span: createLineRangeSpan(context, bounds.startLine, bounds.endLine),\n };\n}\n\nfunction parseCompositeTypeBlock(\n context: ParserContext,\n name: string,\n bounds: BlockBounds,\n): PslCompositeType {\n const fields: PslField[] = [];\n const attributes: PslAttribute[] = [];\n\n for (let lineIndex = bounds.startLine + 1; lineIndex < bounds.endLine; lineIndex += 1) {\n const raw = context.lines[lineIndex] ?? '';\n const line = stripInlineComment(raw).trim();\n if (line.length === 0) {\n continue;\n }\n\n if (line.startsWith('@@')) {\n const attribute = parseModelAttribute(context, line, lineIndex);\n if (attribute) {\n attributes.push(attribute);\n }\n continue;\n }\n\n const field = parseField(context, line, lineIndex);\n if (field) {\n fields.push(field);\n }\n }\n\n return {\n kind: 'compositeType',\n name,\n fields,\n attributes,\n span: createLineRangeSpan(context, bounds.startLine, bounds.endLine),\n };\n}\n\nfunction parseEnumBlock(context: ParserContext, name: string, bounds: BlockBounds): PslEnum {\n const values: PslEnumValue[] = [];\n const attributes: PslAttribute[] = [];\n\n for (let lineIndex = bounds.startLine + 1; lineIndex < bounds.endLine; lineIndex += 1) {\n const raw = context.lines[lineIndex] ?? '';\n const line = stripInlineComment(raw).trim();\n if (line.length === 0) {\n continue;\n }\n\n if (line.startsWith('@@')) {\n const attribute = parseEnumAttribute(context, line, lineIndex);\n if (attribute) {\n attributes.push(attribute);\n }\n continue;\n }\n\n // An enum member line is the bare member identifier, optionally followed\n // by a `@map(\"storage-label\")` attribute. The map attribute lets the\n // printer round-trip enum values whose original storage label is not a\n // valid PSL identifier (e.g. PostgreSQL enum labels with hyphens).\n const valueMatch = line.match(/^([A-Za-z_]\\w*)(?:\\s+@map\\(\\s*\"((?:[^\"\\\\]|\\\\.)*)\"\\s*\\))?$/);\n if (!valueMatch) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ENUM_MEMBER',\n message: `Invalid enum value declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n continue;\n }\n\n const mapName = valueMatch[2] !== undefined ? unescapePslString(valueMatch[2]) : undefined;\n\n values.push({\n kind: 'enumValue',\n name: valueMatch[1] ?? '',\n ...(mapName !== undefined ? { mapName } : {}),\n span: createTrimmedLineSpan(context, lineIndex),\n });\n }\n\n return {\n kind: 'enum',\n name,\n values,\n attributes,\n span: createLineRangeSpan(context, bounds.startLine, bounds.endLine),\n };\n}\n\n/**\n * Decode PSL escape sequences (`\\\\`, `\\\"`, `\\'`, `\\n`, `\\r`) inside a\n * quoted-literal body. The argument is the body of the literal with the\n * surrounding quotes already stripped by the caller. Mirrors the inverse\n * helper in `@prisma-next/psl-printer`'s `escapePslString` so a string\n * round-trips parser → printer → parser unchanged.\n */\nfunction unescapePslString(value: string): string {\n let result = '';\n for (let i = 0; i < value.length; i++) {\n const ch = value.charCodeAt(i);\n if (ch !== 0x5c /* '\\\\' */ || i + 1 >= value.length) {\n result += value[i];\n continue;\n }\n const next = value[i + 1];\n if (next === '\\\\' || next === '\"' || next === \"'\") {\n result += next;\n } else if (next === 'n') {\n result += '\\n';\n } else if (next === 'r') {\n result += '\\r';\n } else {\n result += '\\\\';\n result += next;\n }\n i++;\n }\n return result;\n}\n\nfunction parseTypesBlock(context: ParserContext, bounds: BlockBounds): PslTypesBlock {\n const declarations: PslNamedTypeDeclaration[] = [];\n\n for (let lineIndex = bounds.startLine + 1; lineIndex < bounds.endLine; lineIndex += 1) {\n const raw = context.lines[lineIndex] ?? '';\n const lineWithoutComment = stripInlineComment(raw);\n const line = lineWithoutComment.trim();\n if (line.length === 0) {\n continue;\n }\n\n const declarationMatch = line.match(/^([A-Za-z_]\\w*)\\s*=\\s*(.+)$/);\n if (!declarationMatch) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_TYPES_MEMBER',\n message: `Invalid types declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n continue;\n }\n\n const declarationName = declarationMatch[1] ?? '';\n const trimmedStartColumn = firstNonWhitespaceColumn(raw);\n const declarationValue = (declarationMatch[2] ?? '').trim();\n const valueOffset = line.indexOf(declarationValue);\n const declarationValueColumn = trimmedStartColumn + Math.max(valueOffset, 0);\n\n const typeAndAttributeSplit = splitTypeAndAttributes(declarationValue);\n const typeSource = typeAndAttributeSplit.typeSource.trim();\n const attributeSource = typeAndAttributeSplit.attributeSource.trimStart();\n const leadingAttributeWhitespace =\n typeAndAttributeSplit.attributeSource.length - attributeSource.length;\n\n const typeConstructor = parseTypeConstructorCall(context, {\n declarationValue: typeSource,\n lineIndex,\n startColumn: declarationValueColumn,\n invalidCode: 'PSL_INVALID_TYPES_MEMBER',\n invalidMessage: (value) => `Invalid types declaration \"${value}\"`,\n });\n if (typeConstructor === 'malformed') {\n continue;\n }\n\n const attributeParse = extractAttributeTokensWithSpans(\n context,\n lineIndex,\n attributeSource,\n declarationValueColumn + typeAndAttributeSplit.attributeOffset + leadingAttributeWhitespace,\n );\n if (!attributeParse.ok) {\n continue;\n }\n const attributes = attributeParse.tokens\n .map((token) =>\n parseAttributeToken(context, {\n token: token.text,\n target: 'namedType',\n lineIndex,\n span: token.span,\n }),\n )\n .filter((attribute): attribute is PslAttribute => Boolean(attribute));\n\n if (typeConstructor) {\n declarations.push({\n kind: 'namedType',\n name: declarationName,\n typeConstructor,\n attributes,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n continue;\n }\n\n const baseTypeMatch = typeSource.match(/^([A-Za-z_]\\w*)$/);\n if (!baseTypeMatch) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_TYPES_MEMBER',\n message: `Invalid types declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n continue;\n }\n\n const baseType = baseTypeMatch[1] ?? '';\n\n declarations.push({\n kind: 'namedType',\n name: declarationName,\n baseType,\n attributes,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n }\n\n return {\n kind: 'types',\n declarations,\n span: createLineRangeSpan(context, bounds.startLine, bounds.endLine),\n };\n}\n\nfunction parseTypeConstructorCall(\n context: ParserContext,\n input: {\n readonly declarationValue: string;\n readonly lineIndex: number;\n readonly startColumn: number;\n readonly invalidCode: PslDiagnosticCode;\n readonly invalidMessage: (value: string) => string;\n },\n): PslTypeConstructorCall | 'malformed' | undefined {\n const value = input.declarationValue.trim();\n const constructorMatch = value.match(\n /^([A-Za-z_][A-Za-z0-9_-]*(?:\\.[A-Za-z_][A-Za-z0-9_-]*)*)\\s*\\(/,\n );\n if (!constructorMatch) {\n return undefined;\n }\n\n // constructorMatch already required `(`; openParen is guaranteed ≥ 0.\n const openParen = value.indexOf('(');\n const closeParen = value.lastIndexOf(')');\n\n if (closeParen !== value.length - 1) {\n pushDiagnostic(context, {\n code: input.invalidCode,\n message: input.invalidMessage(value),\n span: createInlineSpan(\n context,\n input.lineIndex,\n input.startColumn,\n input.startColumn + value.length,\n ),\n });\n return 'malformed';\n }\n\n const constructorPath = constructorMatch[1] ?? '';\n\n const argsRaw = value.slice(openParen + 1, closeParen);\n const args = parseArgumentList(context, {\n argsRaw,\n argsOffset: input.startColumn + openParen + 1,\n lineIndex: input.lineIndex,\n token: value,\n span: createInlineSpan(\n context,\n input.lineIndex,\n input.startColumn,\n input.startColumn + value.length,\n ),\n invalidCode: input.invalidCode,\n invalidEmptyArgumentMessage: `Invalid empty argument in type constructor \"${value}\"`,\n invalidNamedArgumentMessage: (part) =>\n `Invalid named argument syntax \"${part}\" in type constructor \"${value}\"`,\n });\n if (!args) {\n return 'malformed';\n }\n\n return {\n kind: 'typeConstructor',\n path: constructorPath.split('.'),\n args,\n span: createInlineSpan(\n context,\n input.lineIndex,\n input.startColumn,\n input.startColumn + value.length,\n ),\n };\n}\n\nfunction parseModelAttribute(\n context: ParserContext,\n line: string,\n lineIndex: number,\n): PslModelAttribute | undefined {\n const rawLine = context.lines[lineIndex] ?? '';\n const tokenParse = extractAttributeTokensWithSpans(\n context,\n lineIndex,\n line,\n firstNonWhitespaceColumn(rawLine),\n );\n if (!tokenParse.ok || tokenParse.tokens.length !== 1) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Invalid model attribute syntax \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n return undefined;\n }\n const token = tokenParse.tokens[0];\n if (!token) {\n return undefined;\n }\n return parseAttributeToken(context, {\n token: token.text,\n target: 'model',\n lineIndex,\n span: token.span,\n });\n}\n\nfunction parseEnumAttribute(\n context: ParserContext,\n line: string,\n lineIndex: number,\n): PslAttribute | undefined {\n const rawLine = context.lines[lineIndex] ?? '';\n const tokenParse = extractAttributeTokensWithSpans(\n context,\n lineIndex,\n line,\n firstNonWhitespaceColumn(rawLine),\n );\n if (!tokenParse.ok || tokenParse.tokens.length !== 1) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ENUM_MEMBER',\n message: `Invalid enum value declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n return undefined;\n }\n const token = tokenParse.tokens[0];\n if (!token) {\n return undefined;\n }\n const parsed = parseAttributeToken(context, {\n token: token.text,\n target: 'enum',\n lineIndex,\n span: token.span,\n });\n if (!parsed) {\n return undefined;\n }\n if (parsed.name !== 'map') {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ENUM_MEMBER',\n message: `Invalid enum value declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n return undefined;\n }\n return parsed;\n}\n\nfunction parseField(context: ParserContext, line: string, lineIndex: number): PslField | undefined {\n const fieldMatch = line.match(/^([A-Za-z_]\\w*)(\\s+)(.+)$/);\n if (!fieldMatch) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_MODEL_MEMBER',\n message: `Invalid model member declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n return undefined;\n }\n\n const fieldName = fieldMatch[1] ?? '';\n const separator = fieldMatch[2] ?? '';\n const remainder = fieldMatch[3] ?? '';\n const typeAndAttributeSplit = splitTypeAndAttributes(remainder);\n const rawTypeSource = typeAndAttributeSplit.typeSource.trim();\n const attributePart = typeAndAttributeSplit.attributeSource;\n const optional = rawTypeSource.endsWith('?');\n const typeSourceWithoutOptional = optional ? rawTypeSource.slice(0, -1).trimEnd() : rawTypeSource;\n const list = typeSourceWithoutOptional.endsWith('[]');\n const baseTypeSource = list\n ? typeSourceWithoutOptional.slice(0, -2).trimEnd()\n : typeSourceWithoutOptional;\n const rawLine = context.lines[lineIndex] ?? '';\n const trimmedStartColumn = firstNonWhitespaceColumn(rawLine);\n const typeStartColumn = trimmedStartColumn + fieldName.length + separator.length;\n\n const typeConstructor = parseTypeConstructorCall(context, {\n declarationValue: baseTypeSource,\n lineIndex,\n startColumn: typeStartColumn,\n invalidCode: 'PSL_INVALID_MODEL_MEMBER',\n invalidMessage: (value) => `Invalid field type constructor \"${value}\"`,\n });\n if (typeConstructor === 'malformed') {\n return undefined;\n }\n\n const simpleTypeMatch = baseTypeSource.match(/^([A-Za-z_]\\w*)$/);\n const typeName = typeConstructor?.path.join('.') ?? simpleTypeMatch?.[1];\n if (!typeName) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_MODEL_MEMBER',\n message: `Invalid model member declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n return undefined;\n }\n\n const attributes: PslFieldAttribute[] = [];\n const attributeSource = attributePart.trimStart();\n const leadingAttributeWhitespace = attributePart.length - attributeSource.length;\n const tokenParse = extractAttributeTokensWithSpans(\n context,\n lineIndex,\n attributeSource,\n trimmedStartColumn +\n fieldName.length +\n separator.length +\n typeAndAttributeSplit.attributeOffset +\n leadingAttributeWhitespace,\n );\n if (!tokenParse.ok) {\n return {\n kind: 'field',\n name: fieldName,\n typeName,\n ...ifDefined('typeConstructor', typeConstructor),\n optional,\n list,\n attributes,\n span: createTrimmedLineSpan(context, lineIndex),\n };\n }\n\n for (const token of tokenParse.tokens) {\n const parsed = parseAttributeToken(context, {\n token: token.text,\n target: 'field',\n lineIndex,\n span: token.span,\n });\n if (parsed) {\n attributes.push(parsed);\n }\n }\n\n return {\n kind: 'field',\n name: fieldName,\n typeName,\n ...ifDefined('typeConstructor', typeConstructor),\n optional,\n list,\n attributes,\n span: createTrimmedLineSpan(context, lineIndex),\n };\n}\n\nfunction isQuoteEscaped(value: string, quoteIndex: number): boolean {\n let backslashCount = 0;\n\n for (let index = quoteIndex - 1; index >= 0 && value[index] === '\\\\'; index -= 1) {\n backslashCount += 1;\n }\n\n return backslashCount % 2 === 1;\n}\n\nfunction splitTypeAndAttributes(value: string): {\n readonly typeSource: string;\n readonly attributeSource: string;\n readonly attributeOffset: number;\n} {\n let depthParen = 0;\n let depthBracket = 0;\n let depthBrace = 0;\n let quote: '\"' | \"'\" | null = null;\n\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index] ?? '';\n if (quote) {\n if (character === quote && !isQuoteEscaped(value, index)) {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n if (character === '(') {\n depthParen += 1;\n continue;\n }\n if (character === ')') {\n depthParen = Math.max(0, depthParen - 1);\n continue;\n }\n if (character === '[') {\n depthBracket += 1;\n continue;\n }\n if (character === ']') {\n depthBracket = Math.max(0, depthBracket - 1);\n continue;\n }\n if (character === '{') {\n depthBrace += 1;\n continue;\n }\n if (character === '}') {\n depthBrace = Math.max(0, depthBrace - 1);\n continue;\n }\n\n if (character === '@' && depthParen === 0 && depthBracket === 0 && depthBrace === 0) {\n return {\n typeSource: value.slice(0, index).trimEnd(),\n attributeSource: value.slice(index),\n attributeOffset: index,\n };\n }\n }\n\n return {\n typeSource: value.trimEnd(),\n attributeSource: '',\n attributeOffset: value.length,\n };\n}\n\nfunction parseAttributeToken(\n context: ParserContext,\n input: {\n readonly token: string;\n readonly target: PslAttributeTarget;\n readonly lineIndex: number;\n readonly span: PslSpan;\n },\n): PslAttribute | undefined {\n const expectsBlockPrefix = input.target === 'model' || input.target === 'enum';\n const targetLabel = input.target === 'enum' ? 'Enum' : 'Model';\n if (expectsBlockPrefix && !input.token.startsWith('@@')) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `${targetLabel} attribute \"${input.token}\" must use @@ prefix`,\n span: input.span,\n });\n return undefined;\n }\n if (!expectsBlockPrefix && !input.token.startsWith('@')) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Attribute \"${input.token}\" must use @ prefix`,\n span: input.span,\n });\n return undefined;\n }\n if (!expectsBlockPrefix && input.token.startsWith('@@')) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Attribute \"${input.token}\" is not valid in ${input.target} context`,\n span: input.span,\n });\n return undefined;\n }\n\n const rawBody = expectsBlockPrefix ? input.token.slice(2) : input.token.slice(1);\n const openParen = rawBody.indexOf('(');\n const closeParen = rawBody.lastIndexOf(')');\n const hasArgs = openParen >= 0 || closeParen >= 0;\n if ((openParen >= 0 && closeParen === -1) || (openParen === -1 && closeParen >= 0)) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Invalid attribute syntax \"${input.token}\"`,\n span: input.span,\n });\n return undefined;\n }\n\n const name = (openParen >= 0 ? rawBody.slice(0, openParen) : rawBody).trim();\n if (!/^[A-Za-z_][A-Za-z0-9_-]*(\\.[A-Za-z_][A-Za-z0-9_-]*)*$/.test(name)) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Invalid attribute name \"${name || input.token}\"`,\n span: input.span,\n });\n return undefined;\n }\n\n let args: readonly PslAttributeArgument[] = [];\n if (hasArgs && openParen >= 0 && closeParen >= openParen) {\n if (closeParen !== rawBody.length - 1) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Invalid trailing syntax in attribute \"${input.token}\"`,\n span: input.span,\n });\n return undefined;\n }\n const argsRaw = rawBody.slice(openParen + 1, closeParen);\n const parsedArgs = parseArgumentList(context, {\n argsRaw,\n argsOffset: input.span.start.column - 1 + (expectsBlockPrefix ? 2 : 1) + openParen + 1,\n lineIndex: input.lineIndex,\n token: input.token,\n span: input.span,\n invalidCode: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n invalidEmptyArgumentMessage: `Invalid empty argument in attribute \"${input.token}\"`,\n invalidNamedArgumentMessage: (part) => `Invalid named argument syntax \"${part}\"`,\n });\n if (!parsedArgs) {\n return undefined;\n }\n args = parsedArgs;\n }\n\n return {\n kind: 'attribute',\n target: input.target,\n name,\n args,\n span: input.span,\n };\n}\n\nfunction parseArgumentList(\n context: ParserContext,\n input: {\n readonly argsRaw: string;\n readonly argsOffset: number;\n readonly lineIndex: number;\n readonly token: string;\n readonly span: PslSpan;\n readonly invalidCode: PslDiagnosticCode;\n readonly invalidEmptyArgumentMessage: string;\n readonly invalidNamedArgumentMessage: (part: string) => string;\n },\n): readonly PslAttributeArgument[] | undefined {\n const trimmed = input.argsRaw.trim();\n if (trimmed.length === 0) {\n return [];\n }\n\n const parts = splitTopLevelSegments(input.argsRaw, ',');\n const args: PslAttributeArgument[] = [];\n\n for (const part of parts) {\n const original = part.value;\n const trimmedPart = original.trim();\n if (trimmedPart.length === 0) {\n pushDiagnostic(context, {\n code: input.invalidCode,\n message: input.invalidEmptyArgumentMessage,\n span: input.span,\n });\n return undefined;\n }\n\n const leadingWhitespace = original.length - original.trimStart().length;\n const partStart = input.argsOffset + part.start + leadingWhitespace;\n const partEnd = partStart + trimmedPart.length;\n const partSpan = createInlineSpan(context, input.lineIndex, partStart, partEnd);\n\n const namedSplit = splitTopLevelSegments(trimmedPart, ':');\n if (namedSplit.length > 1) {\n const first = namedSplit[0];\n if (!first) {\n pushDiagnostic(context, {\n code: input.invalidCode,\n message: input.invalidNamedArgumentMessage(trimmedPart),\n span: partSpan,\n });\n return undefined;\n }\n const name = first.value.trim();\n const rawValue = trimmedPart.slice(first.end + 1).trim();\n if (!name || rawValue.length === 0) {\n pushDiagnostic(context, {\n code: input.invalidCode,\n message: input.invalidNamedArgumentMessage(trimmedPart),\n span: partSpan,\n });\n return undefined;\n }\n args.push({\n kind: 'named',\n name,\n value: normalizeAttributeArgumentValue(rawValue),\n span: partSpan,\n });\n continue;\n }\n\n args.push({\n kind: 'positional',\n value: normalizeAttributeArgumentValue(trimmedPart),\n span: partSpan,\n });\n }\n\n return args;\n}\n\nfunction normalizeAttributeArgumentValue(value: string): string {\n return value.trim();\n}\n\nfunction findBlockBounds(context: ParserContext, startLine: number): BlockBounds {\n let depth = 0;\n\n for (let lineIndex = startLine; lineIndex < context.lines.length; lineIndex += 1) {\n const line = stripInlineComment(context.lines[lineIndex] ?? '');\n let quote: '\"' | \"'\" | null = null;\n for (let index = 0; index < line.length; index += 1) {\n const character = line[index] ?? '';\n if (quote) {\n if (character === quote && !isQuoteEscaped(line, index)) {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (character === '{') {\n depth += 1;\n }\n if (character === '}') {\n depth -= 1;\n if (depth === 0) {\n return { startLine, endLine: lineIndex, closed: true };\n }\n }\n }\n }\n\n pushDiagnostic(context, {\n code: 'PSL_UNTERMINATED_BLOCK',\n message: 'Unterminated block declaration',\n span: createTrimmedLineSpan(context, startLine),\n });\n return {\n startLine,\n endLine: context.lines.length - 1,\n closed: false,\n };\n}\n\ninterface TopLevelSegment {\n readonly value: string;\n readonly start: number;\n readonly end: number;\n}\n\nfunction splitTopLevelSegments(value: string, separator: ',' | ':'): TopLevelSegment[] {\n const parts: TopLevelSegment[] = [];\n let depthParen = 0;\n let depthBracket = 0;\n let depthBrace = 0;\n let quote: '\"' | \"'\" | null = null;\n let start = 0;\n\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index] ?? '';\n if (quote) {\n if (character === quote && !isQuoteEscaped(value, index)) {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (character === '(') {\n depthParen += 1;\n continue;\n }\n if (character === ')') {\n depthParen = Math.max(0, depthParen - 1);\n continue;\n }\n if (character === '[') {\n depthBracket += 1;\n continue;\n }\n if (character === ']') {\n depthBracket = Math.max(0, depthBracket - 1);\n continue;\n }\n if (character === '{') {\n depthBrace += 1;\n continue;\n }\n if (character === '}') {\n depthBrace = Math.max(0, depthBrace - 1);\n continue;\n }\n\n if (character === separator && depthParen === 0 && depthBracket === 0 && depthBrace === 0) {\n parts.push({\n value: value.slice(start, index),\n start,\n end: index,\n });\n start = index + 1;\n }\n }\n\n parts.push({\n value: value.slice(start),\n start,\n end: value.length,\n });\n return parts;\n}\n\nfunction extractAttributeTokensWithSpans(\n context: ParserContext,\n lineIndex: number,\n value: string,\n startColumn: number,\n): { readonly ok: boolean; readonly tokens: readonly { text: string; span: PslSpan }[] } {\n const tokens: { text: string; span: PslSpan }[] = [];\n let index = 0;\n while (index < value.length) {\n while (index < value.length && /\\s/.test(value[index] ?? '')) {\n index += 1;\n }\n if (index >= value.length) {\n break;\n }\n\n if (value[index] !== '@') {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Invalid attribute syntax \"${value.trim()}\"`,\n span: createInlineSpan(context, lineIndex, startColumn + index, startColumn + value.length),\n });\n return { ok: false, tokens };\n }\n\n const start = index;\n index += 1;\n if (value[index] === '@') {\n index += 1;\n }\n\n const nameStart = index;\n while (index < value.length && /[A-Za-z0-9_.-]/.test(value[index] ?? '')) {\n index += 1;\n }\n\n if (index === nameStart) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Invalid attribute syntax \"${value.slice(start).trim()}\"`,\n span: createInlineSpan(context, lineIndex, startColumn + start, startColumn + value.length),\n });\n return { ok: false, tokens };\n }\n\n if (value[index] === '(') {\n let depth = 0;\n let quote: '\"' | \"'\" | null = null;\n while (index < value.length) {\n const char = value[index] ?? '';\n if (quote) {\n if (char === quote && !isQuoteEscaped(value, index)) {\n quote = null;\n }\n index += 1;\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n quote = char;\n index += 1;\n continue;\n }\n\n if (char === '(') {\n depth += 1;\n } else if (char === ')') {\n depth -= 1;\n if (depth === 0) {\n index += 1;\n break;\n }\n }\n index += 1;\n }\n if (depth !== 0) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Unterminated attribute argument list in \"${value.slice(start).trim()}\"`,\n span: createInlineSpan(\n context,\n lineIndex,\n startColumn + start,\n startColumn + value.length,\n ),\n });\n return { ok: false, tokens };\n }\n }\n\n const tokenText = value.slice(start, index).trim();\n tokens.push({\n text: tokenText,\n span: createInlineSpan(context, lineIndex, startColumn + start, startColumn + index),\n });\n\n while (index < value.length && /\\s/.test(value[index] ?? '')) {\n index += 1;\n }\n\n if (index < value.length && value[index] !== '@') {\n break;\n }\n }\n\n if (index < value.length && value[index] !== '@') {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Invalid attribute syntax \"${value.trim()}\"`,\n span: createInlineSpan(context, lineIndex, startColumn + index, startColumn + value.length),\n });\n return { ok: false, tokens };\n }\n\n return { ok: true, tokens };\n}\n\nfunction stripInlineComment(line: string): string {\n let quote: '\"' | \"'\" | null = null;\n for (let index = 0; index < line.length - 1; index += 1) {\n const current = line[index] ?? '';\n const next = line[index + 1] ?? '';\n\n if (quote) {\n if (current === quote && !isQuoteEscaped(line, index)) {\n quote = null;\n }\n continue;\n }\n\n if (current === '\"' || current === \"'\") {\n quote = current;\n continue;\n }\n\n if (current === '/' && next === '/') {\n return line.slice(0, index);\n }\n }\n\n return line;\n}\n\nfunction computeLineOffsets(schema: string): number[] {\n const offsets = [0];\n for (let index = 0; index < schema.length; index += 1) {\n if (schema[index] === '\\n') {\n offsets.push(index + 1);\n }\n }\n return offsets;\n}\n\nfunction firstNonWhitespaceColumn(line: string): number {\n const first = line.search(/\\S/);\n return first === -1 ? 0 : first;\n}\n\nfunction createInlineSpan(\n context: ParserContext,\n lineIndex: number,\n startColumn: number,\n endColumn: number,\n): PslSpan {\n return {\n start: createPosition(context, lineIndex, startColumn),\n end: createPosition(context, lineIndex, endColumn),\n };\n}\n\nfunction createTrimmedLineSpan(context: ParserContext, lineIndex: number): PslSpan {\n const line = context.lines[lineIndex] ?? '';\n const startColumn = firstNonWhitespaceColumn(line);\n return {\n start: createPosition(context, lineIndex, startColumn),\n end: createPosition(context, lineIndex, line.length),\n };\n}\n\nfunction createLineRangeSpan(context: ParserContext, startLine: number, endLine: number): PslSpan {\n const startLineText = context.lines[startLine] ?? '';\n const endLineText = context.lines[endLine] ?? '';\n const startColumn = firstNonWhitespaceColumn(startLineText);\n return {\n start: createPosition(context, startLine, startColumn),\n end: createPosition(context, endLine, endLineText.length),\n };\n}\n\nfunction createPosition(\n context: ParserContext,\n lineIndex: number,\n columnIndex: number,\n): PslPosition {\n const clampedLineIndex = Math.max(0, Math.min(lineIndex, context.lineOffsets.length - 1));\n const lineText = context.lines[clampedLineIndex] ?? '';\n const clampedColumnIndex = Math.max(0, Math.min(columnIndex, lineText.length));\n return {\n offset: (context.lineOffsets[clampedLineIndex] ?? 0) + clampedColumnIndex,\n line: clampedLineIndex + 1,\n column: clampedColumnIndex + 1,\n };\n}\n\nfunction pushDiagnostic(\n context: ParserContext,\n diagnostic: Omit<PslDiagnostic, 'sourceId'> & { readonly code: PslDiagnosticCode },\n): void {\n context.diagnostics.push({\n ...diagnostic,\n sourceId: context.sourceId,\n });\n}\n"],"mappings":"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"}
@@ -4,4 +4,4 @@ import { ParsePslDocumentInput, ParsePslDocumentResult } from "@prisma-next/fram
4
4
  declare function parsePslDocument(input: ParsePslDocumentInput): ParsePslDocumentResult;
5
5
  //#endregion
6
6
  export { parsePslDocument as t };
7
- //# sourceMappingURL=parser-CvQgL2C_.d.mts.map
7
+ //# sourceMappingURL=parser-Bjdnhl7C.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser-Bjdnhl7C.d.mts","names":[],"sources":["../src/parser.ts"],"mappings":";;;iBAkDgB,gBAAA,CAAiB,KAAA,EAAO,qBAAA,GAAwB,sBAAA"}
package/dist/parser.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { t as parsePslDocument } from "./parser-CvQgL2C_.mjs";
1
+ import { t as parsePslDocument } from "./parser-Bjdnhl7C.mjs";
2
2
  export { parsePslDocument };
package/dist/parser.mjs CHANGED
@@ -1,3 +1,2 @@
1
- import { t as parsePslDocument } from "./parser-D3Wqx9uF.mjs";
2
-
3
- export { parsePslDocument };
1
+ import { t as parsePslDocument } from "./parser-1DZHweIq.mjs";
2
+ export { parsePslDocument };
@@ -1 +1 @@
1
- {"version":3,"file":"tokenizer.d.mts","names":[],"sources":["../src/tokenizer.ts"],"sourcesContent":[],"mappings":";KAAY,SAAA;AAAA,UAuBK,KAAA,CAvBI;EAuBJ,SAAK,IAAA,EACL,SAAA;EAIJ,SAAA,IAAS,EAAA,MAAA;;cAAT,SAAA;;;UAWH;yBAQU"}
1
+ {"version":3,"file":"tokenizer.d.mts","names":[],"sources":["../src/tokenizer.ts"],"mappings":";KAAY,SAAA;AAAA,UAuBK,KAAA;EAAA,SACN,IAAA,EAAM,SAAA;EAAA,SACN,IAAA;AAAA;AAAA,cAGE,SAAA;EAAA;cAKC,MAAA;EAMZ,IAAA,CAAA,GAAQ,KAAA;EAQR,IAAA,CAAK,MAAA,YAAa,KAAA;AAAA"}
@@ -21,9 +21,9 @@ var Tokenizer = class {
21
21
  const token = this.#buffer[offset];
22
22
  if (token) return token;
23
23
  while (this.#buffer.length <= offset) {
24
- const token$1 = this.#scanNext();
25
- if (token$1.kind === "Eof") return token$1;
26
- this.#buffer.push(token$1);
24
+ const token = this.#scanNext();
25
+ if (token.kind === "Eof") return token;
26
+ this.#buffer.push(token);
27
27
  }
28
28
  return this.#buffer[offset];
29
29
  }
@@ -185,7 +185,7 @@ const PUNCTUATION = {
185
185
  ",": "Comma",
186
186
  ":": "Colon"
187
187
  };
188
-
189
188
  //#endregion
190
189
  export { Tokenizer };
190
+
191
191
  //# sourceMappingURL=tokenizer.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"tokenizer.mjs","names":["#source","#buffer","#pos","#scanNext","token","PUNCTUATION: Record<string, TokenKind>"],"sources":["../src/tokenizer.ts"],"sourcesContent":["export type TokenKind =\n | 'Ident'\n | 'StringLiteral'\n | 'NumberLiteral'\n | 'At'\n | 'DoubleAt'\n | 'LBrace'\n | 'RBrace'\n | 'LParen'\n | 'RParen'\n | 'LBracket'\n | 'RBracket'\n | 'Equals'\n | 'Question'\n | 'Dot'\n | 'Comma'\n | 'Colon'\n | 'Whitespace'\n | 'Newline'\n | 'Comment'\n | 'Invalid'\n | 'Eof';\n\nexport interface Token {\n readonly kind: TokenKind;\n readonly text: string;\n}\n\nexport class Tokenizer {\n readonly #source: string;\n #pos: number;\n readonly #buffer: Token[];\n\n constructor(source: string) {\n this.#source = source;\n this.#pos = 0;\n this.#buffer = [];\n }\n\n next(): Token {\n const next = this.#buffer.shift();\n if (next) {\n return next;\n }\n return this.#scanNext();\n }\n\n peek(offset = 0): Token {\n if (offset > this.#buffer.length) {\n const last = this.#buffer.at(-1);\n if (last?.kind === 'Eof') {\n return last;\n }\n }\n\n const token = this.#buffer[offset];\n if (token) {\n return token;\n }\n\n while (this.#buffer.length <= offset) {\n const token = this.#scanNext();\n if (token.kind === 'Eof') {\n return token;\n }\n this.#buffer.push(token);\n }\n\n return this.#buffer[offset] as Token;\n }\n\n #scanNext(): Token {\n const token = scan(this.#source, this.#pos);\n this.#pos += token.text.length;\n return token;\n }\n}\n\nfunction scan(source: string, pos: number): Token {\n if (pos >= source.length) {\n return { kind: 'Eof', text: '' };\n }\n\n return (\n scanNewline(source, pos) ??\n scanWhitespace(source, pos) ??\n scanComment(source, pos) ??\n scanAt(source, pos) ??\n scanIdent(source, pos) ??\n scanNumber(source, pos) ??\n scanString(source, pos) ??\n scanPunctuation(source, pos) ?? {\n kind: 'Invalid' as const,\n text: readChar(source, pos),\n }\n );\n}\n\nfunction scanNewline(source: string, pos: number): Token | undefined {\n const ch = source.charAt(pos);\n if (ch !== '\\r' && ch !== '\\n') return undefined;\n if (ch === '\\r' && source.charAt(pos + 1) === '\\n') {\n return { kind: 'Newline', text: '\\r\\n' };\n }\n return { kind: 'Newline', text: ch };\n}\n\nfunction scanWhitespace(source: string, pos: number): Token | undefined {\n const ch = source.charAt(pos);\n if (ch !== ' ' && ch !== '\\t') return undefined;\n let end = pos + 1;\n while (end < source.length) {\n const c = source.charAt(end);\n if (c !== ' ' && c !== '\\t') break;\n end++;\n }\n return { kind: 'Whitespace', text: source.slice(pos, end) };\n}\n\nfunction scanComment(source: string, pos: number): Token | undefined {\n if (source.charAt(pos) !== '/' || source.charAt(pos + 1) !== '/') return undefined;\n let end = pos + 2;\n while (end < source.length) {\n const c = source.charAt(end);\n if (c === '\\n' || c === '\\r') break;\n end++;\n }\n return { kind: 'Comment', text: source.slice(pos, end) };\n}\n\nfunction scanAt(source: string, pos: number): Token | undefined {\n if (source.charAt(pos) !== '@') return undefined;\n if (source.charAt(pos + 1) === '@') {\n return { kind: 'DoubleAt', text: '@@' };\n }\n return { kind: 'At', text: '@' };\n}\n\nfunction scanIdent(source: string, pos: number): Token | undefined {\n const ch = readChar(source, pos);\n if (!isIdentStart(ch)) return undefined;\n let end = pos + ch.length;\n while (end < source.length) {\n const c = readChar(source, end);\n if (isIdentPart(c)) {\n end += c.length;\n } else {\n break;\n }\n }\n return { kind: 'Ident', text: source.slice(pos, end) };\n}\n\nfunction scanNumber(source: string, pos: number): Token | undefined {\n let end = pos;\n if (source.charAt(end) === '-') {\n if (end + 1 >= source.length || !isDigit(source.charAt(end + 1))) return undefined;\n end++;\n } else if (!isDigit(source.charAt(end))) {\n return undefined;\n }\n end++;\n while (end < source.length && isDigit(source.charAt(end))) {\n end++;\n }\n if (source.charAt(end) === '.' && end + 1 < source.length && isDigit(source.charAt(end + 1))) {\n end++; // consume the dot\n while (end < source.length && isDigit(source.charAt(end))) {\n end++;\n }\n }\n return { kind: 'NumberLiteral', text: source.slice(pos, end) };\n}\n\nfunction scanString(source: string, pos: number): Token | undefined {\n if (source.charAt(pos) !== '\"') return undefined;\n let end = pos + 1;\n while (end < source.length) {\n const c = source.charAt(end);\n if (c === '\\\\' && end + 1 < source.length) {\n end += 2; // skip escape sequence\n continue;\n }\n if (c === '\"') {\n end++; // include closing quote\n return { kind: 'StringLiteral', text: source.slice(pos, end) };\n }\n if (c === '\\n' || c === '\\r') {\n // Unterminated: stop before newline\n return { kind: 'StringLiteral', text: source.slice(pos, end) };\n }\n end++;\n }\n // Unterminated at EOF\n return { kind: 'StringLiteral', text: source.slice(pos, end) };\n}\n\nfunction scanPunctuation(source: string, pos: number): Token | undefined {\n const kind = PUNCTUATION[source.charAt(pos)];\n if (kind === undefined) return undefined;\n return { kind, text: source.charAt(pos) };\n}\n\nfunction readChar(source: string, pos: number): string {\n const cp = source.codePointAt(pos);\n return cp !== undefined ? String.fromCodePoint(cp) : '';\n}\n\nfunction isIdentStart(ch: string): boolean {\n return /\\p{L}/u.test(ch) || ch === '_';\n}\n\nfunction isIdentPart(ch: string): boolean {\n return isIdentStart(ch) || isDigit(ch) || ch === '-';\n}\n\nfunction isDigit(ch: string): boolean {\n return ch >= '0' && ch <= '9';\n}\n\nconst PUNCTUATION: Record<string, TokenKind> = {\n '{': 'LBrace',\n '}': 'RBrace',\n '(': 'LParen',\n ')': 'RParen',\n '[': 'LBracket',\n ']': 'RBracket',\n '=': 'Equals',\n '?': 'Question',\n '.': 'Dot',\n ',': 'Comma',\n ':': 'Colon',\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"tokenizer.mjs","names":["#source","#buffer","#pos","#scanNext"],"sources":["../src/tokenizer.ts"],"sourcesContent":["export type TokenKind =\n | 'Ident'\n | 'StringLiteral'\n | 'NumberLiteral'\n | 'At'\n | 'DoubleAt'\n | 'LBrace'\n | 'RBrace'\n | 'LParen'\n | 'RParen'\n | 'LBracket'\n | 'RBracket'\n | 'Equals'\n | 'Question'\n | 'Dot'\n | 'Comma'\n | 'Colon'\n | 'Whitespace'\n | 'Newline'\n | 'Comment'\n | 'Invalid'\n | 'Eof';\n\nexport interface Token {\n readonly kind: TokenKind;\n readonly text: string;\n}\n\nexport class Tokenizer {\n readonly #source: string;\n #pos: number;\n readonly #buffer: Token[];\n\n constructor(source: string) {\n this.#source = source;\n this.#pos = 0;\n this.#buffer = [];\n }\n\n next(): Token {\n const next = this.#buffer.shift();\n if (next) {\n return next;\n }\n return this.#scanNext();\n }\n\n peek(offset = 0): Token {\n if (offset > this.#buffer.length) {\n const last = this.#buffer.at(-1);\n if (last?.kind === 'Eof') {\n return last;\n }\n }\n\n const token = this.#buffer[offset];\n if (token) {\n return token;\n }\n\n while (this.#buffer.length <= offset) {\n const token = this.#scanNext();\n if (token.kind === 'Eof') {\n return token;\n }\n this.#buffer.push(token);\n }\n\n return this.#buffer[offset] as Token;\n }\n\n #scanNext(): Token {\n const token = scan(this.#source, this.#pos);\n this.#pos += token.text.length;\n return token;\n }\n}\n\nfunction scan(source: string, pos: number): Token {\n if (pos >= source.length) {\n return { kind: 'Eof', text: '' };\n }\n\n return (\n scanNewline(source, pos) ??\n scanWhitespace(source, pos) ??\n scanComment(source, pos) ??\n scanAt(source, pos) ??\n scanIdent(source, pos) ??\n scanNumber(source, pos) ??\n scanString(source, pos) ??\n scanPunctuation(source, pos) ?? {\n kind: 'Invalid' as const,\n text: readChar(source, pos),\n }\n );\n}\n\nfunction scanNewline(source: string, pos: number): Token | undefined {\n const ch = source.charAt(pos);\n if (ch !== '\\r' && ch !== '\\n') return undefined;\n if (ch === '\\r' && source.charAt(pos + 1) === '\\n') {\n return { kind: 'Newline', text: '\\r\\n' };\n }\n return { kind: 'Newline', text: ch };\n}\n\nfunction scanWhitespace(source: string, pos: number): Token | undefined {\n const ch = source.charAt(pos);\n if (ch !== ' ' && ch !== '\\t') return undefined;\n let end = pos + 1;\n while (end < source.length) {\n const c = source.charAt(end);\n if (c !== ' ' && c !== '\\t') break;\n end++;\n }\n return { kind: 'Whitespace', text: source.slice(pos, end) };\n}\n\nfunction scanComment(source: string, pos: number): Token | undefined {\n if (source.charAt(pos) !== '/' || source.charAt(pos + 1) !== '/') return undefined;\n let end = pos + 2;\n while (end < source.length) {\n const c = source.charAt(end);\n if (c === '\\n' || c === '\\r') break;\n end++;\n }\n return { kind: 'Comment', text: source.slice(pos, end) };\n}\n\nfunction scanAt(source: string, pos: number): Token | undefined {\n if (source.charAt(pos) !== '@') return undefined;\n if (source.charAt(pos + 1) === '@') {\n return { kind: 'DoubleAt', text: '@@' };\n }\n return { kind: 'At', text: '@' };\n}\n\nfunction scanIdent(source: string, pos: number): Token | undefined {\n const ch = readChar(source, pos);\n if (!isIdentStart(ch)) return undefined;\n let end = pos + ch.length;\n while (end < source.length) {\n const c = readChar(source, end);\n if (isIdentPart(c)) {\n end += c.length;\n } else {\n break;\n }\n }\n return { kind: 'Ident', text: source.slice(pos, end) };\n}\n\nfunction scanNumber(source: string, pos: number): Token | undefined {\n let end = pos;\n if (source.charAt(end) === '-') {\n if (end + 1 >= source.length || !isDigit(source.charAt(end + 1))) return undefined;\n end++;\n } else if (!isDigit(source.charAt(end))) {\n return undefined;\n }\n end++;\n while (end < source.length && isDigit(source.charAt(end))) {\n end++;\n }\n if (source.charAt(end) === '.' && end + 1 < source.length && isDigit(source.charAt(end + 1))) {\n end++; // consume the dot\n while (end < source.length && isDigit(source.charAt(end))) {\n end++;\n }\n }\n return { kind: 'NumberLiteral', text: source.slice(pos, end) };\n}\n\nfunction scanString(source: string, pos: number): Token | undefined {\n if (source.charAt(pos) !== '\"') return undefined;\n let end = pos + 1;\n while (end < source.length) {\n const c = source.charAt(end);\n if (c === '\\\\' && end + 1 < source.length) {\n end += 2; // skip escape sequence\n continue;\n }\n if (c === '\"') {\n end++; // include closing quote\n return { kind: 'StringLiteral', text: source.slice(pos, end) };\n }\n if (c === '\\n' || c === '\\r') {\n // Unterminated: stop before newline\n return { kind: 'StringLiteral', text: source.slice(pos, end) };\n }\n end++;\n }\n // Unterminated at EOF\n return { kind: 'StringLiteral', text: source.slice(pos, end) };\n}\n\nfunction scanPunctuation(source: string, pos: number): Token | undefined {\n const kind = PUNCTUATION[source.charAt(pos)];\n if (kind === undefined) return undefined;\n return { kind, text: source.charAt(pos) };\n}\n\nfunction readChar(source: string, pos: number): string {\n const cp = source.codePointAt(pos);\n return cp !== undefined ? String.fromCodePoint(cp) : '';\n}\n\nfunction isIdentStart(ch: string): boolean {\n return /\\p{L}/u.test(ch) || ch === '_';\n}\n\nfunction isIdentPart(ch: string): boolean {\n return isIdentStart(ch) || isDigit(ch) || ch === '-';\n}\n\nfunction isDigit(ch: string): boolean {\n return ch >= '0' && ch <= '9';\n}\n\nconst PUNCTUATION: Record<string, TokenKind> = {\n '{': 'LBrace',\n '}': 'RBrace',\n '(': 'LParen',\n ')': 'RParen',\n '[': 'LBracket',\n ']': 'RBracket',\n '=': 'Equals',\n '?': 'Question',\n '.': 'Dot',\n ',': 'Comma',\n ':': 'Colon',\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@prisma-next/psl-parser",
3
- "version": "0.5.0-dev.66",
3
+ "version": "0.5.0-dev.68",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "description": "Reusable parser for Prisma Schema Language (PSL)",
8
8
  "dependencies": {
9
- "@prisma-next/utils": "0.5.0-dev.66",
10
- "@prisma-next/framework-components": "0.5.0-dev.66"
9
+ "@prisma-next/framework-components": "0.5.0-dev.68",
10
+ "@prisma-next/utils": "0.5.0-dev.68"
11
11
  },
12
12
  "devDependencies": {
13
- "tsdown": "0.18.4",
13
+ "tsdown": "0.22.0",
14
14
  "typescript": "5.9.3",
15
- "vitest": "4.0.17",
16
- "@prisma-next/tsconfig": "0.0.0",
17
- "@prisma-next/tsdown": "0.0.0"
15
+ "vitest": "4.1.5",
16
+ "@prisma-next/tsdown": "0.0.0",
17
+ "@prisma-next/tsconfig": "0.0.0"
18
18
  },
19
19
  "files": [
20
20
  "dist",
@@ -1 +0,0 @@
1
- {"version":3,"file":"parser-CvQgL2C_.d.mts","names":[],"sources":["../src/parser.ts"],"sourcesContent":[],"mappings":";;;iBAkDgB,gBAAA,QAAwB,wBAAwB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"parser-D3Wqx9uF.mjs","names":["diagnostics: PslDiagnostic[]","context: ParserContext","models: PslModel[]","enums: PslEnum[]","compositeTypes: PslCompositeType[]","typesBlock: PslTypesBlock | undefined","fields: PslField[]","attributes: PslModelAttribute[]","attributes: PslAttribute[]","values: PslEnumValue[]","declarations: PslNamedTypeDeclaration[]","attributes: PslFieldAttribute[]","quote: '\"' | \"'\" | null","args: readonly PslAttributeArgument[]","args: PslAttributeArgument[]","parts: TopLevelSegment[]","tokens: { text: string; span: PslSpan }[]"],"sources":["../src/parser.ts"],"sourcesContent":["import type {\n ParsePslDocumentInput,\n ParsePslDocumentResult,\n PslAttribute,\n PslAttributeArgument,\n PslAttributeTarget,\n PslCompositeType,\n PslDiagnostic,\n PslDiagnosticCode,\n PslDocumentAst,\n PslEnum,\n PslEnumValue,\n PslField,\n PslFieldAttribute,\n PslModel,\n PslModelAttribute,\n PslNamedTypeDeclaration,\n PslPosition,\n PslSpan,\n PslTypeConstructorCall,\n PslTypesBlock,\n} from '@prisma-next/framework-components/psl-ast';\nimport { ifDefined } from '@prisma-next/utils/defined';\n\nconst SCALAR_TYPES = new Set([\n 'String',\n 'Boolean',\n 'Int',\n 'BigInt',\n 'Float',\n 'Decimal',\n 'DateTime',\n 'Json',\n 'Bytes',\n]);\n\ninterface BlockBounds {\n readonly startLine: number;\n readonly endLine: number;\n readonly closed: boolean;\n}\n\ninterface ParserContext {\n readonly schema: string;\n readonly sourceId: string;\n readonly lines: readonly string[];\n readonly lineOffsets: readonly number[];\n readonly diagnostics: PslDiagnostic[];\n}\n\nexport function parsePslDocument(input: ParsePslDocumentInput): ParsePslDocumentResult {\n const normalizedSchema = input.schema.replaceAll('\\r\\n', '\\n');\n const lines = normalizedSchema.split('\\n');\n const lineOffsets = computeLineOffsets(normalizedSchema);\n const diagnostics: PslDiagnostic[] = [];\n const context: ParserContext = {\n schema: normalizedSchema,\n sourceId: input.sourceId,\n lines,\n lineOffsets,\n diagnostics,\n };\n\n const models: PslModel[] = [];\n const enums: PslEnum[] = [];\n const compositeTypes: PslCompositeType[] = [];\n let typesBlock: PslTypesBlock | undefined;\n\n let lineIndex = 0;\n while (lineIndex < lines.length) {\n const rawLine = lines[lineIndex] ?? '';\n const line = stripInlineComment(rawLine).trim();\n if (line.length === 0) {\n lineIndex += 1;\n continue;\n }\n\n const modelMatch = line.match(/^model\\s+([A-Za-z_]\\w*)\\s*\\{$/);\n if (modelMatch) {\n const bounds = findBlockBounds(context, lineIndex);\n const name = modelMatch[1] ?? '';\n if (name.length === 0) {\n lineIndex = bounds.endLine + 1;\n continue;\n }\n models.push(parseModelBlock(context, name, bounds));\n lineIndex = bounds.endLine + 1;\n continue;\n }\n\n const enumMatch = line.match(/^enum\\s+([A-Za-z_]\\w*)\\s*\\{$/);\n if (enumMatch) {\n const bounds = findBlockBounds(context, lineIndex);\n const name = enumMatch[1] ?? '';\n if (name.length === 0) {\n lineIndex = bounds.endLine + 1;\n continue;\n }\n enums.push(parseEnumBlock(context, name, bounds));\n lineIndex = bounds.endLine + 1;\n continue;\n }\n\n const compositeTypeMatch = line.match(/^type\\s+([A-Za-z_]\\w*)\\s*\\{$/);\n if (compositeTypeMatch) {\n const bounds = findBlockBounds(context, lineIndex);\n const name = compositeTypeMatch[1] ?? '';\n if (name.length === 0) {\n lineIndex = bounds.endLine + 1;\n continue;\n }\n compositeTypes.push(parseCompositeTypeBlock(context, name, bounds));\n lineIndex = bounds.endLine + 1;\n continue;\n }\n\n if (/^types\\s*\\{$/.test(line)) {\n const bounds = findBlockBounds(context, lineIndex);\n typesBlock = parseTypesBlock(context, bounds);\n lineIndex = bounds.endLine + 1;\n continue;\n }\n\n if (line.includes('{')) {\n const blockName = line.split(/\\s+/)[0] ?? 'block';\n pushDiagnostic(context, {\n code: 'PSL_UNSUPPORTED_TOP_LEVEL_BLOCK',\n message: `Unsupported top-level block \"${blockName}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n const bounds = findBlockBounds(context, lineIndex);\n lineIndex = bounds.endLine + 1;\n continue;\n }\n\n pushDiagnostic(context, {\n code: 'PSL_UNSUPPORTED_TOP_LEVEL_BLOCK',\n message: `Unsupported top-level declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n lineIndex += 1;\n }\n\n const namedTypeNames = new Set(\n (typesBlock?.declarations ?? []).map((declaration) => declaration.name),\n );\n const modelNames = new Set(models.map((model) => model.name));\n const enumNames = new Set(enums.map((enumBlock) => enumBlock.name));\n const compositeTypeNames = new Set(compositeTypes.map((ct) => ct.name));\n for (const declaration of typesBlock?.declarations ?? []) {\n if (SCALAR_TYPES.has(declaration.name)) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_TYPES_MEMBER',\n message: `Named type \"${declaration.name}\" conflicts with scalar type \"${declaration.name}\"`,\n span: declaration.span,\n });\n continue;\n }\n if (modelNames.has(declaration.name)) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_TYPES_MEMBER',\n message: `Named type \"${declaration.name}\" conflicts with model name \"${declaration.name}\"`,\n span: declaration.span,\n });\n continue;\n }\n if (enumNames.has(declaration.name)) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_TYPES_MEMBER',\n message: `Named type \"${declaration.name}\" conflicts with enum name \"${declaration.name}\"`,\n span: declaration.span,\n });\n }\n }\n const normalizedModels = models.map((model) => ({\n ...model,\n fields: model.fields.map((field) => {\n if (!namedTypeNames.has(field.typeName)) {\n return field;\n }\n const hasRelationAttribute = field.attributes.some(\n (attribute) => attribute.name === 'relation',\n );\n if (\n hasRelationAttribute ||\n modelNames.has(field.typeName) ||\n enumNames.has(field.typeName) ||\n compositeTypeNames.has(field.typeName) ||\n SCALAR_TYPES.has(field.typeName)\n ) {\n return field;\n }\n return {\n ...field,\n typeRef: field.typeName,\n };\n }),\n }));\n\n const ast: PslDocumentAst = {\n kind: 'document',\n sourceId: input.sourceId,\n models: normalizedModels,\n enums,\n compositeTypes,\n ...ifDefined('types', typesBlock),\n span: {\n start: createPosition(context, 0, 0),\n end: createPosition(\n context,\n Math.max(lines.length - 1, 0),\n (lines[Math.max(lines.length - 1, 0)] ?? '').length,\n ),\n },\n };\n\n return {\n ast,\n diagnostics,\n ok: diagnostics.length === 0,\n };\n}\n\nfunction parseModelBlock(context: ParserContext, name: string, bounds: BlockBounds): PslModel {\n const fields: PslField[] = [];\n const attributes: PslModelAttribute[] = [];\n\n for (let lineIndex = bounds.startLine + 1; lineIndex < bounds.endLine; lineIndex += 1) {\n const raw = context.lines[lineIndex] ?? '';\n const line = stripInlineComment(raw).trim();\n if (line.length === 0) {\n continue;\n }\n\n if (line.startsWith('@@')) {\n const attribute = parseModelAttribute(context, line, lineIndex);\n if (attribute) {\n attributes.push(attribute);\n }\n continue;\n }\n\n const field = parseField(context, line, lineIndex);\n if (field) {\n fields.push(field);\n }\n }\n\n return {\n kind: 'model',\n name,\n fields,\n attributes,\n span: createLineRangeSpan(context, bounds.startLine, bounds.endLine),\n };\n}\n\nfunction parseCompositeTypeBlock(\n context: ParserContext,\n name: string,\n bounds: BlockBounds,\n): PslCompositeType {\n const fields: PslField[] = [];\n const attributes: PslAttribute[] = [];\n\n for (let lineIndex = bounds.startLine + 1; lineIndex < bounds.endLine; lineIndex += 1) {\n const raw = context.lines[lineIndex] ?? '';\n const line = stripInlineComment(raw).trim();\n if (line.length === 0) {\n continue;\n }\n\n if (line.startsWith('@@')) {\n const attribute = parseModelAttribute(context, line, lineIndex);\n if (attribute) {\n attributes.push(attribute);\n }\n continue;\n }\n\n const field = parseField(context, line, lineIndex);\n if (field) {\n fields.push(field);\n }\n }\n\n return {\n kind: 'compositeType',\n name,\n fields,\n attributes,\n span: createLineRangeSpan(context, bounds.startLine, bounds.endLine),\n };\n}\n\nfunction parseEnumBlock(context: ParserContext, name: string, bounds: BlockBounds): PslEnum {\n const values: PslEnumValue[] = [];\n const attributes: PslAttribute[] = [];\n\n for (let lineIndex = bounds.startLine + 1; lineIndex < bounds.endLine; lineIndex += 1) {\n const raw = context.lines[lineIndex] ?? '';\n const line = stripInlineComment(raw).trim();\n if (line.length === 0) {\n continue;\n }\n\n if (line.startsWith('@@')) {\n const attribute = parseEnumAttribute(context, line, lineIndex);\n if (attribute) {\n attributes.push(attribute);\n }\n continue;\n }\n\n // An enum member line is the bare member identifier, optionally followed\n // by a `@map(\"storage-label\")` attribute. The map attribute lets the\n // printer round-trip enum values whose original storage label is not a\n // valid PSL identifier (e.g. PostgreSQL enum labels with hyphens).\n const valueMatch = line.match(/^([A-Za-z_]\\w*)(?:\\s+@map\\(\\s*\"((?:[^\"\\\\]|\\\\.)*)\"\\s*\\))?$/);\n if (!valueMatch) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ENUM_MEMBER',\n message: `Invalid enum value declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n continue;\n }\n\n const mapName = valueMatch[2] !== undefined ? unescapePslString(valueMatch[2]) : undefined;\n\n values.push({\n kind: 'enumValue',\n name: valueMatch[1] ?? '',\n ...(mapName !== undefined ? { mapName } : {}),\n span: createTrimmedLineSpan(context, lineIndex),\n });\n }\n\n return {\n kind: 'enum',\n name,\n values,\n attributes,\n span: createLineRangeSpan(context, bounds.startLine, bounds.endLine),\n };\n}\n\n/**\n * Decode PSL escape sequences (`\\\\`, `\\\"`, `\\'`, `\\n`, `\\r`) inside a\n * quoted-literal body. The argument is the body of the literal with the\n * surrounding quotes already stripped by the caller. Mirrors the inverse\n * helper in `@prisma-next/psl-printer`'s `escapePslString` so a string\n * round-trips parser → printer → parser unchanged.\n */\nfunction unescapePslString(value: string): string {\n let result = '';\n for (let i = 0; i < value.length; i++) {\n const ch = value.charCodeAt(i);\n if (ch !== 0x5c /* '\\\\' */ || i + 1 >= value.length) {\n result += value[i];\n continue;\n }\n const next = value[i + 1];\n if (next === '\\\\' || next === '\"' || next === \"'\") {\n result += next;\n } else if (next === 'n') {\n result += '\\n';\n } else if (next === 'r') {\n result += '\\r';\n } else {\n result += '\\\\';\n result += next;\n }\n i++;\n }\n return result;\n}\n\nfunction parseTypesBlock(context: ParserContext, bounds: BlockBounds): PslTypesBlock {\n const declarations: PslNamedTypeDeclaration[] = [];\n\n for (let lineIndex = bounds.startLine + 1; lineIndex < bounds.endLine; lineIndex += 1) {\n const raw = context.lines[lineIndex] ?? '';\n const lineWithoutComment = stripInlineComment(raw);\n const line = lineWithoutComment.trim();\n if (line.length === 0) {\n continue;\n }\n\n const declarationMatch = line.match(/^([A-Za-z_]\\w*)\\s*=\\s*(.+)$/);\n if (!declarationMatch) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_TYPES_MEMBER',\n message: `Invalid types declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n continue;\n }\n\n const declarationName = declarationMatch[1] ?? '';\n const trimmedStartColumn = firstNonWhitespaceColumn(raw);\n const declarationValue = (declarationMatch[2] ?? '').trim();\n const valueOffset = line.indexOf(declarationValue);\n const declarationValueColumn = trimmedStartColumn + Math.max(valueOffset, 0);\n\n const typeAndAttributeSplit = splitTypeAndAttributes(declarationValue);\n const typeSource = typeAndAttributeSplit.typeSource.trim();\n const attributeSource = typeAndAttributeSplit.attributeSource.trimStart();\n const leadingAttributeWhitespace =\n typeAndAttributeSplit.attributeSource.length - attributeSource.length;\n\n const typeConstructor = parseTypeConstructorCall(context, {\n declarationValue: typeSource,\n lineIndex,\n startColumn: declarationValueColumn,\n invalidCode: 'PSL_INVALID_TYPES_MEMBER',\n invalidMessage: (value) => `Invalid types declaration \"${value}\"`,\n });\n if (typeConstructor === 'malformed') {\n continue;\n }\n\n const attributeParse = extractAttributeTokensWithSpans(\n context,\n lineIndex,\n attributeSource,\n declarationValueColumn + typeAndAttributeSplit.attributeOffset + leadingAttributeWhitespace,\n );\n if (!attributeParse.ok) {\n continue;\n }\n const attributes = attributeParse.tokens\n .map((token) =>\n parseAttributeToken(context, {\n token: token.text,\n target: 'namedType',\n lineIndex,\n span: token.span,\n }),\n )\n .filter((attribute): attribute is PslAttribute => Boolean(attribute));\n\n if (typeConstructor) {\n declarations.push({\n kind: 'namedType',\n name: declarationName,\n typeConstructor,\n attributes,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n continue;\n }\n\n const baseTypeMatch = typeSource.match(/^([A-Za-z_]\\w*)$/);\n if (!baseTypeMatch) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_TYPES_MEMBER',\n message: `Invalid types declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n continue;\n }\n\n const baseType = baseTypeMatch[1] ?? '';\n\n declarations.push({\n kind: 'namedType',\n name: declarationName,\n baseType,\n attributes,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n }\n\n return {\n kind: 'types',\n declarations,\n span: createLineRangeSpan(context, bounds.startLine, bounds.endLine),\n };\n}\n\nfunction parseTypeConstructorCall(\n context: ParserContext,\n input: {\n readonly declarationValue: string;\n readonly lineIndex: number;\n readonly startColumn: number;\n readonly invalidCode: PslDiagnosticCode;\n readonly invalidMessage: (value: string) => string;\n },\n): PslTypeConstructorCall | 'malformed' | undefined {\n const value = input.declarationValue.trim();\n const constructorMatch = value.match(\n /^([A-Za-z_][A-Za-z0-9_-]*(?:\\.[A-Za-z_][A-Za-z0-9_-]*)*)\\s*\\(/,\n );\n if (!constructorMatch) {\n return undefined;\n }\n\n // constructorMatch already required `(`; openParen is guaranteed ≥ 0.\n const openParen = value.indexOf('(');\n const closeParen = value.lastIndexOf(')');\n\n if (closeParen !== value.length - 1) {\n pushDiagnostic(context, {\n code: input.invalidCode,\n message: input.invalidMessage(value),\n span: createInlineSpan(\n context,\n input.lineIndex,\n input.startColumn,\n input.startColumn + value.length,\n ),\n });\n return 'malformed';\n }\n\n const constructorPath = constructorMatch[1] ?? '';\n\n const argsRaw = value.slice(openParen + 1, closeParen);\n const args = parseArgumentList(context, {\n argsRaw,\n argsOffset: input.startColumn + openParen + 1,\n lineIndex: input.lineIndex,\n token: value,\n span: createInlineSpan(\n context,\n input.lineIndex,\n input.startColumn,\n input.startColumn + value.length,\n ),\n invalidCode: input.invalidCode,\n invalidEmptyArgumentMessage: `Invalid empty argument in type constructor \"${value}\"`,\n invalidNamedArgumentMessage: (part) =>\n `Invalid named argument syntax \"${part}\" in type constructor \"${value}\"`,\n });\n if (!args) {\n return 'malformed';\n }\n\n return {\n kind: 'typeConstructor',\n path: constructorPath.split('.'),\n args,\n span: createInlineSpan(\n context,\n input.lineIndex,\n input.startColumn,\n input.startColumn + value.length,\n ),\n };\n}\n\nfunction parseModelAttribute(\n context: ParserContext,\n line: string,\n lineIndex: number,\n): PslModelAttribute | undefined {\n const rawLine = context.lines[lineIndex] ?? '';\n const tokenParse = extractAttributeTokensWithSpans(\n context,\n lineIndex,\n line,\n firstNonWhitespaceColumn(rawLine),\n );\n if (!tokenParse.ok || tokenParse.tokens.length !== 1) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Invalid model attribute syntax \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n return undefined;\n }\n const token = tokenParse.tokens[0];\n if (!token) {\n return undefined;\n }\n return parseAttributeToken(context, {\n token: token.text,\n target: 'model',\n lineIndex,\n span: token.span,\n });\n}\n\nfunction parseEnumAttribute(\n context: ParserContext,\n line: string,\n lineIndex: number,\n): PslAttribute | undefined {\n const rawLine = context.lines[lineIndex] ?? '';\n const tokenParse = extractAttributeTokensWithSpans(\n context,\n lineIndex,\n line,\n firstNonWhitespaceColumn(rawLine),\n );\n if (!tokenParse.ok || tokenParse.tokens.length !== 1) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ENUM_MEMBER',\n message: `Invalid enum value declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n return undefined;\n }\n const token = tokenParse.tokens[0];\n if (!token) {\n return undefined;\n }\n const parsed = parseAttributeToken(context, {\n token: token.text,\n target: 'enum',\n lineIndex,\n span: token.span,\n });\n if (!parsed) {\n return undefined;\n }\n if (parsed.name !== 'map') {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ENUM_MEMBER',\n message: `Invalid enum value declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n return undefined;\n }\n return parsed;\n}\n\nfunction parseField(context: ParserContext, line: string, lineIndex: number): PslField | undefined {\n const fieldMatch = line.match(/^([A-Za-z_]\\w*)(\\s+)(.+)$/);\n if (!fieldMatch) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_MODEL_MEMBER',\n message: `Invalid model member declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n return undefined;\n }\n\n const fieldName = fieldMatch[1] ?? '';\n const separator = fieldMatch[2] ?? '';\n const remainder = fieldMatch[3] ?? '';\n const typeAndAttributeSplit = splitTypeAndAttributes(remainder);\n const rawTypeSource = typeAndAttributeSplit.typeSource.trim();\n const attributePart = typeAndAttributeSplit.attributeSource;\n const optional = rawTypeSource.endsWith('?');\n const typeSourceWithoutOptional = optional ? rawTypeSource.slice(0, -1).trimEnd() : rawTypeSource;\n const list = typeSourceWithoutOptional.endsWith('[]');\n const baseTypeSource = list\n ? typeSourceWithoutOptional.slice(0, -2).trimEnd()\n : typeSourceWithoutOptional;\n const rawLine = context.lines[lineIndex] ?? '';\n const trimmedStartColumn = firstNonWhitespaceColumn(rawLine);\n const typeStartColumn = trimmedStartColumn + fieldName.length + separator.length;\n\n const typeConstructor = parseTypeConstructorCall(context, {\n declarationValue: baseTypeSource,\n lineIndex,\n startColumn: typeStartColumn,\n invalidCode: 'PSL_INVALID_MODEL_MEMBER',\n invalidMessage: (value) => `Invalid field type constructor \"${value}\"`,\n });\n if (typeConstructor === 'malformed') {\n return undefined;\n }\n\n const simpleTypeMatch = baseTypeSource.match(/^([A-Za-z_]\\w*)$/);\n const typeName = typeConstructor?.path.join('.') ?? simpleTypeMatch?.[1];\n if (!typeName) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_MODEL_MEMBER',\n message: `Invalid model member declaration \"${line}\"`,\n span: createTrimmedLineSpan(context, lineIndex),\n });\n return undefined;\n }\n\n const attributes: PslFieldAttribute[] = [];\n const attributeSource = attributePart.trimStart();\n const leadingAttributeWhitespace = attributePart.length - attributeSource.length;\n const tokenParse = extractAttributeTokensWithSpans(\n context,\n lineIndex,\n attributeSource,\n trimmedStartColumn +\n fieldName.length +\n separator.length +\n typeAndAttributeSplit.attributeOffset +\n leadingAttributeWhitespace,\n );\n if (!tokenParse.ok) {\n return {\n kind: 'field',\n name: fieldName,\n typeName,\n ...ifDefined('typeConstructor', typeConstructor),\n optional,\n list,\n attributes,\n span: createTrimmedLineSpan(context, lineIndex),\n };\n }\n\n for (const token of tokenParse.tokens) {\n const parsed = parseAttributeToken(context, {\n token: token.text,\n target: 'field',\n lineIndex,\n span: token.span,\n });\n if (parsed) {\n attributes.push(parsed);\n }\n }\n\n return {\n kind: 'field',\n name: fieldName,\n typeName,\n ...ifDefined('typeConstructor', typeConstructor),\n optional,\n list,\n attributes,\n span: createTrimmedLineSpan(context, lineIndex),\n };\n}\n\nfunction isQuoteEscaped(value: string, quoteIndex: number): boolean {\n let backslashCount = 0;\n\n for (let index = quoteIndex - 1; index >= 0 && value[index] === '\\\\'; index -= 1) {\n backslashCount += 1;\n }\n\n return backslashCount % 2 === 1;\n}\n\nfunction splitTypeAndAttributes(value: string): {\n readonly typeSource: string;\n readonly attributeSource: string;\n readonly attributeOffset: number;\n} {\n let depthParen = 0;\n let depthBracket = 0;\n let depthBrace = 0;\n let quote: '\"' | \"'\" | null = null;\n\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index] ?? '';\n if (quote) {\n if (character === quote && !isQuoteEscaped(value, index)) {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n if (character === '(') {\n depthParen += 1;\n continue;\n }\n if (character === ')') {\n depthParen = Math.max(0, depthParen - 1);\n continue;\n }\n if (character === '[') {\n depthBracket += 1;\n continue;\n }\n if (character === ']') {\n depthBracket = Math.max(0, depthBracket - 1);\n continue;\n }\n if (character === '{') {\n depthBrace += 1;\n continue;\n }\n if (character === '}') {\n depthBrace = Math.max(0, depthBrace - 1);\n continue;\n }\n\n if (character === '@' && depthParen === 0 && depthBracket === 0 && depthBrace === 0) {\n return {\n typeSource: value.slice(0, index).trimEnd(),\n attributeSource: value.slice(index),\n attributeOffset: index,\n };\n }\n }\n\n return {\n typeSource: value.trimEnd(),\n attributeSource: '',\n attributeOffset: value.length,\n };\n}\n\nfunction parseAttributeToken(\n context: ParserContext,\n input: {\n readonly token: string;\n readonly target: PslAttributeTarget;\n readonly lineIndex: number;\n readonly span: PslSpan;\n },\n): PslAttribute | undefined {\n const expectsBlockPrefix = input.target === 'model' || input.target === 'enum';\n const targetLabel = input.target === 'enum' ? 'Enum' : 'Model';\n if (expectsBlockPrefix && !input.token.startsWith('@@')) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `${targetLabel} attribute \"${input.token}\" must use @@ prefix`,\n span: input.span,\n });\n return undefined;\n }\n if (!expectsBlockPrefix && !input.token.startsWith('@')) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Attribute \"${input.token}\" must use @ prefix`,\n span: input.span,\n });\n return undefined;\n }\n if (!expectsBlockPrefix && input.token.startsWith('@@')) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Attribute \"${input.token}\" is not valid in ${input.target} context`,\n span: input.span,\n });\n return undefined;\n }\n\n const rawBody = expectsBlockPrefix ? input.token.slice(2) : input.token.slice(1);\n const openParen = rawBody.indexOf('(');\n const closeParen = rawBody.lastIndexOf(')');\n const hasArgs = openParen >= 0 || closeParen >= 0;\n if ((openParen >= 0 && closeParen === -1) || (openParen === -1 && closeParen >= 0)) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Invalid attribute syntax \"${input.token}\"`,\n span: input.span,\n });\n return undefined;\n }\n\n const name = (openParen >= 0 ? rawBody.slice(0, openParen) : rawBody).trim();\n if (!/^[A-Za-z_][A-Za-z0-9_-]*(\\.[A-Za-z_][A-Za-z0-9_-]*)*$/.test(name)) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Invalid attribute name \"${name || input.token}\"`,\n span: input.span,\n });\n return undefined;\n }\n\n let args: readonly PslAttributeArgument[] = [];\n if (hasArgs && openParen >= 0 && closeParen >= openParen) {\n if (closeParen !== rawBody.length - 1) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Invalid trailing syntax in attribute \"${input.token}\"`,\n span: input.span,\n });\n return undefined;\n }\n const argsRaw = rawBody.slice(openParen + 1, closeParen);\n const parsedArgs = parseArgumentList(context, {\n argsRaw,\n argsOffset: input.span.start.column - 1 + (expectsBlockPrefix ? 2 : 1) + openParen + 1,\n lineIndex: input.lineIndex,\n token: input.token,\n span: input.span,\n invalidCode: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n invalidEmptyArgumentMessage: `Invalid empty argument in attribute \"${input.token}\"`,\n invalidNamedArgumentMessage: (part) => `Invalid named argument syntax \"${part}\"`,\n });\n if (!parsedArgs) {\n return undefined;\n }\n args = parsedArgs;\n }\n\n return {\n kind: 'attribute',\n target: input.target,\n name,\n args,\n span: input.span,\n };\n}\n\nfunction parseArgumentList(\n context: ParserContext,\n input: {\n readonly argsRaw: string;\n readonly argsOffset: number;\n readonly lineIndex: number;\n readonly token: string;\n readonly span: PslSpan;\n readonly invalidCode: PslDiagnosticCode;\n readonly invalidEmptyArgumentMessage: string;\n readonly invalidNamedArgumentMessage: (part: string) => string;\n },\n): readonly PslAttributeArgument[] | undefined {\n const trimmed = input.argsRaw.trim();\n if (trimmed.length === 0) {\n return [];\n }\n\n const parts = splitTopLevelSegments(input.argsRaw, ',');\n const args: PslAttributeArgument[] = [];\n\n for (const part of parts) {\n const original = part.value;\n const trimmedPart = original.trim();\n if (trimmedPart.length === 0) {\n pushDiagnostic(context, {\n code: input.invalidCode,\n message: input.invalidEmptyArgumentMessage,\n span: input.span,\n });\n return undefined;\n }\n\n const leadingWhitespace = original.length - original.trimStart().length;\n const partStart = input.argsOffset + part.start + leadingWhitespace;\n const partEnd = partStart + trimmedPart.length;\n const partSpan = createInlineSpan(context, input.lineIndex, partStart, partEnd);\n\n const namedSplit = splitTopLevelSegments(trimmedPart, ':');\n if (namedSplit.length > 1) {\n const first = namedSplit[0];\n if (!first) {\n pushDiagnostic(context, {\n code: input.invalidCode,\n message: input.invalidNamedArgumentMessage(trimmedPart),\n span: partSpan,\n });\n return undefined;\n }\n const name = first.value.trim();\n const rawValue = trimmedPart.slice(first.end + 1).trim();\n if (!name || rawValue.length === 0) {\n pushDiagnostic(context, {\n code: input.invalidCode,\n message: input.invalidNamedArgumentMessage(trimmedPart),\n span: partSpan,\n });\n return undefined;\n }\n args.push({\n kind: 'named',\n name,\n value: normalizeAttributeArgumentValue(rawValue),\n span: partSpan,\n });\n continue;\n }\n\n args.push({\n kind: 'positional',\n value: normalizeAttributeArgumentValue(trimmedPart),\n span: partSpan,\n });\n }\n\n return args;\n}\n\nfunction normalizeAttributeArgumentValue(value: string): string {\n return value.trim();\n}\n\nfunction findBlockBounds(context: ParserContext, startLine: number): BlockBounds {\n let depth = 0;\n\n for (let lineIndex = startLine; lineIndex < context.lines.length; lineIndex += 1) {\n const line = stripInlineComment(context.lines[lineIndex] ?? '');\n let quote: '\"' | \"'\" | null = null;\n for (let index = 0; index < line.length; index += 1) {\n const character = line[index] ?? '';\n if (quote) {\n if (character === quote && !isQuoteEscaped(line, index)) {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (character === '{') {\n depth += 1;\n }\n if (character === '}') {\n depth -= 1;\n if (depth === 0) {\n return { startLine, endLine: lineIndex, closed: true };\n }\n }\n }\n }\n\n pushDiagnostic(context, {\n code: 'PSL_UNTERMINATED_BLOCK',\n message: 'Unterminated block declaration',\n span: createTrimmedLineSpan(context, startLine),\n });\n return {\n startLine,\n endLine: context.lines.length - 1,\n closed: false,\n };\n}\n\ninterface TopLevelSegment {\n readonly value: string;\n readonly start: number;\n readonly end: number;\n}\n\nfunction splitTopLevelSegments(value: string, separator: ',' | ':'): TopLevelSegment[] {\n const parts: TopLevelSegment[] = [];\n let depthParen = 0;\n let depthBracket = 0;\n let depthBrace = 0;\n let quote: '\"' | \"'\" | null = null;\n let start = 0;\n\n for (let index = 0; index < value.length; index += 1) {\n const character = value[index] ?? '';\n if (quote) {\n if (character === quote && !isQuoteEscaped(value, index)) {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (character === '(') {\n depthParen += 1;\n continue;\n }\n if (character === ')') {\n depthParen = Math.max(0, depthParen - 1);\n continue;\n }\n if (character === '[') {\n depthBracket += 1;\n continue;\n }\n if (character === ']') {\n depthBracket = Math.max(0, depthBracket - 1);\n continue;\n }\n if (character === '{') {\n depthBrace += 1;\n continue;\n }\n if (character === '}') {\n depthBrace = Math.max(0, depthBrace - 1);\n continue;\n }\n\n if (character === separator && depthParen === 0 && depthBracket === 0 && depthBrace === 0) {\n parts.push({\n value: value.slice(start, index),\n start,\n end: index,\n });\n start = index + 1;\n }\n }\n\n parts.push({\n value: value.slice(start),\n start,\n end: value.length,\n });\n return parts;\n}\n\nfunction extractAttributeTokensWithSpans(\n context: ParserContext,\n lineIndex: number,\n value: string,\n startColumn: number,\n): { readonly ok: boolean; readonly tokens: readonly { text: string; span: PslSpan }[] } {\n const tokens: { text: string; span: PslSpan }[] = [];\n let index = 0;\n while (index < value.length) {\n while (index < value.length && /\\s/.test(value[index] ?? '')) {\n index += 1;\n }\n if (index >= value.length) {\n break;\n }\n\n if (value[index] !== '@') {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Invalid attribute syntax \"${value.trim()}\"`,\n span: createInlineSpan(context, lineIndex, startColumn + index, startColumn + value.length),\n });\n return { ok: false, tokens };\n }\n\n const start = index;\n index += 1;\n if (value[index] === '@') {\n index += 1;\n }\n\n const nameStart = index;\n while (index < value.length && /[A-Za-z0-9_.-]/.test(value[index] ?? '')) {\n index += 1;\n }\n\n if (index === nameStart) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Invalid attribute syntax \"${value.slice(start).trim()}\"`,\n span: createInlineSpan(context, lineIndex, startColumn + start, startColumn + value.length),\n });\n return { ok: false, tokens };\n }\n\n if (value[index] === '(') {\n let depth = 0;\n let quote: '\"' | \"'\" | null = null;\n while (index < value.length) {\n const char = value[index] ?? '';\n if (quote) {\n if (char === quote && !isQuoteEscaped(value, index)) {\n quote = null;\n }\n index += 1;\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n quote = char;\n index += 1;\n continue;\n }\n\n if (char === '(') {\n depth += 1;\n } else if (char === ')') {\n depth -= 1;\n if (depth === 0) {\n index += 1;\n break;\n }\n }\n index += 1;\n }\n if (depth !== 0) {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Unterminated attribute argument list in \"${value.slice(start).trim()}\"`,\n span: createInlineSpan(\n context,\n lineIndex,\n startColumn + start,\n startColumn + value.length,\n ),\n });\n return { ok: false, tokens };\n }\n }\n\n const tokenText = value.slice(start, index).trim();\n tokens.push({\n text: tokenText,\n span: createInlineSpan(context, lineIndex, startColumn + start, startColumn + index),\n });\n\n while (index < value.length && /\\s/.test(value[index] ?? '')) {\n index += 1;\n }\n\n if (index < value.length && value[index] !== '@') {\n break;\n }\n }\n\n if (index < value.length && value[index] !== '@') {\n pushDiagnostic(context, {\n code: 'PSL_INVALID_ATTRIBUTE_SYNTAX',\n message: `Invalid attribute syntax \"${value.trim()}\"`,\n span: createInlineSpan(context, lineIndex, startColumn + index, startColumn + value.length),\n });\n return { ok: false, tokens };\n }\n\n return { ok: true, tokens };\n}\n\nfunction stripInlineComment(line: string): string {\n let quote: '\"' | \"'\" | null = null;\n for (let index = 0; index < line.length - 1; index += 1) {\n const current = line[index] ?? '';\n const next = line[index + 1] ?? '';\n\n if (quote) {\n if (current === quote && !isQuoteEscaped(line, index)) {\n quote = null;\n }\n continue;\n }\n\n if (current === '\"' || current === \"'\") {\n quote = current;\n continue;\n }\n\n if (current === '/' && next === '/') {\n return line.slice(0, index);\n }\n }\n\n return line;\n}\n\nfunction computeLineOffsets(schema: string): number[] {\n const offsets = [0];\n for (let index = 0; index < schema.length; index += 1) {\n if (schema[index] === '\\n') {\n offsets.push(index + 1);\n }\n }\n return offsets;\n}\n\nfunction firstNonWhitespaceColumn(line: string): number {\n const first = line.search(/\\S/);\n return first === -1 ? 0 : first;\n}\n\nfunction createInlineSpan(\n context: ParserContext,\n lineIndex: number,\n startColumn: number,\n endColumn: number,\n): PslSpan {\n return {\n start: createPosition(context, lineIndex, startColumn),\n end: createPosition(context, lineIndex, endColumn),\n };\n}\n\nfunction createTrimmedLineSpan(context: ParserContext, lineIndex: number): PslSpan {\n const line = context.lines[lineIndex] ?? '';\n const startColumn = firstNonWhitespaceColumn(line);\n return {\n start: createPosition(context, lineIndex, startColumn),\n end: createPosition(context, lineIndex, line.length),\n };\n}\n\nfunction createLineRangeSpan(context: ParserContext, startLine: number, endLine: number): PslSpan {\n const startLineText = context.lines[startLine] ?? '';\n const endLineText = context.lines[endLine] ?? '';\n const startColumn = firstNonWhitespaceColumn(startLineText);\n return {\n start: createPosition(context, startLine, startColumn),\n end: createPosition(context, endLine, endLineText.length),\n };\n}\n\nfunction createPosition(\n context: ParserContext,\n lineIndex: number,\n columnIndex: number,\n): PslPosition {\n const clampedLineIndex = Math.max(0, Math.min(lineIndex, context.lineOffsets.length - 1));\n const lineText = context.lines[clampedLineIndex] ?? '';\n const clampedColumnIndex = Math.max(0, Math.min(columnIndex, lineText.length));\n return {\n offset: (context.lineOffsets[clampedLineIndex] ?? 0) + clampedColumnIndex,\n line: clampedLineIndex + 1,\n column: clampedColumnIndex + 1,\n };\n}\n\nfunction pushDiagnostic(\n context: ParserContext,\n diagnostic: Omit<PslDiagnostic, 'sourceId'> & { readonly code: PslDiagnosticCode },\n): void {\n context.diagnostics.push({\n ...diagnostic,\n sourceId: context.sourceId,\n });\n}\n"],"mappings":"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"}