@lhremote/core 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +39 -0
  2. package/dist/cdp/client.d.ts +5 -1
  3. package/dist/cdp/client.d.ts.map +1 -1
  4. package/dist/cdp/client.js +11 -3
  5. package/dist/cdp/client.js.map +1 -1
  6. package/dist/data/index.d.ts +1 -0
  7. package/dist/data/index.d.ts.map +1 -1
  8. package/dist/data/index.js +1 -0
  9. package/dist/data/index.js.map +1 -1
  10. package/dist/data/linkedin-reference.d.ts +44 -0
  11. package/dist/data/linkedin-reference.d.ts.map +1 -0
  12. package/dist/data/linkedin-reference.js +316 -0
  13. package/dist/data/linkedin-reference.js.map +1 -0
  14. package/dist/data/linkedin-reference.test.d.ts +2 -0
  15. package/dist/data/linkedin-reference.test.d.ts.map +1 -0
  16. package/dist/data/linkedin-reference.test.js +124 -0
  17. package/dist/data/linkedin-reference.test.js.map +1 -0
  18. package/dist/db/index.d.ts +1 -1
  19. package/dist/db/index.d.ts.map +1 -1
  20. package/dist/db/index.js +1 -1
  21. package/dist/db/index.js.map +1 -1
  22. package/dist/db/repositories/collection-list.d.ts +69 -0
  23. package/dist/db/repositories/collection-list.d.ts.map +1 -0
  24. package/dist/db/repositories/collection-list.integration.test.d.ts +2 -0
  25. package/dist/db/repositories/collection-list.integration.test.d.ts.map +1 -0
  26. package/dist/db/repositories/collection-list.integration.test.js +124 -0
  27. package/dist/db/repositories/collection-list.integration.test.js.map +1 -0
  28. package/dist/db/repositories/collection-list.js +161 -0
  29. package/dist/db/repositories/collection-list.js.map +1 -0
  30. package/dist/db/repositories/index.d.ts +1 -0
  31. package/dist/db/repositories/index.d.ts.map +1 -1
  32. package/dist/db/repositories/index.js +1 -0
  33. package/dist/db/repositories/index.js.map +1 -1
  34. package/dist/db/testing/create-fixture.js +17 -0
  35. package/dist/db/testing/create-fixture.js.map +1 -1
  36. package/dist/index.d.ts +5 -5
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +10 -4
  39. package/dist/index.js.map +1 -1
  40. package/dist/operations/add-people-to-collection.d.ts +22 -0
  41. package/dist/operations/add-people-to-collection.d.ts.map +1 -0
  42. package/dist/operations/add-people-to-collection.js +27 -0
  43. package/dist/operations/add-people-to-collection.js.map +1 -0
  44. package/dist/operations/add-people-to-collection.test.d.ts +2 -0
  45. package/dist/operations/add-people-to-collection.test.d.ts.map +1 -0
  46. package/dist/operations/add-people-to-collection.test.js +69 -0
  47. package/dist/operations/add-people-to-collection.test.js.map +1 -0
  48. package/dist/operations/build-linkedin-url.d.ts +39 -0
  49. package/dist/operations/build-linkedin-url.d.ts.map +1 -0
  50. package/dist/operations/build-linkedin-url.js +72 -0
  51. package/dist/operations/build-linkedin-url.js.map +1 -0
  52. package/dist/operations/collect-people.d.ts +40 -0
  53. package/dist/operations/collect-people.d.ts.map +1 -0
  54. package/dist/operations/collect-people.js +55 -0
  55. package/dist/operations/collect-people.js.map +1 -0
  56. package/dist/operations/collect-people.test.d.ts +2 -0
  57. package/dist/operations/collect-people.test.d.ts.map +1 -0
  58. package/dist/operations/collect-people.test.js +156 -0
  59. package/dist/operations/collect-people.test.js.map +1 -0
  60. package/dist/operations/create-collection.d.ts +20 -0
  61. package/dist/operations/create-collection.d.ts.map +1 -0
  62. package/dist/operations/create-collection.js +26 -0
  63. package/dist/operations/create-collection.js.map +1 -0
  64. package/dist/operations/create-collection.test.d.ts +2 -0
  65. package/dist/operations/create-collection.test.d.ts.map +1 -0
  66. package/dist/operations/create-collection.test.js +72 -0
  67. package/dist/operations/create-collection.test.js.map +1 -0
  68. package/dist/operations/delete-collection.d.ts +20 -0
  69. package/dist/operations/delete-collection.d.ts.map +1 -0
  70. package/dist/operations/delete-collection.js +26 -0
  71. package/dist/operations/delete-collection.js.map +1 -0
  72. package/dist/operations/delete-collection.test.d.ts +2 -0
  73. package/dist/operations/delete-collection.test.d.ts.map +1 -0
  74. package/dist/operations/delete-collection.test.js +61 -0
  75. package/dist/operations/delete-collection.test.js.map +1 -0
  76. package/dist/operations/import-people-from-collection.d.ts +30 -0
  77. package/dist/operations/import-people-from-collection.d.ts.map +1 -0
  78. package/dist/operations/import-people-from-collection.js +65 -0
  79. package/dist/operations/import-people-from-collection.js.map +1 -0
  80. package/dist/operations/import-people-from-collection.test.d.ts +2 -0
  81. package/dist/operations/import-people-from-collection.test.d.ts.map +1 -0
  82. package/dist/operations/import-people-from-collection.test.js +170 -0
  83. package/dist/operations/import-people-from-collection.test.js.map +1 -0
  84. package/dist/operations/index.d.ts +9 -0
  85. package/dist/operations/index.d.ts.map +1 -1
  86. package/dist/operations/index.js +12 -0
  87. package/dist/operations/index.js.map +1 -1
  88. package/dist/operations/list-collections.d.ts +18 -0
  89. package/dist/operations/list-collections.d.ts.map +1 -0
  90. package/dist/operations/list-collections.js +22 -0
  91. package/dist/operations/list-collections.js.map +1 -0
  92. package/dist/operations/list-collections.test.d.ts +2 -0
  93. package/dist/operations/list-collections.test.d.ts.map +1 -0
  94. package/dist/operations/list-collections.test.js +73 -0
  95. package/dist/operations/list-collections.test.js.map +1 -0
  96. package/dist/operations/remove-people-from-collection.d.ts +21 -0
  97. package/dist/operations/remove-people-from-collection.d.ts.map +1 -0
  98. package/dist/operations/remove-people-from-collection.js +26 -0
  99. package/dist/operations/remove-people-from-collection.js.map +1 -0
  100. package/dist/operations/remove-people-from-collection.test.d.ts +2 -0
  101. package/dist/operations/remove-people-from-collection.test.d.ts.map +1 -0
  102. package/dist/operations/remove-people-from-collection.test.js +68 -0
  103. package/dist/operations/remove-people-from-collection.test.js.map +1 -0
  104. package/dist/operations/resolve-linkedin-entity.d.ts +33 -0
  105. package/dist/operations/resolve-linkedin-entity.d.ts.map +1 -0
  106. package/dist/operations/resolve-linkedin-entity.js +198 -0
  107. package/dist/operations/resolve-linkedin-entity.js.map +1 -0
  108. package/dist/services/app.d.ts.map +1 -1
  109. package/dist/services/app.js +37 -12
  110. package/dist/services/app.js.map +1 -1
  111. package/dist/services/app.test.js +57 -0
  112. package/dist/services/app.test.js.map +1 -1
  113. package/dist/services/boolean-expression.d.ts +29 -0
  114. package/dist/services/boolean-expression.d.ts.map +1 -0
  115. package/dist/services/boolean-expression.js +79 -0
  116. package/dist/services/boolean-expression.js.map +1 -0
  117. package/dist/services/boolean-expression.test.d.ts +2 -0
  118. package/dist/services/boolean-expression.test.d.ts.map +1 -0
  119. package/dist/services/boolean-expression.test.js +64 -0
  120. package/dist/services/boolean-expression.test.js.map +1 -0
  121. package/dist/services/collection.d.ts +84 -0
  122. package/dist/services/collection.d.ts.map +1 -0
  123. package/dist/services/collection.js +154 -0
  124. package/dist/services/collection.js.map +1 -0
  125. package/dist/services/collection.test.d.ts +2 -0
  126. package/dist/services/collection.test.d.ts.map +1 -0
  127. package/dist/services/collection.test.js +219 -0
  128. package/dist/services/collection.test.js.map +1 -0
  129. package/dist/services/errors.d.ts +27 -0
  130. package/dist/services/errors.d.ts.map +1 -1
  131. package/dist/services/errors.js +38 -0
  132. package/dist/services/errors.js.map +1 -1
  133. package/dist/services/index.d.ts +7 -1
  134. package/dist/services/index.d.ts.map +1 -1
  135. package/dist/services/index.js +7 -1
  136. package/dist/services/index.js.map +1 -1
  137. package/dist/services/instance.d.ts +12 -0
  138. package/dist/services/instance.d.ts.map +1 -1
  139. package/dist/services/instance.js +28 -0
  140. package/dist/services/instance.js.map +1 -1
  141. package/dist/services/instance.test.js +31 -0
  142. package/dist/services/instance.test.js.map +1 -1
  143. package/dist/services/launcher.d.ts +16 -0
  144. package/dist/services/launcher.d.ts.map +1 -1
  145. package/dist/services/launcher.js +63 -10
  146. package/dist/services/launcher.js.map +1 -1
  147. package/dist/services/launcher.test.js +109 -42
  148. package/dist/services/launcher.test.js.map +1 -1
  149. package/dist/services/sn-url-builder.d.ts +21 -0
  150. package/dist/services/sn-url-builder.d.ts.map +1 -0
  151. package/dist/services/sn-url-builder.js +132 -0
  152. package/dist/services/sn-url-builder.js.map +1 -0
  153. package/dist/services/sn-url-builder.test.d.ts +2 -0
  154. package/dist/services/sn-url-builder.test.d.ts.map +1 -0
  155. package/dist/services/sn-url-builder.test.js +130 -0
  156. package/dist/services/sn-url-builder.test.js.map +1 -0
  157. package/dist/services/source-type-registry.d.ts +19 -0
  158. package/dist/services/source-type-registry.d.ts.map +1 -0
  159. package/dist/services/source-type-registry.js +66 -0
  160. package/dist/services/source-type-registry.js.map +1 -0
  161. package/dist/services/source-type-registry.test.d.ts +2 -0
  162. package/dist/services/source-type-registry.test.d.ts.map +1 -0
  163. package/dist/services/source-type-registry.test.js +124 -0
  164. package/dist/services/source-type-registry.test.js.map +1 -0
  165. package/dist/services/url-builder.d.ts +12 -0
  166. package/dist/services/url-builder.d.ts.map +1 -0
  167. package/dist/services/url-builder.js +100 -0
  168. package/dist/services/url-builder.js.map +1 -0
  169. package/dist/services/url-builder.test.d.ts +2 -0
  170. package/dist/services/url-builder.test.d.ts.map +1 -0
  171. package/dist/services/url-builder.test.js +79 -0
  172. package/dist/services/url-builder.test.js.map +1 -0
  173. package/dist/services/url-templates.d.ts +41 -0
  174. package/dist/services/url-templates.d.ts.map +1 -0
  175. package/dist/services/url-templates.js +118 -0
  176. package/dist/services/url-templates.js.map +1 -0
  177. package/dist/services/url-templates.test.d.ts +2 -0
  178. package/dist/services/url-templates.test.d.ts.map +1 -0
  179. package/dist/services/url-templates.test.js +159 -0
  180. package/dist/services/url-templates.test.js.map +1 -0
  181. package/dist/types/collection.d.ts +12 -0
  182. package/dist/types/collection.d.ts.map +1 -0
  183. package/dist/types/collection.js +4 -0
  184. package/dist/types/collection.js.map +1 -0
  185. package/dist/types/index.d.ts +2 -0
  186. package/dist/types/index.d.ts.map +1 -1
  187. package/dist/types/linkedin-url.d.ts +109 -0
  188. package/dist/types/linkedin-url.d.ts.map +1 -0
  189. package/dist/types/linkedin-url.js +4 -0
  190. package/dist/types/linkedin-url.js.map +1 -0
  191. package/package.json +1 -1
