@relayfile/adapter-reddit 0.1.0 → 0.1.1

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 (53) hide show
  1. package/dist/digest.d.ts +4 -0
  2. package/dist/digest.d.ts.map +1 -0
  3. package/dist/digest.js +47 -0
  4. package/dist/digest.js.map +1 -0
  5. package/dist/digest.test.d.ts +2 -0
  6. package/dist/digest.test.d.ts.map +1 -0
  7. package/dist/digest.test.js +65 -0
  8. package/dist/digest.test.js.map +1 -0
  9. package/dist/emit-auxiliary-files.d.ts +20 -0
  10. package/dist/emit-auxiliary-files.d.ts.map +1 -0
  11. package/dist/emit-auxiliary-files.js +298 -0
  12. package/dist/emit-auxiliary-files.js.map +1 -0
  13. package/dist/emit-auxiliary-files.test.d.ts +2 -0
  14. package/dist/emit-auxiliary-files.test.d.ts.map +1 -0
  15. package/dist/emit-auxiliary-files.test.js +102 -0
  16. package/dist/emit-auxiliary-files.test.js.map +1 -0
  17. package/dist/index-emitter.d.ts +26 -0
  18. package/dist/index-emitter.d.ts.map +1 -0
  19. package/dist/index-emitter.js +79 -0
  20. package/dist/index-emitter.js.map +1 -0
  21. package/dist/index-emitter.test.d.ts +2 -0
  22. package/dist/index-emitter.test.d.ts.map +1 -0
  23. package/dist/index-emitter.test.js +25 -0
  24. package/dist/index-emitter.test.js.map +1 -0
  25. package/dist/index.d.ts +8 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +7 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/layout-prompt.d.ts +7 -0
  30. package/dist/layout-prompt.d.ts.map +1 -0
  31. package/dist/layout-prompt.js +39 -0
  32. package/dist/layout-prompt.js.map +1 -0
  33. package/dist/layout-prompt.test.d.ts +2 -0
  34. package/dist/layout-prompt.test.d.ts.map +1 -0
  35. package/dist/layout-prompt.test.js +11 -0
  36. package/dist/layout-prompt.test.js.map +1 -0
  37. package/dist/path-mapper.d.ts +25 -0
  38. package/dist/path-mapper.d.ts.map +1 -0
  39. package/dist/path-mapper.js +112 -0
  40. package/dist/path-mapper.js.map +1 -0
  41. package/dist/path-mapper.test.d.ts +2 -0
  42. package/dist/path-mapper.test.d.ts.map +1 -0
  43. package/dist/path-mapper.test.js +18 -0
  44. package/dist/path-mapper.test.js.map +1 -0
  45. package/dist/resources.d.ts +27 -0
  46. package/dist/resources.d.ts.map +1 -0
  47. package/dist/resources.js +23 -0
  48. package/dist/resources.js.map +1 -0
  49. package/dist/types.d.ts +55 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +2 -0
  52. package/dist/types.js.map +1 -0
  53. package/package.json +2 -2
