@teambit/jest 1.0.107 → 1.0.108
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/calc-root-dir.ts +15 -0
- package/dist/error.d.ts +2 -2
- package/dist/jest.composition.d.ts +2 -2
- package/dist/jest.tester.d.ts +2 -2
- package/dist/jest.tester.js +4 -6
- package/dist/jest.tester.js.map +1 -1
- package/dist/jest.worker.js.map +1 -1
- package/dist/{preview-1703590665075.js → preview-1703647408454.js} +2 -2
- package/dist/watch.d.ts +1 -1
- package/dist/watch.js +1 -1
- package/dist/watch.js.map +1 -1
- package/error.ts +9 -0
- package/index.ts +3 -0
- package/jest.aspect.ts +5 -0
- package/jest.main.runtime.ts +27 -0
- package/jest.tester.ts +327 -0
- package/jest.worker.ts +80 -0
- package/package.json +17 -24
- package/tsconfig.json +16 -21
- package/types/asset.d.ts +15 -3
- package/watch.ts +61 -0
package/calc-root-dir.ts
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
import { compact } from 'lodash';
|
2
|
+
import { join, sep } from 'path';
|
3
|
+
|
4
|
+
export function getRootDirFromConfigPath(configPath: string): string {
|
5
|
+
const splitted = configPath.split('node_modules');
|
6
|
+
const last = splitted[splitted.length - 1];
|
7
|
+
const lastSplitted = compact(last.split(sep));
|
8
|
+
let lastModule = lastSplitted[0];
|
9
|
+
if (lastSplitted[0].startsWith('@')) {
|
10
|
+
lastModule = join(lastSplitted[0], lastSplitted[1]);
|
11
|
+
}
|
12
|
+
splitted[splitted.length - 1] = `${sep}${lastModule}`;
|
13
|
+
const final = splitted.join('node_modules');
|
14
|
+
return final;
|
15
|
+
}
|
package/dist/error.d.ts
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
export declare class JestError extends Error {
|
2
2
|
readonly code?: unknown;
|
3
|
-
readonly type?: string
|
4
|
-
constructor(message: string, stack?: string | null, code?: unknown, type?: string
|
3
|
+
readonly type?: string;
|
4
|
+
constructor(message: string, stack?: string | null, code?: unknown, type?: string);
|
5
5
|
get stack(): any;
|
6
6
|
}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
|
2
|
-
export declare const Logo: () =>
|
1
|
+
/// <reference types="react" />
|
2
|
+
export declare const Logo: () => JSX.Element;
|
package/dist/jest.tester.d.ts
CHANGED
@@ -3,7 +3,7 @@ import { HarmonyWorker } from '@teambit/worker';
|
|
3
3
|
import { Tester, CallbackFn, TesterContext, Tests } from '@teambit/tester';
|
4
4
|
import { Component } from '@teambit/component';
|
5
5
|
import type { JestWorker } from './jest.worker';
|
6
|
-
export
|
6
|
+
export type JestTesterOptions = {
|
7
7
|
/**
|
8
8
|
* array of patterns to test. (override the patterns provided by the context)
|
9
9
|
*/
|
@@ -32,7 +32,7 @@ export declare class JestTester implements Tester {
|
|
32
32
|
displayName: string;
|
33
33
|
_callback: CallbackFn | undefined;
|
34
34
|
displayConfig(): string;
|
35
|
-
version():
|
35
|
+
version(): any;
|
36
36
|
private attachTestsToComponent;
|
37
37
|
private buildTestsObj;
|
38
38
|
private getErrors;
|
package/dist/jest.tester.js
CHANGED
@@ -121,7 +121,7 @@ class JestTester {
|
|
121
121
|
buildTestsObj(aggregatedResult, components, testerContext, config) {
|
122
122
|
const testsSuiteResult = components.toArray().map(([component, testsFiles]) => {
|
123
123
|
if (!testsFiles) return undefined;
|
124
|
-
if (
|
124
|
+
if (testsFiles?.length === 0) return undefined;
|
125
125
|
const errors = this.getErrors(testsFiles);
|
126
126
|
const tests = testsFiles.map(test => {
|
127
127
|
const file = new (_sources().AbstractVinyl)({
|
@@ -135,9 +135,8 @@ class JestTester {
|
|
135
135
|
const isFailure = testResult.status === 'failed';
|
136
136
|
return new (_testsResults().TestResult)(testResult.ancestorTitles, testResult.title, testResult.status, testResult.duration, isFailure ? undefined : error, isFailure ? error : undefined);
|
137
137
|
});
|
138
|
-
const filePath =
|
138
|
+
const filePath = file?.basename || test.testFilePath;
|
139
139
|
const getError = () => {
|
140
|
-
var _test$testExecError, _test$testExecError2;
|
141
140
|
if (!test.testExecError) return undefined;
|
142
141
|
if (testerContext.watch) {
|
143
142
|
// for some reason, during watch ('bit start'), if a file has an error, the `test.testExecError` is `{}`
|
@@ -145,7 +144,7 @@ class JestTester {
|
|
145
144
|
// @todo: consider to always use the failureMessage, regardless the context.watch.
|
146
145
|
return new (_error().JestError)(test.failureMessage);
|
147
146
|
}
|
148
|
-
return new (_error().JestError)(
|
147
|
+
return new (_error().JestError)(test.testExecError?.message, test.testExecError?.stack);
|
149
148
|
};
|
150
149
|
const error = getError();
|
151
150
|
return new (_testsResults().TestsFiles)(filePath, testResults, test.numPassingTests, test.numFailingTests, test.numPendingTests, test.perfStats.runtime, test.perfStats.slow, error);
|
@@ -238,7 +237,6 @@ class JestTester {
|
|
238
237
|
async watch(context) {
|
239
238
|
// eslint-disable-next-line
|
240
239
|
return new Promise(async resolve => {
|
241
|
-
var _context$envRuntime$e;
|
242
240
|
const workerApi = this.jestWorker.initiate(context.ui ? {
|
243
241
|
stdout: true,
|
244
242
|
stderr: true,
|
@@ -251,7 +249,7 @@ class JestTester {
|
|
251
249
|
|
252
250
|
// eslint-disable-next-line
|
253
251
|
const jestConfig = require(this.jestConfig);
|
254
|
-
const envRootDir =
|
252
|
+
const envRootDir = context.envRuntime.envAspectDefinition?.aspectPath;
|
255
253
|
if (!envRootDir) {
|
256
254
|
this.logger.warn(`jest tester, envRootDir is not defined, for env ${context.envRuntime.id}`);
|
257
255
|
}
|
package/dist/jest.tester.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_path","data","require","_fsExtra","_minimatch","_interopRequireDefault","_lodash","_comlink","_tester","_testsResults","_jestMessageUtil","_component","_sources","_error","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","t","i","_toPrimitive","String","r","e","Symbol","toPrimitive","call","TypeError","Number","JestTester","constructor","id","jestConfig","jestModulePath","jestWorker","logger","opts","jestModule","displayConfig","readFileSync","version","getVersion","attachTestsToComponent","testerContext","testResult","ComponentMap","as","components","component","componentPatternValue","patterns","get","undefined","currComponent","patternEntry","resolvedPatterns","resolveComponentPattern","filter","test","resolvedPattern","minimatch","testFilePath","length","buildTestsObj","aggregatedResult","config","testsSuiteResult","toArray","map","testsFiles","errors","getErrors","tests","file","AbstractVinyl","path","contents","testResults","error","formatResultsErrors","noStackTrace","isFailure","status","TestResult","ancestorTitles","title","duration","filePath","basename","getError","_test$testExecError","_test$testExecError2","testExecError","watch","JestError","failureMessage","message","stack","TestsFiles","numPassingTests","numFailingTests","numPendingTests","perfStats","runtime","slow","componentId","results","TestsResult","success","startTime","compact","reduce","code","type","push","onTestRunComplete","callback","_callback","context","rootDir","rootPath","roots","console","warn","debug","runInBand","coverage","watchAll","noCache","jestConfigWithSpecs","assign","testMatch","patternsToArray","withEnv","testsOutPut","runCLI","componentsWithTests","componentTestResults","Tests","Promise","resolve","_context$envRuntime$e","workerApi","initiate","ui","stdout","stderr","stdin","envRootDir","envRuntime","envAspectDefinition","aspectPath","cbFn","proxy","globalErrors","watchTestResults","loading","onTestComplete","err","flatten","resolveSpecPaths","customPatterns","isEmpty","customPattern","rootDirs","componentDir","resolvePattern","paths","p","pattern","dir","exports"],"sources":["jest.tester.ts"],"sourcesContent":["import { resolve } from 'path';\nimport { readFileSync } from 'fs-extra';\nimport minimatch from 'minimatch';\nimport { compact, flatten, isEmpty } from 'lodash';\nimport { proxy } from 'comlink';\nimport { Logger } from '@teambit/logger';\nimport { HarmonyWorker } from '@teambit/worker';\nimport { Tester, CallbackFn, TesterContext, Tests, ComponentsResults, ComponentPatternsEntry } from '@teambit/tester';\nimport { TestsFiles, TestResult, TestsResult } from '@teambit/tests-results';\nimport { TestResult as JestTestResult, AggregatedResult } from '@jest/test-result';\nimport { formatResultsErrors } from 'jest-message-util';\nimport { Component, ComponentMap } from '@teambit/component';\nimport { AbstractVinyl } from '@teambit/legacy/dist/consumer/component/sources';\n// import { Environment } from '@teambit/envs';\n// import { EnvPolicyConfigObject, PeersAutoDetectPolicy } from '@teambit/dependency-resolver';\nimport type jest from 'jest';\nimport { JestError } from './error';\nimport type { JestWorker } from './jest.worker';\n\nexport type JestTesterOptions = {\n /**\n * array of patterns to test. (override the patterns provided by the context)\n */\n patterns?: string[];\n\n /**\n * add more root paths to look for tests.\n */\n roots?: string[];\n\n /**\n * A function that knows to resolve the paths of the spec files.\n * This usually used when you want only subset of your spec files to be used\n * (usually when you use multi tester with different specs files for each tester instance).\n */\n resolveSpecPaths?: (component: Component, context: TesterContext) => string[];\n};\n\nexport class JestTester implements Tester {\n private readonly jestModule: typeof jest;\n\n constructor(\n readonly id: string,\n readonly jestConfig: any,\n private jestModulePath: string,\n private jestWorker: HarmonyWorker<JestWorker>,\n private logger: Logger,\n private opts: JestTesterOptions = {}\n ) {\n // eslint-disable-next-line global-require,import/no-dynamic-require\n this.jestModule = require(jestModulePath);\n }\n\n configPath = this.jestConfig;\n\n displayName = 'Jest';\n\n _callback: CallbackFn | undefined;\n\n displayConfig() {\n return readFileSync(this.jestConfig, 'utf8');\n }\n\n version() {\n return this.jestModule.getVersion();\n }\n\n private attachTestsToComponent(testerContext: TesterContext, testResult: JestTestResult[]) {\n return ComponentMap.as(testerContext.components, (component) => {\n const componentPatternValue = testerContext.patterns.get(component);\n if (!componentPatternValue) return undefined;\n const [currComponent, patternEntry] = componentPatternValue;\n const resolvedPatterns = this.resolveComponentPattern(currComponent, patternEntry, testerContext);\n return testResult.filter((test) => {\n return resolvedPatterns.filter((resolvedPattern) => minimatch(test.testFilePath, resolvedPattern)).length > 0;\n });\n });\n }\n\n private buildTestsObj(\n aggregatedResult: AggregatedResult,\n components: ComponentMap<JestTestResult[] | undefined>,\n testerContext: TesterContext,\n config?: any\n ): ComponentsResults[] {\n const testsSuiteResult = components.toArray().map(([component, testsFiles]) => {\n if (!testsFiles) return undefined;\n if (testsFiles?.length === 0) return undefined;\n const errors = this.getErrors(testsFiles);\n const tests = testsFiles.map((test) => {\n const file = new AbstractVinyl({ path: test.testFilePath, contents: readFileSync(test.testFilePath) });\n const testResults = test.testResults.map((testResult) => {\n const error = formatResultsErrors([testResult], config, { noStackTrace: true }) || undefined;\n const isFailure = testResult.status === 'failed';\n return new TestResult(\n testResult.ancestorTitles,\n testResult.title,\n testResult.status,\n testResult.duration,\n isFailure ? undefined : error,\n isFailure ? error : undefined\n );\n });\n const filePath = file?.basename || test.testFilePath;\n const getError = () => {\n if (!test.testExecError) return undefined;\n if (testerContext.watch) {\n // for some reason, during watch ('bit start'), if a file has an error, the `test.testExecError` is `{}`\n // (an empty object). the failureMessage contains the stringified error.\n // @todo: consider to always use the failureMessage, regardless the context.watch.\n return new JestError(test.failureMessage as string);\n }\n return new JestError(test.testExecError?.message, test.testExecError?.stack);\n };\n const error = getError();\n return new TestsFiles(\n filePath,\n testResults,\n test.numPassingTests,\n test.numFailingTests,\n test.numPendingTests,\n test.perfStats.runtime,\n test.perfStats.slow,\n error\n );\n });\n return {\n componentId: component.id,\n results: new TestsResult(tests, aggregatedResult.success, aggregatedResult.startTime),\n errors,\n };\n });\n\n return compact(testsSuiteResult);\n }\n\n private getErrors(testResult: JestTestResult[]): JestError[] {\n return testResult.reduce((errors: JestError[], test) => {\n if (test.testExecError) {\n const { message, stack, code, type } = test.testExecError;\n errors.push(new JestError(message, stack, code, type));\n } else if (test.failureMessage) {\n errors.push(new JestError(test.failureMessage));\n }\n return errors;\n }, []);\n }\n\n async onTestRunComplete(callback: CallbackFn) {\n this._callback = callback;\n }\n\n async test(context: TesterContext): Promise<Tests> {\n // const envRootDir = context.envRuntime.envAspectDefinition.aspectPath;\n\n const config: any = {\n // Setting the rootDir to the env root dir to make sure we can resolve all the jest presets/plugins\n // from the env context\n // rootDir: envRootDir,\n // TODO: set it to envRootDir and make sure we can make the --coverage to work\n // with the current value as context.rootPath it will probably won't work correctly when using rootComponents:true (maybe even won't work at all)\n // TODO: when changing to envRootDir we have some issues with the react-native tests. so once changed again, it needs to be validated.\n rootDir: context.rootPath,\n // Setting the roots (where to search for spec files) to the root path (either workspace or capsule root)\n // TODO: consider change this to be an array of the components running dir.\n // TODO: aka: in the workspace it will be something like <ws>/node_modules/<comp-package-name>/node_modules/<comp-package-name>\n // TODO: see dependencyResolver.getRuntimeModulePath (this will make sure the peer deps resolved correctly)\n // TODO: (@GiladShoham - when trying to set it to this paths, jest ignores it probably because the paths contains \"node_modules\"\n // TODO: trying to set the https://jestjs.io/docs/27.x/configuration#testpathignorepatterns-arraystring to something else (as it contain node_modules by default)\n // TODO: didn't help)\n roots: [context.rootPath],\n };\n\n // eslint-disable-next-line no-console\n console.warn = (message: string) => {\n this.logger.warn(message);\n };\n\n if (context.debug) {\n config.debug = true;\n config.runInBand = true;\n }\n if (context.coverage) config.coverage = true;\n config.runInBand = true;\n\n if (context.watch) {\n config.watchAll = true;\n config.noCache = true;\n }\n // eslint-disable-next-line global-require,import/no-dynamic-require\n const jestConfig = require(this.jestConfig);\n\n // TODO: rollback this for now, as it makes issues.\n // TODO: it's mostly relevant for when the root components feature is enabled.\n // TODO: we might want to enable it only on that case (along with setting the env root dir as the root dir, above)\n // const moduleNameMapper = await this.calculateModuleNameMapper(\n // context.env,\n // context.rootPath,\n // context.additionalHostDependencies\n // );\n // jestConfig.moduleNameMapper = Object.assign({}, jestConfig.moduleNameMapper || {}, moduleNameMapper);\n\n const jestConfigWithSpecs = Object.assign(jestConfig, {\n testMatch: this.patternsToArray(context),\n });\n\n const withEnv = Object.assign(jestConfigWithSpecs, config);\n\n const testsOutPut = await this.jestModule.runCLI(withEnv, [this.jestConfig]);\n const testResults = testsOutPut.results.testResults;\n const componentsWithTests = this.attachTestsToComponent(context, testResults);\n const componentTestResults = this.buildTestsObj(\n testsOutPut.results,\n componentsWithTests,\n context,\n jestConfigWithSpecs\n );\n return new Tests(componentTestResults);\n }\n\n async watch(context: TesterContext): Promise<Tests> {\n // eslint-disable-next-line\n return new Promise(async (resolve) => {\n const workerApi = this.jestWorker.initiate(\n context.ui ? { stdout: true, stderr: true, stdin: true } : { stdout: false, stderr: false, stdin: false }\n );\n\n // eslint-disable-next-line\n const jestConfig = require(this.jestConfig);\n\n const envRootDir = context.envRuntime.envAspectDefinition?.aspectPath;\n if (!envRootDir) {\n this.logger.warn(`jest tester, envRootDir is not defined, for env ${context.envRuntime.id}`);\n }\n\n const jestConfigWithSpecs = Object.assign(jestConfig, {\n testMatch: this.patternsToArray(context),\n });\n\n try {\n const cbFn = proxy((results) => {\n if (!this._callback) return;\n const testResults = results.testResults;\n const componentsWithTests = this.attachTestsToComponent(context, testResults);\n const componentTestResults = this.buildTestsObj(results, componentsWithTests, context, jestConfigWithSpecs);\n const globalErrors = this.getErrors(testResults);\n const watchTestResults = {\n loading: false,\n errors: globalErrors,\n components: componentTestResults,\n };\n this._callback(watchTestResults);\n resolve(watchTestResults);\n });\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n await workerApi.onTestComplete(cbFn);\n\n await workerApi.watch(\n this.jestConfig,\n this.patternsToArray(context),\n context.rootPath,\n this.jestModulePath,\n envRootDir\n );\n } catch (err: any) {\n this.logger.error('jest.tester.watch() caught an error', err);\n }\n });\n }\n\n // private async calculateModuleNameMapper(\n // env: Environment,\n // rootPath: string,\n // additionalHostDependencies?: string[]\n // ): Promise<Record<string, Array<string>>> {\n // const peerDepsConfig: EnvPolicyConfigObject = await env.getDependencies();\n // const peersAutoDetectPolicy = new PeersAutoDetectPolicy(peerDepsConfig.peers || []);\n // const peers = Object.keys(peerDepsConfig.peerDependencies || {}).concat(peersAutoDetectPolicy?.names);\n // const depsToMap = peers.concat(additionalHostDependencies || []);\n\n // /**\n // * Try to resolve the dependency from the rootDir (the env dir) or from the root path (workspace/capsule root)\n // */\n // const mappedValues = ['<rootDir>/node_modules/$1', `${rootPath}/node_modules/$1`];\n\n // const moduleNameMapper = depsToMap.reduce((acc, peerName) => {\n // const keyName = `^(${peerName})$`;\n // acc[keyName] = mappedValues;\n // const internalPathKeyName = `^(${peerName}/.*)$`;\n // acc[internalPathKeyName] = mappedValues;\n // return acc;\n // }, {});\n\n // return moduleNameMapper;\n // }\n\n private patternsToArray(context: TesterContext): string[] {\n return flatten(\n context.patterns.toArray().map(([component, patternEntry]) => {\n return this.resolveComponentPattern(component, patternEntry, context);\n })\n );\n }\n\n private resolveComponentPattern(\n component: Component,\n patternEntry: ComponentPatternsEntry,\n context: TesterContext\n ): string[] {\n if (this.opts.resolveSpecPaths) {\n return this.opts.resolveSpecPaths(component, context);\n }\n const customPatterns = this.opts.patterns;\n // If pattern were provided to the specific instance of the tester, use them\n if (customPatterns && !isEmpty(customPatterns)) {\n customPatterns.map((customPattern) => {\n const rootDirs = this.opts.roots || [patternEntry.componentDir];\n return this.resolvePattern(customPattern, rootDirs);\n });\n }\n return patternEntry.paths.map((p) => p.path);\n }\n\n private resolvePattern(pattern: string, rootDirs: string[]) {\n return rootDirs.map((dir) => resolve(dir, pattern));\n }\n}\n"],"mappings":"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"}
|
1
|
+
{"version":3,"names":["_path","data","require","_fsExtra","_minimatch","_interopRequireDefault","_lodash","_comlink","_tester","_testsResults","_jestMessageUtil","_component","_sources","_error","obj","__esModule","default","_defineProperty","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","t","i","_toPrimitive","String","r","e","Symbol","toPrimitive","call","TypeError","Number","JestTester","constructor","id","jestConfig","jestModulePath","jestWorker","logger","opts","jestModule","displayConfig","readFileSync","version","getVersion","attachTestsToComponent","testerContext","testResult","ComponentMap","as","components","component","componentPatternValue","patterns","get","undefined","currComponent","patternEntry","resolvedPatterns","resolveComponentPattern","filter","test","resolvedPattern","minimatch","testFilePath","length","buildTestsObj","aggregatedResult","config","testsSuiteResult","toArray","map","testsFiles","errors","getErrors","tests","file","AbstractVinyl","path","contents","testResults","error","formatResultsErrors","noStackTrace","isFailure","status","TestResult","ancestorTitles","title","duration","filePath","basename","getError","testExecError","watch","JestError","failureMessage","message","stack","TestsFiles","numPassingTests","numFailingTests","numPendingTests","perfStats","runtime","slow","componentId","results","TestsResult","success","startTime","compact","reduce","code","type","push","onTestRunComplete","callback","_callback","context","rootDir","rootPath","roots","console","warn","debug","runInBand","coverage","watchAll","noCache","jestConfigWithSpecs","assign","testMatch","patternsToArray","withEnv","testsOutPut","runCLI","componentsWithTests","componentTestResults","Tests","Promise","resolve","workerApi","initiate","ui","stdout","stderr","stdin","envRootDir","envRuntime","envAspectDefinition","aspectPath","cbFn","proxy","globalErrors","watchTestResults","loading","onTestComplete","err","flatten","resolveSpecPaths","customPatterns","isEmpty","customPattern","rootDirs","componentDir","resolvePattern","paths","p","pattern","dir","exports"],"sources":["jest.tester.ts"],"sourcesContent":["import { resolve } from 'path';\nimport { readFileSync } from 'fs-extra';\nimport minimatch from 'minimatch';\nimport { compact, flatten, isEmpty } from 'lodash';\nimport { proxy } from 'comlink';\nimport { Logger } from '@teambit/logger';\nimport { HarmonyWorker } from '@teambit/worker';\nimport { Tester, CallbackFn, TesterContext, Tests, ComponentsResults, ComponentPatternsEntry } from '@teambit/tester';\nimport { TestsFiles, TestResult, TestsResult } from '@teambit/tests-results';\nimport { TestResult as JestTestResult, AggregatedResult } from '@jest/test-result';\nimport { formatResultsErrors } from 'jest-message-util';\nimport { Component, ComponentMap } from '@teambit/component';\nimport { AbstractVinyl } from '@teambit/legacy/dist/consumer/component/sources';\n// import { Environment } from '@teambit/envs';\n// import { EnvPolicyConfigObject, PeersAutoDetectPolicy } from '@teambit/dependency-resolver';\nimport { JestError } from './error';\nimport type { JestWorker } from './jest.worker';\n\nexport type JestTesterOptions = {\n /**\n * array of patterns to test. (override the patterns provided by the context)\n */\n patterns?: string[];\n\n /**\n * add more root paths to look for tests.\n */\n roots?: string[];\n\n /**\n * A function that knows to resolve the paths of the spec files.\n * This usually used when you want only subset of your spec files to be used\n * (usually when you use multi tester with different specs files for each tester instance).\n */\n resolveSpecPaths?: (component: Component, context: TesterContext) => string[];\n};\n\nexport class JestTester implements Tester {\n private readonly jestModule: any;\n\n constructor(\n readonly id: string,\n readonly jestConfig: any,\n private jestModulePath: string,\n private jestWorker: HarmonyWorker<JestWorker>,\n private logger: Logger,\n private opts: JestTesterOptions = {}\n ) {\n // eslint-disable-next-line global-require,import/no-dynamic-require\n this.jestModule = require(jestModulePath);\n }\n\n configPath = this.jestConfig;\n\n displayName = 'Jest';\n\n _callback: CallbackFn | undefined;\n\n displayConfig() {\n return readFileSync(this.jestConfig, 'utf8');\n }\n\n version() {\n return this.jestModule.getVersion();\n }\n\n private attachTestsToComponent(testerContext: TesterContext, testResult: JestTestResult[]) {\n return ComponentMap.as(testerContext.components, (component) => {\n const componentPatternValue = testerContext.patterns.get(component);\n if (!componentPatternValue) return undefined;\n const [currComponent, patternEntry] = componentPatternValue;\n const resolvedPatterns = this.resolveComponentPattern(currComponent, patternEntry, testerContext);\n return testResult.filter((test) => {\n return resolvedPatterns.filter((resolvedPattern) => minimatch(test.testFilePath, resolvedPattern)).length > 0;\n });\n });\n }\n\n private buildTestsObj(\n aggregatedResult: AggregatedResult,\n components: ComponentMap<JestTestResult[] | undefined>,\n testerContext: TesterContext,\n config?: any\n ): ComponentsResults[] {\n const testsSuiteResult = components.toArray().map(([component, testsFiles]) => {\n if (!testsFiles) return undefined;\n if (testsFiles?.length === 0) return undefined;\n const errors = this.getErrors(testsFiles);\n const tests = testsFiles.map((test) => {\n const file = new AbstractVinyl({ path: test.testFilePath, contents: readFileSync(test.testFilePath) });\n const testResults = test.testResults.map((testResult) => {\n const error = formatResultsErrors([testResult], config, { noStackTrace: true }) || undefined;\n const isFailure = testResult.status === 'failed';\n return new TestResult(\n testResult.ancestorTitles,\n testResult.title,\n testResult.status,\n testResult.duration,\n isFailure ? undefined : error,\n isFailure ? error : undefined\n );\n });\n const filePath = file?.basename || test.testFilePath;\n const getError = () => {\n if (!test.testExecError) return undefined;\n if (testerContext.watch) {\n // for some reason, during watch ('bit start'), if a file has an error, the `test.testExecError` is `{}`\n // (an empty object). the failureMessage contains the stringified error.\n // @todo: consider to always use the failureMessage, regardless the context.watch.\n return new JestError(test.failureMessage as string);\n }\n return new JestError(test.testExecError?.message, test.testExecError?.stack);\n };\n const error = getError();\n return new TestsFiles(\n filePath,\n testResults,\n test.numPassingTests,\n test.numFailingTests,\n test.numPendingTests,\n test.perfStats.runtime,\n test.perfStats.slow,\n error\n );\n });\n return {\n componentId: component.id,\n results: new TestsResult(tests, aggregatedResult.success, aggregatedResult.startTime),\n errors,\n };\n });\n\n return compact(testsSuiteResult);\n }\n\n private getErrors(testResult: JestTestResult[]): JestError[] {\n return testResult.reduce((errors: JestError[], test) => {\n if (test.testExecError) {\n const { message, stack, code, type } = test.testExecError;\n errors.push(new JestError(message, stack, code, type));\n } else if (test.failureMessage) {\n errors.push(new JestError(test.failureMessage));\n }\n return errors;\n }, []);\n }\n\n async onTestRunComplete(callback: CallbackFn) {\n this._callback = callback;\n }\n\n async test(context: TesterContext): Promise<Tests> {\n // const envRootDir = context.envRuntime.envAspectDefinition.aspectPath;\n\n const config: any = {\n // Setting the rootDir to the env root dir to make sure we can resolve all the jest presets/plugins\n // from the env context\n // rootDir: envRootDir,\n // TODO: set it to envRootDir and make sure we can make the --coverage to work\n // with the current value as context.rootPath it will probably won't work correctly when using rootComponents:true (maybe even won't work at all)\n // TODO: when changing to envRootDir we have some issues with the react-native tests. so once changed again, it needs to be validated.\n rootDir: context.rootPath,\n // Setting the roots (where to search for spec files) to the root path (either workspace or capsule root)\n // TODO: consider change this to be an array of the components running dir.\n // TODO: aka: in the workspace it will be something like <ws>/node_modules/<comp-package-name>/node_modules/<comp-package-name>\n // TODO: see dependencyResolver.getRuntimeModulePath (this will make sure the peer deps resolved correctly)\n // TODO: (@GiladShoham - when trying to set it to this paths, jest ignores it probably because the paths contains \"node_modules\"\n // TODO: trying to set the https://jestjs.io/docs/27.x/configuration#testpathignorepatterns-arraystring to something else (as it contain node_modules by default)\n // TODO: didn't help)\n roots: [context.rootPath],\n };\n\n // eslint-disable-next-line no-console\n console.warn = (message: string) => {\n this.logger.warn(message);\n };\n\n if (context.debug) {\n config.debug = true;\n config.runInBand = true;\n }\n if (context.coverage) config.coverage = true;\n config.runInBand = true;\n\n if (context.watch) {\n config.watchAll = true;\n config.noCache = true;\n }\n // eslint-disable-next-line global-require,import/no-dynamic-require\n const jestConfig = require(this.jestConfig);\n\n // TODO: rollback this for now, as it makes issues.\n // TODO: it's mostly relevant for when the root components feature is enabled.\n // TODO: we might want to enable it only on that case (along with setting the env root dir as the root dir, above)\n // const moduleNameMapper = await this.calculateModuleNameMapper(\n // context.env,\n // context.rootPath,\n // context.additionalHostDependencies\n // );\n // jestConfig.moduleNameMapper = Object.assign({}, jestConfig.moduleNameMapper || {}, moduleNameMapper);\n\n const jestConfigWithSpecs = Object.assign(jestConfig, {\n testMatch: this.patternsToArray(context),\n });\n\n const withEnv = Object.assign(jestConfigWithSpecs, config);\n\n const testsOutPut = await this.jestModule.runCLI(withEnv, [this.jestConfig]);\n const testResults = testsOutPut.results.testResults;\n const componentsWithTests = this.attachTestsToComponent(context, testResults);\n const componentTestResults = this.buildTestsObj(\n testsOutPut.results,\n componentsWithTests,\n context,\n jestConfigWithSpecs\n );\n return new Tests(componentTestResults);\n }\n\n async watch(context: TesterContext): Promise<Tests> {\n // eslint-disable-next-line\n return new Promise(async (resolve) => {\n const workerApi = this.jestWorker.initiate(\n context.ui ? { stdout: true, stderr: true, stdin: true } : { stdout: false, stderr: false, stdin: false }\n );\n\n // eslint-disable-next-line\n const jestConfig = require(this.jestConfig);\n\n const envRootDir = context.envRuntime.envAspectDefinition?.aspectPath;\n if (!envRootDir) {\n this.logger.warn(`jest tester, envRootDir is not defined, for env ${context.envRuntime.id}`);\n }\n\n const jestConfigWithSpecs = Object.assign(jestConfig, {\n testMatch: this.patternsToArray(context),\n });\n\n try {\n const cbFn = proxy((results) => {\n if (!this._callback) return;\n const testResults = results.testResults;\n const componentsWithTests = this.attachTestsToComponent(context, testResults);\n const componentTestResults = this.buildTestsObj(results, componentsWithTests, context, jestConfigWithSpecs);\n const globalErrors = this.getErrors(testResults);\n const watchTestResults = {\n loading: false,\n errors: globalErrors,\n components: componentTestResults,\n };\n this._callback(watchTestResults);\n resolve(watchTestResults);\n });\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n await workerApi.onTestComplete(cbFn);\n\n await workerApi.watch(\n this.jestConfig,\n this.patternsToArray(context),\n context.rootPath,\n this.jestModulePath,\n envRootDir\n );\n } catch (err: any) {\n this.logger.error('jest.tester.watch() caught an error', err);\n }\n });\n }\n\n // private async calculateModuleNameMapper(\n // env: Environment,\n // rootPath: string,\n // additionalHostDependencies?: string[]\n // ): Promise<Record<string, Array<string>>> {\n // const peerDepsConfig: EnvPolicyConfigObject = await env.getDependencies();\n // const peersAutoDetectPolicy = new PeersAutoDetectPolicy(peerDepsConfig.peers || []);\n // const peers = Object.keys(peerDepsConfig.peerDependencies || {}).concat(peersAutoDetectPolicy?.names);\n // const depsToMap = peers.concat(additionalHostDependencies || []);\n\n // /**\n // * Try to resolve the dependency from the rootDir (the env dir) or from the root path (workspace/capsule root)\n // */\n // const mappedValues = ['<rootDir>/node_modules/$1', `${rootPath}/node_modules/$1`];\n\n // const moduleNameMapper = depsToMap.reduce((acc, peerName) => {\n // const keyName = `^(${peerName})$`;\n // acc[keyName] = mappedValues;\n // const internalPathKeyName = `^(${peerName}/.*)$`;\n // acc[internalPathKeyName] = mappedValues;\n // return acc;\n // }, {});\n\n // return moduleNameMapper;\n // }\n\n private patternsToArray(context: TesterContext): string[] {\n return flatten(\n context.patterns.toArray().map(([component, patternEntry]) => {\n return this.resolveComponentPattern(component, patternEntry, context);\n })\n );\n }\n\n private resolveComponentPattern(\n component: Component,\n patternEntry: ComponentPatternsEntry,\n context: TesterContext\n ): string[] {\n if (this.opts.resolveSpecPaths) {\n return this.opts.resolveSpecPaths(component, context);\n }\n const customPatterns = this.opts.patterns;\n // If pattern were provided to the specific instance of the tester, use them\n if (customPatterns && !isEmpty(customPatterns)) {\n customPatterns.map((customPattern) => {\n const rootDirs = this.opts.roots || [patternEntry.componentDir];\n return this.resolvePattern(customPattern, rootDirs);\n });\n }\n return patternEntry.paths.map((p) => p.path);\n }\n\n private resolvePattern(pattern: string, rootDirs: string[]) {\n return rootDirs.map((dir) => resolve(dir, pattern));\n }\n}\n"],"mappings":"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"}
|
package/dist/jest.worker.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_flatted","data","require","_worker","_defineProperty","obj","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","t","i","_toPrimitive","String","r","e","Symbol","toPrimitive","call","TypeError","Number","JestWorker","constructor","onTestComplete","onTestCompleteCb","watch","jestConfigPath","testFiles","rootPath","jestModulePath","envRootDir","Promise","resolve","console","warn","jestConfig","jestModule","jestConfigWithSpecs","assign","testMatch","config","rootDir","roots","runInBand","silent","watchAll","watchPlugins","__dirname","specFiles","onComplete","results","json","parse","stringify","error","withEnv","res","runCLI","catch","err","exports","expose"],"sources":["jest.worker.ts"],"sourcesContent":["import { stringify, parse } from 'flatted';\nimport { expose } from '@teambit/worker';\
|
1
|
+
{"version":3,"names":["_flatted","data","require","_worker","_defineProperty","obj","key","value","_toPropertyKey","Object","defineProperty","enumerable","configurable","writable","t","i","_toPrimitive","String","r","e","Symbol","toPrimitive","call","TypeError","Number","JestWorker","constructor","onTestComplete","onTestCompleteCb","watch","jestConfigPath","testFiles","rootPath","jestModulePath","envRootDir","Promise","resolve","console","warn","jestConfig","jestModule","jestConfigWithSpecs","assign","testMatch","config","rootDir","roots","runInBand","silent","watchAll","watchPlugins","__dirname","specFiles","onComplete","results","json","parse","stringify","error","withEnv","res","runCLI","catch","err","exports","expose"],"sources":["jest.worker.ts"],"sourcesContent":["import { stringify, parse } from 'flatted';\nimport { expose } from '@teambit/worker';\n\nexport class JestWorker {\n private onTestCompleteCb;\n\n onTestComplete(onTestComplete) {\n this.onTestCompleteCb = onTestComplete;\n // return this;\n }\n\n watch(\n jestConfigPath: string,\n testFiles: string[],\n rootPath: string,\n jestModulePath: string,\n envRootDir: string\n ): Promise<void> {\n return new Promise((resolve) => {\n // TODO: remove this after jest publish new version to npm: https://github.com/facebook/jest/pull/10804\n // eslint-disable-next-line\n console.warn = function () {};\n /* The path to the jest config file. */\n // eslint-disable-next-line import/no-dynamic-require,global-require\n const jestConfig = require(jestConfigPath);\n // eslint-disable-next-line import/no-dynamic-require,global-require\n const jestModule: any = require(jestModulePath);\n\n const jestConfigWithSpecs = Object.assign(jestConfig, {\n testMatch: testFiles,\n });\n\n const config: any = {\n // Setting the rootDir to the env root dir to make sure we can resolve all the jest presets/plugins\n // from the env context\n rootDir: envRootDir,\n // Setting the roots (where to search for spec files) to the root path (either workspace or capsule root)\n // TODO: consider change this to be an array of the components running dir.\n // TODO: aka: in the workspace it will be something like <ws>/node_modules/<comp-package-name>/node_modules/<comp-package-name>\n // TODO: see dependencyResolver.getRuntimeModulePath (this will make sure the peer deps resolved correctly)\n // TODO: (@GiladShoham - when trying to set it to this paths, jest ignores it probably because the paths contains \"node_modules\"\n // TODO: trying to set the https://jestjs.io/docs/27.x/configuration#testpathignorepatterns-arraystring to something else (as it contain node_modules by default)\n // TODO: didn't help)\n roots: [rootPath],\n // useStderr: true,\n // TODO: check way to enable it\n runInBand: true,\n silent: false,\n watch: true,\n watchAll: true,\n watchPlugins: [\n [\n `${__dirname}/watch.js`,\n {\n specFiles: testFiles,\n onComplete: (results) => {\n if (!this.onTestCompleteCb) return;\n try {\n const json = parse(stringify(results));\n this.onTestCompleteCb(json);\n // disable eslint because we want to catch error but not print it on worker\n // eslint-disable-next-line\n } catch (error: any) {}\n },\n },\n ],\n ],\n };\n\n const withEnv = Object.assign(jestConfigWithSpecs, config);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n const res = jestModule.runCLI(withEnv, [jestConfigPath]);\n // eslint-disable-next-line no-console\n res.catch((err) => console.error(err));\n resolve();\n });\n }\n}\n\nexpose(new JestWorker());\n"],"mappings":";;;;;;AAAA,SAAAA,SAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,QAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAE,QAAA;EAAA,MAAAF,IAAA,GAAAC,OAAA;EAAAC,OAAA,YAAAA,CAAA;IAAA,OAAAF,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAAyC,SAAAG,gBAAAC,GAAA,EAAAC,GAAA,EAAAC,KAAA,IAAAD,GAAA,GAAAE,cAAA,CAAAF,GAAA,OAAAA,GAAA,IAAAD,GAAA,IAAAI,MAAA,CAAAC,cAAA,CAAAL,GAAA,EAAAC,GAAA,IAAAC,KAAA,EAAAA,KAAA,EAAAI,UAAA,QAAAC,YAAA,QAAAC,QAAA,oBAAAR,GAAA,CAAAC,GAAA,IAAAC,KAAA,WAAAF,GAAA;AAAA,SAAAG,eAAAM,CAAA,QAAAC,CAAA,GAAAC,YAAA,CAAAF,CAAA,uCAAAC,CAAA,GAAAA,CAAA,GAAAE,MAAA,CAAAF,CAAA;AAAA,SAAAC,aAAAF,CAAA,EAAAI,CAAA,2BAAAJ,CAAA,KAAAA,CAAA,SAAAA,CAAA,MAAAK,CAAA,GAAAL,CAAA,CAAAM,MAAA,CAAAC,WAAA,kBAAAF,CAAA,QAAAJ,CAAA,GAAAI,CAAA,CAAAG,IAAA,CAAAR,CAAA,EAAAI,CAAA,uCAAAH,CAAA,SAAAA,CAAA,YAAAQ,SAAA,yEAAAL,CAAA,GAAAD,MAAA,GAAAO,MAAA,EAAAV,CAAA;AAElC,MAAMW,UAAU,CAAC;EAAAC,YAAA;IAAAtB,eAAA;EAAA;EAGtBuB,cAAcA,CAACA,cAAc,EAAE;IAC7B,IAAI,CAACC,gBAAgB,GAAGD,cAAc;IACtC;EACF;EAEAE,KAAKA,CACHC,cAAsB,EACtBC,SAAmB,EACnBC,QAAgB,EAChBC,cAAsB,EACtBC,UAAkB,EACH;IACf,OAAO,IAAIC,OAAO,CAAEC,OAAO,IAAK;MAC9B;MACA;MACAC,OAAO,CAACC,IAAI,GAAG,YAAY,CAAC,CAAC;MAC7B;MACA;MACA,MAAMC,UAAU,GAAGrC,OAAO,CAAC4B,cAAc,CAAC;MAC1C;MACA,MAAMU,UAAe,GAAGtC,OAAO,CAAC+B,cAAc,CAAC;MAE/C,MAAMQ,mBAAmB,GAAGhC,MAAM,CAACiC,MAAM,CAACH,UAAU,EAAE;QACpDI,SAAS,EAAEZ;MACb,CAAC,CAAC;MAEF,MAAMa,MAAW,GAAG;QAClB;QACA;QACAC,OAAO,EAAEX,UAAU;QACnB;QACA;QACA;QACA;QACA;QACA;QACA;QACAY,KAAK,EAAE,CAACd,QAAQ,CAAC;QACjB;QACA;QACAe,SAAS,EAAE,IAAI;QACfC,MAAM,EAAE,KAAK;QACbnB,KAAK,EAAE,IAAI;QACXoB,QAAQ,EAAE,IAAI;QACdC,YAAY,EAAE,CACZ,CACG,GAAEC,SAAU,WAAU,EACvB;UACEC,SAAS,EAAErB,SAAS;UACpBsB,UAAU,EAAGC,OAAO,IAAK;YACvB,IAAI,CAAC,IAAI,CAAC1B,gBAAgB,EAAE;YAC5B,IAAI;cACF,MAAM2B,IAAI,GAAG,IAAAC,gBAAK,EAAC,IAAAC,oBAAS,EAACH,OAAO,CAAC,CAAC;cACtC,IAAI,CAAC1B,gBAAgB,CAAC2B,IAAI,CAAC;cAC3B;cACA;YACF,CAAC,CAAC,OAAOG,KAAU,EAAE,CAAC;UACxB;QACF,CAAC,CACF;MAEL,CAAC;MAED,MAAMC,OAAO,GAAGlD,MAAM,CAACiC,MAAM,CAACD,mBAAmB,EAAEG,MAAM,CAAC;MAC1D;MACA,MAAMgB,GAAG,GAAGpB,UAAU,CAACqB,MAAM,CAACF,OAAO,EAAE,CAAC7B,cAAc,CAAC,CAAC;MACxD;MACA8B,GAAG,CAACE,KAAK,CAAEC,GAAG,IAAK1B,OAAO,CAACqB,KAAK,CAACK,GAAG,CAAC,CAAC;MACtC3B,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;EACJ;AACF;AAAC4B,OAAA,CAAAvC,UAAA,GAAAA,UAAA;AAED,IAAAwC,gBAAM,EAAC,IAAIxC,UAAU,CAAC,CAAC,CAAC"}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.defender_jest@1.0.
|
2
|
-
import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.defender_jest@1.0.
|
1
|
+
import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.defender_jest@1.0.108/dist/jest.composition.js';
|
2
|
+
import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad3d35bfc38b9cd90c0e05b598a5a55af/teambit.defender_jest@1.0.108/dist/jest.docs.mdx';
|
3
3
|
|
4
4
|
export const compositions = [compositions_0];
|
5
5
|
export const overview = [overview_0];
|
package/dist/watch.d.ts
CHANGED
package/dist/watch.js
CHANGED
@@ -27,7 +27,7 @@ class Watch {
|
|
27
27
|
if (paths.includes(specFile)) return true;
|
28
28
|
return false;
|
29
29
|
});
|
30
|
-
return component
|
30
|
+
return component?.[0];
|
31
31
|
}
|
32
32
|
apply(jestHooks) {
|
33
33
|
// jestHooks.shouldRunTestSuite(async (testSuite) => {
|
package/dist/watch.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["Watch","constructor","stdin","stdout","config","_defineProperty","_stdin","_stdout","_specFiles","specFiles","_onComplete","onComplete","findComponent","specFile","component","toArray","find","specs","paths","map","spec","path","includes","apply","jestHooks","onTestRunComplete","results","module","exports"],"sources":["watch.ts"],"sourcesContent":["import { Prompt, WatchPlugin, JestHookSubscriber, UsageData } from 'jest-watcher';\nimport { SpecFiles } from '@teambit/tester';\n\nexport type PluginConfig = {\n onComplete: (testSuite: any) => void;\n specFiles: SpecFiles;\n};\n\nclass Watch implements WatchPlugin {\n _stdin: NodeJS.ReadStream;\n\n _stdout: NodeJS.WriteStream;\n\n _prompt: Prompt;\n\n _testResults: any;\n\n _usageInfo: UsageData;\n\n _specFiles: SpecFiles;\n\n _onComplete: (testSuite: any) => void;\n\n constructor({\n stdin,\n stdout,\n config,\n }: {\n stdin: NodeJS.ReadStream;\n stdout: NodeJS.WriteStream;\n config: PluginConfig;\n }) {\n this._stdin = stdin;\n this._stdout = stdout;\n this._specFiles = config.specFiles;\n this._onComplete = config.onComplete;\n }\n\n private findComponent(specFile: string) {\n const component = this._specFiles.toArray().find(([, specs]) => {\n const paths = specs.map((spec) => spec.path);\n if (paths.includes(specFile)) return true;\n return false;\n });\n return component?.[0];\n }\n\n apply(jestHooks: JestHookSubscriber) {\n // jestHooks.shouldRunTestSuite(async (testSuite) => {\n // const component = this.findComponent(testSuite.testPath);\n // if ((await component?.isModified()) || (await component?.isNew())) return true;\n // return false;\n // });\n\n jestHooks.onTestRunComplete((results) => {\n this._onComplete(results);\n });\n }\n}\n\nmodule.exports = Watch;\n"],"mappings":";;;;;AAQA,MAAMA,KAAK,CAAwB;EAejCC,WAAWA,CAAC;IACVC,KAAK;IACLC,MAAM;IACNC;EAKF,CAAC,EAAE;IAAAC,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IACD,IAAI,CAACC,MAAM,GAAGJ,KAAK;IACnB,IAAI,CAACK,OAAO,GAAGJ,MAAM;IACrB,IAAI,CAACK,UAAU,GAAGJ,MAAM,CAACK,SAAS;IAClC,IAAI,CAACC,WAAW,GAAGN,MAAM,CAACO,UAAU;EACtC;EAEQC,aAAaA,CAACC,QAAgB,EAAE;IACtC,MAAMC,SAAS,GAAG,IAAI,CAACN,UAAU,CAACO,OAAO,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,GAAGC,KAAK,CAAC,KAAK;MAC9D,MAAMC,KAAK,GAAGD,KAAK,CAACE,GAAG,CAAEC,IAAI,IAAKA,IAAI,CAACC,IAAI,CAAC;MAC5C,IAAIH,KAAK,CAACI,QAAQ,CAACT,QAAQ,CAAC,EAAE,OAAO,IAAI;MACzC,OAAO,KAAK;IACd,CAAC,CAAC;IACF,OAAOC,SAAS,
|
1
|
+
{"version":3,"names":["Watch","constructor","stdin","stdout","config","_defineProperty","_stdin","_stdout","_specFiles","specFiles","_onComplete","onComplete","findComponent","specFile","component","toArray","find","specs","paths","map","spec","path","includes","apply","jestHooks","onTestRunComplete","results","module","exports"],"sources":["watch.ts"],"sourcesContent":["import { Prompt, WatchPlugin, JestHookSubscriber, UsageData } from 'jest-watcher';\nimport { SpecFiles } from '@teambit/tester';\n\nexport type PluginConfig = {\n onComplete: (testSuite: any) => void;\n specFiles: SpecFiles;\n};\n\nclass Watch implements WatchPlugin {\n _stdin: NodeJS.ReadStream;\n\n _stdout: NodeJS.WriteStream;\n\n _prompt: Prompt;\n\n _testResults: any;\n\n _usageInfo: UsageData;\n\n _specFiles: SpecFiles;\n\n _onComplete: (testSuite: any) => void;\n\n constructor({\n stdin,\n stdout,\n config,\n }: {\n stdin: NodeJS.ReadStream;\n stdout: NodeJS.WriteStream;\n config: PluginConfig;\n }) {\n this._stdin = stdin;\n this._stdout = stdout;\n this._specFiles = config.specFiles;\n this._onComplete = config.onComplete;\n }\n\n private findComponent(specFile: string) {\n const component = this._specFiles.toArray().find(([, specs]) => {\n const paths = specs.map((spec) => spec.path);\n if (paths.includes(specFile)) return true;\n return false;\n });\n return component?.[0];\n }\n\n apply(jestHooks: JestHookSubscriber) {\n // jestHooks.shouldRunTestSuite(async (testSuite) => {\n // const component = this.findComponent(testSuite.testPath);\n // if ((await component?.isModified()) || (await component?.isNew())) return true;\n // return false;\n // });\n\n jestHooks.onTestRunComplete((results) => {\n this._onComplete(results);\n });\n }\n}\n\nmodule.exports = Watch;\n"],"mappings":";;;;;AAQA,MAAMA,KAAK,CAAwB;EAejCC,WAAWA,CAAC;IACVC,KAAK;IACLC,MAAM;IACNC;EAKF,CAAC,EAAE;IAAAC,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IACD,IAAI,CAACC,MAAM,GAAGJ,KAAK;IACnB,IAAI,CAACK,OAAO,GAAGJ,MAAM;IACrB,IAAI,CAACK,UAAU,GAAGJ,MAAM,CAACK,SAAS;IAClC,IAAI,CAACC,WAAW,GAAGN,MAAM,CAACO,UAAU;EACtC;EAEQC,aAAaA,CAACC,QAAgB,EAAE;IACtC,MAAMC,SAAS,GAAG,IAAI,CAACN,UAAU,CAACO,OAAO,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,GAAGC,KAAK,CAAC,KAAK;MAC9D,MAAMC,KAAK,GAAGD,KAAK,CAACE,GAAG,CAAEC,IAAI,IAAKA,IAAI,CAACC,IAAI,CAAC;MAC5C,IAAIH,KAAK,CAACI,QAAQ,CAACT,QAAQ,CAAC,EAAE,OAAO,IAAI;MACzC,OAAO,KAAK;IACd,CAAC,CAAC;IACF,OAAOC,SAAS,GAAG,CAAC,CAAC;EACvB;EAEAS,KAAKA,CAACC,SAA6B,EAAE;IACnC;IACA;IACA;IACA;IACA;;IAEAA,SAAS,CAACC,iBAAiB,CAAEC,OAAO,IAAK;MACvC,IAAI,CAAChB,WAAW,CAACgB,OAAO,CAAC;IAC3B,CAAC,CAAC;EACJ;AACF;AAEAC,MAAM,CAACC,OAAO,GAAG5B,KAAK"}
|
package/error.ts
ADDED
package/index.ts
ADDED
package/jest.aspect.ts
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
import { MainRuntime } from '@teambit/cli';
|
2
|
+
import { LoggerAspect, LoggerMain, Logger } from '@teambit/logger';
|
3
|
+
import { WorkerAspect, WorkerMain, HarmonyWorker } from '@teambit/worker';
|
4
|
+
import { JestAspect } from './jest.aspect';
|
5
|
+
import { JestTester, JestTesterOptions } from './jest.tester';
|
6
|
+
import type { JestWorker } from './jest.worker';
|
7
|
+
|
8
|
+
export const WORKER_NAME = 'jest';
|
9
|
+
|
10
|
+
export class JestMain {
|
11
|
+
constructor(private jestWorker: HarmonyWorker<JestWorker>, private logger: Logger) {}
|
12
|
+
|
13
|
+
createTester(jestConfig: any, jestModulePath = require.resolve('jest'), opts?: JestTesterOptions) {
|
14
|
+
return new JestTester(JestAspect.id, jestConfig, jestModulePath, this.jestWorker, this.logger, opts);
|
15
|
+
}
|
16
|
+
|
17
|
+
static runtime = MainRuntime;
|
18
|
+
static dependencies = [WorkerAspect, LoggerAspect];
|
19
|
+
|
20
|
+
static async provider([worker, loggerAspect]: [WorkerMain, LoggerMain]) {
|
21
|
+
const logger = loggerAspect.createLogger(JestAspect.id);
|
22
|
+
const jestWorker = worker.declareWorker<JestWorker>(WORKER_NAME, require.resolve('./jest.worker'));
|
23
|
+
return new JestMain(jestWorker, logger);
|
24
|
+
}
|
25
|
+
}
|
26
|
+
|
27
|
+
JestAspect.addRuntime(JestMain);
|
package/jest.tester.ts
ADDED
@@ -0,0 +1,327 @@
|
|
1
|
+
import { resolve } from 'path';
|
2
|
+
import { readFileSync } from 'fs-extra';
|
3
|
+
import minimatch from 'minimatch';
|
4
|
+
import { compact, flatten, isEmpty } from 'lodash';
|
5
|
+
import { proxy } from 'comlink';
|
6
|
+
import { Logger } from '@teambit/logger';
|
7
|
+
import { HarmonyWorker } from '@teambit/worker';
|
8
|
+
import { Tester, CallbackFn, TesterContext, Tests, ComponentsResults, ComponentPatternsEntry } from '@teambit/tester';
|
9
|
+
import { TestsFiles, TestResult, TestsResult } from '@teambit/tests-results';
|
10
|
+
import { TestResult as JestTestResult, AggregatedResult } from '@jest/test-result';
|
11
|
+
import { formatResultsErrors } from 'jest-message-util';
|
12
|
+
import { Component, ComponentMap } from '@teambit/component';
|
13
|
+
import { AbstractVinyl } from '@teambit/legacy/dist/consumer/component/sources';
|
14
|
+
// import { Environment } from '@teambit/envs';
|
15
|
+
// import { EnvPolicyConfigObject, PeersAutoDetectPolicy } from '@teambit/dependency-resolver';
|
16
|
+
import { JestError } from './error';
|
17
|
+
import type { JestWorker } from './jest.worker';
|
18
|
+
|
19
|
+
export type JestTesterOptions = {
|
20
|
+
/**
|
21
|
+
* array of patterns to test. (override the patterns provided by the context)
|
22
|
+
*/
|
23
|
+
patterns?: string[];
|
24
|
+
|
25
|
+
/**
|
26
|
+
* add more root paths to look for tests.
|
27
|
+
*/
|
28
|
+
roots?: string[];
|
29
|
+
|
30
|
+
/**
|
31
|
+
* A function that knows to resolve the paths of the spec files.
|
32
|
+
* This usually used when you want only subset of your spec files to be used
|
33
|
+
* (usually when you use multi tester with different specs files for each tester instance).
|
34
|
+
*/
|
35
|
+
resolveSpecPaths?: (component: Component, context: TesterContext) => string[];
|
36
|
+
};
|
37
|
+
|
38
|
+
export class JestTester implements Tester {
|
39
|
+
private readonly jestModule: any;
|
40
|
+
|
41
|
+
constructor(
|
42
|
+
readonly id: string,
|
43
|
+
readonly jestConfig: any,
|
44
|
+
private jestModulePath: string,
|
45
|
+
private jestWorker: HarmonyWorker<JestWorker>,
|
46
|
+
private logger: Logger,
|
47
|
+
private opts: JestTesterOptions = {}
|
48
|
+
) {
|
49
|
+
// eslint-disable-next-line global-require,import/no-dynamic-require
|
50
|
+
this.jestModule = require(jestModulePath);
|
51
|
+
}
|
52
|
+
|
53
|
+
configPath = this.jestConfig;
|
54
|
+
|
55
|
+
displayName = 'Jest';
|
56
|
+
|
57
|
+
_callback: CallbackFn | undefined;
|
58
|
+
|
59
|
+
displayConfig() {
|
60
|
+
return readFileSync(this.jestConfig, 'utf8');
|
61
|
+
}
|
62
|
+
|
63
|
+
version() {
|
64
|
+
return this.jestModule.getVersion();
|
65
|
+
}
|
66
|
+
|
67
|
+
private attachTestsToComponent(testerContext: TesterContext, testResult: JestTestResult[]) {
|
68
|
+
return ComponentMap.as(testerContext.components, (component) => {
|
69
|
+
const componentPatternValue = testerContext.patterns.get(component);
|
70
|
+
if (!componentPatternValue) return undefined;
|
71
|
+
const [currComponent, patternEntry] = componentPatternValue;
|
72
|
+
const resolvedPatterns = this.resolveComponentPattern(currComponent, patternEntry, testerContext);
|
73
|
+
return testResult.filter((test) => {
|
74
|
+
return resolvedPatterns.filter((resolvedPattern) => minimatch(test.testFilePath, resolvedPattern)).length > 0;
|
75
|
+
});
|
76
|
+
});
|
77
|
+
}
|
78
|
+
|
79
|
+
private buildTestsObj(
|
80
|
+
aggregatedResult: AggregatedResult,
|
81
|
+
components: ComponentMap<JestTestResult[] | undefined>,
|
82
|
+
testerContext: TesterContext,
|
83
|
+
config?: any
|
84
|
+
): ComponentsResults[] {
|
85
|
+
const testsSuiteResult = components.toArray().map(([component, testsFiles]) => {
|
86
|
+
if (!testsFiles) return undefined;
|
87
|
+
if (testsFiles?.length === 0) return undefined;
|
88
|
+
const errors = this.getErrors(testsFiles);
|
89
|
+
const tests = testsFiles.map((test) => {
|
90
|
+
const file = new AbstractVinyl({ path: test.testFilePath, contents: readFileSync(test.testFilePath) });
|
91
|
+
const testResults = test.testResults.map((testResult) => {
|
92
|
+
const error = formatResultsErrors([testResult], config, { noStackTrace: true }) || undefined;
|
93
|
+
const isFailure = testResult.status === 'failed';
|
94
|
+
return new TestResult(
|
95
|
+
testResult.ancestorTitles,
|
96
|
+
testResult.title,
|
97
|
+
testResult.status,
|
98
|
+
testResult.duration,
|
99
|
+
isFailure ? undefined : error,
|
100
|
+
isFailure ? error : undefined
|
101
|
+
);
|
102
|
+
});
|
103
|
+
const filePath = file?.basename || test.testFilePath;
|
104
|
+
const getError = () => {
|
105
|
+
if (!test.testExecError) return undefined;
|
106
|
+
if (testerContext.watch) {
|
107
|
+
// for some reason, during watch ('bit start'), if a file has an error, the `test.testExecError` is `{}`
|
108
|
+
// (an empty object). the failureMessage contains the stringified error.
|
109
|
+
// @todo: consider to always use the failureMessage, regardless the context.watch.
|
110
|
+
return new JestError(test.failureMessage as string);
|
111
|
+
}
|
112
|
+
return new JestError(test.testExecError?.message, test.testExecError?.stack);
|
113
|
+
};
|
114
|
+
const error = getError();
|
115
|
+
return new TestsFiles(
|
116
|
+
filePath,
|
117
|
+
testResults,
|
118
|
+
test.numPassingTests,
|
119
|
+
test.numFailingTests,
|
120
|
+
test.numPendingTests,
|
121
|
+
test.perfStats.runtime,
|
122
|
+
test.perfStats.slow,
|
123
|
+
error
|
124
|
+
);
|
125
|
+
});
|
126
|
+
return {
|
127
|
+
componentId: component.id,
|
128
|
+
results: new TestsResult(tests, aggregatedResult.success, aggregatedResult.startTime),
|
129
|
+
errors,
|
130
|
+
};
|
131
|
+
});
|
132
|
+
|
133
|
+
return compact(testsSuiteResult);
|
134
|
+
}
|
135
|
+
|
136
|
+
private getErrors(testResult: JestTestResult[]): JestError[] {
|
137
|
+
return testResult.reduce((errors: JestError[], test) => {
|
138
|
+
if (test.testExecError) {
|
139
|
+
const { message, stack, code, type } = test.testExecError;
|
140
|
+
errors.push(new JestError(message, stack, code, type));
|
141
|
+
} else if (test.failureMessage) {
|
142
|
+
errors.push(new JestError(test.failureMessage));
|
143
|
+
}
|
144
|
+
return errors;
|
145
|
+
}, []);
|
146
|
+
}
|
147
|
+
|
148
|
+
async onTestRunComplete(callback: CallbackFn) {
|
149
|
+
this._callback = callback;
|
150
|
+
}
|
151
|
+
|
152
|
+
async test(context: TesterContext): Promise<Tests> {
|
153
|
+
// const envRootDir = context.envRuntime.envAspectDefinition.aspectPath;
|
154
|
+
|
155
|
+
const config: any = {
|
156
|
+
// Setting the rootDir to the env root dir to make sure we can resolve all the jest presets/plugins
|
157
|
+
// from the env context
|
158
|
+
// rootDir: envRootDir,
|
159
|
+
// TODO: set it to envRootDir and make sure we can make the --coverage to work
|
160
|
+
// with the current value as context.rootPath it will probably won't work correctly when using rootComponents:true (maybe even won't work at all)
|
161
|
+
// TODO: when changing to envRootDir we have some issues with the react-native tests. so once changed again, it needs to be validated.
|
162
|
+
rootDir: context.rootPath,
|
163
|
+
// Setting the roots (where to search for spec files) to the root path (either workspace or capsule root)
|
164
|
+
// TODO: consider change this to be an array of the components running dir.
|
165
|
+
// TODO: aka: in the workspace it will be something like <ws>/node_modules/<comp-package-name>/node_modules/<comp-package-name>
|
166
|
+
// TODO: see dependencyResolver.getRuntimeModulePath (this will make sure the peer deps resolved correctly)
|
167
|
+
// TODO: (@GiladShoham - when trying to set it to this paths, jest ignores it probably because the paths contains "node_modules"
|
168
|
+
// TODO: trying to set the https://jestjs.io/docs/27.x/configuration#testpathignorepatterns-arraystring to something else (as it contain node_modules by default)
|
169
|
+
// TODO: didn't help)
|
170
|
+
roots: [context.rootPath],
|
171
|
+
};
|
172
|
+
|
173
|
+
// eslint-disable-next-line no-console
|
174
|
+
console.warn = (message: string) => {
|
175
|
+
this.logger.warn(message);
|
176
|
+
};
|
177
|
+
|
178
|
+
if (context.debug) {
|
179
|
+
config.debug = true;
|
180
|
+
config.runInBand = true;
|
181
|
+
}
|
182
|
+
if (context.coverage) config.coverage = true;
|
183
|
+
config.runInBand = true;
|
184
|
+
|
185
|
+
if (context.watch) {
|
186
|
+
config.watchAll = true;
|
187
|
+
config.noCache = true;
|
188
|
+
}
|
189
|
+
// eslint-disable-next-line global-require,import/no-dynamic-require
|
190
|
+
const jestConfig = require(this.jestConfig);
|
191
|
+
|
192
|
+
// TODO: rollback this for now, as it makes issues.
|
193
|
+
// TODO: it's mostly relevant for when the root components feature is enabled.
|
194
|
+
// TODO: we might want to enable it only on that case (along with setting the env root dir as the root dir, above)
|
195
|
+
// const moduleNameMapper = await this.calculateModuleNameMapper(
|
196
|
+
// context.env,
|
197
|
+
// context.rootPath,
|
198
|
+
// context.additionalHostDependencies
|
199
|
+
// );
|
200
|
+
// jestConfig.moduleNameMapper = Object.assign({}, jestConfig.moduleNameMapper || {}, moduleNameMapper);
|
201
|
+
|
202
|
+
const jestConfigWithSpecs = Object.assign(jestConfig, {
|
203
|
+
testMatch: this.patternsToArray(context),
|
204
|
+
});
|
205
|
+
|
206
|
+
const withEnv = Object.assign(jestConfigWithSpecs, config);
|
207
|
+
|
208
|
+
const testsOutPut = await this.jestModule.runCLI(withEnv, [this.jestConfig]);
|
209
|
+
const testResults = testsOutPut.results.testResults;
|
210
|
+
const componentsWithTests = this.attachTestsToComponent(context, testResults);
|
211
|
+
const componentTestResults = this.buildTestsObj(
|
212
|
+
testsOutPut.results,
|
213
|
+
componentsWithTests,
|
214
|
+
context,
|
215
|
+
jestConfigWithSpecs
|
216
|
+
);
|
217
|
+
return new Tests(componentTestResults);
|
218
|
+
}
|
219
|
+
|
220
|
+
async watch(context: TesterContext): Promise<Tests> {
|
221
|
+
// eslint-disable-next-line
|
222
|
+
return new Promise(async (resolve) => {
|
223
|
+
const workerApi = this.jestWorker.initiate(
|
224
|
+
context.ui ? { stdout: true, stderr: true, stdin: true } : { stdout: false, stderr: false, stdin: false }
|
225
|
+
);
|
226
|
+
|
227
|
+
// eslint-disable-next-line
|
228
|
+
const jestConfig = require(this.jestConfig);
|
229
|
+
|
230
|
+
const envRootDir = context.envRuntime.envAspectDefinition?.aspectPath;
|
231
|
+
if (!envRootDir) {
|
232
|
+
this.logger.warn(`jest tester, envRootDir is not defined, for env ${context.envRuntime.id}`);
|
233
|
+
}
|
234
|
+
|
235
|
+
const jestConfigWithSpecs = Object.assign(jestConfig, {
|
236
|
+
testMatch: this.patternsToArray(context),
|
237
|
+
});
|
238
|
+
|
239
|
+
try {
|
240
|
+
const cbFn = proxy((results) => {
|
241
|
+
if (!this._callback) return;
|
242
|
+
const testResults = results.testResults;
|
243
|
+
const componentsWithTests = this.attachTestsToComponent(context, testResults);
|
244
|
+
const componentTestResults = this.buildTestsObj(results, componentsWithTests, context, jestConfigWithSpecs);
|
245
|
+
const globalErrors = this.getErrors(testResults);
|
246
|
+
const watchTestResults = {
|
247
|
+
loading: false,
|
248
|
+
errors: globalErrors,
|
249
|
+
components: componentTestResults,
|
250
|
+
};
|
251
|
+
this._callback(watchTestResults);
|
252
|
+
resolve(watchTestResults);
|
253
|
+
});
|
254
|
+
|
255
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
256
|
+
await workerApi.onTestComplete(cbFn);
|
257
|
+
|
258
|
+
await workerApi.watch(
|
259
|
+
this.jestConfig,
|
260
|
+
this.patternsToArray(context),
|
261
|
+
context.rootPath,
|
262
|
+
this.jestModulePath,
|
263
|
+
envRootDir
|
264
|
+
);
|
265
|
+
} catch (err: any) {
|
266
|
+
this.logger.error('jest.tester.watch() caught an error', err);
|
267
|
+
}
|
268
|
+
});
|
269
|
+
}
|
270
|
+
|
271
|
+
// private async calculateModuleNameMapper(
|
272
|
+
// env: Environment,
|
273
|
+
// rootPath: string,
|
274
|
+
// additionalHostDependencies?: string[]
|
275
|
+
// ): Promise<Record<string, Array<string>>> {
|
276
|
+
// const peerDepsConfig: EnvPolicyConfigObject = await env.getDependencies();
|
277
|
+
// const peersAutoDetectPolicy = new PeersAutoDetectPolicy(peerDepsConfig.peers || []);
|
278
|
+
// const peers = Object.keys(peerDepsConfig.peerDependencies || {}).concat(peersAutoDetectPolicy?.names);
|
279
|
+
// const depsToMap = peers.concat(additionalHostDependencies || []);
|
280
|
+
|
281
|
+
// /**
|
282
|
+
// * Try to resolve the dependency from the rootDir (the env dir) or from the root path (workspace/capsule root)
|
283
|
+
// */
|
284
|
+
// const mappedValues = ['<rootDir>/node_modules/$1', `${rootPath}/node_modules/$1`];
|
285
|
+
|
286
|
+
// const moduleNameMapper = depsToMap.reduce((acc, peerName) => {
|
287
|
+
// const keyName = `^(${peerName})$`;
|
288
|
+
// acc[keyName] = mappedValues;
|
289
|
+
// const internalPathKeyName = `^(${peerName}/.*)$`;
|
290
|
+
// acc[internalPathKeyName] = mappedValues;
|
291
|
+
// return acc;
|
292
|
+
// }, {});
|
293
|
+
|
294
|
+
// return moduleNameMapper;
|
295
|
+
// }
|
296
|
+
|
297
|
+
private patternsToArray(context: TesterContext): string[] {
|
298
|
+
return flatten(
|
299
|
+
context.patterns.toArray().map(([component, patternEntry]) => {
|
300
|
+
return this.resolveComponentPattern(component, patternEntry, context);
|
301
|
+
})
|
302
|
+
);
|
303
|
+
}
|
304
|
+
|
305
|
+
private resolveComponentPattern(
|
306
|
+
component: Component,
|
307
|
+
patternEntry: ComponentPatternsEntry,
|
308
|
+
context: TesterContext
|
309
|
+
): string[] {
|
310
|
+
if (this.opts.resolveSpecPaths) {
|
311
|
+
return this.opts.resolveSpecPaths(component, context);
|
312
|
+
}
|
313
|
+
const customPatterns = this.opts.patterns;
|
314
|
+
// If pattern were provided to the specific instance of the tester, use them
|
315
|
+
if (customPatterns && !isEmpty(customPatterns)) {
|
316
|
+
customPatterns.map((customPattern) => {
|
317
|
+
const rootDirs = this.opts.roots || [patternEntry.componentDir];
|
318
|
+
return this.resolvePattern(customPattern, rootDirs);
|
319
|
+
});
|
320
|
+
}
|
321
|
+
return patternEntry.paths.map((p) => p.path);
|
322
|
+
}
|
323
|
+
|
324
|
+
private resolvePattern(pattern: string, rootDirs: string[]) {
|
325
|
+
return rootDirs.map((dir) => resolve(dir, pattern));
|
326
|
+
}
|
327
|
+
}
|
package/jest.worker.ts
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
import { stringify, parse } from 'flatted';
|
2
|
+
import { expose } from '@teambit/worker';
|
3
|
+
|
4
|
+
export class JestWorker {
|
5
|
+
private onTestCompleteCb;
|
6
|
+
|
7
|
+
onTestComplete(onTestComplete) {
|
8
|
+
this.onTestCompleteCb = onTestComplete;
|
9
|
+
// return this;
|
10
|
+
}
|
11
|
+
|
12
|
+
watch(
|
13
|
+
jestConfigPath: string,
|
14
|
+
testFiles: string[],
|
15
|
+
rootPath: string,
|
16
|
+
jestModulePath: string,
|
17
|
+
envRootDir: string
|
18
|
+
): Promise<void> {
|
19
|
+
return new Promise((resolve) => {
|
20
|
+
// TODO: remove this after jest publish new version to npm: https://github.com/facebook/jest/pull/10804
|
21
|
+
// eslint-disable-next-line
|
22
|
+
console.warn = function () {};
|
23
|
+
/* The path to the jest config file. */
|
24
|
+
// eslint-disable-next-line import/no-dynamic-require,global-require
|
25
|
+
const jestConfig = require(jestConfigPath);
|
26
|
+
// eslint-disable-next-line import/no-dynamic-require,global-require
|
27
|
+
const jestModule: any = require(jestModulePath);
|
28
|
+
|
29
|
+
const jestConfigWithSpecs = Object.assign(jestConfig, {
|
30
|
+
testMatch: testFiles,
|
31
|
+
});
|
32
|
+
|
33
|
+
const config: any = {
|
34
|
+
// Setting the rootDir to the env root dir to make sure we can resolve all the jest presets/plugins
|
35
|
+
// from the env context
|
36
|
+
rootDir: envRootDir,
|
37
|
+
// Setting the roots (where to search for spec files) to the root path (either workspace or capsule root)
|
38
|
+
// TODO: consider change this to be an array of the components running dir.
|
39
|
+
// TODO: aka: in the workspace it will be something like <ws>/node_modules/<comp-package-name>/node_modules/<comp-package-name>
|
40
|
+
// TODO: see dependencyResolver.getRuntimeModulePath (this will make sure the peer deps resolved correctly)
|
41
|
+
// TODO: (@GiladShoham - when trying to set it to this paths, jest ignores it probably because the paths contains "node_modules"
|
42
|
+
// TODO: trying to set the https://jestjs.io/docs/27.x/configuration#testpathignorepatterns-arraystring to something else (as it contain node_modules by default)
|
43
|
+
// TODO: didn't help)
|
44
|
+
roots: [rootPath],
|
45
|
+
// useStderr: true,
|
46
|
+
// TODO: check way to enable it
|
47
|
+
runInBand: true,
|
48
|
+
silent: false,
|
49
|
+
watch: true,
|
50
|
+
watchAll: true,
|
51
|
+
watchPlugins: [
|
52
|
+
[
|
53
|
+
`${__dirname}/watch.js`,
|
54
|
+
{
|
55
|
+
specFiles: testFiles,
|
56
|
+
onComplete: (results) => {
|
57
|
+
if (!this.onTestCompleteCb) return;
|
58
|
+
try {
|
59
|
+
const json = parse(stringify(results));
|
60
|
+
this.onTestCompleteCb(json);
|
61
|
+
// disable eslint because we want to catch error but not print it on worker
|
62
|
+
// eslint-disable-next-line
|
63
|
+
} catch (error: any) {}
|
64
|
+
},
|
65
|
+
},
|
66
|
+
],
|
67
|
+
],
|
68
|
+
};
|
69
|
+
|
70
|
+
const withEnv = Object.assign(jestConfigWithSpecs, config);
|
71
|
+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
72
|
+
const res = jestModule.runCLI(withEnv, [jestConfigPath]);
|
73
|
+
// eslint-disable-next-line no-console
|
74
|
+
res.catch((err) => console.error(err));
|
75
|
+
resolve();
|
76
|
+
});
|
77
|
+
}
|
78
|
+
}
|
79
|
+
|
80
|
+
expose(new JestWorker());
|
package/package.json
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
{
|
2
2
|
"name": "@teambit/jest",
|
3
|
-
"version": "1.0.
|
3
|
+
"version": "1.0.108",
|
4
4
|
"homepage": "https://bit.cloud/teambit/defender/jest",
|
5
5
|
"main": "dist/index.js",
|
6
6
|
"componentId": {
|
7
7
|
"scope": "teambit.defender",
|
8
8
|
"name": "jest",
|
9
|
-
"version": "1.0.
|
9
|
+
"version": "1.0.108"
|
10
10
|
},
|
11
11
|
"dependencies": {
|
12
12
|
"lodash": "4.17.21",
|
@@ -17,31 +17,27 @@
|
|
17
17
|
"minimatch": "3.0.5",
|
18
18
|
"flatted": "3.1.0",
|
19
19
|
"jest-watcher": "27.5.1",
|
20
|
-
"core-js": "^3.0.0",
|
21
|
-
"@babel/runtime": "7.20.0",
|
22
20
|
"@teambit/harmony": "0.4.6",
|
23
|
-
"@teambit/
|
24
|
-
"@teambit/
|
25
|
-
"@teambit/
|
26
|
-
"@teambit/
|
27
|
-
"@teambit/
|
28
|
-
"@teambit/
|
21
|
+
"@teambit/tests-results": "1.0.4",
|
22
|
+
"@teambit/cli": "0.0.840",
|
23
|
+
"@teambit/logger": "0.0.933",
|
24
|
+
"@teambit/worker": "0.0.1144",
|
25
|
+
"@teambit/component": "1.0.108",
|
26
|
+
"@teambit/tester": "1.0.108"
|
29
27
|
},
|
30
28
|
"devDependencies": {
|
31
29
|
"@types/lodash": "4.14.165",
|
32
|
-
"@types/
|
33
|
-
"@types/jest": "^26.0.0",
|
30
|
+
"@types/jest": "^29.2.2",
|
34
31
|
"@types/fs-extra": "9.0.7",
|
35
32
|
"@types/minimatch": "3.0.4",
|
36
|
-
"@types/
|
37
|
-
"@
|
38
|
-
"@types/testing-library__jest-dom": "5.9.5"
|
33
|
+
"@types/testing-library__jest-dom": "^5.9.5",
|
34
|
+
"@teambit/harmony.envs.core-aspect-env": "0.0.13"
|
39
35
|
},
|
40
36
|
"peerDependencies": {
|
41
|
-
"@teambit/legacy": "1.0.
|
37
|
+
"@teambit/legacy": "1.0.625",
|
42
38
|
"jest": "27.5.1",
|
43
|
-
"react": "^
|
44
|
-
"react
|
39
|
+
"react": "^17.0.0 || ^18.0.0",
|
40
|
+
"@types/react": "^18.2.12"
|
45
41
|
},
|
46
42
|
"license": "Apache-2.0",
|
47
43
|
"optionalDependencies": {},
|
@@ -55,7 +51,7 @@
|
|
55
51
|
},
|
56
52
|
"private": false,
|
57
53
|
"engines": {
|
58
|
-
"node": ">=
|
54
|
+
"node": ">=16.0.0"
|
59
55
|
},
|
60
56
|
"repository": {
|
61
57
|
"type": "git",
|
@@ -64,12 +60,9 @@
|
|
64
60
|
"keywords": [
|
65
61
|
"bit",
|
66
62
|
"bit-aspect",
|
63
|
+
"bit-core-aspect",
|
67
64
|
"components",
|
68
65
|
"collaboration",
|
69
|
-
"web"
|
70
|
-
"react",
|
71
|
-
"react-components",
|
72
|
-
"angular",
|
73
|
-
"angular-components"
|
66
|
+
"web"
|
74
67
|
]
|
75
68
|
}
|
package/tsconfig.json
CHANGED
@@ -1,38 +1,33 @@
|
|
1
1
|
{
|
2
2
|
"compilerOptions": {
|
3
3
|
"lib": [
|
4
|
-
"
|
5
|
-
"
|
6
|
-
"
|
7
|
-
"DOM.Iterable",
|
8
|
-
"ScriptHost"
|
4
|
+
"esnext",
|
5
|
+
"dom",
|
6
|
+
"dom.Iterable"
|
9
7
|
],
|
10
|
-
"target": "
|
11
|
-
"module": "
|
12
|
-
"jsx": "react",
|
13
|
-
"allowJs": true,
|
14
|
-
"composite": true,
|
8
|
+
"target": "es2020",
|
9
|
+
"module": "es2020",
|
10
|
+
"jsx": "react-jsx",
|
15
11
|
"declaration": true,
|
16
12
|
"sourceMap": true,
|
17
|
-
"skipLibCheck": true,
|
18
13
|
"experimentalDecorators": true,
|
19
|
-
"
|
14
|
+
"skipLibCheck": true,
|
20
15
|
"moduleResolution": "node",
|
21
16
|
"esModuleInterop": true,
|
22
|
-
"rootDir": ".",
|
23
17
|
"resolveJsonModule": true,
|
24
|
-
"
|
25
|
-
"
|
26
|
-
"
|
27
|
-
"strictPropertyInitialization": false,
|
28
|
-
"strict": true,
|
29
|
-
"noImplicitAny": false,
|
30
|
-
"preserveConstEnums": true
|
18
|
+
"allowJs": true,
|
19
|
+
"outDir": "dist",
|
20
|
+
"emitDeclarationOnly": true
|
31
21
|
},
|
32
22
|
"exclude": [
|
23
|
+
"artifacts",
|
24
|
+
"public",
|
33
25
|
"dist",
|
26
|
+
"node_modules",
|
27
|
+
"package.json",
|
34
28
|
"esm.mjs",
|
35
|
-
"
|
29
|
+
"**/*.cjs",
|
30
|
+
"./dist"
|
36
31
|
],
|
37
32
|
"include": [
|
38
33
|
"**/*",
|
package/types/asset.d.ts
CHANGED
@@ -5,12 +5,12 @@ declare module '*.png' {
|
|
5
5
|
declare module '*.svg' {
|
6
6
|
import type { FunctionComponent, SVGProps } from 'react';
|
7
7
|
|
8
|
-
export const ReactComponent: FunctionComponent<
|
8
|
+
export const ReactComponent: FunctionComponent<
|
9
|
+
SVGProps<SVGSVGElement> & { title?: string }
|
10
|
+
>;
|
9
11
|
const src: string;
|
10
12
|
export default src;
|
11
13
|
}
|
12
|
-
|
13
|
-
// @TODO Gilad
|
14
14
|
declare module '*.jpg' {
|
15
15
|
const value: any;
|
16
16
|
export = value;
|
@@ -27,3 +27,15 @@ declare module '*.bmp' {
|
|
27
27
|
const value: any;
|
28
28
|
export = value;
|
29
29
|
}
|
30
|
+
declare module '*.otf' {
|
31
|
+
const value: any;
|
32
|
+
export = value;
|
33
|
+
}
|
34
|
+
declare module '*.woff' {
|
35
|
+
const value: any;
|
36
|
+
export = value;
|
37
|
+
}
|
38
|
+
declare module '*.woff2' {
|
39
|
+
const value: any;
|
40
|
+
export = value;
|
41
|
+
}
|
package/watch.ts
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
import { Prompt, WatchPlugin, JestHookSubscriber, UsageData } from 'jest-watcher';
|
2
|
+
import { SpecFiles } from '@teambit/tester';
|
3
|
+
|
4
|
+
export type PluginConfig = {
|
5
|
+
onComplete: (testSuite: any) => void;
|
6
|
+
specFiles: SpecFiles;
|
7
|
+
};
|
8
|
+
|
9
|
+
class Watch implements WatchPlugin {
|
10
|
+
_stdin: NodeJS.ReadStream;
|
11
|
+
|
12
|
+
_stdout: NodeJS.WriteStream;
|
13
|
+
|
14
|
+
_prompt: Prompt;
|
15
|
+
|
16
|
+
_testResults: any;
|
17
|
+
|
18
|
+
_usageInfo: UsageData;
|
19
|
+
|
20
|
+
_specFiles: SpecFiles;
|
21
|
+
|
22
|
+
_onComplete: (testSuite: any) => void;
|
23
|
+
|
24
|
+
constructor({
|
25
|
+
stdin,
|
26
|
+
stdout,
|
27
|
+
config,
|
28
|
+
}: {
|
29
|
+
stdin: NodeJS.ReadStream;
|
30
|
+
stdout: NodeJS.WriteStream;
|
31
|
+
config: PluginConfig;
|
32
|
+
}) {
|
33
|
+
this._stdin = stdin;
|
34
|
+
this._stdout = stdout;
|
35
|
+
this._specFiles = config.specFiles;
|
36
|
+
this._onComplete = config.onComplete;
|
37
|
+
}
|
38
|
+
|
39
|
+
private findComponent(specFile: string) {
|
40
|
+
const component = this._specFiles.toArray().find(([, specs]) => {
|
41
|
+
const paths = specs.map((spec) => spec.path);
|
42
|
+
if (paths.includes(specFile)) return true;
|
43
|
+
return false;
|
44
|
+
});
|
45
|
+
return component?.[0];
|
46
|
+
}
|
47
|
+
|
48
|
+
apply(jestHooks: JestHookSubscriber) {
|
49
|
+
// jestHooks.shouldRunTestSuite(async (testSuite) => {
|
50
|
+
// const component = this.findComponent(testSuite.testPath);
|
51
|
+
// if ((await component?.isModified()) || (await component?.isNew())) return true;
|
52
|
+
// return false;
|
53
|
+
// });
|
54
|
+
|
55
|
+
jestHooks.onTestRunComplete((results) => {
|
56
|
+
this._onComplete(results);
|
57
|
+
});
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
module.exports = Watch;
|