@geoly-ai/social-hub-core 0.0.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.
- package/dist/account-graph-risk.d.ts +18 -0
- package/dist/account-graph-risk.d.ts.map +1 -0
- package/dist/account-graph-risk.js +71 -0
- package/dist/account-graph-risk.js.map +1 -0
- package/dist/account-graph-risk.test.d.ts +2 -0
- package/dist/account-graph-risk.test.d.ts.map +1 -0
- package/dist/account-graph-risk.test.js +57 -0
- package/dist/account-graph-risk.test.js.map +1 -0
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +29 -0
- package/dist/errors.js.map +1 -0
- package/dist/graph-domain.d.ts +9 -0
- package/dist/graph-domain.d.ts.map +1 -0
- package/dist/graph-domain.js +55 -0
- package/dist/graph-domain.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/reddit-topic-taxonomy.d.ts +12 -0
- package/dist/reddit-topic-taxonomy.d.ts.map +1 -0
- package/dist/reddit-topic-taxonomy.js +279 -0
- package/dist/reddit-topic-taxonomy.js.map +1 -0
- package/dist/reddit-topic-taxonomy.test.d.ts +2 -0
- package/dist/reddit-topic-taxonomy.test.d.ts.map +1 -0
- package/dist/reddit-topic-taxonomy.test.js +59 -0
- package/dist/reddit-topic-taxonomy.test.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Known account-graph edge types persisted in DB / UI. */
|
|
2
|
+
export declare const ACCOUNT_GRAPH_KNOWN_EDGE_TYPES: readonly ["interacted_with", "co_posted", "same_operator", "similar_content", "follows"];
|
|
3
|
+
export type AccountGraphKnownEdgeType = (typeof ACCOUNT_GRAPH_KNOWN_EDGE_TYPES)[number];
|
|
4
|
+
export type AccountGraphRiskTier = "high" | "medium" | "low" | "unknown";
|
|
5
|
+
/** Query filter: include edges whose tier is at least this level (high > medium > low). */
|
|
6
|
+
export declare const ACCOUNT_GRAPH_MIN_RISK_TIERS: readonly ["high", "medium", "low"];
|
|
7
|
+
export type AccountGraphMinRiskTier = (typeof ACCOUNT_GRAPH_MIN_RISK_TIERS)[number];
|
|
8
|
+
export declare function accountGraphEdgeTypeToRiskTier(edgeType: string): AccountGraphRiskTier;
|
|
9
|
+
export declare function accountGraphRiskTierLabelZh(tier: AccountGraphRiskTier): string;
|
|
10
|
+
export declare function accountGraphEdgeTypesForMinRisk(min: AccountGraphMinRiskTier): AccountGraphKnownEdgeType[];
|
|
11
|
+
/** For drilldown: `InteractionEvent.type` filter in listInteractionEvents. */
|
|
12
|
+
export declare function accountGraphDrilldownEventTypeForEdge(edgeType: string): string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Worker: infer graph edge type from interaction event type string
|
|
15
|
+
* (OpenClaw / pipeline event names).
|
|
16
|
+
*/
|
|
17
|
+
export declare function deriveAccountGraphEdgeTypeFromInteractionEventType(eventType: string): "interacted_with" | "co_posted";
|
|
18
|
+
//# sourceMappingURL=account-graph-risk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-graph-risk.d.ts","sourceRoot":"","sources":["../src/account-graph-risk.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,8BAA8B,0FAMjC,CAAC;AAEX,MAAM,MAAM,yBAAyB,GACnC,CAAC,OAAO,8BAA8B,CAAC,CAAC,MAAM,CAAC,CAAC;AAElD,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAEzE,2FAA2F;AAC3F,eAAO,MAAM,4BAA4B,oCAAqC,CAAC;AAC/E,MAAM,MAAM,uBAAuB,GACjC,CAAC,OAAO,4BAA4B,CAAC,CAAC,MAAM,CAAC,CAAC;AAShD,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,GACf,oBAAoB,CAatB;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAW9E;AAED,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,uBAAuB,GAC3B,yBAAyB,EAAE,CAM7B;AAED,8EAA8E;AAC9E,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,MAAM,GACf,MAAM,GAAG,SAAS,CAepB;AAED;;;GAGG;AACH,wBAAgB,kDAAkD,CAChE,SAAS,EAAE,MAAM,GAChB,iBAAiB,GAAG,WAAW,CAEjC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/** Known account-graph edge types persisted in DB / UI. */
|
|
2
|
+
export const ACCOUNT_GRAPH_KNOWN_EDGE_TYPES = [
|
|
3
|
+
"interacted_with",
|
|
4
|
+
"co_posted",
|
|
5
|
+
"same_operator",
|
|
6
|
+
"similar_content",
|
|
7
|
+
"follows",
|
|
8
|
+
];
|
|
9
|
+
/** Query filter: include edges whose tier is at least this level (high > medium > low). */
|
|
10
|
+
export const ACCOUNT_GRAPH_MIN_RISK_TIERS = ["high", "medium", "low"];
|
|
11
|
+
const RISK_ORDER = {
|
|
12
|
+
high: 3,
|
|
13
|
+
medium: 2,
|
|
14
|
+
low: 1,
|
|
15
|
+
unknown: 0,
|
|
16
|
+
};
|
|
17
|
+
export function accountGraphEdgeTypeToRiskTier(edgeType) {
|
|
18
|
+
switch (edgeType) {
|
|
19
|
+
case "same_operator":
|
|
20
|
+
return "high";
|
|
21
|
+
case "interacted_with":
|
|
22
|
+
case "co_posted":
|
|
23
|
+
case "similar_content":
|
|
24
|
+
return "medium";
|
|
25
|
+
case "follows":
|
|
26
|
+
return "low";
|
|
27
|
+
default:
|
|
28
|
+
return "unknown";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function accountGraphRiskTierLabelZh(tier) {
|
|
32
|
+
switch (tier) {
|
|
33
|
+
case "high":
|
|
34
|
+
return "高风险";
|
|
35
|
+
case "medium":
|
|
36
|
+
return "中风险";
|
|
37
|
+
case "low":
|
|
38
|
+
return "低风险";
|
|
39
|
+
default:
|
|
40
|
+
return "未知";
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function accountGraphEdgeTypesForMinRisk(min) {
|
|
44
|
+
const minOrder = min === "high" ? 3 : min === "medium" ? 2 : 1;
|
|
45
|
+
return ACCOUNT_GRAPH_KNOWN_EDGE_TYPES.filter((et) => RISK_ORDER[accountGraphEdgeTypeToRiskTier(et)] >= minOrder);
|
|
46
|
+
}
|
|
47
|
+
/** For drilldown: `InteractionEvent.type` filter in listInteractionEvents. */
|
|
48
|
+
export function accountGraphDrilldownEventTypeForEdge(edgeType) {
|
|
49
|
+
switch (edgeType) {
|
|
50
|
+
case "interacted_with":
|
|
51
|
+
return "comment";
|
|
52
|
+
case "co_posted":
|
|
53
|
+
return "post";
|
|
54
|
+
case "similar_content":
|
|
55
|
+
return "content_similarity";
|
|
56
|
+
case "same_operator":
|
|
57
|
+
return "operator_link";
|
|
58
|
+
case "follows":
|
|
59
|
+
return "follow";
|
|
60
|
+
default:
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Worker: infer graph edge type from interaction event type string
|
|
66
|
+
* (OpenClaw / pipeline event names).
|
|
67
|
+
*/
|
|
68
|
+
export function deriveAccountGraphEdgeTypeFromInteractionEventType(eventType) {
|
|
69
|
+
return eventType.toLowerCase().includes("post") ? "co_posted" : "interacted_with";
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=account-graph-risk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-graph-risk.js","sourceRoot":"","sources":["../src/account-graph-risk.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,iBAAiB;IACjB,WAAW;IACX,eAAe;IACf,iBAAiB;IACjB,SAAS;CACD,CAAC;AAOX,2FAA2F;AAC3F,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAU,CAAC;AAI/E,MAAM,UAAU,GAAyC;IACvD,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,GAAG,EAAE,CAAC;IACN,OAAO,EAAE,CAAC;CACX,CAAC;AAEF,MAAM,UAAU,8BAA8B,CAC5C,QAAgB;IAEhB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,eAAe;YAClB,OAAO,MAAM,CAAC;QAChB,KAAK,iBAAiB,CAAC;QACvB,KAAK,WAAW,CAAC;QACjB,KAAK,iBAAiB;YACpB,OAAO,QAAQ,CAAC;QAClB,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC;QACf;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAA0B;IACpE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC;QACf,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,GAA4B;IAE5B,MAAM,QAAQ,GAAG,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO,8BAA8B,CAAC,MAAM,CAC1C,CAAC,EAAE,EAAE,EAAE,CACL,UAAU,CAAC,8BAA8B,CAAC,EAAE,CAAC,CAAC,IAAI,QAAQ,CAC7D,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,qCAAqC,CACnD,QAAgB;IAEhB,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,iBAAiB;YACpB,OAAO,SAAS,CAAC;QACnB,KAAK,WAAW;YACd,OAAO,MAAM,CAAC;QAChB,KAAK,iBAAiB;YACpB,OAAO,oBAAoB,CAAC;QAC9B,KAAK,eAAe;YAClB,OAAO,eAAe,CAAC;QACzB,KAAK,SAAS;YACZ,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kDAAkD,CAChE,SAAiB;IAEjB,OAAO,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-graph-risk.test.d.ts","sourceRoot":"","sources":["../src/account-graph-risk.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { accountGraphDrilldownEventTypeForEdge, accountGraphEdgeTypeToRiskTier, accountGraphEdgeTypesForMinRisk, accountGraphRiskTierLabelZh, deriveAccountGraphEdgeTypeFromInteractionEventType, } from "./account-graph-risk.js";
|
|
3
|
+
describe("accountGraphEdgeTypeToRiskTier", () => {
|
|
4
|
+
it("maps known types", () => {
|
|
5
|
+
expect(accountGraphEdgeTypeToRiskTier("same_operator")).toBe("high");
|
|
6
|
+
expect(accountGraphEdgeTypeToRiskTier("interacted_with")).toBe("medium");
|
|
7
|
+
expect(accountGraphEdgeTypeToRiskTier("co_posted")).toBe("medium");
|
|
8
|
+
expect(accountGraphEdgeTypeToRiskTier("similar_content")).toBe("medium");
|
|
9
|
+
expect(accountGraphEdgeTypeToRiskTier("follows")).toBe("low");
|
|
10
|
+
});
|
|
11
|
+
it("returns unknown for custom strings", () => {
|
|
12
|
+
expect(accountGraphEdgeTypeToRiskTier("custom_edge")).toBe("unknown");
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
describe("accountGraphEdgeTypesForMinRisk", () => {
|
|
16
|
+
it("high: only same_operator", () => {
|
|
17
|
+
expect(accountGraphEdgeTypesForMinRisk("high")).toEqual(["same_operator"]);
|
|
18
|
+
});
|
|
19
|
+
it("medium: excludes follows", () => {
|
|
20
|
+
expect(accountGraphEdgeTypesForMinRisk("medium")).toEqual([
|
|
21
|
+
"interacted_with",
|
|
22
|
+
"co_posted",
|
|
23
|
+
"same_operator",
|
|
24
|
+
"similar_content",
|
|
25
|
+
]);
|
|
26
|
+
});
|
|
27
|
+
it("low: all known", () => {
|
|
28
|
+
expect(accountGraphEdgeTypesForMinRisk("low")).toEqual([
|
|
29
|
+
"interacted_with",
|
|
30
|
+
"co_posted",
|
|
31
|
+
"same_operator",
|
|
32
|
+
"similar_content",
|
|
33
|
+
"follows",
|
|
34
|
+
]);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("accountGraphDrilldownEventTypeForEdge", () => {
|
|
38
|
+
it("aligns with interaction event types", () => {
|
|
39
|
+
expect(accountGraphDrilldownEventTypeForEdge("interacted_with")).toBe("comment");
|
|
40
|
+
expect(accountGraphDrilldownEventTypeForEdge("co_posted")).toBe("post");
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe("deriveAccountGraphEdgeTypeFromInteractionEventType", () => {
|
|
44
|
+
it("uses co_posted when type mentions post", () => {
|
|
45
|
+
expect(deriveAccountGraphEdgeTypeFromInteractionEventType("post.created")).toBe("co_posted");
|
|
46
|
+
});
|
|
47
|
+
it("defaults to interacted_with", () => {
|
|
48
|
+
expect(deriveAccountGraphEdgeTypeFromInteractionEventType("comment")).toBe("interacted_with");
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe("accountGraphRiskTierLabelZh", () => {
|
|
52
|
+
it("returns labels", () => {
|
|
53
|
+
expect(accountGraphRiskTierLabelZh("high")).toBe("高风险");
|
|
54
|
+
expect(accountGraphRiskTierLabelZh("unknown")).toBe("未知");
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=account-graph-risk.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account-graph-risk.test.js","sourceRoot":"","sources":["../src/account-graph-risk.test.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** 与实现文档 §12 对齐 */
|
|
2
|
+
export declare class AppError extends Error {
|
|
3
|
+
readonly code: string;
|
|
4
|
+
readonly httpStatus: number;
|
|
5
|
+
readonly details?: unknown | undefined;
|
|
6
|
+
constructor(code: string, httpStatus: number, message: string, details?: unknown | undefined);
|
|
7
|
+
}
|
|
8
|
+
export declare function validationError(message: string, details?: unknown): AppError;
|
|
9
|
+
export declare function unauthorized(message?: string): AppError;
|
|
10
|
+
export declare function forbidden(message?: string): AppError;
|
|
11
|
+
export declare function notFound(message?: string): AppError;
|
|
12
|
+
export declare function internalError(message?: string): AppError;
|
|
13
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,qBAAa,QAAS,SAAQ,KAAK;aAEf,IAAI,EAAE,MAAM;aACZ,UAAU,EAAE,MAAM;aAElB,OAAO,CAAC,EAAE,OAAO;gBAHjB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClC,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,OAAO,YAAA;CAKpC;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,CAE5E;AAED,wBAAgB,YAAY,CAAC,OAAO,SAAiB,GAAG,QAAQ,CAE/D;AAED,wBAAgB,SAAS,CAAC,OAAO,SAAc,GAAG,QAAQ,CAEzD;AAED,wBAAgB,QAAQ,CAAC,OAAO,SAAc,GAAG,QAAQ,CAExD;AAED,wBAAgB,aAAa,CAAC,OAAO,SAAmB,GAAG,QAAQ,CAElE"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** 与实现文档 §12 对齐 */
|
|
2
|
+
export class AppError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
httpStatus;
|
|
5
|
+
details;
|
|
6
|
+
constructor(code, httpStatus, message, details) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.httpStatus = httpStatus;
|
|
10
|
+
this.details = details;
|
|
11
|
+
this.name = "AppError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function validationError(message, details) {
|
|
15
|
+
return new AppError("VALIDATION_ERROR", 400, message, details);
|
|
16
|
+
}
|
|
17
|
+
export function unauthorized(message = "Unauthorized") {
|
|
18
|
+
return new AppError("UNAUTHORIZED", 401, message);
|
|
19
|
+
}
|
|
20
|
+
export function forbidden(message = "Forbidden") {
|
|
21
|
+
return new AppError("FORBIDDEN", 403, message);
|
|
22
|
+
}
|
|
23
|
+
export function notFound(message = "Not found") {
|
|
24
|
+
return new AppError("NOT_FOUND", 404, message);
|
|
25
|
+
}
|
|
26
|
+
export function internalError(message = "Internal error") {
|
|
27
|
+
return new AppError("INTERNAL_ERROR", 500, message);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEf;IACA;IAEA;IAJlB,YACkB,IAAY,EACZ,UAAkB,EAClC,OAAe,EACC,OAAiB;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,SAAI,GAAJ,IAAI,CAAQ;QACZ,eAAU,GAAV,UAAU,CAAQ;QAElB,YAAO,GAAP,OAAO,CAAU;QAGjC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,OAAiB;IAChE,OAAO,IAAI,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAO,GAAG,cAAc;IACnD,OAAO,IAAI,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAO,GAAG,WAAW;IAC7C,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAO,GAAG,WAAW;IAC5C,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAO,GAAG,gBAAgB;IACtD,OAAO,IAAI,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const GRAPH_NODE_TYPES: readonly ["team", "brand", "campaign", "account", "persona", "subreddit", "industry", "strategy", "hypothesis", "topic", "asset", "execution_batch", "risk_event", "competitor_entity", "review"];
|
|
2
|
+
export type GraphNodeType = (typeof GRAPH_NODE_TYPES)[number];
|
|
3
|
+
export declare const GRAPH_EDGE_KINDS: readonly ["fact", "inferred", "aggregate", "policy"];
|
|
4
|
+
export type GraphEdgeKind = (typeof GRAPH_EDGE_KINDS)[number];
|
|
5
|
+
export declare const GRAPH_VISIBILITY_POLICIES: readonly ["internal_only", "client_visible", "aggregated_only", "redacted", "security_sensitive"];
|
|
6
|
+
export type GraphVisibilityPolicy = (typeof GRAPH_VISIBILITY_POLICIES)[number];
|
|
7
|
+
export declare const GRAPH_RELATION_TYPES: readonly ["owns_brand", "runs_campaign", "uses_account", "operates_as", "posts_in", "interacts_in", "belongs_to_industry", "serves_brand", "touches_industry", "strategy_targets", "strategy_uses_topic", "strategy_uses_asset", "hypothesis_validated_by", "batch_executes_strategy", "risk_event_affects", "blocked_job", "rejected_content", "interacted_with", "co_posted", "same_operator", "similar_content", "follows"];
|
|
8
|
+
export type GraphRelationType = (typeof GRAPH_RELATION_TYPES)[number];
|
|
9
|
+
//# sourceMappingURL=graph-domain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-domain.d.ts","sourceRoot":"","sources":["../src/graph-domain.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,mMAgBnB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,gBAAgB,sDAKnB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,eAAO,MAAM,yBAAyB,mGAM5B,CAAC;AAEX,MAAM,MAAM,qBAAqB,GAC/B,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7C,eAAO,MAAM,oBAAoB,gaAuBvB,CAAC;AAEX,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export const GRAPH_NODE_TYPES = [
|
|
2
|
+
"team",
|
|
3
|
+
"brand",
|
|
4
|
+
"campaign",
|
|
5
|
+
"account",
|
|
6
|
+
"persona",
|
|
7
|
+
"subreddit",
|
|
8
|
+
"industry",
|
|
9
|
+
"strategy",
|
|
10
|
+
"hypothesis",
|
|
11
|
+
"topic",
|
|
12
|
+
"asset",
|
|
13
|
+
"execution_batch",
|
|
14
|
+
"risk_event",
|
|
15
|
+
"competitor_entity",
|
|
16
|
+
"review",
|
|
17
|
+
];
|
|
18
|
+
export const GRAPH_EDGE_KINDS = [
|
|
19
|
+
"fact",
|
|
20
|
+
"inferred",
|
|
21
|
+
"aggregate",
|
|
22
|
+
"policy",
|
|
23
|
+
];
|
|
24
|
+
export const GRAPH_VISIBILITY_POLICIES = [
|
|
25
|
+
"internal_only",
|
|
26
|
+
"client_visible",
|
|
27
|
+
"aggregated_only",
|
|
28
|
+
"redacted",
|
|
29
|
+
"security_sensitive",
|
|
30
|
+
];
|
|
31
|
+
export const GRAPH_RELATION_TYPES = [
|
|
32
|
+
"owns_brand",
|
|
33
|
+
"runs_campaign",
|
|
34
|
+
"uses_account",
|
|
35
|
+
"operates_as",
|
|
36
|
+
"posts_in",
|
|
37
|
+
"interacts_in",
|
|
38
|
+
"belongs_to_industry",
|
|
39
|
+
"serves_brand",
|
|
40
|
+
"touches_industry",
|
|
41
|
+
"strategy_targets",
|
|
42
|
+
"strategy_uses_topic",
|
|
43
|
+
"strategy_uses_asset",
|
|
44
|
+
"hypothesis_validated_by",
|
|
45
|
+
"batch_executes_strategy",
|
|
46
|
+
"risk_event_affects",
|
|
47
|
+
"blocked_job",
|
|
48
|
+
"rejected_content",
|
|
49
|
+
"interacted_with",
|
|
50
|
+
"co_posted",
|
|
51
|
+
"same_operator",
|
|
52
|
+
"similar_content",
|
|
53
|
+
"follows",
|
|
54
|
+
];
|
|
55
|
+
//# sourceMappingURL=graph-domain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-domain.js","sourceRoot":"","sources":["../src/graph-domain.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,OAAO;IACP,UAAU;IACV,SAAS;IACT,SAAS;IACT,WAAW;IACX,UAAU;IACV,UAAU;IACV,YAAY;IACZ,OAAO;IACP,OAAO;IACP,iBAAiB;IACjB,YAAY;IACZ,mBAAmB;IACnB,QAAQ;CACA,CAAC;AAIX,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,UAAU;IACV,WAAW;IACX,QAAQ;CACA,CAAC;AAIX,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,eAAe;IACf,gBAAgB;IAChB,iBAAiB;IACjB,UAAU;IACV,oBAAoB;CACZ,CAAC;AAKX,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,YAAY;IACZ,eAAe;IACf,cAAc;IACd,aAAa;IACb,UAAU;IACV,cAAc;IACd,qBAAqB;IACrB,cAAc;IACd,kBAAkB;IAClB,kBAAkB;IAClB,qBAAqB;IACrB,qBAAqB;IACrB,yBAAyB;IACzB,yBAAyB;IACzB,oBAAoB;IACpB,aAAa;IACb,kBAAkB;IAClB,iBAAiB;IACjB,WAAW;IACX,eAAe;IACf,iBAAiB;IACjB,SAAS;CACD,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type RedditOfficialBucket = "Interest" | "Industry";
|
|
2
|
+
export type RedditTopicDefinition = {
|
|
3
|
+
topicKey: string;
|
|
4
|
+
labelKey: string;
|
|
5
|
+
redditOfficialBucket: RedditOfficialBucket;
|
|
6
|
+
poolKeyPatterns: RegExp[];
|
|
7
|
+
fallbackLabel?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const REDDIT_TOPIC_TAXONOMY: RedditTopicDefinition[];
|
|
10
|
+
export declare function resolveRedditTopicFromIndustryKey(industryKey?: string | null): RedditTopicDefinition | null;
|
|
11
|
+
export declare function resolveRedditTopicLabel(industryKey?: string | null, industryLabel?: string | null): string;
|
|
12
|
+
//# sourceMappingURL=reddit-topic-taxonomy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reddit-topic-taxonomy.d.ts","sourceRoot":"","sources":["../src/reddit-topic-taxonomy.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,UAAU,CAAC;AAE3D,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AA2BF,eAAO,MAAM,qBAAqB,EAAE,qBAAqB,EAiNxD,CAAC;AAmBF,wBAAgB,iCAAiC,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,qBAAqB,GAAG,IAAI,CAU3G;AAED,wBAAgB,uBAAuB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAgB1G"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
const REDDIT_TOPIC_DETAIL_OVERRIDES = [
|
|
2
|
+
{ patterns: [/^industry_pools__audio_/i, /^brand_pools__soundcore_/i], labelKey: "subreddit.topicDetail.technology_audio_devices" },
|
|
3
|
+
{ patterns: [/^industry_pools__smart_home_/i], labelKey: "subreddit.topicDetail.home_smart_home" },
|
|
4
|
+
{ patterns: [/^industry_pools__security_/i, /^brand_pools__eufy_security_/i], labelKey: "subreddit.topicDetail.healthcare_home_security" },
|
|
5
|
+
{ patterns: [/^industry_pools__photo_/i, /^brand_pools__neewer_/i], labelKey: "subreddit.topicDetail.media_photography" },
|
|
6
|
+
{ patterns: [/^industry_pools__baby_/i, /^brand_pools__eufy_baby_/i], labelKey: "subreddit.topicDetail.healthcare_parenting" },
|
|
7
|
+
{ patterns: [/^advanced_professional_pools__A(2|10|11|15|16|19)$/i, /^professional_pools__A(2|10|11|15|16|19)$/i], labelKey: "subreddit.topicDetail.technology_consumer_devices" },
|
|
8
|
+
{ patterns: [/^advanced_professional_pools__A20$/i, /^professional_pools__A20$/i], labelKey: "subreddit.topicDetail.technology_apple_android" },
|
|
9
|
+
{ patterns: [/^advanced_professional_pools__A(1|4|14)$/i, /^professional_pools__A(1|4|14)$/i], labelKey: "subreddit.topicDetail.home_smart_home" },
|
|
10
|
+
{ patterns: [/^advanced_professional_pools__A12$/i, /^professional_pools__A12$/i], labelKey: "subreddit.topicDetail.gaming_community" },
|
|
11
|
+
{ patterns: [/^advanced_professional_pools__B(1|2|3|6|7)$/i, /^professional_pools__B(1|2|3|6|7)$/i], labelKey: "subreddit.topicDetail.software_developer_community" },
|
|
12
|
+
{ patterns: [/^advanced_professional_pools__B5$/i, /^professional_pools__B5$/i], labelKey: "subreddit.topicDetail.financial_crypto" },
|
|
13
|
+
{ patterns: [/^advanced_professional_pools__C(5|7|8|10|11|12)$/i, /^professional_pools__C(5|7|8|10|11|12)$/i], labelKey: "subreddit.topicDetail.entrepreneurship_saas" },
|
|
14
|
+
{ patterns: [/^advanced_professional_pools__C13$/i, /^professional_pools__C13$/i], labelKey: "subreddit.topicDetail.entrepreneurship_indie_dev" },
|
|
15
|
+
{ patterns: [/^advanced_professional_pools__D(1|6|7)$/i, /^professional_pools__D(1|6|7)$/i], labelKey: "subreddit.topicDetail.education_learning" },
|
|
16
|
+
{ patterns: [/^advanced_professional_pools__D(2|4|8|9)$/i, /^professional_pools__D(2|4|8|9)$/i], labelKey: "subreddit.topicDetail.healthcare_nursing" },
|
|
17
|
+
{ patterns: [/^advanced_professional_pools__E(1|2|5)$/i, /^professional_pools__E(1|2|5)$/i], labelKey: "subreddit.topicDetail.home_everyday" },
|
|
18
|
+
{ patterns: [/^advanced_professional_pools__E3$/i, /^professional_pools__E3$/i, /^regional_pools__/i], labelKey: "subreddit.topicDetail.travel_local_community" },
|
|
19
|
+
{ patterns: [/^common_pools__starter_news$/i], labelKey: "subreddit.topicDetail.news_trending" },
|
|
20
|
+
{ patterns: [/^common_pools__starter_pet$/i], labelKey: "subreddit.topicDetail.pets_petcare" },
|
|
21
|
+
{ patterns: [/^common_pools__starter_parenting$/i], labelKey: "subreddit.topicDetail.family_parenting" },
|
|
22
|
+
{ patterns: [/^advanced_common_pools__tech$/i], labelKey: "subreddit.topicDetail.technology_discussion" },
|
|
23
|
+
{ patterns: [/^common_pools__(frontpage|starter_casual)$/i, /^advanced_common_pools__discussion$/i], labelKey: "subreddit.topicDetail.general_interest" },
|
|
24
|
+
];
|
|
25
|
+
export const REDDIT_TOPIC_TAXONOMY = [
|
|
26
|
+
{
|
|
27
|
+
topicKey: "technology_consumer_electronics",
|
|
28
|
+
labelKey: "subreddit.topic.technology_consumer_electronics",
|
|
29
|
+
redditOfficialBucket: "Interest",
|
|
30
|
+
poolKeyPatterns: [
|
|
31
|
+
/^industry_pools__audio_/i,
|
|
32
|
+
/^advanced_professional_pools__A(2|10|11|15|16|19|20)$/i,
|
|
33
|
+
/^professional_pools__A(2|10|11|15|16|19|20)$/i,
|
|
34
|
+
/^brand_pools__(soundcore|neewer)_/i,
|
|
35
|
+
/^advanced_common_pools__tech$/i,
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
topicKey: "software_development",
|
|
40
|
+
labelKey: "subreddit.topic.software_development",
|
|
41
|
+
redditOfficialBucket: "Interest",
|
|
42
|
+
poolKeyPatterns: [
|
|
43
|
+
/^advanced_professional_pools__B(1|2|3|6|7)$/i,
|
|
44
|
+
/^professional_pools__B(1|2|3|6|7)$/i,
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
topicKey: "gaming",
|
|
49
|
+
labelKey: "subreddit.topic.gaming",
|
|
50
|
+
redditOfficialBucket: "Industry",
|
|
51
|
+
poolKeyPatterns: [/^advanced_professional_pools__A12$/i, /^professional_pools__A12$/i],
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
topicKey: "financial_services",
|
|
55
|
+
labelKey: "subreddit.topic.financial_services",
|
|
56
|
+
redditOfficialBucket: "Industry",
|
|
57
|
+
poolKeyPatterns: [
|
|
58
|
+
/^advanced_professional_pools__B5$/i,
|
|
59
|
+
/^professional_pools__B5$/i,
|
|
60
|
+
/^advanced_professional_pools__D3$/i,
|
|
61
|
+
/^professional_pools__D3$/i,
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
topicKey: "healthcare_pharma",
|
|
66
|
+
labelKey: "subreddit.topic.healthcare_pharma",
|
|
67
|
+
redditOfficialBucket: "Industry",
|
|
68
|
+
poolKeyPatterns: [
|
|
69
|
+
/^industry_pools__(baby|security)_/i,
|
|
70
|
+
/^advanced_professional_pools__D(2|4|8|9)$/i,
|
|
71
|
+
/^professional_pools__D(2|4|8|9)$/i,
|
|
72
|
+
/^brand_pools__eufy_(security|baby)_/i,
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
topicKey: "retail_shopping",
|
|
77
|
+
labelKey: "subreddit.topic.retail_shopping",
|
|
78
|
+
redditOfficialBucket: "Industry",
|
|
79
|
+
poolKeyPatterns: [
|
|
80
|
+
/^advanced_professional_pools__C(1|3|6)$/i,
|
|
81
|
+
/^professional_pools__C(1|3|6)$/i,
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
topicKey: "beauty",
|
|
86
|
+
labelKey: "subreddit.topic.beauty",
|
|
87
|
+
redditOfficialBucket: "Industry",
|
|
88
|
+
poolKeyPatterns: [/^advanced_professional_pools__E4$/i, /^professional_pools__E4$/i],
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
topicKey: "automotive",
|
|
92
|
+
labelKey: "subreddit.topic.automotive",
|
|
93
|
+
redditOfficialBucket: "Industry",
|
|
94
|
+
poolKeyPatterns: [/^advanced_professional_pools__A8$/i, /^professional_pools__A8$/i],
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
topicKey: "media_entertainment",
|
|
98
|
+
labelKey: "subreddit.topic.media_entertainment",
|
|
99
|
+
redditOfficialBucket: "Industry",
|
|
100
|
+
poolKeyPatterns: [
|
|
101
|
+
/^industry_pools__photo_/i,
|
|
102
|
+
/^advanced_professional_pools__D5$/i,
|
|
103
|
+
/^professional_pools__D5$/i,
|
|
104
|
+
],
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
topicKey: "home_living",
|
|
108
|
+
labelKey: "subreddit.topic.home_living",
|
|
109
|
+
redditOfficialBucket: "Interest",
|
|
110
|
+
poolKeyPatterns: [
|
|
111
|
+
/^industry_pools__smart_home_/i,
|
|
112
|
+
/^advanced_professional_pools__A(1|4|14)$/i,
|
|
113
|
+
/^professional_pools__A(1|4|14)$/i,
|
|
114
|
+
/^advanced_professional_pools__E(1|2|5)$/i,
|
|
115
|
+
/^professional_pools__E(1|2|5)$/i,
|
|
116
|
+
/^advanced_professional_pools__A13$/i,
|
|
117
|
+
/^professional_pools__A13$/i,
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
topicKey: "fitness_wellness",
|
|
122
|
+
labelKey: "subreddit.topic.fitness_wellness",
|
|
123
|
+
redditOfficialBucket: "Interest",
|
|
124
|
+
poolKeyPatterns: [
|
|
125
|
+
/^industry_pools__(fitness|wellness|sports|outdoor)_/i,
|
|
126
|
+
/^advanced_professional_pools__A(3|5|6|7|9|17|18)$/i,
|
|
127
|
+
/^professional_pools__A(3|5|6|7|9|17|18)$/i,
|
|
128
|
+
],
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
topicKey: "food_drink",
|
|
132
|
+
labelKey: "subreddit.topic.food_drink",
|
|
133
|
+
redditOfficialBucket: "Interest",
|
|
134
|
+
poolKeyPatterns: [
|
|
135
|
+
/^industry_pools__(food|drink|beverage|cooking|recipe)_/i,
|
|
136
|
+
/^advanced_professional_pools__C(2|4|9)$/i,
|
|
137
|
+
/^professional_pools__C(2|4|9)$/i,
|
|
138
|
+
],
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
topicKey: "science_education",
|
|
142
|
+
labelKey: "subreddit.topic.science_education",
|
|
143
|
+
redditOfficialBucket: "Interest",
|
|
144
|
+
poolKeyPatterns: [
|
|
145
|
+
/^industry_pools__(science|space|ai_research)_/i,
|
|
146
|
+
/^advanced_professional_pools__B(4|8|9|10)$/i,
|
|
147
|
+
/^professional_pools__B(4|8|9|10)$/i,
|
|
148
|
+
],
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
topicKey: "news_politics",
|
|
152
|
+
labelKey: "subreddit.topic.news_politics",
|
|
153
|
+
redditOfficialBucket: "Interest",
|
|
154
|
+
poolKeyPatterns: [
|
|
155
|
+
/^industry_pools__(news|politics|world)_/i,
|
|
156
|
+
/^advanced_professional_pools__D10$/i,
|
|
157
|
+
/^professional_pools__D10$/i,
|
|
158
|
+
/^common_pools__starter_news$/i,
|
|
159
|
+
],
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
topicKey: "pets_animals",
|
|
163
|
+
labelKey: "subreddit.topic.pets_animals",
|
|
164
|
+
redditOfficialBucket: "Interest",
|
|
165
|
+
poolKeyPatterns: [
|
|
166
|
+
/^industry_pools__(pets?|animals?)_/i,
|
|
167
|
+
/^advanced_professional_pools__E(6|7)$/i,
|
|
168
|
+
/^professional_pools__E(6|7)$/i,
|
|
169
|
+
/^common_pools__starter_pet$/i,
|
|
170
|
+
],
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
topicKey: "fashion_style",
|
|
174
|
+
labelKey: "subreddit.topic.fashion_style",
|
|
175
|
+
redditOfficialBucket: "Industry",
|
|
176
|
+
poolKeyPatterns: [
|
|
177
|
+
/^industry_pools__(fashion|style|apparel)_/i,
|
|
178
|
+
/^advanced_professional_pools__E8$/i,
|
|
179
|
+
/^professional_pools__E8$/i,
|
|
180
|
+
],
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
topicKey: "music_audio_culture",
|
|
184
|
+
labelKey: "subreddit.topic.music_audio_culture",
|
|
185
|
+
redditOfficialBucket: "Interest",
|
|
186
|
+
poolKeyPatterns: [
|
|
187
|
+
/^industry_pools__(music|artist|concert)_/i,
|
|
188
|
+
/^advanced_professional_pools__D13$/i,
|
|
189
|
+
/^professional_pools__D13$/i,
|
|
190
|
+
],
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
topicKey: "travel_local",
|
|
194
|
+
labelKey: "subreddit.topic.travel_local",
|
|
195
|
+
redditOfficialBucket: "Interest",
|
|
196
|
+
poolKeyPatterns: [/^regional_pools__/i, /^advanced_professional_pools__E3$/i, /^professional_pools__E3$/i],
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
topicKey: "entrepreneurship_business",
|
|
200
|
+
labelKey: "subreddit.topic.entrepreneurship_business",
|
|
201
|
+
redditOfficialBucket: "Interest",
|
|
202
|
+
poolKeyPatterns: [
|
|
203
|
+
/^advanced_professional_pools__C(5|7|8|10|11|12|13)$/i,
|
|
204
|
+
/^professional_pools__C(5|7|8|10|11|12|13)$/i,
|
|
205
|
+
],
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
topicKey: "family_parenting",
|
|
209
|
+
labelKey: "subreddit.topic.family_parenting",
|
|
210
|
+
redditOfficialBucket: "Interest",
|
|
211
|
+
poolKeyPatterns: [/^common_pools__starter_parenting$/i],
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
topicKey: "general_community",
|
|
215
|
+
labelKey: "subreddit.topic.general_community",
|
|
216
|
+
redditOfficialBucket: "Interest",
|
|
217
|
+
poolKeyPatterns: [/^common_pools__(frontpage|starter_casual)$/i, /^advanced_common_pools__discussion$/i],
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
topicKey: "education_careers",
|
|
221
|
+
labelKey: "subreddit.topic.education_careers",
|
|
222
|
+
redditOfficialBucket: "Interest",
|
|
223
|
+
poolKeyPatterns: [
|
|
224
|
+
/^advanced_professional_pools__D(1|6|7)$/i,
|
|
225
|
+
/^professional_pools__D(1|6|7)$/i,
|
|
226
|
+
],
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
topicKey: "green_living",
|
|
230
|
+
labelKey: "subreddit.topic.green_living",
|
|
231
|
+
redditOfficialBucket: "Interest",
|
|
232
|
+
poolKeyPatterns: [/^common_pools__/i],
|
|
233
|
+
},
|
|
234
|
+
];
|
|
235
|
+
const FALLBACK_TOPIC = {
|
|
236
|
+
topicKey: "technology_consumer_electronics",
|
|
237
|
+
labelKey: "subreddit.topic.technology_consumer_electronics",
|
|
238
|
+
redditOfficialBucket: "Interest",
|
|
239
|
+
poolKeyPatterns: [],
|
|
240
|
+
};
|
|
241
|
+
function formatFallbackLabel(industryKey) {
|
|
242
|
+
const [, poolPart = industryKey] = industryKey.split("__");
|
|
243
|
+
return poolPart
|
|
244
|
+
.replace(/[_-]+/g, " ")
|
|
245
|
+
.replace(/\b(starter|advanced)\b/gi, "")
|
|
246
|
+
.trim()
|
|
247
|
+
.replace(/\s+/g, " ")
|
|
248
|
+
.replace(/\b\w/g, (char) => char.toUpperCase());
|
|
249
|
+
}
|
|
250
|
+
export function resolveRedditTopicFromIndustryKey(industryKey) {
|
|
251
|
+
if (!industryKey)
|
|
252
|
+
return null;
|
|
253
|
+
const matched = REDDIT_TOPIC_TAXONOMY.find((topic) => topic.poolKeyPatterns.some((pattern) => pattern.test(industryKey)));
|
|
254
|
+
if (matched)
|
|
255
|
+
return matched;
|
|
256
|
+
return {
|
|
257
|
+
...FALLBACK_TOPIC,
|
|
258
|
+
fallbackLabel: formatFallbackLabel(industryKey),
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
export function resolveRedditTopicLabel(industryKey, industryLabel) {
|
|
262
|
+
if (industryKey) {
|
|
263
|
+
const detail = REDDIT_TOPIC_DETAIL_OVERRIDES.find((item) => item.patterns.some((pattern) => pattern.test(industryKey)));
|
|
264
|
+
if (detail)
|
|
265
|
+
return detail.labelKey;
|
|
266
|
+
}
|
|
267
|
+
const resolved = resolveRedditTopicFromIndustryKey(industryKey);
|
|
268
|
+
if (resolved?.fallbackLabel)
|
|
269
|
+
return "subreddit.topic.uncategorized";
|
|
270
|
+
if (resolved)
|
|
271
|
+
return resolved.labelKey;
|
|
272
|
+
const cleanLabel = industryLabel?.trim();
|
|
273
|
+
return cleanLabel &&
|
|
274
|
+
(cleanLabel.startsWith("subreddit.topic.") ||
|
|
275
|
+
cleanLabel.startsWith("subreddit.topicDetail."))
|
|
276
|
+
? cleanLabel
|
|
277
|
+
: "subreddit.topic.uncategorized";
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=reddit-topic-taxonomy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reddit-topic-taxonomy.js","sourceRoot":"","sources":["../src/reddit-topic-taxonomy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reddit-topic-taxonomy.test.d.ts","sourceRoot":"","sources":["../src/reddit-topic-taxonomy.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { resolveRedditTopicFromIndustryKey, resolveRedditTopicLabel, } from "./reddit-topic-taxonomy.js";
|
|
3
|
+
describe("resolveRedditTopicFromIndustryKey", () => {
|
|
4
|
+
it("maps professional pool keys to reddit topics", () => {
|
|
5
|
+
const topic = resolveRedditTopicFromIndustryKey("advanced_professional_pools__A15");
|
|
6
|
+
expect(topic?.topicKey).toBe("technology_consumer_electronics");
|
|
7
|
+
expect(topic?.labelKey).toBe("subreddit.topic.technology_consumer_electronics");
|
|
8
|
+
});
|
|
9
|
+
it("maps regional pools to travel/local topic", () => {
|
|
10
|
+
const topic = resolveRedditTopicFromIndustryKey("regional_pools__C8");
|
|
11
|
+
expect(topic?.topicKey).toBe("travel_local");
|
|
12
|
+
expect(topic?.labelKey).toBe("subreddit.topic.travel_local");
|
|
13
|
+
});
|
|
14
|
+
it("falls back to readable label for unknown keys", () => {
|
|
15
|
+
const topic = resolveRedditTopicFromIndustryKey("industry_pools__new_topic");
|
|
16
|
+
expect(topic?.fallbackLabel).toBe("New Topic");
|
|
17
|
+
});
|
|
18
|
+
it("maps fitness style pool keys to fitness/wellness topic", () => {
|
|
19
|
+
const topic = resolveRedditTopicFromIndustryKey("advanced_professional_pools__A7");
|
|
20
|
+
expect(topic?.topicKey).toBe("fitness_wellness");
|
|
21
|
+
expect(topic?.labelKey).toBe("subreddit.topic.fitness_wellness");
|
|
22
|
+
});
|
|
23
|
+
it("maps science-like industry keys to science topic", () => {
|
|
24
|
+
const topic = resolveRedditTopicFromIndustryKey("industry_pools__science_ai");
|
|
25
|
+
expect(topic?.topicKey).toBe("science_education");
|
|
26
|
+
expect(topic?.labelKey).toBe("subreddit.topic.science_education");
|
|
27
|
+
});
|
|
28
|
+
it("maps newly added A20/C13 pools to reddit topics", () => {
|
|
29
|
+
const techTopic = resolveRedditTopicFromIndustryKey("advanced_professional_pools__A20");
|
|
30
|
+
expect(techTopic?.topicKey).toBe("technology_consumer_electronics");
|
|
31
|
+
expect(techTopic?.labelKey).toBe("subreddit.topic.technology_consumer_electronics");
|
|
32
|
+
const businessTopic = resolveRedditTopicFromIndustryKey("professional_pools__C13");
|
|
33
|
+
expect(businessTopic?.topicKey).toBe("entrepreneurship_business");
|
|
34
|
+
expect(businessTopic?.labelKey).toBe("subreddit.topic.entrepreneurship_business");
|
|
35
|
+
});
|
|
36
|
+
it("maps common pools to explicit reddit topics", () => {
|
|
37
|
+
expect(resolveRedditTopicFromIndustryKey("common_pools__starter_news")?.topicKey).toBe("news_politics");
|
|
38
|
+
expect(resolveRedditTopicFromIndustryKey("common_pools__starter_pet")?.topicKey).toBe("pets_animals");
|
|
39
|
+
expect(resolveRedditTopicFromIndustryKey("common_pools__starter_parenting")?.topicKey).toBe("family_parenting");
|
|
40
|
+
expect(resolveRedditTopicFromIndustryKey("advanced_common_pools__discussion")?.topicKey).toBe("general_community");
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe("resolveRedditTopicLabel", () => {
|
|
44
|
+
it("prefers taxonomy label from key", () => {
|
|
45
|
+
expect(resolveRedditTopicLabel("advanced_professional_pools__B1", null)).toBe("subreddit.topicDetail.software_developer_community");
|
|
46
|
+
});
|
|
47
|
+
it("falls back to uncategorized when key is missing", () => {
|
|
48
|
+
expect(resolveRedditTopicLabel(null, "legacy industry label")).toBe("subreddit.topic.uncategorized");
|
|
49
|
+
});
|
|
50
|
+
it("keeps known i18n keys when key is missing", () => {
|
|
51
|
+
expect(resolveRedditTopicLabel(null, "subreddit.topic.retail_shopping")).toBe("subreddit.topic.retail_shopping");
|
|
52
|
+
});
|
|
53
|
+
it("resolves detailed labels for new common/pro pools", () => {
|
|
54
|
+
expect(resolveRedditTopicLabel("advanced_professional_pools__A20", null)).toBe("subreddit.topicDetail.technology_apple_android");
|
|
55
|
+
expect(resolveRedditTopicLabel("professional_pools__C13", null)).toBe("subreddit.topicDetail.entrepreneurship_indie_dev");
|
|
56
|
+
expect(resolveRedditTopicLabel("common_pools__starter_parenting", null)).toBe("subreddit.topicDetail.family_parenting");
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
//# sourceMappingURL=reddit-topic-taxonomy.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reddit-topic-taxonomy.test.js","sourceRoot":"","sources":["../src/reddit-topic-taxonomy.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@geoly-ai/social-hub-core",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Shared error types and primitives for Social Ops Hub",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/geoly-ai/geoly-reddit.git",
|
|
9
|
+
"directory": "packages/core"
|
|
10
|
+
},
|
|
11
|
+
"publishConfig": {
|
|
12
|
+
"access": "public"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"main": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"import": "./dist/index.js"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"typescript": "^5.7.2",
|
|
27
|
+
"vitest": "^2.1.8"
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "tsc",
|
|
31
|
+
"typecheck": "tsc --noEmit",
|
|
32
|
+
"test": "vitest run"
|
|
33
|
+
}
|
|
34
|
+
}
|