@relayfile/adapter-confluence 0.1.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.
Files changed (38) hide show
  1. package/discovery/confluence/.adapter.md +72 -0
  2. package/discovery/confluence/pages/.create.example.json +5 -0
  3. package/discovery/confluence/pages/.schema.json +171 -0
  4. package/discovery/confluence/spaces/{spaceIdOrKey}/pages/.create.example.json +4 -0
  5. package/discovery/confluence/spaces/{spaceIdOrKey}/pages/.schema.json +166 -0
  6. package/dist/__tests__/confluence-adapter.test.d.ts +2 -0
  7. package/dist/__tests__/confluence-adapter.test.d.ts.map +1 -0
  8. package/dist/__tests__/confluence-adapter.test.js +150 -0
  9. package/dist/__tests__/confluence-adapter.test.js.map +1 -0
  10. package/dist/confluence-adapter.d.ts +44 -0
  11. package/dist/confluence-adapter.d.ts.map +1 -0
  12. package/dist/confluence-adapter.js +218 -0
  13. package/dist/confluence-adapter.js.map +1 -0
  14. package/dist/index.d.ts +8 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +6 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/path-mapper.d.ts +12 -0
  19. package/dist/path-mapper.d.ts.map +1 -0
  20. package/dist/path-mapper.js +65 -0
  21. package/dist/path-mapper.js.map +1 -0
  22. package/dist/queries.d.ts +5 -0
  23. package/dist/queries.d.ts.map +1 -0
  24. package/dist/queries.js +72 -0
  25. package/dist/queries.js.map +1 -0
  26. package/dist/resources.d.ts +25 -0
  27. package/dist/resources.d.ts.map +1 -0
  28. package/dist/resources.js +23 -0
  29. package/dist/resources.js.map +1 -0
  30. package/dist/types.d.ts +109 -0
  31. package/dist/types.d.ts.map +1 -0
  32. package/dist/types.js +4 -0
  33. package/dist/types.js.map +1 -0
  34. package/dist/writeback.d.ts +6 -0
  35. package/dist/writeback.d.ts.map +1 -0
  36. package/dist/writeback.js +214 -0
  37. package/dist/writeback.js.map +1 -0
  38. package/package.json +75 -0
