@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.
Files changed (86) hide show
  1. package/LICENSE +21 -0
  2. package/dist/app/base-application.js +67 -0
  3. package/dist/app/buildApplication.js +20 -0
  4. package/dist/app/copyStaticApplication.js +34 -0
  5. package/dist/app/devApplication.js +59 -0
  6. package/dist/app/prod-publish-application.js +124 -0
  7. package/dist/app/publish-dev-application.js +104 -0
  8. package/dist/app/publishDevApplication.js +16 -0
  9. package/dist/app/release-application.js +85 -0
  10. package/dist/app/releaseApplication.js +154 -0
  11. package/dist/app/unfreeze-application.js +75 -0
  12. package/dist/app/watchStaticApplication.js +34 -0
  13. package/dist/cli/cli-containers.js +70 -0
  14. package/dist/cli/cliCommand.js +2 -0
  15. package/dist/cli/cliContainers.js +62 -0
  16. package/dist/cli/commands/buildCommands.js +17 -0
  17. package/dist/cli/commands/copyStaticCommands.js +17 -0
  18. package/dist/cli/commands/devCommands.js +17 -0
  19. package/dist/cli/commands/prod-publish-commands.js +18 -0
  20. package/dist/cli/commands/publish-dev-commands.js +17 -0
  21. package/dist/cli/commands/publishDevCommands.js +17 -0
  22. package/dist/cli/commands/release-commands.js +17 -0
  23. package/dist/cli/commands/releaseCommands.js +17 -0
  24. package/dist/cli/commands/relesaeCommand.js +15 -0
  25. package/dist/cli/commands/unfreeze-commands.js +17 -0
  26. package/dist/cli/commands/watchStaticCommands.js +17 -0
  27. package/dist/cli/program.js +16 -0
  28. package/dist/commands/index.d.ts +8 -0
  29. package/dist/commands/index.js +132 -0
  30. package/dist/commands/index.js.map +1 -0
  31. package/dist/domain/graph.js +2 -0
  32. package/dist/domain/new-package-freeze-from-map.js +21 -0
  33. package/dist/domain/resolve-workspace-dependency-specifier-for-freeze-map.js +33 -0
  34. package/dist/domain/reverse-dependents.js +45 -0
  35. package/dist/domain/topological-sorting.js +43 -0
  36. package/dist/domain/transitive-dependents.js +25 -0
  37. package/dist/domain/workspace-transitive-dependencies.js +25 -0
  38. package/dist/errors/unfreeze-blocked-error.js +44 -0
  39. package/dist/index.d.ts +2 -0
  40. package/dist/index.js +32 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/infrastructure/adapters/base-release-adapter.js +281 -0
  43. package/dist/infrastructure/adapters/maven-prod-publish-adapter.js +48 -0
  44. package/dist/infrastructure/adapters/maven-release-adapter.js +58 -0
  45. package/dist/infrastructure/adapters/node-prod-publish-adapter.js +111 -0
  46. package/dist/infrastructure/adapters/node-release-adapter/node-file-update.js +1 -0
  47. package/dist/infrastructure/adapters/node-release-adapter/node-release-adapter.js +289 -0
  48. package/dist/infrastructure/adapters/node-release-adapter.js +202 -0
  49. package/dist/infrastructure/config/loadDotEnv.js +38 -0
  50. package/dist/infrastructure/config/nodeRegistryEnv.js +41 -0
  51. package/dist/infrastructure/config/quarkConfigProvider.js +50 -0
  52. package/dist/infrastructure/git/gitService.js +179 -0
  53. package/dist/infrastructure/graph/nxGraphProvide.js +84 -0
  54. package/dist/infrastructure/logging/consoleLogger.js +25 -0
  55. package/dist/infrastructure/process/nodeProcessRunner.js +14 -0
  56. package/dist/infrastructure/release/git-release-map-store.js +64 -0
  57. package/dist/ports/config.js +2 -0
  58. package/dist/ports/git.js +2 -0
  59. package/dist/ports/graph.js +2 -0
  60. package/dist/ports/logger.js +2 -0
  61. package/dist/ports/map.js +2 -0
  62. package/dist/ports/platform-dev-publish-adapter.js +2 -0
  63. package/dist/ports/platform-prod-publish-adapter.js +2 -0
  64. package/dist/ports/platform-release-adapter.js +2 -0
  65. package/dist/ports/processRunner.js +2 -0
  66. package/dist/ports/prompts.js +2 -0
  67. package/dist/ports/release-map-store.js +2 -0
  68. package/dist/scripts/dev.d.ts +20 -0
  69. package/dist/scripts/dev.js +204 -0
  70. package/dist/scripts/dev.js.map +1 -0
  71. package/dist/scripts/map.json +1616 -0
  72. package/dist/scripts/prod.d.ts +1 -0
  73. package/dist/scripts/prod.js +143 -0
  74. package/dist/scripts/prod.js.map +1 -0
  75. package/dist/scripts/release.d.ts +51 -0
  76. package/dist/scripts/release.js +833 -0
  77. package/dist/scripts/release.js.map +1 -0
  78. package/dist/tests/index.test.js +13 -0
  79. package/dist/tests/mocks/release.js +8 -0
  80. package/dist/tests/unit/release/index.test.js +32 -0
  81. package/dist/utils/checkIfFreeze.js +1 -0
  82. package/dist/utils/commit.js +39 -0
  83. package/dist/utils/drawRepoStatus.js +66 -0
  84. package/dist/utils/file.js +14 -0
  85. package/dist/utils/metrics.js +22 -0
  86. package/package.json +64 -0
