@knpkv/confluence-to-markdown 0.2.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 +12 -0
- package/README.md +62 -0
- package/dist/Brand.d.ts +77 -0
- package/dist/Brand.d.ts.map +1 -0
- package/dist/Brand.js +44 -0
- package/dist/Brand.js.map +1 -0
- package/dist/ConfluenceClient.d.ts +140 -0
- package/dist/ConfluenceClient.d.ts.map +1 -0
- package/dist/ConfluenceClient.js +195 -0
- package/dist/ConfluenceClient.js.map +1 -0
- package/dist/ConfluenceConfig.d.ts +83 -0
- package/dist/ConfluenceConfig.d.ts.map +1 -0
- package/dist/ConfluenceConfig.js +122 -0
- package/dist/ConfluenceConfig.js.map +1 -0
- package/dist/ConfluenceError.d.ts +178 -0
- package/dist/ConfluenceError.d.ts.map +1 -0
- package/dist/ConfluenceError.js +131 -0
- package/dist/ConfluenceError.js.map +1 -0
- package/dist/LocalFileSystem.d.ts +85 -0
- package/dist/LocalFileSystem.d.ts.map +1 -0
- package/dist/LocalFileSystem.js +101 -0
- package/dist/LocalFileSystem.js.map +1 -0
- package/dist/MarkdownConverter.d.ts +50 -0
- package/dist/MarkdownConverter.d.ts.map +1 -0
- package/dist/MarkdownConverter.js +151 -0
- package/dist/MarkdownConverter.js.map +1 -0
- package/dist/Schemas.d.ts +225 -0
- package/dist/Schemas.d.ts.map +1 -0
- package/dist/Schemas.js +164 -0
- package/dist/Schemas.js.map +1 -0
- package/dist/SyncEngine.d.ts +132 -0
- package/dist/SyncEngine.d.ts.map +1 -0
- package/dist/SyncEngine.js +267 -0
- package/dist/SyncEngine.js.map +1 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +163 -0
- package/dist/bin.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/frontmatter.d.ts +38 -0
- package/dist/internal/frontmatter.d.ts.map +1 -0
- package/dist/internal/frontmatter.js +69 -0
- package/dist/internal/frontmatter.js.map +1 -0
- package/dist/internal/hashUtils.d.ts +11 -0
- package/dist/internal/hashUtils.d.ts.map +1 -0
- package/dist/internal/hashUtils.js +17 -0
- package/dist/internal/hashUtils.js.map +1 -0
- package/dist/internal/pathUtils.d.ts +41 -0
- package/dist/internal/pathUtils.d.ts.map +1 -0
- package/dist/internal/pathUtils.js +69 -0
- package/dist/internal/pathUtils.js.map +1 -0
- package/package.json +113 -0
- package/src/Brand.ts +104 -0
- package/src/ConfluenceClient.ts +387 -0
- package/src/ConfluenceConfig.ts +184 -0
- package/src/ConfluenceError.ts +193 -0
- package/src/LocalFileSystem.ts +225 -0
- package/src/MarkdownConverter.ts +187 -0
- package/src/Schemas.ts +235 -0
- package/src/SyncEngine.ts +429 -0
- package/src/bin.ts +269 -0
- package/src/index.ts +35 -0
- package/src/internal/frontmatter.ts +98 -0
- package/src/internal/hashUtils.ts +19 -0
- package/src/internal/pathUtils.ts +77 -0
- package/test/Brand.test.ts +72 -0
- package/test/MarkdownConverter.test.ts +108 -0
- package/test/Schemas.test.ts +99 -0
- package/tsconfig.json +32 -0
- package/vitest.config.integration.ts +12 -0
- package/vitest.config.ts +13 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync engine for bidirectional Confluence <-> Markdown synchronization.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import * as Path from "@effect/platform/Path";
|
|
7
|
+
import * as Context from "effect/Context";
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
9
|
+
import * as Layer from "effect/Layer";
|
|
10
|
+
import { ConfluenceClient } from "./ConfluenceClient.js";
|
|
11
|
+
import { ConfluenceConfig } from "./ConfluenceConfig.js";
|
|
12
|
+
import type { ApiError, ConflictError, ConversionError, FileSystemError, FrontMatterError, RateLimitError } from "./ConfluenceError.js";
|
|
13
|
+
import { LocalFileSystem } from "./LocalFileSystem.js";
|
|
14
|
+
import { MarkdownConverter } from "./MarkdownConverter.js";
|
|
15
|
+
import type { PageResponse } from "./Schemas.js";
|
|
16
|
+
/**
|
|
17
|
+
* Sync status for a single page.
|
|
18
|
+
*/
|
|
19
|
+
export type SyncStatus = {
|
|
20
|
+
readonly _tag: "Synced";
|
|
21
|
+
readonly path: string;
|
|
22
|
+
} | {
|
|
23
|
+
readonly _tag: "LocalOnly";
|
|
24
|
+
readonly path: string;
|
|
25
|
+
readonly title: string;
|
|
26
|
+
} | {
|
|
27
|
+
readonly _tag: "RemoteOnly";
|
|
28
|
+
readonly page: PageResponse;
|
|
29
|
+
} | {
|
|
30
|
+
readonly _tag: "LocalModified";
|
|
31
|
+
readonly path: string;
|
|
32
|
+
readonly page: PageResponse;
|
|
33
|
+
} | {
|
|
34
|
+
readonly _tag: "RemoteModified";
|
|
35
|
+
readonly path: string;
|
|
36
|
+
readonly page: PageResponse;
|
|
37
|
+
} | {
|
|
38
|
+
readonly _tag: "Conflict";
|
|
39
|
+
readonly path: string;
|
|
40
|
+
readonly page: PageResponse;
|
|
41
|
+
readonly localVersion: number;
|
|
42
|
+
readonly remoteVersion: number;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* Result of a pull operation.
|
|
46
|
+
*/
|
|
47
|
+
export interface PullResult {
|
|
48
|
+
readonly pulled: number;
|
|
49
|
+
readonly skipped: number;
|
|
50
|
+
readonly errors: ReadonlyArray<string>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Result of a push operation.
|
|
54
|
+
*/
|
|
55
|
+
export interface PushResult {
|
|
56
|
+
readonly pushed: number;
|
|
57
|
+
readonly created: number;
|
|
58
|
+
readonly skipped: number;
|
|
59
|
+
readonly errors: ReadonlyArray<string>;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Result of a sync operation.
|
|
63
|
+
*/
|
|
64
|
+
export interface SyncResult {
|
|
65
|
+
readonly pulled: number;
|
|
66
|
+
readonly pushed: number;
|
|
67
|
+
readonly created: number;
|
|
68
|
+
readonly conflicts: number;
|
|
69
|
+
readonly errors: ReadonlyArray<string>;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Result of a status operation.
|
|
73
|
+
*/
|
|
74
|
+
export interface StatusResult {
|
|
75
|
+
readonly synced: number;
|
|
76
|
+
readonly localModified: number;
|
|
77
|
+
readonly remoteModified: number;
|
|
78
|
+
readonly conflicts: number;
|
|
79
|
+
readonly localOnly: number;
|
|
80
|
+
readonly remoteOnly: number;
|
|
81
|
+
readonly files: ReadonlyArray<SyncStatus>;
|
|
82
|
+
}
|
|
83
|
+
type SyncError = ApiError | RateLimitError | ConversionError | FileSystemError | FrontMatterError;
|
|
84
|
+
declare const SyncEngine_base: Context.TagClass<SyncEngine, "@knpkv/confluence-to-markdown/SyncEngine", {
|
|
85
|
+
/**
|
|
86
|
+
* Pull pages from Confluence to local markdown.
|
|
87
|
+
*/
|
|
88
|
+
readonly pull: (options: {
|
|
89
|
+
force: boolean;
|
|
90
|
+
}) => Effect.Effect<PullResult, SyncError>;
|
|
91
|
+
/**
|
|
92
|
+
* Push local markdown changes to Confluence.
|
|
93
|
+
*/
|
|
94
|
+
readonly push: (options: {
|
|
95
|
+
dryRun: boolean;
|
|
96
|
+
}) => Effect.Effect<PushResult, SyncError>;
|
|
97
|
+
/**
|
|
98
|
+
* Bidirectional sync with conflict detection.
|
|
99
|
+
*/
|
|
100
|
+
readonly sync: () => Effect.Effect<SyncResult, SyncError | ConflictError>;
|
|
101
|
+
/**
|
|
102
|
+
* Get sync status for all files.
|
|
103
|
+
*/
|
|
104
|
+
readonly status: () => Effect.Effect<StatusResult, SyncError>;
|
|
105
|
+
}>;
|
|
106
|
+
/**
|
|
107
|
+
* Sync engine service for Confluence <-> Markdown operations.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* import { SyncEngine } from "@knpkv/confluence-to-markdown/SyncEngine"
|
|
112
|
+
* import { Effect } from "effect"
|
|
113
|
+
*
|
|
114
|
+
* const program = Effect.gen(function* () {
|
|
115
|
+
* const engine = yield* SyncEngine
|
|
116
|
+
* const result = yield* engine.pull({ force: false })
|
|
117
|
+
* console.log(`Pulled ${result.pulled} pages`)
|
|
118
|
+
* })
|
|
119
|
+
* ```
|
|
120
|
+
*
|
|
121
|
+
* @category Sync
|
|
122
|
+
*/
|
|
123
|
+
export declare class SyncEngine extends SyncEngine_base {
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Layer that provides SyncEngine.
|
|
127
|
+
*
|
|
128
|
+
* @category Layers
|
|
129
|
+
*/
|
|
130
|
+
export declare const layer: Layer.Layer<SyncEngine, never, ConfluenceClient | ConfluenceConfig | MarkdownConverter | LocalFileSystem | Path.Path>;
|
|
131
|
+
export {};
|
|
132
|
+
//# sourceMappingURL=SyncEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncEngine.d.ts","sourceRoot":"","sources":["../src/SyncEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sync engine for bidirectional Confluence <-> Markdown synchronization.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import * as Path from "@effect/platform/Path";
|
|
7
|
+
import * as Context from "effect/Context";
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
9
|
+
import * as Layer from "effect/Layer";
|
|
10
|
+
import { ConfluenceClient } from "./ConfluenceClient.js";
|
|
11
|
+
import { ConfluenceConfig } from "./ConfluenceConfig.js";
|
|
12
|
+
import { computeHash } from "./internal/hashUtils.js";
|
|
13
|
+
import { LocalFileSystem } from "./LocalFileSystem.js";
|
|
14
|
+
import { MarkdownConverter } from "./MarkdownConverter.js";
|
|
15
|
+
/**
|
|
16
|
+
* Sync engine service for Confluence <-> Markdown operations.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* import { SyncEngine } from "@knpkv/confluence-to-markdown/SyncEngine"
|
|
21
|
+
* import { Effect } from "effect"
|
|
22
|
+
*
|
|
23
|
+
* const program = Effect.gen(function* () {
|
|
24
|
+
* const engine = yield* SyncEngine
|
|
25
|
+
* const result = yield* engine.pull({ force: false })
|
|
26
|
+
* console.log(`Pulled ${result.pulled} pages`)
|
|
27
|
+
* })
|
|
28
|
+
* ```
|
|
29
|
+
*
|
|
30
|
+
* @category Sync
|
|
31
|
+
*/
|
|
32
|
+
export class SyncEngine extends Context.Tag("@knpkv/confluence-to-markdown/SyncEngine")() {
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Layer that provides SyncEngine.
|
|
36
|
+
*
|
|
37
|
+
* @category Layers
|
|
38
|
+
*/
|
|
39
|
+
export const layer = Layer.effect(SyncEngine, Effect.gen(function* () {
|
|
40
|
+
const client = yield* ConfluenceClient;
|
|
41
|
+
const config = yield* ConfluenceConfig;
|
|
42
|
+
const converter = yield* MarkdownConverter;
|
|
43
|
+
const localFs = yield* LocalFileSystem;
|
|
44
|
+
const pathService = yield* Path.Path;
|
|
45
|
+
const docsPath = pathService.join(process.cwd(), config.docsPath);
|
|
46
|
+
/**
|
|
47
|
+
* Pull a single page and its children recursively.
|
|
48
|
+
*/
|
|
49
|
+
const pullPage = (page, parentPath, force) => Effect.gen(function* () {
|
|
50
|
+
// Get children to determine if this is a folder
|
|
51
|
+
const children = yield* client.getAllChildren(page.id);
|
|
52
|
+
const hasChildren = children.length > 0;
|
|
53
|
+
const filePath = localFs.getPagePath(page.title, hasChildren, parentPath);
|
|
54
|
+
const dirPath = hasChildren ? localFs.getPageDir(page.title, parentPath) : parentPath;
|
|
55
|
+
// Get page content
|
|
56
|
+
const fullPage = yield* client.getPage(page.id);
|
|
57
|
+
const htmlContent = fullPage.body?.storage?.value ?? "";
|
|
58
|
+
let markdown = yield* converter.htmlToMarkdown(htmlContent);
|
|
59
|
+
// Add child page links for index pages
|
|
60
|
+
if (hasChildren && config.spaceKey) {
|
|
61
|
+
const childLinks = children
|
|
62
|
+
.map((child) => {
|
|
63
|
+
const pageUrl = `${config.baseUrl}/wiki/spaces/${config.spaceKey}/pages/${child.id}`;
|
|
64
|
+
return `- [${child.title}](${pageUrl})`;
|
|
65
|
+
})
|
|
66
|
+
.join("\n");
|
|
67
|
+
markdown = markdown.trim() + "\n\n## Child Pages\n\n" + childLinks + "\n";
|
|
68
|
+
}
|
|
69
|
+
const contentHash = computeHash(markdown);
|
|
70
|
+
// Check if we need to update
|
|
71
|
+
if (!force) {
|
|
72
|
+
const exists = yield* localFs.exists(filePath);
|
|
73
|
+
if (exists) {
|
|
74
|
+
const localFile = yield* localFs.readMarkdownFile(filePath);
|
|
75
|
+
if (localFile.frontMatter &&
|
|
76
|
+
localFile.frontMatter.version === fullPage.version.number &&
|
|
77
|
+
localFile.frontMatter.contentHash === contentHash) {
|
|
78
|
+
// Skip - already in sync
|
|
79
|
+
let count = 0;
|
|
80
|
+
for (const child of children) {
|
|
81
|
+
count += yield* pullPage(child, dirPath, force);
|
|
82
|
+
}
|
|
83
|
+
return count;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Ensure directory exists
|
|
88
|
+
if (hasChildren) {
|
|
89
|
+
yield* localFs.ensureDir(dirPath);
|
|
90
|
+
}
|
|
91
|
+
// Write file
|
|
92
|
+
const frontMatter = {
|
|
93
|
+
pageId: page.id,
|
|
94
|
+
version: fullPage.version.number,
|
|
95
|
+
title: fullPage.title,
|
|
96
|
+
updated: fullPage.version.createdAt ? new Date(fullPage.version.createdAt) : new Date(),
|
|
97
|
+
...(page.parentId ? { parentId: page.parentId } : {}),
|
|
98
|
+
...(page.position !== undefined ? { position: page.position } : {}),
|
|
99
|
+
contentHash
|
|
100
|
+
};
|
|
101
|
+
yield* localFs.writeMarkdownFile(filePath, frontMatter, markdown);
|
|
102
|
+
// Pull children
|
|
103
|
+
let count = 1;
|
|
104
|
+
for (const child of children) {
|
|
105
|
+
count += yield* pullPage(child, dirPath, force);
|
|
106
|
+
}
|
|
107
|
+
return count;
|
|
108
|
+
});
|
|
109
|
+
const pull = (options) => Effect.gen(function* () {
|
|
110
|
+
yield* localFs.ensureDir(docsPath);
|
|
111
|
+
const rootPage = yield* client.getPage(config.rootPageId);
|
|
112
|
+
const pulled = yield* pullPage(rootPage, docsPath, options.force);
|
|
113
|
+
return {
|
|
114
|
+
pulled,
|
|
115
|
+
skipped: 0,
|
|
116
|
+
errors: []
|
|
117
|
+
};
|
|
118
|
+
});
|
|
119
|
+
const push = (options) => Effect.gen(function* () {
|
|
120
|
+
const files = yield* localFs.listMarkdownFiles(docsPath);
|
|
121
|
+
let pushed = 0;
|
|
122
|
+
let created = 0;
|
|
123
|
+
let skipped = 0;
|
|
124
|
+
const errors = [];
|
|
125
|
+
for (const filePath of files) {
|
|
126
|
+
yield* Effect.gen(function* () {
|
|
127
|
+
const localFile = yield* localFs.readMarkdownFile(filePath);
|
|
128
|
+
if (localFile.isNew || !localFile.frontMatter) {
|
|
129
|
+
// New file - create page
|
|
130
|
+
if (!options.dryRun) {
|
|
131
|
+
// For now, skip page creation - need space ID in config
|
|
132
|
+
errors.push(`Page creation requires space ID in config (not yet supported): ${filePath}`);
|
|
133
|
+
}
|
|
134
|
+
created++;
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const fm = localFile.frontMatter;
|
|
138
|
+
const currentHash = computeHash(localFile.content);
|
|
139
|
+
if (currentHash === fm.contentHash) {
|
|
140
|
+
skipped++;
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (!options.dryRun) {
|
|
144
|
+
// Fetch current version to avoid conflicts
|
|
145
|
+
const remotePage = yield* client.getPage(fm.pageId);
|
|
146
|
+
const html = yield* converter.markdownToHtml(localFile.content);
|
|
147
|
+
const updatedPage = yield* client.updatePage({
|
|
148
|
+
id: fm.pageId,
|
|
149
|
+
title: fm.title,
|
|
150
|
+
status: "current",
|
|
151
|
+
version: {
|
|
152
|
+
number: remotePage.version.number + 1,
|
|
153
|
+
message: "Updated via confluence-to-markdown"
|
|
154
|
+
},
|
|
155
|
+
body: {
|
|
156
|
+
representation: "storage",
|
|
157
|
+
value: html
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
// Update front-matter with new version
|
|
161
|
+
const newFrontMatter = {
|
|
162
|
+
...fm,
|
|
163
|
+
version: updatedPage.version.number,
|
|
164
|
+
updated: new Date(),
|
|
165
|
+
contentHash: currentHash
|
|
166
|
+
};
|
|
167
|
+
yield* localFs.writeMarkdownFile(filePath, newFrontMatter, localFile.content);
|
|
168
|
+
}
|
|
169
|
+
pushed++;
|
|
170
|
+
}).pipe(Effect.catchAll((error) => Effect.sync(() => {
|
|
171
|
+
errors.push(`Failed to push ${filePath}: ${error._tag === "ApiError" ? error.message : error._tag}`);
|
|
172
|
+
})));
|
|
173
|
+
}
|
|
174
|
+
return { pushed, created, skipped, errors: errors };
|
|
175
|
+
});
|
|
176
|
+
const sync = () => Effect.gen(function* () {
|
|
177
|
+
// First, check for conflicts
|
|
178
|
+
const statusResult = yield* status();
|
|
179
|
+
const conflictErrors = [];
|
|
180
|
+
if (statusResult.conflicts > 0) {
|
|
181
|
+
for (const file of statusResult.files) {
|
|
182
|
+
if (file._tag === "Conflict") {
|
|
183
|
+
conflictErrors.push(`Conflict in ${file.path}: local v${file.localVersion} vs remote v${file.remoteVersion}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Pull remote changes
|
|
188
|
+
const pullResult = yield* pull({ force: false });
|
|
189
|
+
// Push local changes
|
|
190
|
+
const pushResult = yield* push({ dryRun: false });
|
|
191
|
+
return {
|
|
192
|
+
pulled: pullResult.pulled,
|
|
193
|
+
pushed: pushResult.pushed,
|
|
194
|
+
created: pushResult.created,
|
|
195
|
+
conflicts: statusResult.conflicts,
|
|
196
|
+
errors: [...conflictErrors, ...pullResult.errors, ...pushResult.errors]
|
|
197
|
+
};
|
|
198
|
+
});
|
|
199
|
+
const status = () => Effect.gen(function* () {
|
|
200
|
+
const files = yield* localFs.listMarkdownFiles(docsPath);
|
|
201
|
+
const statuses = [];
|
|
202
|
+
let synced = 0;
|
|
203
|
+
let localModified = 0;
|
|
204
|
+
let remoteModified = 0;
|
|
205
|
+
let conflicts = 0;
|
|
206
|
+
let localOnly = 0;
|
|
207
|
+
const remoteOnly = 0;
|
|
208
|
+
for (const filePath of files) {
|
|
209
|
+
const localFile = yield* localFs.readMarkdownFile(filePath);
|
|
210
|
+
if (localFile.isNew || !localFile.frontMatter) {
|
|
211
|
+
statuses.push({ _tag: "LocalOnly", path: filePath, title: pathService.basename(filePath, ".md") });
|
|
212
|
+
localOnly++;
|
|
213
|
+
continue;
|
|
214
|
+
}
|
|
215
|
+
const fm = localFile.frontMatter;
|
|
216
|
+
const currentHash = computeHash(localFile.content);
|
|
217
|
+
// Fetch remote page
|
|
218
|
+
const remotePage = yield* Effect.either(client.getPage(fm.pageId));
|
|
219
|
+
if (remotePage._tag === "Left") {
|
|
220
|
+
statuses.push({ _tag: "LocalOnly", path: filePath, title: fm.title });
|
|
221
|
+
localOnly++;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const page = remotePage.right;
|
|
225
|
+
const localChanged = currentHash !== fm.contentHash;
|
|
226
|
+
const remoteChanged = page.version.number > fm.version;
|
|
227
|
+
if (localChanged && remoteChanged) {
|
|
228
|
+
statuses.push({
|
|
229
|
+
_tag: "Conflict",
|
|
230
|
+
path: filePath,
|
|
231
|
+
page,
|
|
232
|
+
localVersion: fm.version,
|
|
233
|
+
remoteVersion: page.version.number
|
|
234
|
+
});
|
|
235
|
+
conflicts++;
|
|
236
|
+
}
|
|
237
|
+
else if (localChanged) {
|
|
238
|
+
statuses.push({ _tag: "LocalModified", path: filePath, page });
|
|
239
|
+
localModified++;
|
|
240
|
+
}
|
|
241
|
+
else if (remoteChanged) {
|
|
242
|
+
statuses.push({ _tag: "RemoteModified", path: filePath, page });
|
|
243
|
+
remoteModified++;
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
statuses.push({ _tag: "Synced", path: filePath });
|
|
247
|
+
synced++;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
synced,
|
|
252
|
+
localModified,
|
|
253
|
+
remoteModified,
|
|
254
|
+
conflicts,
|
|
255
|
+
localOnly,
|
|
256
|
+
remoteOnly,
|
|
257
|
+
files: statuses
|
|
258
|
+
};
|
|
259
|
+
});
|
|
260
|
+
return SyncEngine.of({
|
|
261
|
+
pull,
|
|
262
|
+
push,
|
|
263
|
+
sync,
|
|
264
|
+
status
|
|
265
|
+
});
|
|
266
|
+
}));
|
|
267
|
+
//# sourceMappingURL=SyncEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SyncEngine.js","sourceRoot":"","sources":["../src/SyncEngine.ts"],"names":[],"mappings":"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"}
|
package/dist/bin.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
|
package/dist/bin.js
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI entry point for confluence-to-markdown.
|
|
4
|
+
*/
|
|
5
|
+
import { Command, Options, Prompt } from "@effect/cli";
|
|
6
|
+
import * as NodeContext from "@effect/platform-node/NodeContext";
|
|
7
|
+
import * as NodeHttpClient from "@effect/platform-node/NodeHttpClient";
|
|
8
|
+
import * as NodeRuntime from "@effect/platform-node/NodeRuntime";
|
|
9
|
+
import * as NodeTerminal from "@effect/platform-node/NodeTerminal";
|
|
10
|
+
import * as Config from "effect/Config";
|
|
11
|
+
import * as Console from "effect/Console";
|
|
12
|
+
import * as Effect from "effect/Effect";
|
|
13
|
+
import * as Layer from "effect/Layer";
|
|
14
|
+
import * as Option from "effect/Option";
|
|
15
|
+
import pkg from "../package.json" with { type: "json" };
|
|
16
|
+
import { ConfluenceClient, layer as ConfluenceClientLayer } from "./ConfluenceClient.js";
|
|
17
|
+
import { ConfluenceConfig, createConfigFile, layer as ConfluenceConfigLayer, layerFromValues as ConfluenceConfigLayerFromValues } from "./ConfluenceConfig.js";
|
|
18
|
+
import { AuthMissingError } from "./ConfluenceError.js";
|
|
19
|
+
import { layer as LocalFileSystemLayer } from "./LocalFileSystem.js";
|
|
20
|
+
import { layer as MarkdownConverterLayer } from "./MarkdownConverter.js";
|
|
21
|
+
import { layer as SyncEngineLayer, SyncEngine } from "./SyncEngine.js";
|
|
22
|
+
// === Auth config ===
|
|
23
|
+
const AuthConfig = Config.all({
|
|
24
|
+
apiKey: Config.string("CONFLUENCE_API_KEY"),
|
|
25
|
+
email: Config.string("CONFLUENCE_EMAIL")
|
|
26
|
+
});
|
|
27
|
+
const getAuth = () => AuthConfig.pipe(Effect.map(({ apiKey, email }) => ({ type: "token", email, token: apiKey })), Effect.mapError(() => new AuthMissingError()));
|
|
28
|
+
// === Init command ===
|
|
29
|
+
const rootPageIdOption = Options.text("root-page-id").pipe(Options.withDescription("Confluence root page ID to sync from"), Options.optional);
|
|
30
|
+
const baseUrlOption = Options.text("base-url").pipe(Options.withDescription("Confluence Cloud base URL (e.g., https://yoursite.atlassian.net)"), Options.optional);
|
|
31
|
+
const initCommand = Command.make("init", { rootPageId: rootPageIdOption, baseUrl: baseUrlOption }, ({ baseUrl, rootPageId }) => Effect.gen(function* () {
|
|
32
|
+
const pageId = Option.isSome(rootPageId)
|
|
33
|
+
? rootPageId.value
|
|
34
|
+
: yield* Prompt.text({ message: "Enter Confluence root page ID:" });
|
|
35
|
+
const url = Option.isSome(baseUrl)
|
|
36
|
+
? baseUrl.value
|
|
37
|
+
: yield* Prompt.text({ message: "Enter Confluence base URL (e.g., https://yoursite.atlassian.net):" });
|
|
38
|
+
const path = yield* createConfigFile(pageId, url);
|
|
39
|
+
yield* Console.log(`Created configuration file: ${path}`);
|
|
40
|
+
})).pipe(Command.withDescription("Initialize .confluence.json configuration"));
|
|
41
|
+
// === Pull command ===
|
|
42
|
+
const forceOption = Options.boolean("force").pipe(Options.withAlias("f"), Options.withDescription("Overwrite local changes"));
|
|
43
|
+
const pullCommand = Command.make("pull", { force: forceOption }, ({ force }) => Effect.gen(function* () {
|
|
44
|
+
const engine = yield* SyncEngine;
|
|
45
|
+
yield* Console.log("Pulling pages from Confluence...");
|
|
46
|
+
const result = yield* engine.pull({ force });
|
|
47
|
+
yield* Console.log(`Pulled ${result.pulled} pages`);
|
|
48
|
+
if (result.errors.length > 0) {
|
|
49
|
+
yield* Console.error("Errors:", result.errors.join("\n"));
|
|
50
|
+
}
|
|
51
|
+
})).pipe(Command.withDescription("Download pages from Confluence to local markdown"));
|
|
52
|
+
// === Push command ===
|
|
53
|
+
const dryRunOption = Options.boolean("dry-run").pipe(Options.withAlias("n"), Options.withDescription("Show changes without applying"));
|
|
54
|
+
const pushCommand = Command.make("push", { dryRun: dryRunOption }, ({ dryRun }) => Effect.gen(function* () {
|
|
55
|
+
const engine = yield* SyncEngine;
|
|
56
|
+
yield* Console.log(dryRun ? "Dry run - showing changes..." : "Pushing changes to Confluence...");
|
|
57
|
+
const result = yield* engine.push({ dryRun });
|
|
58
|
+
yield* Console.log(`Pushed: ${result.pushed}, Created: ${result.created}, Skipped: ${result.skipped}`);
|
|
59
|
+
if (result.errors.length > 0) {
|
|
60
|
+
yield* Console.error("Errors:", result.errors.join("\n"));
|
|
61
|
+
}
|
|
62
|
+
})).pipe(Command.withDescription("Upload local markdown changes to Confluence"));
|
|
63
|
+
// === Sync command ===
|
|
64
|
+
const syncCommand = Command.make("sync", {}, () => Effect.gen(function* () {
|
|
65
|
+
const engine = yield* SyncEngine;
|
|
66
|
+
yield* Console.log("Syncing with Confluence...");
|
|
67
|
+
const result = yield* engine.sync();
|
|
68
|
+
yield* Console.log(`Pulled: ${result.pulled}, Pushed: ${result.pushed}, Created: ${result.created}`);
|
|
69
|
+
if (result.conflicts > 0) {
|
|
70
|
+
yield* Console.warn(`Conflicts: ${result.conflicts}`);
|
|
71
|
+
}
|
|
72
|
+
if (result.errors.length > 0) {
|
|
73
|
+
yield* Console.error("Errors:", result.errors.join("\n"));
|
|
74
|
+
}
|
|
75
|
+
})).pipe(Command.withDescription("Bidirectional sync with conflict detection"));
|
|
76
|
+
// === Status command ===
|
|
77
|
+
const statusCommand = Command.make("status", {}, () => Effect.gen(function* () {
|
|
78
|
+
const engine = yield* SyncEngine;
|
|
79
|
+
const result = yield* engine.status();
|
|
80
|
+
yield* Console.log(`
|
|
81
|
+
Sync Status:
|
|
82
|
+
Synced: ${result.synced}
|
|
83
|
+
Local Modified: ${result.localModified}
|
|
84
|
+
Remote Modified: ${result.remoteModified}
|
|
85
|
+
Conflicts: ${result.conflicts}
|
|
86
|
+
Local Only: ${result.localOnly}
|
|
87
|
+
Remote Only: ${result.remoteOnly}
|
|
88
|
+
`);
|
|
89
|
+
if (result.files.length > 0 && result.synced < result.files.length) {
|
|
90
|
+
yield* Console.log("Changed files:");
|
|
91
|
+
for (const file of result.files) {
|
|
92
|
+
if (file._tag !== "Synced" && file._tag !== "RemoteOnly") {
|
|
93
|
+
yield* Console.log(` [${file._tag}] ${file.path}`);
|
|
94
|
+
}
|
|
95
|
+
else if (file._tag === "RemoteOnly") {
|
|
96
|
+
yield* Console.log(` [${file._tag}] ${file.page.title}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
})).pipe(Command.withDescription("Show sync status"));
|
|
101
|
+
// === Main command ===
|
|
102
|
+
const confluence = Command.make("confluence").pipe(Command.withDescription("Sync Confluence pages to local markdown"), Command.withSubcommands([initCommand, pullCommand, pushCommand, syncCommand, statusCommand]));
|
|
103
|
+
// === Build app layer ===
|
|
104
|
+
// Dummy config layer for help/init
|
|
105
|
+
const DummyConfigLayer = ConfluenceConfigLayerFromValues({
|
|
106
|
+
rootPageId: "dummy",
|
|
107
|
+
baseUrl: "https://dummy.atlassian.net",
|
|
108
|
+
docsPath: ".docs/confluence",
|
|
109
|
+
excludePatterns: []
|
|
110
|
+
});
|
|
111
|
+
// Dummy client layer for help/init (will fail if actually used)
|
|
112
|
+
const DummyConfluenceClientLayer = Layer.succeed(ConfluenceClient, ConfluenceClient.of({
|
|
113
|
+
getPage: () => Effect.dieMessage("Not configured"),
|
|
114
|
+
getChildren: () => Effect.dieMessage("Not configured"),
|
|
115
|
+
getAllChildren: () => Effect.dieMessage("Not configured"),
|
|
116
|
+
createPage: () => Effect.dieMessage("Not configured"),
|
|
117
|
+
updatePage: () => Effect.dieMessage("Not configured"),
|
|
118
|
+
deletePage: () => Effect.dieMessage("Not configured")
|
|
119
|
+
}));
|
|
120
|
+
// Dummy sync engine that will fail if actually used
|
|
121
|
+
const DummySyncEngineLayer = Layer.succeed(SyncEngine, SyncEngine.of({
|
|
122
|
+
pull: () => Effect.dieMessage("Not configured - run 'confluence init' first"),
|
|
123
|
+
push: () => Effect.dieMessage("Not configured - run 'confluence init' first"),
|
|
124
|
+
sync: () => Effect.dieMessage("Not configured - run 'confluence init' first"),
|
|
125
|
+
status: () => Effect.dieMessage("Not configured - run 'confluence init' first")
|
|
126
|
+
}));
|
|
127
|
+
// Build client layer dynamically based on auth
|
|
128
|
+
const ConfluenceClientLive = Layer.unwrapEffect(Effect.gen(function* () {
|
|
129
|
+
const auth = yield* getAuth();
|
|
130
|
+
const config = yield* ConfluenceConfig;
|
|
131
|
+
const clientConfig = {
|
|
132
|
+
baseUrl: config.baseUrl,
|
|
133
|
+
auth
|
|
134
|
+
};
|
|
135
|
+
return ConfluenceClientLayer(clientConfig);
|
|
136
|
+
}));
|
|
137
|
+
// Full app layer with all services
|
|
138
|
+
const AppLayer = SyncEngineLayer.pipe(Layer.provideMerge(ConfluenceClientLive), Layer.provideMerge(MarkdownConverterLayer), Layer.provideMerge(LocalFileSystemLayer), Layer.provideMerge(ConfluenceConfigLayer()), Layer.provideMerge(NodeHttpClient.layer), Layer.provideMerge(NodeContext.layer));
|
|
139
|
+
// Minimal layer for init/help (dummy services, won't be invoked)
|
|
140
|
+
const MinimalLayer = DummySyncEngineLayer.pipe(Layer.provideMerge(DummyConfluenceClientLayer), Layer.provideMerge(MarkdownConverterLayer), Layer.provideMerge(LocalFileSystemLayer), Layer.provideMerge(DummyConfigLayer), Layer.provideMerge(NodeTerminal.layer), Layer.provideMerge(NodeContext.layer));
|
|
141
|
+
// === Run CLI ===
|
|
142
|
+
const cli = Command.run(confluence, {
|
|
143
|
+
name: pkg.name,
|
|
144
|
+
version: pkg.version
|
|
145
|
+
});
|
|
146
|
+
// Check if we need the full layer based on command
|
|
147
|
+
const needsFullLayer = () => {
|
|
148
|
+
const args = process.argv;
|
|
149
|
+
const cmd = args[2];
|
|
150
|
+
// init, --help, -h, --version don't need config
|
|
151
|
+
if (!cmd || cmd === "init" || cmd === "--help" || cmd === "-h" || cmd === "--version") {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
return true;
|
|
155
|
+
};
|
|
156
|
+
const main = Effect.suspend(() => cli(process.argv));
|
|
157
|
+
if (needsFullLayer()) {
|
|
158
|
+
main.pipe(Effect.provide(AppLayer), Effect.tapErrorCause(Effect.logError), NodeRuntime.runMain);
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
main.pipe(Effect.provide(MinimalLayer), Effect.tapErrorCause(Effect.logError), NodeRuntime.runMain);
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=bin.js.map
|
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,KAAK,WAAW,MAAM,mCAAmC,CAAA;AAChE,OAAO,KAAK,cAAc,MAAM,sCAAsC,CAAA;AACtE,OAAO,KAAK,WAAW,MAAM,mCAAmC,CAAA;AAChE,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAA;AAClE,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAEvD,OAAO,EAAE,gBAAgB,EAA+B,KAAK,IAAI,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AACrH,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,IAAI,qBAAqB,EAC9B,eAAe,IAAI,+BAA+B,EACnD,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAAE,KAAK,IAAI,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AACpE,OAAO,EAAE,KAAK,IAAI,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AACxE,OAAO,EAAE,KAAK,IAAI,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEtE,sBAAsB;AACtB,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC;CACzC,CAAC,CAAA;AAEF,MAAM,OAAO,GAAG,GAAoE,EAAE,CACpF,UAAU,CAAC,IAAI,CACb,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EACrF,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAC9C,CAAA;AAEH,uBAAuB;AACvB,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CACxD,OAAO,CAAC,eAAe,CAAC,sCAAsC,CAAC,EAC/D,OAAO,CAAC,QAAQ,CACjB,CAAA;AACD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CACjD,OAAO,CAAC,eAAe,CAAC,kEAAkE,CAAC,EAC3F,OAAO,CAAC,QAAQ,CACjB,CAAA;AAED,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAC9B,MAAM,EACN,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,EAAE,EACxD,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAC1B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;QACtC,CAAC,CAAC,UAAU,CAAC,KAAK;QAClB,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,CAAA;IACrE,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QAChC,CAAC,CAAC,OAAO,CAAC,KAAK;QACf,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,mEAAmE,EAAE,CAAC,CAAA;IACxG,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACjD,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,EAAE,CAAC,CAAA;AAC3D,CAAC,CAAC,CACL,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,2CAA2C,CAAC,CAAC,CAAA;AAE5E,uBAAuB;AACvB,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAC/C,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,eAAe,CAAC,yBAAyB,CAAC,CACnD,CAAA;AAED,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAC7E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAA;IAChC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;IACtD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IAC5C,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,MAAM,QAAQ,CAAC,CAAA;IACnD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,kDAAkD,CAAC,CAAC,CAAA;AAEvF,uBAAuB;AACvB,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAClD,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,eAAe,CAAC,+BAA+B,CAAC,CACzD,CAAA;AAED,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAChF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAA;IAChC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAA;IAChG,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAC7C,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,cAAc,MAAM,CAAC,OAAO,cAAc,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IACtG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,6CAA6C,CAAC,CAAC,CAAA;AAElF,uBAAuB;AACvB,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,CAChD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAA;IAChC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;IACnC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,aAAa,MAAM,CAAC,MAAM,cAAc,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;IACpG,IAAI,MAAM,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,SAAS,EAAE,CAAC,CAAA;IACvD,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3D,CAAC;AACH,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,4CAA4C,CAAC,CAAC,CAAA;AAEjF,yBAAyB;AACzB,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,CACpD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,UAAU,CAAA;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAA;IACrC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;;qBAEF,MAAM,CAAC,MAAM;qBACb,MAAM,CAAC,aAAa;qBACpB,MAAM,CAAC,cAAc;qBACrB,MAAM,CAAC,SAAS;qBAChB,MAAM,CAAC,SAAS;qBAChB,MAAM,CAAC,UAAU;CACrC,CAAC,CAAA;IACE,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACnE,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;QACpC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACzD,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YACrD,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACtC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;YAC3D,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,CAAA;AAEvD,uBAAuB;AACvB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAChD,OAAO,CAAC,eAAe,CAAC,yCAAyC,CAAC,EAClE,OAAO,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAC7F,CAAA;AAED,0BAA0B;AAC1B,mCAAmC;AACnC,MAAM,gBAAgB,GAAG,+BAA+B,CAAC;IACvD,UAAU,EAAE,OAAiB;IAC7B,OAAO,EAAE,6BAA6B;IACtC,QAAQ,EAAE,kBAAkB;IAC5B,eAAe,EAAE,EAAE;CACpB,CAAC,CAAA;AAEF,gEAAgE;AAChE,MAAM,0BAA0B,GAAG,KAAK,CAAC,OAAO,CAC9C,gBAAgB,EAChB,gBAAgB,CAAC,EAAE,CAAC;IAClB,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC;IAClD,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC;IACtD,cAAc,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC;IACzD,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC;IACrD,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC;IACrD,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC;CACtD,CAAC,CACH,CAAA;AAED,oDAAoD;AACpD,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CACxC,UAAU,EACV,UAAU,CAAC,EAAE,CAAC;IACZ,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,8CAA8C,CAAC;IAC7E,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,8CAA8C,CAAC;IAC7E,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,8CAA8C,CAAC;IAC7E,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,8CAA8C,CAAC;CAChF,CAAC,CACH,CAAA;AAED,+CAA+C;AAC/C,MAAM,oBAAoB,GAAG,KAAK,CAAC,YAAY,CAC7C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;IAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAA;IAEtC,MAAM,YAAY,GAA2B;QAC3C,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI;KACL,CAAA;IAED,OAAO,qBAAqB,CAAC,YAAY,CAAC,CAAA;AAC5C,CAAC,CAAC,CACH,CAAA;AAED,mCAAmC;AACnC,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CACnC,KAAK,CAAC,YAAY,CAAC,oBAAoB,CAAC,EACxC,KAAK,CAAC,YAAY,CAAC,sBAAsB,CAAC,EAC1C,KAAK,CAAC,YAAY,CAAC,oBAAoB,CAAC,EACxC,KAAK,CAAC,YAAY,CAAC,qBAAqB,EAAE,CAAC,EAC3C,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,EACxC,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CACtC,CAAA;AAED,iEAAiE;AACjE,MAAM,YAAY,GAAG,oBAAoB,CAAC,IAAI,CAC5C,KAAK,CAAC,YAAY,CAAC,0BAA0B,CAAC,EAC9C,KAAK,CAAC,YAAY,CAAC,sBAAsB,CAAC,EAC1C,KAAK,CAAC,YAAY,CAAC,oBAAoB,CAAC,EACxC,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,EACpC,KAAK,CAAC,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,EACtC,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CACtC,CAAA;AAED,kBAAkB;AAClB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE;IAClC,IAAI,EAAE,GAAG,CAAC,IAAI;IACd,OAAO,EAAE,GAAG,CAAC,OAAO;CACrB,CAAC,CAAA;AAEF,mDAAmD;AACnD,MAAM,cAAc,GAAG,GAAG,EAAE;IAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;IACzB,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,gDAAgD;IAChD,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,WAAW,EAAE,CAAC;QACtF,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;AAEpD,IAAI,cAAc,EAAE,EAAE,CAAC;IACrB,IAAI,CAAC,IAAI,CACP,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EACxB,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EACrC,WAAW,CAAC,OAAO,CACpB,CAAA;AACH,CAAC;KAAM,CAAC;IACN,IAAI,CAAC,IAAI,CACP,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAC5B,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,EACrC,WAAW,CAAC,OAAO,CACpB,CAAA;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @knpkv/confluence-to-markdown
|
|
3
|
+
*
|
|
4
|
+
* Sync Confluence Cloud pages to local GitHub Flavored Markdown files.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export * from "./Brand.js";
|
|
9
|
+
export { ConfluenceClient, type ConfluenceClientConfig, type CreatePageRequest, layer as ConfluenceClientLayer, type UpdatePageRequest } from "./ConfluenceClient.js";
|
|
10
|
+
export { ConfluenceConfig, createConfigFile, layer as ConfluenceConfigLayer, layerFromValues as ConfluenceConfigLayerFromValues } from "./ConfluenceConfig.js";
|
|
11
|
+
export * from "./ConfluenceError.js";
|
|
12
|
+
export { layer as LocalFileSystemLayer, type LocalFile, LocalFileSystem } from "./LocalFileSystem.js";
|
|
13
|
+
export { layer as MarkdownConverterLayer, MarkdownConverter } from "./MarkdownConverter.js";
|
|
14
|
+
export * from "./Schemas.js";
|
|
15
|
+
export { layer as SyncEngineLayer, type PullResult, type PushResult, type StatusResult, SyncEngine, type SyncResult, type SyncStatus } from "./SyncEngine.js";
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,YAAY,CAAA;AAC1B,OAAO,EACL,gBAAgB,EAChB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,IAAI,qBAAqB,EAC9B,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,IAAI,qBAAqB,EAC9B,eAAe,IAAI,+BAA+B,EACnD,MAAM,uBAAuB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,OAAO,EAAE,KAAK,IAAI,oBAAoB,EAAE,KAAK,SAAS,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACrG,OAAO,EAAE,KAAK,IAAI,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC3F,cAAc,cAAc,CAAA;AAC5B,OAAO,EACL,KAAK,IAAI,eAAe,EACxB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,UAAU,EACV,KAAK,UAAU,EACf,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @knpkv/confluence-to-markdown
|
|
3
|
+
*
|
|
4
|
+
* Sync Confluence Cloud pages to local GitHub Flavored Markdown files.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
export * from "./Brand.js";
|
|
9
|
+
export { ConfluenceClient, layer as ConfluenceClientLayer } from "./ConfluenceClient.js";
|
|
10
|
+
export { ConfluenceConfig, createConfigFile, layer as ConfluenceConfigLayer, layerFromValues as ConfluenceConfigLayerFromValues } from "./ConfluenceConfig.js";
|
|
11
|
+
export * from "./ConfluenceError.js";
|
|
12
|
+
export { layer as LocalFileSystemLayer, LocalFileSystem } from "./LocalFileSystem.js";
|
|
13
|
+
export { layer as MarkdownConverterLayer, MarkdownConverter } from "./MarkdownConverter.js";
|
|
14
|
+
export * from "./Schemas.js";
|
|
15
|
+
export { layer as SyncEngineLayer, SyncEngine } from "./SyncEngine.js";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,cAAc,YAAY,CAAA;AAC1B,OAAO,EACL,gBAAgB,EAGhB,KAAK,IAAI,qBAAqB,EAE/B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,IAAI,qBAAqB,EAC9B,eAAe,IAAI,+BAA+B,EACnD,MAAM,uBAAuB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,OAAO,EAAE,KAAK,IAAI,oBAAoB,EAAkB,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACrG,OAAO,EAAE,KAAK,IAAI,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC3F,cAAc,cAAc,CAAA;AAC5B,OAAO,EACL,KAAK,IAAI,eAAe,EAIxB,UAAU,EAGX,MAAM,iBAAiB,CAAA"}
|