diff --git a/package.json b/package.json index 4d38ce0f..41c2dc93 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "build-preview": "vite build -c vite.preview.config.ts", "format": "prettier --write .", "lint": "eslint .", + "test": "node --test test/*.test.mjs", "typecheck": "vue-tsc --noEmit", "release": "bumpp --all", "version": "conventional-changelog -p angular -i CHANGELOG.md -s -r 0", diff --git a/src/store.ts b/src/store.ts index 1989dd98..6b8e074a 100644 --- a/src/store.ts +++ b/src/store.ts @@ -64,6 +64,15 @@ export function useStore( setImportMap(importMap) } + function applyDefaultTsConfig(targetFiles: Record) { + if (!targetFiles[tsconfigFile]) { + targetFiles[tsconfigFile] = new File( + tsconfigFile, + JSON.stringify(tsconfig, undefined, 2), + ) + } + } + function init() { watchEffect(() => { compileFile(store, activeFile.value).then((errs) => (errors.value = errs)) @@ -142,12 +151,7 @@ export function useStore( ) // init tsconfig - if (!files.value[tsconfigFile]) { - files.value[tsconfigFile] = new File( - tsconfigFile, - JSON.stringify(tsconfig, undefined, 2), - ) - } + applyDefaultTsConfig(files.value) // compile rest of the files errors.value = [] @@ -339,6 +343,7 @@ export function useStore( for (const [filename, file] of Object.entries(newFiles)) { setFile(files, filename, file) } + applyDefaultTsConfig(files) const errors = [] for (const file of Object.values(files)) { diff --git a/test/store.test.mjs b/test/store.test.mjs new file mode 100644 index 00000000..e3c56c54 --- /dev/null +++ b/test/store.test.mjs @@ -0,0 +1,41 @@ +import assert from 'node:assert/strict' +import { after, test } from 'node:test' +import { ref } from 'vue' +import { createServer } from 'vite' + +const vite = await createServer({ + appType: 'custom', + logLevel: 'silent', + server: { middlewareMode: true }, +}) +after(() => vite.close()) + +const { tsconfigFile, useStore } = await vite.ssrLoadModule('/src/store.ts') + +function createStore() { + return useStore({ builtinImportMap: ref({ imports: {} }) }) +} + +test('setFiles applies the default tsconfig when none is provided', async () => { + const store = createStore() + store.init() + const defaultTsConfig = store.files[tsconfigFile].code + + await store.setFiles({ + 'src/App.vue': '', + }) + + assert.equal(store.files[tsconfigFile].code, defaultTsConfig) +}) + +test('setFiles keeps a provided tsconfig', async () => { + const store = createStore() + const customTsConfig = JSON.stringify({ compilerOptions: { strict: true } }) + + await store.setFiles({ + 'src/App.vue': '', + [tsconfigFile]: customTsConfig, + }) + + assert.equal(store.files[tsconfigFile].code, customTsConfig) +})