@arkts/language-plugin
Version:
ArkTS Volar Language Plugin.
1 lines • 7.62 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","names":["snapshot: ts.IScriptSnapshot","languageId: string","data: CodeInformation","fn: () => T","value: T | typeof SYMBOL_UNINITIALIZED","tsOrEts: typeof ets | typeof ts"],"sources":["../src/ets-code.ts","../src/utils.ts","../src/language-plugin.ts"],"sourcesContent":["import type { CodeInformation, VirtualCode } from '@volar/language-core'\nimport type * as ts from 'typescript'\n\nexport function createVirtualCode(snapshot: ts.IScriptSnapshot, languageId: string, data: CodeInformation): VirtualCode {\n return {\n id: 'root',\n languageId,\n snapshot,\n mappings: [{\n sourceOffsets: [0],\n generatedOffsets: [0],\n lengths: [snapshot.getLength()],\n data,\n }],\n }\n}\n\nexport function createEmptyVirtualCode(snapshot: ts.IScriptSnapshot, languageId: string, data: CodeInformation): VirtualCode {\n return {\n id: 'root',\n languageId,\n snapshot: {\n getText: () => '',\n getLength: () => 0,\n getChangeRange: () => undefined,\n },\n mappings: [{\n sourceOffsets: [0],\n generatedOffsets: [0],\n lengths: [snapshot.getLength()],\n data,\n }],\n }\n}\n","const SYMBOL_UNINITIALIZED = Symbol('UNINITIALIZED')\n\n/**\n * Store a lazy getter function, and return the cached value.\n *\n * When first time calling the returned function, the lazy getter function will be executed,\n * and the result will be cached.\n *\n * When second time calling the returned function, the cached value will be returned and the lazy getter function will not be executed again.\n *\n * @param fn - The lazy getter function.\n * @returns The cached value.\n */\nexport function createLazyGetter<T>(fn: () => T): () => T {\n let value: T | typeof SYMBOL_UNINITIALIZED = SYMBOL_UNINITIALIZED\n\n return () => {\n if (value === SYMBOL_UNINITIALIZED)\n value = fn()\n return value\n }\n}\n","import type { LanguagePlugin } from '@volar/language-core'\nimport type * as ets from 'ohos-typescript'\nimport type * as ts from 'typescript'\nimport type { URI } from 'vscode-uri'\nimport path from 'node:path'\nimport { createEmptyVirtualCode, createVirtualCode } from './ets-code'\nimport { createLazyGetter } from './utils'\nimport '@volar/typescript'\n\nfunction isEts(tsOrEts: typeof ets | typeof ts): tsOrEts is typeof ets {\n return 'ETS' in tsOrEts.ScriptKind && tsOrEts.ScriptKind.ETS === 8\n}\n\nexport interface ETSLanguagePluginOptions {\n sdkPaths?: string[]\n tsdk?: string\n}\n\nexport function ETSLanguagePlugin(tsOrEts: typeof ts, options?: ETSLanguagePluginOptions): LanguagePlugin<URI | string>\nexport function ETSLanguagePlugin(tsOrEts: typeof ets, options?: ETSLanguagePluginOptions): LanguagePlugin<URI | string>\nexport function ETSLanguagePlugin(tsOrEts: typeof ets | typeof ts, { sdkPaths = [], tsdk = '' }: ETSLanguagePluginOptions = {}): LanguagePlugin<URI | string> {\n const isETSServerMode = isEts(tsOrEts)\n const isTSPluginMode = !isETSServerMode\n\n return {\n getLanguageId(uri) {\n const filePath = typeof uri === 'string' ? uri : uri.fsPath\n if (filePath.endsWith('.ets'))\n return 'ets'\n if (filePath.endsWith('.ts'))\n return 'typescript'\n return undefined\n },\n createVirtualCode(uri, languageId, snapshot) {\n const filePath = path.resolve(typeof uri === 'string' ? uri : uri.fsPath)\n const isInSdkPath = sdkPaths.some(sdkPath => filePath.startsWith(sdkPath))\n const isInTsdkPath = filePath.startsWith(tsdk)\n const isDTS = filePath.endsWith('.d.ts')\n const isDETS = filePath.endsWith('.d.ets')\n\n const getFullVitrualCode = createLazyGetter(() => (\n createVirtualCode(snapshot, languageId, {\n completion: true,\n format: true,\n navigation: true,\n semantic: true,\n structure: true,\n verification: true,\n })\n ))\n\n const getDisabledVirtualCode = createLazyGetter(() => (\n createVirtualCode(snapshot, languageId, {\n completion: false,\n format: false,\n navigation: false,\n semantic: false,\n structure: false,\n verification: false,\n })\n ))\n\n // ets files\n if (languageId === 'ets' && filePath.endsWith('.ets'))\n return getFullVitrualCode()\n // ETS Server mode\n if (isETSServerMode && !(isDTS || isDETS) && !isInSdkPath)\n return getDisabledVirtualCode()\n // TS Plugin mode\n if (isTSPluginMode && (isDTS || isDETS) && isInSdkPath) {\n return createEmptyVirtualCode(snapshot, languageId, {\n completion: false,\n format: false,\n navigation: false,\n semantic: false,\n structure: false,\n verification: false,\n })\n }\n // Proxy ts internal lib files, such as `lib.d.ts`, `lib.es2020.d.ts`, etc.\n if (isETSServerMode && (isDTS || isDETS) && isInTsdkPath)\n return getDisabledVirtualCode()\n },\n typescript: {\n // eslint-disable-next-line ts/ban-ts-comment\n // @ts-expect-error\n extraFileExtensions: isETSServerMode\n ? [\n { extension: 'ets', isMixedContent: false, scriptKind: 8 satisfies ets.ScriptKind.ETS },\n { extension: 'd.ets', isMixedContent: false, scriptKind: 8 satisfies ets.ScriptKind.ETS },\n ]\n : [],\n resolveHiddenExtensions: true,\n getServiceScript(root) {\n return {\n code: root,\n extension: '.ets',\n scriptKind: 3 satisfies typeof ets.ScriptKind.TS,\n }\n },\n },\n }\n}\n"],"mappings":";;;;AAGA,SAAgB,kBAAkBA,UAA8BC,YAAoBC,MAAoC;AACtH,QAAO;EACL,IAAI;EACJ;EACA;EACA,UAAU,CAAC;GACT,eAAe,CAAC,CAAE;GAClB,kBAAkB,CAAC,CAAE;GACrB,SAAS,CAAC,SAAS,WAAW,AAAC;GAC/B;EACD,CAAC;CACH;AACF;AAED,SAAgB,uBAAuBF,UAA8BC,YAAoBC,MAAoC;AAC3H,QAAO;EACL,IAAI;EACJ;EACA,UAAU;GACR,SAAS,MAAM;GACf,WAAW,MAAM;GACjB,gBAAgB,MAAM;EACvB;EACD,UAAU,CAAC;GACT,eAAe,CAAC,CAAE;GAClB,kBAAkB,CAAC,CAAE;GACrB,SAAS,CAAC,SAAS,WAAW,AAAC;GAC/B;EACD,CAAC;CACH;AACF;;;;ACjCD,MAAM,uBAAuB,OAAO,gBAAgB;;;;;;;;;;;;AAapD,SAAgB,iBAAoBC,IAAsB;CACxD,IAAIC,QAAyC;AAE7C,QAAO,MAAM;AACX,MAAI,UAAU,sBACZ,QAAQ,IAAI;AACd,SAAO;CACR;AACF;;;;ACZD,SAAS,MAAMC,SAAwD;AACrE,QAAO,SAAS,QAAQ,cAAc,QAAQ,WAAW,QAAQ;AAClE;AASD,SAAgB,kBAAkBA,SAAiC,EAAE,WAAW,CAAE,GAAE,OAAO,IAA8B,GAAG,CAAE,GAAgC;CAC5J,MAAM,kBAAkB,MAAM,QAAQ;CACtC,MAAM,iBAAiB,CAAC;AAExB,QAAO;EACL,cAAc,KAAK;GACjB,MAAM,WAAW,OAAO,QAAQ,WAAW,MAAM,IAAI;AACrD,OAAI,SAAS,SAAS,OAAO,CAC3B,QAAO;AACT,OAAI,SAAS,SAAS,MAAM,CAC1B,QAAO;AACT,UAAO;EACR;EACD,kBAAkB,KAAK,YAAY,UAAU;GAC3C,MAAM,WAAW,KAAK,QAAQ,OAAO,QAAQ,WAAW,MAAM,IAAI,OAAO;GACzE,MAAM,cAAc,SAAS,KAAK,aAAW,SAAS,WAAW,QAAQ,CAAC;GAC1E,MAAM,eAAe,SAAS,WAAW,KAAK;GAC9C,MAAM,QAAQ,SAAS,SAAS,QAAQ;GACxC,MAAM,SAAS,SAAS,SAAS,SAAS;GAE1C,MAAM,qBAAqB,iBAAiB,MAC1C,kBAAkB,UAAU,YAAY;IACtC,YAAY;IACZ,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,WAAW;IACX,cAAc;GACf,EAAC,CACF;GAEF,MAAM,yBAAyB,iBAAiB,MAC9C,kBAAkB,UAAU,YAAY;IACtC,YAAY;IACZ,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,WAAW;IACX,cAAc;GACf,EAAC,CACF;AAGF,OAAI,eAAe,SAAS,SAAS,SAAS,OAAO,CACnD,QAAO,oBAAoB;AAE7B,OAAI,mBAAmB,EAAE,SAAS,WAAW,CAAC,YAC5C,QAAO,wBAAwB;AAEjC,OAAI,mBAAmB,SAAS,WAAW,YACzC,QAAO,uBAAuB,UAAU,YAAY;IAClD,YAAY;IACZ,QAAQ;IACR,YAAY;IACZ,UAAU;IACV,WAAW;IACX,cAAc;GACf,EAAC;AAGJ,OAAI,oBAAoB,SAAS,WAAW,aAC1C,QAAO,wBAAwB;EAClC;EACD,YAAY;GAGV,qBAAqB,kBACjB,CACE;IAAE,WAAW;IAAO,gBAAgB;IAAO,YAAY;GAAgC,GACvF;IAAE,WAAW;IAAS,gBAAgB;IAAO,YAAY;GAAgC,CAC1F,IACD,CAAE;GACN,yBAAyB;GACzB,iBAAiB,MAAM;AACrB,WAAO;KACL,MAAM;KACN,WAAW;KACX,YAAY;IACb;GACF;EACF;CACF;AACF"}