@skillsmith/core 0.5.2 → 0.5.4

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 (175) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/activation/ActivationManager.d.ts +7 -0
  4. package/dist/src/activation/ActivationManager.d.ts.map +1 -1
  5. package/dist/src/activation/ActivationManager.js +13 -4
  6. package/dist/src/activation/ActivationManager.js.map +1 -1
  7. package/dist/src/analysis/adapters/python.d.ts +16 -11
  8. package/dist/src/analysis/adapters/python.d.ts.map +1 -1
  9. package/dist/src/analysis/adapters/python.js +46 -61
  10. package/dist/src/analysis/adapters/python.js.map +1 -1
  11. package/dist/src/analysis/router.test.d.ts +2 -0
  12. package/dist/src/analysis/router.test.d.ts.map +1 -0
  13. package/dist/src/analysis/router.test.js +411 -0
  14. package/dist/src/analysis/router.test.js.map +1 -0
  15. package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -1
  16. package/dist/src/analysis/tree-sitter/manager.js +12 -5
  17. package/dist/src/analysis/tree-sitter/manager.js.map +1 -1
  18. package/dist/src/analysis/tree-sitter/pythonExtractor.d.ts +45 -0
  19. package/dist/src/analysis/tree-sitter/pythonExtractor.d.ts.map +1 -0
  20. package/dist/src/analysis/tree-sitter/pythonExtractor.js +264 -0
  21. package/dist/src/analysis/tree-sitter/pythonExtractor.js.map +1 -0
  22. package/dist/src/analysis/tree-sitter/pythonExtractor.test.d.ts +12 -0
  23. package/dist/src/analysis/tree-sitter/pythonExtractor.test.d.ts.map +1 -0
  24. package/dist/src/analysis/tree-sitter/pythonExtractor.test.js +74 -0
  25. package/dist/src/analysis/tree-sitter/pythonExtractor.test.js.map +1 -0
  26. package/dist/src/analysis/tree-sitter/pythonIncremental.d.ts +93 -0
  27. package/dist/src/analysis/tree-sitter/pythonIncremental.d.ts.map +1 -0
  28. package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.d.ts +22 -0
  29. package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.d.ts.map +1 -0
  30. package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.js +229 -0
  31. package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.js.map +1 -0
  32. package/dist/src/analysis/tree-sitter/pythonIncremental.js +287 -0
  33. package/dist/src/analysis/tree-sitter/pythonIncremental.js.map +1 -0
  34. package/dist/src/analysis/tree-sitter/pythonIncremental.test.d.ts +17 -0
  35. package/dist/src/analysis/tree-sitter/pythonIncremental.test.d.ts.map +1 -0
  36. package/dist/src/analysis/tree-sitter/pythonIncremental.test.js +142 -0
  37. package/dist/src/analysis/tree-sitter/pythonIncremental.test.js.map +1 -0
  38. package/dist/src/analysis/tree-sitter/queries/python.d.ts +43 -0
  39. package/dist/src/analysis/tree-sitter/queries/python.d.ts.map +1 -0
  40. package/dist/src/analysis/tree-sitter/queries/python.js +88 -0
  41. package/dist/src/analysis/tree-sitter/queries/python.js.map +1 -0
  42. package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.d.ts +13 -0
  43. package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.d.ts.map +1 -0
  44. package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.js +174 -0
  45. package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.js.map +1 -0
  46. package/dist/src/analytics/ROIDashboardService.csv.d.ts +11 -0
  47. package/dist/src/analytics/ROIDashboardService.csv.d.ts.map +1 -0
  48. package/dist/src/analytics/ROIDashboardService.csv.js +43 -0
  49. package/dist/src/analytics/ROIDashboardService.csv.js.map +1 -0
  50. package/dist/src/analytics/ROIDashboardService.d.ts +64 -3
  51. package/dist/src/analytics/ROIDashboardService.d.ts.map +1 -1
  52. package/dist/src/analytics/ROIDashboardService.js +116 -45
  53. package/dist/src/analytics/ROIDashboardService.js.map +1 -1
  54. package/dist/src/api/schemas.d.ts +19 -4
  55. package/dist/src/api/schemas.d.ts.map +1 -1
  56. package/dist/src/api/schemas.js +8 -0
  57. package/dist/src/api/schemas.js.map +1 -1
  58. package/dist/src/benchmarks/incrementalParseBenchmark.d.ts +18 -0
  59. package/dist/src/benchmarks/incrementalParseBenchmark.d.ts.map +1 -0
  60. package/dist/src/benchmarks/incrementalParseBenchmark.js +121 -0
  61. package/dist/src/benchmarks/incrementalParseBenchmark.js.map +1 -0
  62. package/dist/src/billing/GDPRComplianceService.test.d.ts +2 -0
  63. package/dist/src/billing/GDPRComplianceService.test.d.ts.map +1 -0
  64. package/dist/src/billing/GDPRComplianceService.test.js +405 -0
  65. package/dist/src/billing/GDPRComplianceService.test.js.map +1 -0
  66. package/dist/src/index.d.ts +4 -3
  67. package/dist/src/index.d.ts.map +1 -1
  68. package/dist/src/index.js +2 -2
  69. package/dist/src/index.js.map +1 -1
  70. package/dist/src/indexer/SkillParser.coverage.test.d.ts +10 -0
  71. package/dist/src/indexer/SkillParser.coverage.test.d.ts.map +1 -0
  72. package/dist/src/indexer/SkillParser.coverage.test.js +76 -0
  73. package/dist/src/indexer/SkillParser.coverage.test.js.map +1 -0
  74. package/dist/src/indexer/SkillParser.test.d.ts +2 -0
  75. package/dist/src/indexer/SkillParser.test.d.ts.map +1 -0
  76. package/dist/src/indexer/SkillParser.test.js +375 -0
  77. package/dist/src/indexer/SkillParser.test.js.map +1 -0
  78. package/dist/src/sources/LocalFilesystemAdapter.d.ts +104 -10
  79. package/dist/src/sources/LocalFilesystemAdapter.d.ts.map +1 -1
  80. package/dist/src/sources/LocalFilesystemAdapter.helpers.d.ts +92 -0
  81. package/dist/src/sources/LocalFilesystemAdapter.helpers.d.ts.map +1 -0
  82. package/dist/src/sources/LocalFilesystemAdapter.helpers.js +157 -0
  83. package/dist/src/sources/LocalFilesystemAdapter.helpers.js.map +1 -0
  84. package/dist/src/sources/LocalFilesystemAdapter.js +218 -159
  85. package/dist/src/sources/LocalFilesystemAdapter.js.map +1 -1
  86. package/dist/src/sources/LocalFilesystemAdapter.scan.d.ts +78 -0
  87. package/dist/src/sources/LocalFilesystemAdapter.scan.d.ts.map +1 -0
  88. package/dist/src/sources/LocalFilesystemAdapter.scan.js +118 -0
  89. package/dist/src/sources/LocalFilesystemAdapter.scan.js.map +1 -0
  90. package/dist/src/sources/index.d.ts +1 -1
  91. package/dist/src/sources/index.d.ts.map +1 -1
  92. package/dist/src/sources/index.js.map +1 -1
  93. package/dist/src/sources/types.d.ts +28 -0
  94. package/dist/src/sources/types.d.ts.map +1 -1
  95. package/dist/src/telemetry/tracer-imports.d.ts +13 -0
  96. package/dist/src/telemetry/tracer-imports.d.ts.map +1 -0
  97. package/dist/src/telemetry/tracer-imports.js +26 -0
  98. package/dist/src/telemetry/tracer-imports.js.map +1 -0
  99. package/dist/src/telemetry/tracer.d.ts.map +1 -1
  100. package/dist/src/telemetry/tracer.js +18 -21
  101. package/dist/src/telemetry/tracer.js.map +1 -1
  102. package/dist/src/utils/rate-limit.d.ts +39 -0
  103. package/dist/src/utils/rate-limit.d.ts.map +1 -0
  104. package/dist/src/utils/rate-limit.js +48 -0
  105. package/dist/src/utils/rate-limit.js.map +1 -0
  106. package/dist/src/utils/rate-limit.test.d.ts +11 -0
  107. package/dist/src/utils/rate-limit.test.d.ts.map +1 -0
  108. package/dist/src/utils/rate-limit.test.js +86 -0
  109. package/dist/src/utils/rate-limit.test.js.map +1 -0
  110. package/dist/src/webhooks/WebhookDeadLetterRepository.d.ts +178 -0
  111. package/dist/src/webhooks/WebhookDeadLetterRepository.d.ts.map +1 -0
  112. package/dist/src/webhooks/WebhookDeadLetterRepository.js +196 -0
  113. package/dist/src/webhooks/WebhookDeadLetterRepository.js.map +1 -0
  114. package/dist/src/webhooks/WebhookQueue.d.ts +1 -0
  115. package/dist/src/webhooks/WebhookQueue.d.ts.map +1 -1
  116. package/dist/src/webhooks/WebhookQueue.js +19 -0
  117. package/dist/src/webhooks/WebhookQueue.js.map +1 -1
  118. package/dist/src/webhooks/WebhookQueue.types.d.ts +11 -0
  119. package/dist/src/webhooks/WebhookQueue.types.d.ts.map +1 -1
  120. package/dist/src/webhooks/index.d.ts +1 -0
  121. package/dist/src/webhooks/index.d.ts.map +1 -1
  122. package/dist/src/webhooks/index.js +2 -0
  123. package/dist/src/webhooks/index.js.map +1 -1
  124. package/dist/tests/ActivationManager.test.d.ts +13 -0
  125. package/dist/tests/ActivationManager.test.d.ts.map +1 -0
  126. package/dist/tests/ActivationManager.test.js +218 -0
  127. package/dist/tests/ActivationManager.test.js.map +1 -0
  128. package/dist/tests/LocalFilesystemAdapter.coverage.test.d.ts +13 -0
  129. package/dist/tests/LocalFilesystemAdapter.coverage.test.d.ts.map +1 -0
  130. package/dist/tests/LocalFilesystemAdapter.coverage.test.js +314 -0
  131. package/dist/tests/LocalFilesystemAdapter.coverage.test.js.map +1 -0
  132. package/dist/tests/LocalFilesystemAdapter.security.test.d.ts +18 -0
  133. package/dist/tests/LocalFilesystemAdapter.security.test.d.ts.map +1 -0
  134. package/dist/tests/LocalFilesystemAdapter.security.test.js +344 -0
  135. package/dist/tests/LocalFilesystemAdapter.security.test.js.map +1 -0
  136. package/dist/tests/LocalFilesystemAdapter.test.d.ts +12 -0
  137. package/dist/tests/LocalFilesystemAdapter.test.d.ts.map +1 -0
  138. package/dist/tests/LocalFilesystemAdapter.test.js +301 -0
  139. package/dist/tests/LocalFilesystemAdapter.test.js.map +1 -0
  140. package/dist/tests/ROIDashboardService.coverage.test.d.ts +9 -0
  141. package/dist/tests/ROIDashboardService.coverage.test.d.ts.map +1 -0
  142. package/dist/tests/ROIDashboardService.coverage.test.js +118 -0
  143. package/dist/tests/ROIDashboardService.coverage.test.js.map +1 -0
  144. package/dist/tests/ROIDashboardService.test.js +87 -0
  145. package/dist/tests/ROIDashboardService.test.js.map +1 -1
  146. package/dist/tests/ScraperAdapters.gitlab-coverage.test.d.ts +14 -0
  147. package/dist/tests/ScraperAdapters.gitlab-coverage.test.d.ts.map +1 -0
  148. package/dist/tests/ScraperAdapters.gitlab-coverage.test.js +169 -0
  149. package/dist/tests/ScraperAdapters.gitlab-coverage.test.js.map +1 -0
  150. package/dist/tests/ScraperAdapters.test.d.ts +5 -1
  151. package/dist/tests/ScraperAdapters.test.d.ts.map +1 -1
  152. package/dist/tests/ScraperAdapters.test.js +6 -336
  153. package/dist/tests/ScraperAdapters.test.js.map +1 -1
  154. package/dist/tests/WebhookDeadLetterRepository.test.d.ts +2 -0
  155. package/dist/tests/WebhookDeadLetterRepository.test.d.ts.map +1 -0
  156. package/dist/tests/WebhookDeadLetterRepository.test.js +333 -0
  157. package/dist/tests/WebhookDeadLetterRepository.test.js.map +1 -0
  158. package/dist/tests/WebhookHandler.test.js +93 -1
  159. package/dist/tests/WebhookHandler.test.js.map +1 -1
  160. package/dist/tests/WebhookQueue.coverage.test.d.ts +19 -0
  161. package/dist/tests/WebhookQueue.coverage.test.d.ts.map +1 -0
  162. package/dist/tests/WebhookQueue.coverage.test.js +190 -0
  163. package/dist/tests/WebhookQueue.coverage.test.js.map +1 -0
  164. package/dist/tests/api/client.validation.test.js +37 -0
  165. package/dist/tests/api/client.validation.test.js.map +1 -1
  166. package/dist/tests/billing/GDPRCompliance.test.d.ts +2 -2
  167. package/dist/tests/billing/GDPRCompliance.test.js +221 -36
  168. package/dist/tests/billing/GDPRCompliance.test.js.map +1 -1
  169. package/dist/tests/telemetry.test.js +126 -0
  170. package/dist/tests/telemetry.test.js.map +1 -1
  171. package/dist/tests/webhooks/WebhookDeadLetterRepository.test.d.ts +10 -0
  172. package/dist/tests/webhooks/WebhookDeadLetterRepository.test.d.ts.map +1 -0
  173. package/dist/tests/webhooks/WebhookDeadLetterRepository.test.js +109 -0
  174. package/dist/tests/webhooks/WebhookDeadLetterRepository.test.js.map +1 -0
  175. package/package.json +9 -5