@@ -0,0 +1,124 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { describe, expect, it } from "vitest";
4
+ import { getFunctionById, getIndustryById, getLinkedInReferenceData, getSeniorityById, isReferenceDataType, } from "./linkedin-reference.js";
5
+ describe("getLinkedInReferenceData", () => {
6
+ it("returns industries with correct structure", () => {
7
+ const industries = getLinkedInReferenceData("INDUSTRY");
8
+ expect(industries.length).toBeGreaterThanOrEqual(140);
9
+ for (const entry of industries) {
10
+ expect(entry).toHaveProperty("id");
11
+ expect(entry).toHaveProperty("name");
12
+ expect(typeof entry.id).toBe("number");
13
+ expect(typeof entry.name).toBe("string");
14
+ expect(entry.name.length).toBeGreaterThan(0);
15
+ }
16
+ });
17
+ it("returns seniority levels with correct structure", () => {
18
+ const levels = getLinkedInReferenceData("SENIORITY");
19
+ expect(levels).toHaveLength(10);
20
+ for (const entry of levels) {
21
+ expect(typeof entry.id).toBe("number");
22
+ expect(typeof entry.name).toBe("string");
23
+ }
24
+ });
25
+ it("returns functions with correct structure", () => {
26
+ const functions = getLinkedInReferenceData("FUNCTION");
27
+ expect(functions.length).toBeGreaterThanOrEqual(20);
28
+ for (const entry of functions) {
29
+ expect(typeof entry.id).toBe("number");
30
+ expect(typeof entry.name).toBe("string");
31
+ }
32
+ });
33
+ it("returns company sizes with correct structure", () => {
34
+ const sizes = getLinkedInReferenceData("COMPANY_SIZE");
35
+ expect(sizes.length).toBeGreaterThanOrEqual(8);
36
+ for (const entry of sizes) {
37
+ expect(typeof entry.id).toBe("string");
38
+ expect(typeof entry.label).toBe("string");
39
+ }
40
+ });
41
+ it("returns connection degrees with correct structure", () => {
42
+ const degrees = getLinkedInReferenceData("CONNECTION_DEGREE");
43
+ expect(degrees).toHaveLength(3);
44
+ const codes = degrees.map((d) => d.code);
45
+ expect(codes).toContain("F");
46
+ expect(codes).toContain("S");
47
+ expect(codes).toContain("O");
48
+ });
49
+ it("returns profile languages with correct structure", () => {
50
+ const languages = getLinkedInReferenceData("PROFILE_LANGUAGE");
51
+ expect(languages.length).toBeGreaterThanOrEqual(20);
52
+ for (const entry of languages) {
53
+ expect(typeof entry.code).toBe("string");
54
+ expect(typeof entry.name).toBe("string");
55
+ expect(entry.code.length).toBeGreaterThanOrEqual(2);
56
+ }
57
+ });
58
+ it("includes known industry IDs", () => {
59
+ const industries = getLinkedInReferenceData("INDUSTRY");
60
+ const ids = new Set(industries.map((i) => i.id));
61
+ // Spot-check well-known industries
62
+ expect(ids.has(4)).toBe(true); // Computer Software
63
+ expect(ids.has(6)).toBe(true); // Internet
64
+ expect(ids.has(96)).toBe(true); // IT and Services
65
+ });
66
+ it("has no duplicate IDs in industries", () => {
67
+ const industries = getLinkedInReferenceData("INDUSTRY");
68
+ const ids = industries.map((i) => i.id);
69
+ expect(new Set(ids).size).toBe(ids.length);
70
+ });
71
+ it("has no duplicate IDs in seniority levels", () => {
72
+ const levels = getLinkedInReferenceData("SENIORITY");
73
+ const ids = levels.map((l) => l.id);
74
+ expect(new Set(ids).size).toBe(ids.length);
75
+ });
76
+ it("has no duplicate IDs in functions", () => {
77
+ const functions = getLinkedInReferenceData("FUNCTION");
78
+ const ids = functions.map((f) => f.id);
79
+ expect(new Set(ids).size).toBe(ids.length);
80
+ });
81
+ });
82
+ describe("getIndustryById", () => {
83
+ it("returns correct industry for known ID", () => {
84
+ const industry = getIndustryById(4);
85
+ expect(industry?.name).toBe("Computer Software");
86
+ });
87
+ it("returns undefined for unknown ID", () => {
88
+ expect(getIndustryById(99999)).toBeUndefined();
89
+ });
90
+ });
91
+ describe("getSeniorityById", () => {
92
+ it("returns correct seniority for known ID", () => {
93
+ const seniority = getSeniorityById(8);
94
+ expect(seniority?.name).toBe("CXO");
95
+ });
96
+ it("returns undefined for unknown ID", () => {
97
+ expect(getSeniorityById(99)).toBeUndefined();
98
+ });
99
+ });
100
+ describe("getFunctionById", () => {
101
+ it("returns correct function for known ID", () => {
102
+ const fn = getFunctionById(8);
103
+ expect(fn?.name).toBe("Engineering");
104
+ });
105
+ it("returns undefined for unknown ID", () => {
106
+ expect(getFunctionById(99)).toBeUndefined();
107
+ });
108
+ });
109
+ describe("isReferenceDataType", () => {
110
+ it("returns true for valid types", () => {
111
+ expect(isReferenceDataType("INDUSTRY")).toBe(true);
112
+ expect(isReferenceDataType("SENIORITY")).toBe(true);
113
+ expect(isReferenceDataType("FUNCTION")).toBe(true);
114
+ expect(isReferenceDataType("COMPANY_SIZE")).toBe(true);
115
+ expect(isReferenceDataType("CONNECTION_DEGREE")).toBe(true);
116
+ expect(isReferenceDataType("PROFILE_LANGUAGE")).toBe(true);
117
+ });
118
+ it("returns false for invalid types", () => {
119
+ expect(isReferenceDataType("UNKNOWN")).toBe(false);
120
+ expect(isReferenceDataType("")).toBe(false);
121
+ expect(isReferenceDataType("industry")).toBe(false);
122
+ });
123
+ });
124
+ //# sourceMappingURL=linkedin-reference.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkedin-reference.test.js","sourceRoot":"","sources":["../../src/data/linkedin-reference.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export { DatabaseClient, type DatabaseClientOptions } from "./client.js";
2
2
  export { discoverAllDatabases, discoverDatabase } from "./discovery.js";
