@skillsmith/core 0.4.9 → 0.4.11

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 (197) hide show
  1. package/README.md +1 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/analysis/__tests__/incremental.test.d.ts +1 -1
  4. package/dist/src/analysis/__tests__/incremental.test.js +1 -1
  5. package/dist/src/analysis/__tests__/integration.test.d.ts +1 -1
  6. package/dist/src/analysis/__tests__/integration.test.js +1 -1
  7. package/dist/src/analysis/__tests__/performance.test.d.ts +1 -1
  8. package/dist/src/analysis/__tests__/performance.test.js +1 -1
  9. package/dist/src/analysis/adapters/__tests__/python.test.d.ts +1 -1
  10. package/dist/src/analysis/adapters/__tests__/python.test.js +1 -1
  11. package/dist/src/analysis/adapters/__tests__/typescript.test.d.ts +1 -1
  12. package/dist/src/analysis/adapters/__tests__/typescript.test.js +1 -1
  13. package/dist/src/analysis/adapters/base.d.ts +1 -1
  14. package/dist/src/analysis/adapters/base.js +1 -1
  15. package/dist/src/analysis/adapters/factory.d.ts +1 -1
  16. package/dist/src/analysis/adapters/factory.js +1 -1
  17. package/dist/src/analysis/adapters/go.d.ts +1 -1
  18. package/dist/src/analysis/adapters/go.js +1 -1
  19. package/dist/src/analysis/adapters/index.d.ts +1 -1
  20. package/dist/src/analysis/adapters/index.js +1 -1
  21. package/dist/src/analysis/adapters/java-parsers.d.ts +1 -1
  22. package/dist/src/analysis/adapters/java-parsers.d.ts.map +1 -1
  23. package/dist/src/analysis/adapters/java-parsers.js +10 -3
  24. package/dist/src/analysis/adapters/java-parsers.js.map +1 -1
  25. package/dist/src/analysis/adapters/java.d.ts +1 -1
  26. package/dist/src/analysis/adapters/java.js +1 -1
  27. package/dist/src/analysis/adapters/python-frameworks.d.ts +1 -1
  28. package/dist/src/analysis/adapters/python-frameworks.js +1 -1
  29. package/dist/src/analysis/adapters/python.d.ts +1 -1
  30. package/dist/src/analysis/adapters/python.js +1 -1
  31. package/dist/src/analysis/adapters/rust-parsers.d.ts +1 -1
  32. package/dist/src/analysis/adapters/rust-parsers.js +1 -1
  33. package/dist/src/analysis/adapters/rust.d.ts +1 -1
  34. package/dist/src/analysis/adapters/rust.js +1 -1
  35. package/dist/src/analysis/adapters/typescript.d.ts +1 -1
  36. package/dist/src/analysis/adapters/typescript.js +1 -1
  37. package/dist/src/analysis/aggregator.d.ts +1 -1
  38. package/dist/src/analysis/aggregator.js +1 -1
  39. package/dist/src/analysis/cache.d.ts +1 -1
  40. package/dist/src/analysis/cache.js +1 -1
  41. package/dist/src/analysis/file-streamer.d.ts +1 -1
  42. package/dist/src/analysis/file-streamer.js +1 -1
  43. package/dist/src/analysis/incremental-parser.d.ts +1 -1
  44. package/dist/src/analysis/incremental-parser.js +1 -1
  45. package/dist/src/analysis/incremental.d.ts +1 -1
  46. package/dist/src/analysis/incremental.js +1 -1
  47. package/dist/src/analysis/index.d.ts +1 -1
  48. package/dist/src/analysis/index.js +1 -1
  49. package/dist/src/analysis/language-detector.d.ts +1 -1
  50. package/dist/src/analysis/language-detector.js +1 -1
  51. package/dist/src/analysis/memory-monitor.d.ts +1 -1
  52. package/dist/src/analysis/memory-monitor.js +1 -1
  53. package/dist/src/analysis/metrics.d.ts +1 -1
  54. package/dist/src/analysis/metrics.js +1 -1
  55. package/dist/src/analysis/router.d.ts +1 -1
  56. package/dist/src/analysis/router.js +1 -1
  57. package/dist/src/analysis/tree-cache.d.ts +1 -1
  58. package/dist/src/analysis/tree-cache.js +1 -1
  59. package/dist/src/analysis/tree-sitter/manager.d.ts +1 -1
  60. package/dist/src/analysis/tree-sitter/manager.js +1 -1
  61. package/dist/src/analysis/types.d.ts +1 -1
  62. package/dist/src/analysis/types.js +1 -1
  63. package/dist/src/analysis/worker-pool.d.ts +1 -1
  64. package/dist/src/analysis/worker-pool.js +1 -1
  65. package/dist/src/analysis/worker-types.d.ts +1 -1
  66. package/dist/src/analysis/worker-types.js +1 -1
  67. package/dist/src/analysis/worker-utils.d.ts +1 -1
  68. package/dist/src/analysis/worker-utils.js +1 -1
  69. package/dist/src/api/client.d.ts +1 -0
  70. package/dist/src/api/client.d.ts.map +1 -1
  71. package/dist/src/api/client.js.map +1 -1
  72. package/dist/src/api/schemas.d.ts +11 -4
  73. package/dist/src/api/schemas.d.ts.map +1 -1
  74. package/dist/src/api/schemas.js +8 -1
  75. package/dist/src/api/schemas.js.map +1 -1
  76. package/dist/src/config/index.d.ts +49 -1
  77. package/dist/src/config/index.d.ts.map +1 -1
  78. package/dist/src/config/index.js +166 -3
  79. package/dist/src/config/index.js.map +1 -1
  80. package/dist/src/config/index.test.d.ts +11 -0
  81. package/dist/src/config/index.test.d.ts.map +1 -0
  82. package/dist/src/config/index.test.js +288 -0
  83. package/dist/src/config/index.test.js.map +1 -0
  84. package/dist/src/db/drivers/betterSqlite3Driver.d.ts.map +1 -1
  85. package/dist/src/db/drivers/betterSqlite3Driver.js +5 -3
  86. package/dist/src/db/drivers/betterSqlite3Driver.js.map +1 -1
  87. package/dist/src/db/quarantine-approvals-schema.d.ts +37 -0
  88. package/dist/src/db/quarantine-approvals-schema.d.ts.map +1 -0
  89. package/dist/src/db/quarantine-approvals-schema.js +71 -0
  90. package/dist/src/db/quarantine-approvals-schema.js.map +1 -0
  91. package/dist/src/exports/services.d.ts +1 -0
  92. package/dist/src/exports/services.d.ts.map +1 -1
  93. package/dist/src/exports/services.js +4 -0
  94. package/dist/src/exports/services.js.map +1 -1
  95. package/dist/src/index.d.ts +4 -1
  96. package/dist/src/index.d.ts.map +1 -1
  97. package/dist/src/index.js +8 -2
  98. package/dist/src/index.js.map +1 -1
  99. package/dist/src/indexer/SkillParser.d.ts +20 -0
  100. package/dist/src/indexer/SkillParser.d.ts.map +1 -1
  101. package/dist/src/indexer/SkillParser.js +58 -0
  102. package/dist/src/indexer/SkillParser.js.map +1 -1
  103. package/dist/src/repositories/quarantine/ApprovalRepository.d.ts +148 -0
  104. package/dist/src/repositories/quarantine/ApprovalRepository.d.ts.map +1 -0
  105. package/dist/src/repositories/quarantine/ApprovalRepository.js +212 -0
  106. package/dist/src/repositories/quarantine/ApprovalRepository.js.map +1 -0
  107. package/dist/src/repositories/quarantine/QuarantineRepository.d.ts.map +1 -1
  108. package/dist/src/repositories/quarantine/QuarantineRepository.js +4 -1
  109. package/dist/src/repositories/quarantine/QuarantineRepository.js.map +1 -1
  110. package/dist/src/repositories/quarantine/index.d.ts +2 -0
  111. package/dist/src/repositories/quarantine/index.d.ts.map +1 -1
  112. package/dist/src/repositories/quarantine/index.js +1 -0
  113. package/dist/src/repositories/quarantine/index.js.map +1 -1
  114. package/dist/src/scripts/validation/types.d.ts +2 -2
  115. package/dist/src/security/audit-types.d.ts +2 -2
  116. package/dist/src/security/audit-types.d.ts.map +1 -1
  117. package/dist/src/security/audit-types.js.map +1 -1
  118. package/dist/src/security/sanitization.d.ts.map +1 -1
  119. package/dist/src/security/sanitization.js +25 -17
  120. package/dist/src/security/sanitization.js.map +1 -1
  121. package/dist/src/security/scanner/SecurityScanner.formatters.js +1 -1
  122. package/dist/src/security/scanner/SecurityScanner.formatters.js.map +1 -1
  123. package/dist/src/services/index.d.ts +9 -0
  124. package/dist/src/services/index.d.ts.map +1 -0
  125. package/dist/src/services/index.js +10 -0
  126. package/dist/src/services/index.js.map +1 -0
  127. package/dist/src/services/quarantine/QuarantineService.d.ts +157 -0
  128. package/dist/src/services/quarantine/QuarantineService.d.ts.map +1 -0
  129. package/dist/src/services/quarantine/QuarantineService.js +464 -0
  130. package/dist/src/services/quarantine/QuarantineService.js.map +1 -0
  131. package/dist/src/services/quarantine/index.d.ts +10 -0
  132. package/dist/src/services/quarantine/index.d.ts.map +1 -0
  133. package/dist/src/services/quarantine/index.js +14 -0
  134. package/dist/src/services/quarantine/index.js.map +1 -0
  135. package/dist/src/services/quarantine/types.d.ts +127 -0
  136. package/dist/src/services/quarantine/types.d.ts.map +1 -0
  137. package/dist/src/services/quarantine/types.js +59 -0
  138. package/dist/src/services/quarantine/types.js.map +1 -0
  139. package/dist/src/types/skill.d.ts +6 -1
  140. package/dist/src/types/skill.d.ts.map +1 -1
  141. package/dist/src/types/skill.js.map +1 -1
  142. package/dist/src/types.d.ts +1 -1
  143. package/dist/src/types.d.ts.map +1 -1
  144. package/dist/src/utils/index.d.ts +1 -0
  145. package/dist/src/utils/index.d.ts.map +1 -1
  146. package/dist/src/utils/index.js +2 -0
  147. package/dist/src/utils/index.js.map +1 -1
  148. package/dist/src/utils/safe-fs.d.ts +63 -0
  149. package/dist/src/utils/safe-fs.d.ts.map +1 -0
  150. package/dist/src/utils/safe-fs.js +119 -0
  151. package/dist/src/utils/safe-fs.js.map +1 -0
  152. package/dist/src/validation/input-validators.d.ts.map +1 -1
  153. package/dist/src/validation/input-validators.js +11 -4
  154. package/dist/src/validation/input-validators.js.map +1 -1
  155. package/dist/tests/QuarantineRepository.test.js +39 -2
  156. package/dist/tests/QuarantineRepository.test.js.map +1 -1
  157. package/dist/tests/RawUrlSourceAdapter.security.test.js +2 -1
  158. package/dist/tests/RawUrlSourceAdapter.security.test.js.map +1 -1
  159. package/dist/tests/SecurityScanner.test.js +2 -2
  160. package/dist/tests/SecurityScanner.test.js.map +1 -1
  161. package/dist/tests/adapters-factory.test.d.ts +1 -1
  162. package/dist/tests/adapters-factory.test.js +1 -1
  163. package/dist/tests/edge-cases/EdgeCases.test.js +5 -2
  164. package/dist/tests/edge-cases/EdgeCases.test.js.map +1 -1
  165. package/dist/tests/integration/QuarantineService.test.d.ts +11 -0
  166. package/dist/tests/integration/QuarantineService.test.d.ts.map +1 -0
  167. package/dist/tests/integration/QuarantineService.test.js +426 -0
  168. package/dist/tests/integration/QuarantineService.test.js.map +1 -0
  169. package/dist/tests/integration/neural/e2e-learning.test.d.ts +1 -1
  170. package/dist/tests/integration/neural/e2e-learning.test.js +1 -1
  171. package/dist/tests/integration/neural/personalization.test.d.ts +1 -1
  172. package/dist/tests/integration/neural/personalization.test.js +1 -1
  173. package/dist/tests/integration/neural/preference-learner.test.d.ts +1 -1
  174. package/dist/tests/integration/neural/preference-learner.test.js +1 -1
  175. package/dist/tests/integration/neural/privacy.test.d.ts +1 -1
  176. package/dist/tests/integration/neural/privacy.test.js +1 -1
  177. package/dist/tests/integration/neural/signal-collection.test.d.ts +1 -1
  178. package/dist/tests/integration/neural/signal-collection.test.js +1 -1
  179. package/dist/tests/language-detector.test.d.ts +1 -1
  180. package/dist/tests/language-detector.test.js +1 -1
  181. package/dist/tests/unit/approval-repository.test.d.ts +9 -0
  182. package/dist/tests/unit/approval-repository.test.d.ts.map +1 -0
  183. package/dist/tests/unit/approval-repository.test.js +509 -0
  184. package/dist/tests/unit/approval-repository.test.js.map +1 -0
  185. package/dist/tests/unit/check-references.test.d.ts +2 -0
  186. package/dist/tests/unit/check-references.test.d.ts.map +1 -0
  187. package/dist/tests/unit/check-references.test.js +118 -0
  188. package/dist/tests/unit/check-references.test.js.map +1 -0
  189. package/dist/tests/utils/safe-fs.test.d.ts +12 -0
  190. package/dist/tests/utils/safe-fs.test.d.ts.map +1 -0
  191. package/dist/tests/utils/safe-fs.test.js +116 -0
  192. package/dist/tests/utils/safe-fs.test.js.map +1 -0
  193. package/package.json +14 -10
  194. package/dist/tests/db/driver-parity.integration.test.d.ts +0 -16
  195. package/dist/tests/db/driver-parity.integration.test.d.ts.map +0 -1
  196. package/dist/tests/db/driver-parity.integration.test.js +0 -555
  197. package/dist/tests/db/driver-parity.integration.test.js.map +0 -1
