@ticatec/omniflow-core 0.1.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.
Files changed (75) hide show
  1. package/README.md +264 -0
  2. package/README_CN.md +265 -0
  3. package/dist/context/index.d.ts +27 -0
  4. package/dist/context/index.d.ts.map +1 -0
  5. package/dist/context/index.js +62 -0
  6. package/dist/context/index.js.map +1 -0
  7. package/dist/context/storage.d.ts +8 -0
  8. package/dist/context/storage.d.ts.map +1 -0
  9. package/dist/context/storage.js +7 -0
  10. package/dist/context/storage.js.map +1 -0
  11. package/dist/context/types.d.ts +64 -0
  12. package/dist/context/types.d.ts.map +1 -0
  13. package/dist/context/types.js +5 -0
  14. package/dist/context/types.js.map +1 -0
  15. package/dist/index.d.ts +15 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +19 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/primitives/docker.d.ts +41 -0
  20. package/dist/primitives/docker.d.ts.map +1 -0
  21. package/dist/primitives/docker.js +109 -0
  22. package/dist/primitives/docker.js.map +1 -0
  23. package/dist/primitives/git.d.ts +19 -0
  24. package/dist/primitives/git.d.ts.map +1 -0
  25. package/dist/primitives/git.js +84 -0
  26. package/dist/primitives/git.js.map +1 -0
  27. package/dist/primitives/index.d.ts +5 -0
  28. package/dist/primitives/index.d.ts.map +1 -0
  29. package/dist/primitives/index.js +5 -0
  30. package/dist/primitives/index.js.map +1 -0
  31. package/dist/primitives/shell.d.ts +42 -0
  32. package/dist/primitives/shell.d.ts.map +1 -0
  33. package/dist/primitives/shell.js +141 -0
  34. package/dist/primitives/shell.js.map +1 -0
  35. package/dist/primitives/ssh.d.ts +41 -0
  36. package/dist/primitives/ssh.d.ts.map +1 -0
  37. package/dist/primitives/ssh.js +128 -0
  38. package/dist/primitives/ssh.js.map +1 -0
  39. package/dist/toolchain/index.d.ts +7 -0
  40. package/dist/toolchain/index.d.ts.map +1 -0
  41. package/dist/toolchain/index.js +7 -0
  42. package/dist/toolchain/index.js.map +1 -0
  43. package/dist/toolchain/providers/GradleToolchain.d.ts +15 -0
  44. package/dist/toolchain/providers/GradleToolchain.d.ts.map +1 -0
  45. package/dist/toolchain/providers/GradleToolchain.js +130 -0
  46. package/dist/toolchain/providers/GradleToolchain.js.map +1 -0
  47. package/dist/toolchain/providers/MavenToolchain.d.ts +12 -0
  48. package/dist/toolchain/providers/MavenToolchain.d.ts.map +1 -0
  49. package/dist/toolchain/providers/MavenToolchain.js +57 -0
  50. package/dist/toolchain/providers/MavenToolchain.js.map +1 -0
  51. package/dist/toolchain/providers/NodeToolchain.d.ts +15 -0
  52. package/dist/toolchain/providers/NodeToolchain.d.ts.map +1 -0
  53. package/dist/toolchain/providers/NodeToolchain.js +93 -0
  54. package/dist/toolchain/providers/NodeToolchain.js.map +1 -0
  55. package/dist/toolchain/providers/pom.d.ts +18 -0
  56. package/dist/toolchain/providers/pom.d.ts.map +1 -0
  57. package/dist/toolchain/providers/pom.js +112 -0
  58. package/dist/toolchain/providers/pom.js.map +1 -0
  59. package/dist/toolchain/registry.d.ts +48 -0
  60. package/dist/toolchain/registry.d.ts.map +1 -0
  61. package/dist/toolchain/registry.js +97 -0
  62. package/dist/toolchain/registry.js.map +1 -0
  63. package/dist/toolchain/types.d.ts +33 -0
  64. package/dist/toolchain/types.d.ts.map +1 -0
  65. package/dist/toolchain/types.js +5 -0
  66. package/dist/toolchain/types.js.map +1 -0
  67. package/dist/utils/mask.d.ts +15 -0
  68. package/dist/utils/mask.d.ts.map +1 -0
  69. package/dist/utils/mask.js +50 -0
  70. package/dist/utils/mask.js.map +1 -0
  71. package/dist/utils/template.d.ts +12 -0
  72. package/dist/utils/template.d.ts.map +1 -0
  73. package/dist/utils/template.js +55 -0
  74. package/dist/utils/template.js.map +1 -0
  75. package/package.json +57 -0
