@teambit/tester 1.0.588 → 1.0.590

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.
@@ -0,0 +1,18 @@
1
+ .coverageTooltip {
2
+ padding: 0;
3
+ // need to add !important to override the inline style added by Tippy.js
4
+ max-width: fit-content !important;
5
+ }
6
+ .coverageTooltipContent {
7
+ font-size: var(--bit-p-xs, '14px');
8
+ }
9
+ .label {
10
+ padding: 4px 8px;
11
+ display: flex;
12
+ align-items: center;
13
+ gap: 4px;
14
+ }
15
+ .link {
16
+ text-decoration: none;
17
+ }
18
+
@@ -0,0 +1,18 @@
1
+ .coverageTooltip {
2
+ padding: 0;
3
+ // need to add !important to override the inline style added by Tippy.js
4
+ max-width: fit-content !important;
5
+ }
6
+ .coverageTooltipContent {
7
+ font-size: var(--bit-p-xs, '14px');
8
+ }
9
+ .label {
10
+ padding: 4px 8px;
11
+ display: flex;
12
+ align-items: center;
13
+ gap: 4px;
14
+ }
15
+ .link {
16
+ text-decoration: none;
17
+ }
18
+
@@ -1,5 +1,5 @@
1
- import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.defender_tester@1.0.588/dist/tester.composition.js';
2
- import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.defender_tester@1.0.588/dist/tester.docs.mdx';
1
+ import * as compositions_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.defender_tester@1.0.590/dist/tester.composition.js';
2
+ import * as overview_0 from '/home/circleci/Library/Caches/Bit/capsules/8891be5ad/teambit.defender_tester@1.0.590/dist/tester.docs.mdx';
3
3
 
4
4
  export const compositions = [compositions_0];
5
5
  export const overview = [overview_0];
@@ -32,6 +32,11 @@ function _tester() {
32
32
  };
33
33
  return data;
34
34
  }
