@coze-editor/code-language-json 0.1.0-alpha.dd871b → 0.1.0-alpha.e5f73a

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/esm/index.js CHANGED
@@ -5,8 +5,8 @@ import {
5
5
  TextDocument,
6
6
  DiagnosticSeverity
7
7
  } from "vscode-json-languageservice";
8
- import { Text } from "text-mapping";
9
8
  import { v4 as uuid } from "@lukeed/uuid";
9
+ import { Text } from "@coze-editor/utils";
10
10
  import { parse } from "@coze-editor/parser-json";
11
11
  import {
12
12
  textDocumentField
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/json.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { URI } from 'vscode-uri';\nimport {\n getLanguageService,\n TextDocument,\n type LanguageService,\n type JSONSchema,\n type CompletionList,\n type JSONDocument,\n DiagnosticSeverity,\n} from 'vscode-json-languageservice';\nimport { Text } from 'text-mapping';\nimport { v4 as uuid } from '@lukeed/uuid';\nimport { parse } from '@coze-editor/parser-json';\nimport {\n type LanguageService as ILanguageService,\n type LanguageServiceOptions,\n type Link,\n textDocumentField,\n} from '@coze-editor/code-language-shared';\nimport {\n type ChangeSpec,\n type EditorState,\n type TransactionSpec,\n} from '@codemirror/state';\n\nimport { jsonLanguage } from './json';\n\ninterface SchemasConfiguration {\n uri: string;\n fileMatch: string[];\n schema: JSONSchema;\n}\n\ninterface ValidateOptions {\n schema?: JSONSchema;\n transform?: (text: Text) => Text;\n}\n\nfunction normalizeId(id: string) {\n // remove trailing '#', normalize drive capitalization\n try {\n return URI.parse(id).toString(true);\n } catch (e) {\n return id;\n }\n}\n\nfunction isNonNull<T>(value: T | undefined): value is T {\n return Boolean(value);\n}\n\nconst urlReg = /^(https?:\\/\\/|www\\.)[\\w-\\.]+\\.[\\w-\\.]+(\\/([\\S]+)?)?$/i;\n\nclass JSONLanguageService implements ILanguageService {\n protected languageService: LanguageService;\n private schemasConfigurations: SchemasConfiguration[] = [];\n public triggerCharacters = [':', '\"', \"'\"];\n\n constructor(public options: LanguageServiceOptions) {\n this.languageService = getLanguageService({});\n this.configure();\n }\n\n private configure() {\n this.languageService.configure({\n allowComments: false,\n schemas: this.schemasConfigurations.map(e => ({\n fileMatch: e.fileMatch,\n uri: normalizeId(e.uri),\n schema: e.schema,\n })),\n });\n }\n\n private parseJSONDocument(\n textDocument: TextDocument,\n ): JSONDocument | undefined {\n const text = parse(textDocument, { collectComments: true });\n if (!text.ast) {\n return;\n }\n\n const jsonDocument = this.languageService.newJSONDocument(\n text.ast,\n text.problems,\n );\n // @ts-expect-error comments type is not exported\n jsonDocument.comments = text.commentRanges;\n return jsonDocument;\n }\n\n public async validate(source: string, options?: ValidateOptions) {\n let text = new Text(source);\n\n if (typeof options?.transform === 'function') {\n text = options.transform(text);\n }\n\n const textDocument = TextDocument.create(\n `file:///anonymous-${uuid()}.json`,\n 'json',\n 0,\n text.toString(),\n );\n const jsonDocument = this.parseJSONDocument(textDocument);\n\n if (!jsonDocument) {\n return [];\n }\n\n const diagnostics = await this.languageService.doValidation(\n textDocument,\n jsonDocument,\n {},\n options?.schema,\n );\n\n return diagnostics\n .map(e => {\n const from = textDocument.offsetAt(e.range.start);\n const to = textDocument.offsetAt(e.range.end);\n\n return {\n from,\n to,\n severity: e.severity,\n message: e.message,\n };\n })\n .map(e => {\n const oRange = text.originalRangeFor({\n from: e.from,\n to: e.to,\n });\n if (!oRange) {\n return;\n }\n return {\n ...e,\n ...oRange,\n };\n })\n .filter(isNonNull);\n }\n\n public configureSchemas(\n config: SchemasConfiguration | SchemasConfiguration[],\n ) {\n let configs: SchemasConfiguration[] = [];\n configs = configs.concat(config);\n\n configs.forEach(c => {\n const match = this.schemasConfigurations.find(e => e.uri === c.uri);\n if (match) {\n match.schema = c.schema;\n match.fileMatch = c.fileMatch;\n } else {\n this.schemasConfigurations.push(c);\n }\n });\n\n this.configure();\n }\n\n public deleteSchemas(uri: string | string[]) {\n let allURI: string[] = [];\n allURI = allURI.concat(uri);\n\n this.schemasConfigurations = this.schemasConfigurations.filter(\n c => !allURI.includes(c.uri),\n );\n\n this.configure();\n }\n\n public async doValidation(\n context: Parameters<NonNullable<ILanguageService['doValidation']>>[0],\n ) {\n const { textDocument } = context;\n const jsonDocument = this.parseJSONDocument(textDocument);\n\n if (!jsonDocument) {\n return [];\n }\n\n const diagnostics = await this.languageService.doValidation(\n textDocument,\n jsonDocument,\n );\n\n return diagnostics.map(e => {\n const from = textDocument.offsetAt(e.range.start);\n const to = textDocument.offsetAt(e.range.end);\n\n return {\n from,\n to,\n severity: 'error' as const,\n message: e.message,\n };\n });\n }\n\n async format(\n state: EditorState,\n options?: { tabSize: number },\n ): Promise<TransactionSpec> {\n const { textDocument, originalRangeFor } = state.field(textDocumentField);\n\n const edits = this.languageService.format(\n textDocument,\n // @ts-expect-error range can be undefined\n undefined,\n {\n tabSize: options?.tabSize ?? 4,\n insertSpaces: true,\n insertFinalNewline: false,\n },\n );\n\n const changes = edits\n .map(edit => {\n const range = originalRangeFor({\n from: textDocument.offsetAt(edit.range.start),\n to: textDocument.offsetAt(edit.range.end),\n });\n if (range) {\n return {\n ...range,\n insert: edit.newText,\n };\n }\n })\n .filter(v => isChangeDesc(v));\n\n return {\n changes,\n };\n }\n\n public async doComplete(\n context: Parameters<NonNullable<ILanguageService['doComplete']>>[0],\n ): Promise<CompletionList | null | undefined> {\n const { textDocument } = context;\n const { offset } = context;\n\n const { line, character } = textDocument.positionAt(offset);\n\n const jsonDocument = this.parseJSONDocument(textDocument);\n\n if (!jsonDocument) {\n return;\n }\n\n const completionResult = await this.languageService.doComplete(\n textDocument,\n {\n line,\n character,\n },\n jsonDocument,\n );\n\n if (!completionResult || !completionResult.items.length) {\n return;\n }\n\n return {\n isIncomplete: true,\n items: completionResult.items,\n };\n }\n\n async findLinks(\n context: Parameters<NonNullable<ILanguageService['findLinks']>>[0],\n ) {\n const { textDocument } = context;\n const doc = this.parseJSONDocument(textDocument);\n\n if (!doc) {\n return [];\n }\n\n const links: Link[] = [];\n\n // @ts-expect-error doc.visit is not exposed but indeed exists\n doc.visit(node => {\n if (node.type === 'string' && urlReg.test(node.value)) {\n const range = {\n from: node.offset + 1,\n to: node.offset + node.length - 1,\n };\n\n links.push({\n target: node.value,\n range,\n });\n }\n return true;\n });\n\n return links;\n }\n}\n\nfunction isChangeDesc(v: unknown): v is ChangeSpec {\n return Boolean(v);\n}\n\nconst jsonLanguageService = new JSONLanguageService({\n lintDelay: 0,\n});\n\nconst json = {\n language: jsonLanguage,\n languageService: jsonLanguageService,\n};\n\nexport { json, jsonLanguage, jsonLanguageService, JSONLanguageService };\n\nexport { DiagnosticSeverity, Text };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parser } from '@coze-editor/lezer-parser-json';\nimport {\n continuedIndent,\n indentNodeProp,\n foldNodeProp,\n foldInside,\n LRLanguage,\n} from '@codemirror/language';\n\n/// A language provider that provides JSON parsing.\nexport const jsonLanguage = LRLanguage.define({\n name: 'json',\n parser: parser.configure({\n props: [\n indentNodeProp.add({\n Object: continuedIndent({ except: /^\\s*\\}/ }),\n Array: continuedIndent({ except: /^\\s*\\]/ }),\n }),\n foldNodeProp.add({\n 'Object Array': foldInside,\n }),\n ],\n }),\n languageData: {\n closeBrackets: { brackets: ['[', '{', '\"', \"'\"] },\n\n indentOnInput: /^\\s*[\\}\\]]$/,\n },\n});\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/json.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { URI } from 'vscode-uri';\nimport {\n getLanguageService,\n TextDocument,\n type LanguageService,\n type JSONSchema,\n type CompletionList,\n type JSONDocument,\n DiagnosticSeverity,\n} from 'vscode-json-languageservice';\nimport { v4 as uuid } from '@lukeed/uuid';\nimport { Text } from '@coze-editor/utils';\nimport { parse } from '@coze-editor/parser-json';\nimport {\n type LanguageService as ILanguageService,\n type LanguageServiceOptions,\n type Link,\n textDocumentField,\n} from '@coze-editor/code-language-shared';\nimport {\n type ChangeSpec,\n type EditorState,\n type TransactionSpec,\n} from '@codemirror/state';\n\nimport { jsonLanguage } from './json';\n\ninterface SchemasConfiguration {\n uri: string;\n fileMatch: string[];\n schema: JSONSchema;\n}\n\ninterface ValidateOptions {\n schema?: JSONSchema;\n transform?: (text: Text) => Text;\n}\n\nfunction normalizeId(id: string) {\n // remove trailing '#', normalize drive capitalization\n try {\n return URI.parse(id).toString(true);\n } catch (e) {\n return id;\n }\n}\n\nfunction isNonNull<T>(value: T | undefined): value is T {\n return Boolean(value);\n}\n\nconst urlReg = /^(https?:\\/\\/|www\\.)[\\w-\\.]+\\.[\\w-\\.]+(\\/([\\S]+)?)?$/i;\n\nclass JSONLanguageService implements ILanguageService {\n protected languageService: LanguageService;\n private schemasConfigurations: SchemasConfiguration[] = [];\n public triggerCharacters = [':', '\"', \"'\"];\n\n constructor(public options: LanguageServiceOptions) {\n this.languageService = getLanguageService({});\n this.configure();\n }\n\n private configure() {\n this.languageService.configure({\n allowComments: false,\n schemas: this.schemasConfigurations.map(e => ({\n fileMatch: e.fileMatch,\n uri: normalizeId(e.uri),\n schema: e.schema,\n })),\n });\n }\n\n private parseJSONDocument(\n textDocument: TextDocument,\n ): JSONDocument | undefined {\n const text = parse(textDocument, { collectComments: true });\n if (!text.ast) {\n return;\n }\n\n const jsonDocument = this.languageService.newJSONDocument(\n text.ast,\n text.problems,\n );\n // @ts-expect-error comments type is not exported\n jsonDocument.comments = text.commentRanges;\n return jsonDocument;\n }\n\n public async validate(source: string, options?: ValidateOptions) {\n let text = new Text(source);\n\n if (typeof options?.transform === 'function') {\n text = options.transform(text);\n }\n\n const textDocument = TextDocument.create(\n `file:///anonymous-${uuid()}.json`,\n 'json',\n 0,\n text.toString(),\n );\n const jsonDocument = this.parseJSONDocument(textDocument);\n\n if (!jsonDocument) {\n return [];\n }\n\n const diagnostics = await this.languageService.doValidation(\n textDocument,\n jsonDocument,\n {},\n options?.schema,\n );\n\n return diagnostics\n .map(e => {\n const from = textDocument.offsetAt(e.range.start);\n const to = textDocument.offsetAt(e.range.end);\n\n return {\n from,\n to,\n severity: e.severity,\n message: e.message,\n };\n })\n .map(e => {\n const oRange = text.originalRangeFor({\n from: e.from,\n to: e.to,\n });\n if (!oRange) {\n return;\n }\n return {\n ...e,\n ...oRange,\n };\n })\n .filter(isNonNull);\n }\n\n public configureSchemas(\n config: SchemasConfiguration | SchemasConfiguration[],\n ) {\n let configs: SchemasConfiguration[] = [];\n configs = configs.concat(config);\n\n configs.forEach(c => {\n const match = this.schemasConfigurations.find(e => e.uri === c.uri);\n if (match) {\n match.schema = c.schema;\n match.fileMatch = c.fileMatch;\n } else {\n this.schemasConfigurations.push(c);\n }\n });\n\n this.configure();\n }\n\n public deleteSchemas(uri: string | string[]) {\n let allURI: string[] = [];\n allURI = allURI.concat(uri);\n\n this.schemasConfigurations = this.schemasConfigurations.filter(\n c => !allURI.includes(c.uri),\n );\n\n this.configure();\n }\n\n public async doValidation(\n context: Parameters<NonNullable<ILanguageService['doValidation']>>[0],\n ) {\n const { textDocument } = context;\n const jsonDocument = this.parseJSONDocument(textDocument);\n\n if (!jsonDocument) {\n return [];\n }\n\n const diagnostics = await this.languageService.doValidation(\n textDocument,\n jsonDocument,\n );\n\n return diagnostics.map(e => {\n const from = textDocument.offsetAt(e.range.start);\n const to = textDocument.offsetAt(e.range.end);\n\n return {\n from,\n to,\n severity: 'error' as const,\n message: e.message,\n };\n });\n }\n\n async format(\n state: EditorState,\n options?: { tabSize: number },\n ): Promise<TransactionSpec> {\n const { textDocument, originalRangeFor } = state.field(textDocumentField);\n\n const edits = this.languageService.format(\n textDocument,\n // @ts-expect-error range can be undefined\n undefined,\n {\n tabSize: options?.tabSize ?? 4,\n insertSpaces: true,\n insertFinalNewline: false,\n },\n );\n\n const changes = edits\n .map(edit => {\n const range = originalRangeFor({\n from: textDocument.offsetAt(edit.range.start),\n to: textDocument.offsetAt(edit.range.end),\n });\n if (range) {\n return {\n ...range,\n insert: edit.newText,\n };\n }\n })\n .filter(v => isChangeDesc(v));\n\n return {\n changes,\n };\n }\n\n public async doComplete(\n context: Parameters<NonNullable<ILanguageService['doComplete']>>[0],\n ): Promise<CompletionList | null | undefined> {\n const { textDocument } = context;\n const { offset } = context;\n\n const { line, character } = textDocument.positionAt(offset);\n\n const jsonDocument = this.parseJSONDocument(textDocument);\n\n if (!jsonDocument) {\n return;\n }\n\n const completionResult = await this.languageService.doComplete(\n textDocument,\n {\n line,\n character,\n },\n jsonDocument,\n );\n\n if (!completionResult || !completionResult.items.length) {\n return;\n }\n\n return {\n isIncomplete: true,\n items: completionResult.items,\n };\n }\n\n async findLinks(\n context: Parameters<NonNullable<ILanguageService['findLinks']>>[0],\n ) {\n const { textDocument } = context;\n const doc = this.parseJSONDocument(textDocument);\n\n if (!doc) {\n return [];\n }\n\n const links: Link[] = [];\n\n // @ts-expect-error doc.visit is not exposed but indeed exists\n doc.visit(node => {\n if (node.type === 'string' && urlReg.test(node.value)) {\n const range = {\n from: node.offset + 1,\n to: node.offset + node.length - 1,\n };\n\n links.push({\n target: node.value,\n range,\n });\n }\n return true;\n });\n\n return links;\n }\n}\n\nfunction isChangeDesc(v: unknown): v is ChangeSpec {\n return Boolean(v);\n}\n\nconst jsonLanguageService = new JSONLanguageService({\n lintDelay: 0,\n});\n\nconst json = {\n language: jsonLanguage,\n languageService: jsonLanguageService,\n};\n\nexport { json, jsonLanguage, jsonLanguageService, JSONLanguageService };\n\nexport { DiagnosticSeverity, Text };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parser } from '@coze-editor/lezer-parser-json';\nimport {\n continuedIndent,\n indentNodeProp,\n foldNodeProp,\n foldInside,\n LRLanguage,\n} from '@codemirror/language';\n\n/// A language provider that provides JSON parsing.\nexport const jsonLanguage = LRLanguage.define({\n name: 'json',\n parser: parser.configure({\n props: [\n indentNodeProp.add({\n Object: continuedIndent({ except: /^\\s*\\}/ }),\n Array: continuedIndent({ except: /^\\s*\\]/ }),\n }),\n foldNodeProp.add({\n 'Object Array': foldInside,\n }),\n ],\n }),\n languageData: {\n closeBrackets: { brackets: ['[', '{', '\"', \"'\"] },\n\n indentOnInput: /^\\s*[\\}\\]]$/,\n },\n});\n"],"mappings":"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","names":[]}
package/dist/index.d.mts CHANGED
@@ -2,8 +2,8 @@ import * as _codemirror_language from '@codemirror/language';
2
2
  import { LRLanguage } from '@codemirror/language';
3
3
  import { LanguageService as LanguageService$1, JSONSchema, DiagnosticSeverity, CompletionList } from 'vscode-json-languageservice';
4
4
  export { DiagnosticSeverity } from 'vscode-json-languageservice';
5
- import { Text } from 'text-mapping';
6
- export { Text } from 'text-mapping';
5
+ import { Text } from '@coze-editor/utils';
6
+ export { Text } from '@coze-editor/utils';
7
7
  import { LanguageService, LanguageServiceOptions, Link } from '@coze-editor/code-language-shared';
8
8
  import { EditorState, TransactionSpec } from '@codemirror/state';
9
9
 
package/dist/index.d.ts CHANGED
@@ -2,8 +2,8 @@ import * as _codemirror_language from '@codemirror/language';
2
2
  import { LRLanguage } from '@codemirror/language';
3
3
  import { LanguageService as LanguageService$1, JSONSchema, DiagnosticSeverity, CompletionList } from 'vscode-json-languageservice';
4
4
  export { DiagnosticSeverity } from 'vscode-json-languageservice';
5
- import { Text } from 'text-mapping';
6
- export { Text } from 'text-mapping';
5
+ import { Text } from '@coze-editor/utils';
6
+ export { Text } from '@coze-editor/utils';
7
7
  import { LanguageService, LanguageServiceOptions, Link } from '@coze-editor/code-language-shared';
8
8
  import { EditorState, TransactionSpec } from '@codemirror/state';
9
9
 
package/dist/index.js CHANGED
@@ -21,7 +21,7 @@ var index_exports = {};
21
21
  __export(index_exports, {
22
22
  DiagnosticSeverity: () => import_vscode_json_languageservice.DiagnosticSeverity,
23
23
  JSONLanguageService: () => JSONLanguageService,
24
- Text: () => import_text_mapping.Text,
24
+ Text: () => import_utils.Text,
25
25
  json: () => json,
26
26
  jsonLanguage: () => jsonLanguage,
27
27
  jsonLanguageService: () => jsonLanguageService
@@ -29,8 +29,8 @@ __export(index_exports, {
29
29
  module.exports = __toCommonJS(index_exports);
30
30
  var import_vscode_uri = require("vscode-uri");
31
31
  var import_vscode_json_languageservice = require("vscode-json-languageservice");
32
- var import_text_mapping = require("text-mapping");
33
32
  var import_uuid = require("@lukeed/uuid");
33
+ var import_utils = require("@coze-editor/utils");
34
34
  var import_parser_json = require("@coze-editor/parser-json");
35
35
  var import_code_language_shared = require("@coze-editor/code-language-shared");
36
36
 
@@ -100,7 +100,7 @@ var JSONLanguageService = class {
100
100
  return jsonDocument;
101
101
  }
102
102
  async validate(source, options) {
103
- let text = new import_text_mapping.Text(source);
103
+ let text = new import_utils.Text(source);
104
104
  if (typeof (options == null ? void 0 : options.transform) === "function") {
105
105
  text = options.transform(text);
106
106
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/json.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { URI } from 'vscode-uri';\nimport {\n getLanguageService,\n TextDocument,\n type LanguageService,\n type JSONSchema,\n type CompletionList,\n type JSONDocument,\n DiagnosticSeverity,\n} from 'vscode-json-languageservice';\nimport { Text } from 'text-mapping';\nimport { v4 as uuid } from '@lukeed/uuid';\nimport { parse } from '@coze-editor/parser-json';\nimport {\n type LanguageService as ILanguageService,\n type LanguageServiceOptions,\n type Link,\n textDocumentField,\n} from '@coze-editor/code-language-shared';\nimport {\n type ChangeSpec,\n type EditorState,\n type TransactionSpec,\n} from '@codemirror/state';\n\nimport { jsonLanguage } from './json';\n\ninterface SchemasConfiguration {\n uri: string;\n fileMatch: string[];\n schema: JSONSchema;\n}\n\ninterface ValidateOptions {\n schema?: JSONSchema;\n transform?: (text: Text) => Text;\n}\n\nfunction normalizeId(id: string) {\n // remove trailing '#', normalize drive capitalization\n try {\n return URI.parse(id).toString(true);\n } catch (e) {\n return id;\n }\n}\n\nfunction isNonNull<T>(value: T | undefined): value is T {\n return Boolean(value);\n}\n\nconst urlReg = /^(https?:\\/\\/|www\\.)[\\w-\\.]+\\.[\\w-\\.]+(\\/([\\S]+)?)?$/i;\n\nclass JSONLanguageService implements ILanguageService {\n protected languageService: LanguageService;\n private schemasConfigurations: SchemasConfiguration[] = [];\n public triggerCharacters = [':', '\"', \"'\"];\n\n constructor(public options: LanguageServiceOptions) {\n this.languageService = getLanguageService({});\n this.configure();\n }\n\n private configure() {\n this.languageService.configure({\n allowComments: false,\n schemas: this.schemasConfigurations.map(e => ({\n fileMatch: e.fileMatch,\n uri: normalizeId(e.uri),\n schema: e.schema,\n })),\n });\n }\n\n private parseJSONDocument(\n textDocument: TextDocument,\n ): JSONDocument | undefined {\n const text = parse(textDocument, { collectComments: true });\n if (!text.ast) {\n return;\n }\n\n const jsonDocument = this.languageService.newJSONDocument(\n text.ast,\n text.problems,\n );\n // @ts-expect-error comments type is not exported\n jsonDocument.comments = text.commentRanges;\n return jsonDocument;\n }\n\n public async validate(source: string, options?: ValidateOptions) {\n let text = new Text(source);\n\n if (typeof options?.transform === 'function') {\n text = options.transform(text);\n }\n\n const textDocument = TextDocument.create(\n `file:///anonymous-${uuid()}.json`,\n 'json',\n 0,\n text.toString(),\n );\n const jsonDocument = this.parseJSONDocument(textDocument);\n\n if (!jsonDocument) {\n return [];\n }\n\n const diagnostics = await this.languageService.doValidation(\n textDocument,\n jsonDocument,\n {},\n options?.schema,\n );\n\n return diagnostics\n .map(e => {\n const from = textDocument.offsetAt(e.range.start);\n const to = textDocument.offsetAt(e.range.end);\n\n return {\n from,\n to,\n severity: e.severity,\n message: e.message,\n };\n })\n .map(e => {\n const oRange = text.originalRangeFor({\n from: e.from,\n to: e.to,\n });\n if (!oRange) {\n return;\n }\n return {\n ...e,\n ...oRange,\n };\n })\n .filter(isNonNull);\n }\n\n public configureSchemas(\n config: SchemasConfiguration | SchemasConfiguration[],\n ) {\n let configs: SchemasConfiguration[] = [];\n configs = configs.concat(config);\n\n configs.forEach(c => {\n const match = this.schemasConfigurations.find(e => e.uri === c.uri);\n if (match) {\n match.schema = c.schema;\n match.fileMatch = c.fileMatch;\n } else {\n this.schemasConfigurations.push(c);\n }\n });\n\n this.configure();\n }\n\n public deleteSchemas(uri: string | string[]) {\n let allURI: string[] = [];\n allURI = allURI.concat(uri);\n\n this.schemasConfigurations = this.schemasConfigurations.filter(\n c => !allURI.includes(c.uri),\n );\n\n this.configure();\n }\n\n public async doValidation(\n context: Parameters<NonNullable<ILanguageService['doValidation']>>[0],\n ) {\n const { textDocument } = context;\n const jsonDocument = this.parseJSONDocument(textDocument);\n\n if (!jsonDocument) {\n return [];\n }\n\n const diagnostics = await this.languageService.doValidation(\n textDocument,\n jsonDocument,\n );\n\n return diagnostics.map(e => {\n const from = textDocument.offsetAt(e.range.start);\n const to = textDocument.offsetAt(e.range.end);\n\n return {\n from,\n to,\n severity: 'error' as const,\n message: e.message,\n };\n });\n }\n\n async format(\n state: EditorState,\n options?: { tabSize: number },\n ): Promise<TransactionSpec> {\n const { textDocument, originalRangeFor } = state.field(textDocumentField);\n\n const edits = this.languageService.format(\n textDocument,\n // @ts-expect-error range can be undefined\n undefined,\n {\n tabSize: options?.tabSize ?? 4,\n insertSpaces: true,\n insertFinalNewline: false,\n },\n );\n\n const changes = edits\n .map(edit => {\n const range = originalRangeFor({\n from: textDocument.offsetAt(edit.range.start),\n to: textDocument.offsetAt(edit.range.end),\n });\n if (range) {\n return {\n ...range,\n insert: edit.newText,\n };\n }\n })\n .filter(v => isChangeDesc(v));\n\n return {\n changes,\n };\n }\n\n public async doComplete(\n context: Parameters<NonNullable<ILanguageService['doComplete']>>[0],\n ): Promise<CompletionList | null | undefined> {\n const { textDocument } = context;\n const { offset } = context;\n\n const { line, character } = textDocument.positionAt(offset);\n\n const jsonDocument = this.parseJSONDocument(textDocument);\n\n if (!jsonDocument) {\n return;\n }\n\n const completionResult = await this.languageService.doComplete(\n textDocument,\n {\n line,\n character,\n },\n jsonDocument,\n );\n\n if (!completionResult || !completionResult.items.length) {\n return;\n }\n\n return {\n isIncomplete: true,\n items: completionResult.items,\n };\n }\n\n async findLinks(\n context: Parameters<NonNullable<ILanguageService['findLinks']>>[0],\n ) {\n const { textDocument } = context;\n const doc = this.parseJSONDocument(textDocument);\n\n if (!doc) {\n return [];\n }\n\n const links: Link[] = [];\n\n // @ts-expect-error doc.visit is not exposed but indeed exists\n doc.visit(node => {\n if (node.type === 'string' && urlReg.test(node.value)) {\n const range = {\n from: node.offset + 1,\n to: node.offset + node.length - 1,\n };\n\n links.push({\n target: node.value,\n range,\n });\n }\n return true;\n });\n\n return links;\n }\n}\n\nfunction isChangeDesc(v: unknown): v is ChangeSpec {\n return Boolean(v);\n}\n\nconst jsonLanguageService = new JSONLanguageService({\n lintDelay: 0,\n});\n\nconst json = {\n language: jsonLanguage,\n languageService: jsonLanguageService,\n};\n\nexport { json, jsonLanguage, jsonLanguageService, JSONLanguageService };\n\nexport { DiagnosticSeverity, Text };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parser } from '@coze-editor/lezer-parser-json';\nimport {\n continuedIndent,\n indentNodeProp,\n foldNodeProp,\n foldInside,\n LRLanguage,\n} from '@codemirror/language';\n\n/// A language provider that provides JSON parsing.\nexport const jsonLanguage = LRLanguage.define({\n name: 'json',\n parser: parser.configure({\n props: [\n indentNodeProp.add({\n Object: continuedIndent({ except: /^\\s*\\}/ }),\n Array: continuedIndent({ except: /^\\s*\\]/ }),\n }),\n foldNodeProp.add({\n 'Object Array': foldInside,\n }),\n ],\n }),\n languageData: {\n closeBrackets: { brackets: ['[', '{', '\"', \"'\"] },\n\n indentOnInput: /^\\s*[\\}\\]]$/,\n },\n});\n"],"mappings":"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","names":["uuid"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/json.ts"],"sourcesContent":["// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { URI } from 'vscode-uri';\nimport {\n getLanguageService,\n TextDocument,\n type LanguageService,\n type JSONSchema,\n type CompletionList,\n type JSONDocument,\n DiagnosticSeverity,\n} from 'vscode-json-languageservice';\nimport { v4 as uuid } from '@lukeed/uuid';\nimport { Text } from '@coze-editor/utils';\nimport { parse } from '@coze-editor/parser-json';\nimport {\n type LanguageService as ILanguageService,\n type LanguageServiceOptions,\n type Link,\n textDocumentField,\n} from '@coze-editor/code-language-shared';\nimport {\n type ChangeSpec,\n type EditorState,\n type TransactionSpec,\n} from '@codemirror/state';\n\nimport { jsonLanguage } from './json';\n\ninterface SchemasConfiguration {\n uri: string;\n fileMatch: string[];\n schema: JSONSchema;\n}\n\ninterface ValidateOptions {\n schema?: JSONSchema;\n transform?: (text: Text) => Text;\n}\n\nfunction normalizeId(id: string) {\n // remove trailing '#', normalize drive capitalization\n try {\n return URI.parse(id).toString(true);\n } catch (e) {\n return id;\n }\n}\n\nfunction isNonNull<T>(value: T | undefined): value is T {\n return Boolean(value);\n}\n\nconst urlReg = /^(https?:\\/\\/|www\\.)[\\w-\\.]+\\.[\\w-\\.]+(\\/([\\S]+)?)?$/i;\n\nclass JSONLanguageService implements ILanguageService {\n protected languageService: LanguageService;\n private schemasConfigurations: SchemasConfiguration[] = [];\n public triggerCharacters = [':', '\"', \"'\"];\n\n constructor(public options: LanguageServiceOptions) {\n this.languageService = getLanguageService({});\n this.configure();\n }\n\n private configure() {\n this.languageService.configure({\n allowComments: false,\n schemas: this.schemasConfigurations.map(e => ({\n fileMatch: e.fileMatch,\n uri: normalizeId(e.uri),\n schema: e.schema,\n })),\n });\n }\n\n private parseJSONDocument(\n textDocument: TextDocument,\n ): JSONDocument | undefined {\n const text = parse(textDocument, { collectComments: true });\n if (!text.ast) {\n return;\n }\n\n const jsonDocument = this.languageService.newJSONDocument(\n text.ast,\n text.problems,\n );\n // @ts-expect-error comments type is not exported\n jsonDocument.comments = text.commentRanges;\n return jsonDocument;\n }\n\n public async validate(source: string, options?: ValidateOptions) {\n let text = new Text(source);\n\n if (typeof options?.transform === 'function') {\n text = options.transform(text);\n }\n\n const textDocument = TextDocument.create(\n `file:///anonymous-${uuid()}.json`,\n 'json',\n 0,\n text.toString(),\n );\n const jsonDocument = this.parseJSONDocument(textDocument);\n\n if (!jsonDocument) {\n return [];\n }\n\n const diagnostics = await this.languageService.doValidation(\n textDocument,\n jsonDocument,\n {},\n options?.schema,\n );\n\n return diagnostics\n .map(e => {\n const from = textDocument.offsetAt(e.range.start);\n const to = textDocument.offsetAt(e.range.end);\n\n return {\n from,\n to,\n severity: e.severity,\n message: e.message,\n };\n })\n .map(e => {\n const oRange = text.originalRangeFor({\n from: e.from,\n to: e.to,\n });\n if (!oRange) {\n return;\n }\n return {\n ...e,\n ...oRange,\n };\n })\n .filter(isNonNull);\n }\n\n public configureSchemas(\n config: SchemasConfiguration | SchemasConfiguration[],\n ) {\n let configs: SchemasConfiguration[] = [];\n configs = configs.concat(config);\n\n configs.forEach(c => {\n const match = this.schemasConfigurations.find(e => e.uri === c.uri);\n if (match) {\n match.schema = c.schema;\n match.fileMatch = c.fileMatch;\n } else {\n this.schemasConfigurations.push(c);\n }\n });\n\n this.configure();\n }\n\n public deleteSchemas(uri: string | string[]) {\n let allURI: string[] = [];\n allURI = allURI.concat(uri);\n\n this.schemasConfigurations = this.schemasConfigurations.filter(\n c => !allURI.includes(c.uri),\n );\n\n this.configure();\n }\n\n public async doValidation(\n context: Parameters<NonNullable<ILanguageService['doValidation']>>[0],\n ) {\n const { textDocument } = context;\n const jsonDocument = this.parseJSONDocument(textDocument);\n\n if (!jsonDocument) {\n return [];\n }\n\n const diagnostics = await this.languageService.doValidation(\n textDocument,\n jsonDocument,\n );\n\n return diagnostics.map(e => {\n const from = textDocument.offsetAt(e.range.start);\n const to = textDocument.offsetAt(e.range.end);\n\n return {\n from,\n to,\n severity: 'error' as const,\n message: e.message,\n };\n });\n }\n\n async format(\n state: EditorState,\n options?: { tabSize: number },\n ): Promise<TransactionSpec> {\n const { textDocument, originalRangeFor } = state.field(textDocumentField);\n\n const edits = this.languageService.format(\n textDocument,\n // @ts-expect-error range can be undefined\n undefined,\n {\n tabSize: options?.tabSize ?? 4,\n insertSpaces: true,\n insertFinalNewline: false,\n },\n );\n\n const changes = edits\n .map(edit => {\n const range = originalRangeFor({\n from: textDocument.offsetAt(edit.range.start),\n to: textDocument.offsetAt(edit.range.end),\n });\n if (range) {\n return {\n ...range,\n insert: edit.newText,\n };\n }\n })\n .filter(v => isChangeDesc(v));\n\n return {\n changes,\n };\n }\n\n public async doComplete(\n context: Parameters<NonNullable<ILanguageService['doComplete']>>[0],\n ): Promise<CompletionList | null | undefined> {\n const { textDocument } = context;\n const { offset } = context;\n\n const { line, character } = textDocument.positionAt(offset);\n\n const jsonDocument = this.parseJSONDocument(textDocument);\n\n if (!jsonDocument) {\n return;\n }\n\n const completionResult = await this.languageService.doComplete(\n textDocument,\n {\n line,\n character,\n },\n jsonDocument,\n );\n\n if (!completionResult || !completionResult.items.length) {\n return;\n }\n\n return {\n isIncomplete: true,\n items: completionResult.items,\n };\n }\n\n async findLinks(\n context: Parameters<NonNullable<ILanguageService['findLinks']>>[0],\n ) {\n const { textDocument } = context;\n const doc = this.parseJSONDocument(textDocument);\n\n if (!doc) {\n return [];\n }\n\n const links: Link[] = [];\n\n // @ts-expect-error doc.visit is not exposed but indeed exists\n doc.visit(node => {\n if (node.type === 'string' && urlReg.test(node.value)) {\n const range = {\n from: node.offset + 1,\n to: node.offset + node.length - 1,\n };\n\n links.push({\n target: node.value,\n range,\n });\n }\n return true;\n });\n\n return links;\n }\n}\n\nfunction isChangeDesc(v: unknown): v is ChangeSpec {\n return Boolean(v);\n}\n\nconst jsonLanguageService = new JSONLanguageService({\n lintDelay: 0,\n});\n\nconst json = {\n language: jsonLanguage,\n languageService: jsonLanguageService,\n};\n\nexport { json, jsonLanguage, jsonLanguageService, JSONLanguageService };\n\nexport { DiagnosticSeverity, Text };\n","// Copyright (c) 2025 coze-dev\n// SPDX-License-Identifier: MIT\n\nimport { parser } from '@coze-editor/lezer-parser-json';\nimport {\n continuedIndent,\n indentNodeProp,\n foldNodeProp,\n foldInside,\n LRLanguage,\n} from '@codemirror/language';\n\n/// A language provider that provides JSON parsing.\nexport const jsonLanguage = LRLanguage.define({\n name: 'json',\n parser: parser.configure({\n props: [\n indentNodeProp.add({\n Object: continuedIndent({ except: /^\\s*\\}/ }),\n Array: continuedIndent({ except: /^\\s*\\]/ }),\n }),\n foldNodeProp.add({\n 'Object Array': foldInside,\n }),\n ],\n }),\n languageData: {\n closeBrackets: { brackets: ['[', '{', '\"', \"'\"] },\n\n indentOnInput: /^\\s*[\\}\\]]$/,\n },\n});\n"],"mappings":"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","names":["uuid"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coze-editor/code-language-json",
3
- "version": "0.1.0-alpha.dd871b",
3
+ "version": "0.1.0-alpha.e5f73a",
4
4
  "description": "code-language-json",
5
5
  "license": "MIT",
6
6
  "author": "fengzilong",
@@ -23,12 +23,12 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "@codemirror/autocomplete": "^6.18.0",
26
- "@coze-editor/extension-lint": "0.1.0-alpha.dd871b",
27
- "@coze-editor/lezer-parser-json": "0.1.0-alpha.dd871b",
28
- "@coze-editor/parser-json": "0.1.0-alpha.dd871b",
26
+ "@coze-editor/extension-lint": "0.1.0-alpha.e5f73a",
27
+ "@coze-editor/lezer-parser-json": "0.1.0-alpha.e5f73a",
28
+ "@coze-editor/parser-json": "0.1.0-alpha.e5f73a",
29
+ "@coze-editor/utils": "0.1.0-alpha.e5f73a",
29
30
  "@lezer/json": "^1.0.2",
30
31
  "@lukeed/uuid": "^2.0.1",
31
- "text-mapping": "^1.0.1",
32
32
  "vscode-json-languageservice": "^5.4.2",
33
33
  "vscode-uri": "^3.0.8"
34
34
  },
@@ -48,7 +48,7 @@
48
48
  "@codemirror/language": "^6.0.0",
49
49
  "@codemirror/state": "^6.4.1",
50
50
  "@codemirror/view": "^6.26.1",
51
- "@coze-editor/code-language-shared": "0.1.0-alpha.dd871b"
51
+ "@coze-editor/code-language-shared": "0.1.0-alpha.e5f73a"
52
52
  },
53
53
  "publishConfig": {
54
54
  "access": "public",