@@ -0,0 +1,405 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { GDPRComplianceService } from './GDPRComplianceService.js';
3
+ function makeStmt(opts) {
4
+ return {
5
+ all: vi.fn().mockReturnValue(opts.allResult ?? []),
6
+ get: vi.fn().mockReturnValue(opts.getResult),
7
+ run: vi.fn().mockReturnValue(opts.runResult ?? { changes: 0, lastInsertRowid: 0 }),
8
+ iterate: vi.fn(),
9
+ finalize: vi.fn(),
10
+ bind: vi.fn(),
11
+ };
12
+ }
13
+ function makeMockDb() {
14
+ return {
15
+ prepare: vi.fn(),
16
+ exec: vi.fn(),
17
+ transaction: vi.fn(),
18
+ pragma: vi.fn(),
19
+ close: vi.fn(),
20
+ open: true,
21
+ name: ':memory:',
22
+ memory: true,
23
+ readonly: false,
24
+ };
25
+ }
26
+ function makeMockStripe(deletesFn = vi.fn().mockResolvedValue({})) {
27
+ return {
28
+ getStripeInstance: vi.fn().mockReturnValue({
29
+ customers: { del: deletesFn },
30
+ }),
31
+ };
32
+ }
33
+ // ---------------------------------------------------------------------------
34
+ // Fixture data
35
+ // ---------------------------------------------------------------------------
36
+ const CUSTOMER_ID = 'user-abc-123';
37
+ const STRIPE_CUSTOMER_ID = 'cus_stripe123';
38
+ const SUB_ID = 'sub-001';
39
+ const SUB_ROW = {
40
+ id: SUB_ID,
41
+ stripeSubscriptionId: 'stripe-sub-001',
42
+ tier: 'individual',
43
+ status: 'active',
44
+ seatCount: 1,
45
+ currentPeriodStart: '2026-01-01T00:00:00Z',
46
+ currentPeriodEnd: '2026-02-01T00:00:00Z',
47
+ canceledAt: null,
48
+ createdAt: '2026-01-01T00:00:00Z',
49
+ updatedAt: '2026-01-01T00:00:00Z',
50
+ };
51
+ const INVOICE_ROW = {
52
+ id: 'inv-001',
53
+ stripeInvoiceId: 'in_stripe001',
54
+ amountCents: 999,
55
+ currency: 'cad',
56
+ status: 'paid',
57
+ invoiceNumber: 'INV-001',
58
+ paidAt: '2026-01-05T00:00:00Z',
59
+ periodStart: '2026-01-01T00:00:00Z',
60
+ periodEnd: '2026-02-01T00:00:00Z',
61
+ createdAt: '2026-01-01T00:00:00Z',
62
+ };
63
+ const LICENSE_DB_ROW = {
64
+ id: 'key-001',
65
+ keyExpiry: '2027-01-01T00:00:00Z',
66
+ isActive: 1,
67
+ generatedAt: '2026-01-01T00:00:00Z',
68
+ revokedAt: null,
69
+ revocationReason: null,
70
+ };
71
+ const WEBHOOK_DB_ROW = {
72
+ id: 'wh-001',
73
+ stripeEventId: 'evt_001',
74
+ eventType: 'customer.subscription.created',
75
+ processedAt: '2026-01-01T00:00:00Z',
76
+ success: 1,
77
+ };
78
+ // ---------------------------------------------------------------------------
79
+ // exportCustomerData
80
+ // ---------------------------------------------------------------------------
81
+ describe('GDPRComplianceService.exportCustomerData', () => {
82
+ let db;
83
+ beforeEach(() => {
84
+ db = makeMockDb();
85
+ });
86
+ function setupFullExport() {
87
+ db.prepare
88
+ // exportSubscriptions
89
+ .mockReturnValueOnce(makeStmt({ allResult: [SUB_ROW] }))
90
+ // exportInvoices
91
+ .mockReturnValueOnce(makeStmt({ allResult: [INVOICE_ROW] }))
92
+ // exportLicenseKeys: fetch subscription IDs
93
+ .mockReturnValueOnce(makeStmt({ allResult: [{ id: SUB_ID }] }))
94
+ // exportLicenseKeys: fetch keys
95
+ .mockReturnValueOnce(makeStmt({ allResult: [LICENSE_DB_ROW] }))
96
+ // exportWebhookEvents: fetch stripe customer ID
97
+ .mockReturnValueOnce(makeStmt({ getResult: { stripe_customer_id: STRIPE_CUSTOMER_ID } }))
98
+ // exportWebhookEvents: fetch events
99
+ .mockReturnValueOnce(makeStmt({ allResult: [WEBHOOK_DB_ROW] }));
100
+ }
101
+ it('returns metadata with the correct customer ID, format, and version', () => {
102
+ setupFullExport();
103
+ const service = new GDPRComplianceService({ db });
104
+ const result = service.exportCustomerData(CUSTOMER_ID);
105
+ expect(result.metadata.customerId).toBe(CUSTOMER_ID);
106
+ expect(result.metadata.format).toBe('json');
107
+ expect(result.metadata.version).toBe('1.0');
108
+ expect(result.metadata.exportedAt).toMatch(/^\d{4}-\d{2}-\d{2}T/);
109
+ });
110
+ it('returns subscriptions with all fields mapped', () => {
111
+ setupFullExport();
112
+ const service = new GDPRComplianceService({ db });
113
+ const result = service.exportCustomerData(CUSTOMER_ID);
114
+ expect(result.subscriptions).toHaveLength(1);
115
+ expect(result.subscriptions[0]).toMatchObject({
116
+ id: SUB_ID,
117
+ tier: 'individual',
118
+ status: 'active',
119
+ });
120
+ });
121
+ it('defaults seatCount to 1 when the database row returns null', () => {
122
+ db.prepare
123
+ .mockReturnValueOnce(makeStmt({ allResult: [{ ...SUB_ROW, seatCount: null }] }))
124
+ .mockReturnValueOnce(makeStmt({ allResult: [] }))
125
+ .mockReturnValueOnce(makeStmt({ allResult: [] }))
126
+ .mockReturnValueOnce(makeStmt({ getResult: undefined }));
127
+ const service = new GDPRComplianceService({ db });
128
+ const result = service.exportCustomerData(CUSTOMER_ID);
129
+ expect(result.subscriptions[0]?.seatCount).toBe(1);
130
+ });
131
+ it('returns invoices with all fields mapped', () => {
132
+ setupFullExport();
133
+ const service = new GDPRComplianceService({ db });
134
+ const result = service.exportCustomerData(CUSTOMER_ID);
135
+ expect(result.invoices).toHaveLength(1);
136
+ expect(result.invoices[0]).toMatchObject({ id: 'inv-001', amountCents: 999, currency: 'cad' });
137
+ });
138
+ it('converts isActive integer to boolean in license key export', () => {
139
+ setupFullExport();
140
+ const service = new GDPRComplianceService({ db });
141
+ const result = service.exportCustomerData(CUSTOMER_ID);
142
+ const key = result.licenseKeys[0];
143
+ expect(typeof key.isActive).toBe('boolean');
144
+ expect(key.isActive).toBe(true);
145
+ });
146
+ it('converts success integer to boolean in webhook event export', () => {
147
+ setupFullExport();
148
+ const service = new GDPRComplianceService({ db });
149
+ const result = service.exportCustomerData(CUSTOMER_ID);
150
+ const event = result.webhookEvents[0];
151
+ expect(typeof event.success).toBe('boolean');
152
+ expect(event.success).toBe(true);
153
+ });
154
+ it('returns empty licenseKeys when the customer has no subscriptions', () => {
155
+ db.prepare
156
+ .mockReturnValueOnce(makeStmt({ allResult: [] })) // exportSubscriptions
157
+ .mockReturnValueOnce(makeStmt({ allResult: [] })) // exportInvoices
158
+ .mockReturnValueOnce(makeStmt({ allResult: [] })) // exportLicenseKeys: sub IDs → empty
159
+ .mockReturnValueOnce(makeStmt({ getResult: undefined })); // exportWebhookEvents: no stripe ID
160
+ const service = new GDPRComplianceService({ db });
161
+ const result = service.exportCustomerData(CUSTOMER_ID);
162
+ expect(result.licenseKeys).toEqual([]);
163
+ });
164
+ it('returns empty webhookEvents when there is no Stripe customer ID', () => {
165
+ db.prepare
166
+ .mockReturnValueOnce(makeStmt({ allResult: [SUB_ROW] }))
167
+ .mockReturnValueOnce(makeStmt({ allResult: [INVOICE_ROW] }))
168
+ .mockReturnValueOnce(makeStmt({ allResult: [{ id: SUB_ID }] }))
169
+ .mockReturnValueOnce(makeStmt({ allResult: [LICENSE_DB_ROW] }))
170
+ .mockReturnValueOnce(makeStmt({ getResult: undefined })); // no Stripe customer
171
+ const service = new GDPRComplianceService({ db });
172
+ const result = service.exportCustomerData(CUSTOMER_ID);
173
+ expect(result.webhookEvents).toEqual([]);
174
+ });
175
+ it('returns all four empty arrays for a customer with no data', () => {
176
+ db.prepare
177
+ .mockReturnValueOnce(makeStmt({ allResult: [] })) // subscriptions
178
+ .mockReturnValueOnce(makeStmt({ allResult: [] })) // invoices
179
+ .mockReturnValueOnce(makeStmt({ allResult: [] })) // sub IDs → empty
180
+ .mockReturnValueOnce(makeStmt({ getResult: undefined })); // no Stripe customer
181
+ const service = new GDPRComplianceService({ db });
182
+ const result = service.exportCustomerData(CUSTOMER_ID);
183
+ expect(result.subscriptions).toEqual([]);
184
+ expect(result.invoices).toEqual([]);
185
+ expect(result.licenseKeys).toEqual([]);
186
+ expect(result.webhookEvents).toEqual([]);
187
+ });
188
+ });
189
+ // ---------------------------------------------------------------------------
190
+ // deleteCustomerData
191
+ // ---------------------------------------------------------------------------
192
+ describe('GDPRComplianceService.deleteCustomerData', () => {
193
+ let db;
194
+ beforeEach(() => {
195
+ db = makeMockDb();
196
+ });
197
+ function setupLiveDeletion(stripeId = STRIPE_CUSTOMER_ID) {
198
+ db.prepare
199
+ // Stripe customer ID lookup (before transaction)
200
+ .mockReturnValueOnce(makeStmt({ getResult: { stripe_customer_id: stripeId } }))
201
+ // Sub IDs for license key deletion
202
+ .mockReturnValueOnce(makeStmt({ allResult: [{ id: SUB_ID }] }))
203
+ // DELETE license_keys
204
+ .mockReturnValueOnce(makeStmt({ runResult: { changes: 2, lastInsertRowid: 0 } }))
205
+ // DELETE invoices
206
+ .mockReturnValueOnce(makeStmt({ runResult: { changes: 3, lastInsertRowid: 0 } }))
207
+ // DELETE stripe_webhook_events
208
+ .mockReturnValueOnce(makeStmt({ runResult: { changes: 1, lastInsertRowid: 0 } }))
209
+ // DELETE user_subscriptions
210
+ .mockReturnValueOnce(makeStmt({ runResult: { changes: 1, lastInsertRowid: 0 } }));
211
+ }
212
+ it('returns success=true with correct deletion counts', async () => {
213
+ setupLiveDeletion();
214
+ const service = new GDPRComplianceService({ db });
215
+ const result = await service.deleteCustomerData(CUSTOMER_ID);
216
+ expect(result.success).toBe(true);
217
+ expect(result.customerId).toBe(CUSTOMER_ID);
218
+ expect(result.counts.licenseKeys).toBe(2);
219
+ expect(result.counts.invoices).toBe(3);
220
+ expect(result.counts.webhookEvents).toBe(1);
221
+ expect(result.counts.subscriptions).toBe(1);
222
+ expect(result.errors).toEqual([]);
223
+ });
224
+ it('wraps deletion in a transaction (BEGIN and COMMIT are called)', async () => {
225
+ setupLiveDeletion();
226
+ const service = new GDPRComplianceService({ db });
227
+ await service.deleteCustomerData(CUSTOMER_ID);
228
+ expect(db.exec).toHaveBeenCalledWith('BEGIN TRANSACTION');
229
+ expect(db.exec).toHaveBeenCalledWith('COMMIT');
230
+ });
231
+ it('rolls back and reports an error when a database operation throws', async () => {
232
+ db.prepare
233
+ .mockReturnValueOnce(makeStmt({ getResult: { stripe_customer_id: STRIPE_CUSTOMER_ID } }))
234
+ .mockReturnValueOnce(makeStmt({ allResult: [{ id: SUB_ID }] }))
235
+ .mockReturnValueOnce({
236
+ ...makeStmt({}),
237
+ run: vi.fn().mockImplementation(() => {
238
+ throw new Error('disk I/O error');
239
+ }),
240
+ });
241
+ const service = new GDPRComplianceService({ db });
242
+ const result = await service.deleteCustomerData(CUSTOMER_ID);
243
+ expect(result.success).toBe(false);
244
+ expect(result.errors[0]).toContain('disk I/O error');
245
+ expect(db.exec).toHaveBeenCalledWith('ROLLBACK');
246
+ });
247
+ it('skips license key deletion when the customer has no subscriptions', async () => {
248
+ db.prepare
249
+ .mockReturnValueOnce(makeStmt({ getResult: { stripe_customer_id: STRIPE_CUSTOMER_ID } }))
250
+ .mockReturnValueOnce(makeStmt({ allResult: [] })) // no sub IDs
251
+ .mockReturnValueOnce(makeStmt({ runResult: { changes: 0, lastInsertRowid: 0 } })) // invoices
252
+ .mockReturnValueOnce(makeStmt({ runResult: { changes: 1, lastInsertRowid: 0 } })) // webhook events
253
+ .mockReturnValueOnce(makeStmt({ runResult: { changes: 0, lastInsertRowid: 0 } })); // subscriptions
254
+ const service = new GDPRComplianceService({ db });
255
+ const result = await service.deleteCustomerData(CUSTOMER_ID);
256
+ expect(result.success).toBe(true);
257
+ expect(result.counts.licenseKeys).toBe(0);
258
+ });
259
+ it('skips webhook event deletion when there is no Stripe customer ID', async () => {
260
+ db.prepare
261
+ .mockReturnValueOnce(makeStmt({ getResult: undefined })) // no stripe ID
262
+ .mockReturnValueOnce(makeStmt({ allResult: [] })) // sub IDs
263
+ .mockReturnValueOnce(makeStmt({ runResult: { changes: 0, lastInsertRowid: 0 } })) // invoices
264
+ .mockReturnValueOnce(makeStmt({ runResult: { changes: 0, lastInsertRowid: 0 } })); // subscriptions
265
+ const service = new GDPRComplianceService({ db });
266
+ const result = await service.deleteCustomerData(CUSTOMER_ID);
267
+ expect(result.counts.webhookEvents).toBe(0);
268
+ });
269
+ it('calls Stripe customer deletion when deleteFromStripe is true (default)', async () => {
270
+ setupLiveDeletion();
271
+ const stripeDel = vi.fn().mockResolvedValue({});
272
+ const service = new GDPRComplianceService({
273
+ db,
274
+ stripeClient: makeMockStripe(stripeDel),
275
+ });
276
+ await service.deleteCustomerData(CUSTOMER_ID);
277
+ expect(stripeDel).toHaveBeenCalledWith(STRIPE_CUSTOMER_ID);
278
+ });
279
+ it('sets stripeDeleted=true after a successful Stripe deletion', async () => {
280
+ setupLiveDeletion();
281
+ const service = new GDPRComplianceService({
282
+ db,
283
+ stripeClient: makeMockStripe(),
284
+ });
285
+ const result = await service.deleteCustomerData(CUSTOMER_ID);
286
+ expect(result.stripeDeleted).toBe(true);
287
+ });
288
+ it('does not call Stripe deletion when deleteFromStripe is false', async () => {
289
+ setupLiveDeletion();
290
+ const stripeDel = vi.fn();
291
+ const service = new GDPRComplianceService({
292
+ db,
293
+ stripeClient: makeMockStripe(stripeDel),
294
+ });
295
+ await service.deleteCustomerData(CUSTOMER_ID, { deleteFromStripe: false });
296
+ expect(stripeDel).not.toHaveBeenCalled();
297
+ });
298
+ it('adds a Stripe error to errors without failing the db deletion', async () => {
299
+ setupLiveDeletion();
300
+ const service = new GDPRComplianceService({
301
+ db,
302
+ stripeClient: makeMockStripe(vi.fn().mockRejectedValue(new Error('Stripe unavailable'))),
303
+ });
304
+ const result = await service.deleteCustomerData(CUSTOMER_ID);
305
+ expect(result.errors).toHaveLength(1);
306
+ expect(result.errors[0]).toContain('Stripe unavailable');
307
+ expect(result.stripeDeleted).toBe(false);
308
+ });
309
+ describe('dryRun mode', () => {
310
+ function setupDryRun(stripeId = STRIPE_CUSTOMER_ID) {
311
+ db.prepare
312
+ .mockReturnValueOnce(makeStmt({ getResult: { stripe_customer_id: stripeId } }))
313
+ // sub IDs
314
+ .mockReturnValueOnce(makeStmt({ allResult: [{ id: SUB_ID }] }))
315
+ // COUNT license_keys
316
+ .mockReturnValueOnce(makeStmt({ getResult: { count: 2 } }))
317
+ // COUNT invoices
318
+ .mockReturnValueOnce(makeStmt({ getResult: { count: 3 } }))
319
+ // COUNT stripe_webhook_events
320
+ .mockReturnValueOnce(makeStmt({ getResult: { count: 1 } }))
321
+ // COUNT user_subscriptions
322
+ .mockReturnValueOnce(makeStmt({ getResult: { count: 1 } }));
323
+ }
324
+ it('returns counts without executing any DELETE statements', async () => {
325
+ setupDryRun();
326
+ const service = new GDPRComplianceService({ db });
327
+ const result = await service.deleteCustomerData(CUSTOMER_ID, { dryRun: true });
328
+ expect(result.counts.licenseKeys).toBe(2);
329
+ expect(result.counts.invoices).toBe(3);
330
+ expect(result.counts.webhookEvents).toBe(1);
331
+ expect(result.counts.subscriptions).toBe(1);
332
+ });
333
+ it('does not call BEGIN TRANSACTION or COMMIT in dry run', async () => {
334
+ setupDryRun();
335
+ const service = new GDPRComplianceService({ db });
336
+ await service.deleteCustomerData(CUSTOMER_ID, { dryRun: true });
337
+ expect(db.exec).not.toHaveBeenCalled();
338
+ });
339
+ it('does not call Stripe deletion in dry run', async () => {
340
+ setupDryRun();
341
+ const stripeDel = vi.fn();
342
+ const service = new GDPRComplianceService({
343
+ db,
344
+ stripeClient: makeMockStripe(stripeDel),
345
+ });
346
+ await service.deleteCustomerData(CUSTOMER_ID, { dryRun: true });
347
+ expect(stripeDel).not.toHaveBeenCalled();
348
+ });
349
+ it('returns success=true with no errors in dry run', async () => {
350
+ setupDryRun();
351
+ const service = new GDPRComplianceService({ db });
352
+ const result = await service.deleteCustomerData(CUSTOMER_ID, { dryRun: true });
353
+ expect(result.success).toBe(true);
354
+ expect(result.errors).toEqual([]);
355
+ });
356
+ });
357
+ });
358
+ // ---------------------------------------------------------------------------
359
+ // hasCustomerData
360
+ // ---------------------------------------------------------------------------
361
+ describe('GDPRComplianceService.hasCustomerData', () => {
362
+ it('returns true when a subscription row exists', () => {
363
+ const db = makeMockDb();
364
+ db.prepare.mockReturnValueOnce(makeStmt({ getResult: { id: SUB_ID } }));
365
+ const service = new GDPRComplianceService({ db });
366
+ expect(service.hasCustomerData(CUSTOMER_ID)).toBe(true);
367
+ });
368
+ it('returns false when no subscription row exists', () => {
369
+ const db = makeMockDb();
370
+ db.prepare.mockReturnValueOnce(makeStmt({ getResult: undefined }));
371
+ const service = new GDPRComplianceService({ db });
372
+ expect(service.hasCustomerData(CUSTOMER_ID)).toBe(false);
373
+ });
374
+ });
375
+ // ---------------------------------------------------------------------------
376
+ // getDataSummary
377
+ // ---------------------------------------------------------------------------
378
+ describe('GDPRComplianceService.getDataSummary', () => {
379
+ it('returns zeroed summary for a customer with no subscription', () => {
380
+ const db = makeMockDb();
381
+ db.prepare.mockReturnValueOnce(makeStmt({ getResult: undefined }));
382
+ const service = new GDPRComplianceService({ db });
383
+ const summary = service.getDataSummary(CUSTOMER_ID);
384
+ expect(summary).toEqual({
385
+ hasSubscription: false,
386
+ invoiceCount: 0,
387
+ licenseKeyCount: 0,
388
+ stripeCustomerId: null,
389
+ });
390
+ });
391
+ it('returns correct counts and Stripe customer ID for an existing customer', () => {
392
+ const db = makeMockDb();
393
+ db.prepare
394
+ .mockReturnValueOnce(makeStmt({ getResult: { id: SUB_ID, stripe_customer_id: STRIPE_CUSTOMER_ID } }))
395
+ .mockReturnValueOnce(makeStmt({ getResult: { count: 4 } })) // invoice count
396
+ .mockReturnValueOnce(makeStmt({ getResult: { count: 2 } })); // license key count
397
+ const service = new GDPRComplianceService({ db });
398
+ const summary = service.getDataSummary(CUSTOMER_ID);
399
+ expect(summary.hasSubscription).toBe(true);
400
+ expect(summary.invoiceCount).toBe(4);
401
+ expect(summary.licenseKeyCount).toBe(2);
402
+ expect(summary.stripeCustomerId).toBe(STRIPE_CUSTOMER_ID);
403
+ });
404
+ });
405
+ //# sourceMappingURL=GDPRComplianceService.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GDPRComplianceService.test.js","sourceRoot":"","sources":["../../../src/billing/GDPRComplianceService.test.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * @skillsmith/core - Core functionality for skill discovery
3
3
  */