3
3
  export { ActionNotFoundError, CampaignNotFoundError, ChatNotFoundError, DatabaseError, DatabaseNotFoundError, ExcludeListNotFoundError, NoNextActionError, ProfileNotFoundError, } from "./errors.js";
4
- export { CampaignExcludeListRepository, CampaignRepository, CampaignStatisticsRepository, MessageRepository, ProfileRepository, } from "./repositories/index.js";
4
+ export { CampaignExcludeListRepository, CampaignRepository, CampaignStatisticsRepository, CollectionListRepository, type CollectionSummary, MessageRepository, ProfileRepository, } from "./repositories/index.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,6BAA6B,EAC7B,kBAAkB,EAClB,4BAA4B,EAC5B,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,6BAA6B,EAC7B,kBAAkB,EAClB,4BAA4B,EAC5B,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC"}
package/dist/db/index.js CHANGED
@@ -3,5 +3,5 @@
3
3
  export { DatabaseClient } from "./client.js";
4
4
  export { discoverAllDatabases, discoverDatabase } from "./discovery.js";
5
5
  export { ActionNotFoundError, CampaignNotFoundError, ChatNotFoundError, DatabaseError, DatabaseNotFoundError, ExcludeListNotFoundError, NoNextActionError, ProfileNotFoundError, } from "./errors.js";
