@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,446 @@
|
|
|
1
|
+
import { verifyConnection, ConnectionVerificationError } from './connection-verifier.js';
|
|
2
|
+
import { commitInteractiveConfig, createInteractiveConfigDocument, defaultConfluenceProfile, defaultYandexProfile, readExistingInteractiveConfig, updateInteractiveProfile, validateInteractiveDocument, } from './interactive-config.js';
|
|
3
|
+
import { WizardCancelledError } from './init-prompts.js';
|
|
4
|
+
import { redact } from './logger.js';
|
|
5
|
+
import { resolveInitWorkspace } from './workspace.js';
|
|
6
|
+
class InteractiveTerminalError extends Error {
|
|
7
|
+
constructor() {
|
|
8
|
+
super('init --interactive requires an interactive TTY. Run "ywtc init" and edit ywtc.config.yaml for non-interactive setup.');
|
|
9
|
+
this.name = 'InteractiveTerminalError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function assertInteractiveTerminal(inputIsTTY, outputIsTTY) {
|
|
13
|
+
if (!inputIsTTY || !outputIsTTY)
|
|
14
|
+
throw new InteractiveTerminalError();
|
|
15
|
+
}
|
|
16
|
+
function required(value) {
|
|
17
|
+
return value.trim() ? undefined : 'Value is required.';
|
|
18
|
+
}
|
|
19
|
+
function profileName(value) {
|
|
20
|
+
return /^[a-z0-9][a-z0-9._-]*$/.test(value.trim())
|
|
21
|
+
? undefined
|
|
22
|
+
: 'Use lowercase letters, digits, dots, underscores, or dashes; start with a letter or digit.';
|
|
23
|
+
}
|
|
24
|
+
function httpUrl(value) {
|
|
25
|
+
try {
|
|
26
|
+
const url = new URL(value.trim());
|
|
27
|
+
return ['http:', 'https:'].includes(url.protocol) ? undefined : 'Use an absolute HTTP(S) URL.';
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return 'Use an absolute HTTP(S) URL.';
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function email(value) {
|
|
34
|
+
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value.trim()) ? undefined : 'Enter a valid email address.';
|
|
35
|
+
}
|
|
36
|
+
function withoutTrailingSlash(value) {
|
|
37
|
+
return value.trim().replace(/\/+$/, '');
|
|
38
|
+
}
|
|
39
|
+
function availableName(base, used) {
|
|
40
|
+
if (!used.has(base))
|
|
41
|
+
return base;
|
|
42
|
+
for (let suffix = 2;; suffix += 1) {
|
|
43
|
+
const candidate = `${base}-${suffix}`;
|
|
44
|
+
if (!used.has(candidate))
|
|
45
|
+
return candidate;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function usedProfileNames(context, excluding = []) {
|
|
49
|
+
const names = new Set(Object.keys(context.baseConfig?.profiles ?? {}));
|
|
50
|
+
for (const name of excluding)
|
|
51
|
+
names.delete(name);
|
|
52
|
+
if (!excluding.includes(context.yandex?.profile.name ?? ''))
|
|
53
|
+
names.add(context.yandex?.profile.name ?? '');
|
|
54
|
+
if (!excluding.includes(context.confluence?.profile.name ?? ''))
|
|
55
|
+
names.add(context.confluence?.profile.name ?? '');
|
|
56
|
+
names.delete('');
|
|
57
|
+
return names;
|
|
58
|
+
}
|
|
59
|
+
function uniqueProfileName(context, ...excluding) {
|
|
60
|
+
return (value) => {
|
|
61
|
+
const syntax = profileName(value);
|
|
62
|
+
if (syntax)
|
|
63
|
+
return syntax;
|
|
64
|
+
if (usedProfileNames(context, excluding.filter((item) => Boolean(item))).has(value.trim()))
|
|
65
|
+
return 'Another connection already uses this name.';
|
|
66
|
+
return undefined;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async function navigation(prompter, id, canBack = true) {
|
|
70
|
+
return prompter.select({
|
|
71
|
+
id,
|
|
72
|
+
message: 'Next step',
|
|
73
|
+
options: [
|
|
74
|
+
{ value: 'continue', label: 'Continue' },
|
|
75
|
+
...(canBack ? [{ value: 'back', label: 'Back' }] : []),
|
|
76
|
+
{ value: 'cancel', label: 'Cancel' },
|
|
77
|
+
],
|
|
78
|
+
initialValue: 'continue',
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async function selectExistingProfile(input) {
|
|
82
|
+
if (input.context.mode !== 'edit')
|
|
83
|
+
return input.current;
|
|
84
|
+
const profiles = Object.values(input.context.baseConfig?.profiles ?? {}).filter((profile) => profile.type === input.type);
|
|
85
|
+
const currentIsUnsaved = input.current !== undefined
|
|
86
|
+
&& input.current.previousName === undefined
|
|
87
|
+
&& !profiles.some((profile) => profile.name === input.current?.profile.name);
|
|
88
|
+
const choices = [
|
|
89
|
+
...profiles.map((profile) => ({ value: profile.name, label: profile.name, hint: 'existing' })),
|
|
90
|
+
...(currentIsUnsaved ? [{ value: '__draft__', label: input.current.profile.name, hint: 'current draft' }] : []),
|
|
91
|
+
{ value: '__new__', label: `Add ${input.label} connection`, hint: 'new profile' },
|
|
92
|
+
];
|
|
93
|
+
const selected = await input.prompter.select({
|
|
94
|
+
id: input.id,
|
|
95
|
+
message: `${input.label} profile to configure`,
|
|
96
|
+
options: choices,
|
|
97
|
+
initialValue: input.current?.previousName ?? (currentIsUnsaved ? '__draft__' : input.current?.profile.name) ?? profiles[0]?.name ?? '__new__',
|
|
98
|
+
});
|
|
99
|
+
if (selected === '__new__') {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
if (selected === '__draft__'
|
|
103
|
+
|| selected === input.current?.previousName
|
|
104
|
+
|| selected === input.current?.profile.name) {
|
|
105
|
+
return input.current;
|
|
106
|
+
}
|
|
107
|
+
const profile = input.context.baseConfig?.profiles[selected];
|
|
108
|
+
return profile?.type === input.type ? { profile: profile, previousName: selected } : undefined;
|
|
109
|
+
}
|
|
110
|
+
async function yandexStep(context, prompter) {
|
|
111
|
+
prompter.info('Step 2 of 4 · Yandex Wiki');
|
|
112
|
+
const selected = await selectExistingProfile({
|
|
113
|
+
context, prompter, type: 'yandex-wiki', ...(context.yandex ? { current: context.yandex } : {}), id: 'yandex.profile', label: 'Yandex Wiki',
|
|
114
|
+
});
|
|
115
|
+
const draft = selected === null
|
|
116
|
+
? defaultYandexProfile(availableName('yandex', usedProfileNames(context, [context.yandex?.profile.name ?? ''])))
|
|
117
|
+
: selected?.profile ?? context.yandex?.profile ?? defaultYandexProfile(availableName('yandex', usedProfileNames(context)));
|
|
118
|
+
const previousName = selected?.previousName;
|
|
119
|
+
const name = (await prompter.text({
|
|
120
|
+
id: 'yandex.name', message: 'Yandex Wiki profile name', initialValue: draft.name,
|
|
121
|
+
validate: uniqueProfileName(context, previousName, context.yandex?.profile.name),
|
|
122
|
+
})).trim();
|
|
123
|
+
const apiUrl = withoutTrailingSlash(await prompter.text({
|
|
124
|
+
id: 'yandex.apiUrl', message: 'Yandex Wiki API URL', initialValue: draft.apiUrl, validate: httpUrl,
|
|
125
|
+
}));
|
|
126
|
+
const webUrl = withoutTrailingSlash(await prompter.text({
|
|
127
|
+
id: 'yandex.webUrl', message: 'Yandex Wiki web URL', initialValue: draft.webUrl, validate: httpUrl,
|
|
128
|
+
}));
|
|
129
|
+
const authType = await prompter.select({
|
|
130
|
+
id: 'yandex.authType', message: 'Yandex authentication', initialValue: draft.authType,
|
|
131
|
+
options: [
|
|
132
|
+
{ value: 'oauth', label: 'OAuth', hint: 'Yandex 360 or Identity Hub' },
|
|
133
|
+
{ value: 'iam', label: 'IAM token', hint: 'Yandex Cloud only' },
|
|
134
|
+
],
|
|
135
|
+
});
|
|
136
|
+
const organizationType = authType === 'iam'
|
|
137
|
+
? 'cloud'
|
|
138
|
+
: await prompter.select({
|
|
139
|
+
id: 'yandex.organization.type', message: 'Yandex organization type', initialValue: draft.organization.type,
|
|
140
|
+
options: [
|
|
141
|
+
{ value: 'yandex360', label: 'Yandex 360' },
|
|
142
|
+
{ value: 'cloud', label: 'Yandex Cloud / Identity Hub' },
|
|
143
|
+
],
|
|
144
|
+
});
|
|
145
|
+
if (authType === 'iam')
|
|
146
|
+
prompter.info('IAM uses the Yandex Cloud organization header.');
|
|
147
|
+
const organizationId = (await prompter.text({
|
|
148
|
+
id: 'yandex.organization.id', message: 'Yandex organization ID', initialValue: draft.organization.id, validate: required,
|
|
149
|
+
})).trim();
|
|
150
|
+
const enteredToken = await prompter.password({
|
|
151
|
+
id: 'yandex.token',
|
|
152
|
+
message: draft.token ? 'Yandex token (leave empty to keep the configured token)' : 'Yandex token',
|
|
153
|
+
validate: (value) => draft.token || value.trim() ? undefined : 'Token is required.',
|
|
154
|
+
});
|
|
155
|
+
context.yandex = {
|
|
156
|
+
...(previousName ? { previousName } : {}),
|
|
157
|
+
profile: {
|
|
158
|
+
...draft,
|
|
159
|
+
name,
|
|
160
|
+
apiUrl,
|
|
161
|
+
webUrl,
|
|
162
|
+
authType,
|
|
163
|
+
token: enteredToken.trim() || draft.token,
|
|
164
|
+
organization: { type: organizationType, id: organizationId },
|
|
165
|
+
},
|
|
166
|
+
};
|
|
167
|
+
return navigation(prompter, 'yandex.navigation');
|
|
168
|
+
}
|
|
169
|
+
async function confluenceStep(context, prompter) {
|
|
170
|
+
prompter.info('Step 3 of 4 · Confluence');
|
|
171
|
+
const selected = await selectExistingProfile({
|
|
172
|
+
context, prompter, type: 'confluence', ...(context.confluence ? { current: context.confluence } : {}), id: 'confluence.profile', label: 'Confluence',
|
|
173
|
+
});
|
|
174
|
+
const draft = selected === null
|
|
175
|
+
? defaultConfluenceProfile(availableName('confluence', usedProfileNames(context, [context.confluence?.profile.name ?? ''])))
|
|
176
|
+
: selected?.profile ?? context.confluence?.profile ?? defaultConfluenceProfile(availableName('confluence', usedProfileNames(context)));
|
|
177
|
+
const previousName = selected?.previousName;
|
|
178
|
+
const name = (await prompter.text({
|
|
179
|
+
id: 'confluence.name', message: 'Confluence profile name', initialValue: draft.name,
|
|
180
|
+
validate: uniqueProfileName(context, previousName, context.confluence?.profile.name),
|
|
181
|
+
})).trim();
|
|
182
|
+
const deployment = await prompter.select({
|
|
183
|
+
id: 'confluence.deployment', message: 'Confluence deployment', initialValue: draft.deployment,
|
|
184
|
+
options: [
|
|
185
|
+
{ value: 'data-center', label: 'Data Center', hint: 'PAT authentication' },
|
|
186
|
+
{ value: 'cloud', label: 'Cloud', hint: 'email and Atlassian API token' },
|
|
187
|
+
],
|
|
188
|
+
});
|
|
189
|
+
const baseUrl = withoutTrailingSlash(await prompter.text({
|
|
190
|
+
id: 'confluence.baseUrl',
|
|
191
|
+
message: 'Confluence base URL',
|
|
192
|
+
initialValue: draft.baseUrl,
|
|
193
|
+
placeholder: deployment === 'cloud' ? 'https://example.atlassian.net' : 'https://confluence.example.com/confluence',
|
|
194
|
+
validate: (value) => required(value) ?? httpUrl(value),
|
|
195
|
+
}));
|
|
196
|
+
const cloudEmail = deployment === 'cloud'
|
|
197
|
+
? (await prompter.text({
|
|
198
|
+
id: 'confluence.email', message: 'Atlassian account email', initialValue: draft.email ?? '', validate: email,
|
|
199
|
+
})).trim()
|
|
200
|
+
: undefined;
|
|
201
|
+
const enteredToken = await prompter.password({
|
|
202
|
+
id: 'confluence.token',
|
|
203
|
+
message: draft.token
|
|
204
|
+
? `Confluence ${deployment === 'cloud' ? 'API token' : 'PAT'} (leave empty to keep the configured token)`
|
|
205
|
+
: `Confluence ${deployment === 'cloud' ? 'API token' : 'PAT'}`,
|
|
206
|
+
validate: (value) => draft.token || value.trim() ? undefined : 'Token is required.',
|
|
207
|
+
});
|
|
208
|
+
context.confluence = {
|
|
209
|
+
...(previousName ? { previousName } : {}),
|
|
210
|
+
profile: {
|
|
211
|
+
...draft,
|
|
212
|
+
name,
|
|
213
|
+
deployment,
|
|
214
|
+
baseUrl,
|
|
215
|
+
authType: deployment === 'cloud' ? 'api-token' : 'pat',
|
|
216
|
+
token: enteredToken.trim() || draft.token,
|
|
217
|
+
...(cloudEmail !== undefined ? { email: cloudEmail } : {}),
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
if (deployment === 'data-center')
|
|
221
|
+
delete context.confluence.profile.email;
|
|
222
|
+
return navigation(prompter, 'confluence.navigation');
|
|
223
|
+
}
|
|
224
|
+
function buildDocument(context) {
|
|
225
|
+
if (!context.yandex || !context.confluence)
|
|
226
|
+
throw new Error('Both connection stages must be complete.');
|
|
227
|
+
const document = context.baseDocument.clone();
|
|
228
|
+
updateInteractiveProfile(document, context.yandex.previousName, context.yandex.profile);
|
|
229
|
+
updateInteractiveProfile(document, context.confluence.previousName, context.confluence.profile);
|
|
230
|
+
return document;
|
|
231
|
+
}
|
|
232
|
+
function selectedProfiles(config, context) {
|
|
233
|
+
const yandex = config.profiles[context.yandex.profile.name];
|
|
234
|
+
const confluence = config.profiles[context.confluence.profile.name];
|
|
235
|
+
if (yandex?.type !== 'yandex-wiki' || confluence?.type !== 'confluence') {
|
|
236
|
+
throw new Error('Configured connection profiles could not be resolved.');
|
|
237
|
+
}
|
|
238
|
+
return [yandex, confluence];
|
|
239
|
+
}
|
|
240
|
+
function review(context) {
|
|
241
|
+
const yandex = context.yandex.profile;
|
|
242
|
+
const confluence = context.confluence.profile;
|
|
243
|
+
return [
|
|
244
|
+
`Workdir: ${context.workspace.root}`,
|
|
245
|
+
`Yandex Wiki: ${yandex.name} · ${yandex.authType} · ${yandex.organization.type} · ${yandex.webUrl}`,
|
|
246
|
+
`Confluence: ${confluence.name} · ${confluence.deployment} · ${confluence.baseUrl}`,
|
|
247
|
+
'Credentials: configured and hidden',
|
|
248
|
+
].join('\n');
|
|
249
|
+
}
|
|
250
|
+
function firstDryRun(context) {
|
|
251
|
+
const workdir = JSON.stringify(context.workspace.root);
|
|
252
|
+
const sourceProfile = JSON.stringify(context.yandex.profile.name);
|
|
253
|
+
const destinationProfile = JSON.stringify(context.confluence.profile.name);
|
|
254
|
+
return `ywtc migrate --source "<yandex-page-url-or-slug>" --source-profile ${sourceProfile} --destination "<confluence-page-url-or-id>" --destination-profile ${destinationProfile} --scope subtree --dry-run --workdir ${workdir}`;
|
|
255
|
+
}
|
|
256
|
+
async function workspaceStep(options, prior) {
|
|
257
|
+
const { prompter } = options;
|
|
258
|
+
prompter.info('Step 1 of 4 · Workspace');
|
|
259
|
+
let initialPath = prior?.workspace.root ?? options.workdir ?? '~/.ywtc';
|
|
260
|
+
while (true) {
|
|
261
|
+
const selectedPath = (await prompter.text({
|
|
262
|
+
id: 'workspace.path', message: 'Working directory', initialValue: initialPath, validate: required,
|
|
263
|
+
})).trim();
|
|
264
|
+
let workspace;
|
|
265
|
+
try {
|
|
266
|
+
workspace = resolveInitWorkspace({
|
|
267
|
+
explicit: selectedPath,
|
|
268
|
+
...(options.cwd ? { cwd: options.cwd } : {}),
|
|
269
|
+
...(options.homeDirectory ? { homeDirectory: options.homeDirectory } : {}),
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
prompter.error(error instanceof Error ? error.message : String(error));
|
|
274
|
+
initialPath = selectedPath;
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
const original = await readExistingInteractiveConfig(workspace);
|
|
278
|
+
if (!original) {
|
|
279
|
+
const same = prior?.workspace.root === workspace.root && prior.mode === 'new';
|
|
280
|
+
return same ? prior : { workspace, mode: 'new', baseDocument: createInteractiveConfigDocument() };
|
|
281
|
+
}
|
|
282
|
+
if (original.error)
|
|
283
|
+
prompter.error(`Existing configuration is invalid: ${original.error}`);
|
|
284
|
+
const action = await prompter.select({
|
|
285
|
+
id: 'workspace.action',
|
|
286
|
+
message: `Workspace already exists at ${workspace.root}`,
|
|
287
|
+
options: [
|
|
288
|
+
...(!original.error ? [{ value: 'edit', label: 'Change connection settings', hint: 'preserve other profiles and state' }] : []),
|
|
289
|
+
{ value: 'reset', label: 'Configure from scratch', hint: 'backup config; preserve .states' },
|
|
290
|
+
{ value: 'change', label: 'Choose another directory' },
|
|
291
|
+
{ value: 'exit', label: 'Do nothing and exit' },
|
|
292
|
+
],
|
|
293
|
+
initialValue: original.error ? 'reset' : 'edit',
|
|
294
|
+
});
|
|
295
|
+
if (action === 'exit') {
|
|
296
|
+
prompter.outro('Workspace left unchanged.');
|
|
297
|
+
return { status: 'no-op', code: 0, workspace };
|
|
298
|
+
}
|
|
299
|
+
if (action === 'change') {
|
|
300
|
+
initialPath = workspace.root;
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
const same = prior?.workspace.root === workspace.root && prior.mode === action
|
|
304
|
+
&& prior.original?.fingerprint === original.fingerprint;
|
|
305
|
+
if (same)
|
|
306
|
+
return prior;
|
|
307
|
+
if (action === 'edit' && original.document && original.config) {
|
|
308
|
+
return {
|
|
309
|
+
workspace,
|
|
310
|
+
mode: 'edit',
|
|
311
|
+
original,
|
|
312
|
+
baseDocument: original.document.clone(),
|
|
313
|
+
baseConfig: original.config,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
return { workspace, mode: 'reset', original, baseDocument: createInteractiveConfigDocument() };
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
async function verifyAndCommit(context, prompter, verify) {
|
|
320
|
+
prompter.info('Step 4 of 4 · Review and verify');
|
|
321
|
+
prompter.note(review(context), 'Configuration summary');
|
|
322
|
+
const action = await prompter.select({
|
|
323
|
+
id: 'review.action',
|
|
324
|
+
message: 'Review action',
|
|
325
|
+
options: [
|
|
326
|
+
{ value: 'save', label: 'Verify connections and save' },
|
|
327
|
+
{ value: 'yandex', label: 'Back to Yandex Wiki' },
|
|
328
|
+
{ value: 'confluence', label: 'Back to Confluence' },
|
|
329
|
+
{ value: 'workspace', label: 'Back to workspace' },
|
|
330
|
+
{ value: 'cancel', label: 'Cancel' },
|
|
331
|
+
],
|
|
332
|
+
initialValue: 'save',
|
|
333
|
+
});
|
|
334
|
+
if (action === 'workspace')
|
|
335
|
+
return 0;
|
|
336
|
+
if (action === 'yandex')
|
|
337
|
+
return 1;
|
|
338
|
+
if (action === 'confluence')
|
|
339
|
+
return 2;
|
|
340
|
+
if (action === 'cancel')
|
|
341
|
+
throw new WizardCancelledError();
|
|
342
|
+
const document = buildDocument(context);
|
|
343
|
+
const config = validateInteractiveDocument(document, context.workspace.configFile);
|
|
344
|
+
const [yandex, confluence] = selectedProfiles(config, context);
|
|
345
|
+
while (true) {
|
|
346
|
+
try {
|
|
347
|
+
await prompter.task('Checking Yandex Wiki API and credentials', () => verify(config, yandex), verifiedLabel);
|
|
348
|
+
await prompter.task('Checking Confluence API and credentials', () => verify(config, confluence), verifiedLabel);
|
|
349
|
+
break;
|
|
350
|
+
}
|
|
351
|
+
catch (error) {
|
|
352
|
+
const safe = redact(error, [yandex.token, confluence.token, confluence.email ?? '']);
|
|
353
|
+
prompter.error(safe);
|
|
354
|
+
const failureAction = await prompter.select({
|
|
355
|
+
id: 'verification.failure',
|
|
356
|
+
message: 'Connection verification failed',
|
|
357
|
+
options: [
|
|
358
|
+
{ value: 'retry', label: 'Retry' },
|
|
359
|
+
{ value: 'yandex', label: 'Edit Yandex Wiki' },
|
|
360
|
+
{ value: 'confluence', label: 'Edit Confluence' },
|
|
361
|
+
{ value: 'workspace', label: 'Back to workspace' },
|
|
362
|
+
{ value: 'cancel', label: 'Cancel' },
|
|
363
|
+
],
|
|
364
|
+
initialValue: error instanceof ConnectionVerificationError && error.provider === 'confluence' ? 'confluence' : 'yandex',
|
|
365
|
+
});
|
|
366
|
+
if (failureAction === 'retry')
|
|
367
|
+
continue;
|
|
368
|
+
if (failureAction === 'workspace')
|
|
369
|
+
return 0;
|
|
370
|
+
if (failureAction === 'yandex')
|
|
371
|
+
return 1;
|
|
372
|
+
if (failureAction === 'confluence')
|
|
373
|
+
return 2;
|
|
374
|
+
throw new WizardCancelledError();
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
const committed = await prompter.task('Saving verified workspace configuration', () => commitInteractiveConfig({
|
|
378
|
+
workspace: context.workspace,
|
|
379
|
+
document,
|
|
380
|
+
...(context.original ? { original: context.original } : {}),
|
|
381
|
+
reset: context.mode === 'reset',
|
|
382
|
+
}), () => 'Workspace configuration saved');
|
|
383
|
+
const dryRunCommand = firstDryRun(context);
|
|
384
|
+
prompter.success(`Config: ${committed.configFile}`);
|
|
385
|
+
if (committed.backupFile)
|
|
386
|
+
prompter.info(`Backup: ${committed.backupFile}`);
|
|
387
|
+
prompter.note(dryRunCommand, 'First migration dry-run');
|
|
388
|
+
prompter.info('Connection checks passed. Page-specific read/write access is checked by doctor or migrate.');
|
|
389
|
+
prompter.outro('ywtc workspace is ready.');
|
|
390
|
+
return {
|
|
391
|
+
status: 'completed',
|
|
392
|
+
code: 0,
|
|
393
|
+
workspace: context.workspace,
|
|
394
|
+
configFile: committed.configFile,
|
|
395
|
+
...(committed.backupFile ? { backupFile: committed.backupFile } : {}),
|
|
396
|
+
dryRunCommand,
|
|
397
|
+
};
|
|
398
|
+
}
|
|
399
|
+
function verifiedLabel(value) {
|
|
400
|
+
return `${value.product}${value.version ? ` ${value.version}` : ''} authenticated`;
|
|
401
|
+
}
|
|
402
|
+
export async function runInteractiveInit(options) {
|
|
403
|
+
const { prompter } = options;
|
|
404
|
+
prompter.intro('ywtc interactive setup');
|
|
405
|
+
let context;
|
|
406
|
+
let step = 0;
|
|
407
|
+
try {
|
|
408
|
+
while (true) {
|
|
409
|
+
if (step === 0) {
|
|
410
|
+
const result = await workspaceStep(options, context);
|
|
411
|
+
if ('status' in result)
|
|
412
|
+
return result;
|
|
413
|
+
context = result;
|
|
414
|
+
step = 1;
|
|
415
|
+
continue;
|
|
416
|
+
}
|
|
417
|
+
if (!context)
|
|
418
|
+
throw new Error('Workspace step did not complete.');
|
|
419
|
+
if (step === 1) {
|
|
420
|
+
const next = await yandexStep(context, prompter);
|
|
421
|
+
if (next === 'cancel')
|
|
422
|
+
throw new WizardCancelledError();
|
|
423
|
+
step = next === 'back' ? 0 : 2;
|
|
424
|
+
continue;
|
|
425
|
+
}
|
|
426
|
+
if (step === 2) {
|
|
427
|
+
const next = await confluenceStep(context, prompter);
|
|
428
|
+
if (next === 'cancel')
|
|
429
|
+
throw new WizardCancelledError();
|
|
430
|
+
step = next === 'back' ? 1 : 3;
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
const result = await verifyAndCommit(context, prompter, options.verify ?? verifyConnection);
|
|
434
|
+
if (typeof result !== 'number')
|
|
435
|
+
return result;
|
|
436
|
+
step = result;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
catch (error) {
|
|
440
|
+
if (!(error instanceof WizardCancelledError))
|
|
441
|
+
throw error;
|
|
442
|
+
prompter.cancel('Interactive setup cancelled; no configuration was changed.');
|
|
443
|
+
return { status: 'cancelled', code: 130, ...(context ? { workspace: context.workspace } : {}) };
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
//# sourceMappingURL=interactive-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive-init.js","sourceRoot":"","sources":["../src/interactive-init.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -34,6 +34,18 @@ export interface YandexPageIdentity {
|
|
|
34
34
|
id: number;
|
|
35
35
|
slug: string;
|
|
36
36
|
}
|
|
37
|
+
export interface YandexCurrentUser {
|
|
38
|
+
username: string;
|
|
39
|
+
home_cluster?: string;
|
|
40
|
+
identity: {
|
|
41
|
+
uid?: string;
|
|
42
|
+
cloud_uid?: string;
|
|
43
|
+
};
|
|
44
|
+
org: {
|
|
45
|
+
dir_id?: string;
|
|
46
|
+
collab_id?: string;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
37
49
|
export interface YandexAttachment {
|
|
38
50
|
id: number;
|
|
39
51
|
name: string;
|
|
@@ -166,6 +178,7 @@ export interface YandexWikiApi {
|
|
|
166
178
|
}): Promise<YandexAttachment>;
|
|
167
179
|
}
|
|
168
180
|
export interface ConfluenceApi {
|
|
181
|
+
getCurrentUser(): Promise<Record<string, unknown>>;
|
|
169
182
|
preflight?(): Promise<ConfluencePlatformInfo>;
|
|
170
183
|
resolveTarget(input: string): Promise<ConfluencePage>;
|
|
171
184
|
getPage(id: string): Promise<ConfluencePage>;
|
package/dist/workspace.d.ts
CHANGED
|
@@ -14,6 +14,10 @@ export interface WorkspaceInitialization {
|
|
|
14
14
|
created: string[];
|
|
15
15
|
existing: string[];
|
|
16
16
|
}
|
|
17
|
+
export interface WorkspaceDirectories {
|
|
18
|
+
created: string[];
|
|
19
|
+
existing: string[];
|
|
20
|
+
}
|
|
17
21
|
export declare function workspaceIsInitialized(workspace: Workspace): Promise<boolean>;
|
|
18
22
|
export declare function resolveWorkspace(options?: {
|
|
19
23
|
explicit?: string;
|
|
@@ -26,4 +30,5 @@ export declare function resolveInitWorkspace(options?: {
|
|
|
26
30
|
homeDirectory?: string;
|
|
27
31
|
}): Workspace;
|
|
28
32
|
export declare function initializeWorkspace(workspace: Workspace): Promise<WorkspaceInitialization>;
|
|
33
|
+
export declare function ensureWorkspaceDirectories(workspace: Workspace): Promise<WorkspaceDirectories>;
|
|
29
34
|
export declare function resolveWorkspacePath(workspace: Workspace, value: string): string;
|
package/dist/workspace.js
CHANGED
|
@@ -108,12 +108,21 @@ export async function initializeWorkspace(workspace) {
|
|
|
108
108
|
await mkdir(workspace.root, { recursive: true, mode: 0o700 });
|
|
109
109
|
const configCreated = await createExclusive(workspace.configFile, CONFIG_TEMPLATE, 0o600);
|
|
110
110
|
(configCreated ? created : existing).push(workspace.configFile);
|
|
111
|
+
const directories = await ensureWorkspaceDirectories(workspace);
|
|
112
|
+
created.push(...directories.created);
|
|
113
|
+
existing.push(...directories.existing);
|
|
114
|
+
return { workspace, created, existing };
|
|
115
|
+
}
|
|
116
|
+
export async function ensureWorkspaceDirectories(workspace) {
|
|
117
|
+
const created = [];
|
|
118
|
+
const existing = [];
|
|
119
|
+
await mkdir(workspace.root, { recursive: true, mode: 0o700 });
|
|
111
120
|
for (const directory of [workspace.statesDirectory, workspace.cacheDirectory, workspace.reportsDirectory]) {
|
|
112
121
|
const existed = await exists(directory);
|
|
113
122
|
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
114
123
|
(existed ? existing : created).push(directory);
|
|
115
124
|
}
|
|
116
|
-
return {
|
|
125
|
+
return { created, existing };
|
|
117
126
|
}
|
|
118
127
|
export function resolveWorkspacePath(workspace, value) {
|
|
119
128
|
const candidate = path.isAbsolute(value) ? path.resolve(value) : path.resolve(workspace.root, value);
|
package/dist/workspace.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,SAAS,CAAC;AAClC,OAAO,EAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AACnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAE1C,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmC9B,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iwonz/ywtc",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Resumable, loss-aware transfers between Yandex Wiki, Confluence, Markdown, and static HTML",
|
|
6
6
|
"license": "MIT",
|
|
@@ -64,6 +64,7 @@
|
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
66
|
"@archiver/archiver": "^0.3.0",
|
|
67
|
+
"@clack/prompts": "^1.8.1",
|
|
67
68
|
"@commander-js/extra-typings": "^15.0.0",
|
|
68
69
|
"@diplodoc/transform": "4.78.6",
|
|
69
70
|
"axios": "1.20.0",
|