4
- export declare const VERSION = "0.5.1";
4
+ export declare const VERSION = "0.5.4";
5
5
  export * from './exports/services.js';
6
6
  export * from './exports/repositories.js';
7
7
  export { createDatabaseSync, createDatabaseAsync } from './db/createDatabase.js';
@@ -21,8 +21,9 @@ export { RateLimiter, InMemoryRateLimitStorage, createRateLimiterFromPreset, RAT
21
21
  export { AuditLogger, MIN_RETENTION_DAYS, MAX_RETENTION_DAYS } from './security/AuditLogger.js';
22
22
  export { emitInstallEvent } from './audit/remote-audit.js';
23
23
  export type { InstallEventPayload } from './audit/remote-audit.js';
24
- export { BaseSourceAdapter, SourceAdapterRegistry, SourceIndexer, defaultRegistry, isSourceAdapter, } from './sources/index.js';
25
- export type { ISourceAdapter, SourceType, SourceConfig, RateLimitConfig as SourceRateLimitConfig, SourceAuthConfig, SourceLocation, SourceRepository, SkillContent, SourceSearchOptions, SourceSearchResult, SkillIndexResult, BatchIndexResult, SourceHealth, SourceAdapterFactory, RegistryStats, ParsedSkillMetadata as SourceParsedSkillMetadata, ISkillParser, ISkillRepository, SourceIndexerOptions, } from './sources/index.js';
24
+ export { BaseSourceAdapter, SourceAdapterRegistry, SourceIndexer, defaultRegistry, isSourceAdapter, LocalFilesystemAdapter, createLocalFilesystemAdapter, } from './sources/index.js';
25
+ export type { LocalFilesystemConfig } from './sources/index.js';
26
+ export type { ISourceAdapter, SourceType, SourceConfig, RateLimitConfig as SourceRateLimitConfig, SourceAuthConfig, SourceLocation, SourceRepository, SkillContent, SourceSearchOptions, SourceSearchResult, SkillIndexResult, BatchIndexResult, SourceHealth, AdapterError, SourceAdapterFactory, RegistryStats, ParsedSkillMetadata as SourceParsedSkillMetadata, ISkillParser, ISkillRepository, SourceIndexerOptions, } from './sources/index.js';
26
27
  export { loadConfig, saveConfig, getApiKey, getApiBaseUrl, getConfigDir, getConfigPath, ensureConfigDir, isDebugEnabled, isTelemetryEnabled, isValidApiKeyFormat, storeApiKey, clearApiKey, getAuthStatus, type SkillsmithConfig, } from './config/index.js';
27
28
  export { checkForUpdates, formatUpdateNotification, type VersionCheckResult, } from './utils/version-check.js';
28
29
  export { parseRepoUrl, isGitHubUrl, type ParsedRepoUrl } from './utils/github-url.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,OAAO,UAAU,CAAA;AAO9B,cAAc,uBAAuB,CAAA;AAGrC,cAAc,2BAA2B,CAAA;AAMzC,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAChF,YAAY,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAG1D,cAAc,oBAAoB,CAAA;AAOlC,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,QAAQ,EACR,WAAW,EACX,cAAc,EACd,WAAW,EACX,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGhD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAGhE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAGrD,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,UAAU,EACV,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,eAAe,IAAI,iBAAiB,EACpC,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,UAAU,EACV,kBAAkB,EAClB,SAAS,EACT,eAAe,EACf,iBAAiB,GAClB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,aAAa,EAEb,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,MAAM,EACN,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAEf,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EAEvB,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,cAAc,GACf,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EAEnB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,GACb,MAAM,sBAAsB,CAAA;AAG7B,OAAO,EACL,WAAW,EACX,wBAAwB,EACxB,2BAA2B,EAC3B,kBAAkB,EAClB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,qBAAqB,CAAA;AAG5B,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAG/F,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAGlE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,eAAe,EACf,eAAe,GAChB,MAAM,oBAAoB,CAAA;AAE3B,YAAY,EACV,cAAc,EACd,UAAU,EACV,YAAY,EACZ,eAAe,IAAI,qBAAqB,EACxC,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,mBAAmB,IAAI,yBAAyB,EAChD,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,YAAY,EACZ,aAAa,EACb,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,WAAW,EACX,WAAW,EACX,aAAa,EACb,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAA;AAG1B,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,KAAK,kBAAkB,GACxB,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGrF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAG/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAC7D,YAAY,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/dist/src/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * @skillsmith/core - Core functionality for skill discovery
3
3
  */
4
4
  // Version
5
- export const VERSION = '0.5.1';
5
+ export const VERSION = '0.5.4';
6
6
  // ============================================================================
7
7
  // Grouped Exports from Barrel Files
8
8
  // ============================================================================
@@ -55,7 +55,7 @@ export { AuditLogger, MIN_RETENTION_DAYS, MAX_RETENTION_DAYS } from './security/
55
55
  // Remote telemetry for install events (SMI-4182)
56
56
  export { emitInstallEvent } from './audit/remote-audit.js';
57
57
  // Source Adapters (SMI-589)
58
- export { BaseSourceAdapter, SourceAdapterRegistry, SourceIndexer, defaultRegistry, isSourceAdapter, } from './sources/index.js';
58
+ export { BaseSourceAdapter, SourceAdapterRegistry, SourceIndexer, defaultRegistry, isSourceAdapter, LocalFilesystemAdapter, createLocalFilesystemAdapter, } from './sources/index.js';
59
59
  // Configuration (SMI-1851, SMI-2714)
60
60
  export { loadConfig, saveConfig, getApiKey, getApiBaseUrl, getConfigDir, getConfigPath, ensureConfigDir, isDebugEnabled, isTelemetryEnabled, isValidApiKeyFormat, storeApiKey, clearApiKey, getAuthStatus, } from './config/index.js';
61
61
  // Version Check (SMI-1952)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * SMI-4285: SkillParser coverage gaps — type-validation branches + unicode.
3
+ *
4
+ * Lives in a sidecar (not SkillParser.test.ts) to stay under the 500-line gate.
5
+ * Split rationale: these tests exercise boundary behaviors — YAML-parser bypass
6
+ * (direct validate() calls with typed-wrong objects) and non-ASCII inputs —
7
+ * that are orthogonal to the main suite's functional coverage.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=SkillParser.coverage.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillParser.coverage.test.d.ts","sourceRoot":"","sources":["../../../src/indexer/SkillParser.coverage.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * SMI-4285: SkillParser coverage gaps — type-validation branches + unicode.
3
+ *
4
+ * Lives in a sidecar (not SkillParser.test.ts) to stay under the 500-line gate.
5
+ * Split rationale: these tests exercise boundary behaviors — YAML-parser bypass
6
+ * (direct validate() calls with typed-wrong objects) and non-ASCII inputs —
7
+ * that are orthogonal to the main suite's functional coverage.
8
+ */
9
+ import { describe, it, expect } from 'vitest';
10
+ import SkillParser from './SkillParser.js';
11
+ function makeSkillMd(frontmatter, body = '# My Skill\n\nDoes things.') {
12
+ return `---\n${frontmatter}\n---\n\n${body}`;
13
+ }
14
+ // ---------------------------------------------------------------------------
15
+ // Unicode coverage — description and tags (name is covered in SkillParser.test.ts)
16
+ // ---------------------------------------------------------------------------
17
+ describe('SkillParser.extractFrontmatter — unicode', () => {
18
+ const parser = new SkillParser();
19
+ it('preserves unicode characters in description values', () => {
20
+ const result = parser.extractFrontmatter(makeSkillMd('name: x\ndescription: "これはスキル"'));
21
+ expect(result?.description).toBe('これはスキル');
22
+ });
23
+ it('preserves unicode characters in tag values', () => {
24
+ const result = parser.extractFrontmatter(makeSkillMd('name: x\ntags:\n - 日本語\n - 中文\n - ไทย'));
25
+ expect(result?.tags).toEqual(['日本語', '中文', 'ไทย']);
26
+ });
27
+ });
28
+ // ---------------------------------------------------------------------------
29
+ // validate() type-validation branches
30
+ //
31
+ // These cannot be reached via extractFrontmatter — the YAML parser coerces
32
+ // scalars (e.g. `name: 123` becomes the string "123" via the String(parsed.name)
33
+ // call at SkillParser.ts:264-266). Call validate() directly with a typed-wrong
34
+ // object to exercise the `typeof !== 'string'` branches at SkillParser.ts:291-309.
35
+ // ---------------------------------------------------------------------------
36
+ describe('SkillParser.validate — type-validation branches', () => {
37
+ const parser = new SkillParser();
38
+ it('errors when name is not a string', () => {
39
+ const result = parser.validate({ name: 123 });
40
+ expect(result.valid).toBe(false);
41
+ expect(result.errors).toContain('Field "name" must be a string');
42
+ });
43
+ it('errors when description is not a string', () => {
44
+ const result = parser.validate({
45
+ name: 'x',
46
+ description: 123,
47
+ });
48
+ expect(result.valid).toBe(false);
49
+ expect(result.errors).toContain('Field "description" must be a string');
50
+ });
51
+ it('errors when author is not a string', () => {
52
+ const result = parser.validate({
53
+ name: 'x',
54
+ author: true,
55
+ });
56
+ expect(result.valid).toBe(false);
57
+ expect(result.errors).toContain('Field "author" must be a string');
58
+ });
59
+ it('errors when version is not a string', () => {
60
+ const result = parser.validate({
61
+ name: 'x',
62
+ version: ['1', '0', '0'],
63
+ });
64
+ expect(result.valid).toBe(false);
65
+ expect(result.errors).toContain('Field "version" must be a string');
66
+ });
67
+ it('errors when tags is not an array', () => {
68
+ const result = parser.validate({
69
+ name: 'x',
70
+ tags: 'typescript,testing',
71
+ });
72
+ expect(result.valid).toBe(false);
73
+ expect(result.errors).toContain('Field "tags" must be an array');
74
+ });
75
+ });
76
+ //# sourceMappingURL=SkillParser.coverage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillParser.coverage.test.js","sourceRoot":"","sources":["../../../src/indexer/SkillParser.coverage.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SkillParser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillParser.test.d.ts","sourceRoot":"","sources":["../../../src/indexer/SkillParser.test.ts"],"names":[],"mappings":""}