feat(param-parsers): add include/exclude options · vuejs/router@91cdec3 (original) (raw)
1
``
`-
import { describe, expect, it } from 'vitest'
`
``
1
`+
import { describe, expect, it, test } from 'vitest'
`
2
2
`import {
`
3
3
`warnMissingParamParsers,
`
4
4
`collectMissingParamParsers,
`
`@@ -8,13 +8,17 @@ import {
`
8
8
`generatePathParamsOptions,
`
9
9
`generateCustomParamParsersList,
`
10
10
`generateNormalizedParamParsersDeclarations,
`
``
11
`+
scanParamParserFiles,
`
11
12
`type ParamParsersMap,
`
12
13
`} from './generateParamParsers'
`
13
14
`import { PrefixTree } from '../core/tree'
`
14
``
`-
import { resolveOptions } from '../options'
`
``
15
`+
import { DEFAULT_PARAM_PARSERS_OPTIONS, resolveOptions } from '../options'
`
15
16
`import { ImportsMap } from '../core/utils'
`
16
17
`import type { TreePathParam } from '../core/treeNodeValue'
`
17
18
`import { mockWarn } from '../../tests/vitest-mock-warn'
`
``
19
`+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
`
``
20
`+
import { tmpdir } from 'node:os'
`
``
21
`+
import { join } from 'node:path'
`
18
22
``
19
23
`const DEFAULT_OPTIONS = resolveOptions({})
`
20
24
``
`@@ -785,3 +789,69 @@ describe('generateNormalizedParamParsersDeclarations', () => {
`
785
789
`)
`
786
790
`})
`
787
791
`})
`
``
792
+
``
793
`` +
// Per-test temp folder via the recommended vitest test.extend fixture pattern.
``
``
794
`` +
// Each test gets a fresh isolated directory; cleanup runs after use resolves.
``
``
795
`+
const parsersTest = test.extend<{ parsersDir: string }>({
`
``
796
`+
parsersDir: async ({}, use) => {
`
``
797
`+
const dir = mkdtempSync(join(tmpdir(), 'vue-router-param-parsers-'))
`
``
798
`+
writeFileSync(join(dir, 'uuid.ts'), 'export const parser = {}')
`
``
799
`+
writeFileSync(join(dir, 'slug.ts'), 'export const parser = {}')
`
``
800
`+
writeFileSync(join(dir, 'uuid.test.ts'), 'test code')
`
``
801
`+
writeFileSync(join(dir, 'slug.spec.ts'), 'test code')
`
``
802
`+
writeFileSync(join(dir, 'legacy.js'), 'module.exports = {}')
`
``
803
`+
writeFileSync(join(dir, 'legacy.test.js'), 'module.exports = {}')
`
``
804
`+
writeFileSync(join(dir, 'README.md'), '# parsers')
`
``
805
`+
mkdirSync(join(dir, 'nested'))
`
``
806
`+
writeFileSync(join(dir, 'nested', 'deep.ts'), 'export const parser = {}')
`
``
807
`+
await use(dir)
`
``
808
`+
rmSync(dir, { recursive: true, force: true })
`
``
809
`+
},
`
``
810
`+
})
`
``
811
+
``
812
`+
describe('scanParamParserFiles', () => {
`
``
813
`+
parsersTest(
`
``
814
`+
'picks parsers and ignores tests/specs/nested by default',
`
``
815
`+
async ({ parsersDir }) => {
`
``
816
`+
const files = await scanParamParserFiles(
`
``
817
`+
parsersDir,
`
``
818
`+
DEFAULT_PARAM_PARSERS_OPTIONS.include,
`
``
819
`+
DEFAULT_PARAM_PARSERS_OPTIONS.exclude
`
``
820
`+
)
`
``
821
`+
expect(files.sort()).toEqual(['slug.ts', 'uuid.ts'])
`
``
822
`+
}
`
``
823
`+
)
`
``
824
+
``
825
`+
parsersTest(
`
``
826
`+
'respects a custom include that adds js',
`
``
827
`+
async ({ parsersDir }) => {
`
``
828
`+
const files = await scanParamParserFiles(
`
``
829
`+
parsersDir,
`
``
830
`+
['*.{ts,js}'],
`
``
831
`+
DEFAULT_PARAM_PARSERS_OPTIONS.exclude
`
``
832
`+
)
`
``
833
`+
expect(files.sort()).toEqual(['legacy.js', 'slug.ts', 'uuid.ts'])
`
``
834
`+
}
`
``
835
`+
)
`
``
836
+
``
837
`+
parsersTest('respects a custom exclude', async ({ parsersDir }) => {
`
``
838
`+
const files = await scanParamParserFiles(parsersDir, ['.ts'], ['uuid'])
`
``
839
`+
expect(files.sort()).toEqual(['slug.spec.ts', 'slug.ts'])
`
``
840
`+
})
`
``
841
+
``
842
`+
parsersTest(
`
``
843
`+
'returns no files when include is empty',
`
``
844
`+
async ({ parsersDir }) => {
`
``
845
`+
const files = await scanParamParserFiles(parsersDir, [], [])
`
``
846
`+
expect(files).toEqual([])
`
``
847
`+
}
`
``
848
`+
)
`
``
849
+
``
850
`+
parsersTest(
`
``
851
`+
'never picks nested files even without exclude',
`
``
852
`+
async ({ parsersDir }) => {
`
``
853
`+
const files = await scanParamParserFiles(parsersDir, ['*.ts'], [])
`
``
854
`+
expect(files.some(f => f.includes('nested'))).toBe(false)
`
``
855
`+
}
`
``
856
`+
)
`
``
857
`+
})
`