@relayfile/adapter-confluence 0.1.4 → 0.1.6

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=emit-auxiliary-files.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-auxiliary-files.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/emit-auxiliary-files.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,353 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { emitConfluenceAuxiliaryFiles } from '../emit-auxiliary-files.js';
4
+ import { confluencePageByIdAliasPath, confluencePageByParentAliasPath, confluencePageBySpaceAliasPath, confluencePageByStatePath, confluencePageByTitleAliasPath, confluencePagePath, confluencePagesIndexPath, confluenceSpaceByIdAliasPath, confluenceSpaceByKeyAliasPath, confluenceSpaceByTitleAliasPath, confluenceSpacePath, confluenceSpacesIndexPath, } from '../path-mapper.js';
5
+ function createClient(options = {}) {
6
+ const files = new Map(Object.entries(options.initialFiles ?? {}));
7
+ const writes = [];
8
+ const deletes = [];
9
+ const reads = [];
10
+ const failWriteOn = options.failWriteOn ?? new Set();
11
+ const failReadOn = options.failReadOn ?? new Set();
12
+ const client = {
13
+ writes,
14
+ deletes,
15
+ reads,
16
+ files,
17
+ async writeFile(input) {
18
+ writes.push(input);
19
+ if (failWriteOn.has(input.path)) {
20
+ throw new Error(`forced write failure at ${input.path}`);
21
+ }
22
+ files.set(input.path, input.content);
23
+ return { created: true };
24
+ },
25
+ async deleteFile(input) {
26
+ deletes.push(input);
27
+ files.delete(input.path);
28
+ },
29
+ };
30
+ if (!options.noRead) {
31
+ client.readFile = async (input) => {
32
+ reads.push(input);
33
+ if (failReadOn.has(input.path)) {
34
+ throw new Error(`forced read failure at ${input.path}`);
35
+ }
36
+ const content = files.get(input.path);
37
+ return content === undefined ? null : { content };
38
+ };
39
+ }
40
+ return client;
41
+ }
42
+ describe('emitConfluenceAuxiliaryFiles', () => {
43
+ it('returns a zero result on empty input', async () => {
44
+ const client = createClient();
45
+ const result = await emitConfluenceAuxiliaryFiles(client, { workspaceId: 'ws-1' });
46
+ assert.deepEqual(result, { written: 0, deleted: 0, errors: [] });
47
+ assert.equal(client.writes.length, 0);
48
+ assert.equal(client.deletes.length, 0);
49
+ });
50
+ it('writes the canonical path plus every applicable page alias plus the index row', async () => {
51
+ const client = createClient();
52
+ const page = {
53
+ id: '98765',
54
+ title: 'Release Plan',
55
+ status: 'current',
56
+ spaceId: '12345',
57
+ parentId: '54321',
58
+ };
59
+ const result = await emitConfluenceAuxiliaryFiles(client, {
60
+ workspaceId: 'ws-1',
61
+ pages: [page],
62
+ });
63
+ // Page emits 6 files (canonical + by-id + by-title + by-state + by-space + by-parent),
64
+ // plus 1 index file write.
65
+ assert.equal(result.written, 7);
66
+ assert.deepEqual(result.errors, []);
67
+ const expectedPaths = [
68
+ confluencePagePath('98765', 'Release Plan', '12345'),
69
+ confluencePageByIdAliasPath('98765'),
70
+ confluencePageByTitleAliasPath('Release Plan', '98765'),
71
+ confluencePageByStatePath('current', '98765'),
72
+ confluencePageBySpaceAliasPath('12345', '98765'),
73
+ confluencePageByParentAliasPath('54321', '98765'),
74
+ confluencePagesIndexPath(),
75
+ ];
76
+ const writtenPaths = client.writes.map((w) => w.path);
77
+ for (const expected of expectedPaths) {
78
+ assert.ok(writtenPaths.includes(expected), `missing expected path ${expected}`);
79
+ }
80
+ // Index row contains the page.
81
+ const indexBytes = client.files.get(confluencePagesIndexPath());
82
+ const rows = JSON.parse(indexBytes);
83
+ assert.equal(rows.length, 1);
84
+ assert.equal(rows[0].id, '98765');
85
+ assert.equal(rows[0].title, 'Release Plan');
86
+ assert.equal(rows[0].spaceId, '12345');
87
+ // Canonical bytes are identical at every emitted alias path.
88
+ const canonicalBytes = client.files.get(confluencePagePath('98765', 'Release Plan', '12345'));
89
+ for (const path of expectedPaths) {
90
+ if (path === confluencePagesIndexPath())
91
+ continue;
92
+ assert.equal(client.files.get(path), canonicalBytes, `bytes mismatch at ${path}`);
93
+ }
94
+ });
95
+ it('reconciles prior by-title alias on page rename via the by-id anchor', async () => {
96
+ // Seed the by-id alias as if a prior write had landed under the old title.
97
+ const priorPayload = {
98
+ provider: 'confluence',
99
+ objectType: 'page',
100
+ objectId: '98765',
101
+ deleted: false,
102
+ payload: { id: '98765', title: 'Old Title', status: 'current', spaceId: '12345' },
103
+ };
104
+ const client = createClient({
105
+ initialFiles: {
106
+ [confluencePageByIdAliasPath('98765')]: JSON.stringify(priorPayload),
107
+ },
108
+ });
109
+ const result = await emitConfluenceAuxiliaryFiles(client, {
110
+ workspaceId: 'ws-1',
111
+ pages: [
112
+ { id: '98765', title: 'New Title', status: 'current', spaceId: '12345' },
113
+ ],
114
+ });
115
+ // The prior by-title alias and prior canonical (title-derived) path should
116
+ // be in the deletes (they no longer apply). by-id stays because it's the
117
+ // anchor and didn't change.
118
+ const deletedPaths = client.deletes.map((d) => d.path);
119
+ assert.ok(deletedPaths.includes(confluencePageByTitleAliasPath('Old Title', '98765')), `expected prior by-title alias in deletes, got: ${deletedPaths.join(', ')}`);
120
+ assert.ok(deletedPaths.includes(confluencePagePath('98765', 'Old Title', '12345')), `expected prior canonical path in deletes`);
121
+ // by-id stays (no rename impact).
122
+ assert.ok(!deletedPaths.includes(confluencePageByIdAliasPath('98765')));
123
+ // The new by-title alias and new canonical path landed.
124
+ const writtenPaths = client.writes.map((w) => w.path);
125
+ assert.ok(writtenPaths.includes(confluencePageByTitleAliasPath('New Title', '98765')));
126
+ assert.ok(writtenPaths.includes(confluencePagePath('98765', 'New Title', '12345')));
127
+ assert.deepEqual(result.errors, []);
128
+ });
129
+ it('writes by-key alias for spaces when a key is present', async () => {
130
+ const client = createClient();
131
+ await emitConfluenceAuxiliaryFiles(client, {
132
+ workspaceId: 'ws-1',
133
+ spaces: [
134
+ { id: '777', name: 'Engineering', key: 'ENG' },
135
+ ],
136
+ });
137
+ const writtenPaths = client.writes.map((w) => w.path);
138
+ assert.ok(writtenPaths.includes(confluenceSpacePath('777', 'Engineering')));
139
+ assert.ok(writtenPaths.includes(confluenceSpaceByIdAliasPath('777')));
140
+ assert.ok(writtenPaths.includes(confluenceSpaceByTitleAliasPath('Engineering', '777')));
141
+ assert.ok(writtenPaths.includes(confluenceSpaceByKeyAliasPath('ENG')));
142
+ assert.ok(writtenPaths.includes(confluenceSpacesIndexPath()));
143
+ });
144
+ it('delete tombstone reads prior by-id alias and removes every previously emitted path', async () => {
145
+ const priorPayload = {
146
+ provider: 'confluence',
147
+ objectType: 'page',
148
+ objectId: '98765',
149
+ deleted: false,
150
+ payload: {
151
+ id: '98765',
152
+ title: 'Release Plan',
153
+ status: 'current',
154
+ spaceId: '12345',
155
+ parentId: '54321',
156
+ },
157
+ };
158
+ const client = createClient({
159
+ initialFiles: {
160
+ [confluencePageByIdAliasPath('98765')]: JSON.stringify(priorPayload),
161
+ },
162
+ });
163
+ const result = await emitConfluenceAuxiliaryFiles(client, {
164
+ workspaceId: 'ws-1',
165
+ pages: [{ id: '98765', _deleted: true }],
166
+ });
167
+ const deletedPaths = new Set(client.deletes.map((d) => d.path));
168
+ const expectedDeletes = [
169
+ confluencePagePath('98765', 'Release Plan', '12345'),
170
+ confluencePageByIdAliasPath('98765'),
171
+ confluencePageByTitleAliasPath('Release Plan', '98765'),
172
+ confluencePageByStatePath('current', '98765'),
173
+ confluencePageBySpaceAliasPath('12345', '98765'),
174
+ confluencePageByParentAliasPath('54321', '98765'),
175
+ ];
176
+ for (const path of expectedDeletes) {
177
+ assert.ok(deletedPaths.has(path), `expected delete at ${path}`);
178
+ }
179
+ // No content writes happened for the tombstone, but the index file
180
+ // flush still runs (with 0 mutations queued, so no write).
181
+ const contentWrites = client.writes.filter((w) => w.path !== confluencePagesIndexPath());
182
+ assert.equal(contentWrites.length, 0);
183
+ assert.equal(result.deleted, expectedDeletes.length);
184
+ });
185
+ it('drops the index row when a page is deleted (no ghost entries)', async () => {
186
+ // Regression for the Devin finding on PR #78: planPageDelete used to
187
+ // remove canonical + alias files but leave the index row in place, so
188
+ // `_index.json` accumulated entries for records whose meta.json had
189
+ // already been deleted. The reconciler must `.remove(id)` on the
190
+ // delete path too.
191
+ const priorPagePayload = {
192
+ payload: {
193
+ title: 'Release Plan',
194
+ status: 'current',
195
+ spaceId: '12345',
196
+ },
197
+ };
198
+ const priorIndex = [
199
+ { id: '98765', title: 'Release Plan', updated: '2026-05-12T00:00:00Z', status: 'current' },
200
+ { id: '11111', title: 'Other Page', updated: '2026-05-11T00:00:00Z', status: 'current' },
201
+ ];
202
+ const client = createClient({
203
+ initialFiles: {
204
+ [confluencePageByIdAliasPath('98765')]: JSON.stringify(priorPagePayload),
205
+ [confluencePagesIndexPath()]: JSON.stringify(priorIndex),
206
+ },
207
+ });
208
+ await emitConfluenceAuxiliaryFiles(client, {
209
+ workspaceId: 'ws-1',
210
+ pages: [{ id: '98765', _deleted: true }],
211
+ });
212
+ // The index file got rewritten — without the deleted row but with
213
+ // the surviving entry intact.
214
+ const indexWrite = client.writes.find((w) => w.path === confluencePagesIndexPath());
215
+ assert.ok(indexWrite, 'expected an index write after delete to prune the row');
216
+ const writtenRows = JSON.parse(indexWrite.content);
217
+ assert.deepEqual(writtenRows.map((r) => r.id), ['11111'], 'deleted page id should no longer appear in the index');
218
+ });
219
+ it('drops the index row when a space is deleted', async () => {
220
+ // Same regression as above, for spaces. planSpaceDelete must also
221
+ // `.remove(id)` on the index reconciler.
222
+ const priorSpacePayload = {
223
+ payload: { name: 'Engineering', key: 'ENG' },
224
+ };
225
+ const priorIndex = [
226
+ { id: '12345', title: 'Engineering', updated: '2026-05-12T00:00:00Z', key: 'ENG' },
227
+ { id: '22222', title: 'Marketing', updated: '2026-05-11T00:00:00Z', key: 'MKT' },
228
+ ];
229
+ const client = createClient({
230
+ initialFiles: {
231
+ [confluenceSpaceByIdAliasPath('12345')]: JSON.stringify(priorSpacePayload),
232
+ [confluenceSpacesIndexPath()]: JSON.stringify(priorIndex),
233
+ },
234
+ });
235
+ await emitConfluenceAuxiliaryFiles(client, {
236
+ workspaceId: 'ws-1',
237
+ spaces: [{ id: '12345', _deleted: true }],
238
+ });
239
+ const indexWrite = client.writes.find((w) => w.path === confluenceSpacesIndexPath());
240
+ assert.ok(indexWrite, 'expected an index write after delete to prune the row');
241
+ const writtenRows = JSON.parse(indexWrite.content);
242
+ assert.deepEqual(writtenRows.map((r) => r.id), ['22222'], 'deleted space id should no longer appear in the index');
243
+ });
244
+ it('captures per-path write failures in errors without aborting the fan-out', async () => {
245
+ const failingPath = confluencePageByTitleAliasPath('Release Plan', '98765');
246
+ const client = createClient({ failWriteOn: new Set([failingPath]) });
247
+ const result = await emitConfluenceAuxiliaryFiles(client, {
248
+ workspaceId: 'ws-1',
249
+ pages: [
250
+ {
251
+ id: '98765',
252
+ title: 'Release Plan',
253
+ status: 'current',
254
+ spaceId: '12345',
255
+ },
256
+ ],
257
+ });
258
+ assert.equal(result.errors.length, 1);
259
+ assert.equal(result.errors[0].path, failingPath);
260
+ assert.match(result.errors[0].error, /forced write failure/);
261
+ // The remaining alias paths landed, including by-id (the anchor).
262
+ assert.ok(client.files.has(confluencePageByIdAliasPath('98765')));
263
+ assert.ok(client.files.has(confluencePageByStatePath('current', '98765')));
264
+ assert.ok(client.files.has(confluencePagesIndexPath()));
265
+ });
266
+ it('skips reconciliation when the client has no readFile but still emits new aliases', async () => {
267
+ const client = createClient({ noRead: true });
268
+ const result = await emitConfluenceAuxiliaryFiles(client, {
269
+ workspaceId: 'ws-1',
270
+ pages: [
271
+ { id: '98765', title: 'Release Plan', status: 'current', spaceId: '12345' },
272
+ ],
273
+ });
274
+ // No reconciliation deletes were attempted because there was no prior
275
+ // state to read (and reads aren't supported anyway). The index file
276
+ // also can't be merged with existing rows; it gets stomped with just
277
+ // this batch.
278
+ assert.equal(client.deletes.length, 0);
279
+ assert.deepEqual(result.errors, []);
280
+ const writtenPaths = client.writes.map((w) => w.path);
281
+ assert.ok(writtenPaths.includes(confluencePageByIdAliasPath('98765')));
282
+ assert.ok(writtenPaths.includes(confluencePageByTitleAliasPath('Release Plan', '98765')));
283
+ });
284
+ it('non-fatally swallows reconciliation read errors and proceeds with the write batch', async () => {
285
+ const client = createClient({
286
+ failReadOn: new Set([confluencePageByIdAliasPath('98765')]),
287
+ });
288
+ const result = await emitConfluenceAuxiliaryFiles(client, {
289
+ workspaceId: 'ws-1',
290
+ pages: [
291
+ { id: '98765', title: 'Release Plan', status: 'current', spaceId: '12345' },
292
+ ],
293
+ });
294
+ // Reconciliation read failed → no stale paths computed → no deletes
295
+ // attempted → write fan-out proceeds.
296
+ assert.equal(client.deletes.length, 0);
297
+ assert.deepEqual(result.errors, []);
298
+ assert.ok(client.files.has(confluencePagePath('98765', 'Release Plan', '12345')));
299
+ });
300
+ it('skips by-title alias for emoji-only / punctuation-only titles', async () => {
301
+ const client = createClient();
302
+ await emitConfluenceAuxiliaryFiles(client, {
303
+ workspaceId: 'ws-1',
304
+ pages: [{ id: '111', title: '🚀!!!' }],
305
+ });
306
+ const writtenPaths = client.writes.map((w) => w.path);
307
+ assert.ok(writtenPaths.includes(confluencePageByIdAliasPath('111')));
308
+ // No by-title alias because the slug would collapse to empty.
309
+ const byTitleEmitted = writtenPaths.some((p) => p.includes('/by-title/') && p.includes('111'));
310
+ assert.equal(byTitleEmitted, false);
311
+ });
312
+ it('handles mixed page batches with create + delete + rename in one call', async () => {
313
+ const priorRenamePayload = {
314
+ provider: 'confluence',
315
+ objectType: 'page',
316
+ objectId: '200',
317
+ payload: { id: '200', title: 'Old', spaceId: 'S1', status: 'current' },
318
+ };
319
+ const priorDeletePayload = {
320
+ provider: 'confluence',
321
+ objectType: 'page',
322
+ objectId: '300',
323
+ payload: { id: '300', title: 'Doomed', spaceId: 'S1', status: 'current' },
324
+ };
325
+ const client = createClient({
326
+ initialFiles: {
327
+ [confluencePageByIdAliasPath('200')]: JSON.stringify(priorRenamePayload),
328
+ [confluencePageByIdAliasPath('300')]: JSON.stringify(priorDeletePayload),
329
+ },
330
+ });
331
+ const result = await emitConfluenceAuxiliaryFiles(client, {
332
+ workspaceId: 'ws-1',
333
+ pages: [
334
+ { id: '100', title: 'New Page', spaceId: 'S1', status: 'current' },
335
+ { id: '200', title: 'Renamed', spaceId: 'S1', status: 'current' },
336
+ { id: '300', _deleted: true },
337
+ ],
338
+ });
339
+ // All three records contributed paths to writes or deletes.
340
+ const writtenPaths = client.writes.map((w) => w.path);
341
+ assert.ok(writtenPaths.includes(confluencePageByIdAliasPath('100')));
342
+ assert.ok(writtenPaths.includes(confluencePageByIdAliasPath('200')));
343
+ // No write for the deleted record's by-id path.
344
+ assert.ok(!writtenPaths.includes(confluencePagePath('300', 'Doomed', 'S1')));
345
+ const deletedPaths = client.deletes.map((d) => d.path);
346
+ // Renamed page's old by-title alias is in deletes.
347
+ assert.ok(deletedPaths.includes(confluencePageByTitleAliasPath('Old', '200')));
348
+ // Deleted page's by-id alias is in deletes.
349
+ assert.ok(deletedPaths.includes(confluencePageByIdAliasPath('300')));
350
+ assert.deepEqual(result.errors, []);
351
+ });
352
+ });
353
+ //# sourceMappingURL=emit-auxiliary-files.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-auxiliary-files.test.js","sourceRoot":"","sources":["../../src/__tests__/emit-auxiliary-files.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Adapter-owned auxiliary-file emission for Confluence.
3
+ *
4
+ * This is the Phase 1 reference port for the cross-adapter `emitAuxiliaryFiles`
5
+ * contract defined in `@relayfile/adapter-core`. It generalizes the
6
+ * write-loop currently sitting in `cloud/packages/core/src/sync/record-writer.ts`
7
+ * (`writeConfluenceAuxiliaryFiles`) so the same primitive can be reused
8
+ * across Slack, Jira, Notion, Linear, GitHub in Phase 2, and so cloud's
9
+ * dispatcher collapses to a 10-line provider switch in Phase 3.
10
+ *
11
+ * Behavior reproduced from cloud's current implementation:
12
+ *
13
+ * 1. For every page record, write the by-id alias unconditionally (the
14
+ * stable reconciliation anchor) plus by-title / by-state / by-space /
15
+ * by-parent when the underlying fields are present. The canonical
16
+ * `/confluence/spaces/<spaceId>/pages/<slug>__<id>.json` path is
17
+ * written too — the bytes are identical at every alias path, so any
18
+ * one of them resolves to the same payload (matches the contract
19
+ * adapter-confluence#69 established).
20
+ * 2. For every page rename / status change / spaceId change, read the
21
+ * prior by-id alias to recover the previous title / status /
22
+ * spaceId, recompute the prior alias set, and delete every alias
23
+ * that no longer applies. Reads degrade to "no reconciliation" when
24
+ * the client lacks `readFile` — same back-compat we shipped in
25
+ * b2440df.
26
+ * 3. For every space record, the same shape: by-id, by-title (if name
27
+ * slugs to non-empty), by-key (when present) plus the canonical
28
+ * `/confluence/spaces/<slug>__<id>.json`.
29
+ * 4. For deleted records, all known alias and canonical paths are
30
+ * removed. Index rows are also removed in the same flush.
31
+ * 5. `_index.json` files for pages and spaces are read once, merged
32
+ * with upserts and removes, written once. Failures are accumulated
33
+ * into the returned `errors` array, never thrown.
34
+ *
35
+ * Records are accepted as already-cleaned `ConfluencePage` / `ConfluenceSpace`
36
+ * objects (the cleaning step happens in cloud; this adapter doesn't need
37
+ * to strip Nango metadata). To delete a record, pass an object with `id`
38
+ * plus `_deleted: true` — that's the contract the cloud dispatcher will
39
+ * adopt in Phase 3.
40
+ */
41
+ import { type AuxiliaryEmitterClient, type EmitAuxiliaryFilesResult } from '@relayfile/adapter-core';
42
+ import { type ConfluencePage, type ConfluenceSpace, type RelayFileClientLike } from './types.js';
43
+ /**
44
+ * Records accepted by `emitConfluenceAuxiliaryFiles`. Each entry is either
45
+ * a full page/space object or a `{ id, _deleted: true }` tombstone for the
46
+ * delete branch. Adapters in Phase 2 will adopt the same `_deleted` flag
47
+ * so the cloud dispatcher can route uniformly across providers.
48
+ */
49
+ export type ConfluencePageEmitRecord = ConfluencePage | {
50
+ id: string;
51
+ _deleted: true;
52
+ };
53
+ export type ConfluenceSpaceEmitRecord = ConfluenceSpace | {
54
+ id: string;
55
+ _deleted: true;
56
+ };
57
+ export interface ConfluenceEmitAuxiliaryFilesInput {
58
+ workspaceId: string;
59
+ /** Page records (full or `_deleted` tombstones). Pass `undefined` for
60
+ * pure-space batches. */
61
+ pages?: readonly ConfluencePageEmitRecord[];
62
+ /** Space records (full or `_deleted` tombstones). Pass `undefined` for
63
+ * pure-page batches. */
64
+ spaces?: readonly ConfluenceSpaceEmitRecord[];
65
+ /**
66
+ * Optional connection id to include in the rendered payload wrapper so
67
+ * downstream readers can route writeback by connection. Mirrors the
68
+ * `ConfluenceAdapter.renderContent` output without forcing callers to
69
+ * instantiate the class.
70
+ */
71
+ connectionId?: string;
72
+ }
73
+ /**
74
+ * Phase-1 entry point. Adapters in Phase 2 will expose the same function
75
+ * shape; cloud's Phase 3 dispatcher iterates `(provider, records)` and
76
+ * calls the corresponding `emit*AuxiliaryFiles` function with a shimmed
77
+ * `AuxiliaryEmitterClient`.
78
+ */
79
+ export declare function emitConfluenceAuxiliaryFiles(client: AuxiliaryEmitterClient | RelayFileClientLike, input: ConfluenceEmitAuxiliaryFilesInput): Promise<EmitAuxiliaryFilesResult>;
80
+ //# sourceMappingURL=emit-auxiliary-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-auxiliary-files.d.ts","sourceRoot":"","sources":["../src/emit-auxiliary-files.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAEH,OAAO,EAKL,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAI9B,MAAM,yBAAyB,CAAC;AAuBjC,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACzB,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,MAAM,MAAM,wBAAwB,GAChC,cAAc,GACd;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAA;CAAE,CAAC;AAEnC,MAAM,MAAM,yBAAyB,GACjC,eAAe,GACf;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,IAAI,CAAA;CAAE,CAAC;AAEnC,MAAM,WAAW,iCAAiC;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB;8BAC0B;IAC1B,KAAK,CAAC,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC5C;6BACyB;IACzB,MAAM,CAAC,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAC9C;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,sBAAsB,GAAG,mBAAmB,EACpD,KAAK,EAAE,iCAAiC,GACvC,OAAO,CAAC,wBAAwB,CAAC,CAuBnC"}
@@ -0,0 +1,329 @@
1
+ /**
2
+ * Adapter-owned auxiliary-file emission for Confluence.
3
+ *
4
+ * This is the Phase 1 reference port for the cross-adapter `emitAuxiliaryFiles`
5
+ * contract defined in `@relayfile/adapter-core`. It generalizes the
6
+ * write-loop currently sitting in `cloud/packages/core/src/sync/record-writer.ts`
7
+ * (`writeConfluenceAuxiliaryFiles`) so the same primitive can be reused
8
+ * across Slack, Jira, Notion, Linear, GitHub in Phase 2, and so cloud's
9
+ * dispatcher collapses to a 10-line provider switch in Phase 3.
10
+ *
11
+ * Behavior reproduced from cloud's current implementation:
12
+ *
13
+ * 1. For every page record, write the by-id alias unconditionally (the
14
+ * stable reconciliation anchor) plus by-title / by-state / by-space /
15
+ * by-parent when the underlying fields are present. The canonical
16
+ * `/confluence/spaces/<spaceId>/pages/<slug>__<id>.json` path is
17
+ * written too — the bytes are identical at every alias path, so any
18
+ * one of them resolves to the same payload (matches the contract
19
+ * adapter-confluence#69 established).
20
+ * 2. For every page rename / status change / spaceId change, read the
21
+ * prior by-id alias to recover the previous title / status /
22
+ * spaceId, recompute the prior alias set, and delete every alias
23
+ * that no longer applies. Reads degrade to "no reconciliation" when
24
+ * the client lacks `readFile` — same back-compat we shipped in
25
+ * b2440df.
26
+ * 3. For every space record, the same shape: by-id, by-title (if name
27
+ * slugs to non-empty), by-key (when present) plus the canonical
28
+ * `/confluence/spaces/<slug>__<id>.json`.
29
+ * 4. For deleted records, all known alias and canonical paths are
30
+ * removed. Index rows are also removed in the same flush.
31
+ * 5. `_index.json` files for pages and spaces are read once, merged
32
+ * with upserts and removes, written once. Failures are accumulated
33
+ * into the returned `errors` array, never thrown.
34
+ *
35
+ * Records are accepted as already-cleaned `ConfluencePage` / `ConfluenceSpace`
36
+ * objects (the cleaning step happens in cloud; this adapter doesn't need
37
+ * to strip Nango metadata). To delete a record, pass an object with `id`
38
+ * plus `_deleted: true` — that's the contract the cloud dispatcher will
39
+ * adopt in Phase 3.
40
+ */
41
+ import { PriorAliasReader, IndexFileReconciler, runEmitBatch, EMIT_AUXILIARY_JSON_CONTENT_TYPE, } from '@relayfile/adapter-core';
42
+ import { slugifyAlias } from './alias-slug.js';
43
+ import { confluencePageByIdAliasPath, confluencePageByParentAliasPath, confluencePageBySpaceAliasPath, confluencePageByStatePath, confluencePageByTitleAliasPath, confluencePagePath, confluencePagesIndexPath, confluenceSpaceByIdAliasPath, confluenceSpaceByKeyAliasPath, confluenceSpaceByTitleAliasPath, confluenceSpacePath, confluenceSpacesIndexPath, } from './path-mapper.js';
44
+ import { confluencePageIndexRow, confluenceSpaceIndexRow, } from './queries.js';
45
+ import { CONFLUENCE_PROVIDER_NAME, } from './types.js';
46
+ const JSON_CONTENT_TYPE = EMIT_AUXILIARY_JSON_CONTENT_TYPE;
47
+ /**
48
+ * Phase-1 entry point. Adapters in Phase 2 will expose the same function
49
+ * shape; cloud's Phase 3 dispatcher iterates `(provider, records)` and
50
+ * calls the corresponding `emit*AuxiliaryFiles` function with a shimmed
51
+ * `AuxiliaryEmitterClient`.
52
+ */
53
+ export async function emitConfluenceAuxiliaryFiles(client, input) {
54
+ const emitterClient = client;
55
+ const workspaceId = input.workspaceId;
56
+ const pages = input.pages ?? [];
57
+ const spaces = input.spaces ?? [];
58
+ const aggregate = { written: 0, deleted: 0, errors: [] };
59
+ if (pages.length === 0 && spaces.length === 0) {
60
+ return aggregate;
61
+ }
62
+ if (pages.length > 0) {
63
+ const pageResult = await emitPages(emitterClient, workspaceId, pages, input.connectionId);
64
+ accumulate(aggregate, pageResult);
65
+ }
66
+ if (spaces.length > 0) {
67
+ const spaceResult = await emitSpaces(emitterClient, workspaceId, spaces, input.connectionId);
68
+ accumulate(aggregate, spaceResult);
69
+ }
70
+ return aggregate;
71
+ }
72
+ // -- pages ------------------------------------------------------------------
73
+ async function emitPages(client, workspaceId, records, connectionId) {
74
+ const indexReconciler = new IndexFileReconciler({
75
+ client,
76
+ workspaceId,
77
+ path: confluencePagesIndexPath(),
78
+ builder: (rows) => ({
79
+ path: confluencePagesIndexPath(),
80
+ content: `${JSON.stringify([...rows].sort(comparePageIndexRows))}\n`,
81
+ contentType: JSON_CONTENT_TYPE,
82
+ }),
83
+ });
84
+ const priorReader = new PriorAliasReader(client, workspaceId);
85
+ const fanOut = await runEmitBatch(client, workspaceId, records, async (record) => {
86
+ if (isDeleteRecord(record)) {
87
+ return planPageDelete(record.id, priorReader, indexReconciler);
88
+ }
89
+ return planPageWrite(record, priorReader, indexReconciler, connectionId);
90
+ });
91
+ // Index flush after every per-record plan: one read+write per batch, not
92
+ // per record. Cloud's current implementation does the same.
93
+ const indexResult = await indexReconciler.flush();
94
+ fanOut.written += indexResult.written;
95
+ fanOut.errors.push(...indexResult.errors);
96
+ return fanOut;
97
+ }
98
+ async function planPageWrite(page, priorReader, indexReconciler, connectionId) {
99
+ const id = readNonEmptyString(page.id);
100
+ if (!id) {
101
+ return {};
102
+ }
103
+ const title = readNonEmptyString(page.title);
104
+ const status = readNonEmptyString(page.status);
105
+ const spaceId = readNonEmptyString(page.spaceId);
106
+ const parentId = readNonEmptyString(page.parentId);
107
+ const content = renderPageContent(page, connectionId, false);
108
+ const newPaths = pagePathsFor({ id, title, status, spaceId, parentId });
109
+ // Reconciliation: read the prior by-id alias and compute paths that no
110
+ // longer apply. Anchored on by-id so it survives every other field change.
111
+ const prior = await priorReader.read(confluencePageByIdAliasPath(id), extractPriorPageState);
112
+ const stalePaths = prior ? diffPaths(pagePathsFor({ id, ...prior }), newPaths) : [];
113
+ const writes = newPaths.map((path) => ({
114
+ path,
115
+ content,
116
+ contentType: JSON_CONTENT_TYPE,
117
+ }));
118
+ const deletes = stalePaths.map((path) => ({ path }));
119
+ indexReconciler.upsert(confluencePageIndexRow(page));
120
+ return { writes, deletes };
121
+ }
122
+ async function planPageDelete(id, priorReader, indexReconciler) {
123
+ // For deletes we have no fresh payload, so we rely entirely on the prior
124
+ // by-id alias to recover the alias fields. If the prior alias is missing
125
+ // (degraded reader, or first-ever sync), we still delete the by-id alias
126
+ // unconditionally — that's the minimal cleanup.
127
+ const prior = await priorReader.read(confluencePageByIdAliasPath(id), extractPriorPageState);
128
+ const paths = pagePathsFor({ id, ...(prior ?? {}) });
129
+ // The index row must drop too — otherwise consumers reading
130
+ // `_index.json` see ghost entries for records whose canonical and alias
131
+ // files have already been removed. `IndexFileReconciler.remove` no-ops
132
+ // if the id isn't present, so this is safe even for "first-ever sync"
133
+ // deletes where no prior row existed.
134
+ indexReconciler.remove(id);
135
+ return { deletes: paths.map((path) => ({ path })) };
136
+ }
137
+ // -- spaces -----------------------------------------------------------------
138
+ async function emitSpaces(client, workspaceId, records, connectionId) {
139
+ const indexReconciler = new IndexFileReconciler({
140
+ client,
141
+ workspaceId,
142
+ path: confluenceSpacesIndexPath(),
143
+ builder: (rows) => ({
144
+ path: confluenceSpacesIndexPath(),
145
+ content: `${JSON.stringify([...rows].sort(compareSpaceIndexRows))}\n`,
146
+ contentType: JSON_CONTENT_TYPE,
147
+ }),
148
+ });
149
+ const priorReader = new PriorAliasReader(client, workspaceId);
150
+ const fanOut = await runEmitBatch(client, workspaceId, records, async (record) => {
151
+ if (isDeleteRecord(record)) {
152
+ return planSpaceDelete(record.id, priorReader, indexReconciler);
153
+ }
154
+ return planSpaceWrite(record, priorReader, indexReconciler, connectionId);
155
+ });
156
+ const indexResult = await indexReconciler.flush();
157
+ fanOut.written += indexResult.written;
158
+ fanOut.errors.push(...indexResult.errors);
159
+ return fanOut;
160
+ }
161
+ async function planSpaceWrite(space, priorReader, indexReconciler, connectionId) {
162
+ const id = readNonEmptyString(space.id);
163
+ if (!id) {
164
+ return {};
165
+ }
166
+ const name = readNonEmptyString(space.name) ?? readNonEmptyString(space.key);
167
+ const key = readNonEmptyString(space.key);
168
+ const content = renderSpaceContent(space, connectionId, false);
169
+ const newPaths = spacePathsFor({ id, name, key });
170
+ const prior = await priorReader.read(confluenceSpaceByIdAliasPath(id), extractPriorSpaceState);
171
+ const stalePaths = prior ? diffPaths(spacePathsFor({ id, ...prior }), newPaths) : [];
172
+ const writes = newPaths.map((path) => ({
173
+ path,
174
+ content,
175
+ contentType: JSON_CONTENT_TYPE,
176
+ }));
177
+ const deletes = stalePaths.map((path) => ({ path }));
178
+ indexReconciler.upsert(confluenceSpaceIndexRow(space));
179
+ return { writes, deletes };
180
+ }
181
+ async function planSpaceDelete(id, priorReader, indexReconciler) {
182
+ const prior = await priorReader.read(confluenceSpaceByIdAliasPath(id), extractPriorSpaceState);
183
+ const paths = spacePathsFor({ id, ...(prior ?? {}) });
184
+ // See `planPageDelete` — index row must drop alongside the files.
185
+ indexReconciler.remove(id);
186
+ return { deletes: paths.map((path) => ({ path })) };
187
+ }
188
+ function pagePathsFor(args) {
189
+ const { id, title, status, spaceId, parentId } = args;
190
+ const paths = [];
191
+ // Canonical path: title + spaceId derived.
192
+ paths.push(confluencePagePath(id, title, spaceId));
193
+ // by-id (stable reconciliation anchor)
194
+ paths.push(confluencePageByIdAliasPath(id));
195
+ if (title && slugifies(title)) {
196
+ paths.push(confluencePageByTitleAliasPath(title, id));
197
+ }
198
+ if (status) {
199
+ paths.push(confluencePageByStatePath(status, id));
200
+ }
201
+ if (spaceId) {
202
+ paths.push(confluencePageBySpaceAliasPath(spaceId, id));
203
+ }
204
+ if (parentId) {
205
+ paths.push(confluencePageByParentAliasPath(parentId, id));
206
+ }
207
+ return paths;
208
+ }
209
+ function spacePathsFor(args) {
210
+ const { id, name, key } = args;
211
+ const paths = [];
212
+ paths.push(confluenceSpacePath(id, name ?? key));
213
+ paths.push(confluenceSpaceByIdAliasPath(id));
214
+ if (name && slugifies(name)) {
215
+ paths.push(confluenceSpaceByTitleAliasPath(name, id));
216
+ }
217
+ if (key) {
218
+ paths.push(confluenceSpaceByKeyAliasPath(key));
219
+ }
220
+ return paths;
221
+ }
222
+ function diffPaths(prior, next) {
223
+ const nextSet = new Set(next);
224
+ const seen = new Set();
225
+ const stale = [];
226
+ for (const p of prior) {
227
+ if (!nextSet.has(p) && !seen.has(p)) {
228
+ seen.add(p);
229
+ stale.push(p);
230
+ }
231
+ }
232
+ return stale;
233
+ }
234
+ function extractPriorPageState(parsed) {
235
+ // The by-id alias wraps the page payload under `payload` (matches the
236
+ // shape `ConfluenceAdapter.renderContent` writes). Older mounts may have
237
+ // stored the payload at the root; we accept both for compatibility.
238
+ const payload = pickPayload(parsed);
239
+ if (!payload)
240
+ return null;
241
+ return {
242
+ title: readNonEmptyString(payload.title),
243
+ status: readNonEmptyString(payload.status),
244
+ spaceId: readNonEmptyString(payload.spaceId) ?? readNonEmptyString(payload.space_id),
245
+ parentId: readNonEmptyString(payload.parentId) ?? readNonEmptyString(payload.parent_id),
246
+ };
247
+ }
248
+ function extractPriorSpaceState(parsed) {
249
+ const payload = pickPayload(parsed);
250
+ if (!payload)
251
+ return null;
252
+ return {
253
+ name: readNonEmptyString(payload.name) ?? readNonEmptyString(payload.title),
254
+ key: readNonEmptyString(payload.key),
255
+ };
256
+ }
257
+ function pickPayload(parsed) {
258
+ const wrapped = parsed.payload;
259
+ if (isRecord(wrapped)) {
260
+ return wrapped;
261
+ }
262
+ // Fall back to the parsed object itself (legacy by-id alias shape).
263
+ return parsed;
264
+ }
265
+ function renderPageContent(page, connectionId, deleted) {
266
+ return JSON.stringify({
267
+ provider: CONFLUENCE_PROVIDER_NAME,
268
+ objectType: 'page',
269
+ objectId: page.id,
270
+ deleted,
271
+ payload: page,
272
+ ...(connectionId ? { connectionId } : {}),
273
+ }, null, 2);
274
+ }
275
+ function renderSpaceContent(space, connectionId, deleted) {
276
+ return JSON.stringify({
277
+ provider: CONFLUENCE_PROVIDER_NAME,
278
+ objectType: 'space',
279
+ objectId: space.id,
280
+ deleted,
281
+ payload: space,
282
+ ...(connectionId ? { connectionId } : {}),
283
+ }, null, 2);
284
+ }
285
+ function comparePageIndexRows(left, right) {
286
+ if (left.updated !== right.updated) {
287
+ return right.updated.localeCompare(left.updated);
288
+ }
289
+ return left.id.localeCompare(right.id);
290
+ }
291
+ function compareSpaceIndexRows(left, right) {
292
+ if (left.updated !== right.updated) {
293
+ return right.updated.localeCompare(left.updated);
294
+ }
295
+ return left.id.localeCompare(right.id);
296
+ }
297
+ function isDeleteRecord(record) {
298
+ return (isRecord(record) &&
299
+ record._deleted === true &&
300
+ typeof record.id === 'string');
301
+ }
302
+ function readNonEmptyString(value) {
303
+ if (typeof value !== 'string')
304
+ return undefined;
305
+ const trimmed = value.trim();
306
+ return trimmed.length > 0 ? trimmed : undefined;
307
+ }
308
+ function isRecord(value) {
309
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
310
+ }
311
+ /**
312
+ * Skip by-title aliases for titles that slug to nothing (emoji-only /
313
+ * punctuation-only). The by-id alias still resolves those records.
314
+ *
315
+ * Delegates to the shared `slugifyAlias` per AGENTS.md "NEVER write a
316
+ * new slugifier" rule. `slugifyAlias` returns the literal string
317
+ * `'untitled'` as its empty-slug sentinel.
318
+ */
319
+ function slugifies(value) {
320
+ return slugifyAlias(value) !== 'untitled';
321
+ }
322
+ function accumulate(aggregate, partial) {
323
+ aggregate.written += partial.written;
324
+ aggregate.deleted += partial.deleted;
325
+ if (partial.errors.length > 0) {
326
+ aggregate.errors.push(...partial.errors);
327
+ }
328
+ }
329
+ //# sourceMappingURL=emit-auxiliary-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-auxiliary-files.js","sourceRoot":"","sources":["../src/emit-auxiliary-files.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,8 @@ export { CONFLUENCE_OBJECT_TYPES, CONFLUENCE_CANONICAL_PAGE_STATUSES, CONFLUENCE
4
4
  export type { ConfluencePathObjectType, NameWithIdOptions, ParseNameWithIdResult, } from './path-mapper.js';
5
5
  export { aliasCollisionSuffix, slugifyAlias, } from './alias-slug.js';
6
6
  export { confluenceLayoutPromptFile, CONFLUENCE_LAYOUT_PROMPT, } from './layout-prompt.js';
7
+ export { emitConfluenceAuxiliaryFiles, } from './emit-auxiliary-files.js';
8
+ export type { ConfluenceEmitAuxiliaryFilesInput, ConfluencePageEmitRecord, ConfluenceSpaceEmitRecord, } from './emit-auxiliary-files.js';
7
9
  export { buildConfluenceIndexFile, } from './index-emitter.js';
8
10
  export type { ConfluenceIndexBucket, ConfluenceIndexFile, } from './index-emitter.js';
9
11
  export { CONFLUENCE_API_SPACES_ROUTE, confluencePageIndexRow, confluenceSpaceIndexRow, getConfluencePageHumanReadable, getConfluenceSpaceHumanReadable, resolveConfluenceReadRequest, } from './queries.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,uBAAuB,EACvB,kCAAkC,EAClC,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,+BAA+B,EAC/B,8BAA8B,EAC9B,yBAAyB,EACzB,8BAA8B,EAC9B,kBAAkB,EAClB,wBAAwB,EACxB,+BAA+B,EAC/B,4BAA4B,EAC5B,6BAA6B,EAC7B,+BAA+B,EAC/B,mBAAmB,EACnB,yBAAyB,EACzB,2BAA2B,EAC3B,kCAAkC,EAClC,UAAU,EACV,6BAA6B,EAC7B,6BAA6B,EAC7B,eAAe,EACf,iBAAiB,EACjB,gCAAgC,GACjC,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,oBAAoB,EACpB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACvB,8BAA8B,EAC9B,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,mBAAmB,YAAY,CAAC;AAEhC,OAAO,EACL,kBAAkB,EAClB,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,qCAAqC,EACrC,iCAAiC,EACjC,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,EAC3B,mCAAmC,EACnC,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,EAC1B,6BAA6B,EAC7B,kCAAkC,EAClC,kCAAkC,GACnC,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,mCAAmC,EACnC,wBAAwB,EACxB,0CAA0C,EAC1C,0CAA0C,GAC3C,MAAM,yBAAyB,CAAC;AAEjC,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,GACd,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,uBAAuB,EACvB,kCAAkC,EAClC,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,+BAA+B,EAC/B,8BAA8B,EAC9B,yBAAyB,EACzB,8BAA8B,EAC9B,kBAAkB,EAClB,wBAAwB,EACxB,+BAA+B,EAC/B,4BAA4B,EAC5B,6BAA6B,EAC7B,+BAA+B,EAC/B,mBAAmB,EACnB,yBAAyB,EACzB,2BAA2B,EAC3B,kCAAkC,EAClC,UAAU,EACV,6BAA6B,EAC7B,6BAA6B,EAC7B,eAAe,EACf,iBAAiB,EACjB,gCAAgC,GACjC,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,oBAAoB,EACpB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,iCAAiC,EACjC,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACvB,8BAA8B,EAC9B,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AACpB,mBAAmB,YAAY,CAAC;AAEhC,OAAO,EACL,kBAAkB,EAClB,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,qCAAqC,EACrC,iCAAiC,EACjC,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,EAC3B,mCAAmC,EACnC,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,EAC1B,6BAA6B,EAC7B,kCAAkC,EAClC,kCAAkC,GACnC,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,mCAAmC,EACnC,wBAAwB,EACxB,0CAA0C,EAC1C,0CAA0C,GAC3C,MAAM,yBAAyB,CAAC;AAEjC,cAAc,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@ export { ConfluenceAdapter, } from './confluence-adapter.js';
2
2
  export { CONFLUENCE_OBJECT_TYPES, CONFLUENCE_CANONICAL_PAGE_STATUSES, CONFLUENCE_PATH_ROOT, computeConfluencePath, confluenceByIdAliasPath, confluenceByTitleAliasPath, confluencePageByIdAliasPath, confluencePageByParentAliasPath, confluencePageBySpaceAliasPath, confluencePageByStatePath, confluencePageByTitleAliasPath, confluencePagePath, confluencePagesIndexPath, confluenceProviderRootIndexPath, confluenceSpaceByIdAliasPath, confluenceSpaceByKeyAliasPath, confluenceSpaceByTitleAliasPath, confluenceSpacePath, confluenceSpacesIndexPath, encodeConfluencePathSegment, extractConfluenceIdFromPathSegment, nameWithId, normalizeConfluenceObjectType, normalizeNangoConfluenceModel, parseNameWithId, slugifyStatusName, tryNormalizeConfluenceObjectType, } from './path-mapper.js';
3
3
  export { aliasCollisionSuffix, slugifyAlias, } from './alias-slug.js';
4
4
  export { confluenceLayoutPromptFile, CONFLUENCE_LAYOUT_PROMPT, } from './layout-prompt.js';
5
+ export { emitConfluenceAuxiliaryFiles, } from './emit-auxiliary-files.js';
5
6
  export { buildConfluenceIndexFile, } from './index-emitter.js';
6
7
  export { CONFLUENCE_API_SPACES_ROUTE, confluencePageIndexRow, confluenceSpaceIndexRow, getConfluencePageHumanReadable, getConfluenceSpaceHumanReadable, resolveConfluenceReadRequest, } from './queries.js';
7
8
  export { CONFLUENCE_API_PAGES_ROUTE, } from './types.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AASjC,OAAO,EACL,uBAAuB,EACvB,kCAAkC,EAClC,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,+BAA+B,EAC/B,8BAA8B,EAC9B,yBAAyB,EACzB,8BAA8B,EAC9B,kBAAkB,EAClB,wBAAwB,EACxB,+BAA+B,EAC/B,4BAA4B,EAC5B,6BAA6B,EAC7B,+BAA+B,EAC/B,mBAAmB,EACnB,yBAAyB,EACzB,2BAA2B,EAC3B,kCAAkC,EAClC,UAAU,EACV,6BAA6B,EAC7B,6BAA6B,EAC7B,eAAe,EACf,iBAAiB,EACjB,gCAAgC,GACjC,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EACL,oBAAoB,EACpB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAM5B,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACvB,8BAA8B,EAC9B,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AAOtB,OAAO,EACL,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,kBAAkB,EAClB,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,qCAAqC,EACrC,iCAAiC,EACjC,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,EAC3B,mCAAmC,EACnC,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,EAC1B,6BAA6B,EAC7B,kCAAkC,EAClC,kCAAkC,GACnC,MAAM,yBAAyB,CAAC;AAQjC,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AASjC,OAAO,EACL,uBAAuB,EACvB,kCAAkC,EAClC,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,0BAA0B,EAC1B,2BAA2B,EAC3B,+BAA+B,EAC/B,8BAA8B,EAC9B,yBAAyB,EACzB,8BAA8B,EAC9B,kBAAkB,EAClB,wBAAwB,EACxB,+BAA+B,EAC/B,4BAA4B,EAC5B,6BAA6B,EAC7B,+BAA+B,EAC/B,mBAAmB,EACnB,yBAAyB,EACzB,2BAA2B,EAC3B,kCAAkC,EAClC,UAAU,EACV,6BAA6B,EAC7B,6BAA6B,EAC7B,eAAe,EACf,iBAAiB,EACjB,gCAAgC,GACjC,MAAM,kBAAkB,CAAC;AAO1B,OAAO,EACL,oBAAoB,EACpB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,4BAA4B,GAC7B,MAAM,2BAA2B,CAAC;AAOnC,OAAO,EACL,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAM5B,OAAO,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EACvB,8BAA8B,EAC9B,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AAOtB,OAAO,EACL,0BAA0B,GAC3B,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,kBAAkB,EAClB,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,qCAAqC,EACrC,iCAAiC,EACjC,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,EAC3B,mCAAmC,EACnC,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,EAC1B,6BAA6B,EAC7B,kCAAkC,EAClC,kCAAkC,GACnC,MAAM,yBAAyB,CAAC;AAQjC,cAAc,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@relayfile/adapter-confluence",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "Confluence adapter package for Relayfile",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -80,7 +80,7 @@
80
80
  "directory": "packages/confluence"
81
81
  },
82
82
  "dependencies": {
83
- "@relayfile/adapter-core": "^0.2.12"
83
+ "@relayfile/adapter-core": "^0.2.16"
84
84
  },
85
85
  "peerDependencies": {
86
86
  "@relayfile/sdk": ">=0.6.0 <1"