{"version":3,"sources":["../../../src/checkers/vueTsc/prepareVueTsc.ts"],"sourcesContent":["import { access, cp, mkdir, readFile, rm, writeFile } from 'node:fs/promises'\nimport { createRequire } from 'node:module'\nimport path, { dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport lockfile from 'proper-lockfile'\n\nconst _require = createRequire(import.meta.url)\n\n// isomorphic __dirname https://antfu.me/posts/isomorphic-dirname\nconst _filename = fileURLToPath(import.meta.url)\nconst _dirname = dirname(_filename)\nconst vueTscDir = dirname(_require.resolve('vue-tsc/package.json'))\nconst proxyApiPath = _require.resolve(\n '@volar/typescript/lib/node/proxyCreateProgram',\n {\n paths: [vueTscDir],\n },\n)\nconst extraSupportedExtensions = ['.vue']\n\nconst LOCK_TIMEOUT_MS = 60000 // Max wait time\nconst STALE_TIMEOUT_MS = 30000 // Auto-release stale locks\n\nasync function isFixtureValid(\n targetTsDir: string,\n vueTscFlagFile: string,\n currTsVersion: string,\n) {\n try {\n await access(targetTsDir)\n const targetTsVersion = JSON.parse(\n await readFile(path.resolve(targetTsDir, 'package.json'), 'utf8'),\n ).version\n await access(vueTscFlagFile)\n const fixtureFlagContent = await readFile(vueTscFlagFile, 'utf8')\n return (\n targetTsVersion === currTsVersion && fixtureFlagContent === proxyApiPath\n )\n } catch {\n return false\n }\n}\n\nexport async function prepareVueTsc() {\n const targetTsDir = path.resolve(_dirname, 'typescript-vue-tsc')\n const vueTscFlagFile = path.resolve(targetTsDir, 'vue-tsc-resolve-path')\n const currTsVersion = _require('typescript/package.json').version\n\n const tsMajorVersion = Number(currTsVersion.split('.')[0])\n if (tsMajorVersion < 5) {\n throw new Error(\n \"\\x1b[35m[vite-plugin-checker] Since 0.7.0, vue-tsc checkers requires TypeScript 5.0.0 or newer version.\\nPlease upgrade TypeScript, or use v0.6.4 which works with vue-tsc^1 if you can't upgrade. Check the pull request https://github.com/fi3ework/vite-plugin-checker/pull/327 for detail.\\x1b[39m\\n\",\n )\n }\n\n if (await isFixtureValid(targetTsDir, vueTscFlagFile, currTsVersion)) {\n return { targetTsDir }\n }\n\n let release: Awaited>\n try {\n release = await lockfile.lock(_dirname, {\n lockfilePath: path.resolve(_dirname, '.vue-tsc-fixture.lock'),\n stale: STALE_TIMEOUT_MS,\n retries: {\n retries: Math.ceil(LOCK_TIMEOUT_MS / 1000),\n factor: 1,\n minTimeout: 1000,\n maxTimeout: 2000,\n randomize: true,\n },\n })\n } catch (err) {\n throw new Error(\n '[vite-plugin-checker] Failed to acquire lock for vue-tsc fixture preparation. ' +\n 'Another process may be holding the lock.\\n' +\n String(err),\n )\n }\n\n try {\n // Double-check that the fixture is valid, another process may have built while trying to acquire the lock\n if (await isFixtureValid(targetTsDir, vueTscFlagFile, currTsVersion)) {\n return { targetTsDir }\n }\n\n await rm(targetTsDir, { force: true, recursive: true })\n await mkdir(targetTsDir, { recursive: true })\n const sourceTsDir = path.resolve(_require.resolve('typescript'), '../..')\n await cp(sourceTsDir, targetTsDir, { recursive: true })\n await writeFile(vueTscFlagFile, proxyApiPath)\n\n // sync modification of lib/tsc.js with vue-tsc\n await overrideTscJs(\n _require.resolve(path.resolve(targetTsDir, 'lib/typescript.js')),\n )\n } finally {\n await release()\n }\n\n return { targetTsDir }\n}\n\nasync function overrideTscJs(tscJsPath: string) {\n const languagePluginsFile = path.resolve(_dirname, 'languagePlugins.cjs')\n let tsc = await readFile(tscJsPath, 'utf8')\n // #region copied from https://github.com/volarjs/volar.js/blob/630f31118d3986c00cc730eb83cd896709fd547e/packages/typescript/lib/quickstart/runTsc.ts\n // add *.vue files to allow extensions\n const extsText = extraSupportedExtensions.map((ext) => `\"${ext}\"`).join(', ')\n // tsc = replace(tsc, /supportedTSExtensions = .*(?=;)/, (s) => `${s}.concat([[${extsText}]])`)\n tsc = replace(\n tsc,\n /supportedTSExtensions = .*(?=;)/,\n (s) =>\n s +\n `.map((group, i) => i === 0 ? group.splice(0, 0, ${extsText}) && group : group)`,\n )\n tsc = replace(\n tsc,\n /supportedJSExtensions = .*(?=;)/,\n (s) =>\n s +\n `.map((group, i) => i === 0 ? group.splice(0, 0, ${extsText}) && group : group)`,\n )\n tsc = replace(\n tsc,\n /allSupportedExtensions = .*(?=;)/,\n (s) =>\n s +\n `.map((group, i) => i === 0 ? group.splice(0, 0, ${extsText}) && group : group)`,\n )\n\n const extsText2 = extraSupportedExtensions.map((ext) => `\"${ext}\"`).join(', ')\n tsc = replace(\n tsc,\n /function changeExtension\\(/,\n (s) =>\n `function changeExtension(path, newExtension) {\n\t\t\t\t\treturn [${extsText2}].some(ext => path.endsWith(ext))\n\t\t\t\t\t\t? path + newExtension\n\t\t\t\t\t\t: _changeExtension(path, newExtension)\n\t\t\t\t\t}\\n${s.replace('changeExtension', '_changeExtension')}`,\n )\n\n // proxy createProgram\n tsc = replace(\n tsc,\n /function createProgram\\(.+\\) {/,\n (s) =>\n `var createProgram = require(${JSON.stringify(\n proxyApiPath,\n )}).proxyCreateProgram(${[\n 'new Proxy({}, { get(_target, p, _receiver) { return eval(p); } } )',\n '_createProgram',\n `require(${JSON.stringify(languagePluginsFile)}).getLanguagePlugins`,\n ].join(', ')});\\n${s.replace('createProgram', '_createProgram')}`,\n )\n\n function replace(\n _text: string,\n ...[search, replace]: Parameters\n ) {\n const before = _text\n const text = _text.replace(search, replace)\n const after = text\n if (after === before) {\n throw `Search string not found: ${JSON.stringify(search.toString())}`\n }\n return after\n }\n // #endregion\n\n await writeFile(tscJsPath, tsc)\n}\n"],"mappings":"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","names":["replace"]}