@@ -0,0 +1,218 @@
1
+ import { computeConfluencePath, confluencePagePath, confluenceSpacePath, } from './path-mapper.js';
2
+ import { CONFLUENCE_PROVIDER_NAME, } from './types.js';
3
+ import { resolveConfluenceWritebackRequest } from './writeback.js';
4
+ const JSON_CONTENT_TYPE = 'application/json; charset=utf-8';
5
+ export class ConfluenceAdapter {
6
+ client;
7
+ provider;
8
+ config;
9
+ name = CONFLUENCE_PROVIDER_NAME;
10
+ version = '0.1.0';
11
+ constructor(client, provider, config = {}) {
12
+ this.client = client;
13
+ this.provider = provider;
14
+ this.config = config;
15
+ }
16
+ supportedEvents() {
17
+ return [
18
+ 'page.created',
19
+ 'page.updated',
20
+ 'page.deleted',
21
+ 'space.created',
22
+ 'space.updated',
23
+ 'space.deleted',
24
+ ];
25
+ }
26
+ computePath(objectType, objectId, options = {}) {
27
+ return computeConfluencePath(objectType, objectId, options);
28
+ }
29
+ computeSemantics(objectType, objectId, payload) {
30
+ const properties = {
31
+ provider: CONFLUENCE_PROVIDER_NAME,
32
+ 'provider.object_id': objectId,
33
+ 'provider.object_type': objectType,
34
+ };
35
+ const relations = [];
36
+ const comments = [];
37
+ addString(properties, 'confluence.status', payload.status);
38
+ addString(properties, 'confluence.title', payload.title);
39
+ addString(properties, 'confluence.type', payload.type);
40
+ if (objectType === 'page') {
41
+ addString(properties, 'confluence.space_id', payload.spaceId);
42
+ addString(properties, 'confluence.parent_id', payload.parentId);
43
+ const spaceId = readString(payload.spaceId);
44
+ if (spaceId)
45
+ relations.push(confluenceSpacePath(spaceId));
46
+ const parentId = readString(payload.parentId);
47
+ if (parentId)
48
+ relations.push(confluencePagePath(parentId));
49
+ const bodyText = readStorageBodyText(payload.body);
50
+ if (bodyText)
51
+ comments.push(stripHtml(bodyText));
52
+ }
53
+ if (objectType === 'space') {
54
+ addString(properties, 'confluence.space_key', payload.key);
55
+ addString(properties, 'confluence.homepage_id', payload.homepageId);
56
+ const homepageId = readString(payload.homepageId);
57
+ if (homepageId)
58
+ relations.push(confluencePagePath(homepageId));
59
+ }
60
+ return {
61
+ properties,
62
+ ...(relations.length > 0 ? { relations } : {}),
63
+ ...(comments.length > 0 ? { comments } : {}),
64
+ };
65
+ }
66
+ async ingestWebhook(workspaceId, event) {
67
+ try {
68
+ const normalized = this.normalizeEvent(event);
69
+ const path = this.pathForEvent(normalized);
70
+ if (this.isDeleteEvent(normalized)) {
71
+ if (this.client.deleteFile) {
72
+ await this.client.deleteFile({ workspaceId, path });
73
+ return { filesWritten: 0, filesUpdated: 0, filesDeleted: 1, paths: [path], errors: [] };
74
+ }
75
+ }
76
+ const writeResult = await this.client.writeFile({
77
+ workspaceId,
78
+ path,
79
+ content: this.renderContent(workspaceId, normalized, this.isDeleteEvent(normalized)),
80
+ contentType: JSON_CONTENT_TYPE,
81
+ semantics: this.computeSemantics(normalized.objectType, normalized.objectId, normalized.payload),
82
+ });
83
+ const counts = inferWriteCounts(writeResult, this.isDeleteEvent(normalized));
84
+ return {
85
+ filesWritten: counts.filesWritten,
86
+ filesUpdated: counts.filesUpdated,
87
+ filesDeleted: counts.filesDeleted,
88
+ paths: [path],
89
+ errors: [],
90
+ };
91
+ }
92
+ catch (error) {
93
+ return {
94
+ filesWritten: 0,
95
+ filesUpdated: 0,
96
+ filesDeleted: 0,
97
+ paths: [],
98
+ errors: [{ path: '', error: error instanceof Error ? error.message : String(error) }],
99
+ };
100
+ }
101
+ }
102
+ writeBack(path, content) {
103
+ return resolveConfluenceWritebackRequest(path, content);
104
+ }
105
+ materializeSpace(space) {
106
+ return {
107
+ path: confluenceSpacePath(space.id, space.name ?? space.key),
108
+ payload: {
109
+ provider: CONFLUENCE_PROVIDER_NAME,
110
+ objectType: 'space',
111
+ objectId: space.id,
112
+ payload: space,
113
+ },
114
+ };
115
+ }
116
+ materializePage(page) {
117
+ return {
118
+ path: confluencePagePath(page.id, page.title, page.spaceId),
119
+ payload: {
120
+ provider: CONFLUENCE_PROVIDER_NAME,
121
+ objectType: 'page',
122
+ objectId: page.id,
123
+ payload: page,
124
+ },
125
+ };
126
+ }
127
+ normalizeEvent(event) {
128
+ if (isConfluenceNormalizedEvent(event))
129
+ return event;
130
+ const page = isRecord(event.page) ? event.page : undefined;
131
+ if (page) {
132
+ const id = readString(page.id);
133
+ if (!id)
134
+ throw new Error('Confluence page event requires page.id');
135
+ return {
136
+ provider: CONFLUENCE_PROVIDER_NAME,
137
+ eventType: readString(event.eventType) ?? readString(event.webhookEvent) ?? 'page.updated',
138
+ objectType: 'page',
139
+ objectId: id,
140
+ payload: { ...page, _webhook: event },
141
+ };
142
+ }
143
+ const space = isRecord(event.space) ? event.space : undefined;
144
+ if (space) {
145
+ const id = readString(space.id);
146
+ if (!id)
147
+ throw new Error('Confluence space event requires space.id');
148
+ return {
149
+ provider: CONFLUENCE_PROVIDER_NAME,
150
+ eventType: readString(event.eventType) ?? readString(event.webhookEvent) ?? 'space.updated',
151
+ objectType: 'space',
152
+ objectId: id,
153
+ payload: { ...space, _webhook: event },
154
+ };
155
+ }
156
+ throw new Error('Unsupported Confluence event shape');
157
+ }
158
+ pathForEvent(event) {
159
+ const title = readString(event.payload.title) ?? readString(event.payload.name);
160
+ const spaceId = event.objectType === 'page' ? readString(event.payload.spaceId) : undefined;
161
+ return computeConfluencePath(event.objectType, event.objectId, {
162
+ ...(title ? { title } : {}),
163
+ ...(spaceId ? { spaceId } : {}),
164
+ });
165
+ }
166
+ isDeleteEvent(event) {
167
+ return event.eventType.toLowerCase().includes('deleted') || event.payload.deleted === true;
168
+ }
169
+ renderContent(workspaceId, event, deleted) {
170
+ return JSON.stringify({
171
+ provider: CONFLUENCE_PROVIDER_NAME,
172
+ workspaceId,
173
+ objectType: event.objectType,
174
+ objectId: event.objectId,
175
+ deleted,
176
+ payload: event.payload,
177
+ ...(this.config.connectionId ? { connectionId: this.config.connectionId } : {}),
178
+ }, null, 2);
179
+ }
180
+ }
181
+ function inferWriteCounts(result, deleted) {
182
+ if (deleted)
183
+ return { filesWritten: 0, filesUpdated: 0, filesDeleted: 1 };
184
+ if (result?.updated || result?.status === 'updated') {
185
+ return { filesWritten: 0, filesUpdated: 1, filesDeleted: 0 };
186
+ }
187
+ return { filesWritten: 1, filesUpdated: 0, filesDeleted: 0 };
188
+ }
189
+ function addString(target, key, value) {
190
+ const normalized = readString(value);
191
+ if (normalized)
192
+ target[key] = normalized;
193
+ }
194
+ function readStorageBodyText(value) {
195
+ if (!isRecord(value))
196
+ return undefined;
197
+ const storage = value.storage;
198
+ if (!isRecord(storage))
199
+ return undefined;
200
+ return readString(storage.value);
201
+ }
202
+ function stripHtml(value) {
203
+ return value.replace(/<[^>]*>/g, ' ').replace(/\s+/g, ' ').trim();
204
+ }
205
+ function readString(value) {
206
+ return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
207
+ }
208
+ function isRecord(value) {
209
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
210
+ }
211
+ function isConfluenceNormalizedEvent(value) {
212
+ return (isRecord(value) &&
213
+ value.provider === CONFLUENCE_PROVIDER_NAME &&
214
+ (value.objectType === 'page' || value.objectType === 'space') &&
215
+ typeof value.objectId === 'string' &&
216
+ isRecord(value.payload));
217
+ }
218
+ //# sourceMappingURL=confluence-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confluence-adapter.js","sourceRoot":"","sources":["../src/confluence-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export { ConfluenceAdapter, } from './confluence-adapter.js';
2
+ export type { ConnectionProvider, IngestError, IngestResult, ProxyRequest, ProxyResponse, } from './confluence-adapter.js';
3
+ export { CONFLUENCE_OBJECT_TYPES, computeConfluencePath, confluencePagePath, confluenceSpacePath, encodeConfluencePathSegment, extractConfluenceIdFromPathSegment, normalizeConfluenceObjectType, } from './path-mapper.js';
4
+ export { CONFLUENCE_API_PAGES_ROUTE, CONFLUENCE_API_SPACES_ROUTE, resolveConfluenceReadRequest, } from './queries.js';
5
+ export { resolveConfluenceDeleteRequest, resolveConfluenceWritebackRequest, } from './writeback.js';
6
+ export type * from './types.js';
7
+ export * from './resources.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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;AACjC,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC3B,kCAAkC,EAClC,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,gBAAgB,CAAC;AACxB,mBAAmB,YAAY,CAAC;AAChC,cAAc,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { ConfluenceAdapter, } from './confluence-adapter.js';
2
+ export { CONFLUENCE_OBJECT_TYPES, computeConfluencePath, confluencePagePath, confluenceSpacePath, encodeConfluencePathSegment, extractConfluenceIdFromPathSegment, normalizeConfluenceObjectType, } from './path-mapper.js';
3
+ export { CONFLUENCE_API_PAGES_ROUTE, CONFLUENCE_API_SPACES_ROUTE, resolveConfluenceReadRequest, } from './queries.js';
4
+ export { resolveConfluenceDeleteRequest, resolveConfluenceWritebackRequest, } from './writeback.js';
5
+ export * from './resources.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AAQjC,OAAO,EACL,uBAAuB,EACvB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,2BAA2B,EAC3B,kCAAkC,EAClC,6BAA6B,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,8BAA8B,EAC9B,iCAAiC,GAClC,MAAM,gBAAgB,CAAC;AAExB,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare const CONFLUENCE_OBJECT_TYPES: readonly ["page", "space"];
2
+ export type ConfluencePathObjectType = (typeof CONFLUENCE_OBJECT_TYPES)[number];
3
+ export declare function encodeConfluencePathSegment(value: string): string;
4
+ export declare function normalizeConfluenceObjectType(objectType: string): ConfluencePathObjectType;
5
+ export declare function confluenceSpacePath(spaceIdOrKey: string, name?: string): string;
6
+ export declare function confluencePagePath(pageId: string, title?: string, spaceId?: string): string;
7
+ export declare function computeConfluencePath(objectType: string, objectId: string, options?: {
8
+ title?: string;
9
+ spaceId?: string;
10
+ }): string;
11
+ export declare function extractConfluenceIdFromPathSegment(segment: string): string;
12
+ //# sourceMappingURL=path-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-mapper.d.ts","sourceRoot":"","sources":["../src/path-mapper.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,uBAAuB,4BAA6B,CAAC;AAClE,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAmBhF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjE;AAeD,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,wBAAwB,CAO1F;AAED,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAE/E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAM3F;AAED,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,MAAM,CAUR;AAED,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI1E"}
@@ -0,0 +1,65 @@
1
+ import { CONFLUENCE_PATH_ROOT } from './types.js';
2
+ export const CONFLUENCE_OBJECT_TYPES = ['page', 'space'];
3
+ const OBJECT_TYPE_ALIASES = {
4
+ confluencepage: 'page',
5
+ confluencespace: 'space',
6
+ page: 'page',
7
+ pages: 'page',
8
+ space: 'space',
9
+ spaces: 'space',
10
+ };
11
+ function assertNonEmptySegment(value, label) {
12
+ const trimmed = value.trim();
13
+ if (!trimmed) {
14
+ throw new Error(`Confluence ${label} must be a non-empty string`);
15
+ }
16
+ return trimmed;
17
+ }
18
+ export function encodeConfluencePathSegment(value) {
19
+ return encodeURIComponent(assertNonEmptySegment(value, 'path segment'));
20
+ }
21
+ function slugify(value) {
22
+ return value
23
+ .replace(/[{}]/g, '')
24
+ .replace(/[^a-zA-Z0-9]+/g, '-')
25
+ .replace(/^-+|-+$/g, '')
26
+ .toLowerCase();
27
+ }
28
+ function titleSegmentWithId(title, id) {
29
+ const slug = title ? slugify(title) : '';
30
+ return slug ? `${slug}--${encodeConfluencePathSegment(id)}` : encodeConfluencePathSegment(id);
31
+ }
32
+ export function normalizeConfluenceObjectType(objectType) {
33
+ const normalized = objectType.trim().toLowerCase();
34
+ const mapped = OBJECT_TYPE_ALIASES[normalized];
35
+ if (!mapped) {
36
+ throw new Error(`Unsupported Confluence object type: ${objectType}`);
37
+ }
38
+ return mapped;
39
+ }
40
+ export function confluenceSpacePath(spaceIdOrKey, name) {
41
+ return `${CONFLUENCE_PATH_ROOT}/spaces/${titleSegmentWithId(name, spaceIdOrKey)}.json`;
42
+ }
43
+ export function confluencePagePath(pageId, title, spaceId) {
44
+ const pageSegment = titleSegmentWithId(title, pageId);
45
+ if (spaceId) {
46
+ return `${CONFLUENCE_PATH_ROOT}/spaces/${encodeConfluencePathSegment(spaceId)}/pages/${pageSegment}.json`;
47
+ }
48
+ return `${CONFLUENCE_PATH_ROOT}/pages/${pageSegment}.json`;
49
+ }
50
+ export function computeConfluencePath(objectType, objectId, options = {}) {
51
+ const normalizedType = normalizeConfluenceObjectType(objectType);
52
+ const normalizedId = assertNonEmptySegment(objectId, 'object id');
53
+ switch (normalizedType) {
54
+ case 'page':
55
+ return confluencePagePath(normalizedId, options.title, options.spaceId);
56
+ case 'space':
57
+ return confluenceSpacePath(normalizedId, options.title);
58
+ }
59
+ }
60
+ export function extractConfluenceIdFromPathSegment(segment) {
61
+ const decoded = decodeURIComponent(segment);
62
+ const suffix = /--([^/]+)$/u.exec(decoded);
63
+ return suffix?.[1] ? suffix[1] : decoded;
64
+ }
65
+ //# sourceMappingURL=path-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-mapper.js","sourceRoot":"","sources":["../src/path-mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type ConfluenceReadRequest } from './types.js';
2
+ export declare const CONFLUENCE_API_PAGES_ROUTE = "/wiki/api/v2/pages";
3
+ export declare const CONFLUENCE_API_SPACES_ROUTE = "/wiki/api/v2/spaces";
4
+ export declare function resolveConfluenceReadRequest(path: string): ConfluenceReadRequest;
5
+ //# sourceMappingURL=queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAgC,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEtF,eAAO,MAAM,0BAA0B,uBAAuB,CAAC;AAC/D,eAAO,MAAM,2BAA2B,wBAAwB,CAAC;AAEjE,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,CA0DhF"}
@@ -0,0 +1,72 @@
1
+ import { extractConfluenceIdFromPathSegment } from './path-mapper.js';
2
+ import { CONFLUENCE_DEFAULT_PAGE_SIZE } from './types.js';
3
+ export const CONFLUENCE_API_PAGES_ROUTE = '/wiki/api/v2/pages';
4
+ export const CONFLUENCE_API_SPACES_ROUTE = '/wiki/api/v2/spaces';
5
+ export function resolveConfluenceReadRequest(path) {
6
+ const normalized = normalizePath(path);
7
+ if (normalized === '/confluence/pages' || normalized === '/confluence/pages/') {
8
+ return {
9
+ action: 'list_pages',
10
+ method: 'GET',
11
+ endpoint: CONFLUENCE_API_PAGES_ROUTE,
12
+ query: {
13
+ limit: String(CONFLUENCE_DEFAULT_PAGE_SIZE),
14
+ 'body-format': 'storage',
15
+ },
16
+ };
17
+ }
18
+ if (normalized === '/confluence/spaces' || normalized === '/confluence/spaces/') {
19
+ return {
20
+ action: 'list_spaces',
21
+ method: 'GET',
22
+ endpoint: CONFLUENCE_API_SPACES_ROUTE,
23
+ query: { limit: String(CONFLUENCE_DEFAULT_PAGE_SIZE) },
24
+ };
25
+ }
26
+ const spacePagesMatch = normalized.match(/^\/confluence\/spaces\/([^/]+)\/pages\/?$/u);
27
+ if (spacePagesMatch?.[1]) {
28
+ return {
29
+ action: 'list_space_pages',
30
+ method: 'GET',
31
+ endpoint: CONFLUENCE_API_PAGES_ROUTE,
32
+ query: {
33
+ limit: String(CONFLUENCE_DEFAULT_PAGE_SIZE),
34
+ 'body-format': 'storage',
35
+ 'space-id': extractConfluenceIdFromPathSegment(spacePagesMatch[1]),
36
+ },
37
+ };
38
+ }
39
+ const nestedPageMatch = normalized.match(/^\/confluence\/spaces\/[^/]+\/pages\/([^/]+)\.json$/u);
40
+ if (nestedPageMatch?.[1]) {
41
+ return getPageRequest(extractConfluenceIdFromPathSegment(nestedPageMatch[1]));
42
+ }
43
+ const flatPageMatch = normalized.match(/^\/confluence\/pages\/([^/]+)\.json$/u);
44
+ if (flatPageMatch?.[1]) {
45
+ return getPageRequest(extractConfluenceIdFromPathSegment(flatPageMatch[1]));
46
+ }
47
+ const spaceMatch = normalized.match(/^\/confluence\/spaces\/([^/]+)\.json$/u);
48
+ if (spaceMatch?.[1]) {
49
+ return {
50
+ action: 'get_space',
51
+ method: 'GET',
52
+ endpoint: `${CONFLUENCE_API_SPACES_ROUTE}/${extractConfluenceIdFromPathSegment(spaceMatch[1])}`,
53
+ };
54
+ }
55
+ throw new Error(`No Confluence read rule matched ${path}`);
56
+ }
57
+ function getPageRequest(pageId) {
58
+ return {
59
+ action: 'get_page',
60
+ method: 'GET',
61
+ endpoint: `${CONFLUENCE_API_PAGES_ROUTE}/${pageId}`,
62
+ query: {
63
+ 'body-format': 'storage',
64
+ 'get-draft': 'true',
65
+ },
66
+ };
67
+ }
68
+ function normalizePath(path) {
69
+ const trimmed = path.trim();
70
+ return trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
71
+ }
72
+ //# sourceMappingURL=queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface AdapterResourceConfig {
2
+ readonly name: string;
3
+ readonly path: string;
4
+ readonly pathPattern: RegExp;
5
+ readonly idPattern: RegExp;
6
+ readonly schema: string;
7
+ readonly createExample: string;
8
+ }
9
+ export declare const resources: readonly [{
10
+ readonly name: "pages";
11
+ readonly path: "/confluence/pages";
12
+ readonly pathPattern: RegExp;
13
+ readonly idPattern: RegExp;
14
+ readonly schema: "discovery/confluence/pages/.schema.json";
15
+ readonly createExample: "discovery/confluence/pages/.create.example.json";
16
+ }, {
17
+ readonly name: "pages";
18
+ readonly path: "/confluence/spaces/{spaceIdOrKey}/pages";
19
+ readonly pathPattern: RegExp;
20
+ readonly idPattern: RegExp;
21
+ readonly schema: "discovery/confluence/spaces/{spaceIdOrKey}/pages/.schema.json";
22
+ readonly createExample: "discovery/confluence/spaces/{spaceIdOrKey}/pages/.create.example.json";
23
+ }];
24
+ export declare function findResourceByPath(path: string): AdapterResourceConfig | undefined;
25
+ //# sourceMappingURL=resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.d.ts","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;EAiB+B,CAAC;AAEtD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAGlF"}
@@ -0,0 +1,23 @@
1
+ export const resources = [
2
+ {
3
+ name: "pages",
4
+ path: "/confluence/pages",
5
+ pathPattern: /^\/confluence\/pages(?:\/[^\/]+(?:\.json)?)?$/,
6
+ idPattern: /^(?:[A-Za-z0-9_.~-]+--)?\d+$/,
7
+ schema: "discovery/confluence/pages/.schema.json",
8
+ createExample: "discovery/confluence/pages/.create.example.json",
9
+ },
10
+ {
11
+ name: "pages",
12
+ path: "/confluence/spaces/{spaceIdOrKey}/pages",
13
+ pathPattern: /^\/confluence\/spaces\/[^\/]+\/pages(?:\/[^\/]+(?:\.json)?)?$/,
14
+ idPattern: /^(?:[A-Za-z0-9_.~-]+--)?\d+$/,
15
+ schema: "discovery/confluence/spaces/{spaceIdOrKey}/pages/.schema.json",
16
+ createExample: "discovery/confluence/spaces/{spaceIdOrKey}/pages/.create.example.json",
17
+ },
18
+ ];
19
+ export function findResourceByPath(path) {
20
+ const normalizedPath = path.endsWith(".json") ? path : path.replace(/\/$/, "");
21
+ return resources.find((resource) => resource.pathPattern.test(normalizedPath));
22
+ }
23
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,+CAA+C;QAC5D,SAAS,EAAE,8BAA8B;QACzC,MAAM,EAAE,yCAAyC;QACjD,aAAa,EAAE,iDAAiD;KACjE;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,yCAAyC;QAC/C,WAAW,EAAE,+DAA+D;QAC5E,SAAS,EAAE,8BAA8B;QACzC,MAAM,EAAE,+DAA+D;QACvE,aAAa,EAAE,uEAAuE;KACvF;CACkD,CAAC;AAEtD,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/E,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;AACjF,CAAC"}
@@ -0,0 +1,109 @@
1
+ export type { BulkWriteFile, ConnectionProvider, ProxyRequest, ProxyResponse } from '@relayfile/sdk';
2
+ export declare const CONFLUENCE_PROVIDER_NAME = "confluence";
3
+ export declare const CONFLUENCE_PATH_ROOT = "/confluence";
4
+ export declare const CONFLUENCE_DEFAULT_PAGE_SIZE = 100;
5
+ export type JsonPrimitive = boolean | number | null | string;
6
+ export type JsonValue = JsonArray | JsonObject | JsonPrimitive;
7
+ export interface JsonObject {
8
+ [key: string]: JsonValue | undefined;
9
+ }
10
+ export type JsonArray = JsonValue[];
11
+ export interface ConfluenceAdapterConfig {
12
+ apiBaseUrl?: string;
13
+ cloudId?: string;
14
+ connectionId?: string;
15
+ providerConfigKey?: string;
16
+ pageSize?: number;
17
+ }
18
+ export interface ConfluenceSpace {
19
+ id: string;
20
+ key?: string;
21
+ name?: string;
22
+ type?: string;
23
+ status?: string;
24
+ authorId?: string;
25
+ createdAt?: string;
26
+ homepageId?: string;
27
+ description?: string | JsonValue | null;
28
+ [key: string]: unknown;
29
+ }
30
+ export interface ConfluencePageVersion {
31
+ createdAt?: string;
32
+ message?: string;
33
+ number?: number;
34
+ minorEdit?: boolean;
35
+ authorId?: string;
36
+ [key: string]: unknown;
37
+ }
38
+ export interface ConfluencePageBody {
39
+ storage?: {
40
+ value?: string;
41
+ representation?: string;
42
+ [key: string]: unknown;
43
+ };
44
+ atlas_doc_format?: Record<string, unknown>;
45
+ [key: string]: unknown;
46
+ }
47
+ export interface ConfluencePage {
48
+ id: string;
49
+ title?: string;
50
+ type?: string;
51
+ status?: string;
52
+ authorId?: string;
53
+ createdAt?: string;
54
+ spaceId?: string;
55
+ parentId?: string;
56
+ parentType?: string;
57
+ position?: number;
58
+ version?: ConfluencePageVersion;
59
+ body?: ConfluencePageBody;
60
+ [key: string]: unknown;
61
+ }
62
+ export interface ConfluenceReadRequest {
63
+ action: 'get_page' | 'get_space' | 'list_pages' | 'list_space_pages' | 'list_spaces';
64
+ method: 'GET';
65
+ endpoint: string;
66
+ query?: Record<string, string>;
67
+ }
68
+ export interface ConfluenceWritebackRequest {
69
+ action: 'create_page' | 'delete_page' | 'update_page';
70
+ method: 'DELETE' | 'POST' | 'PUT';
71
+ endpoint: string;
72
+ body?: Record<string, unknown>;
73
+ }
74
+ export interface FileSemantics {
75
+ properties?: Record<string, string>;
76
+ relations?: string[];
77
+ permissions?: string[];
78
+ comments?: string[];
79
+ }
80
+ export interface WriteFileInput {
81
+ workspaceId: string;
82
+ path: string;
83
+ content: string;
84
+ contentType?: string;
85
+ semantics?: FileSemantics;
86
+ }
87
+ export interface WriteFileResult {
88
+ created?: boolean;
89
+ updated?: boolean;
90
+ status?: 'created' | 'updated' | 'queued' | 'pending';
91
+ }
92
+ export interface DeleteFileInput {
93
+ workspaceId: string;
94
+ path: string;
95
+ }
96
+ export interface RelayFileClientLike {
97
+ writeFile(input: WriteFileInput): Promise<WriteFileResult | void>;
98
+ deleteFile?(input: DeleteFileInput): Promise<void> | void;
99
+ }
100
+ export interface ConfluenceNormalizedEvent {
101
+ provider: string;
102
+ connectionId?: string;
103
+ providerConfigKey?: string;
104
+ eventType: string;
105
+ objectType: 'page' | 'space';
106
+ objectId: string;
107
+ payload: Record<string, unknown>;
108
+ }
109
+ //# 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,4 @@
1
+ export const CONFLUENCE_PROVIDER_NAME = 'confluence';
2
+ export const CONFLUENCE_PATH_ROOT = '/confluence';
3
+ export const CONFLUENCE_DEFAULT_PAGE_SIZE = 100;
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAAC;AACrD,MAAM,CAAC,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAClD,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ConfluenceWritebackRequest } from './types.js';
2
+ export { ReadOnlyFieldError } from '@relayfile/adapter-core';
3
+ export declare const CONFLUENCE_API_PAGES_ROUTE = "/wiki/api/v2/pages";
4
+ export declare function resolveConfluenceWritebackRequest(path: string, content: string): ConfluenceWritebackRequest;
5
+ export declare function resolveConfluenceDeleteRequest(path: string): ConfluenceWritebackRequest;
6
+ //# sourceMappingURL=writeback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeback.d.ts","sourceRoot":"","sources":["../src/writeback.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,eAAO,MAAM,0BAA0B,uBAAuB,CAAC;AAE/D,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,0BAA0B,CAyB3G;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,MAAM,GAAG,0BAA0B,CAkBvF"}