@@ -0,0 +1,79 @@
1
+ import { redditPostsIndexPath, redditRootIndexPath, redditSubredditPostsIndexPath, redditSubredditsIndexPath, } from './path-mapper.js';
2
+ function json(content) {
3
+ return `${JSON.stringify(content)}\n`;
4
+ }
5
+ function sortRows(rows) {
6
+ return [...rows].sort((a, b) => {
7
+ const left = Date.parse(a.updated ?? '');
8
+ const right = Date.parse(b.updated ?? '');
9
+ const leftValue = Number.isFinite(left) ? left : Number.NEGATIVE_INFINITY;
10
+ const rightValue = Number.isFinite(right) ? right : Number.NEGATIVE_INFINITY;
11
+ return rightValue - leftValue || a.id.localeCompare(b.id);
12
+ });
13
+ }
14
+ export function buildRedditRootIndexFile() {
15
+ return {
16
+ path: redditRootIndexPath(),
17
+ contentType: 'application/json; charset=utf-8',
18
+ content: json([
19
+ { id: 'subreddits', path: '/reddit/subreddits' },
20
+ { id: 'posts', path: '/reddit/posts' },
21
+ ]),
22
+ };
23
+ }
24
+ export function buildRedditSubredditsIndexFile(rows) {
25
+ return {
26
+ path: redditSubredditsIndexPath(),
27
+ contentType: 'application/json; charset=utf-8',
28
+ content: json(sortRows(rows)),
29
+ };
30
+ }
31
+ export function buildRedditPostsIndexFile(rows) {
32
+ return {
33
+ path: redditPostsIndexPath(),
34
+ contentType: 'application/json; charset=utf-8',
35
+ content: json(sortRows(rows)),
36
+ };
37
+ }
38
+ export function buildRedditSubredditPostsIndexFile(subreddit, rows) {
39
+ return {
40
+ path: redditSubredditPostsIndexPath(subreddit),
41
+ contentType: 'application/json; charset=utf-8',
42
+ content: json(sortRows(rows)),
43
+ };
44
+ }
45
+ export function redditSubredditIndexRow(record) {
46
+ const createdUtc = typeof record.created_utc === 'number' && Number.isFinite(record.created_utc)
47
+ ? record.created_utc
48
+ : undefined;
49
+ return {
50
+ id: record.name,
51
+ title: record.title ?? record.display_name_prefixed ?? record.name,
52
+ updated: createdUtc !== undefined
53
+ ? new Date(createdUtc * 1000).toISOString()
54
+ : new Date().toISOString(),
55
+ ...(typeof record.subscribers === 'number' ? { subscribers: record.subscribers } : {}),
56
+ };
57
+ }
58
+ export function redditPostIndexRow(record) {
59
+ const createdUtc = typeof record.created_utc === 'number' && Number.isFinite(record.created_utc)
60
+ ? record.created_utc
61
+ : undefined;
62
+ return {
63
+ id: record.id,
64
+ title: record.title,
65
+ updated: createdUtc !== undefined
66
+ ? new Date(createdUtc * 1000).toISOString()
67
+ : new Date().toISOString(),
68
+ subreddit: record.subreddit,
69
+ ...(typeof record.score === 'number' ? { score: record.score } : {}),
70
+ ...(record.status ? { status: record.status } : {}),
71
+ };
72
+ }
73
+ export function redditSubredditTitle(record) {
74
+ return record.title ?? record.display_name_prefixed ?? record.name;
75
+ }
76
+ export function redditPostTitle(record) {
77
+ return record.title;
78
+ }
79
+ //# sourceMappingURL=index-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-emitter.js","sourceRoot":"","sources":["../src/index-emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index-emitter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-emitter.test.d.ts","sourceRoot":"","sources":["../src/index-emitter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { buildRedditRootIndexFile, redditSubredditIndexRow } from './index-emitter.js';
4
+ test('buildRedditRootIndexFile uses canonical root path', () => {
5
+ const root = buildRedditRootIndexFile();
6
+ assert.equal(root.path, '/reddit/_index.json');
7
+ });
8
+ test('redditSubredditIndexRow uses deterministic timestamp from created_utc when available', () => {
9
+ const row = redditSubredditIndexRow({
10
+ id: 'agentrelay',
11
+ name: 'agentrelay',
12
+ title: 'Agent Relay',
13
+ created_utc: 1_700_000_000,
14
+ });
15
+ assert.equal(row.updated, '2023-11-14T22:13:20.000Z');
16
+ });
17
+ test('redditSubredditIndexRow falls back when created_utc is not finite', () => {
18
+ const row = redditSubredditIndexRow({
19
+ id: 'agentrelay',
20
+ name: 'agentrelay',
21
+ created_utc: Number.POSITIVE_INFINITY,
22
+ });
23
+ assert.match(row.updated, /^\d{4}-\d{2}-\d{2}T/);
24
+ });
25
+ //# sourceMappingURL=index-emitter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-emitter.test.js","sourceRoot":"","sources":["../src/index-emitter.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAEvF,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC7D,MAAM,IAAI,GAAG,wBAAwB,EAAE,CAAC;IACxC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sFAAsF,EAAE,GAAG,EAAE;IAChG,MAAM,GAAG,GAAG,uBAAuB,CAAC;QAClC,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,YAAY;QAClB,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,aAAa;KAC3B,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,0BAA0B,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,mEAAmE,EAAE,GAAG,EAAE;IAC7E,MAAM,GAAG,GAAG,uBAAuB,CAAC;QAClC,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,MAAM,CAAC,iBAAiB;KACtC,CAAC,CAAC;IACH,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from './digest.js';
2
+ export * from './emit-auxiliary-files.js';
3
+ export * from './index-emitter.js';
4
+ export * from './layout-prompt.js';
5
+ export * from './path-mapper.js';
6
+ export * from './resources.js';
7
+ export type * from './types.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,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,mBAAmB,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export * from './digest.js';
2
+ export * from './emit-auxiliary-files.js';
3
+ export * from './index-emitter.js';
4
+ export * from './layout-prompt.js';
5
+ export * from './path-mapper.js';
6
+ export * from './resources.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const REDDIT_LAYOUT_PROMPT = "# Reddit Mount Layout\n\nCanonical records are JSON files under `/reddit`.\n\n## Tree\n\n- `/reddit/LAYOUT.md`\n- `/reddit/_index.json`\n- `/reddit/subreddits/_index.json`\n- `/reddit/subreddits/<subreddit>.json`\n- `/reddit/subreddits/by-id/<subreddit>.json`\n- `/reddit/subreddits/<subreddit>/posts/_index.json`\n- `/reddit/subreddits/<subreddit>/posts/<title>__<postId>.json`\n- `/reddit/posts/_index.json`\n- `/reddit/posts/by-id/<subreddit>__<postId>.json`\n- `/reddit/posts/by-status/<status>/<subreddit>__<postId>.json`\n\n## Discovery\n\nRead discovery schemas before writeback:\n\n- `discovery/reddit/subreddits/.schema.json`\n- `discovery/reddit/subreddits/{subreddit}/posts/.schema.json`\n\nEach schema has a sibling `.create.example.json` file.\n\n## Notes\n\nTerminal states (`archived`, `locked`, `removed`, `deleted`) stay readable on canonical post records. Treat terminal states as updates, not deletions.\n";
2
+ export declare function redditLayoutPromptFile(): {
3
+ path: string;
4
+ contentType: "text/markdown; charset=utf-8";
5
+ content: string;
6
+ };
7
+ //# sourceMappingURL=layout-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-prompt.d.ts","sourceRoot":"","sources":["../src/layout-prompt.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,i6BA6BhC,CAAC;AAEF,wBAAgB,sBAAsB;;;;EAMrC"}
@@ -0,0 +1,39 @@
1
+ import { redditLayoutPath } from './path-mapper.js';
2
+ export const REDDIT_LAYOUT_PROMPT = `# Reddit Mount Layout
3
+
4
+ Canonical records are JSON files under \`/reddit\`.
5
+
6
+ ## Tree
7
+
8
+ - \`/reddit/LAYOUT.md\`
9
+ - \`/reddit/_index.json\`
10
+ - \`/reddit/subreddits/_index.json\`
11
+ - \`/reddit/subreddits/<subreddit>.json\`
12
+ - \`/reddit/subreddits/by-id/<subreddit>.json\`
13
+ - \`/reddit/subreddits/<subreddit>/posts/_index.json\`
14
+ - \`/reddit/subreddits/<subreddit>/posts/<title>__<postId>.json\`
15
+ - \`/reddit/posts/_index.json\`
16
+ - \`/reddit/posts/by-id/<subreddit>__<postId>.json\`
17
+ - \`/reddit/posts/by-status/<status>/<subreddit>__<postId>.json\`
18
+
19
+ ## Discovery
20
+
21
+ Read discovery schemas before writeback:
22
+
23
+ - \`discovery/reddit/subreddits/.schema.json\`
24
+ - \`discovery/reddit/subreddits/{subreddit}/posts/.schema.json\`
25
+
26
+ Each schema has a sibling \`.create.example.json\` file.
27
+
28
+ ## Notes
29
+
30
+ Terminal states (\`archived\`, \`locked\`, \`removed\`, \`deleted\`) stay readable on canonical post records. Treat terminal states as updates, not deletions.
31
+ `;
32
+ export function redditLayoutPromptFile() {
33
+ return {
34
+ path: redditLayoutPath(),
35
+ contentType: 'text/markdown; charset=utf-8',
36
+ content: REDDIT_LAYOUT_PROMPT.endsWith('\n') ? REDDIT_LAYOUT_PROMPT : `${REDDIT_LAYOUT_PROMPT}\n`,
37
+ };
38
+ }
39
+ //# sourceMappingURL=layout-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-prompt.js","sourceRoot":"","sources":["../src/layout-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BnC,CAAC;AAEF,MAAM,UAAU,sBAAsB;IACpC,OAAO;QACL,IAAI,EAAE,gBAAgB,EAAE;QACxB,WAAW,EAAE,8BAAuC;QACpD,OAAO,EAAE,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,oBAAoB,IAAI;KAClG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=layout-prompt.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-prompt.test.d.ts","sourceRoot":"","sources":["../src/layout-prompt.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { REDDIT_LAYOUT_PROMPT, redditLayoutPromptFile } from './layout-prompt.js';
4
+ test('redditLayoutPromptFile emits non-empty prompt content', () => {
5
+ const file = redditLayoutPromptFile();
6
+ assert.equal(file.path, '/reddit/LAYOUT.md');
7
+ assert.ok(file.content.length > 100);
8
+ assert.ok(file.content.includes('Reddit Mount Layout'));
9
+ assert.ok(file.content.includes(REDDIT_LAYOUT_PROMPT.trim().slice(0, 20)));
10
+ });
11
+ //# sourceMappingURL=layout-prompt.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-prompt.test.js","sourceRoot":"","sources":["../src/layout-prompt.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAElF,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACjE,MAAM,IAAI,GAAG,sBAAsB,EAAE,CAAC;IACtC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAC7C,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACxD,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ export declare const REDDIT_PATH_ROOT = "/reddit";
2
+ export type RedditPathObjectType = 'subreddit' | 'post';
3
+ export interface ComputeRedditPathInput {
4
+ subreddit?: string;
5
+ title?: string;
6
+ }
7
+ export declare function normalizeSubreddit(value: string): string;
8
+ export declare function redditLayoutPath(): string;
9
+ export declare function redditRootIndexPath(): string;
10
+ export declare function redditSubredditsIndexPath(): string;
11
+ export declare function redditPostsIndexPath(): string;
12
+ export declare function redditSubredditPostsIndexPath(subreddit: string): string;
13
+ export declare function redditSubredditPath(subreddit: string): string;
14
+ export declare function redditSubredditByIdAliasPath(subreddit: string): string;
15
+ export declare function redditPostPath(subreddit: string, postId: string, title?: string): string;
16
+ export declare function redditPostByIdAliasPath(subreddit: string, postId: string): string;
17
+ export declare function redditPostByStatusAliasPath(status: string, subreddit: string, postId: string): string;
18
+ export declare function normalizeNangoRedditModel(model: string): RedditPathObjectType;
19
+ export declare function computeRedditPath(objectType: RedditPathObjectType, id: string, input?: ComputeRedditPathInput): string;
20
+ export declare function computeRedditPathFromModel(model: string, id: string, input?: ComputeRedditPathInput): string;
21
+ export declare function parseRedditPostScopedId(id: string): {
22
+ subreddit: string;
23
+ postId: string;
24
+ };
25
+ //# 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":"AAAA,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAE1C,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,MAAM,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAUD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMxD;AAoDD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAGxF;AAED,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAErG;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,CAS7E;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,oBAAoB,EAChC,EAAE,EAAE,MAAM,EACV,KAAK,GAAE,sBAA2B,GACjC,MAAM,CAOR;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,KAAK,GAAE,sBAA2B,GACjC,MAAM,CAER;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAEzF"}
@@ -0,0 +1,112 @@
1
+ export const REDDIT_PATH_ROOT = '/reddit';
2
+ function encodeSegment(value) {
3
+ const trimmed = value.trim();
4
+ if (!trimmed) {
5
+ throw new Error('Reddit path segment must be non-empty');
6
+ }
7
+ return encodeURIComponent(trimmed);
8
+ }
9
+ export function normalizeSubreddit(value) {
10
+ const trimmed = value.trim().replace(/^r\//i, '').toLowerCase();
11
+ if (!trimmed) {
12
+ throw new Error('Reddit subreddit must be non-empty');
13
+ }
14
+ return trimmed;
15
+ }
16
+ function slugify(value) {
17
+ const ascii = value
18
+ .normalize('NFKD')
19
+ .replace(/[\u0300-\u036f]/g, '')
20
+ .replace(/[^\x00-\x7F]+/g, '');
21
+ const slug = ascii
22
+ .toLowerCase()
23
+ .replace(/[^a-z0-9]+/g, '-')
24
+ .replace(/^-+|-+$/g, '');
25
+ return slug || 'post';
26
+ }
27
+ function parseScopedPostId(id) {
28
+ const trimmed = id.trim();
29
+ const divider = trimmed.indexOf('/');
30
+ if (divider > 0) {
31
+ return {
32
+ subreddit: normalizeSubreddit(trimmed.slice(0, divider)),
33
+ postId: trimmed.slice(divider + 1).trim(),
34
+ };
35
+ }
36
+ throw new Error('Expected reddit post id in "subreddit/post_id" format');
37
+ }
38
+ function parsePostIdWithOptionalScope(id, fallbackSubreddit) {
39
+ const trimmed = id.trim();
40
+ if (!trimmed) {
41
+ throw new Error('Reddit post id must be non-empty');
42
+ }
43
+ const divider = trimmed.indexOf('/');
44
+ if (divider > 0) {
45
+ return {
46
+ subreddit: normalizeSubreddit(trimmed.slice(0, divider)),
47
+ postId: trimmed.slice(divider + 1).trim(),
48
+ };
49
+ }
50
+ if (fallbackSubreddit) {
51
+ return {
52
+ subreddit: normalizeSubreddit(fallbackSubreddit),
53
+ postId: trimmed,
54
+ };
55
+ }
56
+ throw new Error('Expected reddit post id in "subreddit/post_id" format when subreddit is not provided');
57
+ }
58
+ export function redditLayoutPath() {
59
+ return `${REDDIT_PATH_ROOT}/LAYOUT.md`;
60
+ }
61
+ export function redditRootIndexPath() {
62
+ return `${REDDIT_PATH_ROOT}/_index.json`;
63
+ }
64
+ export function redditSubredditsIndexPath() {
65
+ return `${REDDIT_PATH_ROOT}/subreddits/_index.json`;
66
+ }
67
+ export function redditPostsIndexPath() {
68
+ return `${REDDIT_PATH_ROOT}/posts/_index.json`;
69
+ }
70
+ export function redditSubredditPostsIndexPath(subreddit) {
71
+ return `${REDDIT_PATH_ROOT}/subreddits/${encodeSegment(normalizeSubreddit(subreddit))}/posts/_index.json`;
72
+ }
73
+ export function redditSubredditPath(subreddit) {
74
+ return `${REDDIT_PATH_ROOT}/subreddits/${encodeSegment(normalizeSubreddit(subreddit))}.json`;
75
+ }
76
+ export function redditSubredditByIdAliasPath(subreddit) {
77
+ return `${REDDIT_PATH_ROOT}/subreddits/by-id/${encodeSegment(normalizeSubreddit(subreddit))}.json`;
78
+ }
79
+ export function redditPostPath(subreddit, postId, title) {
80
+ const slug = title ? `${slugify(title)}__` : '';
81
+ return `${REDDIT_PATH_ROOT}/subreddits/${encodeSegment(normalizeSubreddit(subreddit))}/posts/${slug}${encodeSegment(postId)}.json`;
82
+ }
83
+ export function redditPostByIdAliasPath(subreddit, postId) {
84
+ return `${REDDIT_PATH_ROOT}/posts/by-id/${encodeSegment(normalizeSubreddit(subreddit))}__${encodeSegment(postId)}.json`;
85
+ }
86
+ export function redditPostByStatusAliasPath(status, subreddit, postId) {
87
+ return `${REDDIT_PATH_ROOT}/posts/by-status/${encodeSegment(status.toLowerCase())}/${encodeSegment(normalizeSubreddit(subreddit))}__${encodeSegment(postId)}.json`;
88
+ }
89
+ export function normalizeNangoRedditModel(model) {
90
+ const normalized = model.trim().toLowerCase();
91
+ if (normalized === 'reddittrackedsubreddit' || normalized === 'subreddit') {
92
+ return 'subreddit';
93
+ }
94
+ if (normalized === 'redditpost' || normalized === 'post') {
95
+ return 'post';
96
+ }
97
+ throw new Error(`Unsupported reddit model: ${model}`);
98
+ }
99
+ export function computeRedditPath(objectType, id, input = {}) {
100
+ if (objectType === 'subreddit') {
101
+ return redditSubredditPath(id);
102
+ }
103
+ const scoped = parsePostIdWithOptionalScope(id, input.subreddit);
104
+ return redditPostPath(scoped.subreddit, scoped.postId, input.title);
105
+ }
106
+ export function computeRedditPathFromModel(model, id, input = {}) {
107
+ return computeRedditPath(normalizeNangoRedditModel(model), id, input);
108
+ }
109
+ export function parseRedditPostScopedId(id) {
110
+ return parseScopedPostId(id);
111
+ }
112
+ //# 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=path-mapper.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-mapper.test.d.ts","sourceRoot":"","sources":["../src/path-mapper.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { computeRedditPathFromModel, parseRedditPostScopedId, redditRootIndexPath, } from './path-mapper.js';
4
+ test('computeRedditPathFromModel supports unscoped post ids when subreddit is provided', () => {
5
+ const path = computeRedditPathFromModel('redditpost', 'abc123', { subreddit: 'r/AI' });
6
+ assert.equal(path, '/reddit/subreddits/ai/posts/abc123.json');
7
+ });
8
+ test('computeRedditPathFromModel rejects unscoped post ids when subreddit is missing', () => {
9
+ assert.throws(() => computeRedditPathFromModel('redditpost', 'abc123'), /subreddit is not provided/);
10
+ });
11
+ test('parseRedditPostScopedId normalizes subreddit casing and prefix', () => {
12
+ const scoped = parseRedditPostScopedId('AgentRelay/abc123');
13
+ assert.deepEqual(scoped, { subreddit: 'agentrelay', postId: 'abc123' });
14
+ });
15
+ test('redditRootIndexPath is stable', () => {
16
+ assert.equal(redditRootIndexPath(), '/reddit/_index.json');
17
+ });
18
+ //# sourceMappingURL=path-mapper.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-mapper.test.js","sourceRoot":"","sources":["../src/path-mapper.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,IAAI,CAAC,kFAAkF,EAAE,GAAG,EAAE;IAC5F,MAAM,IAAI,GAAG,0BAA0B,CAAC,YAAY,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IACvF,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,yCAAyC,CAAC,CAAC;AAChE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gFAAgF,EAAE,GAAG,EAAE;IAC1F,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,0BAA0B,CAAC,YAAY,EAAE,QAAQ,CAAC,EACxD,2BAA2B,CAC5B,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;IAC1E,MAAM,MAAM,GAAG,uBAAuB,CAAC,mBAAmB,CAAC,CAAC;IAC5D,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC1E,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;IACzC,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,qBAAqB,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC"}
@@ -0,0 +1,27 @@
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
+ readonly sampleIndexPath?: string;
9
+ }
10
+ export declare const resources: readonly [{
11
+ readonly name: "subreddits";
12
+ readonly path: "/reddit/subreddits";
13
+ readonly pathPattern: RegExp;
14
+ readonly idPattern: RegExp;
15
+ readonly schema: "discovery/reddit/subreddits/.schema.json";
16
+ readonly createExample: "discovery/reddit/subreddits/.create.example.json";
17
+ }, {
18
+ readonly name: "posts";
19
+ readonly path: "/reddit/subreddits/{subreddit}/posts";
20
+ readonly sampleIndexPath: "/reddit/posts";
21
+ readonly pathPattern: RegExp;
22
+ readonly idPattern: RegExp;
23
+ readonly schema: "discovery/reddit/subreddits/{subreddit}/posts/.schema.json";
24
+ readonly createExample: "discovery/reddit/subreddits/{subreddit}/posts/.create.example.json";
25
+ }];
26
+ export declare function findResourceByPath(path: string): AdapterResourceConfig | undefined;
27
+ //# 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;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;EAkB+B,CAAC;AAEtD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAElF"}
@@ -0,0 +1,23 @@
1
+ export const resources = [
2
+ {
3
+ name: 'subreddits',
4
+ path: '/reddit/subreddits',
5
+ pathPattern: /^\/reddit\/subreddits\/(?!_index\.json$)[^/]+\.json$/,
6
+ idPattern: /^[A-Za-z0-9_][A-Za-z0-9_-]{1,63}$/,
7
+ schema: 'discovery/reddit/subreddits/.schema.json',
8
+ createExample: 'discovery/reddit/subreddits/.create.example.json',
9
+ },
10
+ {
11
+ name: 'posts',
12
+ path: '/reddit/subreddits/{subreddit}/posts',
13
+ sampleIndexPath: '/reddit/posts',
14
+ pathPattern: /^\/reddit\/subreddits\/[^/]+\/posts\/(?!_index\.json$)[^/]+\.json$/,
15
+ idPattern: /^[A-Za-z0-9_\/-]+$/,
16
+ schema: 'discovery/reddit/subreddits/{subreddit}/posts/.schema.json',
17
+ createExample: 'discovery/reddit/subreddits/{subreddit}/posts/.create.example.json',
18
+ },
19
+ ];
20
+ export function findResourceByPath(path) {
21
+ return resources.find((resource) => resource.pathPattern.test(path));
22
+ }
23
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../src/resources.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB;QACE,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,sDAAsD;QACnE,SAAS,EAAE,mCAAmC;QAC9C,MAAM,EAAE,0CAA0C;QAClD,aAAa,EAAE,kDAAkD;KAClE;IACD;QACE,IAAI,EAAE,OAAO;QACb,IAAI,EAAE,sCAAsC;QAC5C,eAAe,EAAE,eAAe;QAChC,WAAW,EAAE,oEAAoE;QACjF,SAAS,EAAE,oBAAoB;QAC/B,MAAM,EAAE,4DAA4D;QACpE,aAAa,EAAE,oEAAoE;KACpF;CACkD,CAAC;AAEtD,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,55 @@
1
+ export interface RedditSubreddit {
2
+ id: string;
3
+ name: string;
4
+ title?: string;
5
+ display_name_prefixed?: string;
6
+ url?: string;
7
+ public_description?: string;
8
+ subscribers?: number;
9
+ over18?: boolean;
10
+ created_utc?: number;
11
+ icon_img?: string;
12
+ tracked?: boolean;
13
+ [key: string]: unknown;
14
+ }
15
+ export interface RedditPost {
16
+ id: string;
17
+ post_id: string;
18
+ thing_id?: string;
19
+ subreddit: string;
20
+ subreddit_name_prefixed?: string;
21
+ title: string;
22
+ author?: string;
23
+ selftext?: string;
24
+ url?: string;
25
+ permalink?: string;
26
+ created_utc?: number;
27
+ edited?: boolean | number;
28
+ score?: number;
29
+ ups?: number;
30
+ downs?: number;
31
+ num_comments?: number;
32
+ over_18?: boolean;
33
+ spoiler?: boolean;
34
+ stickied?: boolean;
35
+ locked?: boolean;
36
+ archived?: boolean;
37
+ removed_by_category?: string | null;
38
+ status?: 'active' | 'locked' | 'archived' | 'removed' | 'deleted';
39
+ [key: string]: unknown;
40
+ }
41
+ export interface RedditSubredditIndexRow {
42
+ id: string;
43
+ title: string;
44
+ updated: string;
45
+ subscribers?: number;
46
+ }
47
+ export interface RedditPostIndexRow {
48
+ id: string;
49
+ title: string;
50
+ updated: string;
51
+ subreddit: string;
52
+ score?: number;
53
+ status?: string;
54
+ }
55
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;IAClE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@relayfile/adapter-reddit",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Reddit adapter package for Relayfile",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -54,7 +54,7 @@
54
54
  "directory": "packages/reddit"
55
55
  },
56
56
  "dependencies": {
57
- "@relayfile/adapter-core": "^0.3.24"
57
+ "@relayfile/adapter-core": "^0.3.25"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "@relayfile/sdk": ">=0.6.0 <1"