@kolatts/pncli 1.2.0 → 1.4.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/README.md +14 -12
- package/copilot-instructions.md +224 -4
- package/dist/chunk-HWXXNMGE.js +558 -0
- package/dist/chunk-HWXXNMGE.js.map +1 -0
- package/dist/chunk-JORIICS2.js +197 -0
- package/dist/chunk-JORIICS2.js.map +1 -0
- package/dist/chunk-KT3XINLJ.js +42 -0
- package/dist/chunk-KT3XINLJ.js.map +1 -0
- package/dist/cli.js +3653 -1760
- package/dist/cli.js.map +1 -1
- package/dist/config-KECF7FJ2.js +18 -0
- package/dist/config-KECF7FJ2.js.map +1 -0
- package/dist/core-AJYPJ2Z7.js +8 -0
- package/dist/core-AJYPJ2Z7.js.map +1 -0
- package/dist/http-FC24JSK7.js +10 -0
- package/dist/http-FC24JSK7.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/lib/config.ts
|
|
4
|
+
import fs from "fs";
|
|
5
|
+
import os from "os";
|
|
6
|
+
import path from "path";
|
|
7
|
+
import { execSync } from "child_process";
|
|
8
|
+
var ENV_KEYS = {
|
|
9
|
+
EMAIL: "PNCLI_EMAIL",
|
|
10
|
+
USERID: "PNCLI_USERID",
|
|
11
|
+
JIRA_BASE_URL: "PNCLI_JIRA_BASE_URL",
|
|
12
|
+
JIRA_API_TOKEN: "PNCLI_JIRA_API_TOKEN",
|
|
13
|
+
BITBUCKET_BASE_URL: "PNCLI_BITBUCKET_BASE_URL",
|
|
14
|
+
BITBUCKET_PAT: "PNCLI_BITBUCKET_PAT",
|
|
15
|
+
CONFLUENCE_BASE_URL: "PNCLI_CONFLUENCE_BASE_URL",
|
|
16
|
+
CONFLUENCE_API_TOKEN: "PNCLI_CONFLUENCE_API_TOKEN",
|
|
17
|
+
ARTIFACTORY_BASE_URL: "PNCLI_ARTIFACTORY_BASE_URL",
|
|
18
|
+
ARTIFACTORY_TOKEN: "PNCLI_ARTIFACTORY_TOKEN",
|
|
19
|
+
ARTIFACTORY_REPO_NPM: "PNCLI_ARTIFACTORY_REPO_NPM",
|
|
20
|
+
ARTIFACTORY_REPO_NUGET: "PNCLI_ARTIFACTORY_REPO_NUGET",
|
|
21
|
+
ARTIFACTORY_REPO_MAVEN: "PNCLI_ARTIFACTORY_REPO_MAVEN",
|
|
22
|
+
SONAR_BASE_URL: "PNCLI_SONAR_BASE_URL",
|
|
23
|
+
SONAR_TOKEN: "PNCLI_SONAR_TOKEN",
|
|
24
|
+
SDE_CONNECTION: "PNCLI_SDE_CONNECTION",
|
|
25
|
+
ADO_BASE_URL: "PNCLI_ADO_BASE_URL",
|
|
26
|
+
ADO_PAT: "PNCLI_ADO_PAT",
|
|
27
|
+
CONFIG_PATH: "PNCLI_CONFIG_PATH"
|
|
28
|
+
};
|
|
29
|
+
function getGlobalConfigPath(overridePath) {
|
|
30
|
+
if (overridePath) return overridePath;
|
|
31
|
+
const envPath = process.env[ENV_KEYS.CONFIG_PATH];
|
|
32
|
+
if (envPath) return envPath;
|
|
33
|
+
return path.join(os.homedir(), ".pncli", "config.json");
|
|
34
|
+
}
|
|
35
|
+
function loadJsonFile(filePath) {
|
|
36
|
+
try {
|
|
37
|
+
const content = fs.readFileSync(filePath, "utf8");
|
|
38
|
+
return JSON.parse(content);
|
|
39
|
+
} catch {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function getRepoRoot() {
|
|
44
|
+
try {
|
|
45
|
+
return execSync("git rev-parse --show-toplevel", { encoding: "utf8", stdio: ["pipe", "pipe", "pipe"] }).trim();
|
|
46
|
+
} catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function parseSdeConnection(connection) {
|
|
51
|
+
const idx = connection.indexOf("@");
|
|
52
|
+
if (idx <= 0) return null;
|
|
53
|
+
const token = connection.slice(0, idx);
|
|
54
|
+
const host = connection.slice(idx + 1);
|
|
55
|
+
const baseUrl = /^https?:\/\//i.test(host) ? host : `https://${host}`;
|
|
56
|
+
return { token, baseUrl };
|
|
57
|
+
}
|
|
58
|
+
function mergeCustomFields(global, repo) {
|
|
59
|
+
const map = /* @__PURE__ */ new Map();
|
|
60
|
+
for (const f of global ?? []) map.set(f.id, f);
|
|
61
|
+
for (const f of repo ?? []) map.set(f.id, f);
|
|
62
|
+
return Array.from(map.values());
|
|
63
|
+
}
|
|
64
|
+
function mergeDefaults(global, repo) {
|
|
65
|
+
return {
|
|
66
|
+
jira: { ...global?.jira, ...repo?.jira },
|
|
67
|
+
bitbucket: { ...global?.bitbucket, ...repo?.bitbucket },
|
|
68
|
+
sonar: { ...global?.sonar, ...repo?.sonar },
|
|
69
|
+
sde: { ...global?.sde, ...repo?.sde },
|
|
70
|
+
ado: { ...global?.ado, ...repo?.ado }
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function loadConfig(opts = {}) {
|
|
74
|
+
const globalConfigPath = getGlobalConfigPath(opts.configPath);
|
|
75
|
+
const globalConfig = loadJsonFile(globalConfigPath) ?? {};
|
|
76
|
+
const repoRoot = getRepoRoot();
|
|
77
|
+
let repoConfig = {};
|
|
78
|
+
if (repoRoot) {
|
|
79
|
+
repoConfig = loadJsonFile(path.join(repoRoot, ".pncli.json")) ?? {};
|
|
80
|
+
}
|
|
81
|
+
const mergedDefaults = mergeDefaults(globalConfig.defaults, repoConfig.defaults);
|
|
82
|
+
return {
|
|
83
|
+
user: {
|
|
84
|
+
email: process.env[ENV_KEYS.EMAIL] ?? globalConfig.user?.email,
|
|
85
|
+
userId: process.env[ENV_KEYS.USERID] ?? globalConfig.user?.userId
|
|
86
|
+
},
|
|
87
|
+
jira: {
|
|
88
|
+
baseUrl: process.env[ENV_KEYS.JIRA_BASE_URL] ?? globalConfig.jira?.baseUrl,
|
|
89
|
+
apiToken: process.env[ENV_KEYS.JIRA_API_TOKEN] ?? globalConfig.jira?.apiToken,
|
|
90
|
+
customFields: mergeCustomFields(globalConfig.jira?.customFields, repoConfig.jira?.customFields)
|
|
91
|
+
},
|
|
92
|
+
bitbucket: {
|
|
93
|
+
baseUrl: process.env[ENV_KEYS.BITBUCKET_BASE_URL] ?? globalConfig.bitbucket?.baseUrl,
|
|
94
|
+
pat: process.env[ENV_KEYS.BITBUCKET_PAT] ?? globalConfig.bitbucket?.pat
|
|
95
|
+
},
|
|
96
|
+
confluence: {
|
|
97
|
+
baseUrl: process.env[ENV_KEYS.CONFLUENCE_BASE_URL] ?? globalConfig.confluence?.baseUrl,
|
|
98
|
+
apiToken: process.env[ENV_KEYS.CONFLUENCE_API_TOKEN] ?? globalConfig.confluence?.apiToken ?? process.env[ENV_KEYS.JIRA_API_TOKEN] ?? globalConfig.jira?.apiToken
|
|
99
|
+
},
|
|
100
|
+
artifactory: {
|
|
101
|
+
baseUrl: process.env[ENV_KEYS.ARTIFACTORY_BASE_URL] ?? globalConfig.artifactory?.baseUrl,
|
|
102
|
+
token: process.env[ENV_KEYS.ARTIFACTORY_TOKEN] ?? globalConfig.artifactory?.token,
|
|
103
|
+
npmRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_NPM] ?? globalConfig.artifactory?.npmRepo,
|
|
104
|
+
nugetRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_NUGET] ?? globalConfig.artifactory?.nugetRepo,
|
|
105
|
+
mavenRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_MAVEN] ?? globalConfig.artifactory?.mavenRepo
|
|
106
|
+
},
|
|
107
|
+
sonar: {
|
|
108
|
+
baseUrl: process.env[ENV_KEYS.SONAR_BASE_URL] ?? globalConfig.sonar?.baseUrl,
|
|
109
|
+
token: process.env[ENV_KEYS.SONAR_TOKEN] ?? globalConfig.sonar?.token
|
|
110
|
+
},
|
|
111
|
+
sde: (() => {
|
|
112
|
+
const raw = process.env[ENV_KEYS.SDE_CONNECTION] ?? globalConfig.sde?.connection;
|
|
113
|
+
const parsed = raw ? parseSdeConnection(raw) : null;
|
|
114
|
+
return { baseUrl: parsed?.baseUrl, token: parsed?.token };
|
|
115
|
+
})(),
|
|
116
|
+
ado: {
|
|
117
|
+
baseUrl: process.env[ENV_KEYS.ADO_BASE_URL] ?? globalConfig.ado?.baseUrl,
|
|
118
|
+
pat: process.env[ENV_KEYS.ADO_PAT] ?? globalConfig.ado?.pat,
|
|
119
|
+
fieldAliases: globalConfig.ado?.fieldAliases ?? {},
|
|
120
|
+
discoveredFields: globalConfig.ado?.discoveredFields ?? [],
|
|
121
|
+
discoveredTypes: globalConfig.ado?.discoveredTypes ?? []
|
|
122
|
+
},
|
|
123
|
+
defaults: mergedDefaults
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
function writeGlobalConfig(config, configPath) {
|
|
127
|
+
const filePath = getGlobalConfigPath(configPath);
|
|
128
|
+
const dir = path.dirname(filePath);
|
|
129
|
+
if (!fs.existsSync(dir)) {
|
|
130
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
131
|
+
}
|
|
132
|
+
fs.writeFileSync(filePath, JSON.stringify(config, null, 2) + "\n", "utf8");
|
|
133
|
+
}
|
|
134
|
+
function writeRepoConfig(config) {
|
|
135
|
+
const repoRoot = getRepoRoot();
|
|
136
|
+
const targetDir = repoRoot ?? process.cwd();
|
|
137
|
+
fs.writeFileSync(path.join(targetDir, ".pncli.json"), JSON.stringify(config, null, 2) + "\n", "utf8");
|
|
138
|
+
}
|
|
139
|
+
function setConfigValue(key, value, configPath) {
|
|
140
|
+
const filePath = getGlobalConfigPath(configPath);
|
|
141
|
+
const existing = loadJsonFile(filePath) ?? {};
|
|
142
|
+
const parts = key.split(".");
|
|
143
|
+
let current = existing;
|
|
144
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
145
|
+
const part = parts[i];
|
|
146
|
+
if (typeof current[part] !== "object" || current[part] === null) {
|
|
147
|
+
current[part] = {};
|
|
148
|
+
}
|
|
149
|
+
current = current[part];
|
|
150
|
+
}
|
|
151
|
+
current[parts[parts.length - 1]] = value;
|
|
152
|
+
writeGlobalConfig(existing, configPath);
|
|
153
|
+
}
|
|
154
|
+
function maskConfig(config) {
|
|
155
|
+
return {
|
|
156
|
+
...config,
|
|
157
|
+
jira: {
|
|
158
|
+
...config.jira,
|
|
159
|
+
apiToken: config.jira.apiToken ? "***" : void 0,
|
|
160
|
+
customFields: config.jira.customFields
|
|
161
|
+
},
|
|
162
|
+
bitbucket: {
|
|
163
|
+
...config.bitbucket,
|
|
164
|
+
pat: config.bitbucket.pat ? "***" : void 0
|
|
165
|
+
},
|
|
166
|
+
confluence: {
|
|
167
|
+
...config.confluence,
|
|
168
|
+
apiToken: config.confluence.apiToken ? "***" : void 0
|
|
169
|
+
},
|
|
170
|
+
artifactory: {
|
|
171
|
+
...config.artifactory,
|
|
172
|
+
token: config.artifactory.token ? "***" : void 0
|
|
173
|
+
},
|
|
174
|
+
sonar: {
|
|
175
|
+
...config.sonar,
|
|
176
|
+
token: config.sonar.token ? "***" : void 0
|
|
177
|
+
},
|
|
178
|
+
sde: {
|
|
179
|
+
baseUrl: config.sde.baseUrl,
|
|
180
|
+
token: config.sde.token ? "***" : void 0
|
|
181
|
+
},
|
|
182
|
+
ado: {
|
|
183
|
+
...config.ado,
|
|
184
|
+
pat: config.ado.pat ? "***" : void 0
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export {
|
|
190
|
+
getGlobalConfigPath,
|
|
191
|
+
loadConfig,
|
|
192
|
+
writeGlobalConfig,
|
|
193
|
+
writeRepoConfig,
|
|
194
|
+
setConfigValue,
|
|
195
|
+
maskConfig
|
|
196
|
+
};
|
|
197
|
+
//# sourceMappingURL=chunk-JORIICS2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/config.ts"],"sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport type { GlobalConfig, RepoConfig, ResolvedConfig, JiraDefaults, BitbucketDefaults, SonarDefaults, SdeDefaults, AdoDefaults } from '../types/config.js';\nimport type { CustomFieldDefinition } from '../types/jira.js';\n\nconst ENV_KEYS = {\n EMAIL: 'PNCLI_EMAIL',\n USERID: 'PNCLI_USERID',\n JIRA_BASE_URL: 'PNCLI_JIRA_BASE_URL',\n JIRA_API_TOKEN: 'PNCLI_JIRA_API_TOKEN',\n BITBUCKET_BASE_URL: 'PNCLI_BITBUCKET_BASE_URL',\n BITBUCKET_PAT: 'PNCLI_BITBUCKET_PAT',\n CONFLUENCE_BASE_URL: 'PNCLI_CONFLUENCE_BASE_URL',\n CONFLUENCE_API_TOKEN: 'PNCLI_CONFLUENCE_API_TOKEN',\n ARTIFACTORY_BASE_URL: 'PNCLI_ARTIFACTORY_BASE_URL',\n ARTIFACTORY_TOKEN: 'PNCLI_ARTIFACTORY_TOKEN',\n ARTIFACTORY_REPO_NPM: 'PNCLI_ARTIFACTORY_REPO_NPM',\n ARTIFACTORY_REPO_NUGET: 'PNCLI_ARTIFACTORY_REPO_NUGET',\n ARTIFACTORY_REPO_MAVEN: 'PNCLI_ARTIFACTORY_REPO_MAVEN',\n SONAR_BASE_URL: 'PNCLI_SONAR_BASE_URL',\n SONAR_TOKEN: 'PNCLI_SONAR_TOKEN',\n SDE_CONNECTION: 'PNCLI_SDE_CONNECTION',\n ADO_BASE_URL: 'PNCLI_ADO_BASE_URL',\n ADO_PAT: 'PNCLI_ADO_PAT',\n CONFIG_PATH: 'PNCLI_CONFIG_PATH'\n} as const;\n\nfunction getGlobalConfigPath(overridePath?: string): string {\n if (overridePath) return overridePath;\n const envPath = process.env[ENV_KEYS.CONFIG_PATH];\n if (envPath) return envPath;\n return path.join(os.homedir(), '.pncli', 'config.json');\n}\n\nfunction loadJsonFile<T>(filePath: string): T | null {\n try {\n const content = fs.readFileSync(filePath, 'utf8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nfunction getRepoRoot(): string | null {\n try {\n return execSync('git rev-parse --show-toplevel', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return null;\n }\n}\n\nfunction parseSdeConnection(connection: string): { token: string; baseUrl: string } | null {\n const idx = connection.indexOf('@');\n if (idx <= 0) return null;\n const token = connection.slice(0, idx);\n const host = connection.slice(idx + 1);\n const baseUrl = /^https?:\\/\\//i.test(host) ? host : `https://${host}`;\n return { token, baseUrl };\n}\n\nfunction mergeCustomFields(\n global: CustomFieldDefinition[] | undefined,\n repo: CustomFieldDefinition[] | undefined\n): CustomFieldDefinition[] {\n const map = new Map<string, CustomFieldDefinition>();\n for (const f of global ?? []) map.set(f.id, f);\n for (const f of repo ?? []) map.set(f.id, f); // repo wins\n return Array.from(map.values());\n}\n\nfunction mergeDefaults(\n global: GlobalConfig['defaults'],\n repo: RepoConfig['defaults']\n): { jira: JiraDefaults; bitbucket: BitbucketDefaults; sonar: SonarDefaults; sde: SdeDefaults; ado: AdoDefaults } {\n return {\n jira: { ...global?.jira, ...repo?.jira },\n bitbucket: { ...global?.bitbucket, ...repo?.bitbucket },\n sonar: { ...global?.sonar, ...repo?.sonar },\n sde: { ...global?.sde, ...repo?.sde },\n ado: { ...global?.ado, ...repo?.ado }\n };\n}\n\nexport interface LoadConfigOptions {\n configPath?: string;\n}\n\nexport function loadConfig(opts: LoadConfigOptions = {}): ResolvedConfig {\n const globalConfigPath = getGlobalConfigPath(opts.configPath);\n const globalConfig = loadJsonFile<GlobalConfig>(globalConfigPath) ?? {};\n\n const repoRoot = getRepoRoot();\n let repoConfig: RepoConfig = {};\n if (repoRoot) {\n repoConfig = loadJsonFile<RepoConfig>(path.join(repoRoot, '.pncli.json')) ?? {};\n }\n\n const mergedDefaults = mergeDefaults(globalConfig.defaults, repoConfig.defaults);\n\n return {\n user: {\n email: process.env[ENV_KEYS.EMAIL] ?? globalConfig.user?.email,\n userId: process.env[ENV_KEYS.USERID] ?? globalConfig.user?.userId\n },\n jira: {\n baseUrl: process.env[ENV_KEYS.JIRA_BASE_URL] ?? globalConfig.jira?.baseUrl,\n apiToken: process.env[ENV_KEYS.JIRA_API_TOKEN] ?? globalConfig.jira?.apiToken,\n customFields: mergeCustomFields(globalConfig.jira?.customFields, repoConfig.jira?.customFields)\n },\n bitbucket: {\n baseUrl: process.env[ENV_KEYS.BITBUCKET_BASE_URL] ?? globalConfig.bitbucket?.baseUrl,\n pat: process.env[ENV_KEYS.BITBUCKET_PAT] ?? globalConfig.bitbucket?.pat\n },\n confluence: {\n baseUrl: process.env[ENV_KEYS.CONFLUENCE_BASE_URL] ?? globalConfig.confluence?.baseUrl,\n apiToken: process.env[ENV_KEYS.CONFLUENCE_API_TOKEN] ?? globalConfig.confluence?.apiToken\n ?? process.env[ENV_KEYS.JIRA_API_TOKEN] ?? globalConfig.jira?.apiToken\n },\n artifactory: {\n baseUrl: process.env[ENV_KEYS.ARTIFACTORY_BASE_URL] ?? globalConfig.artifactory?.baseUrl,\n token: process.env[ENV_KEYS.ARTIFACTORY_TOKEN] ?? globalConfig.artifactory?.token,\n npmRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_NPM] ?? globalConfig.artifactory?.npmRepo,\n nugetRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_NUGET] ?? globalConfig.artifactory?.nugetRepo,\n mavenRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_MAVEN] ?? globalConfig.artifactory?.mavenRepo\n },\n sonar: {\n baseUrl: process.env[ENV_KEYS.SONAR_BASE_URL] ?? globalConfig.sonar?.baseUrl,\n token: process.env[ENV_KEYS.SONAR_TOKEN] ?? globalConfig.sonar?.token\n },\n sde: (() => {\n const raw = process.env[ENV_KEYS.SDE_CONNECTION] ?? globalConfig.sde?.connection;\n const parsed = raw ? parseSdeConnection(raw) : null;\n return { baseUrl: parsed?.baseUrl, token: parsed?.token };\n })(),\n ado: {\n baseUrl: process.env[ENV_KEYS.ADO_BASE_URL] ?? globalConfig.ado?.baseUrl,\n pat: process.env[ENV_KEYS.ADO_PAT] ?? globalConfig.ado?.pat,\n fieldAliases: globalConfig.ado?.fieldAliases ?? {},\n discoveredFields: globalConfig.ado?.discoveredFields ?? [],\n discoveredTypes: globalConfig.ado?.discoveredTypes ?? []\n },\n defaults: mergedDefaults\n };\n}\n\nexport function writeGlobalConfig(config: GlobalConfig, configPath?: string): void {\n const filePath = getGlobalConfigPath(configPath);\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, JSON.stringify(config, null, 2) + '\\n', 'utf8');\n}\n\nexport function writeRepoConfig(config: RepoConfig): void {\n const repoRoot = getRepoRoot();\n const targetDir = repoRoot ?? process.cwd();\n fs.writeFileSync(path.join(targetDir, '.pncli.json'), JSON.stringify(config, null, 2) + '\\n', 'utf8');\n}\n\nexport function setConfigValue(key: string, value: string, configPath?: string): void {\n const filePath = getGlobalConfigPath(configPath);\n const existing = loadJsonFile<GlobalConfig>(filePath) ?? {};\n\n const parts = key.split('.');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let current: any = existing;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n if (typeof current[part] !== 'object' || current[part] === null) {\n current[part] = {};\n }\n current = current[part];\n }\n current[parts[parts.length - 1]!] = value;\n\n writeGlobalConfig(existing, configPath);\n}\n\nexport function maskConfig(config: ResolvedConfig): unknown {\n return {\n ...config,\n jira: {\n ...config.jira,\n apiToken: config.jira.apiToken ? '***' : undefined,\n customFields: config.jira.customFields\n },\n bitbucket: {\n ...config.bitbucket,\n pat: config.bitbucket.pat ? '***' : undefined\n },\n confluence: {\n ...config.confluence,\n apiToken: config.confluence.apiToken ? '***' : undefined\n },\n artifactory: {\n ...config.artifactory,\n token: config.artifactory.token ? '***' : undefined\n },\n sonar: {\n ...config.sonar,\n token: config.sonar.token ? '***' : undefined\n },\n sde: {\n baseUrl: config.sde.baseUrl,\n token: config.sde.token ? '***' : undefined\n },\n ado: {\n ...config.ado,\n pat: config.ado.pat ? '***' : undefined\n }\n };\n}\n\nexport { getGlobalConfigPath };\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/services/ado/client/core.ts
|
|
4
|
+
var API = "7.1";
|
|
5
|
+
var AdoCoreClient = class {
|
|
6
|
+
constructor(http) {
|
|
7
|
+
this.http = http;
|
|
8
|
+
}
|
|
9
|
+
http;
|
|
10
|
+
async getConnectionData(collection) {
|
|
11
|
+
const path = collection ? `/${encodeURIComponent(collection)}/_apis/connectionData?api-version=${API}` : `/_apis/connectionData?api-version=${API}`;
|
|
12
|
+
return this.http.ado(path);
|
|
13
|
+
}
|
|
14
|
+
async listCollections() {
|
|
15
|
+
const result = await this.http.ado(
|
|
16
|
+
`/_apis/projectCollections?api-version=${API}`
|
|
17
|
+
);
|
|
18
|
+
return result.value ?? [];
|
|
19
|
+
}
|
|
20
|
+
async listProjects(collection) {
|
|
21
|
+
return this.http.adoPaginate(async (token) => {
|
|
22
|
+
const params = {
|
|
23
|
+
"api-version": API,
|
|
24
|
+
...token ? { continuationToken: token } : {}
|
|
25
|
+
};
|
|
26
|
+
return this.http.adoRaw(
|
|
27
|
+
`/${encodeURIComponent(collection)}/_apis/projects`,
|
|
28
|
+
{ params }
|
|
29
|
+
);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async getProject(collection, projectName) {
|
|
33
|
+
return this.http.ado(
|
|
34
|
+
`/${encodeURIComponent(collection)}/_apis/projects/${encodeURIComponent(projectName)}?api-version=${API}`
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export {
|
|
40
|
+
AdoCoreClient
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=chunk-KT3XINLJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/services/ado/client/core.ts"],"sourcesContent":["import type { HttpClient } from '../../../lib/http.js';\nimport type {\n AdoConnectionData,\n AdoProject,\n AdoProjectCollection,\n AdoPageResponse\n} from '../../../types/ado.js';\n\nconst API = '7.1';\n\nexport class AdoCoreClient {\n constructor(private http: HttpClient) {}\n\n async getConnectionData(collection?: string): Promise<AdoConnectionData> {\n const path = collection\n ? `/${encodeURIComponent(collection)}/_apis/connectionData?api-version=${API}`\n : `/_apis/connectionData?api-version=${API}`;\n return this.http.ado<AdoConnectionData>(path);\n }\n\n async listCollections(): Promise<AdoProjectCollection[]> {\n const result = await this.http.ado<AdoPageResponse<AdoProjectCollection>>(\n `/_apis/projectCollections?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listProjects(collection: string): Promise<AdoProject[]> {\n return this.http.adoPaginate<AdoProject>(async (token) => {\n const params: Record<string, string | number | boolean | undefined> = {\n 'api-version': API,\n ...(token ? { continuationToken: token } : {})\n };\n return this.http.adoRaw(\n `/${encodeURIComponent(collection)}/_apis/projects`,\n { params }\n ) as Promise<{ data: { value: AdoProject[] }; headers: Headers }>;\n });\n }\n\n async getProject(collection: string, projectName: string): Promise<AdoProject> {\n return this.http.ado<AdoProject>(\n `/${encodeURIComponent(collection)}/_apis/projects/${encodeURIComponent(projectName)}?api-version=${API}`\n );\n }\n}\n"],"mappings":";;;AAQA,IAAM,MAAM;AAEL,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAEpB,MAAM,kBAAkB,YAAiD;AACvE,UAAM,OAAO,aACT,IAAI,mBAAmB,UAAU,CAAC,qCAAqC,GAAG,KAC1E,qCAAqC,GAAG;AAC5C,WAAO,KAAK,KAAK,IAAuB,IAAI;AAAA,EAC9C;AAAA,EAEA,MAAM,kBAAmD;AACvD,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,yCAAyC,GAAG;AAAA,IAC9C;AACA,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,aAAa,YAA2C;AAC5D,WAAO,KAAK,KAAK,YAAwB,OAAO,UAAU;AACxD,YAAM,SAAgE;AAAA,QACpE,eAAe;AAAA,QACf,GAAI,QAAQ,EAAE,mBAAmB,MAAM,IAAI,CAAC;AAAA,MAC9C;AACA,aAAO,KAAK,KAAK;AAAA,QACf,IAAI,mBAAmB,UAAU,CAAC;AAAA,QAClC,EAAE,OAAO;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,YAAoB,aAA0C;AAC7E,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,mBAAmB,mBAAmB,WAAW,CAAC,gBAAgB,GAAG;AAAA,IACzG;AAAA,EACF;AACF;","names":[]}
|