@quark-hq/quark-scripts 0.0.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/LICENSE +21 -0
- package/dist/app/base-application.js +67 -0
- package/dist/app/buildApplication.js +20 -0
- package/dist/app/copyStaticApplication.js +34 -0
- package/dist/app/devApplication.js +59 -0
- package/dist/app/prod-publish-application.js +124 -0
- package/dist/app/publish-dev-application.js +104 -0
- package/dist/app/publishDevApplication.js +16 -0
- package/dist/app/release-application.js +85 -0
- package/dist/app/releaseApplication.js +154 -0
- package/dist/app/unfreeze-application.js +75 -0
- package/dist/app/watchStaticApplication.js +34 -0
- package/dist/cli/cli-containers.js +70 -0
- package/dist/cli/cliCommand.js +2 -0
- package/dist/cli/cliContainers.js +62 -0
- package/dist/cli/commands/buildCommands.js +17 -0
- package/dist/cli/commands/copyStaticCommands.js +17 -0
- package/dist/cli/commands/devCommands.js +17 -0
- package/dist/cli/commands/prod-publish-commands.js +18 -0
- package/dist/cli/commands/publish-dev-commands.js +17 -0
- package/dist/cli/commands/publishDevCommands.js +17 -0
- package/dist/cli/commands/release-commands.js +17 -0
- package/dist/cli/commands/releaseCommands.js +17 -0
- package/dist/cli/commands/relesaeCommand.js +15 -0
- package/dist/cli/commands/unfreeze-commands.js +17 -0
- package/dist/cli/commands/watchStaticCommands.js +17 -0
- package/dist/cli/program.js +16 -0
- package/dist/commands/index.d.ts +8 -0
- package/dist/commands/index.js +132 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/domain/graph.js +2 -0
- package/dist/domain/new-package-freeze-from-map.js +21 -0
- package/dist/domain/resolve-workspace-dependency-specifier-for-freeze-map.js +33 -0
- package/dist/domain/reverse-dependents.js +45 -0
- package/dist/domain/topological-sorting.js +43 -0
- package/dist/domain/transitive-dependents.js +25 -0
- package/dist/domain/workspace-transitive-dependencies.js +25 -0
- package/dist/errors/unfreeze-blocked-error.js +44 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/adapters/base-release-adapter.js +281 -0
- package/dist/infrastructure/adapters/maven-prod-publish-adapter.js +48 -0
- package/dist/infrastructure/adapters/maven-release-adapter.js +58 -0
- package/dist/infrastructure/adapters/node-prod-publish-adapter.js +111 -0
- package/dist/infrastructure/adapters/node-release-adapter/node-file-update.js +1 -0
- package/dist/infrastructure/adapters/node-release-adapter/node-release-adapter.js +289 -0
- package/dist/infrastructure/adapters/node-release-adapter.js +202 -0
- package/dist/infrastructure/config/loadDotEnv.js +38 -0
- package/dist/infrastructure/config/nodeRegistryEnv.js +41 -0
- package/dist/infrastructure/config/quarkConfigProvider.js +50 -0
- package/dist/infrastructure/git/gitService.js +179 -0
- package/dist/infrastructure/graph/nxGraphProvide.js +84 -0
- package/dist/infrastructure/logging/consoleLogger.js +25 -0
- package/dist/infrastructure/process/nodeProcessRunner.js +14 -0
- package/dist/infrastructure/release/git-release-map-store.js +64 -0
- package/dist/ports/config.js +2 -0
- package/dist/ports/git.js +2 -0
- package/dist/ports/graph.js +2 -0
- package/dist/ports/logger.js +2 -0
- package/dist/ports/map.js +2 -0
- package/dist/ports/platform-dev-publish-adapter.js +2 -0
- package/dist/ports/platform-prod-publish-adapter.js +2 -0
- package/dist/ports/platform-release-adapter.js +2 -0
- package/dist/ports/processRunner.js +2 -0
- package/dist/ports/prompts.js +2 -0
- package/dist/ports/release-map-store.js +2 -0
- package/dist/scripts/dev.d.ts +20 -0
- package/dist/scripts/dev.js +204 -0
- package/dist/scripts/dev.js.map +1 -0
- package/dist/scripts/map.json +1616 -0
- package/dist/scripts/prod.d.ts +1 -0
- package/dist/scripts/prod.js +143 -0
- package/dist/scripts/prod.js.map +1 -0
- package/dist/scripts/release.d.ts +51 -0
- package/dist/scripts/release.js +833 -0
- package/dist/scripts/release.js.map +1 -0
- package/dist/tests/index.test.js +13 -0
- package/dist/tests/mocks/release.js +8 -0
- package/dist/tests/unit/release/index.test.js +32 -0
- package/dist/utils/checkIfFreeze.js +1 -0
- package/dist/utils/commit.js +39 -0
- package/dist/utils/drawRepoStatus.js +66 -0
- package/dist/utils/file.js +14 -0
- package/dist/utils/metrics.js +22 -0
- package/package.json +64 -0
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NodeGitService = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const util_1 = require("util");
|
|
6
|
+
const quark_security_1 = require("@quark-hq/quark-security");
|
|
7
|
+
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
8
|
+
const GIT_OPTIONS = {
|
|
9
|
+
encoding: "utf8",
|
|
10
|
+
maxBuffer: 50 * 1024 * 1024,
|
|
11
|
+
};
|
|
12
|
+
async function gitExec(args) {
|
|
13
|
+
const { stdout } = await execFileAsync("git", args, GIT_OPTIONS);
|
|
14
|
+
return stdout.trim();
|
|
15
|
+
}
|
|
16
|
+
class NodeGitService {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.hasCommits = null;
|
|
19
|
+
}
|
|
20
|
+
/* ---------------------------------- */
|
|
21
|
+
/* Repository Info */
|
|
22
|
+
/* ---------------------------------- */
|
|
23
|
+
async getRepositoryRoot() {
|
|
24
|
+
return gitExec(["rev-parse", "--show-toplevel"]);
|
|
25
|
+
}
|
|
26
|
+
async getCurrentBranch() {
|
|
27
|
+
if (!(await this.repoHasCommits())) {
|
|
28
|
+
return gitExec(["symbolic-ref", "--short", "HEAD"]);
|
|
29
|
+
}
|
|
30
|
+
return gitExec(["rev-parse", "--abbrev-ref", "HEAD"]);
|
|
31
|
+
}
|
|
32
|
+
/* ---------------------------------- */
|
|
33
|
+
/* Remote Operations */
|
|
34
|
+
/* ---------------------------------- */
|
|
35
|
+
async fetch(branch) {
|
|
36
|
+
(0, quark_security_1.assertSafeGitBranch)(branch, "branch");
|
|
37
|
+
try {
|
|
38
|
+
await execFileAsync("git", ["fetch", "origin", branch], GIT_OPTIONS);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// ignore if remote/branch missing
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async commitsBehind(branch) {
|
|
45
|
+
(0, quark_security_1.assertSafeGitBranch)(branch, "branch");
|
|
46
|
+
if (!(await this.repoHasCommits()))
|
|
47
|
+
return 0;
|
|
48
|
+
try {
|
|
49
|
+
const stdout = await gitExec([
|
|
50
|
+
"rev-list",
|
|
51
|
+
"--count",
|
|
52
|
+
`HEAD..origin/${branch}`,
|
|
53
|
+
]);
|
|
54
|
+
return parseInt(stdout.trim(), 10) || 0;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return 0;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/* ---------------------------------- */
|
|
61
|
+
/* Change Detection */
|
|
62
|
+
/* ---------------------------------- */
|
|
63
|
+
async getChangedFiles(baseBranch) {
|
|
64
|
+
(0, quark_security_1.assertSafeGitBranch)(baseBranch, "baseBranch");
|
|
65
|
+
if (!(await this.repoHasCommits())) {
|
|
66
|
+
return this.listAllTrackedAndUntracked();
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const [trackedResult, untrackedResult] = await Promise.allSettled([
|
|
70
|
+
execFileAsync("git", ["diff", "--name-only", `origin/${baseBranch}`], GIT_OPTIONS),
|
|
71
|
+
execFileAsync("git", ["ls-files", "--others", "--exclude-standard"], GIT_OPTIONS),
|
|
72
|
+
]);
|
|
73
|
+
// If base branch doesn't exist, fall back to listing ALL tracked files
|
|
74
|
+
let trackedFiles = [];
|
|
75
|
+
if (trackedResult.status === "fulfilled") {
|
|
76
|
+
trackedFiles = trackedResult.value.stdout
|
|
77
|
+
.split("\n")
|
|
78
|
+
.map(f => f.trim())
|
|
79
|
+
.filter(Boolean);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// origin/baseBranch doesn't exist โ treat every tracked file as changed
|
|
83
|
+
const allTrackedResult = await execFileAsync("git", ["ls-files"], GIT_OPTIONS).catch(() => ({ stdout: "" }));
|
|
84
|
+
trackedFiles = allTrackedResult.stdout
|
|
85
|
+
.split("\n")
|
|
86
|
+
.map(f => f.trim())
|
|
87
|
+
.filter(Boolean);
|
|
88
|
+
}
|
|
89
|
+
const untrackedFiles = untrackedResult.status === "fulfilled"
|
|
90
|
+
? untrackedResult.value.stdout
|
|
91
|
+
.split("\n")
|
|
92
|
+
.map(f => f.trim())
|
|
93
|
+
.filter(Boolean)
|
|
94
|
+
: [];
|
|
95
|
+
return [...new Set([...trackedFiles, ...untrackedFiles])];
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/* ---------------------------------- */
|
|
102
|
+
/* Helpers */
|
|
103
|
+
/* ---------------------------------- */
|
|
104
|
+
async repoHasCommits() {
|
|
105
|
+
if (this.hasCommits !== null) {
|
|
106
|
+
return this.hasCommits;
|
|
107
|
+
}
|
|
108
|
+
try {
|
|
109
|
+
await execFileAsync("git", ["rev-parse", "HEAD"], GIT_OPTIONS);
|
|
110
|
+
this.hasCommits = true;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
this.hasCommits = false;
|
|
114
|
+
}
|
|
115
|
+
return this.hasCommits;
|
|
116
|
+
}
|
|
117
|
+
async listAllTrackedAndUntracked() {
|
|
118
|
+
try {
|
|
119
|
+
const stdout = await gitExec([
|
|
120
|
+
"ls-files",
|
|
121
|
+
"--others",
|
|
122
|
+
"--exclude-standard",
|
|
123
|
+
]);
|
|
124
|
+
return stdout
|
|
125
|
+
.split("\n")
|
|
126
|
+
.map(f => f.trim())
|
|
127
|
+
.filter(Boolean);
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/* ---------------------------------- */
|
|
134
|
+
/* File Reading */
|
|
135
|
+
/* ---------------------------------- */
|
|
136
|
+
async readFile(path, branch) {
|
|
137
|
+
(0, quark_security_1.assertSafeGitBranch)(branch, "branch");
|
|
138
|
+
(0, quark_security_1.assertSafeRepoRelativePathForGitShow)(path, "path");
|
|
139
|
+
const spec = `origin/${branch}:${path}`;
|
|
140
|
+
return gitExec(["show", spec]);
|
|
141
|
+
}
|
|
142
|
+
async readFileFromRef(filePath, ref) {
|
|
143
|
+
(0, quark_security_1.assertSafeGitRef)(ref, "ref");
|
|
144
|
+
(0, quark_security_1.assertSafeRepoRelativePathForGitShow)(filePath, "filePath");
|
|
145
|
+
const spec = `${ref}:${filePath}`;
|
|
146
|
+
return gitExec(["show", spec]);
|
|
147
|
+
}
|
|
148
|
+
/* ---------------------------------- */
|
|
149
|
+
/* Tag Operations */
|
|
150
|
+
/* ---------------------------------- */
|
|
151
|
+
async getTags(targetTag) {
|
|
152
|
+
const stdout = await gitExec(["tag", "--sort=-creatordate"]);
|
|
153
|
+
const tags = stdout.trim().split("\n").filter(Boolean);
|
|
154
|
+
if (tags.length === 0) {
|
|
155
|
+
throw new Error("No git tags found.");
|
|
156
|
+
}
|
|
157
|
+
if (targetTag) {
|
|
158
|
+
(0, quark_security_1.assertSafeGitRef)(targetTag, "targetTag");
|
|
159
|
+
const targetIndex = tags.indexOf(targetTag);
|
|
160
|
+
if (targetIndex === -1) {
|
|
161
|
+
throw new Error(`Tag "${targetTag}" not found.`);
|
|
162
|
+
}
|
|
163
|
+
const previousTag = tags[targetIndex + 1];
|
|
164
|
+
if (!previousTag) {
|
|
165
|
+
return [null, targetTag];
|
|
166
|
+
}
|
|
167
|
+
(0, quark_security_1.assertSafeGitRef)(previousTag, "previousTag");
|
|
168
|
+
return [previousTag, targetTag];
|
|
169
|
+
}
|
|
170
|
+
if (tags.length === 1) {
|
|
171
|
+
(0, quark_security_1.assertSafeGitRef)(tags[0], "latestTag");
|
|
172
|
+
return [null, tags[0]];
|
|
173
|
+
}
|
|
174
|
+
(0, quark_security_1.assertSafeGitRef)(tags[1], "previousTag");
|
|
175
|
+
(0, quark_security_1.assertSafeGitRef)(tags[0], "latestTag");
|
|
176
|
+
return [tags[1], tags[0]];
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
exports.NodeGitService = NodeGitService;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NxGraphProvider = void 0;
|
|
4
|
+
const path_1 = require("path");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const os_1 = require("os");
|
|
7
|
+
const quark_security_1 = require("@quark-hq/quark-security");
|
|
8
|
+
class NxGraphProvider {
|
|
9
|
+
constructor(workspaceRoot = process.cwd()) {
|
|
10
|
+
this.workspaceRoot = workspaceRoot;
|
|
11
|
+
this.graph = {};
|
|
12
|
+
}
|
|
13
|
+
async build() {
|
|
14
|
+
const raw = this.runNxGraph();
|
|
15
|
+
const nx = JSON.parse(raw);
|
|
16
|
+
this.graph = nx.graph;
|
|
17
|
+
const adjacency = {};
|
|
18
|
+
const metadata = {};
|
|
19
|
+
for (const [source, deps] of Object.entries(nx.graph.dependencies)) {
|
|
20
|
+
adjacency[source] = deps.map(d => d.target);
|
|
21
|
+
}
|
|
22
|
+
for (const [name, node] of Object.entries(nx.graph.nodes)) {
|
|
23
|
+
// bearer:disable javascript_lang_path_traversal
|
|
24
|
+
const rootDir = (0, quark_security_1.resolveUnderWorkspaceRoot)(this.workspaceRoot, node.data.root);
|
|
25
|
+
const platform = node.data.packageMetadata?.platform ??
|
|
26
|
+
this.inferPlatformFromTags(node.data.tags) ??
|
|
27
|
+
"unknown";
|
|
28
|
+
metadata[name] = { rootDir, platform };
|
|
29
|
+
}
|
|
30
|
+
return { adjacency, metadata };
|
|
31
|
+
}
|
|
32
|
+
runNxGraph() {
|
|
33
|
+
const tmpFile = (0, path_1.join)((0, os_1.tmpdir)(), `nx-graph-${Date.now()}.json`);
|
|
34
|
+
try {
|
|
35
|
+
const r = (0, quark_security_1.spawnSyncSafe)("npx", ["--yes", "nx", "graph", "--file", tmpFile], {
|
|
36
|
+
cwd: this.workspaceRoot || process.cwd(),
|
|
37
|
+
stdio: "pipe",
|
|
38
|
+
maxBuffer: 50 * 1024 * 1024,
|
|
39
|
+
});
|
|
40
|
+
(0, quark_security_1.assertSpawnOk)(r, "npx nx graph");
|
|
41
|
+
return (0, fs_1.readFileSync)(tmpFile, "utf-8");
|
|
42
|
+
}
|
|
43
|
+
finally {
|
|
44
|
+
try {
|
|
45
|
+
(0, fs_1.unlinkSync)(tmpFile);
|
|
46
|
+
}
|
|
47
|
+
catch { /* already cleaned up */ }
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
inferPlatformFromTags(tags) {
|
|
51
|
+
if (!tags)
|
|
52
|
+
return null;
|
|
53
|
+
if (tags.some(t => t.includes("npm")))
|
|
54
|
+
return "node";
|
|
55
|
+
if (tags.some(t => t.includes("maven")))
|
|
56
|
+
return "maven";
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
async getInvertedAdjacencyList(adjacency) {
|
|
60
|
+
const inverted = {};
|
|
61
|
+
// Initialize all keys
|
|
62
|
+
for (const node of Object.keys(adjacency)) {
|
|
63
|
+
inverted[node] = [];
|
|
64
|
+
}
|
|
65
|
+
// Reverse edges
|
|
66
|
+
for (const [node, deps] of Object.entries(adjacency)) {
|
|
67
|
+
for (const dep of deps) {
|
|
68
|
+
if (!inverted[dep]) {
|
|
69
|
+
inverted[dep] = [];
|
|
70
|
+
}
|
|
71
|
+
inverted[dep].push(node);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return inverted;
|
|
75
|
+
}
|
|
76
|
+
async getPackageJson(pkg) {
|
|
77
|
+
const node = this.graph.nodes[pkg];
|
|
78
|
+
if (!node) {
|
|
79
|
+
throw new Error(`Package "${pkg}" not found in graph`);
|
|
80
|
+
}
|
|
81
|
+
return node.data.root;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.NxGraphProvider = NxGraphProvider;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ConsoleLogger = void 0;
|
|
7
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
+
class ConsoleLogger {
|
|
9
|
+
info(message) {
|
|
10
|
+
console.log(chalk_1.default.cyan(message));
|
|
11
|
+
}
|
|
12
|
+
success(message) {
|
|
13
|
+
console.log(chalk_1.default.green(message));
|
|
14
|
+
}
|
|
15
|
+
warn(message) {
|
|
16
|
+
console.log(chalk_1.default.yellow(message));
|
|
17
|
+
}
|
|
18
|
+
error(message) {
|
|
19
|
+
console.error(chalk_1.default.red(message));
|
|
20
|
+
}
|
|
21
|
+
debug(message) {
|
|
22
|
+
console.log(chalk_1.default.gray(message));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.ConsoleLogger = ConsoleLogger;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NodeProcessRunner = void 0;
|
|
4
|
+
const quark_security_1 = require("@quark-hq/quark-security");
|
|
5
|
+
class NodeProcessRunner {
|
|
6
|
+
run(file, args, options) {
|
|
7
|
+
const result = (0, quark_security_1.spawnSyncSafe)(file, [...args], {
|
|
8
|
+
cwd: options?.cwd,
|
|
9
|
+
stdio: "inherit",
|
|
10
|
+
});
|
|
11
|
+
(0, quark_security_1.assertSpawnOk)(result, `${file} ${args.join(" ")}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
exports.NodeProcessRunner = NodeProcessRunner;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GitReleaseMapStore = void 0;
|
|
7
|
+
exports.mergeReleaseMaps = mergeReleaseMaps;
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
10
|
+
const quark_security_1 = require("@quark-hq/quark-security");
|
|
11
|
+
/** Shallow-merge per package: local fields override main (same key set as unfreeze + release). */
|
|
12
|
+
function mergeReleaseMaps(main, local) {
|
|
13
|
+
const keys = new Set([
|
|
14
|
+
...Object.keys(main),
|
|
15
|
+
...Object.keys(local),
|
|
16
|
+
]);
|
|
17
|
+
const merged = {};
|
|
18
|
+
for (const pkg of keys) {
|
|
19
|
+
merged[pkg] = {
|
|
20
|
+
...(main[pkg] ?? {}),
|
|
21
|
+
...(local[pkg] ?? {}),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
return merged;
|
|
25
|
+
}
|
|
26
|
+
class GitReleaseMapStore {
|
|
27
|
+
constructor(git) {
|
|
28
|
+
this.git = git;
|
|
29
|
+
}
|
|
30
|
+
async read(masterBranch) {
|
|
31
|
+
try {
|
|
32
|
+
const raw = await this.git.readFile(".release/map.json", masterBranch);
|
|
33
|
+
return JSON.parse(raw);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return {};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async readLocal() {
|
|
40
|
+
try {
|
|
41
|
+
const cwd = process.cwd();
|
|
42
|
+
const mapPath = (0, quark_security_1.assertPathInsideRoot)(cwd, path_1.default.resolve(cwd, ".release", "map.json"));
|
|
43
|
+
const raw = await promises_1.default.readFile(mapPath, "utf8");
|
|
44
|
+
return JSON.parse(raw);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return {};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async readMergedWithLocal(masterBranch) {
|
|
51
|
+
const [main, local] = await Promise.all([
|
|
52
|
+
this.read(masterBranch),
|
|
53
|
+
this.readLocal(),
|
|
54
|
+
]);
|
|
55
|
+
return mergeReleaseMaps(main, local);
|
|
56
|
+
}
|
|
57
|
+
async write(map) {
|
|
58
|
+
const cwd = process.cwd();
|
|
59
|
+
const releaseDir = (0, quark_security_1.assertPathInsideRoot)(cwd, path_1.default.resolve(cwd, ".release"));
|
|
60
|
+
await promises_1.default.mkdir(releaseDir, { recursive: true });
|
|
61
|
+
await promises_1.default.writeFile(path_1.default.join(releaseDir, "map.json"), JSON.stringify(map, null, 2), "utf8");
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.GitReleaseMapStore = GitReleaseMapStore;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
declare class DevRelease {
|
|
2
|
+
constructor();
|
|
3
|
+
/**
|
|
4
|
+
* Check if a package has changed compared to origin/main
|
|
5
|
+
*/
|
|
6
|
+
private hasPackageChanged;
|
|
7
|
+
/**
|
|
8
|
+
* Check if a specific package has changed
|
|
9
|
+
*/
|
|
10
|
+
private checkPackageChanged;
|
|
11
|
+
/**
|
|
12
|
+
* Validate required environment variables
|
|
13
|
+
*/
|
|
14
|
+
private validateEnvironment;
|
|
15
|
+
/**
|
|
16
|
+
* Main execution method
|
|
17
|
+
*/
|
|
18
|
+
run(): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export default DevRelease;
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
const child_process_1 = require("child_process");
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const prompts_1 = __importDefault(require("prompts"));
|
|
43
|
+
const semver = __importStar(require("semver"));
|
|
44
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
45
|
+
dotenv_1.default.config();
|
|
46
|
+
class DevRelease {
|
|
47
|
+
constructor() { }
|
|
48
|
+
/**
|
|
49
|
+
* Check if a package has changed compared to origin/main
|
|
50
|
+
*/
|
|
51
|
+
async hasPackageChanged(packageRootPath) {
|
|
52
|
+
try {
|
|
53
|
+
const repoRoot = (0, child_process_1.execSync)('git rev-parse --show-toplevel', {
|
|
54
|
+
encoding: 'utf-8'
|
|
55
|
+
}).trim();
|
|
56
|
+
const relPath = path.relative(repoRoot, packageRootPath);
|
|
57
|
+
// Check for tracked changes compared to origin/main
|
|
58
|
+
const diff = (0, child_process_1.execSync)(`git diff --name-only origin/main -- ${relPath}`, {
|
|
59
|
+
encoding: 'utf-8',
|
|
60
|
+
}).trim();
|
|
61
|
+
// Check for untracked files inside package folder
|
|
62
|
+
const untracked = (0, child_process_1.execSync)(`git ls-files --others --exclude-standard ${relPath}`, {
|
|
63
|
+
encoding: 'utf-8',
|
|
64
|
+
}).trim();
|
|
65
|
+
return diff.length > 0 || untracked.length > 0;
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
69
|
+
console.error(`โ Failed to check diff for ${packageRootPath}:`, errorMessage);
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Check if a specific package has changed
|
|
75
|
+
*/
|
|
76
|
+
async checkPackageChanged(packageName) {
|
|
77
|
+
const depProjectInfo = (0, child_process_1.execSync)(`npx nx show project ${packageName}`, {
|
|
78
|
+
encoding: "utf-8"
|
|
79
|
+
}).trim();
|
|
80
|
+
const parsed = JSON.parse(depProjectInfo);
|
|
81
|
+
const repoRoot = (0, child_process_1.execSync)('git rev-parse --show-toplevel', {
|
|
82
|
+
encoding: 'utf-8'
|
|
83
|
+
}).trim();
|
|
84
|
+
const absRoot = path.resolve(repoRoot, parsed.root);
|
|
85
|
+
const hasChanged = await this.hasPackageChanged(absRoot);
|
|
86
|
+
return hasChanged;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Validate required environment variables
|
|
90
|
+
*/
|
|
91
|
+
validateEnvironment() {
|
|
92
|
+
const env = process.env;
|
|
93
|
+
const required = ['SCOPE', 'DEV_REGISTRY_URL', 'DEV_AUTH_TOKEN', 'DEV_NPM_ALWAYS_AUTH'];
|
|
94
|
+
const missing = required.filter(key => !env[key]);
|
|
95
|
+
if (missing.length > 0) {
|
|
96
|
+
throw new Error(`Missing required environment variables: ${missing.join(', ')}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Main execution method
|
|
101
|
+
*/
|
|
102
|
+
async run() {
|
|
103
|
+
try {
|
|
104
|
+
// Validate environment variables
|
|
105
|
+
this.validateEnvironment();
|
|
106
|
+
const res = await (0, prompts_1.default)({
|
|
107
|
+
type: "text",
|
|
108
|
+
name: "packageName",
|
|
109
|
+
message: "Enter the package name you want to release as alpha version:",
|
|
110
|
+
});
|
|
111
|
+
if (!res.packageName) {
|
|
112
|
+
console.log("No package name provided, exiting.");
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const hasChanged = await this.checkPackageChanged(res.packageName);
|
|
116
|
+
if (!hasChanged) {
|
|
117
|
+
console.log(`The package ${res.packageName} has not changed since the last release.`);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
console.log(`The package ${res.packageName} has changed since the last release.`);
|
|
121
|
+
const depProjectInfo = (0, child_process_1.execSync)(`npx nx show project ${res.packageName}`, {
|
|
122
|
+
encoding: "utf-8"
|
|
123
|
+
}).trim();
|
|
124
|
+
const parsed = JSON.parse(depProjectInfo);
|
|
125
|
+
const repoRoot = (0, child_process_1.execSync)('git rev-parse --show-toplevel', {
|
|
126
|
+
encoding: 'utf-8'
|
|
127
|
+
}).trim();
|
|
128
|
+
const packageDir = path.resolve(repoRoot, parsed.root);
|
|
129
|
+
const packageJsonPath = path.join(packageDir, "package.json");
|
|
130
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
|
|
131
|
+
const parsedVersion = semver.parse(packageJson.version);
|
|
132
|
+
if (!parsedVersion) {
|
|
133
|
+
console.error("Invalid semver version in package.json:", packageJson.version);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const baseVersion = `${parsedVersion.major}.${parsedVersion.minor}.${parsedVersion.patch}`;
|
|
137
|
+
const timestamp = Date.now();
|
|
138
|
+
const newVersion = `${baseVersion}-alpha.${timestamp}`;
|
|
139
|
+
packageJson.version = newVersion;
|
|
140
|
+
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
|
141
|
+
console.log(`๐ Updated version to ${newVersion}`);
|
|
142
|
+
// ๐ฆ Replace project root .npmrc
|
|
143
|
+
const rootNpmrcPath = path.join(repoRoot, '.npmrc');
|
|
144
|
+
let originalNpmrc = null;
|
|
145
|
+
if (fs.existsSync(rootNpmrcPath)) {
|
|
146
|
+
originalNpmrc = fs.readFileSync(rootNpmrcPath, 'utf-8');
|
|
147
|
+
console.log(originalNpmrc);
|
|
148
|
+
}
|
|
149
|
+
const env = process.env;
|
|
150
|
+
const registryUrlWithoutProtocol = env.DEV_REGISTRY_URL.split('//')[1];
|
|
151
|
+
const devNpmrcContent = [
|
|
152
|
+
`${env.SCOPE}:registry=${env.DEV_REGISTRY_URL}`,
|
|
153
|
+
`//${registryUrlWithoutProtocol}:_auth=${env.DEV_AUTH_TOKEN}`,
|
|
154
|
+
`//${registryUrlWithoutProtocol}:always-auth=${env.DEV_NPM_ALWAYS_AUTH}`,
|
|
155
|
+
].join('\n') + '\n';
|
|
156
|
+
try {
|
|
157
|
+
fs.writeFileSync(rootNpmrcPath, devNpmrcContent, 'utf-8');
|
|
158
|
+
console.log('๐ Overwrote project .npmrc with dev registry', rootNpmrcPath, devNpmrcContent);
|
|
159
|
+
console.log(`๐ง Building package: ${res.packageName}`);
|
|
160
|
+
(0, child_process_1.execSync)(`pnpm run build`, {
|
|
161
|
+
cwd: packageDir,
|
|
162
|
+
stdio: 'inherit',
|
|
163
|
+
});
|
|
164
|
+
(0, child_process_1.execSync)(`pnpm publish ${packageDir} --no-git-check --access public --registry ${env.DEV_REGISTRY_URL}`, {
|
|
165
|
+
stdio: "inherit",
|
|
166
|
+
});
|
|
167
|
+
console.log(`๐ Published ${res.packageName}@${newVersion} to dev registry.`);
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
171
|
+
console.error(`โ Failed to publish ${res.packageName}:`, errorMessage);
|
|
172
|
+
throw err; // Re-throw to ensure cleanup happens
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
// Restore original .npmrc
|
|
176
|
+
if (originalNpmrc !== null) {
|
|
177
|
+
fs.writeFileSync(rootNpmrcPath, originalNpmrc, 'utf-8');
|
|
178
|
+
console.log('๐ Restored original project .npmrc');
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
if (fs.existsSync(rootNpmrcPath)) {
|
|
182
|
+
fs.unlinkSync(rootNpmrcPath);
|
|
183
|
+
console.log('๐งน Removed temporary project .npmrc');
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
190
|
+
console.error('โ DevRelease failed:', errorMessage);
|
|
191
|
+
if (process.env.DEBUG && error instanceof Error) {
|
|
192
|
+
console.error(error.stack);
|
|
193
|
+
}
|
|
194
|
+
process.exit(1);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Execute if run directly
|
|
199
|
+
if (require.main === module) {
|
|
200
|
+
const devRelease = new DevRelease();
|
|
201
|
+
console.log('Environment variables:', process.env);
|
|
202
|
+
devRelease.run();
|
|
203
|
+
}
|
|
204
|
+
exports.default = DevRelease;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/scripts/dev.ts"],"names":[],"mappings":"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"}
|