@iwonz/ywtc 0.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/.env.example +4 -0
  2. package/CHANGELOG.md +56 -0
  3. package/LICENSE +21 -0
  4. package/README.md +267 -1
  5. package/dist/adapters/confluence.d.ts +46 -0
  6. package/dist/adapters/confluence.js +187 -0
  7. package/dist/adapters/confluence.js.map +1 -0
  8. package/dist/adapters/factory.d.ts +3 -0
  9. package/dist/adapters/factory.js +11 -0
  10. package/dist/adapters/factory.js.map +1 -0
  11. package/dist/adapters/yandex.d.ts +45 -0
  12. package/dist/adapters/yandex.js +233 -0
  13. package/dist/adapters/yandex.js.map +1 -0
  14. package/dist/cli-arguments.d.ts +41 -0
  15. package/dist/cli-arguments.js +149 -0
  16. package/dist/cli-arguments.js.map +1 -0
  17. package/dist/cli.d.ts +2 -0
  18. package/dist/cli.js +180 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/clients/confluence-cloud.d.ts +45 -0
  21. package/dist/clients/confluence-cloud.js +261 -0
  22. package/dist/clients/confluence-cloud.js.map +1 -0
  23. package/dist/clients/confluence-factory.d.ts +3 -0
  24. package/dist/clients/confluence-factory.js +8 -0
  25. package/dist/clients/confluence-factory.js.map +1 -0
  26. package/dist/clients/confluence.d.ts +42 -0
  27. package/dist/clients/confluence.js +286 -0
  28. package/dist/clients/confluence.js.map +1 -0
  29. package/dist/clients/yandex-wiki.d.ts +35 -0
  30. package/dist/clients/yandex-wiki.js +255 -0
  31. package/dist/clients/yandex-wiki.js.map +1 -0
  32. package/dist/config.d.ts +52 -0
  33. package/dist/config.js +177 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/content-model.d.ts +12 -0
  36. package/dist/content-model.js +416 -0
  37. package/dist/content-model.js.map +1 -0
  38. package/dist/conversion.d.ts +43 -0
  39. package/dist/conversion.js +450 -0
  40. package/dist/conversion.js.map +1 -0
  41. package/dist/doctor.d.ts +24 -0
  42. package/dist/doctor.js +45 -0
  43. package/dist/doctor.js.map +1 -0
  44. package/dist/domain.d.ts +202 -0
  45. package/dist/domain.js +18 -0
  46. package/dist/domain.js.map +1 -0
  47. package/dist/filesystem-export.d.ts +53 -0
  48. package/dist/filesystem-export.js +243 -0
  49. package/dist/filesystem-export.js.map +1 -0
  50. package/dist/graph.d.ts +13 -0
  51. package/dist/graph.js +121 -0
  52. package/dist/graph.js.map +1 -0
  53. package/dist/http.d.ts +26 -0
  54. package/dist/http.js +100 -0
  55. package/dist/http.js.map +1 -0
  56. package/dist/index.d.ts +24 -0
  57. package/dist/index.js +25 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/input.d.ts +4 -0
  60. package/dist/input.js +56 -0
  61. package/dist/input.js.map +1 -0
  62. package/dist/locators.d.ts +24 -0
  63. package/dist/locators.js +84 -0
  64. package/dist/locators.js.map +1 -0
  65. package/dist/logger.d.ts +7 -0
  66. package/dist/logger.js +28 -0
  67. package/dist/logger.js.map +1 -0
  68. package/dist/migrator.d.ts +53 -0
  69. package/dist/migrator.js +669 -0
  70. package/dist/migrator.js.map +1 -0
  71. package/dist/rate-limiter.d.ts +12 -0
  72. package/dist/rate-limiter.js +31 -0
  73. package/dist/rate-limiter.js.map +1 -0
  74. package/dist/report.d.ts +101 -0
  75. package/dist/report.js +106 -0
  76. package/dist/report.js.map +1 -0
  77. package/dist/state.d.ts +119 -0
  78. package/dist/state.js +201 -0
  79. package/dist/state.js.map +1 -0
  80. package/dist/types.d.ts +197 -0
  81. package/dist/types.js +2 -0
  82. package/dist/types.js.map +1 -0
  83. package/dist/updater.d.ts +24 -0
  84. package/dist/updater.js +92 -0
  85. package/dist/updater.js.map +1 -0
  86. package/dist/version.d.ts +1 -0
  87. package/dist/version.js +8 -0
  88. package/dist/version.js.map +1 -0
  89. package/dist/workspace.d.ts +29 -0
  90. package/dist/workspace.js +157 -0
  91. package/dist/workspace.js.map +1 -0
  92. package/docs/assets/readme-header.png +0 -0
  93. package/package.json +108 -3
  94. 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":"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"}
Binary file
package/package.json CHANGED
@@ -1,7 +1,112 @@
1
1
  {
2
2
  "name": "@iwonz/ywtc",
3
- "version": "0.0.0",
4
- "description": "Bootstrap placeholder for ywtc trusted publishing",
3
+ "version": "2.0.1",
4
+ "type": "module",
5
+ "description": "Resumable, loss-aware transfers between Yandex Wiki, Confluence, Markdown, and static HTML",
5
6
  "license": "MIT",
6
- "repository": "https://github.com/iwonz/ywtc"
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.6",
70
+ "axios": "1.20.0",
71
+ "cheerio": "1.2.0",
72
+ "commander": "^15.0.0",
73
+ "dotenv": "18.0.7",
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
+ }
7
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