@iwonz/ywtc 0.0.0-stage → 2.0.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/.env.example +4 -0
- package/CHANGELOG.md +39 -0
- package/LICENSE +21 -0
- package/README.md +259 -2
- package/dist/adapters/confluence.d.ts +46 -0
- package/dist/adapters/confluence.js +187 -0
- package/dist/adapters/confluence.js.map +1 -0
- package/dist/adapters/factory.d.ts +3 -0
- package/dist/adapters/factory.js +11 -0
- package/dist/adapters/factory.js.map +1 -0
- package/dist/adapters/yandex.d.ts +45 -0
- package/dist/adapters/yandex.js +233 -0
- package/dist/adapters/yandex.js.map +1 -0
- package/dist/cli-arguments.d.ts +41 -0
- package/dist/cli-arguments.js +149 -0
- package/dist/cli-arguments.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +180 -0
- package/dist/cli.js.map +1 -0
- package/dist/clients/confluence-cloud.d.ts +45 -0
- package/dist/clients/confluence-cloud.js +261 -0
- package/dist/clients/confluence-cloud.js.map +1 -0
- package/dist/clients/confluence-factory.d.ts +3 -0
- package/dist/clients/confluence-factory.js +8 -0
- package/dist/clients/confluence-factory.js.map +1 -0
- package/dist/clients/confluence.d.ts +42 -0
- package/dist/clients/confluence.js +286 -0
- package/dist/clients/confluence.js.map +1 -0
- package/dist/clients/yandex-wiki.d.ts +35 -0
- package/dist/clients/yandex-wiki.js +255 -0
- package/dist/clients/yandex-wiki.js.map +1 -0
- package/dist/config.d.ts +52 -0
- package/dist/config.js +177 -0
- package/dist/config.js.map +1 -0
- package/dist/content-model.d.ts +12 -0
- package/dist/content-model.js +416 -0
- package/dist/content-model.js.map +1 -0
- package/dist/conversion.d.ts +43 -0
- package/dist/conversion.js +450 -0
- package/dist/conversion.js.map +1 -0
- package/dist/doctor.d.ts +24 -0
- package/dist/doctor.js +45 -0
- package/dist/doctor.js.map +1 -0
- package/dist/domain.d.ts +202 -0
- package/dist/domain.js +18 -0
- package/dist/domain.js.map +1 -0
- package/dist/filesystem-export.d.ts +53 -0
- package/dist/filesystem-export.js +243 -0
- package/dist/filesystem-export.js.map +1 -0
- package/dist/graph.d.ts +13 -0
- package/dist/graph.js +121 -0
- package/dist/graph.js.map +1 -0
- package/dist/http.d.ts +26 -0
- package/dist/http.js +100 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/input.d.ts +4 -0
- package/dist/input.js +56 -0
- package/dist/input.js.map +1 -0
- package/dist/locators.d.ts +24 -0
- package/dist/locators.js +84 -0
- package/dist/locators.js.map +1 -0
- package/dist/logger.d.ts +7 -0
- package/dist/logger.js +28 -0
- package/dist/logger.js.map +1 -0
- package/dist/migrator.d.ts +53 -0
- package/dist/migrator.js +669 -0
- package/dist/migrator.js.map +1 -0
- package/dist/rate-limiter.d.ts +12 -0
- package/dist/rate-limiter.js +31 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/report.d.ts +101 -0
- package/dist/report.js +106 -0
- package/dist/report.js.map +1 -0
- package/dist/state.d.ts +119 -0
- package/dist/state.js +201 -0
- package/dist/state.js.map +1 -0
- package/dist/types.d.ts +197 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/updater.d.ts +24 -0
- package/dist/updater.js +92 -0
- package/dist/updater.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +8 -0
- package/dist/version.js.map +1 -0
- package/dist/workspace.d.ts +29 -0
- package/dist/workspace.js +157 -0
- package/dist/workspace.js.map +1 -0
- package/docs/assets/readme-header.png +0 -0
- package/package.json +110 -4
- package/ywtc.config.example.yaml +52 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { constants } from 'node:fs';
|
|
2
|
+
import { access, chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
export const WORKSPACE_MARKER = '.ywtc-workspace.json';
|
|
6
|
+
export const WORKSPACE_ENV = '.env';
|
|
7
|
+
export const WORKSPACE_CONFIG = 'ywtc.config.yaml';
|
|
8
|
+
export const WORKSPACE_STATES = '.states';
|
|
9
|
+
export const ENV_TEMPLATE = `# Secrets referenced by ywtc.config.yaml
|
|
10
|
+
YANDEX_WIKI_TOKEN=
|
|
11
|
+
CONFLUENCE_TOKEN=
|
|
12
|
+
CONFLUENCE_EMAIL=
|
|
13
|
+
|
|
14
|
+
# Optional global overrides
|
|
15
|
+
HTTP_TIMEOUT_MS=30000
|
|
16
|
+
MIGRATION_CONCURRENCY=4
|
|
17
|
+
`;
|
|
18
|
+
export const CONFIG_TEMPLATE = `schemaVersion: 2
|
|
19
|
+
|
|
20
|
+
defaults:
|
|
21
|
+
timeoutMs: 30000
|
|
22
|
+
concurrency: 4
|
|
23
|
+
|
|
24
|
+
connections:
|
|
25
|
+
yandex:
|
|
26
|
+
type: yandex-wiki
|
|
27
|
+
apiUrl: https://api.wiki.yandex.net/v1
|
|
28
|
+
webUrl: https://wiki.example.com
|
|
29
|
+
authType: oauth
|
|
30
|
+
tokenEnv: YANDEX_WIKI_TOKEN
|
|
31
|
+
organization:
|
|
32
|
+
type: yandex360
|
|
33
|
+
id: ""
|
|
34
|
+
limits:
|
|
35
|
+
readConcurrency: 4
|
|
36
|
+
writeConcurrency: 2
|
|
37
|
+
downloadConcurrency: 2
|
|
38
|
+
uploadConcurrency: 2
|
|
39
|
+
requestsPerSecond: 8
|
|
40
|
+
burst: 8
|
|
41
|
+
|
|
42
|
+
confluence:
|
|
43
|
+
type: confluence
|
|
44
|
+
deployment: data-center
|
|
45
|
+
baseUrl: https://confluence.example.com/confluence
|
|
46
|
+
authType: pat
|
|
47
|
+
tokenEnv: CONFLUENCE_TOKEN
|
|
48
|
+
limits:
|
|
49
|
+
readConcurrency: 4
|
|
50
|
+
writeConcurrency: 2
|
|
51
|
+
downloadConcurrency: 2
|
|
52
|
+
uploadConcurrency: 2
|
|
53
|
+
requestsPerSecond: 8
|
|
54
|
+
burst: 10
|
|
55
|
+
`;
|
|
56
|
+
function expandHome(value, homeDirectory) {
|
|
57
|
+
if (value === '~')
|
|
58
|
+
return homeDirectory;
|
|
59
|
+
if (value.startsWith('~/') || value.startsWith('~\\'))
|
|
60
|
+
return path.join(homeDirectory, value.slice(2));
|
|
61
|
+
if (value.startsWith('~'))
|
|
62
|
+
throw new Error('--workdir supports only "~" or "~/...", not another user home.');
|
|
63
|
+
return value;
|
|
64
|
+
}
|
|
65
|
+
async function exists(filename) {
|
|
66
|
+
try {
|
|
67
|
+
await access(filename, constants.F_OK);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function workspaceAt(root, source) {
|
|
75
|
+
const statesDirectory = path.join(root, WORKSPACE_STATES);
|
|
76
|
+
return {
|
|
77
|
+
root,
|
|
78
|
+
marker: path.join(root, WORKSPACE_MARKER),
|
|
79
|
+
envFile: path.join(root, WORKSPACE_ENV),
|
|
80
|
+
configFile: path.join(root, WORKSPACE_CONFIG),
|
|
81
|
+
statesDirectory,
|
|
82
|
+
cacheDirectory: path.join(statesDirectory, 'cache'),
|
|
83
|
+
reportsDirectory: path.join(statesDirectory, 'reports'),
|
|
84
|
+
source,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export async function resolveWorkspace(options = {}) {
|
|
88
|
+
const cwd = path.resolve(options.cwd ?? process.cwd());
|
|
89
|
+
const homeDirectory = path.resolve(options.homeDirectory ?? os.homedir());
|
|
90
|
+
if (options.explicit)
|
|
91
|
+
return workspaceAt(path.resolve(cwd, expandHome(options.explicit, homeDirectory)), 'explicit');
|
|
92
|
+
if (await exists(path.join(cwd, WORKSPACE_MARKER)))
|
|
93
|
+
return workspaceAt(cwd, 'current');
|
|
94
|
+
return workspaceAt(path.join(homeDirectory, '.ywtc'), 'default');
|
|
95
|
+
}
|
|
96
|
+
async function createExclusive(filename, content, mode) {
|
|
97
|
+
try {
|
|
98
|
+
await writeFile(filename, content, { encoding: 'utf8', flag: 'wx', mode });
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (error.code === 'EEXIST')
|
|
103
|
+
return false;
|
|
104
|
+
throw error;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export async function initializeWorkspace(workspace) {
|
|
108
|
+
const created = [];
|
|
109
|
+
const existing = [];
|
|
110
|
+
await mkdir(workspace.root, { recursive: true, mode: 0o700 });
|
|
111
|
+
const artifacts = [
|
|
112
|
+
[workspace.marker, `${JSON.stringify({ schemaVersion: 2, tool: 'ywtc' }, null, 2)}\n`, 0o600],
|
|
113
|
+
[workspace.envFile, ENV_TEMPLATE, 0o600],
|
|
114
|
+
[workspace.configFile, CONFIG_TEMPLATE, 0o600],
|
|
115
|
+
];
|
|
116
|
+
for (const [filename, content, mode] of artifacts) {
|
|
117
|
+
const artifactCreated = await createExclusive(filename, content, mode);
|
|
118
|
+
(artifactCreated ? created : existing).push(filename);
|
|
119
|
+
if (artifactCreated)
|
|
120
|
+
await chmod(filename, mode);
|
|
121
|
+
}
|
|
122
|
+
for (const directory of [workspace.statesDirectory, workspace.cacheDirectory, workspace.reportsDirectory]) {
|
|
123
|
+
const existed = await exists(directory);
|
|
124
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
125
|
+
(existed ? existing : created).push(directory);
|
|
126
|
+
}
|
|
127
|
+
return { workspace, created, existing };
|
|
128
|
+
}
|
|
129
|
+
export async function validateWorkspaceMarker(workspace) {
|
|
130
|
+
let raw;
|
|
131
|
+
try {
|
|
132
|
+
raw = await readFile(workspace.marker, 'utf8');
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
throw new Error(`Workspace marker is missing or unreadable: ${workspace.marker}`, { cause: error });
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
const value = JSON.parse(raw);
|
|
139
|
+
if (value.schemaVersion === 1) {
|
|
140
|
+
throw new Error('schema v1 is not supported; create ywtc.config.yaml and a schema v2 marker or use a new workdir');
|
|
141
|
+
}
|
|
142
|
+
if (value.schemaVersion !== 2 || value.tool !== 'ywtc')
|
|
143
|
+
throw new Error('unsupported marker');
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
throw new Error(`Workspace marker is invalid: ${workspace.marker}. ${error instanceof Error ? error.message : 'Run ywtc init after repairing it.'}`, { cause: error });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
export function resolveWorkspacePath(workspace, value) {
|
|
150
|
+
const candidate = path.isAbsolute(value) ? path.resolve(value) : path.resolve(workspace.root, value);
|
|
151
|
+
const relative = path.relative(workspace.root, candidate);
|
|
152
|
+
if (relative === '..' || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
153
|
+
throw new Error(`Path must remain inside workdir ${workspace.root}: ${value}`);
|
|
154
|
+
}
|
|
155
|
+
return candidate;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +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,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAG,kBAAkB,CAAC;AACnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC;AAE1C,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;CAQ3B,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC9B,CAAC;AAmBF,SAAS,UAAU,CAAC,KAAa,EAAE,aAAqB;IACtD,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,aAAa,CAAC;IACxC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvG,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IAC7G,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,MAAM,CAAC,QAAgB;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,MAA2B;IAC5D,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IAC1D,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC;QACzC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QACvC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC;QAC7C,eAAe;QACf,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC;QACnD,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC;QACvD,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAqE,EAAE;IAC5G,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IACrH,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,WAAW,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACvF,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;AACnE,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,OAAe,EAAE,IAAY;IAC5E,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QACrE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,SAAoB;IAC5D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAoC;QACjD,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAC,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC;QAC3F,CAAC,SAAS,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC;QACxC,CAAC,SAAS,CAAC,UAAU,EAAE,eAAe,EAAE,KAAK,CAAC;KAC/C,CAAC;IACF,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,SAAS,EAAE,CAAC;QAClD,MAAM,eAAe,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACvE,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,eAAe;YAAE,MAAM,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACnD,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1G,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC;QACvD,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,EAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,SAAoB;IAChE,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8CAA8C,SAAS,CAAC,MAAM,EAAE,EAAE,EAAC,KAAK,EAAE,KAAK,EAAC,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA8C,CAAC;QAC3E,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAC;QACrH,CAAC;QACD,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAChG,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,gCAAgC,SAAS,CAAC,MAAM,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mCAAmC,EAAE,EAAE,EAAC,KAAK,EAAE,KAAK,EAAC,CAAC,CAAC;IACvK,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAoB,EAAE,KAAa;IACtE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACrG,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1D,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3F,MAAM,IAAI,KAAK,CAAC,mCAAmC,SAAS,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,112 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iwonz/ywtc",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"description": "
|
|
6
|
-
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Resumable, loss-aware transfers between Yandex Wiki, Confluence, Markdown, and static HTML",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/iwonz/ywtc.git"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/iwonz/ywtc/issues"
|
|
13
|
+
},
|
|
14
|
+
"homepage": "https://github.com/iwonz/ywtc#readme",
|
|
15
|
+
"main": "./dist/index.js",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"import": "./dist/index.js"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"bin": {
|
|
24
|
+
"ywtc": "./dist/cli.js"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public",
|
|
28
|
+
"provenance": true
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"docs/assets/readme-header.png",
|
|
33
|
+
".env.example",
|
|
34
|
+
"ywtc.config.example.yaml",
|
|
35
|
+
"CHANGELOG.md",
|
|
36
|
+
"LICENSE",
|
|
37
|
+
"README.md"
|
|
38
|
+
],
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=24.0.0",
|
|
41
|
+
"npm": ">=11.5.1"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc -p tsconfig.build.json",
|
|
45
|
+
"check": "npm run release:check && npm run security:audit && npm run typecheck && npm run lint && npm run knip && npm test && npm run test:browser && npm run build && npm run package:verify && npm run spec:validate",
|
|
46
|
+
"format": "biome format --write .",
|
|
47
|
+
"format:check": "biome format .",
|
|
48
|
+
"knip": "knip",
|
|
49
|
+
"lint": "biome lint .",
|
|
50
|
+
"lint:fix": "biome lint --write .",
|
|
51
|
+
"commitlint": "commitlint",
|
|
52
|
+
"migrate": "tsx src/cli.ts migrate",
|
|
53
|
+
"package:verify": "node --import tsx scripts/package-validation.ts",
|
|
54
|
+
"prepack": "npm run release:check && npm run build",
|
|
55
|
+
"release:check": "node scripts/release-check.mjs",
|
|
56
|
+
"release:bootstrap": "node --import tsx scripts/npm-bootstrap.ts",
|
|
57
|
+
"release:validate": "node --import tsx scripts/validate-release-tag.ts",
|
|
58
|
+
"security:audit": "npm audit --omit=dev --audit-level=high",
|
|
59
|
+
"spec:validate": "openspec validate --all --strict --no-interactive",
|
|
60
|
+
"test": "vitest run",
|
|
61
|
+
"test:browser": "playwright test",
|
|
62
|
+
"test:watch": "vitest",
|
|
63
|
+
"typecheck": "tsc --noEmit",
|
|
64
|
+
"workspace:init": "node --import tsx src/cli.ts init --workdir ."
|
|
65
|
+
},
|
|
66
|
+
"dependencies": {
|
|
67
|
+
"@archiver/archiver": "^0.3.0",
|
|
68
|
+
"@commander-js/extra-typings": "^15.0.0",
|
|
69
|
+
"@diplodoc/transform": "4.78.7",
|
|
70
|
+
"axios": "1.20.0",
|
|
71
|
+
"cheerio": "1.2.0",
|
|
72
|
+
"commander": "^15.0.0",
|
|
73
|
+
"dotenv": "18.0.8",
|
|
74
|
+
"form-data": "4.0.6",
|
|
75
|
+
"linkify-it": "6.1.0",
|
|
76
|
+
"listr2": "^11.2.0",
|
|
77
|
+
"p-queue": "^10.0.0",
|
|
78
|
+
"rehype-parse": "^9.0.1",
|
|
79
|
+
"rehype-remark": "^10.0.1",
|
|
80
|
+
"rehype-sanitize": "^6.0.0",
|
|
81
|
+
"rehype-stringify": "^10.0.1",
|
|
82
|
+
"remark-gfm": "^4.0.1",
|
|
83
|
+
"remark-stringify": "^11.0.0",
|
|
84
|
+
"unified": "^11.0.5",
|
|
85
|
+
"yaml": "^2.9.1",
|
|
86
|
+
"zod": "4.6.7"
|
|
87
|
+
},
|
|
88
|
+
"devDependencies": {
|
|
89
|
+
"@biomejs/biome": "2.5.15",
|
|
90
|
+
"@commitlint/cli": "21.2.3",
|
|
91
|
+
"@commitlint/config-conventional": "21.2.3",
|
|
92
|
+
"@fission-ai/openspec": "1.14.2",
|
|
93
|
+
"@playwright/test": "^1.64.1",
|
|
94
|
+
"@types/node": "24.19.2",
|
|
95
|
+
"fast-check": "^4.10.2",
|
|
96
|
+
"knip": "6.41.0",
|
|
97
|
+
"nock": "15.0.1",
|
|
98
|
+
"tsx": "4.23.15",
|
|
99
|
+
"typescript": "5.9.3",
|
|
100
|
+
"vitest": "5.0.4"
|
|
101
|
+
},
|
|
102
|
+
"overrides": {
|
|
103
|
+
"katex": "0.19.0",
|
|
104
|
+
"lodash": "4.18.1",
|
|
105
|
+
"markdown-it": {
|
|
106
|
+
".": "13.0.2",
|
|
107
|
+
"linkify-it": "5.0.2"
|
|
108
|
+
},
|
|
109
|
+
"markdownlint": "0.41.1",
|
|
110
|
+
"svgo": "3.3.5"
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
schemaVersion: 2
|
|
2
|
+
|
|
3
|
+
defaults:
|
|
4
|
+
timeoutMs: 30000
|
|
5
|
+
concurrency: 4
|
|
6
|
+
|
|
7
|
+
connections:
|
|
8
|
+
yandex:
|
|
9
|
+
type: yandex-wiki
|
|
10
|
+
apiUrl: https://api.wiki.yandex.net/v1
|
|
11
|
+
webUrl: https://wiki.example.com
|
|
12
|
+
authType: oauth
|
|
13
|
+
tokenEnv: YANDEX_WIKI_TOKEN
|
|
14
|
+
organization:
|
|
15
|
+
type: yandex360
|
|
16
|
+
id: example-organization-id
|
|
17
|
+
limits:
|
|
18
|
+
readConcurrency: 4
|
|
19
|
+
writeConcurrency: 2
|
|
20
|
+
downloadConcurrency: 2
|
|
21
|
+
uploadConcurrency: 2
|
|
22
|
+
requestsPerSecond: 8
|
|
23
|
+
burst: 8
|
|
24
|
+
|
|
25
|
+
confluence:
|
|
26
|
+
type: confluence
|
|
27
|
+
deployment: data-center
|
|
28
|
+
baseUrl: https://confluence.example.com/confluence
|
|
29
|
+
authType: pat
|
|
30
|
+
tokenEnv: CONFLUENCE_TOKEN
|
|
31
|
+
limits:
|
|
32
|
+
readConcurrency: 4
|
|
33
|
+
writeConcurrency: 2
|
|
34
|
+
downloadConcurrency: 2
|
|
35
|
+
uploadConcurrency: 2
|
|
36
|
+
requestsPerSecond: 8
|
|
37
|
+
burst: 10
|
|
38
|
+
|
|
39
|
+
# confluence-cloud:
|
|
40
|
+
# type: confluence
|
|
41
|
+
# deployment: cloud
|
|
42
|
+
# baseUrl: https://example.atlassian.net
|
|
43
|
+
# authType: api-token
|
|
44
|
+
# tokenEnv: CONFLUENCE_CLOUD_TOKEN
|
|
45
|
+
# emailEnv: CONFLUENCE_CLOUD_EMAIL
|
|
46
|
+
# limits:
|
|
47
|
+
# readConcurrency: 4
|
|
48
|
+
# writeConcurrency: 2
|
|
49
|
+
# downloadConcurrency: 2
|
|
50
|
+
# uploadConcurrency: 2
|
|
51
|
+
# requestsPerSecond: 8
|
|
52
|
+
# burst: 10
|