35
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
36
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
37
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
38
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
39
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
35
40
  function testerSchema(tester, graphql) {
36
41
  return {
37
42
  typeDefs: (0, _graphqlTag().gql)`
@@ -56,6 +61,7 @@ function testerSchema(tester, graphql) {
56
61
  testFiles: [TestFiles]
57
62
  success: Boolean
58
63
  start: Int
64
+ coverage: CoverageResult
59
65
  }
60
66
 
61
67
  type TestFiles {
@@ -76,6 +82,30 @@ function testerSchema(tester, graphql) {
76
82
  status: String
77
83
  error: String
78
84
  }
85
+
86
+ type CoverageResult {
87
+ files: [FileCoverage!]
88
+ total: CoverageData!
89
+ }
90
+
91
+ type CoverageDetails {
92
+ total: Int!
93
+ covered: Int!
94
+ skipped: Int!
95
+ pct: Float!
96
+ }
97
+
98
+ type CoverageData {
99
+ lines: CoverageDetails!
100
+ functions: CoverageDetails!
101
+ statements: CoverageDetails!
102
+ branches: CoverageDetails!
103
+ }
104
+
105
+ type FileCoverage {
106
+ path: String!
107
+ data: CoverageData!
108
+ }
79
109
  `,
80
110
  resolvers: {
81
111
  Subscription: {
@@ -93,9 +123,22 @@ function testerSchema(tester, graphql) {
93
123
  const idHasVersion = _componentId().ComponentID.fromString(id).hasVersion();
94
124
  const component = await host.get(componentId);
95
125
  if (!component) return null;
96
- const testsResults = await tester.getTestsResults(component, idHasVersion);
97
- if (!testsResults) return null;
98
- return testsResults;
126
+ const testsData = await tester.getTestsResults(component, idHasVersion);
127
+ if (!testsData) return null;
128
+ return _objectSpread(_objectSpread({}, testsData), {}, {
129
+ testsResults: _objectSpread(_objectSpread({}, testsData.testsResults), {}, {
130
+ testFiles: testsData.testsResults?.testFiles.map(testFile => {
131
+ return _objectSpread(_objectSpread({}, testFile), {}, {
132
+ duration: testFile.duration?.toFixed(0),
133
+ tests: testFile.tests.map(test => {
134
+ return _objectSpread(_objectSpread({}, test), {}, {
135
+ duration: test.duration?.toFixed(0)
136
+ });
137
+ })
138
+ });
139
+ })
140
+ })
141
+ });
99
142
  }
100
143
  }
101
144
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_graphqlSubscriptions","data","require","_componentId","_graphqlTag","_tester","testerSchema","tester","graphql","typeDefs","gql","resolvers","Subscription","testsChanged","subscribe","withFilter","pubsub","asyncIterator","OnTestsChanged","payload","variables","id","ComponentHost","getTests","host","componentId","resolveComponentId","idHasVersion","ComponentID","fromString","hasVersion","component","get","testsResults","getTestsResults"],"sources":["tester.graphql.ts"],"sourcesContent":["import { GraphqlMain, Schema } from '@teambit/graphql';\nimport { ComponentFactory } from '@teambit/component';\nimport { withFilter } from 'graphql-subscriptions';\nimport { ComponentID } from '@teambit/component-id';\nimport { gql } from 'graphql-tag';\n\nimport { TesterMain } from './tester.main.runtime';\nimport { OnTestsChanged } from './tester.service';\n\nexport function testerSchema(tester: TesterMain, graphql: GraphqlMain): Schema {\n return {\n typeDefs: gql`\n extend type ComponentHost {\n getTests(id: String!): Tests\n }\n\n type Subscription {\n testsChanged(id: String!): Tests\n }\n\n type Tests {\n loading: Boolean!\n testsResults: TestsResults\n }\n\n type TestsChanged {\n testsResults: TestsResults\n }\n\n type TestsResults {\n testFiles: [TestFiles]\n success: Boolean\n start: Int\n }\n\n type TestFiles {\n file: String\n tests: [Tests]\n pass: Int\n failed: Int\n pending: Int\n duration: Int\n slow: Boolean\n errorStr: String\n }\n\n type Tests {\n ancestor: [String]\n name: String\n duration: String\n status: String\n error: String\n }\n `,\n resolvers: {\n Subscription: {\n testsChanged: {\n subscribe: withFilter(\n () => graphql.pubsub.asyncIterator(OnTestsChanged),\n (payload, variables) => {\n return payload.testsChanged.id === variables.id;\n }\n ),\n },\n },\n\n ComponentHost: {\n getTests: async (host: ComponentFactory, { id }: { id: string }) => {\n const componentId = await host.resolveComponentId(id);\n const idHasVersion = ComponentID.fromString(id).hasVersion();\n const component = await host.get(componentId);\n if (!component) return null;\n const testsResults = await tester.getTestsResults(component, idHasVersion);\n if (!testsResults) return null;\n return testsResults;\n },\n },\n },\n };\n}\n"],"mappings":";;;;;;AAEA,SAAAA,sBAAA;EAAA,MAAAC,IAAA,GAAAC,OAAA;EAAAF,qBAAA,YAAAA,CAAA;IAAA,OAAAC,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAE,aAAA;EAAA,MAAAF,IAAA,GAAAC,OAAA;EAAAC,YAAA,YAAAA,CAAA;IAAA,OAAAF,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AACA,SAAAG,YAAA;EAAA,MAAAH,IAAA,GAAAC,OAAA;EAAAE,WAAA,YAAAA,CAAA;IAAA,OAAAH,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAGA,SAAAI,QAAA;EAAA,MAAAJ,IAAA,GAAAC,OAAA;EAAAG,OAAA,YAAAA,CAAA;IAAA,OAAAJ,IAAA;EAAA;EAAA,OAAAA,IAAA;AAAA;AAEO,SAASK,YAAYA,CAACC,MAAkB,EAAEC,OAAoB,EAAU;EAC7E,OAAO;IACLC,QAAQ,EAAE,IAAAC,iBAAG;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;IACDC,SAAS,EAAE;MACTC,YAAY,EAAE;QACZC,YAAY,EAAE;UACZC,SAAS,EAAE,IAAAC,kCAAU,EACnB,MAAMP,OAAO,CAACQ,MAAM,CAACC,aAAa,CAACC,wBAAc,CAAC,EAClD,CAACC,OAAO,EAAEC,SAAS,KAAK;YACtB,OAAOD,OAAO,CAACN,YAAY,CAACQ,EAAE,KAAKD,SAAS,CAACC,EAAE;UACjD,CACF;QACF;MACF,CAAC;MAEDC,aAAa,EAAE;QACbC,QAAQ,EAAE,MAAAA,CAAOC,IAAsB,EAAE;UAAEH;QAAmB,CAAC,KAAK;UAClE,MAAMI,WAAW,GAAG,MAAMD,IAAI,CAACE,kBAAkB,CAACL,EAAE,CAAC;UACrD,MAAMM,YAAY,GAAGC,0BAAW,CAACC,UAAU,CAACR,EAAE,CAAC,CAACS,UAAU,CAAC,CAAC;UAC5D,MAAMC,SAAS,GAAG,MAAMP,IAAI,CAACQ,GAAG,CAACP,WAAW,CAAC;UAC7C,IAAI,CAACM,SAAS,EAAE,OAAO,IAAI;UAC3B,MAAME,YAAY,GAAG,MAAM1B,MAAM,CAAC2B,eAAe,CAACH,SAAS,EAAEJ,YAAY,CAAC;UAC1E,IAAI,CAACM,YAAY,EAAE,OAAO,IAAI;UAC9B,OAAOA,YAAY;QACrB;MACF;IACF;EACF,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["_graphqlSubscriptions","data","require","_componentId","_graphqlTag","_tester","ownKeys","e","r","t","Object","keys","getOwnPropertySymbols","o","filter","getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_toPropertyKey","value","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","testerSchema","tester","graphql","typeDefs","gql","resolvers","Subscription","testsChanged","subscribe","withFilter","pubsub","asyncIterator","OnTestsChanged","payload","variables","id","ComponentHost","getTests","host","componentId","resolveComponentId","idHasVersion","ComponentID","fromString","hasVersion","component","get","testsData","getTestsResults","testsResults","testFiles","map","testFile","duration","toFixed","tests","test"],"sources":["tester.graphql.ts"],"sourcesContent":["import { GraphqlMain, Schema } from '@teambit/graphql';\nimport { ComponentFactory } from '@teambit/component';\nimport { withFilter } from 'graphql-subscriptions';\nimport { ComponentID } from '@teambit/component-id';\nimport { gql } from 'graphql-tag';\n\nimport { TesterMain } from './tester.main.runtime';\nimport { OnTestsChanged } from './tester.service';\n\nexport function testerSchema(tester: TesterMain, graphql: GraphqlMain): Schema {\n return {\n typeDefs: gql`\n extend type ComponentHost {\n getTests(id: String!): Tests\n }\n\n type Subscription {\n testsChanged(id: String!): Tests\n }\n\n type Tests {\n loading: Boolean!\n testsResults: TestsResults\n }\n\n type TestsChanged {\n testsResults: TestsResults\n }\n\n type TestsResults {\n testFiles: [TestFiles]\n success: Boolean\n start: Int\n coverage: CoverageResult\n }\n\n type TestFiles {\n file: String\n tests: [Tests]\n pass: Int\n failed: Int\n pending: Int\n duration: Int\n slow: Boolean\n errorStr: String\n }\n\n type Tests {\n ancestor: [String]\n name: String\n duration: String\n status: String\n error: String\n }\n\n type CoverageResult {\n files: [FileCoverage!]\n total: CoverageData!\n }\n\n type CoverageDetails {\n total: Int!\n covered: Int!\n skipped: Int!\n pct: Float!\n }\n\n type CoverageData {\n lines: CoverageDetails!\n functions: CoverageDetails!\n statements: CoverageDetails!\n branches: CoverageDetails!\n }\n\n type FileCoverage {\n path: String!\n data: CoverageData!\n }\n `,\n resolvers: {\n Subscription: {\n testsChanged: {\n subscribe: withFilter(\n () => graphql.pubsub.asyncIterator(OnTestsChanged),\n (payload, variables) => {\n return payload.testsChanged.id === variables.id;\n }\n ),\n },\n },\n\n ComponentHost: {\n getTests: async (host: ComponentFactory, { id }: { id: string }) => {\n const componentId = await host.resolveComponentId(id);\n const idHasVersion = ComponentID.fromString(id).hasVersion();\n const component = await host.get(componentId);\n if (!component) return null;\n const testsData = await tester.getTestsResults(component, idHasVersion);\n if (!testsData) return null;\n return {\n ...testsData,\n testsResults: {\n ...testsData.testsResults,\n testFiles: testsData.testsResults?.testFiles.map((testFile) => {\n return {\n ...testFile,\n duration: testFile.duration?.toFixed(0),\n tests: testFile.tests.map((test) => {\n return {\n ...test,\n duration: test.duration?.toFixed(0),\n }\n }),\n }\n }),\n }\n }\n },\n },\n },\n };\n}\n"],"mappings":"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","ignoreList":[]}
@@ -54,6 +54,26 @@ export type TesterOptions = {
54
54
  updateSnapshot?: boolean;
55
55
  callback?: CallbackFn;
56
56
  };
57
+ type CoverageResults = {
58
+ files: CoverageFile[];
59
+ total: CoverageData;
60
+ };
61
+ type CoverageStats = {
62
+ pct: number;
63
+ total: number;
64
+ covered: number;
65
+ skipped: number;
66
+ };
67
+ type CoverageFile = {
68
+ path: string;
69
+ data: CoverageData;
70
+ };
71
+ type CoverageData = {
72
+ lines: CoverageStats;
73
+ statements: CoverageStats;
74
+ functions: CoverageStats;
75
+ branches: CoverageStats;
76
+ };
57
77
  export declare class TesterMain {
58
78
  private patterns;
59
79
  /**
@@ -114,6 +134,7 @@ export declare class TesterMain {
114
134
  getTestsResults(component: IComponent, idHasVersion?: boolean): Promise<{
115
135
  testsResults?: TestsResult;
116
136
  loading: boolean;
137
+ coverage?: CoverageResults;
117
138
  } | undefined>;
118
139
  private getTestsResultsFromState;
119
140
  /**
@@ -155,3 +176,4 @@ export declare class TesterMain {
155
176
  BuilderMain
156
177
  ], config: TesterExtensionConfig): Promise<TesterMain>;
157
178
  }
179
+ export {};
@@ -215,7 +215,8 @@ class TesterMain {
215
215
  if ((entry || data) && !isModified) {
216
216
  return {
217
217
  testsResults: data?.tests || entry?.data.tests,
218
- loading: false
218
+ loading: false,
219
+ coverage: data?.tests.coverage
219
220
  };
220
221
  }
221
222
  return this.getTestsResultsFromState(component);
@@ -224,7 +225,8 @@ class TesterMain {
224
225
  const tests = this._testsResults[component.id.toString()];
225
226
  return {
226
227
  testsResults: tests?.results,
227
- loading: tests?.loading || false
228
+ loading: tests?.loading || false,
229
+ coverage: tests?.coverage
228
230
  };
229
231
  }
230
232
 
@@ -1 +1 @@
1
- {"version":3,"names":["_fsExtra","data","_interopRequireDefault","require","_cli","_lodash","_envs","_logger","_workspace","_graphql","_builder","_ui","_lodash2","_devFiles","_test","_tester","_tester2","_tester3","_utils","_tester4","_junitGenerator","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","TesterMain","constructor","patterns","graphql","envs","workspace","service","task","devFiles","builder","test","components","opts","options","getOptions","envsRuntime","createEnvironment","env","runEnv","results","run","junit","generateJUnit","filePath","testsResults","map","envResult","flat","jUnit","testsResultsToJUnitFormat","compact","fs","outputFile","watch","onTestRunComplete","forEach","component","_testsResults","componentId","toString","uiWatch","list","debug","ui","getTestsResults","idHasVersion","entry","get","TesterAspect","id","isModified","getDataByAspect","tests","loading","getTestsResultsFromState","getPatterns","getComponentDevPatterns","calculateEnv","skipWarnings","inInstallContext","componentPatterns","getTestsDevPatterns","name","pattern","getDevPatternToRegister","bind","getTestFiles","detectTestFiles","defaults","merge","provider","cli","loggerAspect","config","logger","createLogger","testerService","TesterService","pubsub","registerService","tester","TesterTask","registerDevPattern","registerOnStart","watchOnStart","undefined","register","TestCmd","testerSchema","exports","MainRuntime","CLIAspect","EnvsAspect","WorkspaceAspect","LoggerAspect","GraphqlAspect","UIAspect","DevFilesAspect","BuilderAspect","addRuntime"],"sources":["tester.main.runtime.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport { CLIAspect, CLIMain, MainRuntime } from '@teambit/cli';\nimport { Component, IComponent } from '@teambit/component';\nimport compact from 'lodash.compact';\nimport { EnvsAspect, EnvsExecutionResult, EnvsMain } from '@teambit/envs';\nimport { LoggerAspect, LoggerMain } from '@teambit/logger';\nimport { Workspace, WorkspaceAspect } from '@teambit/workspace';\nimport { GraphqlAspect, GraphqlMain } from '@teambit/graphql';\nimport { BuilderAspect, BuilderMain } from '@teambit/builder';\nimport { UiMain, UIAspect } from '@teambit/ui';\nimport { merge } from 'lodash';\nimport { DevFilesAspect, DevFilesMain } from '@teambit/dev-files';\nimport { TestsResult } from '@teambit/tests-results';\nimport { ComponentsResults, CallbackFn, Tests } from './tester';\nimport { TestCmd } from './test.cmd';\nimport { TesterAspect } from './tester.aspect';\nimport { TesterService } from './tester.service';\nimport { TesterTask } from './tester.task';\nimport { detectTestFiles } from './utils';\nimport { testerSchema } from './tester.graphql';\nimport { testsResultsToJUnitFormat } from './utils/junit-generator';\n\nexport type TesterExtensionConfig = {\n /**\n * regex of the text environment.\n */\n testRegex: string;\n\n /**\n * determine whether to watch on start.\n */\n watchOnStart: boolean;\n patterns: string[];\n};\n\nexport type TestResults = EnvsExecutionResult<Tests>;\n\nexport type TesterOptions = {\n /**\n * start the tester in watch mode.\n */\n watch: boolean;\n\n /**\n * start the tester in debug mode.\n */\n debug: boolean;\n\n /**\n * start the tester in debug mode.\n */\n ui?: boolean;\n\n /**\n * initiate the tester on given env.\n */\n env?: string;\n\n /**\n * generate JUnit files on the specified dir\n */\n junit?: string;\n\n /**\n * show code coverage\n */\n coverage?: boolean;\n\n /**\n * update snapshot if supported by the tester\n */\n updateSnapshot?: boolean;\n\n callback?: CallbackFn;\n};\n\nexport class TesterMain {\n static runtime = MainRuntime;\n static dependencies = [\n CLIAspect,\n EnvsAspect,\n WorkspaceAspect,\n LoggerAspect,\n GraphqlAspect,\n UIAspect,\n DevFilesAspect,\n BuilderAspect,\n ];\n\n constructor(\n private patterns: string[],\n /**\n * graphql extension.\n */\n private graphql: GraphqlMain,\n\n /**\n * envs extension.\n */\n private envs: EnvsMain,\n\n /**\n * workspace extension.\n */\n private workspace: Workspace,\n\n /**\n * tester service.\n */\n readonly service: TesterService,\n\n /**\n * build task.\n */\n readonly task: TesterTask,\n\n private devFiles: DevFilesMain,\n\n private builder: BuilderMain\n ) {}\n\n _testsResults: { [componentId: string]: ComponentsResults } | undefined[] = [];\n\n async test(components: Component[], opts?: TesterOptions): Promise<TestResults> {\n const options = this.getOptions(opts);\n const envsRuntime = await this.envs.createEnvironment(components);\n if (opts?.env) {\n return envsRuntime.runEnv(opts.env, this.service, options);\n }\n const results = await envsRuntime.run(this.service, options);\n if (opts?.junit) {\n await this.generateJUnit(opts?.junit, results);\n }\n return results;\n }\n\n private async generateJUnit(filePath: string, testsResults: TestResults) {\n const components = testsResults.results.map((envResult) => envResult.data?.components).flat();\n const jUnit = testsResultsToJUnitFormat(compact(components));\n await fs.outputFile(filePath, jUnit);\n }\n\n /**\n * watch all components for changes and test upon each.\n */\n async watch(components: Component[], opts?: TesterOptions) {\n const options = this.getOptions(opts);\n const envsRuntime = await this.envs.createEnvironment(components);\n if (opts?.env) {\n return envsRuntime.runEnv(opts.env, this.service, options);\n }\n\n this.service.onTestRunComplete((results) => {\n results.components.forEach((component) => {\n this._testsResults[component.componentId.toString()] = component;\n });\n });\n return envsRuntime.run(this.service, options);\n }\n\n async uiWatch() {\n const components = await this.workspace.list();\n return this.watch(components, { watch: true, debug: false, ui: true });\n }\n\n async getTestsResults(\n component: IComponent,\n idHasVersion = true\n ): Promise<{ testsResults?: TestsResult; loading: boolean } | undefined> {\n const entry = component.get(TesterAspect.id);\n const isModified = !idHasVersion && (await component.isModified());\n const data = this.builder.getDataByAspect(component, TesterAspect.id) as { tests: TestsResult };\n if ((entry || data) && !isModified) {\n return { testsResults: data?.tests || entry?.data.tests, loading: false };\n }\n return this.getTestsResultsFromState(component);\n }\n\n private getTestsResultsFromState(component: IComponent) {\n const tests = this._testsResults[component.id.toString()];\n return { testsResults: tests?.results, loading: tests?.loading || false };\n }\n\n /**\n * Get the tests patterns from the config. (used as default patterns in case the env does not provide them via getTestsDevPatterns)\n * @returns\n */\n getPatterns() {\n return this.patterns;\n }\n\n getComponentDevPatterns(component: Component) {\n const env = this.envs.calculateEnv(component, { skipWarnings: !!this.workspace?.inInstallContext }).env;\n const componentPatterns: string[] = env.getTestsDevPatterns\n ? env.getTestsDevPatterns(component)\n : this.getPatterns();\n return { name: 'tests', pattern: componentPatterns };\n }\n\n getDevPatternToRegister() {\n return this.getComponentDevPatterns.bind(this);\n }\n\n /**\n * get all test files of a component.\n */\n getTestFiles(component: Component) {\n return detectTestFiles(component, this.devFiles);\n }\n\n private getOptions(options?: TesterOptions): TesterOptions {\n const defaults = {\n watch: false,\n debug: false,\n };\n\n return merge(defaults, options);\n }\n\n static defaultConfig = {\n /**\n * default test regex for which files tester to apply on.\n */\n patterns: ['**/*.spec.+(js|ts|jsx|tsx)', '**/*.test.+(js|ts|jsx|tsx)'],\n\n /**\n * determine whether to watch on start.\n */\n watchOnStart: false,\n };\n\n static async provider(\n [cli, envs, workspace, loggerAspect, graphql, ui, devFiles, builder]: [\n CLIMain,\n EnvsMain,\n Workspace,\n LoggerMain,\n GraphqlMain,\n UiMain,\n DevFilesMain,\n BuilderMain,\n ],\n config: TesterExtensionConfig\n ) {\n const logger = loggerAspect.createLogger(TesterAspect.id);\n const testerService = new TesterService(workspace, logger, graphql.pubsub, devFiles);\n envs.registerService(testerService);\n const tester = new TesterMain(\n config.patterns,\n graphql,\n envs,\n workspace,\n testerService,\n new TesterTask(TesterAspect.id, devFiles),\n devFiles,\n builder\n );\n devFiles.registerDevPattern(tester.getDevPatternToRegister());\n\n if (workspace) {\n ui.registerOnStart(async () => {\n if (!config.watchOnStart) return undefined;\n await tester.uiWatch();\n return undefined;\n });\n }\n cli.register(new TestCmd(tester, workspace, logger));\n\n graphql.register(() => testerSchema(tester, graphql));\n\n return tester;\n }\n}\n\nTesterAspect.addRuntime(TesterMain);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_fsExtra","data","_interopRequireDefault","require","_cli","_lodash","_envs","_logger","_workspace","_graphql","_builder","_ui","_lodash2","_devFiles","_test","_tester","_tester2","_tester3","_utils","_tester4","_junitGenerator","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","TesterMain","constructor","patterns","graphql","envs","workspace","service","task","devFiles","builder","test","components","opts","options","getOptions","envsRuntime","createEnvironment","env","runEnv","results","run","junit","generateJUnit","filePath","testsResults","map","envResult","flat","jUnit","testsResultsToJUnitFormat","compact","fs","outputFile","watch","onTestRunComplete","forEach","component","_testsResults","componentId","toString","uiWatch","list","debug","ui","getTestsResults","idHasVersion","entry","get","TesterAspect","id","isModified","getDataByAspect","tests","loading","coverage","getTestsResultsFromState","getPatterns","getComponentDevPatterns","calculateEnv","skipWarnings","inInstallContext","componentPatterns","getTestsDevPatterns","name","pattern","getDevPatternToRegister","bind","getTestFiles","detectTestFiles","defaults","merge","provider","cli","loggerAspect","config","logger","createLogger","testerService","TesterService","pubsub","registerService","tester","TesterTask","registerDevPattern","registerOnStart","watchOnStart","undefined","register","TestCmd","testerSchema","exports","MainRuntime","CLIAspect","EnvsAspect","WorkspaceAspect","LoggerAspect","GraphqlAspect","UIAspect","DevFilesAspect","BuilderAspect","addRuntime"],"sources":["tester.main.runtime.ts"],"sourcesContent":["import fs from 'fs-extra';\nimport { CLIAspect, CLIMain, MainRuntime } from '@teambit/cli';\nimport { Component, IComponent } from '@teambit/component';\nimport compact from 'lodash.compact';\nimport { EnvsAspect, EnvsExecutionResult, EnvsMain } from '@teambit/envs';\nimport { LoggerAspect, LoggerMain } from '@teambit/logger';\nimport { Workspace, WorkspaceAspect } from '@teambit/workspace';\nimport { GraphqlAspect, GraphqlMain } from '@teambit/graphql';\nimport { BuilderAspect, BuilderMain } from '@teambit/builder';\nimport { UiMain, UIAspect } from '@teambit/ui';\nimport { merge } from 'lodash';\nimport { DevFilesAspect, DevFilesMain } from '@teambit/dev-files';\nimport { TestsResult } from '@teambit/tests-results';\nimport { ComponentsResults, CallbackFn, Tests } from './tester';\nimport { TestCmd } from './test.cmd';\nimport { TesterAspect } from './tester.aspect';\nimport { TesterService } from './tester.service';\nimport { TesterTask } from './tester.task';\nimport { detectTestFiles } from './utils';\nimport { testerSchema } from './tester.graphql';\nimport { testsResultsToJUnitFormat } from './utils/junit-generator';\n\nexport type TesterExtensionConfig = {\n /**\n * regex of the text environment.\n */\n testRegex: string;\n\n /**\n * determine whether to watch on start.\n */\n watchOnStart: boolean;\n patterns: string[];\n};\n\nexport type TestResults = EnvsExecutionResult<Tests>;\n\nexport type TesterOptions = {\n /**\n * start the tester in watch mode.\n */\n watch: boolean;\n\n /**\n * start the tester in debug mode.\n */\n debug: boolean;\n\n /**\n * start the tester in debug mode.\n */\n ui?: boolean;\n\n /**\n * initiate the tester on given env.\n */\n env?: string;\n\n /**\n * generate JUnit files on the specified dir\n */\n junit?: string;\n\n /**\n * show code coverage\n */\n coverage?: boolean;\n\n /**\n * update snapshot if supported by the tester\n */\n updateSnapshot?: boolean;\n\n callback?: CallbackFn;\n};\n\ntype CoverageResults = {\n files: CoverageFile[]\n total: CoverageData\n}\n\ntype CoverageStats = {\n pct: number\n total: number\n covered: number\n skipped: number\n}\n\ntype CoverageFile = {\n path: string\n data: CoverageData\n}\n\ntype CoverageData = {\n lines: CoverageStats\n statements: CoverageStats\n functions: CoverageStats\n branches: CoverageStats\n}\n\nexport class TesterMain {\n static runtime = MainRuntime;\n static dependencies = [\n CLIAspect,\n EnvsAspect,\n WorkspaceAspect,\n LoggerAspect,\n GraphqlAspect,\n UIAspect,\n DevFilesAspect,\n BuilderAspect,\n ];\n\n constructor(\n private patterns: string[],\n /**\n * graphql extension.\n */\n private graphql: GraphqlMain,\n\n /**\n * envs extension.\n */\n private envs: EnvsMain,\n\n /**\n * workspace extension.\n */\n private workspace: Workspace,\n\n /**\n * tester service.\n */\n readonly service: TesterService,\n\n /**\n * build task.\n */\n readonly task: TesterTask,\n\n private devFiles: DevFilesMain,\n\n private builder: BuilderMain\n ) {}\n\n _testsResults: { [componentId: string]: ComponentsResults } | undefined[] = [];\n\n async test(components: Component[], opts?: TesterOptions): Promise<TestResults> {\n const options = this.getOptions(opts);\n const envsRuntime = await this.envs.createEnvironment(components);\n if (opts?.env) {\n return envsRuntime.runEnv(opts.env, this.service, options);\n }\n const results = await envsRuntime.run(this.service, options);\n if (opts?.junit) {\n await this.generateJUnit(opts?.junit, results);\n }\n return results;\n }\n\n private async generateJUnit(filePath: string, testsResults: TestResults) {\n const components = testsResults.results.map((envResult) => envResult.data?.components).flat();\n const jUnit = testsResultsToJUnitFormat(compact(components));\n await fs.outputFile(filePath, jUnit);\n }\n\n /**\n * watch all components for changes and test upon each.\n */\n async watch(components: Component[], opts?: TesterOptions) {\n const options = this.getOptions(opts);\n const envsRuntime = await this.envs.createEnvironment(components);\n if (opts?.env) {\n return envsRuntime.runEnv(opts.env, this.service, options);\n }\n\n this.service.onTestRunComplete((results) => {\n results.components.forEach((component) => {\n this._testsResults[component.componentId.toString()] = component;\n });\n });\n return envsRuntime.run(this.service, options);\n }\n\n async uiWatch() {\n const components = await this.workspace.list();\n return this.watch(components, { watch: true, debug: false, ui: true });\n }\n\n async getTestsResults(\n component: IComponent,\n idHasVersion = true\n ): Promise<{ testsResults?: TestsResult; loading: boolean, coverage?: CoverageResults } | undefined> {\n const entry = component.get(TesterAspect.id);\n const isModified = !idHasVersion && (await component.isModified());\n const data = this.builder.getDataByAspect(component, TesterAspect.id) as { tests: TestsResult & {\n coverage: CoverageResults\n } };\n if ((entry || data) && !isModified) {\n return { testsResults: data?.tests || entry?.data.tests, loading: false, coverage: data?.tests.coverage };\n }\n return this.getTestsResultsFromState(component);\n }\n\n private getTestsResultsFromState(component: IComponent) {\n const tests = this._testsResults[component.id.toString()];\n return { testsResults: tests?.results, loading: tests?.loading || false, coverage: tests?.coverage };\n }\n\n /**\n * Get the tests patterns from the config. (used as default patterns in case the env does not provide them via getTestsDevPatterns)\n * @returns\n */\n getPatterns() {\n return this.patterns;\n }\n\n getComponentDevPatterns(component: Component) {\n const env = this.envs.calculateEnv(component, { skipWarnings: !!this.workspace?.inInstallContext }).env;\n const componentPatterns: string[] = env.getTestsDevPatterns\n ? env.getTestsDevPatterns(component)\n : this.getPatterns();\n return { name: 'tests', pattern: componentPatterns };\n }\n\n getDevPatternToRegister() {\n return this.getComponentDevPatterns.bind(this);\n }\n\n /**\n * get all test files of a component.\n */\n getTestFiles(component: Component) {\n return detectTestFiles(component, this.devFiles);\n }\n\n private getOptions(options?: TesterOptions): TesterOptions {\n const defaults = {\n watch: false,\n debug: false,\n };\n\n return merge(defaults, options);\n }\n\n static defaultConfig = {\n /**\n * default test regex for which files tester to apply on.\n */\n patterns: ['**/*.spec.+(js|ts|jsx|tsx)', '**/*.test.+(js|ts|jsx|tsx)'],\n\n /**\n * determine whether to watch on start.\n */\n watchOnStart: false,\n };\n\n static async provider(\n [cli, envs, workspace, loggerAspect, graphql, ui, devFiles, builder]: [\n CLIMain,\n EnvsMain,\n Workspace,\n LoggerMain,\n GraphqlMain,\n UiMain,\n DevFilesMain,\n BuilderMain,\n ],\n config: TesterExtensionConfig\n ) {\n const logger = loggerAspect.createLogger(TesterAspect.id);\n const testerService = new TesterService(workspace, logger, graphql.pubsub, devFiles);\n envs.registerService(testerService);\n const tester = new TesterMain(\n config.patterns,\n graphql,\n envs,\n workspace,\n testerService,\n new TesterTask(TesterAspect.id, devFiles),\n devFiles,\n builder\n );\n devFiles.registerDevPattern(tester.getDevPatternToRegister());\n\n if (workspace) {\n ui.registerOnStart(async () => {\n if (!config.watchOnStart) return undefined;\n await tester.uiWatch();\n return undefined;\n });\n }\n cli.register(new TestCmd(tester, workspace, logger));\n\n graphql.register(() => testerSchema(tester, graphql));\n\n return tester;\n }\n}\n\nTesterAspect.addRuntime(TesterMain);\n"],"mappings":"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","ignoreList":[]}
@@ -2,6 +2,7 @@ import React, { ComponentType } from 'react';
2
2
  import { SlotRegistry } from '@teambit/harmony';
3
3
  import { ComponentUI } from '@teambit/component';
4
4
  import { ComponentCompareUI } from '@teambit/component-compare';
5
+ import { DocsUI } from '@teambit/docs';
5
6
  export type EmptyStateSlot = SlotRegistry<ComponentType>;
6
7
  export declare class TesterUI {
7
8
  private component;
@@ -16,6 +17,6 @@ export declare class TesterUI {
16
17
  registerEmptyState(emptyStateComponent: ComponentType): this;
17
18
  getTesterCompare(): import("react/jsx-runtime").JSX.Element;
18
19
  static slots: ((registerFn: () => string) => SlotRegistry<React.ComponentType>)[];
19
- static provider([component, componentCompare]: [ComponentUI, ComponentCompareUI], config: any, [emptyStateSlot]: [EmptyStateSlot]): Promise<TesterUI>;
20
+ static provider([component, componentCompare, docs]: [ComponentUI, ComponentCompareUI, DocsUI], config: any, [emptyStateSlot]: [EmptyStateSlot]): Promise<TesterUI>;
20
21
  }
21
22
  export default TesterUI;
@@ -53,6 +53,48 @@ function _defenderUi2() {
53
53
  };
54
54
  return data;
55
55
  }
56
+ function _docs() {
57
+ const data = require("@teambit/docs");
58
+ _docs = function () {
59
+ return data;
60
+ };
61
+ return data;
62
+ }
63
+ function _client() {
64
+ const data = require("@apollo/client");
65
+ _client = function () {
66
+ return data;
67
+ };
68
+ return data;
69
+ }
70
+ function _designUi() {
71
+ const data = require("@teambit/design.ui.pill-label");
72
+ _designUi = function () {
73
+ return data;
74
+ };
75
+ return data;
76
+ }
77
+ function _designUi2() {
78
+ const data = require("@teambit/design.ui.tooltip");
79
+ _designUi2 = function () {
80
+ return data;
81
+ };
82
+ return data;
83
+ }
84
+ function _evangelistElements() {
85
+ const data = require("@teambit/evangelist.elements.icon");
86
+ _evangelistElements = function () {
87
+ return data;
88
+ };
89
+ return data;
90
+ }
91
+ function _baseReactNavigation() {
92
+ const data = require("@teambit/base-react.navigation.link");
93
+ _baseReactNavigation = function () {
94
+ return data;
95
+ };
96
+ return data;
97
+ }
56
98
  function _tests() {
57
99
  const data = require("./tests.section");
58
100
  _tests = function () {
@@ -67,10 +109,38 @@ function _tester() {
67
109
  };
68
110
  return data;
69
111
  }
112
+ function _coverageLabelModule() {
113
+ const data = _interopRequireDefault(require("./coverage-label.module.scss"));
114
+ _coverageLabelModule = function () {
115
+ return data;
116
+ };
117
+ return data;
118
+ }
70
119
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
71
120
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
72
121
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
73
122
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
123
+ const GET_COMPONENT = (0, _client().gql)`
124
+ query ($id: String!) {
125
+ getHost {
126
+ id # for GQL caching
127
+ getTests(id: $id) {
128
+ loading
129
+ testsResults {
130
+ coverage {
131
+ total {
132
+ lines {
133
+ covered
134
+ total
135
+ pct
136
+ }
137
+ }
138
+ }
139
+ }
140
+ }
141
+ }
142
+ }
143
+ `;
74
144
  class TesterUI {
75
145
  constructor(component, emptyStateSlot) {
76
146
  this.component = component;
@@ -90,7 +160,7 @@ class TesterUI {
90
160
  emptyState: this.emptyStateSlot
91
161
  });
92
162
  }
93
- static async provider([component, componentCompare], config, [emptyStateSlot]) {
163
+ static async provider([component, componentCompare, docs], config, [emptyStateSlot]) {
94
164
  const testerUi = new TesterUI(component, emptyStateSlot);
95
165
  const section = new (_tests().TestsSection)(emptyStateSlot);
96
166
  const testerCompareSection = new (_defenderUi2().TestCompareSection)(testerUi);
@@ -98,11 +168,42 @@ class TesterUI {
98
168
  component.registerNavigation(section.navigationLink, section.order);
99
169
  componentCompare.registerNavigation(testerCompareSection);
100
170
  componentCompare.registerRoutes([testerCompareSection.route]);
171
+ docs.registerTitleBadge({
172
+ component: function badge({
173
+ legacyComponentModel
174
+ }) {
175
+ const {
176
+ data
177
+ } = (0, _client().useQuery)(GET_COMPONENT, {
178
+ variables: {
179
+ id: legacyComponentModel.id.toString()
180
+ }
181
+ });
182
+ if (!data || !data.getHost || !data.getHost.getTests) return null;
183
+ const total = data.getHost.getTests.testsResults?.coverage?.total;
184
+ if (!total) return null;
185
+ return /*#__PURE__*/_react().default.createElement(_designUi2().Tooltip, {
186
+ className: _coverageLabelModule().default.coverageTooltip,
187
+ placement: "top",
188
+ content: /*#__PURE__*/_react().default.createElement("div", {
189
+ className: _coverageLabelModule().default.coverageTooltipContent
190
+ }, total.lines.covered, "/", total.lines.total, " lines covered")
191
+ }, /*#__PURE__*/_react().default.createElement(_baseReactNavigation().Link, {
192
+ href: `~tests${document.location.search}`,
193
+ className: _coverageLabelModule().default.link
194
+ }, /*#__PURE__*/_react().default.createElement(_designUi().PillLabel, {
195
+ className: _coverageLabelModule().default.label
196
+ }, /*#__PURE__*/_react().default.createElement("span", null, total.lines.pct, "%"), /*#__PURE__*/_react().default.createElement(_evangelistElements().Icon, {
197
+ of: "scan-component"
198
+ }))));
199
+ },
200
+ weight: 30
201
+ });
101
202
  return testerUi;
102
203
  }
103
204
  }
104
205
  exports.TesterUI = TesterUI;
105
- _defineProperty(TesterUI, "dependencies", [_component().ComponentAspect, _componentCompare().ComponentCompareAspect]);
206
+ _defineProperty(TesterUI, "dependencies", [_component().ComponentAspect, _componentCompare().ComponentCompareAspect, _docs().DocsAspect]);
106
207
  _defineProperty(TesterUI, "runtime", _ui().UIRuntime);
107
208
  _defineProperty(TesterUI, "slots", [_harmony().Slot.withType()]);
108
209
  var _default = exports.default = TesterUI;
@@ -1 +1 @@
1
- {"version":3,"names":["_react","data","_interopRequireDefault","require","_ui","_harmony","_component","_defenderUi","_componentCompare","_defenderUi2","_tests","_tester","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","TesterUI","constructor","component","emptyStateSlot","registerEmptyState","emptyStateComponent","register","getTesterCompare","createElement","CompareTests","emptyState","provider","componentCompare","config","testerUi","section","TestsSection","testerCompareSection","TestCompareSection","registerRoute","route","registerNavigation","navigationLink","order","registerRoutes","exports","ComponentAspect","ComponentCompareAspect","UIRuntime","Slot","withType","_default","TesterAspect","addRuntime"],"sources":["tester.ui.runtime.tsx"],"sourcesContent":["import React, { ComponentType } from 'react';\nimport { UIRuntime } from '@teambit/ui';\nimport { SlotRegistry, Slot } from '@teambit/harmony';\nimport { ComponentAspect, ComponentUI } from '@teambit/component';\nimport { CompareTests } from '@teambit/defender.ui.test-compare';\nimport { ComponentCompareUI, ComponentCompareAspect } from '@teambit/component-compare';\nimport { TestCompareSection } from '@teambit/defender.ui.test-compare-section';\nimport { TestsSection } from './tests.section';\nimport { TesterAspect } from './tester.aspect';\n\nexport type EmptyStateSlot = SlotRegistry<ComponentType>;\nexport class TesterUI {\n static dependencies = [ComponentAspect, ComponentCompareAspect];\n\n static runtime = UIRuntime;\n\n stageKey?: string;\n\n constructor(\n private component: ComponentUI,\n private emptyStateSlot: EmptyStateSlot\n ) {}\n\n /**\n * register a new tester empty state. this allows to register a different empty state from each environment for example.\n */\n registerEmptyState(emptyStateComponent: ComponentType) {\n this.emptyStateSlot.register(emptyStateComponent);\n return this;\n }\n\n getTesterCompare() {\n return <CompareTests emptyState={this.emptyStateSlot} />;\n }\n\n static slots = [Slot.withType<ComponentType>()];\n\n static async provider(\n [component, componentCompare]: [ComponentUI, ComponentCompareUI],\n config,\n [emptyStateSlot]: [EmptyStateSlot]\n ) {\n const testerUi = new TesterUI(component, emptyStateSlot);\n const section = new TestsSection(emptyStateSlot);\n const testerCompareSection = new TestCompareSection(testerUi);\n component.registerRoute(section.route);\n component.registerNavigation(section.navigationLink, section.order);\n componentCompare.registerNavigation(testerCompareSection);\n componentCompare.registerRoutes([testerCompareSection.route]);\n return testerUi;\n }\n}\n\nexport default TesterUI;\n\nTesterAspect.addRuntime(TesterUI);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","data","_interopRequireDefault","require","_ui","_harmony","_component","_defenderUi","_componentCompare","_defenderUi2","_docs","_client","_designUi","_designUi2","_evangelistElements","_baseReactNavigation","_tests","_tester","_coverageLabelModule","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","GET_COMPONENT","gql","TesterUI","constructor","component","emptyStateSlot","registerEmptyState","emptyStateComponent","register","getTesterCompare","createElement","CompareTests","emptyState","provider","componentCompare","docs","config","testerUi","section","TestsSection","testerCompareSection","TestCompareSection","registerRoute","route","registerNavigation","navigationLink","order","registerRoutes","registerTitleBadge","badge","legacyComponentModel","useQuery","variables","id","toString","getHost","getTests","total","testsResults","coverage","Tooltip","className","styles","coverageTooltip","placement","content","coverageTooltipContent","lines","covered","Link","href","document","location","search","link","PillLabel","label","pct","Icon","of","weight","exports","ComponentAspect","ComponentCompareAspect","DocsAspect","UIRuntime","Slot","withType","_default","TesterAspect","addRuntime"],"sources":["tester.ui.runtime.tsx"],"sourcesContent":["import React, { ComponentType } from 'react';\nimport { UIRuntime } from '@teambit/ui';\nimport { SlotRegistry, Slot } from '@teambit/harmony';\nimport { ComponentAspect, ComponentModel, ComponentUI } from '@teambit/component';\nimport { CompareTests } from '@teambit/defender.ui.test-compare';\nimport { ComponentCompareUI, ComponentCompareAspect } from '@teambit/component-compare';\nimport { TestCompareSection } from '@teambit/defender.ui.test-compare-section';\nimport { DocsAspect, DocsUI } from '@teambit/docs';\nimport { gql, useQuery } from '@apollo/client';\nimport { PillLabel } from '@teambit/design.ui.pill-label';\nimport { Tooltip } from '@teambit/design.ui.tooltip';\nimport { Icon } from '@teambit/evangelist.elements.icon';\nimport { Link } from '@teambit/base-react.navigation.link';\nimport { TestsSection } from './tests.section';\nimport { TesterAspect } from './tester.aspect';\nimport styles from './coverage-label.module.scss'\n\nconst GET_COMPONENT = gql`\n query ($id: String!) {\n getHost {\n id # for GQL caching\n getTests(id: $id) {\n loading\n testsResults {\n coverage {\n total {\n lines {\n covered\n total\n pct\n }\n }\n }\n }\n }\n }\n }\n`;\n\nexport type EmptyStateSlot = SlotRegistry<ComponentType>;\nexport class TesterUI {\n static dependencies = [ComponentAspect, ComponentCompareAspect, DocsAspect];\n\n static runtime = UIRuntime;\n\n stageKey?: string;\n\n constructor(\n private component: ComponentUI,\n private emptyStateSlot: EmptyStateSlot\n ) {}\n\n /**\n * register a new tester empty state. this allows to register a different empty state from each environment for example.\n */\n registerEmptyState(emptyStateComponent: ComponentType) {\n this.emptyStateSlot.register(emptyStateComponent);\n return this;\n }\n\n getTesterCompare() {\n return <CompareTests emptyState={this.emptyStateSlot} />;\n }\n\n static slots = [Slot.withType<ComponentType>()];\n\n static async provider(\n [component, componentCompare, docs]: [ComponentUI, ComponentCompareUI, DocsUI],\n config,\n [emptyStateSlot]: [EmptyStateSlot]\n ) {\n const testerUi = new TesterUI(component, emptyStateSlot);\n const section = new TestsSection(emptyStateSlot);\n const testerCompareSection = new TestCompareSection(testerUi);\n component.registerRoute(section.route);\n component.registerNavigation(section.navigationLink, section.order);\n componentCompare.registerNavigation(testerCompareSection);\n componentCompare.registerRoutes([testerCompareSection.route]);\n docs.registerTitleBadge({\n component: function badge({ legacyComponentModel }: { legacyComponentModel: ComponentModel }) {\n const { data } = useQuery(GET_COMPONENT, {\n variables: { id: legacyComponentModel.id.toString() },\n });\n \n if (!data || !data.getHost || !data.getHost.getTests) return null;\n\n const total = data.getHost.getTests.testsResults?.coverage?.total as {\n lines: {\n covered: number;\n total: number;\n pct: number;\n };\n };\n\n if (!total) return null;\n\n return (\n <Tooltip\n className={styles.coverageTooltip}\n placement=\"top\"\n content={\n <div className={styles.coverageTooltipContent}>\n {total.lines.covered}/{total.lines.total} lines covered\n </div>\n }\n >\n <Link href={`~tests${document.location.search}`} className={styles.link}>\n <PillLabel className={styles.label}>\n <span>{total.lines.pct}%</span>\n <Icon of='scan-component' />\n </PillLabel>\n </Link>\n </Tooltip>\n )\n },\n weight: 30,\n });\n return testerUi;\n }\n}\n\nexport default TesterUI;\n\nTesterAspect.addRuntime(TesterUI);\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@teambit/tester",
3
- "version": "1.0.588",
3
+ "version": "1.0.590",
4
4
  "homepage": "https://bit.cloud/teambit/defender/tester",
5
5
  "main": "dist/index.js",
6
6
  "componentId": {
7
7
  "scope": "teambit.defender",
8
8
  "name": "tester",
9
- "version": "1.0.588"
9
+ "version": "1.0.590"
10
10
  },
11
11
  "dependencies": {
12
12
  "chalk": "4.1.2",
@@ -22,23 +22,27 @@
22
22
  "@teambit/component-id": "1.2.3",
23
23
  "@teambit/tests-results": "1.0.5",
24
24
  "@teambit/defender.ui.test-compare-section": "0.0.101",
25
+ "@teambit/design.ui.pill-label": "0.0.356",
26
+ "@teambit/evangelist.elements.icon": "1.0.2",
25
27
  "@teambit/bit-error": "0.0.404",
26
- "@teambit/cli": "0.0.1165",
28
+ "@teambit/cli": "0.0.1167",
27
29
  "@teambit/legacy.constants": "0.0.11",
28
- "@teambit/logger": "0.0.1258",
30
+ "@teambit/logger": "0.0.1260",
29
31
  "@teambit/toolbox.time.timer": "0.0.5",
30
- "@teambit/workspace": "1.0.588",
31
- "@teambit/envs": "1.0.588",
32
- "@teambit/component": "1.0.588",
33
- "@teambit/graphql": "1.0.588",
34
- "@teambit/builder": "1.0.588",
35
- "@teambit/dev-files": "1.0.588",
36
- "@teambit/ui": "1.0.588",
37
- "@teambit/compiler": "1.0.588",
32
+ "@teambit/workspace": "1.0.590",
33
+ "@teambit/envs": "1.0.590",
34
+ "@teambit/component": "1.0.590",
35
+ "@teambit/graphql": "1.0.590",
36
+ "@teambit/builder": "1.0.590",
37
+ "@teambit/dev-files": "1.0.590",
38
+ "@teambit/ui": "1.0.590",
39
+ "@teambit/compiler": "1.0.590",
38
40
  "@teambit/component.sources": "0.0.99",
39
- "@teambit/component-compare": "1.0.588",
40
- "@teambit/defender.ui.test-compare": "0.0.279",
41
- "@teambit/defender.ui.test-page": "0.0.57"
41
+ "@teambit/component-compare": "1.0.590",
42
+ "@teambit/defender.ui.test-compare": "0.0.281",
43
+ "@teambit/design.ui.tooltip": "0.0.375",
44
+ "@teambit/docs": "1.0.590",
45
+ "@teambit/defender.ui.test-page": "0.0.59"
42
46
  },
43
47
  "devDependencies": {
44
48
  "@types/fs-extra": "9.0.7",
@@ -49,8 +53,10 @@
49
53
  "@teambit/harmony.envs.core-aspect-env": "0.0.69"
50
54
  },
51
55
  "peerDependencies": {
56
+ "@apollo/client": "^3.6.0",
52
57
  "react": "^17.0.0 || ^18.0.0",
53
- "@types/react": "^17.0.73"
58
+ "@types/react": "^17.0.73",
59
+ "@teambit/base-react.navigation.link": "2.0.32"
54
60
  },
55
61
  "license": "Apache-2.0",
56
62
  "optionalDependencies": {},
@@ -1,16 +1,45 @@
1
1
  import React, { ComponentType } from 'react';
2
2
  import { UIRuntime } from '@teambit/ui';
3
3
  import { SlotRegistry, Slot } from '@teambit/harmony';
4
- import { ComponentAspect, ComponentUI } from '@teambit/component';
4
+ import { ComponentAspect, ComponentModel, ComponentUI } from '@teambit/component';
5
5
  import { CompareTests } from '@teambit/defender.ui.test-compare';
6
6
  import { ComponentCompareUI, ComponentCompareAspect } from '@teambit/component-compare';
7
7
  import { TestCompareSection } from '@teambit/defender.ui.test-compare-section';
8
+ import { DocsAspect, DocsUI } from '@teambit/docs';
9
+ import { gql, useQuery } from '@apollo/client';
10
+ import { PillLabel } from '@teambit/design.ui.pill-label';
11
+ import { Tooltip } from '@teambit/design.ui.tooltip';
12
+ import { Icon } from '@teambit/evangelist.elements.icon';
13
+ import { Link } from '@teambit/base-react.navigation.link';
8
14
  import { TestsSection } from './tests.section';
9
15
  import { TesterAspect } from './tester.aspect';
16
+ import styles from './coverage-label.module.scss'
17
+
18
+ const GET_COMPONENT = gql`
19
+ query ($id: String!) {
20
+ getHost {
21
+ id # for GQL caching
22
+ getTests(id: $id) {
23
+ loading
24
+ testsResults {
25
+ coverage {
26
+ total {
27
+ lines {
28
+ covered
29
+ total
30
+ pct
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }
38
+ `;
10
39
 
11
40
  export type EmptyStateSlot = SlotRegistry<ComponentType>;
12
41
  export class TesterUI {
13
- static dependencies = [ComponentAspect, ComponentCompareAspect];
42
+ static dependencies = [ComponentAspect, ComponentCompareAspect, DocsAspect];
14
43
 
15
44
  static runtime = UIRuntime;
16
45
 
@@ -36,7 +65,7 @@ export class TesterUI {
36
65
  static slots = [Slot.withType<ComponentType>()];
37
66
 
38
67
  static async provider(
39
- [component, componentCompare]: [ComponentUI, ComponentCompareUI],
68
+ [component, componentCompare, docs]: [ComponentUI, ComponentCompareUI, DocsUI],
40
69
  config,
41
70
  [emptyStateSlot]: [EmptyStateSlot]
42
71
  ) {
@@ -47,6 +76,45 @@ export class TesterUI {
47
76
  component.registerNavigation(section.navigationLink, section.order);
48
77
  componentCompare.registerNavigation(testerCompareSection);
49
78
  componentCompare.registerRoutes([testerCompareSection.route]);
79
+ docs.registerTitleBadge({
80
+ component: function badge({ legacyComponentModel }: { legacyComponentModel: ComponentModel }) {
81
+ const { data } = useQuery(GET_COMPONENT, {
82
+ variables: { id: legacyComponentModel.id.toString() },
83
+ });
84
+
85
+ if (!data || !data.getHost || !data.getHost.getTests) return null;
86
+
87
+ const total = data.getHost.getTests.testsResults?.coverage?.total as {
88
+ lines: {
89
+ covered: number;
90
+ total: number;
91
+ pct: number;
92
+ };
93
+ };
94
+
95
+ if (!total) return null;
96
+
97
+ return (
98
+ <Tooltip
99
+ className={styles.coverageTooltip}
100
+ placement="top"
101
+ content={
102
+ <div className={styles.coverageTooltipContent}>
103
+ {total.lines.covered}/{total.lines.total} lines covered
104
+ </div>
105
+ }
106
+ >
107
+ <Link href={`~tests${document.location.search}`} className={styles.link}>
108
+ <PillLabel className={styles.label}>
109
+ <span>{total.lines.pct}%</span>
110
+ <Icon of='scan-component' />
111
+ </PillLabel>
112
+ </Link>
113
+ </Tooltip>
114
+ )
115
+ },
116
+ weight: 30,
117
+ });
50
118
  return testerUi;
51
119
  }
52
120
  }