6
- export { CampaignExcludeListRepository, CampaignRepository, CampaignStatisticsRepository, MessageRepository, ProfileRepository, } from "./repositories/index.js";
6
+ export { CampaignExcludeListRepository, CampaignRepository, CampaignStatisticsRepository, CollectionListRepository, MessageRepository, ProfileRepository, } from "./repositories/index.js";
7
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,cAAc,EAA8B,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,6BAA6B,EAC7B,kBAAkB,EAClB,4BAA4B,EAC5B,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,cAAc,EAA8B,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,wBAAwB,EACxB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,6BAA6B,EAC7B,kBAAkB,EAClB,4BAA4B,EAC5B,wBAAwB,EAExB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,69 @@
1
+ import type { DatabaseClient } from "../client.js";
2
+ /**
3
+ * Summary of a named collection (LH "List").
4
+ */
5
+ export interface CollectionSummary {
6
+ readonly id: number;
7
+ readonly name: string;
8
+ readonly peopleCount: number;
9
+ readonly createdAt: string;
10
+ }
11
+ /**
12
+ * Repository for LinkedHelper Lists (collections) CRUD operations.
13
+ *
14
+ * Named collections are user-visible lists managed via the LH
15
+ * `ListsManager` UI. Exclude-list collections (name IS NULL) are
16
+ * filtered out automatically.
17
+ *
18
+ * Write operations require the DatabaseClient to be opened with
19
+ * `{ readOnly: false }`.
20
+ */
21
+ export declare class CollectionListRepository {
22
+ private readonly client;
23
+ private readonly stmtListCollections;
24
+ private writeStatements;
25
+ constructor(client: DatabaseClient);
26
+ /**
27
+ * List all named collections with people counts.
28
+ */
29
+ listCollections(): CollectionSummary[];
30
+ /**
31
+ * Create a new named collection.
32
+ *
33
+ * @returns The ID of the newly created collection.
34
+ */
35
+ createCollection(accountId: number, name: string): number;
36
+ /**
37
+ * Delete a collection and all its people associations.
38
+ *
39
+ * @returns `true` if the collection existed and was deleted.
40
+ */
41
+ deleteCollection(collectionId: number): boolean;
42
+ /**
43
+ * Add people to a collection.
44
+ *
45
+ * @returns Number of people actually added (excludes already-present).
46
+ */
47
+ addPeople(collectionId: number, personIds: number[]): number;
48
+ /**
49
+ * Remove people from a collection.
50
+ *
51
+ * @returns Number of people actually removed.
52
+ */
53
+ removePeople(collectionId: number, personIds: number[]): number;
54
+ /**
55
+ * Get LinkedIn profile URLs for all people in a collection.
56
+ *
57
+ * Reads person IDs from `collection_people` and resolves their
58
+ * LinkedIn public IDs from `person_external_ids`.
59
+ *
60
+ * @returns Array of LinkedIn profile URLs.
61
+ */
62
+ getCollectionPeopleUrls(collectionId: number): string[];
63
+ /**
64
+ * Prepare write statements lazily (only when needed).
65
+ * This avoids issues when the client is opened in read-only mode.
66
+ */
67
+ private getWriteStatements;
68
+ }
69
+ //# sourceMappingURL=collection-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-list.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/collection-list.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMnD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;GASG;AACH,qBAAa,wBAAwB;IAYvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAXnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IAGrC,OAAO,CAAC,eAAe,CAMP;gBAEa,MAAM,EAAE,cAAc;IAenD;;OAEG;IACH,eAAe,IAAI,iBAAiB,EAAE;IAgBtC;;;;OAIG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAMzD;;;;OAIG;IACH,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAe/C;;;;OAIG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM;IAwB5D;;;;OAIG;IACH,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM;IAwB/D;;;;;;;OAOG;IACH,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE;IAiBvD;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CA4B3B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=collection-list.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-list.integration.test.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/collection-list.integration.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,124 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
4
+ import { DatabaseClient } from "../client.js";
5
+ import { FIXTURE_PATH } from "../testing/open-fixture.js";
6
+ import { CollectionListRepository } from "./collection-list.js";
7
+ describe("CollectionListRepository (integration)", () => {
8
+ let client;
9
+ let repo;
10
+ beforeAll(() => {
11
+ // Open in write mode so we can test write operations
12
+ client = new DatabaseClient(FIXTURE_PATH, { readOnly: false });
13
+ repo = new CollectionListRepository(client);
14
+ });
15
+ afterAll(() => {
16
+ client.close();
17
+ });
18
+ describe("listCollections", () => {
19
+ it("returns named collections with people counts from fixture", () => {
20
+ const collections = repo.listCollections();
21
+ // Fixture has 3 named collections (id 10, 11, 12)
22
+ // Exclude-list collections (id 1-6, name NULL) are filtered out
23
+ expect(collections.length).toBeGreaterThanOrEqual(3);
24
+ const prospects = collections.find((c) => c.name === "Prospects");
25
+ expect(prospects).toBeDefined();
26
+ expect(prospects.peopleCount).toBe(2);
27
+ const clients = collections.find((c) => c.name === "Clients");
28
+ expect(clients).toBeDefined();
29
+ expect(clients.peopleCount).toBe(1);
30
+ const emptyList = collections.find((c) => c.name === "Empty List");
31
+ expect(emptyList).toBeDefined();
32
+ expect(emptyList.peopleCount).toBe(0);
33
+ });
34
+ it("excludes unnamed collections (exclude lists)", () => {
35
+ const collections = repo.listCollections();
36
+ // No collection should have a null name
37
+ for (const c of collections) {
38
+ expect(c.name).not.toBeNull();
39
+ expect(c.name.length).toBeGreaterThan(0);
40
+ }
41
+ });
42
+ });
43
+ describe("createCollection", () => {
44
+ it("creates a new named collection and returns its ID", () => {
45
+ const id = repo.createCollection(1, "Integration Test List");
46
+ expect(id).toBeGreaterThan(0);
47
+ // Verify it appears in listCollections
48
+ const collections = repo.listCollections();
49
+ const created = collections.find((c) => c.name === "Integration Test List");
50
+ expect(created).toBeDefined();
51
+ expect(created.id).toBe(id);
52
+ expect(created.peopleCount).toBe(0);
53
+ });
54
+ });
55
+ describe("addPeople", () => {
56
+ it("adds people to a collection", () => {
57
+ const id = repo.createCollection(1, "Add People Test");
58
+ const added = repo.addPeople(id, [1, 3]);
59
+ expect(added).toBe(2);
60
+ });
61
+ it("returns 0 for already-present people", () => {
62
+ const id = repo.createCollection(1, "Duplicate Test");
63
+ repo.addPeople(id, [1]);
64
+ const added = repo.addPeople(id, [1]);
65
+ expect(added).toBe(0);
66
+ });
67
+ it("returns 0 for empty personIds", () => {
68
+ const added = repo.addPeople(10, []);
69
+ expect(added).toBe(0);
70
+ });
71
+ });
72
+ describe("removePeople", () => {
73
+ it("removes people from a collection", () => {
74
+ const id = repo.createCollection(1, "Remove People Test");
75
+ repo.addPeople(id, [1, 2, 3]);
76
+ const removed = repo.removePeople(id, [1, 3]);
77
+ expect(removed).toBe(2);
78
+ });
79
+ it("returns 0 for non-present people", () => {
80
+ const id = repo.createCollection(1, "Remove Non-Present Test");
81
+ const removed = repo.removePeople(id, [999]);
82
+ expect(removed).toBe(0);
83
+ });
84
+ it("returns 0 for empty personIds", () => {
85
+ const removed = repo.removePeople(10, []);
86
+ expect(removed).toBe(0);
87
+ });
88
+ });
89
+ describe("deleteCollection", () => {
90
+ it("deletes a named collection and its people", () => {
91
+ const id = repo.createCollection(1, "Delete Test");
92
+ repo.addPeople(id, [1, 2]);
93
+ const deleted = repo.deleteCollection(id);
94
+ expect(deleted).toBe(true);
95
+ // Verify it no longer appears
96
+ const collections = repo.listCollections();
97
+ expect(collections.find((c) => c.id === id)).toBeUndefined();
98
+ });
99
+ it("returns false for non-existent collection", () => {
100
+ const deleted = repo.deleteCollection(99999);
101
+ expect(deleted).toBe(false);
102
+ });
103
+ it("does not delete unnamed collections (exclude lists)", () => {
104
+ // Collection 1 is an exclude list (name IS NULL)
105
+ const deleted = repo.deleteCollection(1);
106
+ expect(deleted).toBe(false);
107
+ });
108
+ });
109
+ describe("getCollectionPeopleUrls", () => {
110
+ it("returns LinkedIn URLs for people in collection", () => {
111
+ // Collection 10 (Prospects) has people 1 (Ada) and 3 (Charlie)
112
+ // Person 1 has public ID 'ada-lovelace-test'
113
+ const urls = repo.getCollectionPeopleUrls(10);
114
+ expect(urls.length).toBeGreaterThanOrEqual(1);
115
+ const adaUrl = urls.find((u) => u.includes("ada-lovelace-test"));
116
+ expect(adaUrl).toBe("https://www.linkedin.com/in/ada-lovelace-test/");
117
+ });
118
+ it("returns empty array for empty collection", () => {
119
+ const urls = repo.getCollectionPeopleUrls(12);
120
+ expect(urls).toEqual([]);
121
+ });
122
+ });
123
+ });
124
+ //# sourceMappingURL=collection-list.integration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-list.integration.test.js","sourceRoot":"","sources":["../../../src/db/repositories/collection-list.integration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,161 @@
1
+ // SPDX-License-Identifier: AGPL-3.0-only
2
+ // Copyright (C) 2026 Oleksii PELYKH
3
+ /**
4
+ * Repository for LinkedHelper Lists (collections) CRUD operations.
5
+ *
6
+ * Named collections are user-visible lists managed via the LH
7
+ * `ListsManager` UI. Exclude-list collections (name IS NULL) are
8
+ * filtered out automatically.
9
+ *
10
+ * Write operations require the DatabaseClient to be opened with
11
+ * `{ readOnly: false }`.
12
+ */
13
+ export class CollectionListRepository {
14
+ client;
15
+ stmtListCollections;
16
+ // Write statements (prepared lazily to avoid issues with read-only mode)
17
+ writeStatements = null;
18
+ constructor(client) {
19
+ this.client = client;
20
+ const { db } = client;
21
+ this.stmtListCollections = db.prepare(`SELECT c.id, c.name,
22
+ COUNT(cp.person_id) AS people_count,
23
+ c.created_at
24
+ FROM collections c
25
+ LEFT JOIN collection_people cp ON cp.collection_id = c.id
26
+ WHERE c.name IS NOT NULL
27
+ GROUP BY c.id
28
+ ORDER BY c.id`);
29
+ }
30
+ /**
31
+ * List all named collections with people counts.
32
+ */
33
+ listCollections() {
34
+ const rows = this.stmtListCollections.all();
35
+ return rows.map((r) => ({
36
+ id: r.id,
37
+ name: r.name,
38
+ peopleCount: r.people_count,
39
+ createdAt: r.created_at,
40
+ }));
41
+ }
42
+ /**
43
+ * Create a new named collection.
44
+ *
45
+ * @returns The ID of the newly created collection.
46
+ */
47
+ createCollection(accountId, name) {
48
+ const stmts = this.getWriteStatements();
49
+ const result = stmts.insertCollection.run(accountId, name);
50
+ return Number(result.lastInsertRowid);
51
+ }
52
+ /**
53
+ * Delete a collection and all its people associations.
54
+ *
55
+ * @returns `true` if the collection existed and was deleted.
56
+ */
57
+ deleteCollection(collectionId) {
58
+ const stmts = this.getWriteStatements();
59
+ this.client.db.exec("BEGIN");
60
+ try {
61
+ stmts.deleteCollectionPeople.run(collectionId);
62
+ const result = stmts.deleteCollection.run(collectionId);
63
+ this.client.db.exec("COMMIT");
64
+ return result.changes > 0;
65
+ }
66
+ catch (e) {
67
+ this.client.db.exec("ROLLBACK");
68
+ throw e;
69
+ }
70
+ }
71
+ /**
72
+ * Add people to a collection.
73
+ *
74
+ * @returns Number of people actually added (excludes already-present).
75
+ */
76
+ addPeople(collectionId, personIds) {
77
+ if (personIds.length === 0)
78
+ return 0;
79
+ const stmts = this.getWriteStatements();
80
+ let added = 0;
81
+ this.client.db.exec("BEGIN");
82
+ try {
83
+ for (const personId of personIds) {
84
+ const result = stmts.insertCollectionPerson.run(collectionId, personId);
85
+ if (result.changes > 0)
86
+ added++;
87
+ }
88
+ this.client.db.exec("COMMIT");
89
+ }
90
+ catch (e) {
91
+ this.client.db.exec("ROLLBACK");
92
+ throw e;
93
+ }
94
+ return added;
95
+ }
96
+ /**
97
+ * Remove people from a collection.
98
+ *
99
+ * @returns Number of people actually removed.
100
+ */
101
+ removePeople(collectionId, personIds) {
102
+ if (personIds.length === 0)
103
+ return 0;
104
+ const stmts = this.getWriteStatements();
105
+ let removed = 0;
106
+ this.client.db.exec("BEGIN");
107
+ try {
108
+ for (const personId of personIds) {
109
+ const result = stmts.deleteCollectionPerson.run(collectionId, personId);
110
+ if (result.changes > 0)
111
+ removed++;
112
+ }
113
+ this.client.db.exec("COMMIT");
114
+ }
115
+ catch (e) {
116
+ this.client.db.exec("ROLLBACK");
117
+ throw e;
118
+ }
119
+ return removed;
120
+ }
121
+ /**
122
+ * Get LinkedIn profile URLs for all people in a collection.
123
+ *
124
+ * Reads person IDs from `collection_people` and resolves their
125
+ * LinkedIn public IDs from `person_external_ids`.
126
+ *
127
+ * @returns Array of LinkedIn profile URLs.
128
+ */
129
+ getCollectionPeopleUrls(collectionId) {
130
+ const rows = this.client.db
131
+ .prepare(`SELECT pei.external_id
132
+ FROM collection_people cp
133
+ JOIN person_external_ids pei
134
+ ON pei.person_id = cp.person_id AND pei.type_group = 'public'
135
+ WHERE cp.collection_id = ?
136
+ ORDER BY cp.person_id`)
137
+ .all(collectionId);
138
+ return rows.map((r) => `https://www.linkedin.com/in/${r.external_id}/`);
139
+ }
140
+ /**
141
+ * Prepare write statements lazily (only when needed).
142
+ * This avoids issues when the client is opened in read-only mode.
143
+ */
144
+ getWriteStatements() {
145
+ if (this.writeStatements)
146
+ return this.writeStatements;
147
+ const { db } = this.client;
148
+ this.writeStatements = {
149
+ insertCollection: db.prepare(`INSERT INTO collections (li_account_id, name, created_at, updated_at)
150
+ VALUES (?, ?, datetime('now'), datetime('now'))`),
151
+ deleteCollectionPeople: db.prepare(`DELETE FROM collection_people WHERE collection_id = ?`),
152
+ deleteCollection: db.prepare(`DELETE FROM collections WHERE id = ? AND name IS NOT NULL`),
153
+ insertCollectionPerson: db.prepare(`INSERT OR IGNORE INTO collection_people (collection_id, person_id)
154
+ VALUES (?, ?)`),
155
+ deleteCollectionPerson: db.prepare(`DELETE FROM collection_people
156
+ WHERE collection_id = ? AND person_id = ?`),
157
+ };
158
+ return this.writeStatements;
159
+ }
160
+ }
161
+ //# sourceMappingURL=collection-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-list.js","sourceRoot":"","sources":["../../../src/db/repositories/collection-list.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  export { CampaignExcludeListRepository } from "./campaign-exclude-list.js";
2
2
  export { CampaignRepository } from "./campaign.js";