@@ -1,555 +0,0 @@
1
- /**
2
- * SMI-2180: Database Driver Parity Integration Tests
3
- *
4
- * Ensures end-to-end parity between better-sqlite3 and sql.js drivers
5
- * by running identical operations on SkillRepository with both drivers.
6
- *
7
- * Tests cover:
8
- * - CRUD operations
9
- * - Transactions and rollback behavior
10
- * - Prepared statement reuse
11
- * - Search operations
12
- * - Batch insertions
13
- * - Edge cases and error handling
14
- */
15
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
16
- import { createBetterSqlite3Database } from '../../src/db/drivers/betterSqlite3Driver.js';
17
- import { createSqlJsDatabase } from '../../src/db/drivers/sqljsDriver.js';
18
- import { initializeSchema } from '../../src/db/schema.js';
19
- import { SkillRepository } from '../../src/repositories/SkillRepository.js';
20
- /**
21
- * Helper to create a test database with initialized schema
22
- */
23
- async function createTestDatabase(driver) {
24
- const db = driver === 'better-sqlite3'
25
- ? createBetterSqlite3Database(':memory:')
26
- : await createSqlJsDatabase(':memory:');
27
- // Initialize schema
28
- initializeSchema(db);
29
- // Enable foreign keys
30
- db.pragma('foreign_keys = ON');
31
- return db;
32
- }
33
- /**
34
- * Test suite running identical operations on both drivers
35
- */
36
- describe('Database Driver Parity Integration Tests', () => {
37
- // Test both drivers
38
- const drivers = ['better-sqlite3', 'sqljs'];
39
- for (const driverType of drivers) {
40
- describe(`${driverType} driver`, () => {
41
- let db;
42
- let repo;
43
- beforeEach(async () => {
44
- db = await createTestDatabase(driverType);
45
- repo = new SkillRepository(db);
46
- });
47
- afterEach(() => {
48
- if (db?.open) {
49
- db.close();
50
- }
51
- });
52
- describe('CRUD Operations', () => {
53
- it('should insert and retrieve a skill', () => {
54
- const input = {
55
- name: 'test-skill',
56
- description: 'A test skill',
57
- author: 'test-author',
58
- repoUrl: 'https://github.com/test/skill',
59
- qualityScore: 0.85,
60
- trustTier: 'community',
61
- tags: ['testing', 'example'],
62
- };
63
- const created = repo.create(input);
64
- expect(created).toBeDefined();
65
- expect(created.id).toBeDefined();
66
- expect(created.name).toBe(input.name);
67
- expect(created.description).toBe(input.description);
68
- expect(created.author).toBe(input.author);
69
- expect(created.repoUrl).toBe(input.repoUrl);
70
- expect(created.qualityScore).toBe(input.qualityScore);
71
- expect(created.trustTier).toBe(input.trustTier);
72
- expect(created.tags).toEqual(input.tags);
73
- expect(created.createdAt).toBeDefined();
74
- expect(created.updatedAt).toBeDefined();
75
- // Retrieve by ID
76
- const retrieved = repo.findById(created.id);
77
- expect(retrieved).toEqual(created);
78
- // Retrieve by repo URL
79
- const retrievedByUrl = repo.findByRepoUrl(input.repoUrl);
80
- expect(retrievedByUrl).toEqual(created);
81
- });
82
- it('should update a skill', () => {
83
- const input = {
84
- name: 'original-name',
85
- description: 'Original description',
86
- trustTier: 'experimental',
87
- };
88
- const created = repo.create(input);
89
- // Update the skill
90
- const updated = repo.update(created.id, {
91
- name: 'updated-name',
92
- description: 'Updated description',
93
- qualityScore: 0.9,
94
- trustTier: 'community',
95
- });
96
- expect(updated).toBeDefined();
97
- expect(updated.name).toBe('updated-name');
98
- expect(updated.description).toBe('Updated description');
99
- expect(updated.qualityScore).toBe(0.9);
100
- expect(updated.trustTier).toBe('community');
101
- // Verify update persisted
102
- const retrieved = repo.findById(created.id);
103
- expect(retrieved).toEqual(updated);
104
- });
105
- it('should delete a skill', () => {
106
- const input = {
107
- name: 'to-delete',
108
- description: 'Will be deleted',
109
- };
110
- const created = repo.create(input);
111
- expect(repo.exists(created.id)).toBe(true);
112
- const deleted = repo.delete(created.id);
113
- expect(deleted).toBe(true);
114
- expect(repo.exists(created.id)).toBe(false);
115
- // Verify it's gone
116
- const retrieved = repo.findById(created.id);
117
- expect(retrieved).toBeNull();
118
- });
119
- it('should return null when updating non-existent skill', () => {
120
- const result = repo.update('non-existent-id', {
121
- name: 'updated-name',
122
- });
123
- expect(result).toBeNull();
124
- });
125
- it('should return false when deleting non-existent skill', () => {
126
- const result = repo.delete('non-existent-id');
127
- expect(result).toBe(false);
128
- });
129
- });
130
- describe('Batch Operations', () => {
131
- it('should insert multiple skills efficiently', () => {
132
- const inputs = Array.from({ length: 50 }, (_, i) => ({
133
- name: `skill-${i}`,
134
- description: `Test skill number ${i}`,
135
- author: `author-${i % 5}`, // 5 different authors
136
- repoUrl: `https://github.com/test/skill-${i}`,
137
- qualityScore: Math.random(),
138
- trustTier: ['verified', 'community', 'experimental'][i % 3],
139
- tags: [`tag-${i % 10}`, 'testing'],
140
- }));
141
- const created = repo.createBatch(inputs);
142
- expect(created).toHaveLength(50);
143
- expect(repo.count()).toBe(50);
144
- // Verify all skills can be retrieved
145
- for (const skill of created) {
146
- const retrieved = repo.findById(skill.id);
147
- expect(retrieved).toBeDefined();
148
- expect(retrieved.name).toBe(skill.name);
149
- }
150
- });
151
- it('should handle duplicate repo URLs gracefully in batch', () => {
152
- const inputs = [
153
- {
154
- name: 'skill-1',
155
- repoUrl: 'https://github.com/test/duplicate',
156
- },
157
- {
158
- name: 'skill-2',
159
- repoUrl: 'https://github.com/test/unique',
160
- },
161
- {
162
- name: 'skill-3',
163
- repoUrl: 'https://github.com/test/duplicate', // Duplicate
164
- },
165
- ];
166
- const created = repo.createBatch(inputs);
167
- // Should only create 2 skills (duplicate is skipped)
168
- expect(created).toHaveLength(2);
169
- expect(repo.count()).toBe(2);
170
- });
171
- });
172
- describe('Pagination', () => {
173
- beforeEach(() => {
174
- // Insert 25 skills for pagination testing
175
- const inputs = Array.from({ length: 25 }, (_, i) => ({
176
- name: `skill-${String(i).padStart(2, '0')}`, // Pad for consistent ordering
177
- description: `Skill ${i}`,
178
- }));
179
- repo.createBatch(inputs);
180
- });
181
- it('should paginate results correctly', () => {
182
- const page1 = repo.findAll({ limit: 10, offset: 0 });
183
- expect(page1.items).toHaveLength(10);
184
- expect(page1.total).toBe(25);
185
- expect(page1.hasMore).toBe(true);
186
- const page2 = repo.findAll({ limit: 10, offset: 10 });
187
- expect(page2.items).toHaveLength(10);
188
- expect(page2.total).toBe(25);
189
- expect(page2.hasMore).toBe(true);
190
- const page3 = repo.findAll({ limit: 10, offset: 20 });
191
- expect(page3.items).toHaveLength(5);
192
- expect(page3.total).toBe(25);
193
- expect(page3.hasMore).toBe(false);
194
- });
195
- it('should support legacy positional parameters', () => {
196
- const page1 = repo.findAll(10, 0);
197
- expect(page1.items).toHaveLength(10);
198
- expect(page1.total).toBe(25);
199
- });
200
- });
201
- describe('Transaction Support', () => {
202
- it('should commit successful transactions', () => {
203
- // Use db.transaction directly since repo.transaction has issues with 0-arg functions
204
- const result = db.transaction(() => {
205
- repo.create({
206
- name: 'skill-1',
207
- repoUrl: 'https://github.com/test/skill-1',
208
- });
209
- repo.create({
210
- name: 'skill-2',
211
- repoUrl: 'https://github.com/test/skill-2',
212
- });
213
- return 'success';
214
- });
215
- expect(result).toBe('success');
216
- expect(repo.count()).toBe(2);
217
- });
218
- it('should rollback failed transactions', () => {
219
- expect(() => {
220
- db.transaction(() => {
221
- repo.create({
222
- name: 'skill-1',
223
- repoUrl: 'https://github.com/test/skill-1',
224
- });
225
- repo.create({
226
- name: 'skill-2',
227
- repoUrl: 'https://github.com/test/skill-1', // Duplicate repo URL
228
- });
229
- return 'should not reach';
230
- });
231
- }).toThrow();
232
- // No skills should be created due to rollback
233
- expect(repo.count()).toBe(0);
234
- });
235
- it('should handle nested transactions', () => {
236
- const result = db.transaction(() => {
237
- repo.create({
238
- name: 'outer-1',
239
- repoUrl: 'https://github.com/test/outer-1',
240
- });
241
- // Nested transaction
242
- db.transaction(() => {
243
- repo.create({
244
- name: 'inner-1',
245
- repoUrl: 'https://github.com/test/inner-1',
246
- });
247
- });
248
- repo.create({
249
- name: 'outer-2',
250
- repoUrl: 'https://github.com/test/outer-2',
251
- });
252
- return 'nested-success';
253
- });
254
- expect(result).toBe('nested-success');
255
- expect(repo.count()).toBe(3);
256
- });
257
- it('should rollback nested transactions on error', () => {
258
- expect(() => {
259
- db.transaction(() => {
260
- repo.create({
261
- name: 'outer-1',
262
- repoUrl: 'https://github.com/test/outer-1',
263
- });
264
- // This nested transaction will fail
265
- db.transaction(() => {
266
- repo.create({
267
- name: 'inner-1',
268
- repoUrl: 'https://github.com/test/inner-1',
269
- });
270
- throw new Error('Simulated error in nested transaction');
271
- });
272
- // Should not reach this
273
- repo.create({
274
- name: 'outer-2',
275
- repoUrl: 'https://github.com/test/outer-2',
276
- });
277
- });
278
- }).toThrow('Simulated error');
279
- // Everything should be rolled back
280
- expect(repo.count()).toBe(0);
281
- });
282
- });
283
- describe('Prepared Statement Reuse', () => {
284
- it('should efficiently reuse prepared statements', () => {
285
- // Create multiple skills using the same prepared statement
286
- for (let i = 0; i < 100; i++) {
287
- repo.create({
288
- name: `skill-${i}`,
289
- repoUrl: `https://github.com/test/skill-${i}`,
290
- });
291
- }
292
- expect(repo.count()).toBe(100);
293
- // Retrieve using the same prepared statement
294
- for (let i = 0; i < 100; i++) {
295
- const skill = repo.findByRepoUrl(`https://github.com/test/skill-${i}`);
296
- expect(skill).toBeDefined();
297
- expect(skill.name).toBe(`skill-${i}`);
298
- }
299
- });
300
- it('should handle statement binding correctly', () => {
301
- const stmt = db.prepare('SELECT COUNT(*) as count FROM skills');
302
- // Execute multiple times
303
- for (let i = 0; i < 10; i++) {
304
- repo.create({
305
- name: `skill-${i}`,
306
- repoUrl: `https://github.com/test/skill-${i}`,
307
- });
308
- const result = stmt.get();
309
- expect(result?.count).toBe(i + 1);
310
- }
311
- });
312
- });
313
- describe('Upsert Operations', () => {
314
- it('should insert when skill does not exist', () => {
315
- const input = {
316
- name: 'new-skill',
317
- repoUrl: 'https://github.com/test/new-skill',
318
- };
319
- const result = repo.upsert(input);
320
- expect(result).toBeDefined();
321
- expect(result.name).toBe('new-skill');
322
- expect(repo.count()).toBe(1);
323
- });
324
- it('should update when skill exists by repo URL', () => {
325
- const input = {
326
- name: 'original-name',
327
- repoUrl: 'https://github.com/test/skill',
328
- };
329
- const created = repo.create(input);
330
- const updated = repo.upsert({
331
- name: 'updated-name',
332
- repoUrl: 'https://github.com/test/skill',
333
- description: 'New description',
334
- });
335
- expect(updated.id).toBe(created.id);
336
- expect(updated.name).toBe('updated-name');
337
- expect(updated.description).toBe('New description');
338
- expect(repo.count()).toBe(1); // Still just one skill
339
- });
340
- });
341
- describe('Edge Cases', () => {
342
- it('should handle null/undefined fields correctly', () => {
343
- const input = {
344
- name: 'minimal-skill',
345
- description: null,
346
- author: undefined,
347
- repoUrl: null,
348
- };
349
- const created = repo.create(input);
350
- expect(created.name).toBe('minimal-skill');
351
- expect(created.description).toBeNull();
352
- expect(created.author).toBeNull();
353
- expect(created.repoUrl).toBeNull();
354
- });
355
- it('should handle empty strings', () => {
356
- const input = {
357
- name: 'empty-strings',
358
- description: '',
359
- author: '',
360
- };
361
- const created = repo.create(input);
362
- expect(created.description).toBe('');
363
- expect(created.author).toBe('');
364
- });
365
- it('should enforce unique constraint on repo_url', () => {
366
- repo.create({
367
- name: 'skill-1',
368
- repoUrl: 'https://github.com/test/unique',
369
- });
370
- expect(() => {
371
- repo.create({
372
- name: 'skill-2',
373
- repoUrl: 'https://github.com/test/unique',
374
- });
375
- }).toThrow();
376
- });
377
- it('should handle large text fields', () => {
378
- const largeDescription = 'A'.repeat(10000);
379
- const created = repo.create({
380
- name: 'large-text',
381
- description: largeDescription,
382
- });
383
- expect(created.description).toHaveLength(10000);
384
- const retrieved = repo.findById(created.id);
385
- expect(retrieved.description).toHaveLength(10000);
386
- });
387
- it('should handle special characters in JSON tags', () => {
388
- const input = {
389
- name: 'special-chars',
390
- tags: ['tag-with-"quotes"', "tag-with-'apostrophe'", 'tag-with-\\backslash'],
391
- };
392
- const created = repo.create(input);
393
- expect(created.tags).toEqual(input.tags);
394
- const retrieved = repo.findById(created.id);
395
- expect(retrieved.tags).toEqual(input.tags);
396
- });
397
- });
398
- describe('Security Scan Fields (SMI-825)', () => {
399
- it('should store and retrieve security scan data', () => {
400
- const input = {
401
- name: 'scanned-skill',
402
- riskScore: 35,
403
- securityFindingsCount: 3,
404
- securityScannedAt: '2024-01-15T10:00:00Z',
405
- securityPassed: true,
406
- };
407
- const created = repo.create(input);
408
- expect(created.riskScore).toBe(35);
409
- expect(created.securityFindingsCount).toBe(3);
410
- expect(created.securityScannedAt).toBe('2024-01-15T10:00:00Z');
411
- expect(created.securityPassed).toBe(true);
412
- const retrieved = repo.findById(created.id);
413
- expect(retrieved.riskScore).toBe(35);
414
- expect(retrieved.securityPassed).toBe(true);
415
- });
416
- it('should handle null security fields', () => {
417
- const input = {
418
- name: 'unscanned-skill',
419
- riskScore: null,
420
- // Don't pass securityPassed to test undefined -> null conversion
421
- };
422
- const created = repo.create(input);
423
- expect(created.riskScore).toBeNull();
424
- // When securityPassed is not provided (undefined), it defaults to false (0 in DB)
425
- // This is expected behavior per the SkillRepository implementation
426
- expect([null, false]).toContain(created.securityPassed);
427
- });
428
- it('should update security scan results', () => {
429
- const created = repo.create({
430
- name: 'skill',
431
- riskScore: null,
432
- securityPassed: null,
433
- });
434
- const updated = repo.update(created.id, {
435
- riskScore: 25,
436
- securityFindingsCount: 1,
437
- securityScannedAt: '2024-01-20T15:30:00Z',
438
- securityPassed: true,
439
- });
440
- expect(updated.riskScore).toBe(25);
441
- expect(updated.securityFindingsCount).toBe(1);
442
- expect(updated.securityPassed).toBe(true);
443
- });
444
- });
445
- describe('Count Operations', () => {
446
- it('should count skills correctly', () => {
447
- expect(repo.count()).toBe(0);
448
- repo.create({ name: 'skill-1' });
449
- expect(repo.count()).toBe(1);
450
- repo.create({ name: 'skill-2', repoUrl: 'https://github.com/test/2' });
451
- expect(repo.count()).toBe(2);
452
- repo.deleteAll();
453
- expect(repo.count()).toBe(0);
454
- });
455
- });
456
- describe('Delete All Operation', () => {
457
- it('should delete all skills', () => {
458
- // Create multiple skills
459
- for (let i = 0; i < 10; i++) {
460
- repo.create({
461
- name: `skill-${i}`,
462
- repoUrl: `https://github.com/test/skill-${i}`,
463
- });
464
- }
465
- expect(repo.count()).toBe(10);
466
- const deletedCount = repo.deleteAll();
467
- expect(deletedCount).toBe(10);
468
- expect(repo.count()).toBe(0);
469
- });
470
- });
471
- });
472
- }
473
- describe('Cross-Driver Consistency', () => {
474
- it('should produce identical results for same operations', async () => {
475
- const db1 = await createTestDatabase('better-sqlite3');
476
- const db2 = await createTestDatabase('sqljs');
477
- const repo1 = new SkillRepository(db1);
478
- const repo2 = new SkillRepository(db2);
479
- // Perform identical operations on both
480
- const inputs = [
481
- {
482
- name: 'skill-1',
483
- description: 'First skill',
484
- author: 'author-1',
485
- repoUrl: 'https://github.com/test/skill-1',
486
- qualityScore: 0.8,
487
- trustTier: 'community',
488
- tags: ['testing', 'example'],
489
- },
490
- {
491
- name: 'skill-2',
492
- description: 'Second skill',
493
- author: 'author-2',
494
- repoUrl: 'https://github.com/test/skill-2',
495
- qualityScore: 0.9,
496
- trustTier: 'verified',
497
- tags: ['production', 'verified'],
498
- },
499
- ];
500
- const created1 = repo1.createBatch(inputs);
501
- const created2 = repo2.createBatch(inputs);
502
- // Results should be structurally identical (excluding IDs which are UUIDs)
503
- expect(created1).toHaveLength(created2.length);
504
- for (let i = 0; i < created1.length; i++) {
505
- expect(created1[i].name).toBe(created2[i].name);
506
- expect(created1[i].description).toBe(created2[i].description);
507
- expect(created1[i].author).toBe(created2[i].author);
508
- expect(created1[i].repoUrl).toBe(created2[i].repoUrl);
509
- expect(created1[i].qualityScore).toBe(created2[i].qualityScore);
510
- expect(created1[i].trustTier).toBe(created2[i].trustTier);
511
- expect(created1[i].tags).toEqual(created2[i].tags);
512
- }
513
- // Pagination should work identically
514
- const page1 = repo1.findAll({ limit: 10, offset: 0 });
515
- const page2 = repo2.findAll({ limit: 10, offset: 0 });
516
- expect(page1.total).toBe(page2.total);
517
- expect(page1.items.length).toBe(page2.items.length);
518
- expect(page1.hasMore).toBe(page2.hasMore);
519
- // Cleanup
520
- db1.close();
521
- db2.close();
522
- });
523
- it('should handle transactions identically', async () => {
524
- const db1 = await createTestDatabase('better-sqlite3');
525
- const db2 = await createTestDatabase('sqljs');
526
- const repo1 = new SkillRepository(db1);
527
- const repo2 = new SkillRepository(db2);
528
- // Test successful transaction - use db.transaction directly
529
- const result1 = db1.transaction(() => {
530
- repo1.create({ name: 'tx-skill-1', repoUrl: 'https://github.com/test/tx1' });
531
- return 'success';
532
- });
533
- const result2 = db2.transaction(() => {
534
- repo2.create({ name: 'tx-skill-1', repoUrl: 'https://github.com/test/tx1' });
535
- return 'success';
536
- });
537
- expect(result1).toBe(result2);
538
- expect(repo1.count()).toBe(repo2.count());
539
- // Test rollback
540
- const expectError1 = () => db1.transaction(() => {
541
- repo1.create({ name: 'tx-skill-2', repoUrl: 'https://github.com/test/tx1' });
542
- });
543
- const expectError2 = () => db2.transaction(() => {
544
- repo2.create({ name: 'tx-skill-2', repoUrl: 'https://github.com/test/tx1' });
545
- });
546
- expect(expectError1).toThrow();
547
- expect(expectError2).toThrow();
548
- // Counts should still match after rollback
549
- expect(repo1.count()).toBe(repo2.count());
550
- db1.close();
551
- db2.close();
552
- });
553
- });
554
- });
555
- //# sourceMappingURL=driver-parity.integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"driver-parity.integration.test.js","sourceRoot":"","sources":["../../../tests/db/driver-parity.integration.test.ts"],"names":[],"mappings":"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"}