@iwonz/ywtc 3.0.0 → 3.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.
- package/CHANGELOG.md +17 -0
- package/README.md +17 -9
- package/dist/cli-arguments.d.ts +1 -0
- package/dist/cli-arguments.js +3 -2
- package/dist/cli-arguments.js.map +1 -1
- package/dist/cli.js +12 -0
- package/dist/cli.js.map +1 -1
- package/dist/clients/confluence-cloud.d.ts +1 -0
- package/dist/clients/confluence-cloud.js +6 -0
- package/dist/clients/confluence-cloud.js.map +1 -1
- package/dist/clients/confluence.d.ts +1 -0
- package/dist/clients/confluence.js +9 -0
- package/dist/clients/confluence.js.map +1 -1
- package/dist/clients/yandex-wiki.d.ts +2 -1
- package/dist/clients/yandex-wiki.js +12 -0
- package/dist/clients/yandex-wiki.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.js +15 -2
- package/dist/config.js.map +1 -1
- package/dist/connection-verifier.d.ts +17 -0
- package/dist/connection-verifier.js +94 -0
- package/dist/connection-verifier.js.map +1 -0
- package/dist/http.d.ts +2 -1
- package/dist/http.js +4 -2
- package/dist/http.js.map +1 -1
- package/dist/init-prompts.d.ts +49 -0
- package/dist/init-prompts.js +63 -0
- package/dist/init-prompts.js.map +1 -0
- package/dist/interactive-config.d.ts +37 -0
- package/dist/interactive-config.js +226 -0
- package/dist/interactive-config.js.map +1 -0
- package/dist/interactive-init.d.ts +20 -0
- package/dist/interactive-init.js +446 -0
- package/dist/interactive-init.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/workspace.d.ts +5 -0
- package/dist/workspace.js +10 -1
- package/dist/workspace.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type AppConfig, type ConnectionProfile, type ConfluenceConnectionProfile, type YandexConnectionProfile } from './config.js';
|
|
2
|
+
export type ConnectionFailureKind = 'authentication' | 'forbidden' | 'not-found' | 'rate-limit' | 'server' | 'timeout' | 'dns' | 'tls' | 'unexpected';
|
|
3
|
+
export interface ConnectionVerification {
|
|
4
|
+
profile: string;
|
|
5
|
+
provider: ConnectionProfile['type'];
|
|
6
|
+
product: string;
|
|
7
|
+
version?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class ConnectionVerificationError extends Error {
|
|
10
|
+
readonly profile: string;
|
|
11
|
+
readonly provider: ConnectionProfile['type'];
|
|
12
|
+
readonly kind: ConnectionFailureKind;
|
|
13
|
+
constructor(profile: string, provider: ConnectionProfile['type'], kind: ConnectionFailureKind, message: string);
|
|
14
|
+
}
|
|
15
|
+
export declare function classifyConnectionFailure(error: unknown): ConnectionFailureKind;
|
|
16
|
+
export declare function verifyConnection(config: AppConfig, profile: ConnectionProfile): Promise<ConnectionVerification>;
|
|
17
|
+
export declare function verifyConnections(config: AppConfig, yandex: YandexConnectionProfile, confluence: ConfluenceConnectionProfile): Promise<[ConnectionVerification, ConnectionVerification]>;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { createConfluenceClient } from './clients/confluence-factory.js';
|
|
2
|
+
import { YandexWikiClient } from './clients/yandex-wiki.js';
|
|
3
|
+
import { secretValues, validateProfileSecrets, } from './config.js';
|
|
4
|
+
import { HttpRequestError } from './http.js';
|
|
5
|
+
import { redact } from './logger.js';
|
|
6
|
+
export class ConnectionVerificationError extends Error {
|
|
7
|
+
profile;
|
|
8
|
+
provider;
|
|
9
|
+
kind;
|
|
10
|
+
constructor(profile, provider, kind, message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.profile = profile;
|
|
13
|
+
this.provider = provider;
|
|
14
|
+
this.kind = kind;
|
|
15
|
+
this.name = 'ConnectionVerificationError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export function classifyConnectionFailure(error) {
|
|
19
|
+
if (error instanceof HttpRequestError) {
|
|
20
|
+
if (error.status === 401)
|
|
21
|
+
return 'authentication';
|
|
22
|
+
if (error.status === 403)
|
|
23
|
+
return 'forbidden';
|
|
24
|
+
if (error.status === 404)
|
|
25
|
+
return 'not-found';
|
|
26
|
+
if (error.status === 429)
|
|
27
|
+
return 'rate-limit';
|
|
28
|
+
if ((error.status ?? 0) >= 500)
|
|
29
|
+
return 'server';
|
|
30
|
+
if (['ECONNABORTED', 'ETIMEDOUT'].includes(error.code ?? ''))
|
|
31
|
+
return 'timeout';
|
|
32
|
+
if (['ENOTFOUND', 'EAI_AGAIN', 'ECONNREFUSED'].includes(error.code ?? ''))
|
|
33
|
+
return 'dns';
|
|
34
|
+
if ([
|
|
35
|
+
'CERT_HAS_EXPIRED',
|
|
36
|
+
'DEPTH_ZERO_SELF_SIGNED_CERT',
|
|
37
|
+
'ERR_TLS_CERT_ALTNAME_INVALID',
|
|
38
|
+
'SELF_SIGNED_CERT_IN_CHAIN',
|
|
39
|
+
'UNABLE_TO_VERIFY_LEAF_SIGNATURE',
|
|
40
|
+
].includes(error.code ?? ''))
|
|
41
|
+
return 'tls';
|
|
42
|
+
}
|
|
43
|
+
return 'unexpected';
|
|
44
|
+
}
|
|
45
|
+
function guidance(kind) {
|
|
46
|
+
switch (kind) {
|
|
47
|
+
case 'authentication': return 'authentication rejected; check the token and authentication type';
|
|
48
|
+
case 'forbidden': return 'access denied; check the organization ID, API access, and account permissions';
|
|
49
|
+
case 'not-found': return 'API route not found; check the base URL and deployment type';
|
|
50
|
+
case 'rate-limit': return 'rate limited after retries; wait or lower the configured request limits';
|
|
51
|
+
case 'server': return 'provider API failed after retries; retry later or inspect the server';
|
|
52
|
+
case 'timeout': return 'connection timed out; check the URL, network, VPN, and timeout setting';
|
|
53
|
+
case 'dns': return 'host could not be reached; check DNS, URL, proxy, and network access';
|
|
54
|
+
case 'tls': return 'TLS verification failed; install the trusted CA through NODE_EXTRA_CA_CERTS';
|
|
55
|
+
case 'unexpected': return 'connection verification failed; check the profile values and provider availability';
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function verificationError(config, profile, error) {
|
|
59
|
+
const kind = classifyConnectionFailure(error);
|
|
60
|
+
const detail = redact(error, secretValues(config));
|
|
61
|
+
return new ConnectionVerificationError(profile.name, profile.type, kind, `${profile.name}: ${guidance(kind)}${detail ? ` (${detail})` : ''}`);
|
|
62
|
+
}
|
|
63
|
+
async function verifyYandex(config, profile) {
|
|
64
|
+
const client = new YandexWikiClient(profile, config.timeoutMs, profile.limits);
|
|
65
|
+
await client.getCurrentUser();
|
|
66
|
+
return { profile: profile.name, provider: profile.type, product: 'Yandex Wiki Public API v1' };
|
|
67
|
+
}
|
|
68
|
+
async function verifyConfluence(config, profile) {
|
|
69
|
+
const client = createConfluenceClient(profile, config.timeoutMs);
|
|
70
|
+
const [, platform] = await Promise.all([client.getCurrentUser(), client.preflight?.()]);
|
|
71
|
+
return {
|
|
72
|
+
profile: profile.name,
|
|
73
|
+
provider: profile.type,
|
|
74
|
+
product: platform?.product ?? 'Confluence',
|
|
75
|
+
...(platform?.version ? { version: platform.version } : {}),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export async function verifyConnection(config, profile) {
|
|
79
|
+
validateProfileSecrets(config, [profile]);
|
|
80
|
+
try {
|
|
81
|
+
return profile.type === 'yandex-wiki'
|
|
82
|
+
? await verifyYandex(config, profile)
|
|
83
|
+
: await verifyConfluence(config, profile);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error instanceof ConnectionVerificationError)
|
|
87
|
+
throw error;
|
|
88
|
+
throw verificationError(config, profile, error);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export async function verifyConnections(config, yandex, confluence) {
|
|
92
|
+
return Promise.all([verifyConnection(config, yandex), verifyConnection(config, confluence)]);
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=connection-verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-verifier.js","sourceRoot":"","sources":["../src/connection-verifier.ts"],"names":[],"mappings":"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"}
|
package/dist/http.d.ts
CHANGED
|
@@ -15,7 +15,8 @@ export declare class HttpRequestError extends Error {
|
|
|
15
15
|
readonly status?: number | undefined;
|
|
16
16
|
readonly method?: string | undefined;
|
|
17
17
|
readonly url?: string | undefined;
|
|
18
|
-
|
|
18
|
+
readonly code?: string | undefined;
|
|
19
|
+
constructor(message: string, status?: number | undefined, method?: string | undefined, url?: string | undefined, code?: string | undefined);
|
|
19
20
|
}
|
|
20
21
|
export declare class RetryingHttpClient {
|
|
21
22
|
private readonly client;
|
package/dist/http.js
CHANGED
|
@@ -3,11 +3,13 @@ export class HttpRequestError extends Error {
|
|
|
3
3
|
status;
|
|
4
4
|
method;
|
|
5
5
|
url;
|
|
6
|
-
|
|
6
|
+
code;
|
|
7
|
+
constructor(message, status, method, url, code) {
|
|
7
8
|
super(message);
|
|
8
9
|
this.status = status;
|
|
9
10
|
this.method = method;
|
|
10
11
|
this.url = url;
|
|
12
|
+
this.code = code;
|
|
11
13
|
this.name = 'HttpRequestError';
|
|
12
14
|
}
|
|
13
15
|
}
|
|
@@ -90,7 +92,7 @@ export class RetryingHttpClient {
|
|
|
90
92
|
if (error.response?.status === 429)
|
|
91
93
|
this.rateLimiter?.pause(delay);
|
|
92
94
|
if (!canRetry || attempt >= this.maxRetries || !isRetriable(error)) {
|
|
93
|
-
throw new HttpRequestError(safeErrorMessage(error), error.response?.status, method, String(axiosConfig.url ?? ''));
|
|
95
|
+
throw new HttpRequestError(safeErrorMessage(error), error.response?.status, method, String(axiosConfig.url ?? ''), error.code);
|
|
94
96
|
}
|
|
95
97
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
96
98
|
}
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAyF,MAAM,OAAO,CAAC;AAgB9G,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAGvB;IACA;IACA;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export declare class WizardCancelledError extends Error {
|
|
2
|
+
constructor();
|
|
3
|
+
}
|
|
4
|
+
interface PromptOption<T extends string> {
|
|
5
|
+
value: T;
|
|
6
|
+
label: string;
|
|
7
|
+
hint?: string;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface BasePromptOptions {
|
|
11
|
+
id: string;
|
|
12
|
+
message: string;
|
|
13
|
+
}
|
|
14
|
+
export interface TextPromptOptions extends BasePromptOptions {
|
|
15
|
+
initialValue?: string;
|
|
16
|
+
placeholder?: string;
|
|
17
|
+
validate?: (value: string) => string | undefined;
|
|
18
|
+
}
|
|
19
|
+
export interface SelectPromptOptions<T extends string> extends BasePromptOptions {
|
|
20
|
+
options: PromptOption<T>[];
|
|
21
|
+
initialValue?: T;
|
|
22
|
+
}
|
|
23
|
+
export interface InitPrompter {
|
|
24
|
+
intro(message: string): void;
|
|
25
|
+
outro(message: string): void;
|
|
26
|
+
cancel(message: string): void;
|
|
27
|
+
note(message: string, title?: string): void;
|
|
28
|
+
info(message: string): void;
|
|
29
|
+
success(message: string): void;
|
|
30
|
+
error(message: string): void;
|
|
31
|
+
text(options: TextPromptOptions): Promise<string>;
|
|
32
|
+
password(options: TextPromptOptions): Promise<string>;
|
|
33
|
+
select<T extends string>(options: SelectPromptOptions<T>): Promise<T>;
|
|
34
|
+
task<T>(message: string, action: () => Promise<T>, success: (value: T) => string): Promise<T>;
|
|
35
|
+
}
|
|
36
|
+
export declare class ClackInitPrompter implements InitPrompter {
|
|
37
|
+
intro(message: string): void;
|
|
38
|
+
outro(message: string): void;
|
|
39
|
+
cancel(message: string): void;
|
|
40
|
+
note(message: string, title?: string): void;
|
|
41
|
+
info(message: string): void;
|
|
42
|
+
success(message: string): void;
|
|
43
|
+
error(message: string): void;
|
|
44
|
+
text(options: TextPromptOptions): Promise<string>;
|
|
45
|
+
password(options: TextPromptOptions): Promise<string>;
|
|
46
|
+
select<T extends string>(options: SelectPromptOptions<T>): Promise<T>;
|
|
47
|
+
task<T>(message: string, action: () => Promise<T>, success: (value: T) => string): Promise<T>;
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as prompts from '@clack/prompts';
|
|
2
|
+
export class WizardCancelledError extends Error {
|
|
3
|
+
constructor() {
|
|
4
|
+
super('Interactive initialization cancelled');
|
|
5
|
+
this.name = 'WizardCancelledError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
function valueOrCancel(value) {
|
|
9
|
+
if (prompts.isCancel(value))
|
|
10
|
+
throw new WizardCancelledError();
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
export class ClackInitPrompter {
|
|
14
|
+
intro(message) { prompts.intro(message); }
|
|
15
|
+
outro(message) { prompts.outro(message); }
|
|
16
|
+
cancel(message) { prompts.cancel(message); }
|
|
17
|
+
note(message, title) { prompts.note(message, title); }
|
|
18
|
+
info(message) { prompts.log.info(message); }
|
|
19
|
+
success(message) { prompts.log.success(message); }
|
|
20
|
+
error(message) { prompts.log.error(message); }
|
|
21
|
+
async text(options) {
|
|
22
|
+
return valueOrCancel(await prompts.text({
|
|
23
|
+
message: options.message,
|
|
24
|
+
...(options.initialValue !== undefined ? { initialValue: options.initialValue } : {}),
|
|
25
|
+
...(options.placeholder !== undefined ? { placeholder: options.placeholder } : {}),
|
|
26
|
+
...(options.validate ? { validate: (value) => options.validate(value ?? '') } : {}),
|
|
27
|
+
}));
|
|
28
|
+
}
|
|
29
|
+
async password(options) {
|
|
30
|
+
return valueOrCancel(await prompts.password({
|
|
31
|
+
message: options.message,
|
|
32
|
+
mask: '•',
|
|
33
|
+
...(options.validate ? { validate: (value) => options.validate(value ?? '') } : {}),
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
async select(options) {
|
|
37
|
+
const value = valueOrCancel(await prompts.select({
|
|
38
|
+
message: options.message,
|
|
39
|
+
options: options.options.map((option) => ({
|
|
40
|
+
value: option.value,
|
|
41
|
+
label: option.label,
|
|
42
|
+
...(option.hint !== undefined ? { hint: option.hint } : {}),
|
|
43
|
+
...(option.disabled !== undefined ? { disabled: option.disabled } : {}),
|
|
44
|
+
})),
|
|
45
|
+
...(options.initialValue !== undefined ? { initialValue: options.initialValue } : {}),
|
|
46
|
+
}));
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
async task(message, action, success) {
|
|
50
|
+
const indicator = prompts.spinner();
|
|
51
|
+
indicator.start(message);
|
|
52
|
+
try {
|
|
53
|
+
const value = await action();
|
|
54
|
+
indicator.stop(success(value));
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
indicator.error(`${message} failed`);
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=init-prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-prompts.js","sourceRoot":"","sources":["../src/init-prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import { Document } from 'yaml';
|
|
3
|
+
import { type AppConfig, type ConfluenceConnectionProfile, type YandexConnectionProfile } from './config.js';
|
|
4
|
+
import { type Workspace } from './workspace.js';
|
|
5
|
+
export interface ExistingInteractiveConfig {
|
|
6
|
+
source: string;
|
|
7
|
+
fingerprint: string;
|
|
8
|
+
mode: number;
|
|
9
|
+
document?: Document;
|
|
10
|
+
config?: AppConfig;
|
|
11
|
+
error?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface InteractiveCommitResult {
|
|
14
|
+
configFile: string;
|
|
15
|
+
backupFile?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface InteractiveFileOperations {
|
|
18
|
+
rename: typeof fs.rename;
|
|
19
|
+
unlink: typeof fs.unlink;
|
|
20
|
+
}
|
|
21
|
+
export declare class InteractiveConfigConflictError extends Error {
|
|
22
|
+
constructor(message: string);
|
|
23
|
+
}
|
|
24
|
+
export declare function defaultYandexProfile(name?: string): YandexConnectionProfile;
|
|
25
|
+
export declare function defaultConfluenceProfile(name?: string): ConfluenceConnectionProfile;
|
|
26
|
+
export declare function createInteractiveConfigDocument(): Document;
|
|
27
|
+
export declare function updateInteractiveProfile(document: Document, previousName: string | undefined, profile: YandexConnectionProfile | ConfluenceConnectionProfile): void;
|
|
28
|
+
export declare function validateInteractiveDocument(document: Document, configFile: string): AppConfig;
|
|
29
|
+
export declare function readExistingInteractiveConfig(workspace: Workspace): Promise<ExistingInteractiveConfig | undefined>;
|
|
30
|
+
export declare function commitInteractiveConfig(input: {
|
|
31
|
+
workspace: Workspace;
|
|
32
|
+
document: Document;
|
|
33
|
+
original?: ExistingInteractiveConfig;
|
|
34
|
+
reset: boolean;
|
|
35
|
+
now?: Date;
|
|
36
|
+
operations?: InteractiveFileOperations;
|
|
37
|
+
}): Promise<InteractiveCommitResult>;
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import * as fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { Document, isMap, isScalar, parseDocument } from 'yaml';
|
|
5
|
+
import { parseWorkspaceConfig, parseWorkspaceConfigYaml, } from './config.js';
|
|
6
|
+
import { ensureWorkspaceDirectories } from './workspace.js';
|
|
7
|
+
const YANDEX_LIMITS = {
|
|
8
|
+
readConcurrency: 4,
|
|
9
|
+
writeConcurrency: 2,
|
|
10
|
+
downloadConcurrency: 2,
|
|
11
|
+
uploadConcurrency: 2,
|
|
12
|
+
requestsPerSecond: 8,
|
|
13
|
+
burst: 8,
|
|
14
|
+
};
|
|
15
|
+
const CONFLUENCE_LIMITS = { ...YANDEX_LIMITS, burst: 10 };
|
|
16
|
+
export class InteractiveConfigConflictError extends Error {
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = 'InteractiveConfigConflictError';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function fingerprint(source) {
|
|
23
|
+
return createHash('sha256').update(source).digest('hex');
|
|
24
|
+
}
|
|
25
|
+
function profileObject(profile) {
|
|
26
|
+
if (profile.type === 'yandex-wiki') {
|
|
27
|
+
return {
|
|
28
|
+
type: profile.type,
|
|
29
|
+
apiUrl: profile.apiUrl,
|
|
30
|
+
webUrl: profile.webUrl,
|
|
31
|
+
authType: profile.authType,
|
|
32
|
+
token: profile.token,
|
|
33
|
+
organization: profile.organization,
|
|
34
|
+
limits: profile.limits,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
type: profile.type,
|
|
39
|
+
deployment: profile.deployment,
|
|
40
|
+
baseUrl: profile.baseUrl,
|
|
41
|
+
authType: profile.authType,
|
|
42
|
+
token: profile.token,
|
|
43
|
+
...(profile.email !== undefined ? { email: profile.email } : {}),
|
|
44
|
+
limits: profile.limits,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function defaultYandexProfile(name = 'yandex') {
|
|
48
|
+
return {
|
|
49
|
+
name,
|
|
50
|
+
type: 'yandex-wiki',
|
|
51
|
+
apiUrl: 'https://api.wiki.yandex.net/v1',
|
|
52
|
+
webUrl: 'https://wiki.yandex.ru',
|
|
53
|
+
authType: 'oauth',
|
|
54
|
+
token: '',
|
|
55
|
+
organization: { type: 'yandex360', id: '' },
|
|
56
|
+
limits: { ...YANDEX_LIMITS },
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function defaultConfluenceProfile(name = 'confluence') {
|
|
60
|
+
return {
|
|
61
|
+
name,
|
|
62
|
+
type: 'confluence',
|
|
63
|
+
deployment: 'data-center',
|
|
64
|
+
baseUrl: '',
|
|
65
|
+
authType: 'pat',
|
|
66
|
+
token: '',
|
|
67
|
+
limits: { ...CONFLUENCE_LIMITS },
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function createInteractiveConfigDocument() {
|
|
71
|
+
return new Document({
|
|
72
|
+
defaults: { timeoutMs: 30_000, concurrency: 4 },
|
|
73
|
+
connections: {},
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function setProfileScalars(document, previousName, profile) {
|
|
77
|
+
const base = ['connections', profile.name];
|
|
78
|
+
let sameProfile = previousName === profile.name && document.hasIn(base);
|
|
79
|
+
if (previousName && previousName !== profile.name) {
|
|
80
|
+
const connections = document.getIn(['connections'], true);
|
|
81
|
+
const existing = isMap(connections)
|
|
82
|
+
? connections.items.find((item) => isScalar(item.key) && item.key.value === previousName)
|
|
83
|
+
: undefined;
|
|
84
|
+
if (existing && isScalar(existing.key)) {
|
|
85
|
+
existing.key.value = profile.name;
|
|
86
|
+
sameProfile = true;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
document.deleteIn(['connections', previousName]);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (!sameProfile) {
|
|
93
|
+
document.setIn(base, profileObject(profile));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
document.setIn([...base, 'type'], profile.type);
|
|
97
|
+
document.setIn([...base, 'token'], profile.token);
|
|
98
|
+
if (profile.type === 'yandex-wiki') {
|
|
99
|
+
document.setIn([...base, 'apiUrl'], profile.apiUrl);
|
|
100
|
+
document.setIn([...base, 'webUrl'], profile.webUrl);
|
|
101
|
+
document.setIn([...base, 'authType'], profile.authType);
|
|
102
|
+
document.setIn([...base, 'organization', 'type'], profile.organization.type);
|
|
103
|
+
document.setIn([...base, 'organization', 'id'], profile.organization.id);
|
|
104
|
+
for (const key of ['deployment', 'baseUrl', 'email'])
|
|
105
|
+
document.deleteIn([...base, key]);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
document.setIn([...base, 'deployment'], profile.deployment);
|
|
109
|
+
document.setIn([...base, 'baseUrl'], profile.baseUrl);
|
|
110
|
+
document.setIn([...base, 'authType'], profile.authType);
|
|
111
|
+
if (profile.email !== undefined)
|
|
112
|
+
document.setIn([...base, 'email'], profile.email);
|
|
113
|
+
else
|
|
114
|
+
document.deleteIn([...base, 'email']);
|
|
115
|
+
for (const key of ['apiUrl', 'webUrl', 'organization'])
|
|
116
|
+
document.deleteIn([...base, key]);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export function updateInteractiveProfile(document, previousName, profile) {
|
|
120
|
+
setProfileScalars(document, previousName, profile);
|
|
121
|
+
}
|
|
122
|
+
export function validateInteractiveDocument(document, configFile) {
|
|
123
|
+
if (document.errors.length > 0)
|
|
124
|
+
throw new Error(`Cannot parse workspace configuration: ${configFile}`);
|
|
125
|
+
return parseWorkspaceConfig(document.toJS(), configFile);
|
|
126
|
+
}
|
|
127
|
+
export async function readExistingInteractiveConfig(workspace) {
|
|
128
|
+
let source;
|
|
129
|
+
let mode;
|
|
130
|
+
try {
|
|
131
|
+
[source, mode] = await Promise.all([
|
|
132
|
+
fs.readFile(workspace.configFile, 'utf8'),
|
|
133
|
+
fs.stat(workspace.configFile).then((value) => value.mode & 0o777),
|
|
134
|
+
]);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (error.code === 'ENOENT')
|
|
138
|
+
return undefined;
|
|
139
|
+
throw error;
|
|
140
|
+
}
|
|
141
|
+
const base = { source, fingerprint: fingerprint(source), mode };
|
|
142
|
+
try {
|
|
143
|
+
const document = parseDocument(source);
|
|
144
|
+
const config = validateInteractiveDocument(document, workspace.configFile);
|
|
145
|
+
return { ...base, document, config };
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
return { ...base, error: error instanceof Error ? error.message : String(error) };
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
function serialized(document) {
|
|
152
|
+
const value = document.toString({ lineWidth: 0 });
|
|
153
|
+
return value.endsWith('\n') ? value : `${value}\n`;
|
|
154
|
+
}
|
|
155
|
+
function backupTimestamp(now) {
|
|
156
|
+
return now.toISOString().replaceAll(/[-:]/g, '').replace('.', '-').replace('Z', 'Z');
|
|
157
|
+
}
|
|
158
|
+
async function unchanged(workspace, original) {
|
|
159
|
+
try {
|
|
160
|
+
const current = await fs.readFile(workspace.configFile, 'utf8');
|
|
161
|
+
return original !== undefined && fingerprint(current) === original.fingerprint;
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
if (error.code === 'ENOENT')
|
|
165
|
+
return original === undefined;
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async function replaceConfig(tempFile, workspace, operations) {
|
|
170
|
+
try {
|
|
171
|
+
await operations.rename(tempFile, workspace.configFile);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
if (!['EEXIST', 'EPERM'].includes(error.code ?? ''))
|
|
175
|
+
throw error;
|
|
176
|
+
const rollback = path.join(workspace.statesDirectory, `.config-rollback-${randomUUID()}.yaml`);
|
|
177
|
+
await operations.rename(workspace.configFile, rollback);
|
|
178
|
+
try {
|
|
179
|
+
await operations.rename(tempFile, workspace.configFile);
|
|
180
|
+
await operations.unlink(rollback);
|
|
181
|
+
}
|
|
182
|
+
catch (replacementError) {
|
|
183
|
+
await operations.rename(rollback, workspace.configFile);
|
|
184
|
+
throw replacementError;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
export async function commitInteractiveConfig(input) {
|
|
189
|
+
const { workspace, document, original, reset } = input;
|
|
190
|
+
const source = serialized(document);
|
|
191
|
+
parseWorkspaceConfigYaml(source, workspace.configFile);
|
|
192
|
+
if (!await unchanged(workspace, original)) {
|
|
193
|
+
throw new InteractiveConfigConflictError(`Configuration changed during setup: ${workspace.configFile}. Restart the wizard.`);
|
|
194
|
+
}
|
|
195
|
+
await ensureWorkspaceDirectories(workspace);
|
|
196
|
+
let backupFile;
|
|
197
|
+
if (reset && original) {
|
|
198
|
+
const backups = path.join(workspace.statesDirectory, 'backups');
|
|
199
|
+
await fs.mkdir(backups, { recursive: true, mode: 0o700 });
|
|
200
|
+
backupFile = path.join(backups, `ywtc.config.${backupTimestamp(input.now ?? new Date())}.${randomUUID().slice(0, 8)}.backup.yaml`);
|
|
201
|
+
await fs.writeFile(backupFile, original.source, { encoding: 'utf8', flag: 'wx', mode: 0o600 });
|
|
202
|
+
}
|
|
203
|
+
const tempFile = path.join(workspace.statesDirectory, `.config-${randomUUID()}.tmp`);
|
|
204
|
+
try {
|
|
205
|
+
await fs.writeFile(tempFile, source, { encoding: 'utf8', flag: 'wx', mode: 0o600 });
|
|
206
|
+
if (original)
|
|
207
|
+
await fs.chmod(tempFile, original.mode);
|
|
208
|
+
parseWorkspaceConfigYaml(await fs.readFile(tempFile, 'utf8'), workspace.configFile);
|
|
209
|
+
const handle = await fs.open(tempFile, 'r+');
|
|
210
|
+
try {
|
|
211
|
+
await handle.sync();
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
await handle.close();
|
|
215
|
+
}
|
|
216
|
+
await replaceConfig(tempFile, workspace, input.operations ?? fs);
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
await (input.operations ?? fs).unlink(tempFile).catch((error) => {
|
|
220
|
+
if (error.code !== 'ENOENT')
|
|
221
|
+
throw error;
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
return { configFile: workspace.configFile, ...(backupFile ? { backupFile } : {}) };
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=interactive-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive-config.js","sourceRoot":"","sources":["../src/interactive-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { verifyConnection } from './connection-verifier.js';
|
|
2
|
+
import { type InitPrompter } from './init-prompts.js';
|
|
3
|
+
import { type Workspace } from './workspace.js';
|
|
4
|
+
export interface InteractiveInitResult {
|
|
5
|
+
status: 'completed' | 'cancelled' | 'no-op';
|
|
6
|
+
code: 0 | 130;
|
|
7
|
+
workspace?: Workspace;
|
|
8
|
+
configFile?: string;
|
|
9
|
+
backupFile?: string;
|
|
10
|
+
dryRunCommand?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface InteractiveInitOptions {
|
|
13
|
+
workdir?: string;
|
|
14
|
+
cwd?: string;
|
|
15
|
+
homeDirectory?: string;
|
|
16
|
+
prompter: InitPrompter;
|
|
17
|
+
verify?: typeof verifyConnection;
|
|
18
|
+
}
|
|
19
|
+
export declare function assertInteractiveTerminal(inputIsTTY: boolean | undefined, outputIsTTY: boolean | undefined): void;
|
|
20
|
+
export declare function runInteractiveInit(options: InteractiveInitOptions): Promise<InteractiveInitResult>;
|