@@ -0,0 +1,154 @@
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.ReleaseApplication = void 0;
7
+ const path_1 = require("path");
8
+ const path_2 = __importDefault(require("path"));
9
+ const promises_1 = __importDefault(require("fs/promises"));
10
+ class ReleaseApplication {
11
+ constructor(logger, git, graphProvider, adapters, topoSorter, masterBranch = "main") {
12
+ this.logger = logger;
13
+ this.git = git;
14
+ this.graphProvider = graphProvider;
15
+ this.adapters = adapters;
16
+ this.topoSorter = topoSorter;
17
+ this.masterBranch = masterBranch;
18
+ this.userPrompts = {};
19
+ }
20
+ async execute() {
21
+ this.logger.info("🔍 Performing repository checks...");
22
+ const repoRoot = await this.ensureRepositoryHealthy();
23
+ this.logger.info("📊 Building dependency graph...");
24
+ const graph = await this.buildGraph();
25
+ this.logger.success("✅ Repository checks passed");
26
+ this.logger.info(`📦 Total packages: ${Object.keys(graph.adjacency).length}`);
27
+ const relativeFiles = await this.git.getChangedFiles(this.masterBranch);
28
+ const changedFiles = relativeFiles.map(f => (0, path_1.resolve)(repoRoot, f));
29
+ this.logger.info(`📝 Changed files: ${changedFiles.length}`);
30
+ const affected = this.resolveAffectedPackages(changedFiles, graph.adjacency, graph.metadata);
31
+ this.logger.info(`🎯 Affected packages: ${[...affected].join(", ")}`);
32
+ const sorted = this.topoSorter.sort(graph.adjacency, [...affected]);
33
+ this.logger.info(`🧭 Execution order: ${sorted.join(" → ")}`);
34
+ await this.executePlatformJobs([...affected], graph, sorted);
35
+ }
36
+ async ensureRepositoryHealthy() {
37
+ const repoRoot = await this.git.getRepositoryRoot();
38
+ this.logger.info(`📁 Repo root: ${repoRoot}`);
39
+ const currentBranch = await this.git.getCurrentBranch();
40
+ this.logger.info(`🌿 Current branch: ${currentBranch}`);
41
+ await this.git.fetch(this.masterBranch);
42
+ const behind = await this.git.commitsBehind(this.masterBranch);
43
+ if (behind > 0) {
44
+ throw new Error(`Branch is ${behind} commits behind origin/${this.masterBranch}`);
45
+ }
46
+ return repoRoot;
47
+ }
48
+ async buildGraph() {
49
+ const graph = await this.graphProvider.build();
50
+ if (!graph || Object.keys(graph.adjacency).length === 0) {
51
+ throw new Error("Dependency graph is empty");
52
+ }
53
+ return graph;
54
+ }
55
+ resolveAffectedPackages(changedFiles, adjacency, metadata) {
56
+ const directlyChanged = this.mapFilesToPackages(changedFiles, metadata);
57
+ return this.traverseReversed(directlyChanged, adjacency);
58
+ }
59
+ mapFilesToPackages(changedFiles, metadata) {
60
+ const changed = new Set();
61
+ for (const file of changedFiles) {
62
+ const owner = this.findOwningPackage(file, metadata);
63
+ if (owner !== null) {
64
+ changed.add(owner);
65
+ }
66
+ }
67
+ return changed;
68
+ }
69
+ findOwningPackage(file, metadata) {
70
+ let bestMatch = null;
71
+ for (const [name, { rootDir }] of Object.entries(metadata)) {
72
+ if (!file.startsWith(rootDir + "/"))
73
+ continue;
74
+ if (bestMatch === null || rootDir.length > bestMatch.rootDir.length) {
75
+ bestMatch = { name, rootDir };
76
+ }
77
+ }
78
+ return bestMatch?.name ?? null;
79
+ }
80
+ traverseReversed(seeds, adjacency) {
81
+ const reversed = {};
82
+ for (const [pkg, deps] of Object.entries(adjacency)) {
83
+ for (const dep of deps) {
84
+ (reversed[dep] ?? (reversed[dep] = [])).push(pkg);
85
+ }
86
+ }
87
+ const affected = new Set(seeds);
88
+ const queue = [...seeds];
89
+ while (queue.length > 0) {
90
+ const current = queue.shift();
91
+ for (const dependent of reversed[current] ?? []) {
92
+ if (!affected.has(dependent)) {
93
+ affected.add(dependent);
94
+ queue.push(dependent);
95
+ }
96
+ }
97
+ }
98
+ return affected;
99
+ }
100
+ async executePlatformJobs(affected, graph, sorted) {
101
+ const metadata = graph.metadata;
102
+ const grouped = new Map();
103
+ for (const pkg of affected) {
104
+ const meta = metadata[pkg];
105
+ if (!meta)
106
+ continue;
107
+ const adapter = this.adapters.find(a => a.supports(meta));
108
+ if (!adapter) {
109
+ this.logger.warn(`⚠️ No adapter found for ${pkg}`);
110
+ continue;
111
+ }
112
+ if (!grouped.has(adapter)) {
113
+ grouped.set(adapter, []);
114
+ }
115
+ grouped.get(adapter).push(pkg);
116
+ }
117
+ for (const [adapter, packages] of grouped.entries()) {
118
+ this.logger.info(`🚀 Executing adapter for ${packages.length} package(s)`);
119
+ let userPrompts = await adapter.execute(packages, graph, sorted, this.masterBranch);
120
+ this.userPrompts = { ...this.userPrompts, ...userPrompts };
121
+ }
122
+ let mapJson = "{}";
123
+ try {
124
+ mapJson = await this.git.readFile(".release/map.json", this.masterBranch);
125
+ }
126
+ catch (error) {
127
+ mapJson = "{}";
128
+ }
129
+ console.log(this.userPrompts);
130
+ const mapJsonObject = JSON.parse(mapJson);
131
+ for (const pkg of Object.keys(this.userPrompts)) {
132
+ const meta = metadata[pkg];
133
+ if (!meta)
134
+ continue;
135
+ const adapter = this.adapters.find(a => a.supports(meta));
136
+ if (!adapter) {
137
+ this.logger.warn(`⚠️ No adapter found for ${pkg}`);
138
+ continue;
139
+ }
140
+ console.log(pkg, "@@@@@@@@");
141
+ await adapter.writeUserPromptsToFiles(pkg, this.userPrompts[pkg], mapJsonObject);
142
+ }
143
+ const releaseDir = path_2.default.resolve(process.cwd(), '.release');
144
+ try {
145
+ await promises_1.default.mkdir(releaseDir, { recursive: true });
146
+ }
147
+ catch (e) {
148
+ // Directory already exists or another error occurred, proceed anyway
149
+ }
150
+ const updatedMapJson = JSON.stringify(mapJsonObject, null, 2);
151
+ await promises_1.default.writeFile(path_2.default.join(releaseDir, 'map.json'), updatedMapJson, 'utf8');
152
+ }
153
+ }
154
+ exports.ReleaseApplication = ReleaseApplication;
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UnfreezeApplication = void 0;
4
+ const workspace_transitive_dependencies_1 = require("../domain/workspace-transitive-dependencies");
5
+ const unfreeze_blocked_error_1 = require("../errors/unfreeze-blocked-error");
6
+ function resolveReleaseEntry(packageName, localMap, mainMap) {
7
+ if (Object.keys(localMap).length > 0) {
8
+ return localMap[packageName] ?? mainMap[packageName];
9
+ }
10
+ return mainMap[packageName];
11
+ }
12
+ /** Workspace deps of `packageName` that are still frozen in the release map. */
13
+ function frozenTransitiveDependencies(packageName, graph, localMap, mainMap) {
14
+ return (0, workspace_transitive_dependencies_1.collectTransitiveWorkspaceDependencies)(packageName, graph.adjacency).filter((dep) => resolveReleaseEntry(dep, localMap, mainMap)?.frozen === true);
15
+ }
16
+ /**
17
+ * Unfreezes a package by:
18
+ * 1. Restoring workspace dependency versions to workspace:* in package.json
19
+ * 2. Setting frozen: false in .release/map.json (preserves local manual edits)
20
+ *
21
+ * Proceeds when:
22
+ * - Main has the package frozen (normal unfreeze), OR
23
+ * - Local has the package frozen but main does not (sync to main — repairs stale local state)
24
+ *
25
+ * Refuses to unfreeze while any transitive workspace dependency is still frozen
26
+ * (e.g. A→B→C: unfreeze A only after B (and thus the chain) is unfrozen first).
27
+ */
28
+ class UnfreezeApplication {
29
+ constructor(graphProvider, releaseMapStore, nodeReleaseAdapter, logger, masterBranch) {
30
+ this.graphProvider = graphProvider;
31
+ this.releaseMapStore = releaseMapStore;
32
+ this.nodeReleaseAdapter = nodeReleaseAdapter;
33
+ this.logger = logger;
34
+ this.masterBranch = masterBranch;
35
+ }
36
+ async execute(packageName) {
37
+ this.logger.info(`Unfreezing package "${packageName}"...`);
38
+ const graph = await this.graphProvider.build();
39
+ if (!graph || Object.keys(graph.metadata).length === 0) {
40
+ throw new Error("Dependency graph is empty. Ensure you are in a valid monorepo.");
41
+ }
42
+ if (!(packageName in graph.metadata)) {
43
+ throw new Error(`Package "${packageName}" not found in workspace.`);
44
+ }
45
+ // 1. Read main and local maps
46
+ const mainMap = await this.releaseMapStore.read(this.masterBranch);
47
+ const localMap = await this.releaseMapStore.readLocal();
48
+ const baseMap = Object.keys(localMap).length > 0 ? { ...localMap } : { ...mainMap };
49
+ const entry = baseMap[packageName] ?? mainMap[packageName];
50
+ if (!entry) {
51
+ throw new Error(`Package "${packageName}" not found in release map.`);
52
+ }
53
+ // 2. Proceed if frozen on main OR locally (repairs stale local when main already unfrozen)
54
+ const frozenOnMain = mainMap[packageName]?.frozen === true;
55
+ const frozenLocally = entry.frozen === true;
56
+ if (!frozenOnMain && !frozenLocally) {
57
+ throw new Error(`Package "${packageName}" is not frozen. Nothing to unfreeze.`);
58
+ }
59
+ const blockingDeps = frozenTransitiveDependencies(packageName, graph, localMap, mainMap);
60
+ if (blockingDeps.length > 0) {
61
+ throw new unfreeze_blocked_error_1.UnfreezeBlockedByFrozenDependenciesError(packageName, blockingDeps);
62
+ }
63
+ const meta = graph.metadata[packageName];
64
+ if (meta.platform === "maven") {
65
+ throw new Error("Unfreeze for Maven packages is not implemented yet.");
66
+ }
67
+ const workspacePackageNames = new Set(Object.keys(graph.metadata));
68
+ await this.nodeReleaseAdapter.restoreWorkspaceVersions(packageName, workspacePackageNames);
69
+ const { pinnedDependencies: _pinned, ...entryWithoutPins } = entry;
70
+ baseMap[packageName] = { ...entryWithoutPins, frozen: false };
71
+ await this.releaseMapStore.write(baseMap);
72
+ this.logger.success(`Unfroze package "${packageName}". Dependency versions restored to workspace:*.`);
73
+ }
74
+ }
75
+ exports.UnfreezeApplication = UnfreezeApplication;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WatchStaticApplication = void 0;
4
+ const IGNORE_PATTERNS = [
5
+ "dist/**",
6
+ "node_modules/**",
7
+ "**/*.ts",
8
+ "**/*.tsx",
9
+ "**/*.js",
10
+ "**/*.jsx",
11
+ "**/*.tsbuildinfo",
12
+ "**/tsconfig.json",
13
+ "**/.npmrc",
14
+ "**/package-lock.json",
15
+ ];
16
+ class WatchStaticApplication {
17
+ constructor(logger, processRunner) {
18
+ this.logger = logger;
19
+ this.processRunner = processRunner;
20
+ }
21
+ async execute() {
22
+ this.logger.info("👀 Watching static assets...");
23
+ const chokidarArgs = [
24
+ "--yes",
25
+ "chokidar",
26
+ "**/*",
27
+ ...IGNORE_PATTERNS.flatMap((p) => ["-i", p]),
28
+ "-c",
29
+ "quark-scripts copy-static",
30
+ ];
31
+ this.processRunner.run("npx", chokidarArgs);
32
+ }
33
+ }
34
+ exports.WatchStaticApplication = WatchStaticApplication;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CliContainer = void 0;
4
+ const publish_dev_commands_1 = require("./commands/publish-dev-commands");
5
+ const release_commands_1 = require("./commands/release-commands");
6
+ const prod_publish_commands_1 = require("./commands/prod-publish-commands");
7
+ const unfreeze_commands_1 = require("./commands/unfreeze-commands");
8
+ const publish_dev_application_1 = require("../app/publish-dev-application");
9
+ const release_application_1 = require("../app/release-application");
10
+ const prod_publish_application_1 = require("../app/prod-publish-application");
11
+ const unfreeze_application_1 = require("../app/unfreeze-application");
12
+ const consoleLogger_1 = require("../infrastructure/logging/consoleLogger");
13
+ const nodeProcessRunner_1 = require("../infrastructure/process/nodeProcessRunner");
14
+ const gitService_1 = require("../infrastructure/git/gitService");
15
+ const nxGraphProvide_1 = require("../infrastructure/graph/nxGraphProvide");
16
+ const node_release_adapter_1 = require("../infrastructure/adapters/node-release-adapter");
17
+ const maven_release_adapter_1 = require("../infrastructure/adapters/maven-release-adapter");
18
+ const node_prod_publish_adapter_1 = require("../infrastructure/adapters/node-prod-publish-adapter");
19
+ const maven_prod_publish_adapter_1 = require("../infrastructure/adapters/maven-prod-publish-adapter");
20
+ const topological_sorting_1 = require("../domain/topological-sorting");
21
+ const quarkConfigProvider_1 = require("../infrastructure/config/quarkConfigProvider");
22
+ const git_release_map_store_1 = require("../infrastructure/release/git-release-map-store");
23
+ class CliContainer {
24
+ static create() {
25
+ const logger = new consoleLogger_1.ConsoleLogger();
26
+ const processRunner = new nodeProcessRunner_1.NodeProcessRunner();
27
+ const gitService = new gitService_1.NodeGitService();
28
+ const graphProvider = new nxGraphProvide_1.NxGraphProvider();
29
+ const configProvider = new quarkConfigProvider_1.QuarkConfigProvider();
30
+ const config = configProvider.getConfig();
31
+ const { masterBranch } = config.release;
32
+ // ── Platform adapters (shared across release + dev-publish) ────
33
+ const nodeReleaseAdapter = new node_release_adapter_1.NodeReleaseAdapter(graphProvider, config, logger);
34
+ const releaseAdapters = [
35
+ nodeReleaseAdapter,
36
+ new maven_release_adapter_1.MavenReleaseAdapter(graphProvider, config, logger),
37
+ ];
38
+ // ── Unfreeze ───────────────────────────────────────────────────
39
+ const releaseMapStore = new git_release_map_store_1.GitReleaseMapStore(gitService);
40
+ const unfreezeApp = new unfreeze_application_1.UnfreezeApplication(graphProvider, releaseMapStore, nodeReleaseAdapter, logger, masterBranch);
41
+ // ── Release ────────────────────────────────────────────────────
42
+ const topoSorter = new topological_sorting_1.TopoSorter();
43
+ const releaseApp = new release_application_1.ReleaseApplication(logger, gitService, graphProvider, releaseAdapters, topoSorter, releaseMapStore, masterBranch);
44
+ // ── Dev Publish (same adapters) ────────────────────────────────
45
+ const publishDevApp = new publish_dev_application_1.PublishDevApplication(logger, gitService, graphProvider, releaseAdapters, masterBranch);
46
+ // ── Prod Publish ────────────────────────────────────────────────
47
+ const prodPublishAdapters = [
48
+ new node_prod_publish_adapter_1.NodeProdPublishAdapter(config, logger),
49
+ new maven_prod_publish_adapter_1.MavenProdPublishAdapter(config, logger),
50
+ ];
51
+ const prodPublishApp = new prod_publish_application_1.ProdPublishApplication(logger, gitService, graphProvider, prodPublishAdapters, topoSorter, config);
52
+ // ── Commands ───────────────────────────────────────────────────
53
+ const commands = [
54
+ new publish_dev_commands_1.PublishDevCommand(publishDevApp),
55
+ new release_commands_1.ReleaseCommand(releaseApp),
56
+ new unfreeze_commands_1.UnfreezeCommand(unfreezeApp),
57
+ new prod_publish_commands_1.ProdPublishCommand(prodPublishApp),
58
+ ];
59
+ return new CliContainer(commands);
60
+ }
61
+ constructor(commands) {
62
+ this.commands = commands;
63
+ }
64
+ register(program) {
65
+ this.commands.forEach((command) => {
66
+ command.register(program);
67
+ });
68
+ }
69
+ }
70
+ exports.CliContainer = CliContainer;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CliContainer = void 0;
4
+ const buildCommands_1 = require("./commands/buildCommands");
5
+ const devCommands_1 = require("./commands/devCommands");
6
+ const publishDevCommands_1 = require("./commands/publishDevCommands");
7
+ const watchStaticCommands_1 = require("./commands/watchStaticCommands");
8
+ const copyStaticCommands_1 = require("./commands/copyStaticCommands");
9
+ const buildApplication_1 = require("../app/buildApplication");
10
+ const devApplication_1 = require("../app/devApplication");
11
+ const publishDevApplication_1 = require("../app/publishDevApplication");
12
+ const watchStaticApplication_1 = require("../app/watchStaticApplication");
13
+ const copyStaticApplication_1 = require("../app/copyStaticApplication");
14
+ const consoleLogger_1 = require("../infrastructure/logging/consoleLogger");
15
+ const nodeProcessRunner_1 = require("../infrastructure/process/nodeProcessRunner");
16
+ const gitService_1 = require("../infrastructure/git/gitService");
17
+ const releaseCommands_1 = require("./commands/releaseCommands");
18
+ const releaseApplication_1 = require("../app/releaseApplication");
19
+ const nxGraphProvide_1 = require("../infrastructure/graph/nxGraphProvide");
20
+ const node_release_adapter_1 = require("../infrastructure/adapters/node-release-adapter/node-release-adapter");
21
+ const maven_release_adapter_1 = require("../infrastructure/adapters/maven-release-adapter");
22
+ const topological_sorting_1 = require("../domain/topological-sorting");
23
+ const quarkConfigProvider_1 = require("../infrastructure/config/quarkConfigProvider");
24
+ class CliContainer {
25
+ static create() {
26
+ // Infrastructure (created ONCE)
27
+ const logger = new consoleLogger_1.ConsoleLogger();
28
+ const processRunner = new nodeProcessRunner_1.NodeProcessRunner();
29
+ const gitService = new gitService_1.NodeGitService();
30
+ const graphProvider = new nxGraphProvide_1.NxGraphProvider();
31
+ const configProvider = new quarkConfigProvider_1.QuarkConfigProvider();
32
+ const config = configProvider.getConfig();
33
+ // Applications (inject dependencies)
34
+ const buildApp = new buildApplication_1.BuildApplication(logger, processRunner);
35
+ const devApp = new devApplication_1.DevApplication(logger, processRunner);
36
+ const publishDevApp = new publishDevApplication_1.PublishDevApplication(logger);
37
+ const watchStaticApp = new watchStaticApplication_1.WatchStaticApplication(logger, processRunner);
38
+ const copyStaticApp = new copyStaticApplication_1.CopyStaticApplication(logger, processRunner);
39
+ const topoSorter = new topological_sorting_1.TopoSorter();
40
+ const releaseAdapters = [new node_release_adapter_1.NodeReleaseAdapter(gitService, graphProvider, config), new maven_release_adapter_1.MavenReleaseAdapter(gitService, graphProvider, config)];
41
+ const releaseApp = new releaseApplication_1.ReleaseApplication(logger, gitService, graphProvider, releaseAdapters, topoSorter, config.release.masterBranch);
42
+ // Commands
43
+ const commands = [
44
+ new buildCommands_1.BuildCommand(buildApp),
45
+ new devCommands_1.DevCommand(devApp),
46
+ new publishDevCommands_1.PublishDevCommand(publishDevApp),
47
+ new watchStaticCommands_1.WatchStaticCommand(watchStaticApp),
48
+ new copyStaticCommands_1.CopyStaticCommand(copyStaticApp),
49
+ new releaseCommands_1.ReleaseCommand(releaseApp),
50
+ ];
51
+ return new CliContainer(commands);
52
+ }
53
+ constructor(commands) {
54
+ this.commands = commands;
55
+ }
56
+ register(program) {
57
+ this.commands.forEach((command) => {
58
+ command.register(program);
59
+ });
60
+ }
61
+ }
62
+ exports.CliContainer = CliContainer;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BuildCommand = void 0;
4
+ class BuildCommand {
5
+ constructor(app) {
6
+ this.app = app;
7
+ }
8
+ register(program) {
9
+ program
10
+ .command("build")
11
+ .description("Run build process")
12
+ .action(async () => {
13
+ await this.app.execute({ skipStatic: false });
14
+ });
15
+ }
16
+ }
17
+ exports.BuildCommand = BuildCommand;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CopyStaticCommand = void 0;
4
+ class CopyStaticCommand {
5
+ constructor(app) {
6
+ this.app = app;
7
+ }
8
+ register(program) {
9
+ program
10
+ .command("copy-static")
11
+ .description("Copy static assets")
12
+ .action(async () => {
13
+ await this.app.execute();
14
+ });
15
+ }
16
+ }
17
+ exports.CopyStaticCommand = CopyStaticCommand;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DevCommand = void 0;
4
+ class DevCommand {
5
+ constructor(app) {
6
+ this.app = app;
7
+ }
8
+ register(program) {
9
+ program
10
+ .command("dev")
11
+ .description("Run development environment")
12
+ .action(async () => {
13
+ await this.app.execute({ skipInitialCopy: false });
14
+ });
15
+ }
16
+ }
17
+ exports.DevCommand = DevCommand;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProdPublishCommand = void 0;
4
+ class ProdPublishCommand {
5
+ constructor(app) {
6
+ this.app = app;
7
+ }
8
+ register(program) {
9
+ program
10
+ .command("prod-publish")
11
+ .description("Publish changed packages to the production registry based on map.json diff between git tags")
12
+ .option("--tag <tag>", "Target git tag to compare against (defaults to latest)")
13
+ .action(async (options) => {
14
+ await this.app.execute(options.tag);
15
+ });
16
+ }
17
+ }
18
+ exports.ProdPublishCommand = ProdPublishCommand;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PublishDevCommand = void 0;
4
+ class PublishDevCommand {
5
+ constructor(app) {
6
+ this.app = app;
7
+ }
8
+ register(program) {
9
+ program
10
+ .command("publish-dev")
11
+ .description("Publish a package to the dev registry as an alpha version")
12
+ .action(async () => {
13
+ await this.app.execute();
14
+ });
15
+ }
16
+ }
17
+ exports.PublishDevCommand = PublishDevCommand;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PublishDevCommand = void 0;
4
+ class PublishDevCommand {
5
+ constructor(app) {
6
+ this.app = app;
7
+ }
8
+ register(program) {
9
+ program
10
+ .command("publish-dev")
11
+ .description("Publish development build")
12
+ .action(async () => {
13
+ await this.app.execute();
14
+ });
15
+ }
16
+ }
17
+ exports.PublishDevCommand = PublishDevCommand;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReleaseCommand = void 0;
4
+ class ReleaseCommand {
5
+ constructor(app) {
6
+ this.app = app;
7
+ }
8
+ register(program) {
9
+ program
10
+ .command("release")
11
+ .description("Run release process")
12
+ .action(async () => {
13
+ await this.app.execute();
14
+ });
15
+ }
16
+ }
17
+ exports.ReleaseCommand = ReleaseCommand;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ReleaseCommand = void 0;
4
+ class ReleaseCommand {
5
+ constructor(app) {
6
+ this.app = app;
7
+ }
8
+ register(program) {
9
+ program
10
+ .command("release")
11
+ .description("Run release process")
12
+ .action(async () => {
13
+ await this.app.execute();
14
+ });
15
+ }
16
+ }
17
+ exports.ReleaseCommand = ReleaseCommand;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ // import { Command } from "commander";
3
+ // import { CliCommand } from "../CliCommand";
4
+ // import { ReleaseApplication } from "../../app/ReleaseApplication";
5
+ // export class ReleaseCommand implements CliCommand {
6
+ // constructor(private readonly app: ReleaseApplication) {}
7
+ // register(program: Command): void {
8
+ // program
9
+ // .command("release")
10
+ // .description("Run release process")
11
+ // .action(async () => {
12
+ // await this.app.execute();
13
+ // });
14
+ // }
15
+ // }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UnfreezeCommand = void 0;
4
+ class UnfreezeCommand {
5
+ constructor(app) {
6
+ this.app = app;
7
+ }
8
+ register(program) {
9
+ program
10
+ .command("unfreeze <package-name>")
11
+ .description("Unfreeze a package and restore its dependency versions to workspace:*")
12
+ .action(async (packageName) => {
13
+ await this.app.execute(packageName);
14
+ });
15
+ }
16
+ }
17
+ exports.UnfreezeCommand = UnfreezeCommand;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WatchStaticCommand = void 0;
4
+ class WatchStaticCommand {
5
+ constructor(app) {
6
+ this.app = app;
7
+ }
8
+ register(program) {
9
+ program
10
+ .command("watch-static")
11
+ .description("Watch and update static assets")
12
+ .action(async () => {
13
+ await this.app.execute();
14
+ });
15
+ }
16
+ }
17
+ exports.WatchStaticCommand = WatchStaticCommand;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createProgram = createProgram;
4
+ const commander_1 = require("commander");
5
+ const cli_containers_1 = require("./cli-containers");
6
+ const pkg = require("../../package.json");
7
+ function createProgram() {
8
+ const program = new commander_1.Command();
9
+ program
10
+ .name("quark")
11
+ .description("Polyglot build & release orchestration tool")
12
+ .version(pkg.version);
13
+ const container = cli_containers_1.CliContainer.create();
14
+ container.register(program);
15
+ return program;
16
+ }
@@ -0,0 +1,8 @@
1
+ import { Command } from "commander";
2
+ export declare const publish_dev: Command;
3
+ export declare const publish_prod: Command;
4
+ export declare const release: Command;
5
+ export declare const copyStatic: Command;
6
+ export declare const watchStatic: Command;
7
+ export declare const build: Command;
8
+ export declare const dev: Command;