@nest-yalc-2/jest-config 2.2.0 → 2.2.2

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.
Files changed (90) hide show
  1. package/LICENSE +661 -0
  2. package/package.json +25 -10
  3. package/src/CHANGELOG.md +8 -0
  4. package/src/README.md +31 -0
  5. package/src/config/CHANGELOG.md +8 -0
  6. package/src/config/README.md +31 -0
  7. package/src/config/gql-plugin.js +25 -0
  8. package/src/config/index.d.ts +2 -0
  9. package/src/config/index.js +6 -0
  10. package/src/config/index.js.map +1 -0
  11. package/src/config/index.ts +2 -0
  12. package/src/config/jest-conf.generator.d.ts +53 -0
  13. package/src/config/jest-conf.generator.js +193 -0
  14. package/src/config/jest-conf.generator.js.map +1 -0
  15. package/src/config/jest-conf.generator.ts +368 -0
  16. package/src/config/jest-def.config.d.ts +20 -0
  17. package/src/config/jest-def.config.js +145 -0
  18. package/src/config/jest-def.config.js.map +1 -0
  19. package/src/config/jest-def.config.ts +214 -0
  20. package/src/config/jest.setup.d.ts +1 -0
  21. package/src/config/jest.setup.js +10 -0
  22. package/src/config/jest.setup.js.map +1 -0
  23. package/src/config/jest.setup.ts +39 -0
  24. package/src/config/package.json +22 -0
  25. package/src/config/tsconfig.dev.json +3 -0
  26. package/src/config/tsconfig.json +9 -0
  27. package/src/gql-plugin.js +25 -0
  28. package/src/index.d.ts +2 -0
  29. package/src/index.js +6 -0
  30. package/src/index.js.map +1 -0
  31. package/src/index.ts +2 -0
  32. package/src/jest-conf.generator.d.ts +53 -0
  33. package/src/jest-conf.generator.js +193 -0
  34. package/src/jest-conf.generator.js.map +1 -0
  35. package/src/jest-conf.generator.ts +363 -0
  36. package/src/jest-def.config.d.ts +20 -0
  37. package/src/jest-def.config.js +151 -0
  38. package/src/jest-def.config.js.map +1 -0
  39. package/src/jest-def.config.ts +220 -0
  40. package/src/jest.setup.d.ts +1 -0
  41. package/src/jest.setup.js +26 -0
  42. package/src/jest.setup.js.map +1 -0
  43. package/src/jest.setup.ts +58 -0
  44. package/src/package.json +28 -0
  45. package/src/src/CHANGELOG.md +8 -0
  46. package/src/src/README.md +31 -0
  47. package/src/src/config/CHANGELOG.md +8 -0
  48. package/src/src/config/README.md +31 -0
  49. package/src/src/config/gql-plugin.js +25 -0
  50. package/src/src/config/index.d.ts +2 -0
  51. package/src/src/config/index.js +6 -0
  52. package/src/src/config/index.js.map +1 -0
  53. package/src/src/config/index.ts +2 -0
  54. package/src/src/config/jest-conf.generator.d.ts +53 -0
  55. package/src/src/config/jest-conf.generator.js +193 -0
  56. package/src/src/config/jest-conf.generator.js.map +1 -0
  57. package/src/src/config/jest-conf.generator.ts +368 -0
  58. package/src/src/config/jest-def.config.d.ts +20 -0
  59. package/src/src/config/jest-def.config.js +145 -0
  60. package/src/src/config/jest-def.config.js.map +1 -0
  61. package/src/src/config/jest-def.config.ts +214 -0
  62. package/src/src/config/jest.setup.d.ts +1 -0
  63. package/src/src/config/jest.setup.js +10 -0
  64. package/src/src/config/jest.setup.js.map +1 -0
  65. package/src/src/config/jest.setup.ts +39 -0
  66. package/src/src/config/package.json +22 -0
  67. package/src/src/config/tsconfig.dev.json +3 -0
  68. package/src/src/config/tsconfig.json +9 -0
  69. package/src/src/gql-plugin.js +25 -0
  70. package/src/src/index.d.ts +2 -0
  71. package/src/src/index.js +6 -0
  72. package/src/src/index.js.map +1 -0
  73. package/src/src/index.ts +2 -0
  74. package/src/src/jest-conf.generator.d.ts +53 -0
  75. package/src/src/jest-conf.generator.js +193 -0
  76. package/src/src/jest-conf.generator.js.map +1 -0
  77. package/src/src/jest-conf.generator.ts +363 -0
  78. package/src/src/jest-def.config.d.ts +20 -0
  79. package/src/src/jest-def.config.js +151 -0
  80. package/src/src/jest-def.config.js.map +1 -0
  81. package/src/src/jest-def.config.ts +220 -0
  82. package/src/src/jest.setup.d.ts +1 -0
  83. package/src/src/jest.setup.js +26 -0
  84. package/src/src/jest.setup.js.map +1 -0
  85. package/src/src/jest.setup.ts +58 -0
  86. package/src/src/package.json +28 -0
  87. package/src/src/tsconfig.dev.json +3 -0
  88. package/src/src/tsconfig.json +9 -0
  89. package/src/tsconfig.dev.json +3 -0
  90. package/src/tsconfig.json +9 -0
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createE2EConfig = void 0;
4
+ exports.jestConfGenerator = jestConfGenerator;
5
+ const tslib_1 = require("tslib");
6
+ const path = tslib_1.__importStar(require("path"));
7
+ const jest_def_config_1 = tslib_1.__importStar(require("./jest-def.config"));
8
+ const yargs_1 = tslib_1.__importDefault(require("yargs/yargs"));
9
+ const helpers_1 = require("yargs/helpers");
10
+ const maxWorkers = process.env.npm_config_jestworkers ||
11
+ process.env.JEST_WORKERS ||
12
+ '50%';
13
+ console.log(`Max workers: ${maxWorkers}`);
14
+ function jestConfGenerator(rootPath, projectList, appProjectsSettings, options) {
15
+ const createProjectSets = (projects) => {
16
+ const _projectSets = {};
17
+ for (const app in appProjectsSettings) {
18
+ _projectSets[app] = projects.filter((p) => appProjectsSettings[app].deps.some((v) => p.displayName.startsWith(`unit/${v.name}`)));
19
+ }
20
+ return {
21
+ ..._projectSets,
22
+ all: projects,
23
+ };
24
+ };
25
+ const cacheDirBase = '/tmp/jest_rs/';
26
+ let projects = [];
27
+ const confFactory = (projName, proj, _projects) => ({
28
+ ...(0, jest_def_config_1.default)(`${rootPath}/`, options.defaultConfOptions, (0, jest_def_config_1.tsJestConfig)(options.tsConfigPath?.(proj) ?? `${rootPath}/${proj.path}/tsconfig.json`, options.tsJestConfig)),
29
+ globals: (0, jest_def_config_1.globals)(),
30
+ displayName: `unit/${projName}`,
31
+ cacheDirectory: `${cacheDirBase}/unit/${projName}`,
32
+ rootDir: `${rootPath}/${proj.sourcePath}/`,
33
+ roots: [
34
+ `${rootPath}/${proj.path}`,
35
+ `${rootPath}/__mocks__`,
36
+ ],
37
+ setupFiles: [
38
+ `${__dirname}/jest.setup.js`,
39
+ ...(options.extraSetupFiles ?? []),
40
+ ],
41
+ coveragePathIgnorePatterns: jest_def_config_1.coveragePathIgnorePatterns,
42
+ });
43
+ for (const projName of Object.keys(projectList)) {
44
+ const proj = projectList[projName];
45
+ if (!options.skipProjects?.includes(projName) && !options.skipProjects?.includes(proj.path)) {
46
+ let conf = confFactory(projName, proj);
47
+ if (appProjectsSettings[projName]?.confOverride) {
48
+ conf = { ...conf, ...appProjectsSettings[projName].confOverride };
49
+ }
50
+ if (options.confOverrides) {
51
+ const overrideKey = Object.keys(options.confOverrides).find((v) => projName === v && v);
52
+ const overrideConf = overrideKey && options.confOverrides[overrideKey]
53
+ ? options.confOverrides[overrideKey]
54
+ : {};
55
+ conf = { ...conf, ...overrideConf };
56
+ }
57
+ projects.push(conf);
58
+ }
59
+ }
60
+ const projectSets = createProjectSets(projects);
61
+ const argv = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
62
+ .command('$0 [paths]', 'test paths', (yargs) => {
63
+ return yargs
64
+ .positional('path', {
65
+ describe: 'test path',
66
+ type: 'string',
67
+ coerce: (arg) => {
68
+ return arg.split(',');
69
+ },
70
+ })
71
+ .option('proj', {
72
+ describe: 'comma-separated project names',
73
+ type: 'string',
74
+ coerce: (arg) => {
75
+ return arg.split(',');
76
+ },
77
+ })
78
+ .option('paths', {
79
+ describe: 'comma-separated test paths',
80
+ type: 'string',
81
+ coerce: (arg) => {
82
+ return arg.split(',');
83
+ },
84
+ });
85
+ })
86
+ .showHelpOnFail(false)
87
+ .fail(() => {
88
+ }).argv;
89
+ const selectedProj = argv.proj || process.env.npm_config_projects?.split(',') || 'all';
90
+ projects = Array.isArray(selectedProj)
91
+ ? Object.values(projectSets)
92
+ .flat()
93
+ .filter((value) => {
94
+ return selectedProj.some((projName) => {
95
+ return value.displayName === `unit/${projName}`;
96
+ });
97
+ })
98
+ : projectSets[selectedProj];
99
+ const paths = [];
100
+ if (argv.path) {
101
+ paths.push(argv.path);
102
+ }
103
+ if (argv.paths) {
104
+ paths.push(...argv.paths);
105
+ }
106
+ const possiblePath = (paths.length > 0 ? paths : null) ??
107
+ argv.testPathPattern?.[0] ??
108
+ argv.coverage ??
109
+ '';
110
+ console.debug('possiblePaths', possiblePath);
111
+ let config = {};
112
+ function getSubprojectPath(testPath) {
113
+ let subProjectPath = testPath.startsWith('.')
114
+ ? testPath.slice(1)
115
+ : testPath;
116
+ subProjectPath = subProjectPath.startsWith(rootPath)
117
+ ? subProjectPath.slice(rootPath.length)
118
+ : subProjectPath;
119
+ subProjectPath = subProjectPath.startsWith('/')
120
+ ? subProjectPath
121
+ : `/${subProjectPath}`;
122
+ for (const proj of Object.values(projectList)) {
123
+ const root = proj.path;
124
+ if (testPath.startsWith(root) && subProjectPath.length < root.length) {
125
+ subProjectPath = `/${root}`;
126
+ }
127
+ }
128
+ const lastIndexOfSrc = subProjectPath.lastIndexOf(`/src/`);
129
+ if (lastIndexOfSrc >= 0)
130
+ subProjectPath = subProjectPath.substring(0, lastIndexOfSrc);
131
+ return subProjectPath;
132
+ }
133
+ let selectedProjects = [];
134
+ if (possiblePath === true) {
135
+ if (Array.isArray(selectedProj)) {
136
+ selectedProjects.push(...projects.filter((p) => selectedProj.some((projName) => p.displayName.startsWith(`unit/${projName}`))));
137
+ }
138
+ else {
139
+ selectedProjects = projects;
140
+ }
141
+ }
142
+ else {
143
+ const testPaths = Array.isArray(possiblePath)
144
+ ? possiblePath
145
+ : [possiblePath];
146
+ console.debug('testPaths', testPaths);
147
+ const subProjectPathList = testPaths.map((v) => getSubprojectPath(v));
148
+ selectedProjects = projects.filter((v) => subProjectPathList.some((subProjectPath) => v.rootDir.startsWith(`${rootPath}${subProjectPath}`)));
149
+ if (Array.isArray(selectedProj)) {
150
+ selectedProjects.push(...projects.filter((p) => selectedProj.some((projName) => p.displayName.startsWith(`unit/${projName}`))));
151
+ }
152
+ console.debug('Subproject path:', subProjectPathList ?? ['']);
153
+ }
154
+ console.debug('selectedProjects', selectedProjects.map((v) => v.displayName));
155
+ const coverageFolder = selectedProjects.length > 1 ? '' : selectedProj;
156
+ config = {
157
+ maxWorkers,
158
+ coverageReporters: ['json-summary', 'json', 'lcov', 'text', 'clover'],
159
+ rootDir: `${rootPath}`,
160
+ coverageThreshold: (0, jest_def_config_1.coverageThreshold)(selectedProjects, options.defaultCoverageThreshold),
161
+ coverageDirectory: path.join(rootPath, options.coverageOutputPath?.(coverageFolder) ??
162
+ `var/coverage/${coverageFolder}`),
163
+ collectCoverageFrom: [
164
+ `**/*.ts`,
165
+ `!**/*.d.ts`,
166
+ '!**/node_modules/**',
167
+ '!**/.warmup/**',
168
+ ],
169
+ };
170
+ config.projects = selectedProjects;
171
+ return config;
172
+ }
173
+ const createE2EConfig = (options) => {
174
+ let conf = {
175
+ ...(0, jest_def_config_1.default)(`${options.rootDirname}`, options.defaultConfOptions, (0, jest_def_config_1.tsJestConfigE2E)(path.resolve(`${options.e2eDirname}/tsconfig.json`), options.withGqlPlugins ?? false, options.tsJestConfig)),
176
+ testRegex: '.*\\.e2e-spec\\.ts$',
177
+ setupFilesAfterEnv: [`${options.e2eDirname}/jest.e2e-setup.ts`],
178
+ roots: [`${options.e2eDirname}`],
179
+ bail: 1,
180
+ };
181
+ if (options.alias) {
182
+ conf.displayName = `e2e/${options.alias}`;
183
+ }
184
+ if (options.confOverride) {
185
+ conf = {
186
+ ...conf,
187
+ ...options.confOverride,
188
+ };
189
+ }
190
+ return conf;
191
+ };
192
+ exports.createE2EConfig = createE2EConfig;
193
+ //# sourceMappingURL=jest-conf.generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jest-conf.generator.js","sourceRoot":"","sources":["jest-conf.generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,363 @@
1
+ /* istanbul ignore file */
2
+
3
+ import * as path from 'path';
4
+
5
+ import type { JestConfigWithTsJest } from 'ts-jest';
6
+ import defaultConf, {
7
+ coveragePathIgnorePatterns,
8
+ globals,
9
+ coverageThreshold,
10
+ IDefaultConfOptions,
11
+ tsJestConfig,
12
+ tsJestConfigE2E,
13
+ } from './jest-def.config';
14
+ // import { options as jestOptionObject } from 'jest-cli/build/cli/args';
15
+ import yargs from 'yargs/yargs';
16
+ import { hideBin } from 'yargs/helpers';
17
+
18
+ interface IAppDep {
19
+ name: string;
20
+ path: string;
21
+ }
22
+ export interface IAppProjSetting {
23
+ confOverride?: any;
24
+ deps: IAppDep[];
25
+ }
26
+
27
+ export interface IProjectInfo {
28
+ path: string;
29
+ sourcePath: string;
30
+ type: 'library' | 'application' | string;
31
+ }
32
+
33
+ export interface IOptions {
34
+ skipProjects?: string[];
35
+ /**
36
+ * key: project name
37
+ * value: jest configurations
38
+ */
39
+ confOverrides?: { [key: string]: any };
40
+ defaultCoverageThreshold?: {
41
+ branches: number;
42
+ functions: number;
43
+ lines: number;
44
+ statements: number;
45
+ };
46
+ tsConfigPath?: { (proj: IProjectInfo): string };
47
+ coverageOutputPath?: { (subProjectPath: string): string };
48
+ defaultConfOptions?: IDefaultConfOptions;
49
+ tsJestConfig?: any;
50
+ extraSetupFiles?: string[];
51
+ setupFilesAfterEnv?: string[];
52
+ }
53
+
54
+ // considering our heap consumption (~300-700mb), 5 workers will consume around 3GB of ram
55
+ // if you want to increase/decrease this value, you can set the npm_config_jestworkers:
56
+ // * npm < 9 -> with the `npm config set` command (more info: https://docs.npmjs.com/cli/v7/commands/npm-config)
57
+ // * npm >= 9 -> with: export JEST_WORKERS=5
58
+ const maxWorkers =
59
+ process.env.npm_config_jestworkers ||
60
+ process.env.JEST_WORKERS ||
61
+ '50%';
62
+
63
+ // eslint-disable-next-line no-console
64
+ console.log(`Max workers: ${maxWorkers}`);
65
+
66
+ export function jestConfGenerator(
67
+ rootPath: string,
68
+ projectList: { [key: string]: IProjectInfo },
69
+ appProjectsSettings: {
70
+ [key: string]: IAppProjSetting;
71
+ },
72
+ options: IOptions,
73
+ ): JestConfigWithTsJest {
74
+ const createProjectSets = (projects: any[]) => {
75
+ const _projectSets: { [key: string]: any } = {};
76
+ for (const app in appProjectsSettings) {
77
+ _projectSets[app] = projects.filter((p) =>
78
+ appProjectsSettings[app].deps.some((v) =>
79
+ p.displayName.startsWith(`unit/${v.name}`),
80
+ ),
81
+ );
82
+ }
83
+
84
+ return {
85
+ ..._projectSets,
86
+ all: projects,
87
+ };
88
+ };
89
+
90
+ const cacheDirBase = '/tmp/jest_rs/';
91
+
92
+ let projects = [];
93
+
94
+ const confFactory = (
95
+ projName: string,
96
+ proj: IProjectInfo,
97
+ _projects?: any,
98
+ ) => ({
99
+ ...defaultConf(
100
+ `${rootPath}/`,
101
+ options.defaultConfOptions,
102
+ tsJestConfig(
103
+ options.tsConfigPath?.(proj) ?? `${rootPath}/${proj.path}/tsconfig.json`,
104
+ options.tsJestConfig,
105
+ ),
106
+ ),
107
+ globals: globals(),
108
+ // name: `unit/${projName}`,
109
+ displayName: `unit/${projName}`,
110
+ cacheDirectory: `${cacheDirBase}/unit/${projName}`,
111
+ rootDir: `${rootPath}/${proj.sourcePath}/`,
112
+ roots: [
113
+ `${rootPath}/${proj.path}`,
114
+ `${rootPath}/__mocks__`,
115
+ ],
116
+ setupFiles: [
117
+ `${__dirname}/jest.setup.js`,
118
+ ...(options.extraSetupFiles ?? []),
119
+ ],
120
+ coveragePathIgnorePatterns,
121
+ });
122
+
123
+ for (const projName of Object.keys(projectList)) {
124
+ const proj = projectList[projName];
125
+ if (!options.skipProjects?.includes(projName) && !options.skipProjects?.includes(proj.path)) {
126
+ let conf = confFactory(projName, proj);
127
+
128
+ if (appProjectsSettings[projName]?.confOverride) {
129
+ conf = { ...conf, ...appProjectsSettings[projName].confOverride };
130
+ }
131
+
132
+ if (options.confOverrides) {
133
+ const overrideKey = Object.keys(options.confOverrides).find(
134
+ (v) => projName === v && v,
135
+ );
136
+
137
+ const overrideConf =
138
+ overrideKey && options.confOverrides[overrideKey]
139
+ ? options.confOverrides[overrideKey]
140
+ : {};
141
+
142
+ conf = { ...conf, ...overrideConf };
143
+ }
144
+
145
+ projects.push(conf);
146
+ }
147
+ }
148
+
149
+ const projectSets: { [key: string]: any } = createProjectSets(projects);
150
+
151
+ // use argv to catch the path argument in any position
152
+ const argv: any = yargs(hideBin(process.argv))
153
+ .command('$0 [paths]', 'test paths', (yargs) => {
154
+ return yargs
155
+ .positional('path', {
156
+ describe: 'test path',
157
+ type: 'string',
158
+ coerce: (arg: string): string[] => {
159
+ return arg.split(',');
160
+ },
161
+ })
162
+ .option('proj', {
163
+ describe: 'comma-separated project names',
164
+ type: 'string',
165
+ coerce: (arg: string): string[] => {
166
+ return arg.split(',');
167
+ },
168
+ })
169
+ .option('paths', {
170
+ describe: 'comma-separated test paths',
171
+ type: 'string',
172
+ coerce: (arg: string): string[] => {
173
+ return arg.split(',');
174
+ },
175
+ });
176
+ })
177
+ .showHelpOnFail(false)
178
+ // .options(jestOptionObject)
179
+ .fail(() => {
180
+ // nothing to do
181
+ }).argv;
182
+
183
+ const selectedProj =
184
+ argv.proj || process.env.npm_config_projects?.split(',') || 'all';
185
+
186
+ projects = Array.isArray(selectedProj)
187
+ ? Object.values(projectSets)
188
+ .flat()
189
+ .filter((value) => {
190
+ return selectedProj.some((projName) => {
191
+ return value.displayName === `unit/${projName}`;
192
+ });
193
+ })
194
+ : projectSets[selectedProj];
195
+
196
+ const paths = [];
197
+
198
+ if (argv.path) {
199
+ paths.push(argv.path);
200
+ }
201
+
202
+ if (argv.paths) {
203
+ paths.push(...argv.paths);
204
+ }
205
+
206
+ const possiblePath =
207
+ (paths.length > 0 ? paths : null) ??
208
+ argv.testPathPattern?.[0] ??
209
+ argv.coverage ??
210
+ '';
211
+
212
+ // eslint-disable-next-line no-console
213
+ console.debug('possiblePaths', possiblePath);
214
+
215
+ let config: any = {};
216
+
217
+ function getSubprojectPath(testPath: string) {
218
+ // "." must be converted to "/"
219
+ let subProjectPath = testPath.startsWith('.')
220
+ ? testPath.slice(1)
221
+ : testPath;
222
+ subProjectPath = subProjectPath.startsWith(rootPath)
223
+ ? subProjectPath.slice(rootPath.length)
224
+ : subProjectPath;
225
+ // we always need "/" at the beginning of the string
226
+ subProjectPath = subProjectPath.startsWith('/')
227
+ ? subProjectPath
228
+ : `/${subProjectPath}`;
229
+
230
+ // get the project which prefix is closest to testPath
231
+ // to apply the correct path for coverage etc.
232
+ for (const proj of Object.values(projectList)) {
233
+ const root: string = proj.path;
234
+ if (testPath.startsWith(root) && subProjectPath.length < root.length) {
235
+ subProjectPath = `/${root}`;
236
+ }
237
+ }
238
+
239
+ const lastIndexOfSrc = subProjectPath.lastIndexOf(`/src/`);
240
+ if (lastIndexOfSrc >= 0)
241
+ subProjectPath = subProjectPath.substring(0, lastIndexOfSrc);
242
+
243
+ return subProjectPath;
244
+ }
245
+
246
+ let selectedProjects: any[] = [];
247
+ if (possiblePath === true) {
248
+ if (Array.isArray(selectedProj)) {
249
+ selectedProjects.push(
250
+ ...projects.filter((p: any) =>
251
+ selectedProj.some((projName) =>
252
+ p.displayName.startsWith(`unit/${projName}`),
253
+ ),
254
+ ),
255
+ );
256
+ } else {
257
+ selectedProjects = projects;
258
+ }
259
+ } else {
260
+ const testPaths: string[] = Array.isArray(possiblePath)
261
+ ? possiblePath
262
+ : [possiblePath];
263
+
264
+ // eslint-disable-next-line no-console
265
+ console.debug('testPaths', testPaths);
266
+ const subProjectPathList = testPaths.map((v) => getSubprojectPath(v));
267
+
268
+ selectedProjects = projects.filter((v: any) =>
269
+ subProjectPathList.some((subProjectPath) =>
270
+ v.rootDir.startsWith(`${rootPath}${subProjectPath}`),
271
+ ),
272
+ );
273
+
274
+ if (Array.isArray(selectedProj)) {
275
+ selectedProjects.push(
276
+ ...projects.filter((p: any) =>
277
+ selectedProj.some((projName) =>
278
+ p.displayName.startsWith(`unit/${projName}`),
279
+ ),
280
+ ),
281
+ );
282
+ }
283
+
284
+ // eslint-disable-next-line no-console
285
+ console.debug('Subproject path:', subProjectPathList ?? ['']);
286
+ }
287
+
288
+ // eslint-disable-next-line no-console
289
+ console.debug(
290
+ 'selectedProjects',
291
+ selectedProjects.map((v: any) => v.displayName),
292
+ );
293
+
294
+ // we can still support specific coverage output path when only one project is selected
295
+ const coverageFolder = selectedProjects.length > 1 ? '' : selectedProj;
296
+
297
+ config = {
298
+ maxWorkers,
299
+ coverageReporters: ['json-summary', 'json', 'lcov', 'text', 'clover'],
300
+ rootDir: `${rootPath}`,
301
+ coverageThreshold: coverageThreshold(
302
+ selectedProjects,
303
+ options.defaultCoverageThreshold,
304
+ ),
305
+ coverageDirectory: path.join(
306
+ rootPath,
307
+ options.coverageOutputPath?.(coverageFolder) ??
308
+ `var/coverage/${coverageFolder}`,
309
+ ),
310
+ collectCoverageFrom: [
311
+ `**/*.ts`,
312
+ `!**/*.d.ts`,
313
+ '!**/node_modules/**',
314
+ '!**/.warmup/**',
315
+ ],
316
+ };
317
+
318
+ config.projects = selectedProjects;
319
+
320
+ return config;
321
+ }
322
+
323
+ export interface E2EOptions {
324
+ alias?: string;
325
+ e2eDirname: string;
326
+ rootDirname: string;
327
+ defaultConfOptions?: IDefaultConfOptions;
328
+ confOverride?: JestConfigWithTsJest;
329
+ withGqlPlugins?: boolean;
330
+ tsJestConfig?: any;
331
+ }
332
+
333
+ export const createE2EConfig = (options: E2EOptions): JestConfigWithTsJest => {
334
+ let conf: JestConfigWithTsJest = {
335
+ ...defaultConf(
336
+ `${options.rootDirname}`,
337
+ options.defaultConfOptions,
338
+ tsJestConfigE2E(
339
+ path.resolve(`${options.e2eDirname}/tsconfig.json`),
340
+ options.withGqlPlugins ?? false,
341
+ options.tsJestConfig,
342
+ ),
343
+ ),
344
+ testRegex: '.*\\.e2e-spec\\.ts$',
345
+ setupFilesAfterEnv: [`${options.e2eDirname}/jest.e2e-setup.ts`],
346
+ roots: [`${options.e2eDirname}`],
347
+ bail: 1,
348
+ };
349
+
350
+ if (options.alias) {
351
+ conf.displayName = `e2e/${options.alias}`;
352
+ // conf.name = `e2e/${options.alias}`;
353
+ }
354
+
355
+ if (options.confOverride) {
356
+ conf = {
357
+ ...conf,
358
+ ...options.confOverride,
359
+ };
360
+ }
361
+
362
+ return conf;
363
+ };
@@ -0,0 +1,20 @@
1
+ import type { JestConfigWithTsJest } from 'ts-jest';
2
+ export declare const coveragePathIgnorePatterns: string[];
3
+ export declare const globals: () => {
4
+ __JEST_DISABLE_DB: boolean;
5
+ };
6
+ export declare const tsJestConfigE2E: (tsConfPath?: string, withGqlPlugin?: boolean, overrideTsJestConfig?: any) => any;
7
+ export declare const tsJestConfig: (tsConfPath?: string, overrideTsJestConfig?: any) => any;
8
+ export declare const coverageThreshold: (projects?: any[], defaultCoverageThreshold?: {
9
+ branches: number;
10
+ functions: number;
11
+ lines: number;
12
+ statements: number;
13
+ }) => Record<string, any>;
14
+ export interface IDefaultConfOptions {
15
+ transformEsModules?: string[] | boolean;
16
+ tsJestConf?: any;
17
+ jestConf?: any;
18
+ }
19
+ declare const defaultConf: (dirname: string, options?: IDefaultConfOptions, _tsJestConfig?: any) => JestConfigWithTsJest;
20
+ export default defaultConf;