@payfit/nx-core 4.30.0-ephemeral-release-scripts-7ecb1df.0 → 4.30.0-ephemeral-release-scripts-982b0ca.0

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/executors.json CHANGED
@@ -4,6 +4,11 @@
4
4
  "implementation": "./src/executors/publisher/executor",
5
5
  "schema": "./src/executors/publisher/schema.json",
6
6
  "description": "Docker & Helm publisher executor"
7
+ },
8
+ "release": {
9
+ "implementation": "./src/executors/release/executor",
10
+ "schema": "./src/executors/release/schema.json",
11
+ "description": "Custom release executor"
7
12
  }
8
13
  }
9
14
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payfit/nx-core",
3
- "version": "4.30.0-ephemeral-release-scripts-7ecb1df.0",
3
+ "version": "4.30.0-ephemeral-release-scripts-982b0ca.0",
4
4
  "type": "commonjs",
5
5
  "main": "./src/index.js",
6
6
  "types": "./src/index.d.ts",
@@ -19,7 +19,6 @@
19
19
  "tinyexec": "1.0.1",
20
20
  "tslib": "^2.8.1",
21
21
  "yaml": "2.8.0",
22
- "yargs": "17.7.2",
23
22
  "zod": "^3.24.3"
24
23
  },
25
24
  "devDependencies": {
@@ -0,0 +1,4 @@
1
+ import { ExecutorContext } from '@nx/devkit';
2
+ import { ReleaseExecutorOptions, ReleaseExecutorSchema } from './schema';
3
+ declare const runExecutor: (options: ReleaseExecutorOptions, context: ExecutorContext) => Promise<ReleaseExecutorSchema>;
4
+ export default runExecutor;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const release_1 = require("nx/release");
4
+ const logger_1 = require("../../utils/logger");
5
+ const runExecutor = async (options, context) => {
6
+ try {
7
+ logger_1.consola.start('Starting release process...');
8
+ // Step 1: Version Release
9
+ logger_1.consola.info('Step 1/3: Starting version release...');
10
+ const { projectsVersionData } = await (0, release_1.releaseVersion)({
11
+ specifier: options?.preid?.includes('ephemeral') ? 'prerelease' : null,
12
+ dryRun: options.dryRun,
13
+ verbose: options.verbose,
14
+ preid: options.preid,
15
+ });
16
+ logger_1.consola.success('Version release completed successfully');
17
+ // iterate over `projectsVersionData` to extract changed projects
18
+ const projectsToPublish = Object.entries(projectsVersionData)
19
+ .map(([projectName, versionData]) => {
20
+ if (versionData?.newVersion) {
21
+ logger_1.consola.info(`Project '${projectName}' will be updated to version ${versionData.newVersion}`);
22
+ return projectName;
23
+ }
24
+ return null; // filter out projects that didn't change
25
+ })
26
+ .filter(Boolean);
27
+ if (projectsToPublish.length === 0) {
28
+ logger_1.consola.warn('No project to publish');
29
+ return {
30
+ success: true,
31
+ };
32
+ }
33
+ logger_1.consola.warn(`Publishing new versions for ${projectsToPublish.join(', ')}`);
34
+ // Step 2: Changelog Release
35
+ logger_1.consola.info('Step 2/3: Generating changelog...');
36
+ await (0, release_1.releaseChangelog)({
37
+ versionData: projectsVersionData,
38
+ dryRun: options.dryRun,
39
+ verbose: options.verbose,
40
+ });
41
+ logger_1.consola.success('Changelog generation completed successfully');
42
+ // Step 3: Publish Release
43
+ if (options.skipPublish) {
44
+ logger_1.consola.warn('Skipping publish step as requested.');
45
+ return {
46
+ success: true,
47
+ };
48
+ }
49
+ logger_1.consola.info('Step 3/3: Publishing packages...');
50
+ const publishResults = await (0, release_1.releasePublish)({
51
+ projects: projectsToPublish,
52
+ dryRun: options.dryRun,
53
+ verbose: options.verbose,
54
+ tag: options?.preid?.includes('ephemeral') ? 'ephemeral' : null,
55
+ });
56
+ // Log publish results
57
+ Object.entries(publishResults).forEach(([projectName, result]) => {
58
+ if (result.code === 0) {
59
+ logger_1.consola.info(`Successfully published ${projectName}`);
60
+ }
61
+ else {
62
+ logger_1.consola.error(`Failed to publish ${projectName} with exit code ${result.code}`);
63
+ }
64
+ });
65
+ }
66
+ catch (error) {
67
+ logger_1.consola.error(error);
68
+ return {
69
+ success: false,
70
+ };
71
+ }
72
+ return {
73
+ success: true,
74
+ };
75
+ };
76
+ exports.default = runExecutor;
77
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../../../../packages/nx-core/src/executors/release/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface ReleaseExecutorSchema {} // eslint-disable-line
2
+ export interface ReleaseExecutorOptions {
3
+ skipPublish?: boolean
4
+ preid?: string
5
+ dryRun?: boolean
6
+ verbose?: boolean
7
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "https://json-schema.org/schema",
3
+ "version": 2,
4
+ "title": "Publisher executor",
5
+ "description": "Publish the helm chart to the chartmuseum and docker image to ECR",
6
+ "type": "object",
7
+ "properties": {
8
+ "preid": {
9
+ "type": "string",
10
+ "description": "The pre id to use as a prefix with the tag"
11
+ },
12
+ "skipPublish": {
13
+ "type": "boolean",
14
+ "description": "Should skip publish"
15
+ },
16
+ "dryRun": {
17
+ "type": "boolean",
18
+ "description": "Is dry run"
19
+ },
20
+ "verbose": {
21
+ "type": "boolean",
22
+ "description": "Is verbose"
23
+ }
24
+ },
25
+ "required": []
26
+ }
@@ -1 +0,0 @@
1
- export {};
@@ -1,123 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const release_1 = require("nx/release");
4
- const yargs = require("yargs");
5
- /**
6
- * Helper function to log messages with timestamps
7
- */
8
- function log(message, isError = false) {
9
- const timestamp = new Date().toISOString();
10
- const logFn = isError ? console.error : console.log;
11
- logFn(`[${timestamp}] ${message}`);
12
- }
13
- ;
14
- (async () => {
15
- try {
16
- const options = await yargs
17
- .version(false) // don't use the default meaning of version in yargs
18
- .option('version', {
19
- description: 'Explicit version specifier to use, if overriding conventional commits',
20
- type: 'string',
21
- })
22
- .option('dryRun', {
23
- alias: 'd',
24
- description: 'Whether or not to perform a dry-run of the release process, defaults to true',
25
- type: 'boolean',
26
- default: true,
27
- })
28
- .option('verbose', {
29
- description: 'Whether or not to enable verbose logging, defaults to false',
30
- type: 'boolean',
31
- default: false,
32
- })
33
- .option('specifier', {
34
- description: 'The specifier to use when creating the release, can be set to "prerelease" for releasing an alpha version',
35
- type: 'string',
36
- default: undefined,
37
- })
38
- .option('skipPublish', {
39
- description: 'Skip publishing the package to the registry',
40
- type: 'boolean',
41
- default: false,
42
- })
43
- .option('preid', {
44
- description: 'The version prefix to use, can be set in combination with specifier="prerelease"',
45
- type: 'string',
46
- default: undefined,
47
- })
48
- .parseAsync();
49
- log('Starting release process...');
50
- log(`Release options: ${JSON.stringify(options, null, 2)}`);
51
- // Step 1: Version Release
52
- log('Step 1/3: Starting version release...');
53
- const { projectsVersionData } = await (0, release_1.releaseVersion)({
54
- specifier: options.version,
55
- dryRun: options.dryRun,
56
- verbose: options.verbose,
57
- preid: options.preid,
58
- });
59
- log('Version release completed successfully');
60
- // iterate over `projectsVersionData` to extract changed projects
61
- const projectsToPublish = Object.entries(projectsVersionData)
62
- .map(([projectName, versionData]) => {
63
- if (versionData?.newVersion) {
64
- log(`Project '${projectName}' will be updated to version ${versionData.newVersion}`);
65
- return projectName;
66
- }
67
- return null; // filter out projects that didn't change
68
- })
69
- .filter(Boolean);
70
- if (projectsToPublish.length === 0) {
71
- log('No projects to publish. Exiting...');
72
- process.exit(0);
73
- }
74
- log(`Found ${projectsToPublish.length} project(s) to publish: ${projectsToPublish.join(', ')}`);
75
- // Step 2: Changelog Release
76
- log('Step 2/3: Generating changelog...');
77
- await (0, release_1.releaseChangelog)({
78
- versionData: projectsVersionData,
79
- dryRun: options.dryRun,
80
- verbose: options.verbose,
81
- });
82
- log('Changelog generation completed successfully');
83
- // Step 3: Publish Release
84
- if (!options.skipPublish) {
85
- log('Step 3/3: Publishing packages...');
86
- const publishResults = await (0, release_1.releasePublish)({
87
- projects: projectsToPublish,
88
- dryRun: options.dryRun,
89
- verbose: options.verbose,
90
- tag: options.specifier,
91
- });
92
- // Log publish results
93
- Object.entries(publishResults).forEach(([projectName, result]) => {
94
- if (result.code === 0) {
95
- log(`Successfully published ${projectName}`);
96
- }
97
- else {
98
- log(`Failed to publish ${projectName} with exit code ${result.code}`, true);
99
- }
100
- });
101
- const allSuccessful = Object.values(publishResults).every(result => result.code === 0);
102
- if (allSuccessful) {
103
- log('All packages published successfully');
104
- }
105
- else {
106
- log('Some packages failed to publish. Check the logs for details.', true);
107
- }
108
- process.exit(allSuccessful ? 0 : 1);
109
- }
110
- else {
111
- log('Skipping publish step as requested.');
112
- process.exit(0);
113
- }
114
- }
115
- catch (error) {
116
- log(`Error during release process: ${error instanceof Error ? error.message : String(error)}`, true);
117
- if (error instanceof Error && error.stack) {
118
- log(`Stack trace: ${error.stack}`, true);
119
- }
120
- process.exit(1);
121
- }
122
- })();
123
- //# sourceMappingURL=release.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"release.js","sourceRoot":"","sources":["../../../../../packages/nx-core/src/scripts/release.ts"],"names":[],"mappings":"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"}