3
3
  export { CampaignStatisticsRepository } from "./campaign-statistics.js";
4
+ export { CollectionListRepository, type CollectionSummary, } from "./collection-list.js";
4
5
  export { MessageRepository } from "./message.js";
5
6
  export { ProfileRepository } from "./profile.js";
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/db/repositories/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EACL,wBAAwB,EACxB,KAAK,iBAAiB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
@@ -3,6 +3,7 @@
3
3
  export { CampaignExcludeListRepository } from "./campaign-exclude-list.js";
4
4
  export { CampaignRepository } from "./campaign.js";
5
5
  export { CampaignStatisticsRepository } from "./campaign-statistics.js";
6
+ export { CollectionListRepository, } from "./collection-list.js";
6
7
  export { MessageRepository } from "./message.js";
7
8
  export { ProfileRepository } from "./profile.js";
8
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/repositories/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/repositories/index.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,oCAAoC;AAEpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EACL,wBAAwB,GAEzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC"}
@@ -738,6 +738,23 @@ db.exec(`
738
738
  UPDATE action_versions SET exclude_list_id = 5 WHERE id = 6;
739
739
  UPDATE action_versions SET exclude_list_id = 6 WHERE id = 7;
740
740
  `);
741
+ // ── Named Collections (Lists) Data ──────────────────────────────────
742
+ // Collection 10: "Prospects" list with 2 people (Ada, Charlie)
743
+ // Collection 11: "Clients" list with 1 person (Ada)
744
+ // Collection 12: "Empty List" with no people
745
+ db.exec(`
746
+ INSERT INTO collections (id, li_account_id, name, created_at, updated_at)
747
+ VALUES
748
+ (10, 1, 'Prospects', '${NOW}', '${NOW}'),
749
+ (11, 1, 'Clients', '${NOW}', '${NOW}'),
750
+ (12, 1, 'Empty List', '${NOW}', '${NOW}');
751
+
752
+ INSERT INTO collection_people (collection_id, person_id)
753
+ VALUES
754
+ (10, 1),
755
+ (10, 3),
756
+ (11, 1);
757
+ `);
741
758
  // ── Write to disk ───────────────────────────────────────────────────
742
759
  await backup(db, FIXTURE_PATH);
743
760
  db.close();
@@ -1 +1 @@
1
- {"version":3,"file":"create-fixture.js","sourceRoot":"","sources":["../../../src/db/testing/create-fixture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-fixture.js","sourceRoot":"","sources":["../../../src/db/testing/create-fixture.ts"],"names":[],"mappings":"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"}