apify-test-tools 0.6.0 → 0.6.1
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/.github/workflows/_check_code.yaml +17 -19
- package/.github/workflows/_update_release_metadata.yaml +1 -1
- package/.github/workflows/manual_release_stable.yaml +1 -0
- package/.github/workflows/on_master.yaml +2 -0
- package/.husky/pre-commit +13 -0
- package/CHANGELOG.md +11 -3
- package/CONTRIBUTING.md +5 -0
- package/README.md +39 -43
- package/bin/build.ts +138 -87
- package/bin/diff-changes.ts +156 -0
- package/bin/diff-json-schema.ts +50 -0
- package/bin/git.ts +42 -11
- package/bin/github.ts +7 -6
- package/bin/main.ts +21 -11
- package/bin/slack.ts +6 -2
- package/bin/test-report.ts +55 -44
- package/bin/types.ts +56 -59
- package/bin/utils.ts +19 -131
- package/dist/bin/build.d.ts +1 -1
- package/dist/bin/build.d.ts.map +1 -1
- package/dist/bin/build.js +49 -31
- package/dist/bin/build.js.map +1 -1
- package/dist/bin/diff-changes.d.ts +16 -0
- package/dist/bin/diff-changes.d.ts.map +1 -0
- package/dist/bin/diff-changes.js +103 -0
- package/dist/bin/diff-changes.js.map +1 -0
- package/dist/bin/diff-json-schema.d.ts +7 -0
- package/dist/bin/diff-json-schema.d.ts.map +1 -0
- package/dist/bin/diff-json-schema.js +45 -0
- package/dist/bin/diff-json-schema.js.map +1 -0
- package/dist/bin/git.d.ts +8 -3
- package/dist/bin/git.d.ts.map +1 -1
- package/dist/bin/git.js +35 -10
- package/dist/bin/git.js.map +1 -1
- package/dist/bin/github.d.ts +1 -3
- package/dist/bin/github.d.ts.map +1 -1
- package/dist/bin/github.js +5 -5
- package/dist/bin/github.js.map +1 -1
- package/dist/bin/main.js +14 -5
- package/dist/bin/main.js.map +1 -1
- package/dist/bin/slack.d.ts +1 -1
- package/dist/bin/slack.d.ts.map +1 -1
- package/dist/bin/slack.js +1 -1
- package/dist/bin/slack.js.map +1 -1
- package/dist/bin/test-report.d.ts.map +1 -1
- package/dist/bin/test-report.js +9 -3
- package/dist/bin/test-report.js.map +1 -1
- package/dist/bin/types.d.ts +0 -1
- package/dist/bin/types.d.ts.map +1 -1
- package/dist/bin/utils.d.ts +0 -14
- package/dist/bin/utils.d.ts.map +1 -1
- package/dist/bin/utils.js +12 -95
- package/dist/bin/utils.js.map +1 -1
- package/dist/lib/extend-expect.d.ts.map +1 -1
- package/dist/lib/extend-expect.js +11 -11
- package/dist/lib/extend-expect.js.map +1 -1
- package/dist/lib/lib.d.ts +3 -2
- package/dist/lib/lib.d.ts.map +1 -1
- package/dist/lib/lib.js +7 -3
- package/dist/lib/lib.js.map +1 -1
- package/dist/lib/run-test-result.d.ts +1 -1
- package/dist/lib/run-test-result.d.ts.map +1 -1
- package/dist/lib/run-test-result.js.map +1 -1
- package/dist/lib/types.d.ts +2 -3
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/utils.d.ts +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +4 -1
- package/dist/lib/utils.js.map +1 -1
- package/dist/test/unit/bin/diff-changes.test.d.ts +2 -0
- package/dist/test/unit/bin/diff-changes.test.d.ts.map +1 -0
- package/dist/test/unit/bin/diff-changes.test.js +159 -0
- package/dist/test/unit/bin/diff-changes.test.js.map +1 -0
- package/dist/test/unit/bin/diff.test.d.ts +2 -0
- package/dist/test/unit/bin/diff.test.d.ts.map +1 -0
- package/dist/test/unit/bin/diff.test.js +143 -0
- package/dist/test/unit/bin/diff.test.js.map +1 -0
- package/dist/test/unit/bin/git.test.js +48 -19
- package/dist/test/unit/bin/git.test.js.map +1 -1
- package/dist/test/unit/custom-matchers.test.js +3 -8
- package/dist/test/unit/custom-matchers.test.js.map +1 -1
- package/dist/test/unit/parse-commit.test.js +1 -1
- package/dist/test/unit/parse-commit.test.js.map +1 -1
- package/dist/test/unit/should-built-and-test.test.js +159 -39
- package/dist/test/unit/should-built-and-test.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/eslint.config.mjs +4 -2
- package/knip.json +1 -1
- package/lib/extend-expect.ts +21 -21
- package/lib/lib.ts +17 -17
- package/lib/run-test-result.ts +6 -2
- package/lib/types.ts +5 -8
- package/lib/utils.ts +13 -9
- package/package.json +10 -3
- package/test/tsconfig.json +2 -4
- package/test/unit/bin/diff-changes.test.ts +182 -0
- package/test/unit/bin/diff.test.ts +212 -0
- package/test/unit/bin/git.test.ts +59 -20
- package/test/unit/custom-matchers.test.ts +10 -9
- package/test/unit/parse-commit.test.ts +2 -1
- package/test/unit/should-built-and-test.test.ts +181 -40
- package/bin/consts.ts +0 -6
- package/dist/bin/consts.d.ts +0 -4
- package/dist/bin/consts.d.ts.map +0 -1
- package/dist/bin/consts.js +0 -6
- package/dist/bin/consts.js.map +0 -1
- package/example-github-events/pull-request.json +0 -523
- package/example-github-events/push.json +0 -216
package/dist/bin/build.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { ACTOR_SOURCE_TYPES } from '@apify/consts';
|
|
2
1
|
import { ApifyClient } from 'apify-client';
|
|
2
|
+
import { ACTOR_SOURCE_TYPES } from '@apify/consts';
|
|
3
3
|
import { getEnvVar } from './utils.js';
|
|
4
4
|
class ApifyBuilder {
|
|
5
5
|
apifyClient;
|
|
6
6
|
actorName;
|
|
7
|
-
// eslint-disable-next-line no-empty-function
|
|
8
7
|
constructor(apifyClient, actorName) {
|
|
9
8
|
this.apifyClient = apifyClient;
|
|
10
9
|
this.actorName = actorName;
|
|
@@ -20,8 +19,8 @@ class ApifyBuilder {
|
|
|
20
19
|
console.error(`Default build tag for ${this.actorName} is ${defaultBuildTag}`);
|
|
21
20
|
// We could technically allow this but in most cases this is accidentally set wrongly and there is a workaround
|
|
22
21
|
if (defaultBuildTag.match(/\d+\.\d+\.\d+/)) {
|
|
23
|
-
throw new Error(`[${this.actorName}] Default build is a build number, not a tag. While this could work, `
|
|
24
|
-
|
|
22
|
+
throw new Error(`[${this.actorName}] Default build is a build number, not a tag. While this could work, ` +
|
|
23
|
+
`we want to have a default as tag so this is often an accidental misconfiguration from the dev`);
|
|
25
24
|
}
|
|
26
25
|
// I reported that buildNumber should probably not be optional
|
|
27
26
|
const defaultBuildNumber = actorInfo.taggedBuilds[defaultBuildTag].buildNumber;
|
|
@@ -29,13 +28,13 @@ class ApifyBuilder {
|
|
|
29
28
|
console.error(`Default version for ${this.actorName} is ${defaultVersionNumber}`);
|
|
30
29
|
return { defaultBuildNumber, defaultVersionNumber, defaultBuildTag };
|
|
31
30
|
};
|
|
32
|
-
startActorBuild = async ({ buildTag, versionNumber, gitRepoUrl
|
|
31
|
+
startActorBuild = async ({ buildTag, versionNumber, gitRepoUrl }) => {
|
|
33
32
|
const actorClient = this.apifyClient.actor(this.actorName);
|
|
34
33
|
const actorInfo = await actorClient.get();
|
|
35
34
|
if (!actorInfo) {
|
|
36
|
-
throw new Error(`No actor named '${this.actorName}' was found on the platform. If this`
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
throw new Error(`No actor named '${this.actorName}' was found on the platform. If this` +
|
|
36
|
+
' is unexpected, make sure the actor you are targeting is spelled the' +
|
|
37
|
+
' same as the folder in the repository.');
|
|
39
38
|
}
|
|
40
39
|
const actorVersion = {
|
|
41
40
|
buildTag,
|
|
@@ -64,8 +63,8 @@ class ApifyBuilder {
|
|
|
64
63
|
const build = await this.apifyClient.build(buildId).waitForFinish();
|
|
65
64
|
const versionNumber = build.buildNumber;
|
|
66
65
|
if (build.status === 'FAILED' || build.status === 'TIMED-OUT') {
|
|
67
|
-
const message = `[BUILD][${actorName}]: Build ${buildId} (${versionNumber}) failed. `
|
|
68
|
-
|
|
66
|
+
const message = `[BUILD][${actorName}]: Build ${buildId} (${versionNumber}) failed. ` +
|
|
67
|
+
`Not continuing with other builds and tests.`;
|
|
69
68
|
console.error(`[${this.actorName}]: ${versionNumber}`);
|
|
70
69
|
throw new Error(message);
|
|
71
70
|
}
|
|
@@ -73,8 +72,8 @@ class ApifyBuilder {
|
|
|
73
72
|
return build;
|
|
74
73
|
};
|
|
75
74
|
/**
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
* Create ApifyBuilder with actor owner's token
|
|
76
|
+
*/
|
|
78
77
|
static fromActorName = (actorName) => {
|
|
79
78
|
const username = actorName.split('/')[0];
|
|
80
79
|
// GitHib secrets only allow word characters (alphanum + underscore)
|
|
@@ -82,8 +81,8 @@ class ApifyBuilder {
|
|
|
82
81
|
const usernameEnvVar = `APIFY_TOKEN_${usernameInGitHubSecretsFormat}`;
|
|
83
82
|
const token = process.env[usernameEnvVar];
|
|
84
83
|
if (!token) {
|
|
85
|
-
throw new Error(`Cannot find Apify API token for username: ${username}. `
|
|
86
|
-
|
|
84
|
+
throw new Error(`Cannot find Apify API token for username: ${username}. ` +
|
|
85
|
+
`Have you set secret env var to this GitHub repo with key: ${usernameEnvVar}?`);
|
|
87
86
|
}
|
|
88
87
|
const apifyClient = new ApifyClient({ token });
|
|
89
88
|
const builder = new ApifyBuilder(apifyClient, actorName);
|
|
@@ -97,7 +96,21 @@ class ApifyBuilder {
|
|
|
97
96
|
// Even though we don't version our current Actors, if we ever such Actors to GitHub CI, we would accidentally delete old supported versions
|
|
98
97
|
// This hardcoded solution is not ideal, but it should prevent most imaginable cases
|
|
99
98
|
// All currently popular versioned Actors use `version-${number}` format
|
|
100
|
-
const PROTECTED_TAGS_PREFIX = [
|
|
99
|
+
const PROTECTED_TAGS_PREFIX = [
|
|
100
|
+
'latest',
|
|
101
|
+
'v-',
|
|
102
|
+
'version',
|
|
103
|
+
'v0',
|
|
104
|
+
'v1',
|
|
105
|
+
'v2',
|
|
106
|
+
'v3',
|
|
107
|
+
'v4',
|
|
108
|
+
'v5',
|
|
109
|
+
'v6',
|
|
110
|
+
'v7',
|
|
111
|
+
'v8',
|
|
112
|
+
'v9',
|
|
113
|
+
];
|
|
101
114
|
// We don't want to be too short because we might to debug something
|
|
102
115
|
// but also not too long because it increases the risk of users using outdated versions
|
|
103
116
|
const DEFAULT_DAYS_BACK_PROD_VERSIONS = 30;
|
|
@@ -107,16 +120,19 @@ class ApifyBuilder {
|
|
|
107
120
|
const taggedDevelBuildNumber = actorInfo.taggedBuilds.devel?.buildNumber;
|
|
108
121
|
const allTags = Object.keys(actorInfo.taggedBuilds ?? {});
|
|
109
122
|
const protectedTags = allTags.filter((tag) => PROTECTED_TAGS_PREFIX.some((prefix) => tag.startsWith(prefix)));
|
|
110
|
-
const protectedBuildNumbers = protectedTags.map((tag) => ({
|
|
111
|
-
|
|
123
|
+
const protectedBuildNumbers = protectedTags.map((tag) => ({
|
|
124
|
+
buildNumber: actorInfo.taggedBuilds[tag].buildNumber,
|
|
125
|
+
tag,
|
|
126
|
+
}));
|
|
127
|
+
const { items } = await this.apifyClient.actor(this.actorName).builds().list();
|
|
112
128
|
// Deleting default build throws an error, so we skip it
|
|
113
129
|
const { defaultBuildNumber, defaultBuildTag } = await ApifyBuilder.fromActorName(this.actorName).getDefaultVersionAndTag();
|
|
114
130
|
const daysAgoUnixProd = Date.now() - DEFAULT_DAYS_BACK_PROD_VERSIONS * 24 * 60 * 60 * 1000;
|
|
115
131
|
const daysAgoUnixDevel = Date.now() - DEFAULT_DAYS_BACK_DEVEL * 24 * 60 * 60 * 1000;
|
|
116
132
|
const buildsToDelete = items.filter((build) => {
|
|
117
133
|
if (build.buildNumber === defaultBuildNumber) {
|
|
118
|
-
console.error(`[DELETE OLD BUILDS][${this.actorName}]: Skipping default build ${defaultBuildNumber} (${defaultBuildTag}). `
|
|
119
|
-
|
|
134
|
+
console.error(`[DELETE OLD BUILDS][${this.actorName}]: Skipping default build ${defaultBuildNumber} (${defaultBuildTag}). ` +
|
|
135
|
+
`We never delete default builds`);
|
|
120
136
|
return false;
|
|
121
137
|
}
|
|
122
138
|
const protectedTagFound = protectedBuildNumbers.find((protectedBuildNumber) => protectedBuildNumber.buildNumber === build.buildNumber);
|
|
@@ -133,14 +149,14 @@ class ApifyBuilder {
|
|
|
133
149
|
}
|
|
134
150
|
return build.startedAt.getTime() < daysAgoUnixProd;
|
|
135
151
|
});
|
|
136
|
-
console.error(`[DELETE OLD BUILDS][${this.actorName}]: Deleting ${buildsToDelete.length} old builds that are non-default and `
|
|
137
|
-
|
|
152
|
+
console.error(`[DELETE OLD BUILDS][${this.actorName}]: Deleting ${buildsToDelete.length} old builds that are non-default and ` +
|
|
153
|
+
`older than 30 days from total ${items.length}`);
|
|
138
154
|
for (const build of buildsToDelete) {
|
|
139
155
|
await this.apifyClient.build(build.id).delete();
|
|
140
156
|
}
|
|
141
157
|
}
|
|
142
158
|
}
|
|
143
|
-
export const runBuilds = async ({ repoUrl, branch, actorConfigs, isLatest = false, dryRun
|
|
159
|
+
export const runBuilds = async ({ repoUrl, branch, actorConfigs, isLatest = false, dryRun }) => {
|
|
144
160
|
const buildConfigs = [];
|
|
145
161
|
const circleActors = isLatest ? await findCircleApifyManaged(actorConfigs) : [];
|
|
146
162
|
for (const { actorName, folder } of actorConfigs.concat(circleActors)) {
|
|
@@ -164,25 +180,25 @@ export const runBuilds = async ({ repoUrl, branch, actorConfigs, isLatest = fals
|
|
|
164
180
|
if (dryRun) {
|
|
165
181
|
return buildConfigs;
|
|
166
182
|
}
|
|
167
|
-
console.error(
|
|
168
|
-
console.error(
|
|
183
|
+
console.error('=========================================');
|
|
184
|
+
console.error('STARTED BUILDS:');
|
|
169
185
|
const startedBuilds = await Promise.all(buildConfigs.map(async (buildConfig) => {
|
|
170
186
|
const builder = ApifyBuilder.fromActorName(buildConfig.actorName);
|
|
171
187
|
const buildData = await builder.startActorBuild(buildConfig);
|
|
172
188
|
return buildData;
|
|
173
189
|
}));
|
|
174
|
-
console.error(
|
|
175
|
-
console.error(
|
|
190
|
+
console.error('=========================================');
|
|
191
|
+
console.error('FINISHED BUILDS:');
|
|
176
192
|
await Promise.all(startedBuilds.map(async (buildData) => {
|
|
177
193
|
const builder = ApifyBuilder.fromActorName(buildData.actorName);
|
|
178
194
|
await builder.waitForBuildToFinish(buildData.buildId, buildData.actorName);
|
|
179
195
|
}));
|
|
180
|
-
console.error(
|
|
181
|
-
console.error(
|
|
196
|
+
console.error('=========================================');
|
|
197
|
+
console.error('SUMMARY:');
|
|
182
198
|
for (const buildData of startedBuilds.sort((a, b) => a.actorName.localeCompare(b.actorName))) {
|
|
183
199
|
console.error(`[${buildData.actorName}]: ${buildData.buildNumber} `);
|
|
184
200
|
}
|
|
185
|
-
console.error(
|
|
201
|
+
console.error('=========================================');
|
|
186
202
|
return startedBuilds;
|
|
187
203
|
};
|
|
188
204
|
export const deleteOldBuilds = async (actorConfigs) => {
|
|
@@ -201,7 +217,8 @@ const findCircleApifyManaged = async (actorConfigs) => {
|
|
|
201
217
|
// This token is hardcoded in the runner Actor, locally you have to inject it
|
|
202
218
|
const client = new ApifyClient({ token: getEnvVar('APIFY_TOKEN_CIRC_LE') });
|
|
203
219
|
const { items: circleActors } = await client.actors().list();
|
|
204
|
-
const actorsToBuild = circleActors
|
|
220
|
+
const actorsToBuild = circleActors
|
|
221
|
+
.map((circleActor) => {
|
|
205
222
|
// They prefix all with apify-managed---, I communicated with Jacques to keep doing that
|
|
206
223
|
let actorConfigFound = actorConfigs.find((actorConfig) => circleActor.name.replace('apify-managed---', '') === actorConfig.actorName.split('/')[1]);
|
|
207
224
|
// Hack for bad naming of circ_le/apify-managed-google-search, we don't want to rename now to break customers
|
|
@@ -217,7 +234,8 @@ const findCircleApifyManaged = async (actorConfigs) => {
|
|
|
217
234
|
};
|
|
218
235
|
}
|
|
219
236
|
return undefined;
|
|
220
|
-
})
|
|
237
|
+
})
|
|
238
|
+
.filter((config) => config !== undefined);
|
|
221
239
|
console.error(`Found ${actorsToBuild.length} circ_le actors that match Actors we built out of total ${circleActors.length} circ_le actors`);
|
|
222
240
|
console.error(`All circ_le actors: ${circleActors.map((actor) => actor.name).join(', ')}`);
|
|
223
241
|
console.error(`circ_le Actors to build: ${actorsToBuild.map((actor) => actor.actorName).join(', ')}`);
|
package/dist/bin/build.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../bin/build.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../bin/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ActorConfig, Commit } from './types.js';
|
|
2
|
+
interface ShouldBuildAndTestOptions {
|
|
3
|
+
filepathsChanged: string[];
|
|
4
|
+
actorConfigs: ActorConfig[];
|
|
5
|
+
isLatest?: boolean;
|
|
6
|
+
commits: Commit[];
|
|
7
|
+
}
|
|
8
|
+
export declare const maybeParseActorFolder: (lowercaseFilePath: string) => {
|
|
9
|
+
isActorFolder: true;
|
|
10
|
+
actorName: string;
|
|
11
|
+
} | {
|
|
12
|
+
isActorFolder: false;
|
|
13
|
+
};
|
|
14
|
+
export declare const getChangedActors: ({ filepathsChanged, actorConfigs, isLatest, commits, }: ShouldBuildAndTestOptions) => ActorConfig[];
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=diff-changes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-changes.d.ts","sourceRoot":"","sources":["../../bin/diff-changes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEtD,UAAU,yBAAyB;IAC/B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,eAAO,MAAM,qBAAqB,GAC9B,mBAAmB,MAAM,KAC1B;IAAE,aAAa,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,aAAa,EAAE,KAAK,CAAA;CAOrE,CAAC;AAyEF,eAAO,MAAM,gBAAgB,GAAI,wDAK9B,yBAAyB,KAAG,WAAW,EA0DzC,CAAC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { isCosmeticOnlyJsonSchemaChange } from './diff-json-schema.js';
|
|
2
|
+
export const maybeParseActorFolder = (lowercaseFilePath) => {
|
|
3
|
+
const match = lowercaseFilePath.match(/^(?:standalone-)?actors\/([^/]+)\/.+/);
|
|
4
|
+
if (match) {
|
|
5
|
+
// Some usernames weirdly use underscores, e.g. google_maps_email_extractor_standby-contact-details-scraper so we only need replace the last one
|
|
6
|
+
return { isActorFolder: true, actorName: match[1].replace(/_(?=[^_]*$)/, '/') };
|
|
7
|
+
}
|
|
8
|
+
return { isActorFolder: false };
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Also works for folders
|
|
12
|
+
*/
|
|
13
|
+
const isIgnoredTopLevelFile = (lowercaseFilePath) => {
|
|
14
|
+
// On top level, we should only have dev-only readme and .actor/ is just for apify push CLI (real Actor configs are in /actors)
|
|
15
|
+
const IGNORED_TOP_LEVEL_FILES = [
|
|
16
|
+
'.vscode/',
|
|
17
|
+
'.gitignore',
|
|
18
|
+
'readme.md',
|
|
19
|
+
'.husky/',
|
|
20
|
+
'.eslintrc',
|
|
21
|
+
'eslint.config.mjs',
|
|
22
|
+
'.prettierrc',
|
|
23
|
+
'.editorconfig',
|
|
24
|
+
'.actor/',
|
|
25
|
+
];
|
|
26
|
+
// Strip out deprecated /code and /shared folders, treat them as top-level code
|
|
27
|
+
const sanitizedLowercaseFilePath = lowercaseFilePath.replace(/^code\//, '').replace(/^shared\//, '');
|
|
28
|
+
return IGNORED_TOP_LEVEL_FILES.some((ignoredFile) => sanitizedLowercaseFilePath.startsWith(ignoredFile));
|
|
29
|
+
};
|
|
30
|
+
const classifyFileChange = (lowercaseFilePath, actorConfigs, commits) => {
|
|
31
|
+
if (isIgnoredTopLevelFile(lowercaseFilePath)) {
|
|
32
|
+
return { impact: 'ignored' };
|
|
33
|
+
}
|
|
34
|
+
if (lowercaseFilePath.endsWith('changelog.md')) {
|
|
35
|
+
return { impact: 'cosmetic', includes: 'all-actors' };
|
|
36
|
+
}
|
|
37
|
+
const actorFolderInfo = maybeParseActorFolder(lowercaseFilePath);
|
|
38
|
+
if (actorFolderInfo.isActorFolder) {
|
|
39
|
+
const actorConfigChanged = actorConfigs.find(({ actorName }) => actorName.toLowerCase() === actorFolderInfo.actorName);
|
|
40
|
+
// This is some super weird case that happened once in the past but I don't remember the context anymore
|
|
41
|
+
if (actorConfigChanged === undefined) {
|
|
42
|
+
console.error('SHOULD NEVER HAPPEN: changes was found in an actor folder which no longer exists in the current commit, skipping this file', {
|
|
43
|
+
actorName: actorFolderInfo.actorName,
|
|
44
|
+
lowercaseFilePath,
|
|
45
|
+
});
|
|
46
|
+
return { impact: 'ignored' };
|
|
47
|
+
}
|
|
48
|
+
if (lowercaseFilePath.endsWith('readme.md')) {
|
|
49
|
+
return { impact: 'cosmetic', includes: actorConfigChanged };
|
|
50
|
+
}
|
|
51
|
+
if (lowercaseFilePath.endsWith('.json') && isCosmeticOnlyJsonSchemaChange(commits, lowercaseFilePath)) {
|
|
52
|
+
return { impact: 'cosmetic', includes: actorConfigChanged };
|
|
53
|
+
}
|
|
54
|
+
return { impact: 'functional', includes: actorConfigChanged };
|
|
55
|
+
}
|
|
56
|
+
// For any other files, we assume they can interact with the code
|
|
57
|
+
return { impact: 'functional', includes: 'all-actors' };
|
|
58
|
+
};
|
|
59
|
+
export const getChangedActors = ({ filepathsChanged, actorConfigs, isLatest = false, commits, }) => {
|
|
60
|
+
// folder -> ActorConfig
|
|
61
|
+
const actorsChangedMap = new Map();
|
|
62
|
+
const actorConfigsWithoutStandalone = actorConfigs.filter(({ isStandalone }) => !isStandalone);
|
|
63
|
+
const lowercaseFiles = filepathsChanged.map((file) => file.toLowerCase());
|
|
64
|
+
for (const lowercaseFilePath of lowercaseFiles) {
|
|
65
|
+
const fileChange = classifyFileChange(lowercaseFilePath, actorConfigs, commits);
|
|
66
|
+
if (fileChange.impact === 'ignored') {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (fileChange.impact === 'cosmetic' && !isLatest) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (fileChange.includes !== 'all-actors') {
|
|
73
|
+
actorsChangedMap.set(fileChange.includes.folder, fileChange.includes);
|
|
74
|
+
}
|
|
75
|
+
else if (fileChange.includes === 'all-actors') {
|
|
76
|
+
// Standalone Actors are handled always via specific actors change, not all-actors
|
|
77
|
+
for (const actorConfig of actorConfigsWithoutStandalone) {
|
|
78
|
+
actorsChangedMap.set(actorConfig.folder, actorConfig);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const actorsChanged = Array.from(actorsChangedMap.values());
|
|
83
|
+
// All below here is just for logging
|
|
84
|
+
const ignoredFilesChanged = lowercaseFiles.filter((file) => classifyFileChange(file, actorConfigs, commits).impact === 'ignored');
|
|
85
|
+
console.error(`[DIFF]: Ignored files (don't trigger test or build): ${ignoredFilesChanged.join(', ')}`);
|
|
86
|
+
const cosmeticFilesChanged = lowercaseFiles.filter((file) => classifyFileChange(file, actorConfigs, commits).impact === 'cosmetic');
|
|
87
|
+
console.error(`[DIFF]: Cosmetic files (should only trigger release build): ${cosmeticFilesChanged.join(', ')}`);
|
|
88
|
+
const functionalFilesChanged = lowercaseFiles.filter((file) => classifyFileChange(file, actorConfigs, commits).impact === 'functional');
|
|
89
|
+
console.error(`[DIFF]: Functional files (trigger test & release build): ${functionalFilesChanged.join(', ')}`);
|
|
90
|
+
if (actorsChanged.length > 0) {
|
|
91
|
+
const miniactors = actorsChanged.filter((config) => !config.isStandalone).map((config) => config.actorName);
|
|
92
|
+
const standaloneActors = actorsChanged
|
|
93
|
+
.filter((config) => config.isStandalone)
|
|
94
|
+
.map((config) => config.actorName);
|
|
95
|
+
console.error(`[DIFF]: MiniActors to be built and tested: ${miniactors.join(', ')}`);
|
|
96
|
+
console.error(`[DIFF]: Standalone Actors to be built and tested: ${standaloneActors.join(', ')}`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
console.error(`[DIFF]: No relevant files changed, skipping builds and tests`);
|
|
100
|
+
}
|
|
101
|
+
return actorsChanged;
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=diff-changes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-changes.js","sourceRoot":"","sources":["../../bin/diff-changes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Commit } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Returns true if the two JSON strings differ only in cosmetic fields
|
|
4
|
+
* (title, description, example, enumTitles, sectionCaption, sectionDescription).
|
|
5
|
+
*/
|
|
6
|
+
export declare const isCosmeticOnlyJsonSchemaChange: (commits: Commit[], changedFilepath: string) => boolean;
|
|
7
|
+
//# sourceMappingURL=diff-json-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-json-schema.d.ts","sourceRoot":"","sources":["../../bin/diff-json-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AA0BzC;;;GAGG;AACH,eAAO,MAAM,8BAA8B,GAAI,SAAS,MAAM,EAAE,EAAE,iBAAiB,MAAM,KAAG,OAmB3F,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { spawnCommandInGhWorkspace } from './utils.js';
|
|
2
|
+
const COSMETIC_JSON_FIELD_NAMES = new Set([
|
|
3
|
+
'title',
|
|
4
|
+
'description',
|
|
5
|
+
'example',
|
|
6
|
+
'enumTitles',
|
|
7
|
+
'sectionCaption',
|
|
8
|
+
'sectionDescription',
|
|
9
|
+
]);
|
|
10
|
+
const isPlainObject = (val) => typeof val === 'object' && val !== null && !Array.isArray(val);
|
|
11
|
+
const isCosmeticObjectChange = (oldVal, newVal, currentKey) => {
|
|
12
|
+
// If the key itself is cosmetic, any change under it is fine
|
|
13
|
+
if (currentKey && COSMETIC_JSON_FIELD_NAMES.has(currentKey))
|
|
14
|
+
return true;
|
|
15
|
+
if (JSON.stringify(oldVal) === JSON.stringify(newVal))
|
|
16
|
+
return true;
|
|
17
|
+
if (isPlainObject(oldVal) && isPlainObject(newVal)) {
|
|
18
|
+
const allKeys = new Set([...Object.keys(oldVal), ...Object.keys(newVal)]);
|
|
19
|
+
return [...allKeys].every((key) => isCosmeticObjectChange(oldVal[key], newVal[key], key));
|
|
20
|
+
}
|
|
21
|
+
return false;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Returns true if the two JSON strings differ only in cosmetic fields
|
|
25
|
+
* (title, description, example, enumTitles, sectionCaption, sectionDescription).
|
|
26
|
+
*/
|
|
27
|
+
export const isCosmeticOnlyJsonSchemaChange = (commits, changedFilepath) => {
|
|
28
|
+
// TODO: validate this is the right commit range
|
|
29
|
+
const oldRef = `${commits[0].sha}~`;
|
|
30
|
+
const newRef = commits[commits.length - 1].sha;
|
|
31
|
+
let oldJson;
|
|
32
|
+
let newJson;
|
|
33
|
+
try {
|
|
34
|
+
const oldContent = spawnCommandInGhWorkspace(`git show ${oldRef}:${changedFilepath}`);
|
|
35
|
+
const newContent = spawnCommandInGhWorkspace(`git show ${newRef}:${changedFilepath}`);
|
|
36
|
+
oldJson = JSON.parse(oldContent);
|
|
37
|
+
newJson = JSON.parse(newContent);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
console.error(`Failed to get or parse JSON content for ${changedFilepath} at refs ${oldRef} and ${newRef}, maybe it is new file or deleted? Treating it as a non-cosmetic change.`);
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return isCosmeticObjectChange(oldJson, newJson);
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=diff-json-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-json-schema.js","sourceRoot":"","sources":["../../bin/diff-json-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC;IACtC,OAAO;IACP,aAAa;IACb,SAAS;IACT,YAAY;IACZ,gBAAgB;IAChB,oBAAoB;CACvB,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,CAAC,GAAY,EAAkC,EAAE,CACnE,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAEnE,MAAM,sBAAsB,GAAG,CAAC,MAAe,EAAE,MAAe,EAAE,UAAmB,EAAW,EAAE;IAC9F,6DAA6D;IAC7D,IAAI,UAAU,IAAI,yBAAyB,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACzE,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACnE,IAAI,aAAa,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,sBAAsB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,OAAiB,EAAE,eAAuB,EAAW,EAAE;IAClG,gDAAgD;IAChD,MAAM,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACpC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/C,IAAI,OAAgB,CAAC;IACrB,IAAI,OAAgB,CAAC;IACrB,IAAI,CAAC;QACD,MAAM,UAAU,GAAG,yBAAyB,CAAC,YAAY,MAAM,IAAI,eAAe,EAAE,CAAC,CAAC;QACtF,MAAM,UAAU,GAAG,yBAAyB,CAAC,YAAY,MAAM,IAAI,eAAe,EAAE,CAAC,CAAC;QAEtF,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACjC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,CAAC,KAAK,CACT,2CAA2C,eAAe,YAAY,MAAM,QAAQ,MAAM,0EAA0E,CACvK,CAAC;QACF,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC,CAAC"}
|
package/dist/bin/git.d.ts
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
import { Commit, Config } from './types.js';
|
|
1
|
+
import type { Commit, Config } from './types.js';
|
|
2
2
|
export declare const GIT_FORMAT_SEPARATOR = "\u00BB\u00A6\u00AB";
|
|
3
3
|
/**
|
|
4
4
|
* Gets the list of changed files between the given commits (inclusive).
|
|
5
5
|
*/
|
|
6
6
|
export declare const getChangedFiles: (commits: Commit[]) => string[];
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
* @param shaOrCommit Supports both a SHA string or a Commit object in JSON format. Can be empty.
|
|
10
|
+
* @returns The SHA string if valid, otherwise throws an error.
|
|
11
|
+
*/
|
|
12
|
+
export declare const parseBaseCommit: (shaOrCommit: string | undefined) => string | undefined;
|
|
7
13
|
/**
|
|
8
14
|
* Gets the commits between sourceBranch and targetBranch (exclusive).
|
|
9
15
|
* - If baseCommit is provided, only returns commits after the baseCommit.
|
|
10
16
|
*/
|
|
11
|
-
export declare const getCommits: ({ sourceBranch, targetBranch, baseCommit
|
|
12
|
-
export declare const getCommitInfo: (commitSha: string) => Commit;
|
|
17
|
+
export declare const getCommits: ({ sourceBranch, targetBranch, baseCommit }: Config) => Commit[];
|
|
13
18
|
export declare const parseCommit: (commitString: string) => Commit;
|
|
14
19
|
//# sourceMappingURL=git.d.ts.map
|
package/dist/bin/git.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../bin/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../bin/git.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGjD,eAAO,MAAM,oBAAoB,uBAAQ,CAAC;AAG1C;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,MAAM,EAAE,aAQhD,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAAI,aAAa,MAAM,GAAG,SAAS,KAAG,MAAM,GAAG,SAc1E,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,4CAA4C,MAAM,KAAG,MAAM,EAyBrF,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,cAAc,MAAM,KAAG,MAYlD,CAAC"}
|
package/dist/bin/git.js
CHANGED
|
@@ -5,28 +5,53 @@ const GIT_LOG_FORMAT = ['%H', '%aN<%aE>', '%aD', '%s'].join(GIT_FORMAT_SEPARATOR
|
|
|
5
5
|
* Gets the list of changed files between the given commits (inclusive).
|
|
6
6
|
*/
|
|
7
7
|
export const getChangedFiles = (commits) => {
|
|
8
|
-
const
|
|
9
|
-
|
|
8
|
+
const changedFilesString = spawnCommandInGhWorkspace(`git diff --name-only ${commits[0].sha}~..${commits[commits.length - 1].sha}`);
|
|
9
|
+
const changedFiles = changedFilesString.split('\n');
|
|
10
|
+
console.error(`Changed files (up to 50): ${changedFiles.slice(0, 50).join(', ')}`);
|
|
11
|
+
return changedFiles;
|
|
12
|
+
};
|
|
13
|
+
const SHA_REGEX = /^[0-9a-f]{40}$/i;
|
|
14
|
+
/**
|
|
15
|
+
*
|
|
16
|
+
* @param shaOrCommit Supports both a SHA string or a Commit object in JSON format. Can be empty.
|
|
17
|
+
* @returns The SHA string if valid, otherwise throws an error.
|
|
18
|
+
*/
|
|
19
|
+
export const parseBaseCommit = (shaOrCommit) => {
|
|
20
|
+
if (!shaOrCommit)
|
|
21
|
+
return undefined;
|
|
22
|
+
let sha;
|
|
23
|
+
if (shaOrCommit.startsWith('{')) {
|
|
24
|
+
sha = JSON.parse(shaOrCommit).sha;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
sha = shaOrCommit;
|
|
28
|
+
}
|
|
29
|
+
if (!SHA_REGEX.test(sha)) {
|
|
30
|
+
throw new Error(`Invalid base commit SHA: "${sha}". It should be a 40-character hexadecimal string, instead got input: "${shaOrCommit}".`);
|
|
31
|
+
}
|
|
32
|
+
return sha;
|
|
10
33
|
};
|
|
11
34
|
/**
|
|
12
35
|
* Gets the commits between sourceBranch and targetBranch (exclusive).
|
|
13
36
|
* - If baseCommit is provided, only returns commits after the baseCommit.
|
|
14
37
|
*/
|
|
15
|
-
export const getCommits = ({ sourceBranch, targetBranch, baseCommit
|
|
38
|
+
export const getCommits = ({ sourceBranch, targetBranch, baseCommit }) => {
|
|
39
|
+
const baseCommitSha = parseBaseCommit(baseCommit);
|
|
16
40
|
const commitsStrings = spawnCommandInGhWorkspace(`git log --pretty=format:'${GIT_LOG_FORMAT}' ${targetBranch}..${sourceBranch}`).split('\n');
|
|
17
41
|
const commits = commitsStrings.map((commitString) => parseCommit(commitString));
|
|
18
42
|
commits.reverse();
|
|
19
43
|
const baseCommitIndex = commits.findIndex((commit) => commit.sha === baseCommitSha);
|
|
20
44
|
const hasBaseCommit = baseCommitIndex !== -1;
|
|
21
|
-
if (hasBaseCommit)
|
|
22
|
-
|
|
45
|
+
if (hasBaseCommit) {
|
|
46
|
+
const commitsUpToBaseCommit = commits.slice(baseCommitIndex + 1);
|
|
47
|
+
console.error(`Found base commit ${baseCommitSha} at index ${baseCommitIndex}, returning ${commitsUpToBaseCommit.length} commits after it`);
|
|
48
|
+
console.error(`Commits being returned: ${commitsUpToBaseCommit.map((c) => c.sha).join(', ')}`);
|
|
49
|
+
return commitsUpToBaseCommit;
|
|
50
|
+
}
|
|
51
|
+
console.error(`Base commit ${baseCommitSha} not found in the commit range, returning all ${commits.length} commits`);
|
|
52
|
+
console.error(`Commits being returned: ${commits.map((c) => c.sha).join(', ')}`);
|
|
23
53
|
return commits;
|
|
24
54
|
};
|
|
25
|
-
export const getCommitInfo = (commitSha) => {
|
|
26
|
-
const commitString = spawnCommandInGhWorkspace(`git log -1 --pretty=format:'${GIT_LOG_FORMAT}' ${commitSha}`);
|
|
27
|
-
const commit = parseCommit(commitString);
|
|
28
|
-
return commit;
|
|
29
|
-
};
|
|
30
55
|
export const parseCommit = (commitString) => {
|
|
31
56
|
const splits = commitString.split(GIT_FORMAT_SEPARATOR);
|
|
32
57
|
if (splits.length !== 4) {
|
package/dist/bin/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../bin/git.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAC1C,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAElF;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAiB,EAAE,EAAE;IACjD,MAAM,
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../bin/git.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/github.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Commit
|
|
1
|
+
import type { Commit } from './types.js';
|
|
2
2
|
export declare const getPushData: (path: string) => Promise<{
|
|
3
3
|
branch: string;
|
|
4
4
|
commits: Commit[];
|
|
@@ -8,6 +8,4 @@ export declare const getPushData: (path: string) => Promise<{
|
|
|
8
8
|
repository: string;
|
|
9
9
|
author: string;
|
|
10
10
|
}>;
|
|
11
|
-
export declare const loadGitHubEvent: (path: string) => Promise<GitHubEventPush>;
|
|
12
|
-
export declare const getChangelogChanges: (changedFiles: string[], event: GitHubEventPush) => string | null;
|
|
13
11
|
//# sourceMappingURL=github.d.ts.map
|
package/dist/bin/github.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../bin/github.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../bin/github.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAmB,MAAM,YAAY,CAAC;AAG1D,eAAO,MAAM,WAAW,GAAU,MAAM,MAAM;;;;;;;;EAyB7C,CAAC"}
|
package/dist/bin/github.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import fs from 'fs/promises';
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
2
|
import { spawnCommandInGhWorkspace } from './utils.js';
|
|
3
3
|
export const getPushData = async (path) => {
|
|
4
4
|
const event = await loadGitHubEvent(path);
|
|
5
5
|
const branch = event.ref.replace('refs/heads/', '');
|
|
6
6
|
const { commits: ghCommits, repository: { ssh_url: repoUrl, name }, head_commit: { author }, } = event;
|
|
7
|
-
const commits = ghCommits.map(({ author, message, id, timestamp }) => ({
|
|
8
|
-
author:
|
|
7
|
+
const commits = ghCommits.map(({ author: commitAuthor, message, id, timestamp }) => ({
|
|
8
|
+
author: commitAuthor.username,
|
|
9
9
|
sha: id,
|
|
10
10
|
message,
|
|
11
11
|
date: timestamp,
|
|
@@ -22,7 +22,7 @@ export const getPushData = async (path) => {
|
|
|
22
22
|
author: author.name,
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
|
-
|
|
25
|
+
const loadGitHubEvent = async (path) => {
|
|
26
26
|
const pushEvent = JSON.parse((await fs.readFile(path)).toString());
|
|
27
27
|
return pushEvent;
|
|
28
28
|
};
|
|
@@ -30,7 +30,7 @@ const getChangedFiles = ({ after, before }) => {
|
|
|
30
30
|
const changedFiles = spawnCommandInGhWorkspace(`git diff --name-only ${after}..${before}`);
|
|
31
31
|
return changedFiles.split('\n');
|
|
32
32
|
};
|
|
33
|
-
|
|
33
|
+
const getChangelogChanges = (changedFiles, event) => {
|
|
34
34
|
const changelogPath = 'CHANGELOG.md';
|
|
35
35
|
if (!changedFiles.includes(changelogPath)) {
|
|
36
36
|
return null;
|
package/dist/bin/github.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../bin/github.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../bin/github.ts"],"names":[],"mappings":"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"}
|