@application-kit/testing 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @application-kit/testing
2
2
 
3
+ ## 0.8.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 32fb131: Фабрики `defineApplicationUnitConfig` и `defineApplicationEndToEndConfig` сами распознают прогон Stryker по
8
+ `STRYKER_MUTATOR_WORKER`: выключают кеш модулей и на vitest 5 изолируют файлы спек. Отдельный конфиг vitest для Stryker
9
+ больше не нужен: `defineApplicationMutationConfig` удалена, `vitestConfigFile` указывает на обычный `vitest.config`.
10
+
3
11
  ## 0.7.1
4
12
 
5
13
  ### Patch Changes
package/README.md CHANGED
@@ -92,10 +92,10 @@ export default defineApplicationEndToEndConfig({
92
92
  ячейки шарда CI и `ProjectShardSequencer` (ниже);
93
93
  - e2e — окружение `node` и алиас `graphql` на CJS-вход `node_modules/graphql/index.js` под `root`: Vite для SSR берёт
94
94
  ESM-сборку `graphql`, внешний `mercurius` — CJS, и без алиаса схема и валидация запроса живут в разных realm;
95
- - мутации — `defineApplicationMutationConfig(unitConfig)`: unit-конфиг для `vitestConfigFile` Stryker без кеша модулей
96
- (под Stryker он отдаёт тестам трансформ без активного мутанта), на vitest 5 — ещё и с `isolate: true`: без изоляции
97
- vitest-runner Stryker собирает покрытие по тестам только с первого файла спек воркера. Ручное
98
- `experimental.fsModuleCache: false` поверх фабрики на vitest 5 не действует — верхний ключ фабрики главнее.
95
+ - мутации — отдельного конфига не нужно: `vitestConfigFile` Stryker указывает на обычный `vitest.config`, а фабрики,
96
+ увидев `STRYKER_MUTATOR_WORKER`, выключают кеш модулей (под Stryker он отдаёт тестам трансформ без активного мутанта)
97
+ и на vitest 5 ставят `isolate: true`: без изоляции vitest-runner Stryker собирает покрытие по тестам только с первого
98
+ файла спек воркера.
99
99
 
100
100
  ## Вход `/vitest/fast-bcrypt`: дешёвый bcrypt
101
101
 
@@ -136,14 +136,11 @@ export default defineStrykerConfig({
136
136
  ignorePatterns: ['docs', 'tasks'],
137
137
  mutate: { exclude: ['src/**/*.spec.ts', 'src/**/*.vue', 'src/**/tests/**'], include: ['src/modules/**/*.ts', 'src/libs/**/*.ts'] },
138
138
  thresholds: { break: 94, high: 100, low: 95 },
139
- vitestConfigFile: 'vitest.stryker.config.mts',
139
+ vitestConfigFile: 'vitest.config.mts',
140
140
  })
141
141
 
142
142
  // vitest.config.mts
143
143
  coverage: { exclude: [...CODE_WITHOUT_LOGIC, '**/*.html'], include: ['src'], thresholds: { lines: 95 } }
144
-
145
- // vitest.stryker.config.mts — defineApplicationMutationConfig из входа /vitest
146
- export default defineApplicationMutationConfig(unitConfig)
147
144
  ```
148
145
 
149
146
  `defineStrykerLayers` режет прогон на группы каталогов: ячейка CI мутирует одну группу со своим порогом `break` (общий
@@ -2,4 +2,3 @@ import type { ViteUserConfig } from 'vitest/config';
2
2
  import type { ApplicationTestConfigOptionsInterface, ApplicationUnitConfigOptionsInterface } from './application-vitest-config-options.interface.js';
3
3
  export declare const defineApplicationUnitConfig: (options: ApplicationUnitConfigOptionsInterface) => ViteUserConfig;
4
4
  export declare const defineApplicationEndToEndConfig: (options: ApplicationTestConfigOptionsInterface) => ViteUserConfig;
5
- export declare const defineApplicationMutationConfig: (unitConfig: ViteUserConfig) => ViteUserConfig;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.defineApplicationMutationConfig = exports.defineApplicationEndToEndConfig = exports.defineApplicationUnitConfig = void 0;
6
+ exports.defineApplicationEndToEndConfig = exports.defineApplicationUnitConfig = void 0;
7
7
  const node_module_1 = require("node:module");
8
8
  const node_path_1 = __importDefault(require("node:path"));
9
9
  const node_process_1 = __importDefault(require("node:process"));
@@ -35,10 +35,11 @@ const coverageOf = (scope) => ({
35
35
  skipFull: true,
36
36
  thresholds: scope.thresholds,
37
37
  });
38
+ const isMutationRun = () => node_process_1.default.env.STRYKER_MUTATOR_WORKER !== undefined;
38
39
  const sharedTestOptions = (options) => ({
39
- ...moduleCacheOf(true),
40
+ ...moduleCacheOf(!isMutationRun()),
40
41
  globals: true,
41
- isolate: false,
42
+ isolate: isMutationRun() && IS_VITEST_5,
42
43
  server: { deps: { inline: [...PACKAGES_THROUGH_VITE, ...(options.inlineDependencies ?? [])] } },
43
44
  setupFiles: [...options.setupFiles],
44
45
  testTimeout: TEST_TIMEOUT,
@@ -104,7 +105,3 @@ const defineApplicationEndToEndConfig = (options) => {
104
105
  });
105
106
  };
106
107
  exports.defineApplicationEndToEndConfig = defineApplicationEndToEndConfig;
107
- const defineApplicationMutationConfig = (unitConfig) => (0, vite_1.mergeConfig)(unitConfig, {
108
- test: { ...moduleCacheOf(false), ...(IS_VITEST_5 && { isolate: true }) },
109
- });
110
- exports.defineApplicationMutationConfig = defineApplicationMutationConfig;
@@ -2,4 +2,3 @@ import type { ViteUserConfig } from 'vitest/config';
2
2
  import type { ApplicationTestConfigOptionsInterface, ApplicationUnitConfigOptionsInterface } from './application-vitest-config-options.interface.js';
3
3
  export declare const defineApplicationUnitConfig: (options: ApplicationUnitConfigOptionsInterface) => ViteUserConfig;
4
4
  export declare const defineApplicationEndToEndConfig: (options: ApplicationTestConfigOptionsInterface) => ViteUserConfig;
5
- export declare const defineApplicationMutationConfig: (unitConfig: ViteUserConfig) => ViteUserConfig;
@@ -29,10 +29,11 @@ const coverageOf = (scope) => ({
29
29
  skipFull: true,
30
30
  thresholds: scope.thresholds,
31
31
  });
32
+ const isMutationRun = () => process.env.STRYKER_MUTATOR_WORKER !== undefined;
32
33
  const sharedTestOptions = (options) => ({
33
- ...moduleCacheOf(true),
34
+ ...moduleCacheOf(!isMutationRun()),
34
35
  globals: true,
35
- isolate: false,
36
+ isolate: isMutationRun() && IS_VITEST_5,
36
37
  server: { deps: { inline: [...PACKAGES_THROUGH_VITE, ...(options.inlineDependencies ?? [])] } },
37
38
  setupFiles: [...options.setupFiles],
38
39
  testTimeout: TEST_TIMEOUT,
@@ -96,6 +97,3 @@ export const defineApplicationEndToEndConfig = (options) => {
96
97
  },
97
98
  });
98
99
  };
99
- export const defineApplicationMutationConfig = (unitConfig) => mergeConfig(unitConfig, {
100
- test: { ...moduleCacheOf(false), ...(IS_VITEST_5 && { isolate: true }) },
101
- });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@application-kit/testing",
3
- "version": "0.7.1",
3
+ "version": "0.8.0",
4
4
  "description": "Тестовая инфраструктура NestJS-приложений: шины CQRS, логгер, фейковый microservice, сборка web-приложения, Postgres в testcontainers, запуск e2e-приложения, изоляция окружения прогона, дешёвый bcrypt для unit-прогона, раскладка ячеек CI по проектам vitest и фабрики конфигов vitest",
5
5
  "keywords": [
6
6
  "cqrs",
@@ -81,7 +81,7 @@
81
81
  "test:unit": "vitest run"
82
82
  },
83
83
  "dependencies": {
84
- "@application-kit/bootstrap": "^0.2.2"
84
+ "@application-kit/bootstrap": "^0.2.3"
85
85
  },
86
86
  "devDependencies": {
87
87
  "@nestjs/common": "^11.2.7",