@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.
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=account-graph-risk.test.d.ts.map
@@ -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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"}
@@ -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"}
@@ -0,0 +1,5 @@
1
+ export * from "./account-graph-risk.js";
2
+ export * from "./graph-domain.js";
3
+ export * from "./errors.js";
4
+ export * from "./reddit-topic-taxonomy.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,5 @@
1
+ export * from "./account-graph-risk.js";
2
+ export * from "./graph-domain.js";
3
+ export * from "./errors.js";
4
+ export * from "./reddit-topic-taxonomy.js";
5
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=reddit-topic-taxonomy.test.d.ts.map
@@ -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
+ }