@markwinap/confluence-sync-core 1.0.2
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/.github/workflows/publish.yml +40 -0
- package/README.md +9 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +41 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +73 -0
- package/dist/config.js.map +1 -0
- package/dist/confluenceClient.d.ts +19 -0
- package/dist/confluenceClient.d.ts.map +1 -0
- package/dist/confluenceClient.js +147 -0
- package/dist/confluenceClient.js.map +1 -0
- package/dist/contracts.d.ts +112 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +15 -0
- package/dist/contracts.js.map +1 -0
- package/dist/diff.d.ts +14 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +74 -0
- package/dist/diff.js.map +1 -0
- package/dist/format.d.ts +3 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +194 -0
- package/dist/format.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +6 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +57 -0
- package/dist/manifest.js.map +1 -0
- package/dist/paths.d.ts +6 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +54 -0
- package/dist/paths.js.map +1 -0
- package/dist/progress.d.ts +67 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +168 -0
- package/dist/progress.js.map +1 -0
- package/dist/project.d.ts +11 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +114 -0
- package/dist/project.js.map +1 -0
- package/dist/pull.d.ts +8 -0
- package/dist/pull.d.ts.map +1 -0
- package/dist/pull.js +303 -0
- package/dist/pull.js.map +1 -0
- package/dist/push.d.ts +6 -0
- package/dist/push.d.ts.map +1 -0
- package/dist/push.js +129 -0
- package/dist/push.js.map +1 -0
- package/dist/status.d.ts +29 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +153 -0
- package/dist/status.js.map +1 -0
- package/dist/types.d.ts +103 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +26 -0
package/dist/status.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { ConfluenceClient } from "./confluenceClient";
|
|
2
|
+
import type { Change, ChangeKind, Manifest, ManifestItem } from "./types";
|
|
3
|
+
export declare function buildLocalSnapshot(contentDir: string, item: ManifestItem): LocalSnapshot;
|
|
4
|
+
export declare function discoverMissingAttachments(contentDir: string, item: ManifestItem): AttachmentRecord[];
|
|
5
|
+
export declare function classifyChange(snapshot: LocalSnapshot, remoteVersion: number | undefined): {
|
|
6
|
+
kind: ChangeKind;
|
|
7
|
+
detail: string;
|
|
8
|
+
remoteVersion?: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function collectRemoteVersions(items: ManifestItem[], client: ConfluenceClient, options?: {
|
|
11
|
+
concurrency?: number;
|
|
12
|
+
}): Promise<Map<string, number | undefined>>;
|
|
13
|
+
export declare function getStatus(contentDir: string, manifest: Manifest, client: ConfluenceClient, options?: {
|
|
14
|
+
concurrency?: number;
|
|
15
|
+
}): Promise<Change[]>;
|
|
16
|
+
interface LocalSnapshot {
|
|
17
|
+
item: ManifestItem;
|
|
18
|
+
storageHash?: string;
|
|
19
|
+
markdownHash?: string;
|
|
20
|
+
attachmentHashes: Map<string, string>;
|
|
21
|
+
}
|
|
22
|
+
interface AttachmentRecord {
|
|
23
|
+
file: string;
|
|
24
|
+
title: string;
|
|
25
|
+
hash: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function printStatus(changes: Change[]): void;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAe,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvF,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,aAAa,CAkBxF;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,gBAAgB,EAAE,CAarG;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAmBvJ;AAED,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAUzK;AAkBD,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC,OAAO,CAAC,MAAM,EAAE,CAAC,CASnB;AAMD,UAAU,aAAa;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,UAAU,gBAAgB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AAEzE,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAOnD"}
|
package/dist/status.js
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.buildLocalSnapshot = buildLocalSnapshot;
|
|
37
|
+
exports.discoverMissingAttachments = discoverMissingAttachments;
|
|
38
|
+
exports.classifyChange = classifyChange;
|
|
39
|
+
exports.collectRemoteVersions = collectRemoteVersions;
|
|
40
|
+
exports.getStatus = getStatus;
|
|
41
|
+
exports.printStatus = printStatus;
|
|
42
|
+
const fs_1 = require("fs");
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const manifest_1 = require("./manifest");
|
|
45
|
+
function buildLocalSnapshot(contentDir, item) {
|
|
46
|
+
const attachmentHashes = new Map();
|
|
47
|
+
if (item.type === "page") {
|
|
48
|
+
const attachmentDir = path.join(contentDir, item.relativeDir, "attachments");
|
|
49
|
+
if ((0, fs_1.existsSync)(attachmentDir)) {
|
|
50
|
+
for (const name of (0, fs_1.readdirSync)(attachmentDir)) {
|
|
51
|
+
const file = `attachments/${name}`;
|
|
52
|
+
const fullPath = path.join(attachmentDir, name);
|
|
53
|
+
attachmentHashes.set(file, (0, fs_1.existsSync)(fullPath) ? (0, manifest_1.hash)((0, fs_1.readFileSync)(fullPath)) : "");
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
item,
|
|
59
|
+
storageHash: item.type === "page" ? hashOf(path.join(contentDir, item.relativeDir, "page.storage.xhtml")) : undefined,
|
|
60
|
+
markdownHash: item.type === "page" ? hashOf(path.join(contentDir, item.relativeDir, "page.md")) : undefined,
|
|
61
|
+
attachmentHashes,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function discoverMissingAttachments(contentDir, item) {
|
|
65
|
+
if (item.type !== "page")
|
|
66
|
+
return [];
|
|
67
|
+
const dir = path.join(contentDir, item.relativeDir, "attachments");
|
|
68
|
+
const missing = [];
|
|
69
|
+
if (!(0, fs_1.existsSync)(dir))
|
|
70
|
+
return missing;
|
|
71
|
+
for (const name of (0, fs_1.readdirSync)(dir)) {
|
|
72
|
+
const file = `attachments/${name}`;
|
|
73
|
+
if (!item.attachments.some(a => a.file === file)) {
|
|
74
|
+
const fullPath = path.join(dir, name);
|
|
75
|
+
missing.push({ file, title: name, hash: (0, fs_1.existsSync)(fullPath) ? (0, manifest_1.hash)((0, fs_1.readFileSync)(fullPath)) : "" });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return missing;
|
|
79
|
+
}
|
|
80
|
+
function classifyChange(snapshot, remoteVersion) {
|
|
81
|
+
const item = snapshot.item;
|
|
82
|
+
if (!item.id)
|
|
83
|
+
return { kind: "new-local", detail: "Local item has no Confluence ID" };
|
|
84
|
+
if (item.capability === "metadata-only")
|
|
85
|
+
return { kind: "unchanged", detail: "Metadata-only item" };
|
|
86
|
+
const storageChanged = item.type === "page" && snapshot.storageHash !== item.syncedStorageHash;
|
|
87
|
+
const markdownChanged = item.type === "page" && snapshot.markdownHash !== item.syncedMarkdownHash;
|
|
88
|
+
const attachmentChanged = Array.from(snapshot.attachmentHashes.entries()).some(([file, fileHash]) => {
|
|
89
|
+
const record = item.attachments.find(a => a.file === file);
|
|
90
|
+
return !record || record.hash !== fileHash;
|
|
91
|
+
});
|
|
92
|
+
const remoteChanged = remoteVersion !== undefined && item.remoteVersion !== undefined && remoteVersion !== item.remoteVersion;
|
|
93
|
+
if (storageChanged && markdownChanged)
|
|
94
|
+
return { kind: "format-conflict", detail: "Both page.md and page.storage.xhtml changed", remoteVersion };
|
|
95
|
+
if (remoteChanged && (storageChanged || markdownChanged || attachmentChanged))
|
|
96
|
+
return { kind: "conflict", detail: "Local and remote content both changed", remoteVersion };
|
|
97
|
+
if (remoteChanged)
|
|
98
|
+
return { kind: "remote", detail: `Remote version is ${remoteVersion}; last pull was ${item.remoteVersion}`, remoteVersion };
|
|
99
|
+
if (storageChanged || markdownChanged || attachmentChanged)
|
|
100
|
+
return { kind: "local", detail: "Local content changed", remoteVersion };
|
|
101
|
+
return { kind: "unchanged", detail: "No changes", remoteVersion };
|
|
102
|
+
}
|
|
103
|
+
async function collectRemoteVersions(items, client, options) {
|
|
104
|
+
const results = new Map();
|
|
105
|
+
const concurrency = options?.concurrency ?? 5;
|
|
106
|
+
const queue = [...items];
|
|
107
|
+
const workers = [];
|
|
108
|
+
for (let i = 0; i < concurrency && queue.length > 0; i++) {
|
|
109
|
+
workers.push(worker(queue, results, client));
|
|
110
|
+
}
|
|
111
|
+
await Promise.all(workers);
|
|
112
|
+
return results;
|
|
113
|
+
}
|
|
114
|
+
async function worker(queue, results, client) {
|
|
115
|
+
while (queue.length > 0) {
|
|
116
|
+
const item = queue.shift();
|
|
117
|
+
if (!item.id || item.capability === "metadata-only") {
|
|
118
|
+
results.set(item.localKey, undefined);
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
const remote = await client.getContent(item.id, item.type);
|
|
123
|
+
results.set(item.localKey, remote.version?.number);
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
results.set(item.localKey, undefined);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async function getStatus(contentDir, manifest, client, options) {
|
|
131
|
+
const versions = await collectRemoteVersions(manifest.items, client, options);
|
|
132
|
+
return manifest.items.map(item => {
|
|
133
|
+
const snapshot = buildLocalSnapshot(contentDir, item);
|
|
134
|
+
const missing = discoverMissingAttachments(contentDir, item);
|
|
135
|
+
if (missing.length > 0)
|
|
136
|
+
snapshot.attachmentHashes.set(missing[0].file, missing[0].hash);
|
|
137
|
+
const classification = classifyChange(snapshot, versions.get(item.localKey));
|
|
138
|
+
return { item, kind: classification.kind, detail: classification.detail, remoteVersion: classification.remoteVersion };
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
function hashOf(file) {
|
|
142
|
+
return (0, fs_1.existsSync)(file) ? (0, manifest_1.hash)((0, fs_1.readFileSync)(file)) : undefined;
|
|
143
|
+
}
|
|
144
|
+
function printStatus(changes) {
|
|
145
|
+
for (const change of changes.filter(value => value.kind !== "unchanged")) {
|
|
146
|
+
console.log(`${change.kind.padEnd(15)} ${change.item.type} ${change.item.id || change.item.localKey}: ${change.item.title} - ${change.detail}`);
|
|
147
|
+
}
|
|
148
|
+
const counts = new Map();
|
|
149
|
+
for (const change of changes)
|
|
150
|
+
counts.set(change.kind, (counts.get(change.kind) || 0) + 1);
|
|
151
|
+
console.log([...counts].map(([kind, count]) => `${kind}=${count}`).join(", "));
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
export type ContentType = "page" | "folder" | "whiteboard" | "database" | "embed";
|
|
2
|
+
export interface RemoteContent {
|
|
3
|
+
id: string;
|
|
4
|
+
type: ContentType;
|
|
5
|
+
title: string;
|
|
6
|
+
parentId?: string;
|
|
7
|
+
depth?: number;
|
|
8
|
+
spaceId?: string;
|
|
9
|
+
status?: string;
|
|
10
|
+
version?: {
|
|
11
|
+
number: number;
|
|
12
|
+
createdAt?: string;
|
|
13
|
+
};
|
|
14
|
+
body?: {
|
|
15
|
+
storage?: {
|
|
16
|
+
value?: string;
|
|
17
|
+
representation?: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
_links?: {
|
|
21
|
+
webui?: string;
|
|
22
|
+
download?: string;
|
|
23
|
+
next?: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export interface RemoteAttachment {
|
|
27
|
+
id: string;
|
|
28
|
+
title: string;
|
|
29
|
+
fileId?: string;
|
|
30
|
+
mediaType?: string;
|
|
31
|
+
fileSize?: number;
|
|
32
|
+
version?: {
|
|
33
|
+
number: number;
|
|
34
|
+
};
|
|
35
|
+
downloadLink?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface AttachmentRecord {
|
|
38
|
+
id?: string;
|
|
39
|
+
file: string;
|
|
40
|
+
title: string;
|
|
41
|
+
mediaType?: string;
|
|
42
|
+
version?: number;
|
|
43
|
+
hash: string;
|
|
44
|
+
}
|
|
45
|
+
export interface ManifestItem {
|
|
46
|
+
localKey: string;
|
|
47
|
+
id?: string;
|
|
48
|
+
type: ContentType;
|
|
49
|
+
title: string;
|
|
50
|
+
parentKey?: string;
|
|
51
|
+
parentId?: string;
|
|
52
|
+
spaceId?: string;
|
|
53
|
+
relativeDir: string;
|
|
54
|
+
remoteVersion?: number;
|
|
55
|
+
storageHash?: string;
|
|
56
|
+
markdownHash?: string;
|
|
57
|
+
syncedStorageHash?: string;
|
|
58
|
+
syncedMarkdownHash?: string;
|
|
59
|
+
attachments: AttachmentRecord[];
|
|
60
|
+
capability: "full" | "metadata-only";
|
|
61
|
+
webUrl?: string;
|
|
62
|
+
}
|
|
63
|
+
export interface DeletionRecord {
|
|
64
|
+
localKey: string;
|
|
65
|
+
id?: string;
|
|
66
|
+
type: ContentType;
|
|
67
|
+
title: string;
|
|
68
|
+
relativeDir: string;
|
|
69
|
+
movedTo?: string;
|
|
70
|
+
pruned: boolean;
|
|
71
|
+
}
|
|
72
|
+
export interface Manifest {
|
|
73
|
+
schemaVersion: 1;
|
|
74
|
+
rootPageId: string;
|
|
75
|
+
spaceKey: string;
|
|
76
|
+
generatedAt: string;
|
|
77
|
+
items: ManifestItem[];
|
|
78
|
+
deletions?: DeletionRecord[];
|
|
79
|
+
warnings: string[];
|
|
80
|
+
}
|
|
81
|
+
export type ChangeKind = "unchanged" | "local" | "remote" | "new-local" | "conflict" | "format-conflict";
|
|
82
|
+
export interface Change {
|
|
83
|
+
item: ManifestItem;
|
|
84
|
+
kind: ChangeKind;
|
|
85
|
+
detail: string;
|
|
86
|
+
remoteVersion?: number;
|
|
87
|
+
}
|
|
88
|
+
export interface PullOptions {
|
|
89
|
+
prune?: boolean;
|
|
90
|
+
dryRun?: boolean;
|
|
91
|
+
}
|
|
92
|
+
export interface LocalSnapshot {
|
|
93
|
+
item: ManifestItem;
|
|
94
|
+
storageHash?: string;
|
|
95
|
+
markdownHash?: string;
|
|
96
|
+
attachmentHashes: Map<string, string>;
|
|
97
|
+
}
|
|
98
|
+
export interface RemoteSnapshot {
|
|
99
|
+
item: ManifestItem;
|
|
100
|
+
remoteVersion?: number;
|
|
101
|
+
storage?: string;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@markwinap/confluence-sync-core",
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"description": "Framework-neutral Confluence content synchronization core",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"test": "node --test dist/*.test.js",
|
|
10
|
+
"prepublishOnly": "npm run build && npm test"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"axios": "^1.6.0",
|
|
14
|
+
"dotenv": "^16.3.0",
|
|
15
|
+
"form-data": "^4.0.0",
|
|
16
|
+
"turndown": "^7.1.2",
|
|
17
|
+
"turndown-plugin-gfm": "^1.0.2"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@types/node": "^20.0.0",
|
|
21
|
+
"@types/turndown": "^5.0.4",
|
|
22
|
+
"ts-node": "^10.9.0",
|
|
23
|
+
"typescript": "^5.3.0"
|
|
24
|
+
},
|
|
25
|
+
"license": "UNLICENSED"
|
|
26
|
+
}
|