@@ -0,0 +1,41 @@
1
+ export interface SshServerConfig {
2
+ host?: string;
3
+ server?: string;
4
+ user: string;
5
+ private_key_file?: string;
6
+ port?: number;
7
+ tty?: boolean;
8
+ }
9
+ export interface SshAuthConfig {
10
+ user: string;
11
+ privateKey?: string;
12
+ privateKeyFile?: string;
13
+ }
14
+ export interface SshConnectionConfig extends SshAuthConfig {
15
+ host: string;
16
+ port?: number;
17
+ tty?: boolean;
18
+ connectTimeout?: number;
19
+ }
20
+ export type SshTarget = string | SshConnectionConfig;
21
+ export interface SshResult {
22
+ stdout: string;
23
+ stderr: string;
24
+ exitCode: number;
25
+ }
26
+ export interface SshOptions {
27
+ keyFile?: string;
28
+ remoteDir?: string;
29
+ }
30
+ export declare class SshClient {
31
+ private readonly configMap;
32
+ constructor(configMap?: Record<string, SshServerConfig>);
33
+ exec(target: SshTarget, remoteCommand: string, remoteDir?: string): Promise<SshResult>;
34
+ cp(target: SshTarget, srcFile: string, targetFolder: string): Promise<void>;
35
+ }
36
+ export declare const ssh: {
37
+ exec: (target: SshTarget, command: string, remoteDir?: string) => Promise<SshResult>;
38
+ cp: (target: SshTarget, srcFile: string, targetFolder: string) => Promise<void>;
39
+ createClient: (configMap: Record<string, SshServerConfig>) => SshClient;
40
+ };
41
+ //# sourceMappingURL=ssh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../src/primitives/ssh.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,mBAAmB,CAAA;AAEpD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAiED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;gBAE/C,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAM;IAIrD,IAAI,CACR,MAAM,EAAE,SAAS,EACjB,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,SAAS,CAAC;IA6Cf,EAAE,CACN,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC;CA6BjB;AAKD,eAAO,MAAM,GAAG;mBACC,SAAS,WAAW,MAAM,cAAc,MAAM;iBAEhD,SAAS,WAAW,MAAM,gBAAgB,MAAM;8BAEnC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;CAE1D,CAAA"}
@@ -0,0 +1,128 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ import { tmpdir } from 'node:os';
4
+ import { execa } from 'execa';
5
+ import { tryGetContext } from '../context/index.js';
6
+ function resolveTarget(target, configMap = {}) {
7
+ if (typeof target !== 'string') {
8
+ if (!target.host || !target.user) {
9
+ throw new Error('SSH target config requires both "host" and "user"');
10
+ }
11
+ return target;
12
+ }
13
+ const config = configMap[target];
14
+ if (!config) {
15
+ const known = Object.keys(configMap);
16
+ throw new Error(`SSH target configuration not found for key: "${target}". ` +
17
+ (known.length ? `Configured targets: ${known.join(', ')}` : 'No SSH targets configured.'));
18
+ }
19
+ const host = config.host || config.server;
20
+ if (!host) {
21
+ throw new Error(`SSH config '${target}' is missing host/server address`);
22
+ }
23
+ return {
24
+ host,
25
+ user: config.user,
26
+ privateKeyFile: config.private_key_file,
27
+ port: config.port,
28
+ tty: config.tty
29
+ };
30
+ }
31
+ async function createTempKeyFile(keyContent) {
32
+ const dir = await fs.mkdtemp(path.join(tmpdir(), 'omniflow-ssh-'));
33
+ const keyFile = path.join(dir, 'id_rsa');
34
+ await fs.writeFile(keyFile, keyContent, { mode: 0o600 });
35
+ return keyFile;
36
+ }
37
+ function connectionArgs(config, keyFile, portFlag) {
38
+ const args = [
39
+ '-o', 'BatchMode=yes',
40
+ '-o', 'StrictHostKeyChecking=accept-new',
41
+ '-o', `ConnectTimeout=${config.connectTimeout ?? 15}`,
42
+ portFlag, String(config.port ?? 22)
43
+ ];
44
+ if (keyFile) {
45
+ args.push('-i', keyFile);
46
+ }
47
+ return args;
48
+ }
49
+ function shellQuote(str) {
50
+ if (/^[a-zA-Z0-9_./-]+$/.test(str))
51
+ return str;
52
+ return `'${str.replace(/'/g, "'\\''")}'`;
53
+ }
54
+ export class SshClient {
55
+ configMap;
56
+ constructor(configMap = {}) {
57
+ this.configMap = configMap;
58
+ }
59
+ async exec(target, remoteCommand, remoteDir) {
60
+ const ctx = tryGetContext();
61
+ const config = resolveTarget(target, this.configMap);
62
+ if (ctx?.dryRun) {
63
+ ctx.logger.info(`[DRY-RUN] SSH to ${config.user}@${config.host}: ${remoteCommand} (remoteDir: ${remoteDir ?? '~'})`);
64
+ return { stdout: '[DRY-RUN] Remote command executed', stderr: '', exitCode: 0 };
65
+ }
66
+ let tempKeyFile;
67
+ try {
68
+ if (config.privateKey) {
69
+ tempKeyFile = await createTempKeyFile(config.privateKey);
70
+ }
71
+ const keyFile = tempKeyFile || config.privateKeyFile;
72
+ const args = connectionArgs(config, keyFile, '-p');
73
+ if (config.tty) {
74
+ args.push('-tt');
75
+ }
76
+ args.push(`${config.user}@${config.host}`);
77
+ const script = remoteDir
78
+ ? `cd ${shellQuote(remoteDir)} || exit 1\n${remoteCommand}`
79
+ : remoteCommand;
80
+ args.push(script);
81
+ ctx?.logger.info(`SSH (${config.user}@${config.host}) $ ${remoteCommand}`);
82
+ const result = await execa('ssh', args, { reject: true });
83
+ return {
84
+ stdout: result.stdout ?? '',
85
+ stderr: result.stderr ?? '',
86
+ exitCode: result.exitCode ?? 0
87
+ };
88
+ }
89
+ finally {
90
+ if (tempKeyFile) {
91
+ await fs.rm(path.dirname(tempKeyFile), { recursive: true, force: true }).catch(() => { });
92
+ }
93
+ }
94
+ }
95
+ async cp(target, srcFile, targetFolder) {
96
+ const ctx = tryGetContext();
97
+ const config = resolveTarget(target, this.configMap);
98
+ if (ctx?.dryRun) {
99
+ ctx.logger.info(`[DRY-RUN] SCP: Copy ${srcFile} -> ${config.user}@${config.host}:${targetFolder}`);
100
+ return;
101
+ }
102
+ let tempKeyFile;
103
+ try {
104
+ if (config.privateKey) {
105
+ tempKeyFile = await createTempKeyFile(config.privateKey);
106
+ }
107
+ const keyFile = tempKeyFile || config.privateKeyFile;
108
+ const args = connectionArgs(config, keyFile, '-P');
109
+ args.push(srcFile);
110
+ args.push(`${config.user}@${config.host}:${targetFolder}`);
111
+ ctx?.logger.info(`SCP ${srcFile} -> ${config.user}@${config.host}:${targetFolder}`);
112
+ await execa('scp', args, { reject: true });
113
+ }
114
+ finally {
115
+ if (tempKeyFile) {
116
+ await fs.rm(path.dirname(tempKeyFile), { recursive: true, force: true }).catch(() => { });
117
+ }
118
+ }
119
+ }
120
+ }
121
+ /** Default singleton instance helper */
122
+ const defaultClient = new SshClient();
123
+ export const ssh = {
124
+ exec: (target, command, remoteDir) => defaultClient.exec(target, command, remoteDir),
125
+ cp: (target, srcFile, targetFolder) => defaultClient.cp(target, srcFile, targetFolder),
126
+ createClient: (configMap) => new SshClient(configMap)
127
+ };
128
+ //# sourceMappingURL=ssh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../src/primitives/ssh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from './types.js';
2
+ export * from './registry.js';
3
+ export { MavenToolchain } from './providers/MavenToolchain.js';
4
+ export { GradleToolchain } from './providers/GradleToolchain.js';
5
+ export { NodeToolchain } from './providers/NodeToolchain.js';
6
+ export { readPom, parseXml } from './providers/pom.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/toolchain/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,7 @@
1
+ export * from './types.js';
2
+ export * from './registry.js';
3
+ export { MavenToolchain } from './providers/MavenToolchain.js';
4
+ export { GradleToolchain } from './providers/GradleToolchain.js';
5
+ export { NodeToolchain } from './providers/NodeToolchain.js';
6
+ export { readPom, parseXml } from './providers/pom.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/toolchain/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,15 @@
1
+ import type { ToolchainProvider, DetectionResult, ProjectInfo } from '../types.js';
2
+ export declare class GradleToolchain implements ToolchainProvider {
3
+ readonly name = "gradle";
4
+ readonly priority = 10;
5
+ detect(projectDir: string): Promise<DetectionResult | null>;
6
+ projectInfo(projectDir: string): Promise<ProjectInfo>;
7
+ install(projectDir: string, _flags?: string[]): Promise<void>;
8
+ build(projectDir: string, flags?: string[]): Promise<void>;
9
+ run(projectDir: string, task: string, flags?: string[]): Promise<void>;
10
+ private getCommand;
11
+ private staticVersion;
12
+ private staticGroup;
13
+ private staticName;
14
+ }
15
+ //# sourceMappingURL=GradleToolchain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GradleToolchain.d.ts","sourceRoot":"","sources":["../../../src/toolchain/providers/GradleToolchain.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AA8BlF,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,QAAQ,CAAC,IAAI,YAAW;IACxB,QAAQ,CAAC,QAAQ,MAAK;IAEhB,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAY3D,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAkBrD,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9D,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAKlE,UAAU;YAUV,aAAa;YAgBb,WAAW;YAgBX,UAAU;CAUzB"}
@@ -0,0 +1,130 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs/promises';
3
+ import { shell } from '../../primitives/shell.js';
4
+ const BUILD_FILES = ['build.gradle', 'build.gradle.kts'];
5
+ const SETTINGS_FILES = ['settings.gradle', 'settings.gradle.kts'];
6
+ async function readIfPresent(file) {
7
+ try {
8
+ return await fs.readFile(file, 'utf-8');
9
+ }
10
+ catch {
11
+ return undefined;
12
+ }
13
+ }
14
+ function fromProperties(text, key) {
15
+ for (const line of text.split('\n')) {
16
+ const trimmed = line.trim();
17
+ if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('!'))
18
+ continue;
19
+ const eq = trimmed.indexOf('=');
20
+ if (eq === -1)
21
+ continue;
22
+ if (trimmed.slice(0, eq).trim() !== key)
23
+ continue;
24
+ return trimmed.slice(eq + 1).trim() || undefined;
25
+ }
26
+ return undefined;
27
+ }
28
+ function fromBuildScript(text, key) {
29
+ const assignment = new RegExp(`^${key}\\s*=\\s*['"]([^'"]+)['"]`, 'm');
30
+ return assignment.exec(text)?.[1];
31
+ }
32
+ export class GradleToolchain {
33
+ name = 'gradle';
34
+ priority = 10;
35
+ async detect(projectDir) {
36
+ for (const file of BUILD_FILES) {
37
+ try {
38
+ await fs.access(path.join(projectDir, file));
39
+ return { name: 'gradle', reason: `found ${file}` };
40
+ }
41
+ catch {
42
+ // continue
43
+ }
44
+ }
45
+ return null;
46
+ }
47
+ async projectInfo(projectDir) {
48
+ let name = await this.staticName(projectDir);
49
+ let version = await this.staticVersion(projectDir);
50
+ if (!name)
51
+ name = path.basename(projectDir);
52
+ if (!version || version === 'unspecified') {
53
+ version = '0.0.0';
54
+ }
55
+ const group = await this.staticGroup(projectDir);
56
+ return {
57
+ name,
58
+ version,
59
+ fullName: group ? `${group}:${name}` : name,
60
+ namespace: group
61
+ };
62
+ }
63
+ async install(projectDir, _flags = []) {
64
+ // Gradle resolves dependencies as part of tasks, no dedicated install needed
65
+ }
66
+ async build(projectDir, flags = []) {
67
+ const cmd = await this.getCommand(projectDir);
68
+ await shell.run({ cwd: projectDir }) `${cmd} build ${flags}`;
69
+ }
70
+ async run(projectDir, task, flags = []) {
71
+ const cmd = await this.getCommand(projectDir);
72
+ await shell.run({ cwd: projectDir }) `${cmd} ${task} ${flags}`;
73
+ }
74
+ async getCommand(projectDir) {
75
+ const wrapper = path.join(projectDir, process.platform === 'win32' ? 'gradlew.bat' : 'gradlew');
76
+ try {
77
+ await fs.access(wrapper, fs.constants.X_OK);
78
+ return wrapper;
79
+ }
80
+ catch {
81
+ return 'gradle';
82
+ }
83
+ }
84
+ async staticVersion(projectDir) {
85
+ const props = await readIfPresent(path.join(projectDir, 'gradle.properties'));
86
+ if (props) {
87
+ const found = fromProperties(props, 'version');
88
+ if (found)
89
+ return found;
90
+ }
91
+ for (const file of BUILD_FILES) {
92
+ const text = await readIfPresent(path.join(projectDir, file));
93
+ if (text) {
94
+ const found = fromBuildScript(text, 'version');
95
+ if (found)
96
+ return found;
97
+ }
98
+ }
99
+ return undefined;
100
+ }
101
+ async staticGroup(projectDir) {
102
+ const props = await readIfPresent(path.join(projectDir, 'gradle.properties'));
103
+ if (props) {
104
+ const found = fromProperties(props, 'group');
105
+ if (found)
106
+ return found;
107
+ }
108
+ for (const file of BUILD_FILES) {
109
+ const text = await readIfPresent(path.join(projectDir, file));
110
+ if (text) {
111
+ const found = fromBuildScript(text, 'group');
112
+ if (found)
113
+ return found;
114
+ }
115
+ }
116
+ return undefined;
117
+ }
118
+ async staticName(projectDir) {
119
+ for (const file of SETTINGS_FILES) {
120
+ const text = await readIfPresent(path.join(projectDir, file));
121
+ if (text) {
122
+ const found = /rootProject\.name\s*=\s*['"]([^'"]+)['"]/.exec(text)?.[1];
123
+ if (found)
124
+ return found;
125
+ }
126
+ }
127
+ return undefined;
128
+ }
129
+ }
130
+ //# sourceMappingURL=GradleToolchain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GradleToolchain.js","sourceRoot":"","sources":["../../../src/toolchain/providers/GradleToolchain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { ToolchainProvider, DetectionResult, ProjectInfo } from '../types.js';
2
+ export declare class MavenToolchain implements ToolchainProvider {
3
+ readonly name = "maven";
4
+ readonly priority = 10;
5
+ detect(projectDir: string): Promise<DetectionResult | null>;
6
+ projectInfo(projectDir: string): Promise<ProjectInfo>;
7
+ install(projectDir: string, flags?: string[]): Promise<void>;
8
+ build(projectDir: string, flags?: string[]): Promise<void>;
9
+ run(projectDir: string, task: string, flags?: string[]): Promise<void>;
10
+ private getCommand;
11
+ }
12
+ //# sourceMappingURL=MavenToolchain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MavenToolchain.d.ts","sourceRoot":"","sources":["../../../src/toolchain/providers/MavenToolchain.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAElF,qBAAa,cAAe,YAAW,iBAAiB;IACtD,QAAQ,CAAC,IAAI,WAAU;IACvB,QAAQ,CAAC,QAAQ,MAAK;IAEhB,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAS3D,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBrD,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9D,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAKlE,UAAU;CASzB"}
@@ -0,0 +1,57 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs/promises';
3
+ import { shell } from '../../primitives/shell.js';
4
+ import { readPom } from './pom.js';
5
+ export class MavenToolchain {
6
+ name = 'maven';
7
+ priority = 10;
8
+ async detect(projectDir) {
9
+ try {
10
+ await fs.access(path.join(projectDir, 'pom.xml'));
11
+ return { name: 'maven', reason: 'found pom.xml' };
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ }
17
+ async projectInfo(projectDir) {
18
+ const pomPath = path.join(projectDir, 'pom.xml');
19
+ const content = await fs.readFile(pomPath, 'utf-8');
20
+ const { groupId, artifactId, version } = readPom(content);
21
+ if (!artifactId) {
22
+ throw new Error(`Invalid pom.xml (missing <artifactId>): ${pomPath}`);
23
+ }
24
+ if (!version) {
25
+ throw new Error(`Invalid pom.xml (missing <version>): ${pomPath}`);
26
+ }
27
+ return {
28
+ name: artifactId,
29
+ version,
30
+ fullName: groupId ? `${groupId}:${artifactId}` : artifactId,
31
+ namespace: groupId
32
+ };
33
+ }
34
+ async install(projectDir, flags = []) {
35
+ const cmd = await this.getCommand(projectDir);
36
+ await shell.run({ cwd: projectDir }) `${cmd} -B dependency:go-offline ${flags}`;
37
+ }
38
+ async build(projectDir, flags = []) {
39
+ const cmd = await this.getCommand(projectDir);
40
+ await shell.run({ cwd: projectDir }) `${cmd} -B package ${flags}`;
41
+ }
42
+ async run(projectDir, task, flags = []) {
43
+ const cmd = await this.getCommand(projectDir);
44
+ await shell.run({ cwd: projectDir }) `${cmd} -B ${task} ${flags}`;
45
+ }
46
+ async getCommand(projectDir) {
47
+ const wrapper = path.join(projectDir, process.platform === 'win32' ? 'mvnw.cmd' : 'mvnw');
48
+ try {
49
+ await fs.access(wrapper, fs.constants.X_OK);
50
+ return wrapper;
51
+ }
52
+ catch {
53
+ return 'mvn';
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=MavenToolchain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MavenToolchain.js","sourceRoot":"","sources":["../../../src/toolchain/providers/MavenToolchain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ToolchainProvider, DetectionResult, ProjectInfo } from '../types.js';
2
+ export type NodePackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';
3
+ export declare class NodeToolchain implements ToolchainProvider {
4
+ readonly name: string;
5
+ readonly priority = 10;
6
+ private explicitPm?;
7
+ constructor(pmName?: NodePackageManager);
8
+ detect(projectDir: string): Promise<DetectionResult | null>;
9
+ projectInfo(projectDir: string): Promise<ProjectInfo>;
10
+ install(projectDir: string, flags?: string[]): Promise<void>;
11
+ build(projectDir: string, flags?: string[]): Promise<void>;
12
+ run(projectDir: string, task: string, flags?: string[]): Promise<void>;
13
+ private resolvePm;
14
+ }
15
+ //# sourceMappingURL=NodeToolchain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeToolchain.d.ts","sourceRoot":"","sources":["../../../src/toolchain/providers/NodeToolchain.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAElF,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAA;AAmChE,qBAAa,aAAc,YAAW,iBAAiB;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,MAAK;IACtB,OAAO,CAAC,UAAU,CAAC,CAAoB;gBAE3B,MAAM,CAAC,EAAE,kBAAkB;IAKjC,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAc3D,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAsBrD,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAKhE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9D,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAKlE,SAAS;CAKxB"}
@@ -0,0 +1,93 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs/promises';
3
+ import { shell } from '../../primitives/shell.js';
4
+ const LOCKFILES = [
5
+ ['pnpm-lock.yaml', 'pnpm'],
6
+ ['bun.lockb', 'bun'],
7
+ ['yarn.lock', 'yarn'],
8
+ ['package-lock.json', 'npm']
9
+ ];
10
+ async function detectPackageManager(dir) {
11
+ try {
12
+ const raw = await fs.readFile(path.join(dir, 'package.json'), 'utf-8');
13
+ const field = JSON.parse(raw)?.packageManager;
14
+ if (typeof field === 'string') {
15
+ const name = field.split('@')[0];
16
+ if (['npm', 'pnpm', 'yarn', 'bun'].includes(name)) {
17
+ return { pm: name, reason: `package.json packageManager (${field})` };
18
+ }
19
+ }
20
+ }
21
+ catch {
22
+ // continue
23
+ }
24
+ for (const [lockfile, pm] of LOCKFILES) {
25
+ try {
26
+ await fs.access(path.join(dir, lockfile));
27
+ return { pm, reason: lockfile };
28
+ }
29
+ catch {
30
+ // continue
31
+ }
32
+ }
33
+ return { pm: 'npm', reason: 'default fallback' };
34
+ }
35
+ export class NodeToolchain {
36
+ name;
37
+ priority = 10;
38
+ explicitPm;
39
+ constructor(pmName) {
40
+ this.name = pmName ?? 'node';
41
+ this.explicitPm = pmName;
42
+ }
43
+ async detect(projectDir) {
44
+ try {
45
+ await fs.access(path.join(projectDir, 'package.json'));
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ const { pm, reason } = await detectPackageManager(projectDir);
51
+ return {
52
+ name: this.explicitPm ?? pm,
53
+ reason: `found package.json and ${reason}`
54
+ };
55
+ }
56
+ async projectInfo(projectDir) {
57
+ const raw = await fs.readFile(path.join(projectDir, 'package.json'), 'utf-8');
58
+ const pkg = JSON.parse(raw);
59
+ const rawName = pkg.name || path.basename(projectDir);
60
+ let name = rawName;
61
+ let namespace;
62
+ if (rawName.startsWith('@') && rawName.includes('/')) {
63
+ const [scope, bare] = rawName.split('/');
64
+ namespace = scope.slice(1);
65
+ name = bare;
66
+ }
67
+ return {
68
+ name,
69
+ version: pkg.version || '0.0.0',
70
+ fullName: rawName,
71
+ namespace
72
+ };
73
+ }
74
+ async install(projectDir, flags = []) {
75
+ const pm = await this.resolvePm(projectDir);
76
+ await shell.run({ cwd: projectDir }) `${pm} install ${flags}`;
77
+ }
78
+ async build(projectDir, flags = []) {
79
+ const pm = await this.resolvePm(projectDir);
80
+ await shell.run({ cwd: projectDir }) `${pm} run build ${flags}`;
81
+ }
82
+ async run(projectDir, task, flags = []) {
83
+ const pm = await this.resolvePm(projectDir);
84
+ await shell.run({ cwd: projectDir }) `${pm} run ${task} ${flags}`;
85
+ }
86
+ async resolvePm(projectDir) {
87
+ if (this.explicitPm)
88
+ return this.explicitPm;
89
+ const { pm } = await detectPackageManager(projectDir);
90
+ return pm;
91
+ }
92
+ }
93
+ //# sourceMappingURL=NodeToolchain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeToolchain.js","sourceRoot":"","sources":["../../../src/toolchain/providers/NodeToolchain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * XML parsing helper for reading coordinates out of a pom.xml without general XML parser dependencies.
3
+ */
4
+ export interface XmlNode {
5
+ text: string;
6
+ children: Record<string, XmlNode[]>;
7
+ }
8
+ export declare function parseXml(xml: string): {
9
+ name: string;
10
+ node: XmlNode;
11
+ };
12
+ export interface PomCoordinates {
13
+ groupId?: string;
14
+ artifactId?: string;
15
+ version?: string;
16
+ }
17
+ export declare function readPom(xml: string): PomCoordinates;
18
+ //# sourceMappingURL=pom.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pom.d.ts","sourceRoot":"","sources":["../../../src/toolchain/providers/pom.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;CACpC;AA6BD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CA8CrE;AA8BD,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAYnD"}