@form8ion/codecov 5.0.0-beta.1 → 5.0.0-beta.3
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/example.js +1 -1
- package/lib/index.js +120 -0
- package/lib/index.js.map +1 -0
- package/lib/index.mjs +117 -0
- package/lib/index.mjs.map +1 -0
- package/package.json +13 -10
- package/lib/index.cjs.js +0 -214
- package/lib/index.cjs.js.map +0 -1
- package/lib/index.es.js +0 -211
- package/lib/index.es.js.map +0 -1
package/example.js
CHANGED
|
@@ -4,7 +4,7 @@ import stubbedFs from 'mock-fs';
|
|
|
4
4
|
import nock from 'nock';
|
|
5
5
|
import {StatusCodes} from 'http-status-codes';
|
|
6
6
|
import {packageManagers} from '@form8ion/javascript-core';
|
|
7
|
-
import {scaffold, lift} from './lib/index
|
|
7
|
+
import {scaffold, lift} from './lib/index';
|
|
8
8
|
|
|
9
9
|
// remark-usage-ignore-next 5
|
|
10
10
|
stubbedFs({'package.json': JSON.stringify({scripts: {}})});
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var deepmerge = require('deepmerge');
|
|
4
|
+
var fs = require('fs');
|
|
5
|
+
var execa = require('execa');
|
|
6
|
+
var jsYaml = require('js-yaml');
|
|
7
|
+
var core = require('@form8ion/core');
|
|
8
|
+
var got = require('got');
|
|
9
|
+
|
|
10
|
+
async function scaffold$1() {
|
|
11
|
+
return {};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async function fetchRepositoryDetails ({vcs, apiAccessToken}) {
|
|
15
|
+
const {body: {repo}} = await got(
|
|
16
|
+
`https://codecov.io/api/gh/${vcs.owner}/${vcs.name}`,
|
|
17
|
+
{headers: {Authorization: apiAccessToken}, responseType: 'json'}
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
return repo;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async function scaffold({vcs, apiAccessToken}) {
|
|
24
|
+
return {
|
|
25
|
+
...['github', 'gitlab', 'bitbucket'].includes(vcs?.host) && {
|
|
26
|
+
badges: {
|
|
27
|
+
status: {
|
|
28
|
+
coverage: {
|
|
29
|
+
img: `https://img.shields.io/codecov/c/${vcs.host}/${vcs.owner}/${vcs.name}?logo=codecov${
|
|
30
|
+
apiAccessToken
|
|
31
|
+
? `&token=${(await fetchRepositoryDetails({vcs, apiAccessToken})).image_token}`
|
|
32
|
+
: ''
|
|
33
|
+
}`,
|
|
34
|
+
link: `https://codecov.io/${vcs.host}/${vcs.owner}/${vcs.name}`,
|
|
35
|
+
text: 'Codecov'
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function getPathToWorkflowFile(projectRoot) {
|
|
44
|
+
return `${projectRoot}/.github/workflows/node-ci.yml`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function test({projectRoot}) {
|
|
48
|
+
return core.fileExists(getPathToWorkflowFile(projectRoot));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function lift$1({projectRoot}) {
|
|
52
|
+
const pathToWorkflowFile = getPathToWorkflowFile(projectRoot);
|
|
53
|
+
|
|
54
|
+
const workflowDetails = jsYaml.load(await fs.promises.readFile(pathToWorkflowFile, 'utf-8'));
|
|
55
|
+
const {jobs: {verify: {steps}}} = workflowDetails;
|
|
56
|
+
|
|
57
|
+
if (!steps.find(step => step.uses?.startsWith('codecov/codecov-action'))) {
|
|
58
|
+
const stepsWithLegacyReportingRemoved = steps.filter(({run}) => 'npm run coverage:report' !== run);
|
|
59
|
+
|
|
60
|
+
await fs.promises.writeFile(
|
|
61
|
+
pathToWorkflowFile,
|
|
62
|
+
jsYaml.dump({
|
|
63
|
+
...workflowDetails,
|
|
64
|
+
jobs: {
|
|
65
|
+
...workflowDetails.jobs,
|
|
66
|
+
verify: {
|
|
67
|
+
...workflowDetails.jobs.verify,
|
|
68
|
+
steps: [...stepsWithLegacyReportingRemoved, {uses: 'codecov/codecov-action@v3'}]
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
})
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function liftReporting ({projectRoot, packageManager}) {
|
|
77
|
+
const pathToPackageJson = `${projectRoot}/package.json`;
|
|
78
|
+
|
|
79
|
+
const [ciProviderCanBeLifted, existingPackageContents] = await Promise.all([
|
|
80
|
+
test({projectRoot}),
|
|
81
|
+
fs.promises.readFile(pathToPackageJson, 'utf-8')
|
|
82
|
+
]);
|
|
83
|
+
const parsedPackageContents = JSON.parse(existingPackageContents);
|
|
84
|
+
const {scripts} = parsedPackageContents;
|
|
85
|
+
const {'coverage:report': reportCoverageScript, ...otherScripts} = scripts;
|
|
86
|
+
|
|
87
|
+
if (ciProviderCanBeLifted) await lift$1({projectRoot});
|
|
88
|
+
|
|
89
|
+
if (scripts['coverage:report']) {
|
|
90
|
+
parsedPackageContents.scripts = otherScripts;
|
|
91
|
+
await fs.promises.writeFile(pathToPackageJson, JSON.stringify(parsedPackageContents));
|
|
92
|
+
|
|
93
|
+
await execa(packageManager, ['remove', 'codecov']);
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
...!ciProviderCanBeLifted && {
|
|
97
|
+
nextSteps: [{
|
|
98
|
+
summary: 'Configure modern reporting to Codecov on your CI service',
|
|
99
|
+
description: 'Configure the [Codecov Uploader](https://docs.codecov.com/docs/codecov-uploader) appropriately'
|
|
100
|
+
+ ' for your CI Provider. If available for your provider, prefer one of the dedicated wrappers.'
|
|
101
|
+
}]
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return {};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async function lift({projectRoot, packageManager, vcs}) {
|
|
110
|
+
const [reportingResults, badgeResults] = await Promise.all([
|
|
111
|
+
liftReporting({projectRoot, packageManager}),
|
|
112
|
+
scaffold({vcs})
|
|
113
|
+
]);
|
|
114
|
+
|
|
115
|
+
return deepmerge.all([reportingResults, badgeResults]);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
exports.lift = lift;
|
|
119
|
+
exports.scaffold = scaffold$1;
|
|
120
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/scaffolder.js","../src/badge/repository-details-fetcher.js","../src/badge/scaffolder.js","../src/reporter/ci-providers/github-workflows/lifter.js","../src/reporter/lifter.js","../src/lifter.js"],"sourcesContent":["export async function scaffold() {\n return {};\n}\n","import got from '../../thirdparty-wrappers/got';\n\nexport default async function ({vcs, apiAccessToken}) {\n const {body: {repo}} = await got(\n `https://codecov.io/api/gh/${vcs.owner}/${vcs.name}`,\n {headers: {Authorization: apiAccessToken}, responseType: 'json'}\n );\n\n return repo;\n}\n","import fetchRepositoryDetails from './repository-details-fetcher';\n\nexport async function scaffold({vcs, apiAccessToken}) {\n return {\n ...['github', 'gitlab', 'bitbucket'].includes(vcs?.host) && {\n badges: {\n status: {\n coverage: {\n img: `https://img.shields.io/codecov/c/${vcs.host}/${vcs.owner}/${vcs.name}?logo=codecov${\n apiAccessToken\n ? `&token=${(await fetchRepositoryDetails({vcs, apiAccessToken})).image_token}`\n : ''\n }`,\n link: `https://codecov.io/${vcs.host}/${vcs.owner}/${vcs.name}`,\n text: 'Codecov'\n }\n }\n }\n }\n };\n}\n","import {promises as fs} from 'fs';\nimport {dump, load} from 'js-yaml';\nimport {fileExists} from '@form8ion/core';\n\nfunction getPathToWorkflowFile(projectRoot) {\n return `${projectRoot}/.github/workflows/node-ci.yml`;\n}\n\nexport function test({projectRoot}) {\n return fileExists(getPathToWorkflowFile(projectRoot));\n}\n\nexport async function lift({projectRoot}) {\n const pathToWorkflowFile = getPathToWorkflowFile(projectRoot);\n\n const workflowDetails = load(await fs.readFile(pathToWorkflowFile, 'utf-8'));\n const {jobs: {verify: {steps}}} = workflowDetails;\n\n if (!steps.find(step => step.uses?.startsWith('codecov/codecov-action'))) {\n const stepsWithLegacyReportingRemoved = steps.filter(({run}) => 'npm run coverage:report' !== run);\n\n await fs.writeFile(\n pathToWorkflowFile,\n dump({\n ...workflowDetails,\n jobs: {\n ...workflowDetails.jobs,\n verify: {\n ...workflowDetails.jobs.verify,\n steps: [...stepsWithLegacyReportingRemoved, {uses: 'codecov/codecov-action@v3'}]\n }\n }\n })\n );\n }\n}\n","import {promises as fs} from 'fs';\n\nimport execa from '../../thirdparty-wrappers/execa';\nimport {lift as liftCiProvider, test as ciProviderIsLiftable} from './ci-providers';\n\nexport default async function ({projectRoot, packageManager}) {\n const pathToPackageJson = `${projectRoot}/package.json`;\n\n const [ciProviderCanBeLifted, existingPackageContents] = await Promise.all([\n ciProviderIsLiftable({projectRoot}),\n fs.readFile(pathToPackageJson, 'utf-8')\n ]);\n const parsedPackageContents = JSON.parse(existingPackageContents);\n const {scripts} = parsedPackageContents;\n const {'coverage:report': reportCoverageScript, ...otherScripts} = scripts;\n\n if (ciProviderCanBeLifted) await liftCiProvider({projectRoot});\n\n if (scripts['coverage:report']) {\n parsedPackageContents.scripts = otherScripts;\n await fs.writeFile(pathToPackageJson, JSON.stringify(parsedPackageContents));\n\n await execa(packageManager, ['remove', 'codecov']);\n\n return {\n ...!ciProviderCanBeLifted && {\n nextSteps: [{\n summary: 'Configure modern reporting to Codecov on your CI service',\n description: 'Configure the [Codecov Uploader](https://docs.codecov.com/docs/codecov-uploader) appropriately'\n + ' for your CI Provider. If available for your provider, prefer one of the dedicated wrappers.'\n }]\n }\n };\n }\n\n return {};\n}\n","import deepmerge from 'deepmerge';\n\nimport {scaffold as scaffoldBadge} from './badge';\nimport {lift as liftReporting} from './reporter';\n\nexport async function lift({projectRoot, packageManager, vcs}) {\n const [reportingResults, badgeResults] = await Promise.all([\n liftReporting({projectRoot, packageManager}),\n scaffoldBadge({vcs})\n ]);\n\n return deepmerge.all([reportingResults, badgeResults]);\n}\n"],"names":["scaffold","fileExists","lift","load","fs","dump","ciProviderIsLiftable","liftCiProvider","scaffoldBadge"],"mappings":"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"}
|
package/lib/index.mjs
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import deepmerge from 'deepmerge';
|
|
2
|
+
import { promises } from 'fs';
|
|
3
|
+
import execa from 'execa';
|
|
4
|
+
import { load, dump } from 'js-yaml';
|
|
5
|
+
import { fileExists } from '@form8ion/core';
|
|
6
|
+
import got from 'got';
|
|
7
|
+
|
|
8
|
+
async function scaffold$1() {
|
|
9
|
+
return {};
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
async function fetchRepositoryDetails ({vcs, apiAccessToken}) {
|
|
13
|
+
const {body: {repo}} = await got(
|
|
14
|
+
`https://codecov.io/api/gh/${vcs.owner}/${vcs.name}`,
|
|
15
|
+
{headers: {Authorization: apiAccessToken}, responseType: 'json'}
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
return repo;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async function scaffold({vcs, apiAccessToken}) {
|
|
22
|
+
return {
|
|
23
|
+
...['github', 'gitlab', 'bitbucket'].includes(vcs?.host) && {
|
|
24
|
+
badges: {
|
|
25
|
+
status: {
|
|
26
|
+
coverage: {
|
|
27
|
+
img: `https://img.shields.io/codecov/c/${vcs.host}/${vcs.owner}/${vcs.name}?logo=codecov${
|
|
28
|
+
apiAccessToken
|
|
29
|
+
? `&token=${(await fetchRepositoryDetails({vcs, apiAccessToken})).image_token}`
|
|
30
|
+
: ''
|
|
31
|
+
}`,
|
|
32
|
+
link: `https://codecov.io/${vcs.host}/${vcs.owner}/${vcs.name}`,
|
|
33
|
+
text: 'Codecov'
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function getPathToWorkflowFile(projectRoot) {
|
|
42
|
+
return `${projectRoot}/.github/workflows/node-ci.yml`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function test({projectRoot}) {
|
|
46
|
+
return fileExists(getPathToWorkflowFile(projectRoot));
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function lift$1({projectRoot}) {
|
|
50
|
+
const pathToWorkflowFile = getPathToWorkflowFile(projectRoot);
|
|
51
|
+
|
|
52
|
+
const workflowDetails = load(await promises.readFile(pathToWorkflowFile, 'utf-8'));
|
|
53
|
+
const {jobs: {verify: {steps}}} = workflowDetails;
|
|
54
|
+
|
|
55
|
+
if (!steps.find(step => step.uses?.startsWith('codecov/codecov-action'))) {
|
|
56
|
+
const stepsWithLegacyReportingRemoved = steps.filter(({run}) => 'npm run coverage:report' !== run);
|
|
57
|
+
|
|
58
|
+
await promises.writeFile(
|
|
59
|
+
pathToWorkflowFile,
|
|
60
|
+
dump({
|
|
61
|
+
...workflowDetails,
|
|
62
|
+
jobs: {
|
|
63
|
+
...workflowDetails.jobs,
|
|
64
|
+
verify: {
|
|
65
|
+
...workflowDetails.jobs.verify,
|
|
66
|
+
steps: [...stepsWithLegacyReportingRemoved, {uses: 'codecov/codecov-action@v3'}]
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
})
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async function liftReporting ({projectRoot, packageManager}) {
|
|
75
|
+
const pathToPackageJson = `${projectRoot}/package.json`;
|
|
76
|
+
|
|
77
|
+
const [ciProviderCanBeLifted, existingPackageContents] = await Promise.all([
|
|
78
|
+
test({projectRoot}),
|
|
79
|
+
promises.readFile(pathToPackageJson, 'utf-8')
|
|
80
|
+
]);
|
|
81
|
+
const parsedPackageContents = JSON.parse(existingPackageContents);
|
|
82
|
+
const {scripts} = parsedPackageContents;
|
|
83
|
+
const {'coverage:report': reportCoverageScript, ...otherScripts} = scripts;
|
|
84
|
+
|
|
85
|
+
if (ciProviderCanBeLifted) await lift$1({projectRoot});
|
|
86
|
+
|
|
87
|
+
if (scripts['coverage:report']) {
|
|
88
|
+
parsedPackageContents.scripts = otherScripts;
|
|
89
|
+
await promises.writeFile(pathToPackageJson, JSON.stringify(parsedPackageContents));
|
|
90
|
+
|
|
91
|
+
await execa(packageManager, ['remove', 'codecov']);
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
...!ciProviderCanBeLifted && {
|
|
95
|
+
nextSteps: [{
|
|
96
|
+
summary: 'Configure modern reporting to Codecov on your CI service',
|
|
97
|
+
description: 'Configure the [Codecov Uploader](https://docs.codecov.com/docs/codecov-uploader) appropriately'
|
|
98
|
+
+ ' for your CI Provider. If available for your provider, prefer one of the dedicated wrappers.'
|
|
99
|
+
}]
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return {};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function lift({projectRoot, packageManager, vcs}) {
|
|
108
|
+
const [reportingResults, badgeResults] = await Promise.all([
|
|
109
|
+
liftReporting({projectRoot, packageManager}),
|
|
110
|
+
scaffold({vcs})
|
|
111
|
+
]);
|
|
112
|
+
|
|
113
|
+
return deepmerge.all([reportingResults, badgeResults]);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export { lift, scaffold$1 as scaffold };
|
|
117
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/scaffolder.js","../src/badge/repository-details-fetcher.js","../src/badge/scaffolder.js","../src/reporter/ci-providers/github-workflows/lifter.js","../src/reporter/lifter.js","../src/lifter.js"],"sourcesContent":["export async function scaffold() {\n return {};\n}\n","import got from '../../thirdparty-wrappers/got';\n\nexport default async function ({vcs, apiAccessToken}) {\n const {body: {repo}} = await got(\n `https://codecov.io/api/gh/${vcs.owner}/${vcs.name}`,\n {headers: {Authorization: apiAccessToken}, responseType: 'json'}\n );\n\n return repo;\n}\n","import fetchRepositoryDetails from './repository-details-fetcher';\n\nexport async function scaffold({vcs, apiAccessToken}) {\n return {\n ...['github', 'gitlab', 'bitbucket'].includes(vcs?.host) && {\n badges: {\n status: {\n coverage: {\n img: `https://img.shields.io/codecov/c/${vcs.host}/${vcs.owner}/${vcs.name}?logo=codecov${\n apiAccessToken\n ? `&token=${(await fetchRepositoryDetails({vcs, apiAccessToken})).image_token}`\n : ''\n }`,\n link: `https://codecov.io/${vcs.host}/${vcs.owner}/${vcs.name}`,\n text: 'Codecov'\n }\n }\n }\n }\n };\n}\n","import {promises as fs} from 'fs';\nimport {dump, load} from 'js-yaml';\nimport {fileExists} from '@form8ion/core';\n\nfunction getPathToWorkflowFile(projectRoot) {\n return `${projectRoot}/.github/workflows/node-ci.yml`;\n}\n\nexport function test({projectRoot}) {\n return fileExists(getPathToWorkflowFile(projectRoot));\n}\n\nexport async function lift({projectRoot}) {\n const pathToWorkflowFile = getPathToWorkflowFile(projectRoot);\n\n const workflowDetails = load(await fs.readFile(pathToWorkflowFile, 'utf-8'));\n const {jobs: {verify: {steps}}} = workflowDetails;\n\n if (!steps.find(step => step.uses?.startsWith('codecov/codecov-action'))) {\n const stepsWithLegacyReportingRemoved = steps.filter(({run}) => 'npm run coverage:report' !== run);\n\n await fs.writeFile(\n pathToWorkflowFile,\n dump({\n ...workflowDetails,\n jobs: {\n ...workflowDetails.jobs,\n verify: {\n ...workflowDetails.jobs.verify,\n steps: [...stepsWithLegacyReportingRemoved, {uses: 'codecov/codecov-action@v3'}]\n }\n }\n })\n );\n }\n}\n","import {promises as fs} from 'fs';\n\nimport execa from '../../thirdparty-wrappers/execa';\nimport {lift as liftCiProvider, test as ciProviderIsLiftable} from './ci-providers';\n\nexport default async function ({projectRoot, packageManager}) {\n const pathToPackageJson = `${projectRoot}/package.json`;\n\n const [ciProviderCanBeLifted, existingPackageContents] = await Promise.all([\n ciProviderIsLiftable({projectRoot}),\n fs.readFile(pathToPackageJson, 'utf-8')\n ]);\n const parsedPackageContents = JSON.parse(existingPackageContents);\n const {scripts} = parsedPackageContents;\n const {'coverage:report': reportCoverageScript, ...otherScripts} = scripts;\n\n if (ciProviderCanBeLifted) await liftCiProvider({projectRoot});\n\n if (scripts['coverage:report']) {\n parsedPackageContents.scripts = otherScripts;\n await fs.writeFile(pathToPackageJson, JSON.stringify(parsedPackageContents));\n\n await execa(packageManager, ['remove', 'codecov']);\n\n return {\n ...!ciProviderCanBeLifted && {\n nextSteps: [{\n summary: 'Configure modern reporting to Codecov on your CI service',\n description: 'Configure the [Codecov Uploader](https://docs.codecov.com/docs/codecov-uploader) appropriately'\n + ' for your CI Provider. If available for your provider, prefer one of the dedicated wrappers.'\n }]\n }\n };\n }\n\n return {};\n}\n","import deepmerge from 'deepmerge';\n\nimport {scaffold as scaffoldBadge} from './badge';\nimport {lift as liftReporting} from './reporter';\n\nexport async function lift({projectRoot, packageManager, vcs}) {\n const [reportingResults, badgeResults] = await Promise.all([\n liftReporting({projectRoot, packageManager}),\n scaffoldBadge({vcs})\n ]);\n\n return deepmerge.all([reportingResults, badgeResults]);\n}\n"],"names":["scaffold","lift","fs","ciProviderIsLiftable","liftCiProvider","scaffoldBadge"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,19 +2,24 @@
|
|
|
2
2
|
"name": "@form8ion/codecov",
|
|
3
3
|
"description": "code coverage service plugin for form8ion",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"version": "5.0.0-beta.
|
|
5
|
+
"version": "5.0.0-beta.3",
|
|
6
6
|
"engines": {
|
|
7
|
-
"node": ">=
|
|
7
|
+
"node": "^16.14 || >=18"
|
|
8
8
|
},
|
|
9
9
|
"author": "Matt Travi <npm@travi.org> (https://matt.travi.org)",
|
|
10
10
|
"repository": "form8ion/codecov",
|
|
11
11
|
"bugs": "https://github.com/form8ion/codecov/issues",
|
|
12
12
|
"homepage": "https://npm.im/@form8ion/codecov",
|
|
13
13
|
"runkitExampleFilename": "./example.js",
|
|
14
|
-
"main": "lib/index.
|
|
15
|
-
"module": "lib/index.
|
|
14
|
+
"main": "./lib/index.js",
|
|
15
|
+
"module": "./lib/index.mjs",
|
|
16
|
+
"exports": {
|
|
17
|
+
"require": "./lib/index.js",
|
|
18
|
+
"import": "./lib/index.mjs"
|
|
19
|
+
},
|
|
16
20
|
"sideEffects": false,
|
|
17
21
|
"scripts": {
|
|
22
|
+
"pretest": "run-s build",
|
|
18
23
|
"test": "npm-run-all --print-label build --parallel lint:* --parallel test:*",
|
|
19
24
|
"lint:lockfile": "lockfile-lint",
|
|
20
25
|
"lint:js": "eslint . --cache",
|
|
@@ -34,7 +39,7 @@
|
|
|
34
39
|
"test:unit:base": "DEBUG=any mocha 'src/**/*-test.js'",
|
|
35
40
|
"lint:peer": "npm ls >/dev/null",
|
|
36
41
|
"lint:gherkin": "gherkin-lint",
|
|
37
|
-
"pretest:integration": "
|
|
42
|
+
"pretest:integration": "run-s build",
|
|
38
43
|
"test:integration": "run-s 'test:integration:base -- --profile noWip'",
|
|
39
44
|
"test:integration:base": "NODE_OPTIONS=--enable-source-maps DEBUG=any cucumber-js test/integration --profile base",
|
|
40
45
|
"test:integration:debug": "DEBUG=test run-s test:integration",
|
|
@@ -42,7 +47,7 @@
|
|
|
42
47
|
"test:integration:wip:debug": "DEBUG=test run-s 'test:integration:wip'",
|
|
43
48
|
"test:integration:focus": "run-s 'test:integration:base -- --profile focus'",
|
|
44
49
|
"lint:engines": "ls-engines",
|
|
45
|
-
"lint:publish": "publint"
|
|
50
|
+
"lint:publish": "publint --strict"
|
|
46
51
|
},
|
|
47
52
|
"files": [
|
|
48
53
|
"example.js",
|
|
@@ -53,7 +58,7 @@
|
|
|
53
58
|
"provenance": true
|
|
54
59
|
},
|
|
55
60
|
"dependencies": {
|
|
56
|
-
"@form8ion/core": "^2.0
|
|
61
|
+
"@form8ion/core": "^3.2.0",
|
|
57
62
|
"deepmerge": "^4.3.1",
|
|
58
63
|
"execa": "^5.1.1",
|
|
59
64
|
"got": "^11.8.5",
|
|
@@ -69,7 +74,6 @@
|
|
|
69
74
|
"@form8ion/eslint-config-mocha": "3.0.0",
|
|
70
75
|
"@form8ion/javascript-core": "10.0.1",
|
|
71
76
|
"@form8ion/remark-lint-preset": "6.0.0",
|
|
72
|
-
"@rollup/plugin-babel": "6.0.3",
|
|
73
77
|
"@rollup/plugin-node-resolve": "15.1.0",
|
|
74
78
|
"@travi/any": "2.1.8",
|
|
75
79
|
"ban-sensitive-files": "1.9.19",
|
|
@@ -86,7 +90,6 @@
|
|
|
86
90
|
"mock-fs": "5.2.0",
|
|
87
91
|
"nock": "13.3.2",
|
|
88
92
|
"npm-run-all": "4.1.5",
|
|
89
|
-
"package-preview": "4.0.0",
|
|
90
93
|
"publint": "0.2.0",
|
|
91
94
|
"remark-cli": "11.0.0",
|
|
92
95
|
"remark-toc": "8.0.1",
|
|
@@ -95,6 +98,6 @@
|
|
|
95
98
|
"rollup": "3.27.2",
|
|
96
99
|
"rollup-plugin-auto-external": "2.0.0",
|
|
97
100
|
"sinon": "15.2.0",
|
|
98
|
-
"testdouble": "3.
|
|
101
|
+
"testdouble": "3.18.0"
|
|
99
102
|
}
|
|
100
103
|
}
|
package/lib/index.cjs.js
DELETED
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var deepmerge = require('deepmerge');
|
|
4
|
-
var fs = require('fs');
|
|
5
|
-
var execa = require('execa');
|
|
6
|
-
var jsYaml = require('js-yaml');
|
|
7
|
-
var core = require('@form8ion/core');
|
|
8
|
-
var got = require('got');
|
|
9
|
-
|
|
10
|
-
async function scaffold$1() {
|
|
11
|
-
return {};
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
function ownKeys(object, enumerableOnly) {
|
|
15
|
-
var keys = Object.keys(object);
|
|
16
|
-
if (Object.getOwnPropertySymbols) {
|
|
17
|
-
var symbols = Object.getOwnPropertySymbols(object);
|
|
18
|
-
enumerableOnly && (symbols = symbols.filter(function (sym) {
|
|
19
|
-
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
20
|
-
})), keys.push.apply(keys, symbols);
|
|
21
|
-
}
|
|
22
|
-
return keys;
|
|
23
|
-
}
|
|
24
|
-
function _objectSpread2(target) {
|
|
25
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
26
|
-
var source = null != arguments[i] ? arguments[i] : {};
|
|
27
|
-
i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
|
|
28
|
-
_defineProperty(target, key, source[key]);
|
|
29
|
-
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
|
|
30
|
-
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
return target;
|
|
34
|
-
}
|
|
35
|
-
function _defineProperty(obj, key, value) {
|
|
36
|
-
key = _toPropertyKey(key);
|
|
37
|
-
if (key in obj) {
|
|
38
|
-
Object.defineProperty(obj, key, {
|
|
39
|
-
value: value,
|
|
40
|
-
enumerable: true,
|
|
41
|
-
configurable: true,
|
|
42
|
-
writable: true
|
|
43
|
-
});
|
|
44
|
-
} else {
|
|
45
|
-
obj[key] = value;
|
|
46
|
-
}
|
|
47
|
-
return obj;
|
|
48
|
-
}
|
|
49
|
-
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
50
|
-
if (source == null) return {};
|
|
51
|
-
var target = {};
|
|
52
|
-
var sourceKeys = Object.keys(source);
|
|
53
|
-
var key, i;
|
|
54
|
-
for (i = 0; i < sourceKeys.length; i++) {
|
|
55
|
-
key = sourceKeys[i];
|
|
56
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
57
|
-
target[key] = source[key];
|
|
58
|
-
}
|
|
59
|
-
return target;
|
|
60
|
-
}
|
|
61
|
-
function _objectWithoutProperties(source, excluded) {
|
|
62
|
-
if (source == null) return {};
|
|
63
|
-
var target = _objectWithoutPropertiesLoose(source, excluded);
|
|
64
|
-
var key, i;
|
|
65
|
-
if (Object.getOwnPropertySymbols) {
|
|
66
|
-
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
|
|
67
|
-
for (i = 0; i < sourceSymbolKeys.length; i++) {
|
|
68
|
-
key = sourceSymbolKeys[i];
|
|
69
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
70
|
-
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
71
|
-
target[key] = source[key];
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return target;
|
|
75
|
-
}
|
|
76
|
-
function _toPrimitive(input, hint) {
|
|
77
|
-
if (typeof input !== "object" || input === null) return input;
|
|
78
|
-
var prim = input[Symbol.toPrimitive];
|
|
79
|
-
if (prim !== undefined) {
|
|
80
|
-
var res = prim.call(input, hint || "default");
|
|
81
|
-
if (typeof res !== "object") return res;
|
|
82
|
-
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
83
|
-
}
|
|
84
|
-
return (hint === "string" ? String : Number)(input);
|
|
85
|
-
}
|
|
86
|
-
function _toPropertyKey(arg) {
|
|
87
|
-
var key = _toPrimitive(arg, "string");
|
|
88
|
-
return typeof key === "symbol" ? key : String(key);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
async function fetchRepositoryDetails ({
|
|
92
|
-
vcs,
|
|
93
|
-
apiAccessToken
|
|
94
|
-
}) {
|
|
95
|
-
const {
|
|
96
|
-
body: {
|
|
97
|
-
repo
|
|
98
|
-
}
|
|
99
|
-
} = await got(`https://codecov.io/api/gh/${vcs.owner}/${vcs.name}`, {
|
|
100
|
-
headers: {
|
|
101
|
-
Authorization: apiAccessToken
|
|
102
|
-
},
|
|
103
|
-
responseType: 'json'
|
|
104
|
-
});
|
|
105
|
-
return repo;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
async function scaffold({
|
|
109
|
-
vcs,
|
|
110
|
-
apiAccessToken
|
|
111
|
-
}) {
|
|
112
|
-
return _objectSpread2({}, ['github', 'gitlab', 'bitbucket'].includes(vcs === null || vcs === void 0 ? void 0 : vcs.host) && {
|
|
113
|
-
badges: {
|
|
114
|
-
status: {
|
|
115
|
-
coverage: {
|
|
116
|
-
img: `https://img.shields.io/codecov/c/${vcs.host}/${vcs.owner}/${vcs.name}?logo=codecov${apiAccessToken ? `&token=${(await fetchRepositoryDetails({
|
|
117
|
-
vcs,
|
|
118
|
-
apiAccessToken
|
|
119
|
-
})).image_token}` : ''}`,
|
|
120
|
-
link: `https://codecov.io/${vcs.host}/${vcs.owner}/${vcs.name}`,
|
|
121
|
-
text: 'Codecov'
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
function getPathToWorkflowFile(projectRoot) {
|
|
129
|
-
return `${projectRoot}/.github/workflows/node-ci.yml`;
|
|
130
|
-
}
|
|
131
|
-
function test({
|
|
132
|
-
projectRoot
|
|
133
|
-
}) {
|
|
134
|
-
return core.fileExists(getPathToWorkflowFile(projectRoot));
|
|
135
|
-
}
|
|
136
|
-
async function lift$1({
|
|
137
|
-
projectRoot
|
|
138
|
-
}) {
|
|
139
|
-
const pathToWorkflowFile = getPathToWorkflowFile(projectRoot);
|
|
140
|
-
const workflowDetails = jsYaml.load(await fs.promises.readFile(pathToWorkflowFile, 'utf-8'));
|
|
141
|
-
const {
|
|
142
|
-
jobs: {
|
|
143
|
-
verify: {
|
|
144
|
-
steps
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
} = workflowDetails;
|
|
148
|
-
if (!steps.find(step => {
|
|
149
|
-
var _step$uses;
|
|
150
|
-
return (_step$uses = step.uses) === null || _step$uses === void 0 ? void 0 : _step$uses.startsWith('codecov/codecov-action');
|
|
151
|
-
})) {
|
|
152
|
-
const stepsWithLegacyReportingRemoved = steps.filter(({
|
|
153
|
-
run
|
|
154
|
-
}) => 'npm run coverage:report' !== run);
|
|
155
|
-
await fs.promises.writeFile(pathToWorkflowFile, jsYaml.dump(_objectSpread2(_objectSpread2({}, workflowDetails), {}, {
|
|
156
|
-
jobs: _objectSpread2(_objectSpread2({}, workflowDetails.jobs), {}, {
|
|
157
|
-
verify: _objectSpread2(_objectSpread2({}, workflowDetails.jobs.verify), {}, {
|
|
158
|
-
steps: [...stepsWithLegacyReportingRemoved, {
|
|
159
|
-
uses: 'codecov/codecov-action@v3'
|
|
160
|
-
}]
|
|
161
|
-
})
|
|
162
|
-
})
|
|
163
|
-
})));
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
const _excluded = ["coverage:report"];
|
|
168
|
-
async function liftReporting ({
|
|
169
|
-
projectRoot,
|
|
170
|
-
packageManager
|
|
171
|
-
}) {
|
|
172
|
-
const pathToPackageJson = `${projectRoot}/package.json`;
|
|
173
|
-
const [ciProviderCanBeLifted, existingPackageContents] = await Promise.all([test({
|
|
174
|
-
projectRoot
|
|
175
|
-
}), fs.promises.readFile(pathToPackageJson, 'utf-8')]);
|
|
176
|
-
const parsedPackageContents = JSON.parse(existingPackageContents);
|
|
177
|
-
const {
|
|
178
|
-
scripts
|
|
179
|
-
} = parsedPackageContents;
|
|
180
|
-
const otherScripts = _objectWithoutProperties(scripts, _excluded);
|
|
181
|
-
if (ciProviderCanBeLifted) await lift$1({
|
|
182
|
-
projectRoot
|
|
183
|
-
});
|
|
184
|
-
if (scripts['coverage:report']) {
|
|
185
|
-
parsedPackageContents.scripts = otherScripts;
|
|
186
|
-
await fs.promises.writeFile(pathToPackageJson, JSON.stringify(parsedPackageContents));
|
|
187
|
-
await execa(packageManager, ['remove', 'codecov']);
|
|
188
|
-
return _objectSpread2({}, !ciProviderCanBeLifted && {
|
|
189
|
-
nextSteps: [{
|
|
190
|
-
summary: 'Configure modern reporting to Codecov on your CI service',
|
|
191
|
-
description: 'Configure the [Codecov Uploader](https://docs.codecov.com/docs/codecov-uploader) appropriately' + ' for your CI Provider. If available for your provider, prefer one of the dedicated wrappers.'
|
|
192
|
-
}]
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
return {};
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
async function lift({
|
|
199
|
-
projectRoot,
|
|
200
|
-
packageManager,
|
|
201
|
-
vcs
|
|
202
|
-
}) {
|
|
203
|
-
const [reportingResults, badgeResults] = await Promise.all([liftReporting({
|
|
204
|
-
projectRoot,
|
|
205
|
-
packageManager
|
|
206
|
-
}), scaffold({
|
|
207
|
-
vcs
|
|
208
|
-
})]);
|
|
209
|
-
return deepmerge.all([reportingResults, badgeResults]);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
exports.lift = lift;
|
|
213
|
-
exports.scaffold = scaffold$1;
|
|
214
|
-
//# sourceMappingURL=index.cjs.js.map
|
package/lib/index.cjs.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/scaffolder.js","../src/badge/repository-details-fetcher.js","../src/badge/scaffolder.js","../src/reporter/ci-providers/github-workflows/lifter.js","../src/reporter/lifter.js","../src/lifter.js"],"sourcesContent":["export async function scaffold() {\n return {};\n}\n","import got from '../../thirdparty-wrappers/got';\n\nexport default async function ({vcs, apiAccessToken}) {\n const {body: {repo}} = await got(\n `https://codecov.io/api/gh/${vcs.owner}/${vcs.name}`,\n {headers: {Authorization: apiAccessToken}, responseType: 'json'}\n );\n\n return repo;\n}\n","import fetchRepositoryDetails from './repository-details-fetcher';\n\nexport async function scaffold({vcs, apiAccessToken}) {\n return {\n ...['github', 'gitlab', 'bitbucket'].includes(vcs?.host) && {\n badges: {\n status: {\n coverage: {\n img: `https://img.shields.io/codecov/c/${vcs.host}/${vcs.owner}/${vcs.name}?logo=codecov${\n apiAccessToken\n ? `&token=${(await fetchRepositoryDetails({vcs, apiAccessToken})).image_token}`\n : ''\n }`,\n link: `https://codecov.io/${vcs.host}/${vcs.owner}/${vcs.name}`,\n text: 'Codecov'\n }\n }\n }\n }\n };\n}\n","import {promises as fs} from 'fs';\nimport {dump, load} from 'js-yaml';\nimport {fileExists} from '@form8ion/core';\n\nfunction getPathToWorkflowFile(projectRoot) {\n return `${projectRoot}/.github/workflows/node-ci.yml`;\n}\n\nexport function test({projectRoot}) {\n return fileExists(getPathToWorkflowFile(projectRoot));\n}\n\nexport async function lift({projectRoot}) {\n const pathToWorkflowFile = getPathToWorkflowFile(projectRoot);\n\n const workflowDetails = load(await fs.readFile(pathToWorkflowFile, 'utf-8'));\n const {jobs: {verify: {steps}}} = workflowDetails;\n\n if (!steps.find(step => step.uses?.startsWith('codecov/codecov-action'))) {\n const stepsWithLegacyReportingRemoved = steps.filter(({run}) => 'npm run coverage:report' !== run);\n\n await fs.writeFile(\n pathToWorkflowFile,\n dump({\n ...workflowDetails,\n jobs: {\n ...workflowDetails.jobs,\n verify: {\n ...workflowDetails.jobs.verify,\n steps: [...stepsWithLegacyReportingRemoved, {uses: 'codecov/codecov-action@v3'}]\n }\n }\n })\n );\n }\n}\n","import {promises as fs} from 'fs';\n\nimport execa from '../../thirdparty-wrappers/execa';\nimport {lift as liftCiProvider, test as ciProviderIsLiftable} from './ci-providers';\n\nexport default async function ({projectRoot, packageManager}) {\n const pathToPackageJson = `${projectRoot}/package.json`;\n\n const [ciProviderCanBeLifted, existingPackageContents] = await Promise.all([\n ciProviderIsLiftable({projectRoot}),\n fs.readFile(pathToPackageJson, 'utf-8')\n ]);\n const parsedPackageContents = JSON.parse(existingPackageContents);\n const {scripts} = parsedPackageContents;\n const {'coverage:report': reportCoverageScript, ...otherScripts} = scripts;\n\n if (ciProviderCanBeLifted) await liftCiProvider({projectRoot});\n\n if (scripts['coverage:report']) {\n parsedPackageContents.scripts = otherScripts;\n await fs.writeFile(pathToPackageJson, JSON.stringify(parsedPackageContents));\n\n await execa(packageManager, ['remove', 'codecov']);\n\n return {\n ...!ciProviderCanBeLifted && {\n nextSteps: [{\n summary: 'Configure modern reporting to Codecov on your CI service',\n description: 'Configure the [Codecov Uploader](https://docs.codecov.com/docs/codecov-uploader) appropriately'\n + ' for your CI Provider. If available for your provider, prefer one of the dedicated wrappers.'\n }]\n }\n };\n }\n\n return {};\n}\n","import deepmerge from 'deepmerge';\n\nimport {scaffold as scaffoldBadge} from './badge';\nimport {lift as liftReporting} from './reporter';\n\nexport async function lift({projectRoot, packageManager, vcs}) {\n const [reportingResults, badgeResults] = await Promise.all([\n liftReporting({projectRoot, packageManager}),\n scaffoldBadge({vcs})\n ]);\n\n return deepmerge.all([reportingResults, badgeResults]);\n}\n"],"names":["scaffold","vcs","apiAccessToken","body","repo","got","owner","name","headers","Authorization","responseType","_objectSpread","includes","host","badges","status","coverage","img","fetchRepositoryDetails","image_token","link","text","getPathToWorkflowFile","projectRoot","test","fileExists","lift","pathToWorkflowFile","workflowDetails","load","fs","readFile","jobs","verify","steps","find","step","_step$uses","uses","startsWith","stepsWithLegacyReportingRemoved","filter","run","writeFile","dump","packageManager","pathToPackageJson","ciProviderCanBeLifted","existingPackageContents","Promise","all","ciProviderIsLiftable","parsedPackageContents","JSON","parse","scripts","otherScripts","_objectWithoutProperties","_excluded","liftCiProvider","stringify","execa","nextSteps","summary","description","reportingResults","badgeResults","liftReporting","scaffoldBadge","deepmerge"],"mappings":"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"}
|
package/lib/index.es.js
DELETED
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
import deepmerge from 'deepmerge';
|
|
2
|
-
import { promises } from 'fs';
|
|
3
|
-
import execa from 'execa';
|
|
4
|
-
import { load, dump } from 'js-yaml';
|
|
5
|
-
import { fileExists } from '@form8ion/core';
|
|
6
|
-
import got from 'got';
|
|
7
|
-
|
|
8
|
-
async function scaffold$1() {
|
|
9
|
-
return {};
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
function ownKeys(object, enumerableOnly) {
|
|
13
|
-
var keys = Object.keys(object);
|
|
14
|
-
if (Object.getOwnPropertySymbols) {
|
|
15
|
-
var symbols = Object.getOwnPropertySymbols(object);
|
|
16
|
-
enumerableOnly && (symbols = symbols.filter(function (sym) {
|
|
17
|
-
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
18
|
-
})), keys.push.apply(keys, symbols);
|
|
19
|
-
}
|
|
20
|
-
return keys;
|
|
21
|
-
}
|
|
22
|
-
function _objectSpread2(target) {
|
|
23
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
24
|
-
var source = null != arguments[i] ? arguments[i] : {};
|
|
25
|
-
i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
|
|
26
|
-
_defineProperty(target, key, source[key]);
|
|
27
|
-
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
|
|
28
|
-
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
return target;
|
|
32
|
-
}
|
|
33
|
-
function _defineProperty(obj, key, value) {
|
|
34
|
-
key = _toPropertyKey(key);
|
|
35
|
-
if (key in obj) {
|
|
36
|
-
Object.defineProperty(obj, key, {
|
|
37
|
-
value: value,
|
|
38
|
-
enumerable: true,
|
|
39
|
-
configurable: true,
|
|
40
|
-
writable: true
|
|
41
|
-
});
|
|
42
|
-
} else {
|
|
43
|
-
obj[key] = value;
|
|
44
|
-
}
|
|
45
|
-
return obj;
|
|
46
|
-
}
|
|
47
|
-
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
48
|
-
if (source == null) return {};
|
|
49
|
-
var target = {};
|
|
50
|
-
var sourceKeys = Object.keys(source);
|
|
51
|
-
var key, i;
|
|
52
|
-
for (i = 0; i < sourceKeys.length; i++) {
|
|
53
|
-
key = sourceKeys[i];
|
|
54
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
55
|
-
target[key] = source[key];
|
|
56
|
-
}
|
|
57
|
-
return target;
|
|
58
|
-
}
|
|
59
|
-
function _objectWithoutProperties(source, excluded) {
|
|
60
|
-
if (source == null) return {};
|
|
61
|
-
var target = _objectWithoutPropertiesLoose(source, excluded);
|
|
62
|
-
var key, i;
|
|
63
|
-
if (Object.getOwnPropertySymbols) {
|
|
64
|
-
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
|
|
65
|
-
for (i = 0; i < sourceSymbolKeys.length; i++) {
|
|
66
|
-
key = sourceSymbolKeys[i];
|
|
67
|
-
if (excluded.indexOf(key) >= 0) continue;
|
|
68
|
-
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
|
|
69
|
-
target[key] = source[key];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return target;
|
|
73
|
-
}
|
|
74
|
-
function _toPrimitive(input, hint) {
|
|
75
|
-
if (typeof input !== "object" || input === null) return input;
|
|
76
|
-
var prim = input[Symbol.toPrimitive];
|
|
77
|
-
if (prim !== undefined) {
|
|
78
|
-
var res = prim.call(input, hint || "default");
|
|
79
|
-
if (typeof res !== "object") return res;
|
|
80
|
-
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
81
|
-
}
|
|
82
|
-
return (hint === "string" ? String : Number)(input);
|
|
83
|
-
}
|
|
84
|
-
function _toPropertyKey(arg) {
|
|
85
|
-
var key = _toPrimitive(arg, "string");
|
|
86
|
-
return typeof key === "symbol" ? key : String(key);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async function fetchRepositoryDetails ({
|
|
90
|
-
vcs,
|
|
91
|
-
apiAccessToken
|
|
92
|
-
}) {
|
|
93
|
-
const {
|
|
94
|
-
body: {
|
|
95
|
-
repo
|
|
96
|
-
}
|
|
97
|
-
} = await got(`https://codecov.io/api/gh/${vcs.owner}/${vcs.name}`, {
|
|
98
|
-
headers: {
|
|
99
|
-
Authorization: apiAccessToken
|
|
100
|
-
},
|
|
101
|
-
responseType: 'json'
|
|
102
|
-
});
|
|
103
|
-
return repo;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
async function scaffold({
|
|
107
|
-
vcs,
|
|
108
|
-
apiAccessToken
|
|
109
|
-
}) {
|
|
110
|
-
return _objectSpread2({}, ['github', 'gitlab', 'bitbucket'].includes(vcs === null || vcs === void 0 ? void 0 : vcs.host) && {
|
|
111
|
-
badges: {
|
|
112
|
-
status: {
|
|
113
|
-
coverage: {
|
|
114
|
-
img: `https://img.shields.io/codecov/c/${vcs.host}/${vcs.owner}/${vcs.name}?logo=codecov${apiAccessToken ? `&token=${(await fetchRepositoryDetails({
|
|
115
|
-
vcs,
|
|
116
|
-
apiAccessToken
|
|
117
|
-
})).image_token}` : ''}`,
|
|
118
|
-
link: `https://codecov.io/${vcs.host}/${vcs.owner}/${vcs.name}`,
|
|
119
|
-
text: 'Codecov'
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
function getPathToWorkflowFile(projectRoot) {
|
|
127
|
-
return `${projectRoot}/.github/workflows/node-ci.yml`;
|
|
128
|
-
}
|
|
129
|
-
function test({
|
|
130
|
-
projectRoot
|
|
131
|
-
}) {
|
|
132
|
-
return fileExists(getPathToWorkflowFile(projectRoot));
|
|
133
|
-
}
|
|
134
|
-
async function lift$1({
|
|
135
|
-
projectRoot
|
|
136
|
-
}) {
|
|
137
|
-
const pathToWorkflowFile = getPathToWorkflowFile(projectRoot);
|
|
138
|
-
const workflowDetails = load(await promises.readFile(pathToWorkflowFile, 'utf-8'));
|
|
139
|
-
const {
|
|
140
|
-
jobs: {
|
|
141
|
-
verify: {
|
|
142
|
-
steps
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
} = workflowDetails;
|
|
146
|
-
if (!steps.find(step => {
|
|
147
|
-
var _step$uses;
|
|
148
|
-
return (_step$uses = step.uses) === null || _step$uses === void 0 ? void 0 : _step$uses.startsWith('codecov/codecov-action');
|
|
149
|
-
})) {
|
|
150
|
-
const stepsWithLegacyReportingRemoved = steps.filter(({
|
|
151
|
-
run
|
|
152
|
-
}) => 'npm run coverage:report' !== run);
|
|
153
|
-
await promises.writeFile(pathToWorkflowFile, dump(_objectSpread2(_objectSpread2({}, workflowDetails), {}, {
|
|
154
|
-
jobs: _objectSpread2(_objectSpread2({}, workflowDetails.jobs), {}, {
|
|
155
|
-
verify: _objectSpread2(_objectSpread2({}, workflowDetails.jobs.verify), {}, {
|
|
156
|
-
steps: [...stepsWithLegacyReportingRemoved, {
|
|
157
|
-
uses: 'codecov/codecov-action@v3'
|
|
158
|
-
}]
|
|
159
|
-
})
|
|
160
|
-
})
|
|
161
|
-
})));
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
const _excluded = ["coverage:report"];
|
|
166
|
-
async function liftReporting ({
|
|
167
|
-
projectRoot,
|
|
168
|
-
packageManager
|
|
169
|
-
}) {
|
|
170
|
-
const pathToPackageJson = `${projectRoot}/package.json`;
|
|
171
|
-
const [ciProviderCanBeLifted, existingPackageContents] = await Promise.all([test({
|
|
172
|
-
projectRoot
|
|
173
|
-
}), promises.readFile(pathToPackageJson, 'utf-8')]);
|
|
174
|
-
const parsedPackageContents = JSON.parse(existingPackageContents);
|
|
175
|
-
const {
|
|
176
|
-
scripts
|
|
177
|
-
} = parsedPackageContents;
|
|
178
|
-
const otherScripts = _objectWithoutProperties(scripts, _excluded);
|
|
179
|
-
if (ciProviderCanBeLifted) await lift$1({
|
|
180
|
-
projectRoot
|
|
181
|
-
});
|
|
182
|
-
if (scripts['coverage:report']) {
|
|
183
|
-
parsedPackageContents.scripts = otherScripts;
|
|
184
|
-
await promises.writeFile(pathToPackageJson, JSON.stringify(parsedPackageContents));
|
|
185
|
-
await execa(packageManager, ['remove', 'codecov']);
|
|
186
|
-
return _objectSpread2({}, !ciProviderCanBeLifted && {
|
|
187
|
-
nextSteps: [{
|
|
188
|
-
summary: 'Configure modern reporting to Codecov on your CI service',
|
|
189
|
-
description: 'Configure the [Codecov Uploader](https://docs.codecov.com/docs/codecov-uploader) appropriately' + ' for your CI Provider. If available for your provider, prefer one of the dedicated wrappers.'
|
|
190
|
-
}]
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
return {};
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
async function lift({
|
|
197
|
-
projectRoot,
|
|
198
|
-
packageManager,
|
|
199
|
-
vcs
|
|
200
|
-
}) {
|
|
201
|
-
const [reportingResults, badgeResults] = await Promise.all([liftReporting({
|
|
202
|
-
projectRoot,
|
|
203
|
-
packageManager
|
|
204
|
-
}), scaffold({
|
|
205
|
-
vcs
|
|
206
|
-
})]);
|
|
207
|
-
return deepmerge.all([reportingResults, badgeResults]);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
export { lift, scaffold$1 as scaffold };
|
|
211
|
-
//# sourceMappingURL=index.es.js.map
|
package/lib/index.es.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/scaffolder.js","../src/badge/repository-details-fetcher.js","../src/badge/scaffolder.js","../src/reporter/ci-providers/github-workflows/lifter.js","../src/reporter/lifter.js","../src/lifter.js"],"sourcesContent":["export async function scaffold() {\n return {};\n}\n","import got from '../../thirdparty-wrappers/got';\n\nexport default async function ({vcs, apiAccessToken}) {\n const {body: {repo}} = await got(\n `https://codecov.io/api/gh/${vcs.owner}/${vcs.name}`,\n {headers: {Authorization: apiAccessToken}, responseType: 'json'}\n );\n\n return repo;\n}\n","import fetchRepositoryDetails from './repository-details-fetcher';\n\nexport async function scaffold({vcs, apiAccessToken}) {\n return {\n ...['github', 'gitlab', 'bitbucket'].includes(vcs?.host) && {\n badges: {\n status: {\n coverage: {\n img: `https://img.shields.io/codecov/c/${vcs.host}/${vcs.owner}/${vcs.name}?logo=codecov${\n apiAccessToken\n ? `&token=${(await fetchRepositoryDetails({vcs, apiAccessToken})).image_token}`\n : ''\n }`,\n link: `https://codecov.io/${vcs.host}/${vcs.owner}/${vcs.name}`,\n text: 'Codecov'\n }\n }\n }\n }\n };\n}\n","import {promises as fs} from 'fs';\nimport {dump, load} from 'js-yaml';\nimport {fileExists} from '@form8ion/core';\n\nfunction getPathToWorkflowFile(projectRoot) {\n return `${projectRoot}/.github/workflows/node-ci.yml`;\n}\n\nexport function test({projectRoot}) {\n return fileExists(getPathToWorkflowFile(projectRoot));\n}\n\nexport async function lift({projectRoot}) {\n const pathToWorkflowFile = getPathToWorkflowFile(projectRoot);\n\n const workflowDetails = load(await fs.readFile(pathToWorkflowFile, 'utf-8'));\n const {jobs: {verify: {steps}}} = workflowDetails;\n\n if (!steps.find(step => step.uses?.startsWith('codecov/codecov-action'))) {\n const stepsWithLegacyReportingRemoved = steps.filter(({run}) => 'npm run coverage:report' !== run);\n\n await fs.writeFile(\n pathToWorkflowFile,\n dump({\n ...workflowDetails,\n jobs: {\n ...workflowDetails.jobs,\n verify: {\n ...workflowDetails.jobs.verify,\n steps: [...stepsWithLegacyReportingRemoved, {uses: 'codecov/codecov-action@v3'}]\n }\n }\n })\n );\n }\n}\n","import {promises as fs} from 'fs';\n\nimport execa from '../../thirdparty-wrappers/execa';\nimport {lift as liftCiProvider, test as ciProviderIsLiftable} from './ci-providers';\n\nexport default async function ({projectRoot, packageManager}) {\n const pathToPackageJson = `${projectRoot}/package.json`;\n\n const [ciProviderCanBeLifted, existingPackageContents] = await Promise.all([\n ciProviderIsLiftable({projectRoot}),\n fs.readFile(pathToPackageJson, 'utf-8')\n ]);\n const parsedPackageContents = JSON.parse(existingPackageContents);\n const {scripts} = parsedPackageContents;\n const {'coverage:report': reportCoverageScript, ...otherScripts} = scripts;\n\n if (ciProviderCanBeLifted) await liftCiProvider({projectRoot});\n\n if (scripts['coverage:report']) {\n parsedPackageContents.scripts = otherScripts;\n await fs.writeFile(pathToPackageJson, JSON.stringify(parsedPackageContents));\n\n await execa(packageManager, ['remove', 'codecov']);\n\n return {\n ...!ciProviderCanBeLifted && {\n nextSteps: [{\n summary: 'Configure modern reporting to Codecov on your CI service',\n description: 'Configure the [Codecov Uploader](https://docs.codecov.com/docs/codecov-uploader) appropriately'\n + ' for your CI Provider. If available for your provider, prefer one of the dedicated wrappers.'\n }]\n }\n };\n }\n\n return {};\n}\n","import deepmerge from 'deepmerge';\n\nimport {scaffold as scaffoldBadge} from './badge';\nimport {lift as liftReporting} from './reporter';\n\nexport async function lift({projectRoot, packageManager, vcs}) {\n const [reportingResults, badgeResults] = await Promise.all([\n liftReporting({projectRoot, packageManager}),\n scaffoldBadge({vcs})\n ]);\n\n return deepmerge.all([reportingResults, badgeResults]);\n}\n"],"names":["scaffold","vcs","apiAccessToken","body","repo","got","owner","name","headers","Authorization","responseType","_objectSpread","includes","host","badges","status","coverage","img","fetchRepositoryDetails","image_token","link","text","getPathToWorkflowFile","projectRoot","test","fileExists","lift","pathToWorkflowFile","workflowDetails","load","fs","readFile","jobs","verify","steps","find","step","_step$uses","uses","startsWith","stepsWithLegacyReportingRemoved","filter","run","writeFile","dump","packageManager","pathToPackageJson","ciProviderCanBeLifted","existingPackageContents","Promise","all","ciProviderIsLiftable","parsedPackageContents","JSON","parse","scripts","otherScripts","_objectWithoutProperties","_excluded","liftCiProvider","stringify","execa","nextSteps","summary","description","reportingResults","badgeResults","liftReporting","scaffoldBadge","deepmerge"],"mappings":"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"}
|