@relayfile/adapter-reddit 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/digest.d.ts +4 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +47 -0
- package/dist/digest.js.map +1 -0
- package/dist/digest.test.d.ts +2 -0
- package/dist/digest.test.d.ts.map +1 -0
- package/dist/digest.test.js +65 -0
- package/dist/digest.test.js.map +1 -0
- package/dist/emit-auxiliary-files.d.ts +20 -0
- package/dist/emit-auxiliary-files.d.ts.map +1 -0
- package/dist/emit-auxiliary-files.js +298 -0
- package/dist/emit-auxiliary-files.js.map +1 -0
- package/dist/emit-auxiliary-files.test.d.ts +2 -0
- package/dist/emit-auxiliary-files.test.d.ts.map +1 -0
- package/dist/emit-auxiliary-files.test.js +102 -0
- package/dist/emit-auxiliary-files.test.js.map +1 -0
- package/dist/index-emitter.d.ts +26 -0
- package/dist/index-emitter.d.ts.map +1 -0
- package/dist/index-emitter.js +79 -0
- package/dist/index-emitter.js.map +1 -0
- package/dist/index-emitter.test.d.ts +2 -0
- package/dist/index-emitter.test.d.ts.map +1 -0
- package/dist/index-emitter.test.js +25 -0
- package/dist/index-emitter.test.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/layout-prompt.d.ts +7 -0
- package/dist/layout-prompt.d.ts.map +1 -0
- package/dist/layout-prompt.js +39 -0
- package/dist/layout-prompt.js.map +1 -0
- package/dist/layout-prompt.test.d.ts +2 -0
- package/dist/layout-prompt.test.d.ts.map +1 -0
- package/dist/layout-prompt.test.js +11 -0
- package/dist/layout-prompt.test.js.map +1 -0
- package/dist/path-mapper.d.ts +25 -0
- package/dist/path-mapper.d.ts.map +1 -0
- package/dist/path-mapper.js +112 -0
- package/dist/path-mapper.js.map +1 -0
- package/dist/path-mapper.test.d.ts +2 -0
- package/dist/path-mapper.test.d.ts.map +1 -0
- package/dist/path-mapper.test.js +18 -0
- package/dist/path-mapper.test.js.map +1 -0
- package/dist/resources.d.ts +27 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +23 -0
- package/dist/resources.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +2 -2
package/dist/digest.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type DigestBullet, type DigestChangeEvent, type DigestContext, type DigestHandler, type DigestSection, type DigestWindow } from '@relayfile/adapter-core';
|
|
2
|
+
export type { DigestBullet, DigestChangeEvent, DigestContext, DigestHandler, DigestSection, DigestWindow, };
|
|
3
|
+
export declare const digest: DigestHandler;
|
|
4
|
+
//# sourceMappingURL=digest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,GACb,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,aAgBnB,CAAC"}
|
package/dist/digest.js
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { createDigestHandler, } from '@relayfile/adapter-core';
|
|
2
|
+
export const digest = createDigestHandler({
|
|
3
|
+
provider: 'reddit',
|
|
4
|
+
identify: (canonicalPath) => redditIdentifier(canonicalPath),
|
|
5
|
+
alias: {
|
|
6
|
+
mode: 'any',
|
|
7
|
+
segments: ['by-id', 'by-status'],
|
|
8
|
+
},
|
|
9
|
+
acceptEvent: (_event, canonicalPath) => isCanonicalRedditRecordPath(canonicalPath),
|
|
10
|
+
actionRules: [
|
|
11
|
+
{ verbs: 'create|created|add|added|write|written', pastTense: 'was created' },
|
|
12
|
+
{ verbs: 'archive|archived', pastTense: 'was archived' },
|
|
13
|
+
{ verbs: 'lock|locked', pastTense: 'was locked' },
|
|
14
|
+
{ verbs: 'remove|removed', pastTense: 'was removed' },
|
|
15
|
+
{ verbs: 'delete|deleted', pastTense: 'was deleted' },
|
|
16
|
+
],
|
|
17
|
+
defaultPastTense: 'was updated',
|
|
18
|
+
});
|
|
19
|
+
function isCanonicalRedditRecordPath(path) {
|
|
20
|
+
return /^reddit\/subreddits\/[^/]+\.json$/u.test(path)
|
|
21
|
+
|| /^reddit\/subreddits\/[^/]+\/posts\/[^/]+\.json$/u.test(path);
|
|
22
|
+
}
|
|
23
|
+
function normalizeDigestPath(path) {
|
|
24
|
+
return path.replace(/^\/+/, '');
|
|
25
|
+
}
|
|
26
|
+
function redditIdentifier(path) {
|
|
27
|
+
const segments = normalizeDigestPath(path).split('/').filter(Boolean);
|
|
28
|
+
if (segments[1] === 'subreddits' && segments[3] === 'posts') {
|
|
29
|
+
return `post r/${decodePart(segments[2] ?? '')}/${decodeLeaf(segments[4] ?? '')}`;
|
|
30
|
+
}
|
|
31
|
+
if (segments[1] === 'subreddits') {
|
|
32
|
+
return `subreddit r/${decodeLeaf(segments[2] ?? '')}`;
|
|
33
|
+
}
|
|
34
|
+
return decodeLeaf(segments.at(-1) ?? path);
|
|
35
|
+
}
|
|
36
|
+
function decodeLeaf(segment) {
|
|
37
|
+
return decodePart(segment).replace(/\.[^.]+$/u, '');
|
|
38
|
+
}
|
|
39
|
+
function decodePart(segment) {
|
|
40
|
+
try {
|
|
41
|
+
return decodeURIComponent(segment);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return segment;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=digest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.js","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAOpB,MAAM,yBAAyB,CAAC;AAWjC,MAAM,CAAC,MAAM,MAAM,GAAkB,mBAAmB,CAAC;IACvD,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,gBAAgB,CAAC,aAAa,CAAC;IAC5D,KAAK,EAAE;QACL,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;KACjC;IACD,WAAW,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,2BAA2B,CAAC,aAAa,CAAC;IAClF,WAAW,EAAE;QACX,EAAE,KAAK,EAAE,wCAAwC,EAAE,SAAS,EAAE,aAAa,EAAE;QAC7E,EAAE,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,cAAc,EAAE;QACxD,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE;QACjD,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE;QACrD,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE;KACtD;IACD,gBAAgB,EAAE,aAAa;CAChC,CAAC,CAAC;AAEH,SAAS,2BAA2B,CAAC,IAAY;IAC/C,OAAO,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC;WACjD,kDAAkD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtE,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,YAAY,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QAC5D,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACpF,CAAC;IACD,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE,CAAC;QACjC,OAAO,eAAe,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.test.d.ts","sourceRoot":"","sources":["../src/digest.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
import { digest } from './digest.js';
|
|
4
|
+
test('reddit digest summarizes canonical events and terminal states', async () => {
|
|
5
|
+
const ctx = {
|
|
6
|
+
provider: 'reddit',
|
|
7
|
+
window: { from: '2026-05-29T00:00:00.000Z', to: '2026-05-30T00:00:00.000Z' },
|
|
8
|
+
async changeEvents(filter) {
|
|
9
|
+
assert.deepEqual(filter, { providers: ['reddit'] });
|
|
10
|
+
return [
|
|
11
|
+
{
|
|
12
|
+
id: 'evt-1',
|
|
13
|
+
timestamp: '2026-05-29T08:00:00.000Z',
|
|
14
|
+
action: 'created',
|
|
15
|
+
canonicalPath: '/reddit/subreddits/agentrelay.json',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: 'evt-2',
|
|
19
|
+
timestamp: '2026-05-29T08:30:00.000Z',
|
|
20
|
+
action: 'archived',
|
|
21
|
+
canonicalPath: '/reddit/subreddits/agentrelay/posts/launch-week-recap__abc123.json',
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
const result = await digest(ctx);
|
|
27
|
+
assert.deepEqual(result, {
|
|
28
|
+
provider: 'reddit',
|
|
29
|
+
bullets: [
|
|
30
|
+
{
|
|
31
|
+
text: 'subreddit r/agentrelay was created',
|
|
32
|
+
canonicalPath: 'reddit/subreddits/agentrelay.json',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
text: 'post r/agentrelay/launch-week-recap__abc123 was archived',
|
|
36
|
+
canonicalPath: 'reddit/subreddits/agentrelay/posts/launch-week-recap__abc123.json',
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
test('reddit digest ignores aliases and non-canonical helper files', async () => {
|
|
42
|
+
const ctx = {
|
|
43
|
+
provider: 'reddit',
|
|
44
|
+
window: { from: '2026-05-29T00:00:00.000Z', to: '2026-05-30T00:00:00.000Z' },
|
|
45
|
+
async changeEvents() {
|
|
46
|
+
return [
|
|
47
|
+
{ id: 'evt-1', timestamp: '2026-05-29T08:00:00.000Z', action: 'updated', canonicalPath: '/reddit/LAYOUT.md' },
|
|
48
|
+
{
|
|
49
|
+
id: 'evt-2',
|
|
50
|
+
timestamp: '2026-05-29T08:00:01.000Z',
|
|
51
|
+
action: 'updated',
|
|
52
|
+
canonicalPath: '/reddit/posts/by-id/agentrelay__abc123.json',
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: 'evt-3',
|
|
56
|
+
timestamp: '2026-05-29T08:00:02.000Z',
|
|
57
|
+
action: 'updated',
|
|
58
|
+
canonicalPath: '/reddit/posts/by-status/archived/agentrelay__abc123.json',
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
assert.equal(await digest(ctx), null);
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=digest.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest.test.js","sourceRoot":"","sources":["../src/digest.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAsB,MAAM,aAAa,CAAC;AAEzD,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;IAC/E,MAAM,GAAG,GAAkB;QACzB,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,EAAE,EAAE,0BAA0B,EAAE;QAC5E,KAAK,CAAC,YAAY,CAAC,MAAM;YACvB,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACpD,OAAO;gBACL;oBACE,EAAE,EAAE,OAAO;oBACX,SAAS,EAAE,0BAA0B;oBACrC,MAAM,EAAE,SAAS;oBACjB,aAAa,EAAE,oCAAoC;iBACpD;gBACD;oBACE,EAAE,EAAE,OAAO;oBACX,SAAS,EAAE,0BAA0B;oBACrC,MAAM,EAAE,UAAU;oBAClB,aAAa,EAAE,oEAAoE;iBACpF;aACF,CAAC;QACJ,CAAC;KACF,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;QACvB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,oCAAoC;gBAC1C,aAAa,EAAE,mCAAmC;aACnD;YACD;gBACE,IAAI,EAAE,0DAA0D;gBAChE,aAAa,EAAE,mEAAmE;aACnF;SACF;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;IAC9E,MAAM,GAAG,GAAkB;QACzB,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,EAAE,EAAE,0BAA0B,EAAE;QAC5E,KAAK,CAAC,YAAY;YAChB,OAAO;gBACL,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,0BAA0B,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,mBAAmB,EAAE;gBAC7G;oBACE,EAAE,EAAE,OAAO;oBACX,SAAS,EAAE,0BAA0B;oBACrC,MAAM,EAAE,SAAS;oBACjB,aAAa,EAAE,6CAA6C;iBAC7D;gBACD;oBACE,EAAE,EAAE,OAAO;oBACX,SAAS,EAAE,0BAA0B;oBACrC,MAAM,EAAE,SAAS;oBACjB,aAAa,EAAE,0DAA0D;iBAC1E;aACF,CAAC;QACJ,CAAC;KACF,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type AuxiliaryEmitterClient, type EmitAuxiliaryFilesResult } from '@relayfile/adapter-core';
|
|
2
|
+
import type { RedditPost, RedditSubreddit } from './types.js';
|
|
3
|
+
export type RedditDeletedRecord = {
|
|
4
|
+
id: string;
|
|
5
|
+
_deleted: true;
|
|
6
|
+
objectType: 'subreddit' | 'post';
|
|
7
|
+
subreddit?: string;
|
|
8
|
+
post_id?: string;
|
|
9
|
+
};
|
|
10
|
+
export type RedditSubredditEmitRecord = RedditSubreddit | RedditDeletedRecord;
|
|
11
|
+
export type RedditPostEmitRecord = RedditPost | RedditDeletedRecord;
|
|
12
|
+
export interface RedditEmitAuxiliaryFilesInput {
|
|
13
|
+
workspaceId: string;
|
|
14
|
+
records?: readonly (RedditSubreddit | RedditPost | RedditDeletedRecord)[];
|
|
15
|
+
subreddits?: readonly RedditSubredditEmitRecord[];
|
|
16
|
+
posts?: readonly RedditPostEmitRecord[];
|
|
17
|
+
connectionId?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function emitRedditAuxiliaryFiles(client: AuxiliaryEmitterClient, input: RedditEmitAuxiliaryFilesInput): Promise<EmitAuxiliaryFilesResult>;
|
|
20
|
+
//# 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,OAAO,EAIL,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAG9B,MAAM,yBAAyB,CAAC;AAyBjC,OAAO,KAAK,EAAE,UAAU,EAAsB,eAAe,EAA2B,MAAM,YAAY,CAAC;AAK3G,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,IAAI,CAAC;IACf,UAAU,EAAE,WAAW,GAAG,MAAM,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAC9E,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,mBAAmB,CAAC;AAEpE,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,CAAC,eAAe,GAAG,UAAU,GAAG,mBAAmB,CAAC,EAAE,CAAC;IAC1E,UAAU,CAAC,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAClD,KAAK,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,wBAAwB,CAAC,CAoDnC"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { EMIT_AUXILIARY_JSON_CONTENT_TYPE, IndexFileReconciler, runEmitBatch, } from '@relayfile/adapter-core';
|
|
2
|
+
import { buildRedditPostsIndexFile, buildRedditRootIndexFile, buildRedditSubredditPostsIndexFile, buildRedditSubredditsIndexFile, redditPostIndexRow, redditPostTitle, redditSubredditIndexRow, redditSubredditTitle, } from './index-emitter.js';
|
|
3
|
+
import { redditLayoutPromptFile } from './layout-prompt.js';
|
|
4
|
+
import { normalizeSubreddit, parseRedditPostScopedId, redditPostByIdAliasPath, redditPostByStatusAliasPath, redditPostPath, redditPostsIndexPath, redditSubredditByIdAliasPath, redditSubredditPath, redditSubredditPostsIndexPath, redditSubredditsIndexPath, } from './path-mapper.js';
|
|
5
|
+
const REDDIT_PROVIDER_NAME = 'reddit';
|
|
6
|
+
const JSON_CONTENT_TYPE = EMIT_AUXILIARY_JSON_CONTENT_TYPE;
|
|
7
|
+
export async function emitRedditAuxiliaryFiles(client, input) {
|
|
8
|
+
const workspaceId = input.workspaceId;
|
|
9
|
+
const aggregate = { written: 0, deleted: 0, errors: [] };
|
|
10
|
+
await writeStaticFiles(client, workspaceId, aggregate);
|
|
11
|
+
const classified = classifyRecords(input.records ?? []);
|
|
12
|
+
const subreddits = [...(input.subreddits ?? []), ...classified.subreddits];
|
|
13
|
+
const posts = [...(input.posts ?? []), ...classified.posts];
|
|
14
|
+
const subredditIndex = new IndexFileReconciler({
|
|
15
|
+
client,
|
|
16
|
+
workspaceId,
|
|
17
|
+
path: redditSubredditsIndexPath(),
|
|
18
|
+
builder: buildRedditSubredditsIndexFile,
|
|
19
|
+
});
|
|
20
|
+
const postIndex = new IndexFileReconciler({
|
|
21
|
+
client,
|
|
22
|
+
workspaceId,
|
|
23
|
+
path: redditPostsIndexPath(),
|
|
24
|
+
builder: buildRedditPostsIndexFile,
|
|
25
|
+
});
|
|
26
|
+
const subredditPostIndexes = new Map();
|
|
27
|
+
accumulate(aggregate, await runEmitBatch(client, workspaceId, subreddits, (record) => planSubredditRecord(record, subredditIndex, input.connectionId)));
|
|
28
|
+
accumulate(aggregate, await runEmitBatch(client, workspaceId, posts, async (record) => planPostRecord(client, workspaceId, record, postIndex, getSubredditPostIndex, input.connectionId)));
|
|
29
|
+
for (const reconciler of [subredditIndex, postIndex, ...subredditPostIndexes.values()]) {
|
|
30
|
+
const flush = await reconciler.flush();
|
|
31
|
+
aggregate.written += flush.written;
|
|
32
|
+
aggregate.errors.push(...flush.errors);
|
|
33
|
+
}
|
|
34
|
+
return aggregate;
|
|
35
|
+
function getSubredditPostIndex(subreddit) {
|
|
36
|
+
const normalizedSubreddit = normalizeSubreddit(subreddit);
|
|
37
|
+
let reconciler = subredditPostIndexes.get(normalizedSubreddit);
|
|
38
|
+
if (!reconciler) {
|
|
39
|
+
reconciler = new IndexFileReconciler({
|
|
40
|
+
client,
|
|
41
|
+
workspaceId,
|
|
42
|
+
path: redditSubredditPostsIndexPath(normalizedSubreddit),
|
|
43
|
+
builder: (rows) => buildRedditSubredditPostsIndexFile(normalizedSubreddit, rows),
|
|
44
|
+
});
|
|
45
|
+
subredditPostIndexes.set(normalizedSubreddit, reconciler);
|
|
46
|
+
}
|
|
47
|
+
return reconciler;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async function writeStaticFiles(client, workspaceId, aggregate) {
|
|
51
|
+
for (const file of [buildRedditRootIndexFile(), redditLayoutPromptFile()]) {
|
|
52
|
+
try {
|
|
53
|
+
await client.writeFile({
|
|
54
|
+
workspaceId,
|
|
55
|
+
path: file.path,
|
|
56
|
+
content: file.content,
|
|
57
|
+
contentType: file.contentType,
|
|
58
|
+
});
|
|
59
|
+
aggregate.written += 1;
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
aggregate.errors.push({ path: file.path, error: stringifyError(error) });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function planSubredditRecord(record, index, connectionId) {
|
|
67
|
+
const subreddit = normalizeSubreddit(isDeleted(record) ? record.id : record.name);
|
|
68
|
+
if (isDeleted(record)) {
|
|
69
|
+
index.remove(subreddit);
|
|
70
|
+
return {
|
|
71
|
+
deletes: staleDeletes([
|
|
72
|
+
redditSubredditPath(subreddit),
|
|
73
|
+
redditSubredditByIdAliasPath(subreddit),
|
|
74
|
+
]),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
const row = { ...redditSubredditIndexRow(record), id: subreddit };
|
|
78
|
+
index.upsert(row);
|
|
79
|
+
const canonicalPath = redditSubredditPath(subreddit);
|
|
80
|
+
const content = json(recordEnvelope('subreddit', subreddit, canonicalPath, redditSubredditTitle(record), record, connectionId));
|
|
81
|
+
const semantics = {
|
|
82
|
+
properties: {
|
|
83
|
+
provider: REDDIT_PROVIDER_NAME,
|
|
84
|
+
'reddit.object_type': 'subreddit',
|
|
85
|
+
'reddit.subreddit': subreddit,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
return {
|
|
89
|
+
writes: [
|
|
90
|
+
mirrorWrite(canonicalPath, content, semantics),
|
|
91
|
+
mirrorWrite(redditSubredditByIdAliasPath(subreddit), content, semantics),
|
|
92
|
+
],
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
async function planPostRecord(client, workspaceId, record, index, subredditIndex, connectionId) {
|
|
96
|
+
if (isDeleted(record)) {
|
|
97
|
+
const scoped = await resolveDeletedPostScope(client, workspaceId, record);
|
|
98
|
+
if (!scoped) {
|
|
99
|
+
index.remove(record.id);
|
|
100
|
+
return { deletes: [] };
|
|
101
|
+
}
|
|
102
|
+
const scopedId = `${scoped.subreddit}/${scoped.postId}`;
|
|
103
|
+
const byIdAliasPath = redditPostByIdAliasPath(scoped.subreddit, scoped.postId);
|
|
104
|
+
const canonicalPath = await canonicalPathFromAlias(client, workspaceId, byIdAliasPath);
|
|
105
|
+
index.remove(record.id);
|
|
106
|
+
index.remove(scopedId);
|
|
107
|
+
subredditIndex(scoped.subreddit).remove(record.id);
|
|
108
|
+
subredditIndex(scoped.subreddit).remove(scopedId);
|
|
109
|
+
return {
|
|
110
|
+
deletes: staleDeletes([
|
|
111
|
+
canonicalPath ?? redditPostPath(scoped.subreddit, scoped.postId),
|
|
112
|
+
byIdAliasPath,
|
|
113
|
+
redditPostByStatusAliasPath('active', scoped.subreddit, scoped.postId),
|
|
114
|
+
redditPostByStatusAliasPath('locked', scoped.subreddit, scoped.postId),
|
|
115
|
+
redditPostByStatusAliasPath('archived', scoped.subreddit, scoped.postId),
|
|
116
|
+
redditPostByStatusAliasPath('removed', scoped.subreddit, scoped.postId),
|
|
117
|
+
redditPostByStatusAliasPath('deleted', scoped.subreddit, scoped.postId),
|
|
118
|
+
]),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
const normalizedSubreddit = normalizeSubreddit(record.subreddit);
|
|
122
|
+
const row = redditPostIndexRow(record);
|
|
123
|
+
index.upsert(row);
|
|
124
|
+
subredditIndex(normalizedSubreddit).upsert(row);
|
|
125
|
+
const canonicalPath = redditPostPath(normalizedSubreddit, record.post_id, redditPostTitle(record));
|
|
126
|
+
const content = json(recordEnvelope('post', record.id, canonicalPath, redditPostTitle(record), record, connectionId));
|
|
127
|
+
const status = (record.status ?? 'active').toLowerCase();
|
|
128
|
+
const semantics = {
|
|
129
|
+
properties: {
|
|
130
|
+
provider: REDDIT_PROVIDER_NAME,
|
|
131
|
+
'reddit.object_type': 'post',
|
|
132
|
+
'reddit.subreddit': normalizedSubreddit,
|
|
133
|
+
'reddit.post_id': record.post_id,
|
|
134
|
+
'reddit.status': status,
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
return {
|
|
138
|
+
writes: [
|
|
139
|
+
mirrorWrite(canonicalPath, content, semantics),
|
|
140
|
+
mirrorWrite(redditPostByIdAliasPath(normalizedSubreddit, record.post_id), content, semantics),
|
|
141
|
+
mirrorWrite(redditPostByStatusAliasPath(status, normalizedSubreddit, record.post_id), content, semantics),
|
|
142
|
+
],
|
|
143
|
+
deletes: staleDeletes([
|
|
144
|
+
...(status === 'active' ? [] : [redditPostByStatusAliasPath('active', normalizedSubreddit, record.post_id)]),
|
|
145
|
+
...(status === 'locked' ? [] : [redditPostByStatusAliasPath('locked', normalizedSubreddit, record.post_id)]),
|
|
146
|
+
...(status === 'archived' ? [] : [redditPostByStatusAliasPath('archived', normalizedSubreddit, record.post_id)]),
|
|
147
|
+
...(status === 'removed' ? [] : [redditPostByStatusAliasPath('removed', normalizedSubreddit, record.post_id)]),
|
|
148
|
+
...(status === 'deleted' ? [] : [redditPostByStatusAliasPath('deleted', normalizedSubreddit, record.post_id)]),
|
|
149
|
+
]),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
async function resolveDeletedPostScope(client, workspaceId, record) {
|
|
153
|
+
const rawId = record.id.trim();
|
|
154
|
+
if (!rawId) {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
return parseRedditPostScopedId(rawId);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// fall through: some tombstones only carry an unscoped post id.
|
|
162
|
+
}
|
|
163
|
+
if (record.subreddit) {
|
|
164
|
+
return {
|
|
165
|
+
subreddit: normalizeSubreddit(record.subreddit),
|
|
166
|
+
postId: typeof record.post_id === 'string' && record.post_id.trim() ? record.post_id.trim() : rawId,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (!client.readFile) {
|
|
170
|
+
return undefined;
|
|
171
|
+
}
|
|
172
|
+
try {
|
|
173
|
+
const read = await client.readFile({ workspaceId, path: redditPostsIndexPath() });
|
|
174
|
+
if (!read?.content) {
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
const parsed = JSON.parse(read.content);
|
|
178
|
+
if (!Array.isArray(parsed)) {
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
for (const row of parsed) {
|
|
182
|
+
if (!row || typeof row !== 'object')
|
|
183
|
+
continue;
|
|
184
|
+
const entry = row;
|
|
185
|
+
if (typeof entry.id !== 'string')
|
|
186
|
+
continue;
|
|
187
|
+
const id = entry.id.trim();
|
|
188
|
+
if (!id)
|
|
189
|
+
continue;
|
|
190
|
+
if (id === rawId && typeof entry.subreddit === 'string' && entry.subreddit.trim()) {
|
|
191
|
+
return {
|
|
192
|
+
subreddit: normalizeSubreddit(entry.subreddit),
|
|
193
|
+
postId: rawId,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
if (id === rawId || id.endsWith(`/${rawId}`)) {
|
|
197
|
+
try {
|
|
198
|
+
return parseRedditPostScopedId(id);
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
// keep looking through the index for another compatible row.
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return undefined;
|
|
208
|
+
}
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
function classifyRecords(records) {
|
|
212
|
+
const subreddits = [];
|
|
213
|
+
const posts = [];
|
|
214
|
+
for (const record of records) {
|
|
215
|
+
if (!record || typeof record !== 'object')
|
|
216
|
+
continue;
|
|
217
|
+
if ('_deleted' in record && record._deleted === true) {
|
|
218
|
+
const tombstone = record;
|
|
219
|
+
if (tombstone.objectType === 'subreddit')
|
|
220
|
+
subreddits.push(tombstone);
|
|
221
|
+
if (tombstone.objectType === 'post')
|
|
222
|
+
posts.push(tombstone);
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
const candidate = record;
|
|
226
|
+
if (typeof candidate.post_id === 'string' && typeof candidate.subreddit === 'string') {
|
|
227
|
+
posts.push(record);
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
if (typeof candidate.name === 'string') {
|
|
231
|
+
subreddits.push(record);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return { subreddits, posts };
|
|
235
|
+
}
|
|
236
|
+
function recordEnvelope(objectType, objectId, canonicalPath, title, payload, connectionId) {
|
|
237
|
+
return {
|
|
238
|
+
provider: REDDIT_PROVIDER_NAME,
|
|
239
|
+
objectType,
|
|
240
|
+
objectId,
|
|
241
|
+
title,
|
|
242
|
+
canonicalPath,
|
|
243
|
+
...(connectionId ? { connectionId } : {}),
|
|
244
|
+
payload,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
function mirrorWrite(path, content, semantics) {
|
|
248
|
+
return {
|
|
249
|
+
path,
|
|
250
|
+
content,
|
|
251
|
+
contentType: JSON_CONTENT_TYPE,
|
|
252
|
+
...(semantics ? { semantics } : {}),
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
function json(value) {
|
|
256
|
+
return `${JSON.stringify(value)}\n`;
|
|
257
|
+
}
|
|
258
|
+
function staleDeletes(paths) {
|
|
259
|
+
return paths
|
|
260
|
+
.filter((path) => Boolean(path))
|
|
261
|
+
.map((path) => ({ path }));
|
|
262
|
+
}
|
|
263
|
+
async function canonicalPathFromAlias(client, workspaceId, aliasPath) {
|
|
264
|
+
if (!client.readFile) {
|
|
265
|
+
return undefined;
|
|
266
|
+
}
|
|
267
|
+
try {
|
|
268
|
+
const read = await client.readFile({ workspaceId, path: aliasPath });
|
|
269
|
+
if (!read?.content) {
|
|
270
|
+
return undefined;
|
|
271
|
+
}
|
|
272
|
+
const parsed = JSON.parse(read.content);
|
|
273
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
274
|
+
return undefined;
|
|
275
|
+
}
|
|
276
|
+
const canonicalPath = parsed.canonicalPath;
|
|
277
|
+
return typeof canonicalPath === 'string' && canonicalPath.length > 0
|
|
278
|
+
? canonicalPath
|
|
279
|
+
: undefined;
|
|
280
|
+
}
|
|
281
|
+
catch {
|
|
282
|
+
return undefined;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
function isDeleted(record) {
|
|
286
|
+
return record._deleted === true;
|
|
287
|
+
}
|
|
288
|
+
function stringifyError(error) {
|
|
289
|
+
if (error instanceof Error)
|
|
290
|
+
return error.message;
|
|
291
|
+
return String(error);
|
|
292
|
+
}
|
|
293
|
+
function accumulate(target, source) {
|
|
294
|
+
target.written += source.written;
|
|
295
|
+
target.deleted += source.deleted;
|
|
296
|
+
target.errors.push(...source.errors);
|
|
297
|
+
}
|
|
298
|
+
//# 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":"AAAA,OAAO,EACL,gCAAgC,EAChC,mBAAmB,EACnB,YAAY,GAKb,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,kCAAkC,EAClC,8BAA8B,EAC9B,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,cAAc,EACd,oBAAoB,EACpB,4BAA4B,EAC5B,mBAAmB,EACnB,6BAA6B,EAC7B,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAG1B,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AACtC,MAAM,iBAAiB,GAAG,gCAAgC,CAAC;AAqB3D,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAA8B,EAC9B,KAAoC;IAEpC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACtC,MAAM,SAAS,GAA6B,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACnF,MAAM,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAEvD,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAE5D,MAAM,cAAc,GAAG,IAAI,mBAAmB,CAA0B;QACtE,MAAM;QACN,WAAW;QACX,IAAI,EAAE,yBAAyB,EAAE;QACjC,OAAO,EAAE,8BAA8B;KACxC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,IAAI,mBAAmB,CAAqB;QAC5D,MAAM;QACN,WAAW;QACX,IAAI,EAAE,oBAAoB,EAAE;QAC5B,OAAO,EAAE,yBAAyB;KACnC,CAAC,CAAC;IACH,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAmD,CAAC;IAExF,UAAU,CAAC,SAAS,EAAE,MAAM,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CACnF,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC,YAAY,CAAC,CAChE,CAAC,CAAC;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CACpF,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,qBAAqB,EAAE,KAAK,CAAC,YAAY,CAAC,CAClG,CAAC,CAAC;IAEH,KAAK,MAAM,UAAU,IAAI,CAAC,cAAc,EAAE,SAAS,EAAE,GAAG,oBAAoB,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QACvF,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;QACvC,SAAS,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;QACnC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,SAAS,CAAC;IAEjB,SAAS,qBAAqB,CAAC,SAAiB;QAC9C,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,UAAU,GAAG,oBAAoB,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,UAAU,GAAG,IAAI,mBAAmB,CAAqB;gBACvD,MAAM;gBACN,WAAW;gBACX,IAAI,EAAE,6BAA6B,CAAC,mBAAmB,CAAC;gBACxD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,kCAAkC,CAAC,mBAAmB,EAAE,IAAI,CAAC;aACjF,CAAC,CAAC;YACH,oBAAoB,CAAC,GAAG,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,MAA8B,EAC9B,WAAmB,EACnB,SAAmC;IAEnC,KAAK,MAAM,IAAI,IAAI,CAAC,wBAAwB,EAAE,EAAE,sBAAsB,EAAE,CAAC,EAAE,CAAC;QAC1E,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,SAAS,CAAC;gBACrB,WAAW;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,CAAC,CAAC;YACH,SAAS,CAAC,OAAO,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,MAAiC,EACjC,KAAmD,EACnD,YAAgC;IAEhC,MAAM,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClF,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,YAAY,CAAC;gBACpB,mBAAmB,CAAC,SAAS,CAAC;gBAC9B,4BAA4B,CAAC,SAAS,CAAC;aACxC,CAAC;SACH,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,GAAG,uBAAuB,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;IAClE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClB,MAAM,aAAa,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,oBAAoB,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAChI,MAAM,SAAS,GAAG;QAChB,UAAU,EAAE;YACV,QAAQ,EAAE,oBAAoB;YAC9B,oBAAoB,EAAE,WAAW;YACjC,kBAAkB,EAAE,SAAS;SAC9B;KACF,CAAC;IACF,OAAO;QACL,MAAM,EAAE;YACN,WAAW,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC;YAC9C,WAAW,CAAC,4BAA4B,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC;SACzE;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,MAA8B,EAC9B,WAAmB,EACnB,MAA4B,EAC5B,KAA8C,EAC9C,cAA8E,EAC9E,YAAgC;IAEhC,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACxD,MAAM,aAAa,GAAG,uBAAuB,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/E,MAAM,aAAa,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QACvF,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnD,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClD,OAAO;YACL,OAAO,EAAE,YAAY,CAAC;gBACpB,aAAa,IAAI,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;gBAChE,aAAa;gBACb,2BAA2B,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;gBACtE,2BAA2B,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;gBACtE,2BAA2B,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;gBACxE,2BAA2B,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;gBACvE,2BAA2B,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;aACxE,CAAC;SACH,CAAC;IACJ,CAAC;IAED,MAAM,mBAAmB,GAAG,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAClB,cAAc,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAEhD,MAAM,aAAa,GAAG,cAAc,CAAC,mBAAmB,EAAE,MAAM,CAAC,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;IACnG,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,aAAa,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACtH,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IACzD,MAAM,SAAS,GAAG;QAChB,UAAU,EAAE;YACV,QAAQ,EAAE,oBAAoB;YAC9B,oBAAoB,EAAE,MAAM;YAC5B,kBAAkB,EAAE,mBAAmB;YACvC,gBAAgB,EAAE,MAAM,CAAC,OAAO;YAChC,eAAe,EAAE,MAAM;SACxB;KACF,CAAC;IAEF,OAAO;QACL,MAAM,EAAE;YACN,WAAW,CAAC,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC;YAC9C,WAAW,CAAC,uBAAuB,CAAC,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC;YAC7F,WAAW,CAAC,2BAA2B,CAAC,MAAM,EAAE,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC;SAC1G;QACD,OAAO,EAAE,YAAY,CAAC;YACpB,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5G,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5G,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,UAAU,EAAE,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAChH,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,SAAS,EAAE,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9G,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,SAAS,EAAE,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;SAC/G,CAAC;KACH,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,MAA8B,EAC9B,WAAmB,EACnB,MAA2B;IAE3B,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO;YACL,SAAS,EAAE,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC;YAC/C,MAAM,EAAE,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK;SACpG,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;YACnB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAY,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,SAAS;YAC9C,MAAM,KAAK,GAAG,GAA4C,CAAC;YAC3D,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;gBAAE,SAAS;YAE3C,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,EAAE;gBAAE,SAAS;YAElB,IAAI,EAAE,KAAK,KAAK,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;gBAClF,OAAO;oBACL,SAAS,EAAE,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC;oBAC9C,MAAM,EAAE,KAAK;iBACd,CAAC;YACJ,CAAC;YAED,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,EAAE,CAAC;gBAC7C,IAAI,CAAC;oBACH,OAAO,uBAAuB,CAAC,EAAE,CAAC,CAAC;gBACrC,CAAC;gBAAC,MAAM,CAAC;oBACP,6DAA6D;gBAC/D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CAAC,OAAwE;IAI/F,MAAM,UAAU,GAAgC,EAAE,CAAC;IACnD,MAAM,KAAK,GAA2B,EAAE,CAAC;IAEzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,SAAS;QACpD,IAAI,UAAU,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACrD,MAAM,SAAS,GAAG,MAA6B,CAAC;YAChD,IAAI,SAAS,CAAC,UAAU,KAAK,WAAW;gBAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrE,IAAI,SAAS,CAAC,UAAU,KAAK,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3D,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,MAAwD,CAAC;QAC3E,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACrF,KAAK,CAAC,IAAI,CAAC,MAA8B,CAAC,CAAC;YAC3C,SAAS;QACX,CAAC;QACD,IAAI,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvC,UAAU,CAAC,IAAI,CAAC,MAAmC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC/B,CAAC;AAED,SAAS,cAAc,CACrB,UAAkB,EAClB,QAAgB,EAChB,aAAqB,EACrB,KAAa,EACb,OAAgC,EAChC,YAAgC;IAEhC,OAAO;QACL,QAAQ,EAAE,oBAAoB;QAC9B,UAAU;QACV,QAAQ;QACR,KAAK;QACL,aAAa;QACb,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,OAAe,EAAE,SAAkD;IACpG,OAAO;QACL,IAAI;QACJ,OAAO;QACP,WAAW,EAAE,iBAAiB;QAC9B,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,KAAc;IAC1B,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;AACtC,CAAC;AAED,SAAS,YAAY,CAAC,KAAuC;IAC3D,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;SAC/C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,MAA8B,EAC9B,WAAmB,EACnB,SAAiB;IAEjB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;YACnB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAY,CAAC;QACnD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,aAAa,GAAI,MAAsC,CAAC,aAAa,CAAC;QAC5E,OAAO,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;YAClE,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,MAAwD;IACzE,OAAQ,MAAiC,CAAC,QAAQ,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAS,UAAU,CAAC,MAAgC,EAAE,MAAgC;IACpF,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;IACjC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;IACjC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-auxiliary-files.test.d.ts","sourceRoot":"","sources":["../src/emit-auxiliary-files.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
import { emitRedditAuxiliaryFiles } from './emit-auxiliary-files.js';
|
|
4
|
+
import { redditPostByIdAliasPath, redditPostsIndexPath, redditSubredditPostsIndexPath, redditSubredditsIndexPath, } from './path-mapper.js';
|
|
5
|
+
function createClient(initialFiles = {}) {
|
|
6
|
+
const files = new Map(Object.entries(initialFiles));
|
|
7
|
+
return {
|
|
8
|
+
writes: [],
|
|
9
|
+
deletes: [],
|
|
10
|
+
files,
|
|
11
|
+
async writeFile(input) {
|
|
12
|
+
this.writes.push(input);
|
|
13
|
+
this.files.set(input.path, input.content);
|
|
14
|
+
return { created: true };
|
|
15
|
+
},
|
|
16
|
+
async deleteFile(input) {
|
|
17
|
+
this.deletes.push(input);
|
|
18
|
+
this.files.delete(input.path);
|
|
19
|
+
},
|
|
20
|
+
async readFile(input) {
|
|
21
|
+
const content = this.files.get(input.path);
|
|
22
|
+
return content === undefined ? null : { content };
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
test('subreddit tombstones normalize r/ prefix when deleting aliases and index rows', async () => {
|
|
27
|
+
const client = createClient({
|
|
28
|
+
[redditSubredditsIndexPath()]: JSON.stringify([
|
|
29
|
+
{
|
|
30
|
+
id: 'agentrelay',
|
|
31
|
+
title: 'Agent Relay',
|
|
32
|
+
updated: '2026-05-29T00:00:00.000Z',
|
|
33
|
+
},
|
|
34
|
+
]),
|
|
35
|
+
});
|
|
36
|
+
const tombstone = {
|
|
37
|
+
id: 'r/AgentRelay',
|
|
38
|
+
_deleted: true,
|
|
39
|
+
objectType: 'subreddit',
|
|
40
|
+
};
|
|
41
|
+
const result = await emitRedditAuxiliaryFiles(client, {
|
|
42
|
+
workspaceId: 'ws-1',
|
|
43
|
+
subreddits: [tombstone],
|
|
44
|
+
});
|
|
45
|
+
assert.deepEqual(result.errors, []);
|
|
46
|
+
assert.ok(client.deletes.some((entry) => entry.path === '/reddit/subreddits/agentrelay.json'));
|
|
47
|
+
assert.ok(client.deletes.some((entry) => entry.path === '/reddit/subreddits/by-id/agentrelay.json'));
|
|
48
|
+
const indexContent = client.files.get(redditSubredditsIndexPath());
|
|
49
|
+
assert.ok(indexContent, 'subreddits index should be rewritten');
|
|
50
|
+
assert.deepEqual(JSON.parse(indexContent), []);
|
|
51
|
+
});
|
|
52
|
+
test('post tombstones delete canonical file path resolved from by-id alias payload', async () => {
|
|
53
|
+
const byIdAlias = redditPostByIdAliasPath('agentrelay', 'abc123');
|
|
54
|
+
const canonical = '/reddit/subreddits/agentrelay/posts/launch-week-recap__abc123.json';
|
|
55
|
+
const client = createClient({
|
|
56
|
+
[byIdAlias]: JSON.stringify({ canonicalPath: canonical }),
|
|
57
|
+
[redditPostsIndexPath()]: JSON.stringify([
|
|
58
|
+
{ id: 'agentrelay/abc123', title: 'Launch week recap', updated: '2026-05-29T00:00:00.000Z', subreddit: 'agentrelay' },
|
|
59
|
+
]),
|
|
60
|
+
[redditSubredditPostsIndexPath('agentrelay')]: JSON.stringify([
|
|
61
|
+
{ id: 'agentrelay/abc123', title: 'Launch week recap', updated: '2026-05-29T00:00:00.000Z', subreddit: 'agentrelay' },
|
|
62
|
+
]),
|
|
63
|
+
});
|
|
64
|
+
const result = await emitRedditAuxiliaryFiles(client, {
|
|
65
|
+
workspaceId: 'ws-1',
|
|
66
|
+
posts: [{ id: 'agentrelay/abc123', _deleted: true, objectType: 'post' }],
|
|
67
|
+
});
|
|
68
|
+
assert.deepEqual(result.errors, []);
|
|
69
|
+
assert.ok(client.deletes.some((entry) => entry.path === canonical));
|
|
70
|
+
assert.ok(client.deletes.some((entry) => entry.path === byIdAlias));
|
|
71
|
+
});
|
|
72
|
+
test('post tombstones accept unscoped ids when subreddit context is provided', async () => {
|
|
73
|
+
const byIdAlias = redditPostByIdAliasPath('agentrelay', 'abc123');
|
|
74
|
+
const canonical = '/reddit/subreddits/agentrelay/posts/hello-world__abc123.json';
|
|
75
|
+
const client = createClient({
|
|
76
|
+
[byIdAlias]: JSON.stringify({ canonicalPath: canonical }),
|
|
77
|
+
});
|
|
78
|
+
const result = await emitRedditAuxiliaryFiles(client, {
|
|
79
|
+
workspaceId: 'ws-1',
|
|
80
|
+
posts: [{ id: 'abc123', subreddit: 'r/AgentRelay', _deleted: true, objectType: 'post' }],
|
|
81
|
+
});
|
|
82
|
+
assert.deepEqual(result.errors, []);
|
|
83
|
+
assert.ok(client.deletes.some((entry) => entry.path === canonical));
|
|
84
|
+
assert.ok(client.deletes.some((entry) => entry.path === byIdAlias));
|
|
85
|
+
});
|
|
86
|
+
test('post upserts do not require scoped id format', async () => {
|
|
87
|
+
const client = createClient();
|
|
88
|
+
const result = await emitRedditAuxiliaryFiles(client, {
|
|
89
|
+
workspaceId: 'ws-1',
|
|
90
|
+
posts: [
|
|
91
|
+
{
|
|
92
|
+
id: 'abc123',
|
|
93
|
+
post_id: 'abc123',
|
|
94
|
+
subreddit: 'AgentRelay',
|
|
95
|
+
title: 'Hello world',
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
});
|
|
99
|
+
assert.deepEqual(result.errors, []);
|
|
100
|
+
assert.ok(client.writes.some((entry) => entry.path === '/reddit/subreddits/agentrelay/posts/hello-world__abc123.json'));
|
|
101
|
+
});
|
|
102
|
+
//# sourceMappingURL=emit-auxiliary-files.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit-auxiliary-files.test.js","sourceRoot":"","sources":["../src/emit-auxiliary-files.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { RedditPost, RedditPostIndexRow, RedditSubreddit, RedditSubredditIndexRow } from './types.js';
|
|
2
|
+
export declare function buildRedditRootIndexFile(): {
|
|
3
|
+
path: string;
|
|
4
|
+
contentType: string;
|
|
5
|
+
content: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function buildRedditSubredditsIndexFile(rows: readonly RedditSubredditIndexRow[]): {
|
|
8
|
+
path: string;
|
|
9
|
+
contentType: string;
|
|
10
|
+
content: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function buildRedditPostsIndexFile(rows: readonly RedditPostIndexRow[]): {
|
|
13
|
+
path: string;
|
|
14
|
+
contentType: string;
|
|
15
|
+
content: string;
|
|
16
|
+
};
|
|
17
|
+
export declare function buildRedditSubredditPostsIndexFile(subreddit: string, rows: readonly RedditPostIndexRow[]): {
|
|
18
|
+
path: string;
|
|
19
|
+
contentType: string;
|
|
20
|
+
content: string;
|
|
21
|
+
};
|
|
22
|
+
export declare function redditSubredditIndexRow(record: RedditSubreddit): RedditSubredditIndexRow;
|
|
23
|
+
export declare function redditPostIndexRow(record: RedditPost): RedditPostIndexRow;
|
|
24
|
+
export declare function redditSubredditTitle(record: RedditSubreddit): string;
|
|
25
|
+
export declare function redditPostTitle(record: RedditPost): string;
|
|
26
|
+
//# sourceMappingURL=index-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-emitter.d.ts","sourceRoot":"","sources":["../src/index-emitter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAgB3G,wBAAgB,wBAAwB;;;;EASvC;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,SAAS,uBAAuB,EAAE;;;;EAMtF;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,kBAAkB,EAAE;;;;EAM5E;AAED,wBAAgB,kCAAkC,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,kBAAkB,EAAE;;;;EAMxG;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,eAAe,GAAG,uBAAuB,CAaxF;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,kBAAkB,CAezE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAEpE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAE1D"}
|