From fa2672485a7027d17c37c63921bbff104d19620d Mon Sep 17 00:00:00 2001 From: Alexander Lichter Date: Fri, 20 Jan 2023 17:23:16 +0100 Subject: [PATCH] fix(kit): resolve group syntax of `ignore` (#15884) --- packages/kit/src/ignore.test.ts | 26 +++++++++++++++++ packages/kit/src/ignore.ts | 28 ++++++++++++++++++- packages/kit/src/index.ts | 2 +- .../plugins/this-should-not-load.spec.js | 1 + vitest.config.ts | 5 +++- 5 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 packages/kit/src/ignore.test.ts create mode 100644 test/fixtures/basic/plugins/this-should-not-load.spec.js diff --git a/packages/kit/src/ignore.test.ts b/packages/kit/src/ignore.test.ts new file mode 100644 index 0000000000..b6cdaf1c17 --- /dev/null +++ b/packages/kit/src/ignore.test.ts @@ -0,0 +1,26 @@ +import { expect, it, describe } from 'vitest' +import { resolveGroupSyntax } from './ignore.js' + +describe('resolveGroupSyntax', () => { + it('should resolve single group syntax', () => { + expect(resolveGroupSyntax('**/*.{spec}.{js,ts}')).toStrictEqual([ + '**/*.spec.js', + '**/*.spec.ts' + ]) + }) + + it('should resolve multi-group syntax', () => { + expect(resolveGroupSyntax('**/*.{spec,test}.{js,ts}')).toStrictEqual([ + '**/*.spec.js', + '**/*.spec.ts', + '**/*.test.js', + '**/*.test.ts' + ]) + }) + + it('should do nothing with normal globs', () => { + expect(resolveGroupSyntax('**/*.spec.js')).toStrictEqual([ + '**/*.spec.js' + ]) + }) +}) diff --git a/packages/kit/src/ignore.ts b/packages/kit/src/ignore.ts index e737bb2289..825c3dbb6c 100644 --- a/packages/kit/src/ignore.ts +++ b/packages/kit/src/ignore.ts @@ -16,7 +16,9 @@ export function isIgnored (pathname: string): boolean { if (!nuxt._ignore) { nuxt._ignore = ignore(nuxt.options.ignoreOptions) - nuxt._ignore.add(nuxt.options.ignore) + const resolvedIgnore = nuxt.options.ignore.flatMap(s => resolveGroupSyntax(s)) + + nuxt._ignore.add(resolvedIgnore) const nuxtignoreFile = join(nuxt.options.rootDir, '.nuxtignore') if (existsSync(nuxtignoreFile)) { @@ -32,3 +34,27 @@ export function isIgnored (pathname: string): boolean { } return !!(relativePath && nuxt._ignore.ignores(relativePath)) } + +/** + * This function turns string containing groups '**\/*.{spec,test}.{js,ts}' into an array of strings. + * For example will '**\/*.{spec,test}.{js,ts}' be resolved to: + * ['**\/*.spec.js', '**\/*.spec.ts', '**\/*.test.js', '**\/*.test.ts'] + * + * @param group string containing the group syntax + * @returns {string[]} array of strings without the group syntax + */ +export function resolveGroupSyntax (group: string): string[] { + let groups = [group] + while (groups.some(group => group.includes('{'))) { + groups = groups.flatMap((group) => { + const [head, ...tail] = group.split('{') + if (tail.length) { + const [body, ...rest] = tail.join('{').split('}') + return body.split(',').map(part => `${head}${part}${rest.join('')}`) + } + + return group + }) + } + return groups +} diff --git a/packages/kit/src/index.ts b/packages/kit/src/index.ts index 5c05b74ed7..a562990317 100644 --- a/packages/kit/src/index.ts +++ b/packages/kit/src/index.ts @@ -12,7 +12,7 @@ export * from './build' export * from './compatibility' export * from './components' export * from './context' -export * from './ignore' +export { isIgnored } from './ignore' export * from './layout' export * from './pages' export * from './plugin' diff --git a/test/fixtures/basic/plugins/this-should-not-load.spec.js b/test/fixtures/basic/plugins/this-should-not-load.spec.js new file mode 100644 index 0000000000..4b425f7554 --- /dev/null +++ b/test/fixtures/basic/plugins/this-should-not-load.spec.js @@ -0,0 +1 @@ +throw new Error('this-should-not-load.spec.js should not be loaded') diff --git a/vitest.config.ts b/vitest.config.ts index 88f9411f64..fa1bc0964a 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,5 +1,6 @@ import { resolve } from 'node:path' import { defineConfig } from 'vite' +import { configDefaults } from 'vitest/config' import { isWindows } from 'std-env' export default defineConfig({ @@ -13,6 +14,8 @@ export default defineConfig({ tsconfigRaw: '{}' }, test: { - testTimeout: isWindows ? 60000 : 10000 + testTimeout: isWindows ? 60000 : 10000, + // Excluded plugin because it should throw an error when accidentally loaded via Nuxt + exclude: [...configDefaults.exclude, '**/this-should-not-load.spec.js'] } })