@elaraai/e3-core 0.0.2-beta.8 → 1.0.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 (285) hide show
  1. package/LICENSE.md +4 -0
  2. package/README.md +74 -35
  3. package/dist/src/dataflow/api-compat.d.ts +90 -0
  4. package/dist/src/dataflow/api-compat.d.ts.map +1 -0
  5. package/dist/src/dataflow/api-compat.js +139 -0
  6. package/dist/src/dataflow/api-compat.js.map +1 -0
  7. package/dist/src/dataflow/api-compat.spec.d.ts +6 -0
  8. package/dist/src/dataflow/api-compat.spec.d.ts.map +1 -0
  9. package/dist/src/dataflow/api-compat.spec.js +182 -0
  10. package/dist/src/dataflow/api-compat.spec.js.map +1 -0
  11. package/dist/src/dataflow/index.d.ts +18 -0
  12. package/dist/src/dataflow/index.d.ts.map +1 -0
  13. package/dist/src/dataflow/index.js +23 -0
  14. package/dist/src/dataflow/index.js.map +1 -0
  15. package/dist/src/dataflow/orchestrator/LocalOrchestrator.d.ts +76 -0
  16. package/dist/src/dataflow/orchestrator/LocalOrchestrator.d.ts.map +1 -0
  17. package/dist/src/dataflow/orchestrator/LocalOrchestrator.js +729 -0
  18. package/dist/src/dataflow/orchestrator/LocalOrchestrator.js.map +1 -0
  19. package/dist/src/dataflow/orchestrator/index.d.ts +12 -0
  20. package/dist/src/dataflow/orchestrator/index.d.ts.map +1 -0
  21. package/dist/src/dataflow/orchestrator/index.js +12 -0
  22. package/dist/src/dataflow/orchestrator/index.js.map +1 -0
  23. package/dist/src/dataflow/orchestrator/interfaces.d.ts +163 -0
  24. package/dist/src/dataflow/orchestrator/interfaces.d.ts.map +1 -0
  25. package/dist/src/dataflow/orchestrator/interfaces.js +52 -0
  26. package/dist/src/dataflow/orchestrator/interfaces.js.map +1 -0
  27. package/dist/src/dataflow/state-store/FileStateStore.d.ts +67 -0
  28. package/dist/src/dataflow/state-store/FileStateStore.d.ts.map +1 -0
  29. package/dist/src/dataflow/state-store/FileStateStore.js +300 -0
  30. package/dist/src/dataflow/state-store/FileStateStore.js.map +1 -0
  31. package/dist/src/dataflow/state-store/InMemoryStateStore.d.ts +42 -0
  32. package/dist/src/dataflow/state-store/InMemoryStateStore.d.ts.map +1 -0
  33. package/dist/src/dataflow/state-store/InMemoryStateStore.js +229 -0
  34. package/dist/src/dataflow/state-store/InMemoryStateStore.js.map +1 -0
  35. package/dist/src/dataflow/state-store/InMemoryStateStore.spec.d.ts +6 -0
  36. package/dist/src/dataflow/state-store/InMemoryStateStore.spec.d.ts.map +1 -0
  37. package/dist/src/dataflow/state-store/InMemoryStateStore.spec.js +114 -0
  38. package/dist/src/dataflow/state-store/InMemoryStateStore.spec.js.map +1 -0
  39. package/dist/src/dataflow/state-store/index.d.ts +13 -0
  40. package/dist/src/dataflow/state-store/index.d.ts.map +1 -0
  41. package/dist/src/dataflow/state-store/index.js +13 -0
  42. package/dist/src/dataflow/state-store/index.js.map +1 -0
  43. package/dist/src/dataflow/state-store/interfaces.d.ts +159 -0
  44. package/dist/src/dataflow/state-store/interfaces.d.ts.map +1 -0
  45. package/dist/src/dataflow/state-store/interfaces.js +6 -0
  46. package/dist/src/dataflow/state-store/interfaces.js.map +1 -0
  47. package/dist/src/dataflow/steps.d.ts +222 -0
  48. package/dist/src/dataflow/steps.d.ts.map +1 -0
  49. package/dist/src/dataflow/steps.js +707 -0
  50. package/dist/src/dataflow/steps.js.map +1 -0
  51. package/dist/src/dataflow/steps.spec.d.ts +6 -0
  52. package/dist/src/dataflow/steps.spec.d.ts.map +1 -0
  53. package/dist/src/dataflow/steps.spec.js +343 -0
  54. package/dist/src/dataflow/steps.spec.js.map +1 -0
  55. package/dist/src/dataflow/types.d.ts +127 -0
  56. package/dist/src/dataflow/types.d.ts.map +1 -0
  57. package/dist/src/dataflow/types.js +7 -0
  58. package/dist/src/dataflow/types.js.map +1 -0
  59. package/dist/src/dataflow-orchestration.spec.d.ts +6 -0
  60. package/dist/src/dataflow-orchestration.spec.d.ts.map +1 -0
  61. package/dist/src/dataflow-orchestration.spec.js +1025 -0
  62. package/dist/src/dataflow-orchestration.spec.js.map +1 -0
  63. package/dist/src/dataflow.d.ts +113 -38
  64. package/dist/src/dataflow.d.ts.map +1 -1
  65. package/dist/src/dataflow.js +269 -416
  66. package/dist/src/dataflow.js.map +1 -1
  67. package/dist/src/dataflow.spec.d.ts +6 -0
  68. package/dist/src/dataflow.spec.d.ts.map +1 -0
  69. package/dist/src/dataflow.spec.js +663 -0
  70. package/dist/src/dataflow.spec.js.map +1 -0
  71. package/dist/src/dataset-refs.d.ts +124 -0
  72. package/dist/src/dataset-refs.d.ts.map +1 -0
  73. package/dist/src/dataset-refs.js +319 -0
  74. package/dist/src/dataset-refs.js.map +1 -0
  75. package/dist/src/errors.d.ts +39 -9
  76. package/dist/src/errors.d.ts.map +1 -1
  77. package/dist/src/errors.js +51 -8
  78. package/dist/src/errors.js.map +1 -1
  79. package/dist/src/errors.spec.d.ts +6 -0
  80. package/dist/src/errors.spec.d.ts.map +1 -0
  81. package/dist/src/errors.spec.js +276 -0
  82. package/dist/src/errors.spec.js.map +1 -0
  83. package/dist/src/execution/LocalTaskRunner.d.ts +73 -0
  84. package/dist/src/execution/LocalTaskRunner.d.ts.map +1 -0
  85. package/dist/src/execution/LocalTaskRunner.js +399 -0
  86. package/dist/src/execution/LocalTaskRunner.js.map +1 -0
  87. package/dist/src/execution/MockTaskRunner.d.ts +49 -0
  88. package/dist/src/execution/MockTaskRunner.d.ts.map +1 -0
  89. package/dist/src/execution/MockTaskRunner.js +54 -0
  90. package/dist/src/execution/MockTaskRunner.js.map +1 -0
  91. package/dist/src/execution/index.d.ts +16 -0
  92. package/dist/src/execution/index.d.ts.map +1 -0
  93. package/dist/src/execution/index.js +8 -0
  94. package/dist/src/execution/index.js.map +1 -0
  95. package/dist/src/execution/interfaces.d.ts +246 -0
  96. package/dist/src/execution/interfaces.d.ts.map +1 -0
  97. package/dist/src/execution/interfaces.js +6 -0
  98. package/dist/src/execution/interfaces.js.map +1 -0
  99. package/dist/src/execution/processHelpers.d.ts +20 -0
  100. package/dist/src/execution/processHelpers.d.ts.map +1 -0
  101. package/dist/src/execution/processHelpers.js +62 -0
  102. package/dist/src/execution/processHelpers.js.map +1 -0
  103. package/dist/src/executions.d.ts +71 -104
  104. package/dist/src/executions.d.ts.map +1 -1
  105. package/dist/src/executions.js +113 -481
  106. package/dist/src/executions.js.map +1 -1
  107. package/dist/src/executions.spec.d.ts +6 -0
  108. package/dist/src/executions.spec.d.ts.map +1 -0
  109. package/dist/src/executions.spec.js +387 -0
  110. package/dist/src/executions.spec.js.map +1 -0
  111. package/dist/src/formats.d.ts +18 -2
  112. package/dist/src/formats.d.ts.map +1 -1
  113. package/dist/src/formats.js +34 -2
  114. package/dist/src/formats.js.map +1 -1
  115. package/dist/src/gc.spec.d.ts +6 -0
  116. package/dist/src/gc.spec.d.ts.map +1 -0
  117. package/dist/src/gc.spec.js +512 -0
  118. package/dist/src/gc.spec.js.map +1 -0
  119. package/dist/src/index.d.ts +20 -10
  120. package/dist/src/index.d.ts.map +1 -1
  121. package/dist/src/index.js +48 -18
  122. package/dist/src/index.js.map +1 -1
  123. package/dist/src/objects.d.ts +7 -53
  124. package/dist/src/objects.d.ts.map +1 -1
  125. package/dist/src/objects.js +13 -232
  126. package/dist/src/objects.js.map +1 -1
  127. package/dist/src/objects.spec.d.ts +6 -0
  128. package/dist/src/objects.spec.d.ts.map +1 -0
  129. package/dist/src/objects.spec.js +247 -0
  130. package/dist/src/objects.spec.js.map +1 -0
  131. package/dist/src/packages.d.ts +41 -14
  132. package/dist/src/packages.d.ts.map +1 -1
  133. package/dist/src/packages.js +151 -89
  134. package/dist/src/packages.js.map +1 -1
  135. package/dist/src/packages.spec.d.ts +6 -0
  136. package/dist/src/packages.spec.d.ts.map +1 -0
  137. package/dist/src/packages.spec.js +324 -0
  138. package/dist/src/packages.spec.js.map +1 -0
  139. package/dist/src/storage/in-memory/InMemoryRepoStore.d.ts +35 -0
  140. package/dist/src/storage/in-memory/InMemoryRepoStore.d.ts.map +1 -0
  141. package/dist/src/storage/in-memory/InMemoryRepoStore.js +107 -0
  142. package/dist/src/storage/in-memory/InMemoryRepoStore.js.map +1 -0
  143. package/dist/src/storage/in-memory/InMemoryRepoStore.spec.d.ts +6 -0
  144. package/dist/src/storage/in-memory/InMemoryRepoStore.spec.d.ts.map +1 -0
  145. package/dist/src/storage/in-memory/InMemoryRepoStore.spec.js +187 -0
  146. package/dist/src/storage/in-memory/InMemoryRepoStore.spec.js.map +1 -0
  147. package/dist/src/storage/in-memory/InMemoryStorage.d.ts +139 -0
  148. package/dist/src/storage/in-memory/InMemoryStorage.d.ts.map +1 -0
  149. package/dist/src/storage/in-memory/InMemoryStorage.js +439 -0
  150. package/dist/src/storage/in-memory/InMemoryStorage.js.map +1 -0
  151. package/dist/src/storage/in-memory/index.d.ts +12 -0
  152. package/dist/src/storage/in-memory/index.d.ts.map +1 -0
  153. package/dist/src/storage/in-memory/index.js +12 -0
  154. package/dist/src/storage/in-memory/index.js.map +1 -0
  155. package/dist/src/storage/index.d.ts +18 -0
  156. package/dist/src/storage/index.d.ts.map +1 -0
  157. package/dist/src/storage/index.js +10 -0
  158. package/dist/src/storage/index.js.map +1 -0
  159. package/dist/src/storage/interfaces.d.ts +581 -0
  160. package/dist/src/storage/interfaces.d.ts.map +1 -0
  161. package/dist/src/storage/interfaces.js +6 -0
  162. package/dist/src/storage/interfaces.js.map +1 -0
  163. package/dist/src/storage/local/LocalBackend.d.ts +56 -0
  164. package/dist/src/storage/local/LocalBackend.d.ts.map +1 -0
  165. package/dist/src/storage/local/LocalBackend.js +145 -0
  166. package/dist/src/storage/local/LocalBackend.js.map +1 -0
  167. package/dist/src/storage/local/LocalDatasetRefStore.d.ts +22 -0
  168. package/dist/src/storage/local/LocalDatasetRefStore.d.ts.map +1 -0
  169. package/dist/src/storage/local/LocalDatasetRefStore.js +118 -0
  170. package/dist/src/storage/local/LocalDatasetRefStore.js.map +1 -0
  171. package/dist/src/storage/local/LocalLockService.d.ts +111 -0
  172. package/dist/src/storage/local/LocalLockService.d.ts.map +1 -0
  173. package/dist/src/storage/local/LocalLockService.js +364 -0
  174. package/dist/src/storage/local/LocalLockService.js.map +1 -0
  175. package/dist/src/storage/local/LocalLockService.spec.d.ts +6 -0
  176. package/dist/src/storage/local/LocalLockService.spec.d.ts.map +1 -0
  177. package/dist/src/storage/local/LocalLockService.spec.js +148 -0
  178. package/dist/src/storage/local/LocalLockService.spec.js.map +1 -0
  179. package/dist/src/storage/local/LocalLogStore.d.ts +23 -0
  180. package/dist/src/storage/local/LocalLogStore.d.ts.map +1 -0
  181. package/dist/src/storage/local/LocalLogStore.js +66 -0
  182. package/dist/src/storage/local/LocalLogStore.js.map +1 -0
  183. package/dist/src/storage/local/LocalObjectStore.d.ts +55 -0
  184. package/dist/src/storage/local/LocalObjectStore.d.ts.map +1 -0
  185. package/dist/src/storage/local/LocalObjectStore.js +300 -0
  186. package/dist/src/storage/local/LocalObjectStore.js.map +1 -0
  187. package/dist/src/storage/local/LocalRefStore.d.ts +50 -0
  188. package/dist/src/storage/local/LocalRefStore.d.ts.map +1 -0
  189. package/dist/src/storage/local/LocalRefStore.js +337 -0
  190. package/dist/src/storage/local/LocalRefStore.js.map +1 -0
  191. package/dist/src/storage/local/LocalRepoStore.d.ts +55 -0
  192. package/dist/src/storage/local/LocalRepoStore.d.ts.map +1 -0
  193. package/dist/src/storage/local/LocalRepoStore.js +365 -0
  194. package/dist/src/storage/local/LocalRepoStore.js.map +1 -0
  195. package/dist/src/storage/local/LocalRepoStore.spec.d.ts +6 -0
  196. package/dist/src/storage/local/LocalRepoStore.spec.d.ts.map +1 -0
  197. package/dist/src/storage/local/LocalRepoStore.spec.js +255 -0
  198. package/dist/src/storage/local/LocalRepoStore.spec.js.map +1 -0
  199. package/dist/src/storage/local/gc.d.ts +92 -0
  200. package/dist/src/storage/local/gc.d.ts.map +1 -0
  201. package/dist/src/storage/local/gc.js +377 -0
  202. package/dist/src/storage/local/gc.js.map +1 -0
  203. package/dist/src/storage/local/index.d.ts +18 -0
  204. package/dist/src/storage/local/index.d.ts.map +1 -0
  205. package/dist/src/storage/local/index.js +18 -0
  206. package/dist/src/storage/local/index.js.map +1 -0
  207. package/dist/src/storage/local/localHelpers.d.ts +25 -0
  208. package/dist/src/storage/local/localHelpers.d.ts.map +1 -0
  209. package/dist/src/storage/local/localHelpers.js +69 -0
  210. package/dist/src/storage/local/localHelpers.js.map +1 -0
  211. package/dist/src/{repository.d.ts → storage/local/repository.d.ts} +8 -4
  212. package/dist/src/storage/local/repository.d.ts.map +1 -0
  213. package/dist/src/{repository.js → storage/local/repository.js} +31 -29
  214. package/dist/src/storage/local/repository.js.map +1 -0
  215. package/dist/src/storage/local/repository.spec.d.ts +6 -0
  216. package/dist/src/storage/local/repository.spec.d.ts.map +1 -0
  217. package/dist/src/storage/local/repository.spec.js +186 -0
  218. package/dist/src/storage/local/repository.spec.js.map +1 -0
  219. package/dist/src/tasks.d.ts +16 -10
  220. package/dist/src/tasks.d.ts.map +1 -1
  221. package/dist/src/tasks.js +35 -41
  222. package/dist/src/tasks.js.map +1 -1
  223. package/dist/src/tasks.spec.d.ts +6 -0
  224. package/dist/src/tasks.spec.d.ts.map +1 -0
  225. package/dist/src/tasks.spec.js +105 -0
  226. package/dist/src/tasks.spec.js.map +1 -0
  227. package/dist/src/test-helpers.d.ts +5 -4
  228. package/dist/src/test-helpers.d.ts.map +1 -1
  229. package/dist/src/test-helpers.js +9 -21
  230. package/dist/src/test-helpers.js.map +1 -1
  231. package/dist/src/transfer/InMemoryTransferBackend.d.ts +75 -0
  232. package/dist/src/transfer/InMemoryTransferBackend.d.ts.map +1 -0
  233. package/dist/src/transfer/InMemoryTransferBackend.js +211 -0
  234. package/dist/src/transfer/InMemoryTransferBackend.js.map +1 -0
  235. package/dist/src/transfer/index.d.ts +9 -0
  236. package/dist/src/transfer/index.d.ts.map +1 -0
  237. package/dist/src/transfer/index.js +11 -0
  238. package/dist/src/transfer/index.js.map +1 -0
  239. package/dist/src/transfer/interfaces.d.ts +103 -0
  240. package/dist/src/transfer/interfaces.d.ts.map +1 -0
  241. package/dist/src/transfer/interfaces.js +6 -0
  242. package/dist/src/transfer/interfaces.js.map +1 -0
  243. package/dist/src/transfer/process.d.ts +55 -0
  244. package/dist/src/transfer/process.d.ts.map +1 -0
  245. package/dist/src/transfer/process.js +144 -0
  246. package/dist/src/transfer/process.js.map +1 -0
  247. package/dist/src/transfer/types.d.ts +106 -0
  248. package/dist/src/transfer/types.d.ts.map +1 -0
  249. package/dist/src/transfer/types.js +61 -0
  250. package/dist/src/transfer/types.js.map +1 -0
  251. package/dist/src/trees.d.ts +102 -63
  252. package/dist/src/trees.d.ts.map +1 -1
  253. package/dist/src/trees.js +319 -479
  254. package/dist/src/trees.js.map +1 -1
  255. package/dist/src/trees.spec.d.ts +6 -0
  256. package/dist/src/trees.spec.d.ts.map +1 -0
  257. package/dist/src/trees.spec.js +635 -0
  258. package/dist/src/trees.spec.js.map +1 -0
  259. package/dist/src/uuid.d.ts +26 -0
  260. package/dist/src/uuid.d.ts.map +1 -0
  261. package/dist/src/uuid.js +80 -0
  262. package/dist/src/uuid.js.map +1 -0
  263. package/dist/src/workspaceStatus.d.ts +6 -4
  264. package/dist/src/workspaceStatus.d.ts.map +1 -1
  265. package/dist/src/workspaceStatus.js +46 -60
  266. package/dist/src/workspaceStatus.js.map +1 -1
  267. package/dist/src/workspaces.d.ts +46 -47
  268. package/dist/src/workspaces.d.ts.map +1 -1
  269. package/dist/src/workspaces.js +281 -221
  270. package/dist/src/workspaces.js.map +1 -1
  271. package/dist/src/workspaces.spec.d.ts +6 -0
  272. package/dist/src/workspaces.spec.d.ts.map +1 -0
  273. package/dist/src/workspaces.spec.js +273 -0
  274. package/dist/src/workspaces.spec.js.map +1 -0
  275. package/package.json +15 -15
  276. package/dist/src/gc.d.ts +0 -54
  277. package/dist/src/gc.d.ts.map +0 -1
  278. package/dist/src/gc.js +0 -233
  279. package/dist/src/gc.js.map +0 -1
  280. package/dist/src/repository.d.ts.map +0 -1
  281. package/dist/src/repository.js.map +0 -1
  282. package/dist/src/workspaceLock.d.ts +0 -67
  283. package/dist/src/workspaceLock.d.ts.map +0 -1
  284. package/dist/src/workspaceLock.js +0 -217
  285. package/dist/src/workspaceLock.js.map +0 -1
@@ -0,0 +1,324 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Tests for packages.ts
7
+ */
8
+ import { describe, it, beforeEach, afterEach } from 'node:test';
9
+ import assert from 'node:assert';
10
+ import { existsSync, readFileSync } from 'node:fs';
11
+ import { join } from 'node:path';
12
+ import { StringType, IntegerType, East } from '@elaraai/east';
13
+ import e3 from '@elaraai/e3';
14
+ import { packageImport, packageExport, packageRemove, packageList, packageResolve, packageRead, } from './packages.js';
15
+ import { objectRead } from './storage/local/LocalObjectStore.js';
16
+ import { PackageNotFoundError } from './errors.js';
17
+ import { createTestRepo, removeTestRepo, createTempDir, removeTempDir, zipEqual } from './test-helpers.js';
18
+ import { LocalStorage } from './storage/local/index.js';
19
+ describe('packages', () => {
20
+ let testRepo;
21
+ let tempDir;
22
+ let storage;
23
+ beforeEach(() => {
24
+ testRepo = createTestRepo();
25
+ tempDir = createTempDir();
26
+ storage = new LocalStorage();
27
+ });
28
+ afterEach(() => {
29
+ removeTestRepo(testRepo);
30
+ removeTempDir(tempDir);
31
+ });
32
+ describe('packageImport', () => {
33
+ it('imports empty package', async () => {
34
+ // Create and export a package using e3 SDK
35
+ const pkg = e3.package('empty-pkg', '1.0.0');
36
+ const zipPath = join(tempDir, 'empty.zip');
37
+ await e3.export(pkg, zipPath);
38
+ // Import into repository
39
+ const result = await packageImport(storage, testRepo, zipPath);
40
+ assert.strictEqual(result.name, 'empty-pkg');
41
+ assert.strictEqual(result.version, '1.0.0');
42
+ assert.strictEqual(typeof result.packageHash, 'string');
43
+ assert.strictEqual(result.packageHash.length, 64);
44
+ assert.ok(result.objectCount >= 1, `Expected at least 1 object, got ${result.objectCount}`);
45
+ });
46
+ it('imports package with input dataset', async () => {
47
+ const myInput = e3.input('greeting', StringType, 'hello');
48
+ const pkg = e3.package('input-pkg', '2.0.0', myInput);
49
+ const zipPath = join(tempDir, 'input.zip');
50
+ await e3.export(pkg, zipPath);
51
+ const result = await packageImport(storage, testRepo, zipPath);
52
+ assert.strictEqual(result.name, 'input-pkg');
53
+ assert.strictEqual(result.version, '2.0.0');
54
+ assert.ok(result.objectCount >= 2, `Expected at least 2 objects, got ${result.objectCount}`);
55
+ });
56
+ it('creates package ref file', async () => {
57
+ const pkg = e3.package('ref-test', '1.2.3');
58
+ const zipPath = join(tempDir, 'ref-test.zip');
59
+ await e3.export(pkg, zipPath);
60
+ const result = await packageImport(storage, testRepo, zipPath);
61
+ const refPath = join(testRepo, 'packages', 'ref-test', '1.2.3');
62
+ assert.ok(existsSync(refPath), 'Package ref file should exist');
63
+ const refContent = readFileSync(refPath, 'utf-8').trim();
64
+ assert.strictEqual(refContent, result.packageHash);
65
+ });
66
+ it('stores objects in correct location', async () => {
67
+ const pkg = e3.package('objects-test', '1.0.0');
68
+ const zipPath = join(tempDir, 'objects-test.zip');
69
+ await e3.export(pkg, zipPath);
70
+ const result = await packageImport(storage, testRepo, zipPath);
71
+ // Package object should be loadable
72
+ const packageObjectData = await objectRead(testRepo, result.packageHash);
73
+ assert.ok(packageObjectData.length > 0, 'Package object should have content');
74
+ });
75
+ it('handles re-import of same package', async () => {
76
+ const pkg = e3.package('reimport-test', '1.0.0');
77
+ const zipPath = join(tempDir, 'reimport-test.zip');
78
+ await e3.export(pkg, zipPath);
79
+ const result1 = await packageImport(storage, testRepo, zipPath);
80
+ const result2 = await packageImport(storage, testRepo, zipPath);
81
+ assert.strictEqual(result1.packageHash, result2.packageHash);
82
+ assert.strictEqual(result1.name, result2.name);
83
+ assert.strictEqual(result1.version, result2.version);
84
+ });
85
+ });
86
+ describe('packageList', () => {
87
+ it('returns empty array for no packages', async () => {
88
+ const packages = await packageList(storage, testRepo);
89
+ assert.deepStrictEqual(packages, []);
90
+ });
91
+ it('lists single package', async () => {
92
+ const pkg = e3.package('list-test', '1.0.0');
93
+ const zipPath = join(tempDir, 'list-test.zip');
94
+ await e3.export(pkg, zipPath);
95
+ await packageImport(storage, testRepo, zipPath);
96
+ const packages = await packageList(storage, testRepo);
97
+ assert.strictEqual(packages.length, 1);
98
+ assert.strictEqual(packages[0].name, 'list-test');
99
+ assert.strictEqual(packages[0].version, '1.0.0');
100
+ });
101
+ it('lists multiple packages', async () => {
102
+ // Create and import multiple packages
103
+ const pkg1 = e3.package('pkg-a', '1.0.0');
104
+ const pkg2 = e3.package('pkg-b', '2.0.0');
105
+ const pkg3 = e3.package('pkg-a', '1.1.0');
106
+ const zip1 = join(tempDir, 'pkg1.zip');
107
+ const zip2 = join(tempDir, 'pkg2.zip');
108
+ const zip3 = join(tempDir, 'pkg3.zip');
109
+ await e3.export(pkg1, zip1);
110
+ await e3.export(pkg2, zip2);
111
+ await e3.export(pkg3, zip3);
112
+ await packageImport(storage, testRepo, zip1);
113
+ await packageImport(storage, testRepo, zip2);
114
+ await packageImport(storage, testRepo, zip3);
115
+ const packages = await packageList(storage, testRepo);
116
+ assert.strictEqual(packages.length, 3);
117
+ // Sort for consistent comparison
118
+ packages.sort((a, b) => `${a.name}/${a.version}`.localeCompare(`${b.name}/${b.version}`));
119
+ assert.strictEqual(packages[0].name, 'pkg-a');
120
+ assert.strictEqual(packages[0].version, '1.0.0');
121
+ assert.strictEqual(packages[1].name, 'pkg-a');
122
+ assert.strictEqual(packages[1].version, '1.1.0');
123
+ assert.strictEqual(packages[2].name, 'pkg-b');
124
+ assert.strictEqual(packages[2].version, '2.0.0');
125
+ });
126
+ });
127
+ describe('packageResolve', () => {
128
+ it('resolves package to hash', async () => {
129
+ const pkg = e3.package('resolve-test', '1.0.0');
130
+ const zipPath = join(tempDir, 'resolve-test.zip');
131
+ await e3.export(pkg, zipPath);
132
+ const importResult = await packageImport(storage, testRepo, zipPath);
133
+ const resolvedHash = await packageResolve(storage, testRepo, 'resolve-test', '1.0.0');
134
+ assert.strictEqual(resolvedHash, importResult.packageHash);
135
+ });
136
+ it('throws for non-existent package', async () => {
137
+ await assert.rejects(async () => await packageResolve(storage, testRepo, 'nonexistent', '1.0.0'), PackageNotFoundError);
138
+ });
139
+ });
140
+ describe('packageRemove', () => {
141
+ it('removes package ref', async () => {
142
+ const pkg = e3.package('remove-test', '1.0.0');
143
+ const zipPath = join(tempDir, 'remove-test.zip');
144
+ await e3.export(pkg, zipPath);
145
+ await packageImport(storage, testRepo, zipPath);
146
+ // Verify package exists
147
+ let packages = await packageList(storage, testRepo);
148
+ assert.strictEqual(packages.length, 1);
149
+ // Remove package
150
+ await packageRemove(storage, testRepo, 'remove-test', '1.0.0');
151
+ // Verify package is gone
152
+ packages = await packageList(storage, testRepo);
153
+ assert.strictEqual(packages.length, 0);
154
+ });
155
+ it('throws for non-existent package', async () => {
156
+ await assert.rejects(async () => await packageRemove(storage, testRepo, 'nonexistent', '1.0.0'), PackageNotFoundError);
157
+ });
158
+ it('removes only specified version', async () => {
159
+ const pkg1 = e3.package('multi-ver', '1.0.0');
160
+ const pkg2 = e3.package('multi-ver', '2.0.0');
161
+ const zip1 = join(tempDir, 'multi-ver-1.zip');
162
+ const zip2 = join(tempDir, 'multi-ver-2.zip');
163
+ await e3.export(pkg1, zip1);
164
+ await e3.export(pkg2, zip2);
165
+ await packageImport(storage, testRepo, zip1);
166
+ await packageImport(storage, testRepo, zip2);
167
+ // Remove only v1
168
+ await packageRemove(storage, testRepo, 'multi-ver', '1.0.0');
169
+ const packages = await packageList(storage, testRepo);
170
+ assert.strictEqual(packages.length, 1);
171
+ assert.strictEqual(packages[0].version, '2.0.0');
172
+ });
173
+ });
174
+ describe('packageExport', () => {
175
+ it('exports empty package', async () => {
176
+ const pkg = e3.package('export-test', '1.0.0');
177
+ const importZip = join(tempDir, 'import.zip');
178
+ await e3.export(pkg, importZip);
179
+ await packageImport(storage, testRepo, importZip);
180
+ const exportZip = join(tempDir, 'export.zip');
181
+ const result = await packageExport(storage, testRepo, 'export-test', '1.0.0', exportZip);
182
+ assert.ok(existsSync(exportZip), 'Export zip should exist');
183
+ assert.strictEqual(result.packageHash.length, 64);
184
+ assert.ok(result.objectCount >= 1, `Expected at least 1 object, got ${result.objectCount}`);
185
+ });
186
+ it('exports package with input dataset', async () => {
187
+ const myInput = e3.input('greeting', StringType, 'hello');
188
+ const pkg = e3.package('export-input', '1.0.0', myInput);
189
+ const importZip = join(tempDir, 'import-input.zip');
190
+ await e3.export(pkg, importZip);
191
+ await packageImport(storage, testRepo, importZip);
192
+ const exportZip = join(tempDir, 'export-input.zip');
193
+ const result = await packageExport(storage, testRepo, 'export-input', '1.0.0', exportZip);
194
+ assert.ok(result.objectCount >= 2, `Expected at least 2 objects, got ${result.objectCount}`);
195
+ });
196
+ it('produces zip with same content as original', async () => {
197
+ const myInput = e3.input('name', StringType, 'world');
198
+ const pkg = e3.package('roundtrip', '1.0.0', myInput);
199
+ const originalZip = join(tempDir, 'original.zip');
200
+ await e3.export(pkg, originalZip);
201
+ await packageImport(storage, testRepo, originalZip);
202
+ const exportedZip = join(tempDir, 'exported.zip');
203
+ await packageExport(storage, testRepo, 'roundtrip', '1.0.0', exportedZip);
204
+ // Compare zip contents (not raw bytes, as order may differ)
205
+ const result = await zipEqual(originalZip, exportedZip);
206
+ assert.ok(result.equal, `Zips should have equal content: ${result.diff}`);
207
+ });
208
+ it('exported zip can be re-imported', async () => {
209
+ const pkg = e3.package('reimport', '1.0.0');
210
+ const importZip = join(tempDir, 'reimport-import.zip');
211
+ await e3.export(pkg, importZip);
212
+ await packageImport(storage, testRepo, importZip);
213
+ const exportZip = join(tempDir, 'reimport-export.zip');
214
+ await packageExport(storage, testRepo, 'reimport', '1.0.0', exportZip);
215
+ // Create a second repo and import the exported zip
216
+ const testRepo2 = createTestRepo();
217
+ const storage2 = new LocalStorage();
218
+ try {
219
+ const result = await packageImport(storage2, testRepo2, exportZip);
220
+ assert.strictEqual(result.name, 'reimport');
221
+ assert.strictEqual(result.version, '1.0.0');
222
+ }
223
+ finally {
224
+ removeTestRepo(testRepo2);
225
+ }
226
+ });
227
+ it('throws for non-existent package', async () => {
228
+ const exportZip = join(tempDir, 'nonexistent.zip');
229
+ await assert.rejects(async () => await packageExport(storage, testRepo, 'nonexistent', '1.0.0', exportZip), PackageNotFoundError);
230
+ });
231
+ });
232
+ describe('packages with tasks', () => {
233
+ it('imports and reads package with single East task', async () => {
234
+ // Create package with a single task
235
+ const input_x = e3.input('x', IntegerType, 10n);
236
+ const task_double = e3.task('double', [input_x], East.function([IntegerType], IntegerType, ($, x) => x.multiply(2n)));
237
+ const pkg = e3.package('single-task', '1.0.0', task_double);
238
+ const zipPath = join(tempDir, 'single-task.zip');
239
+ await e3.export(pkg, zipPath);
240
+ // Import and read
241
+ const importResult = await packageImport(storage, testRepo, zipPath);
242
+ assert.strictEqual(importResult.name, 'single-task');
243
+ assert.strictEqual(importResult.version, '1.0.0');
244
+ // Read the package object to verify tasks are present
245
+ const pkgObject = await packageRead(storage, testRepo, 'single-task', '1.0.0');
246
+ assert.strictEqual(pkgObject.tasks.size, 1);
247
+ assert.ok(pkgObject.tasks.has('double'), 'Should have double task');
248
+ });
249
+ it('imports and reads package with two tasks (simpler than diamond)', async () => {
250
+ // Simpler test: two independent tasks to isolate the issue
251
+ const input_a = e3.input('a', IntegerType, 10n);
252
+ const input_b = e3.input('b', IntegerType, 5n);
253
+ const task_left = e3.task('left', [input_a], East.function([IntegerType], IntegerType, ($, a) => a.multiply(2n)));
254
+ const task_right = e3.task('right', [input_b], East.function([IntegerType], IntegerType, ($, b) => b.multiply(3n)));
255
+ const pkg = e3.package('two-task-test', '1.0.0', task_left, task_right);
256
+ const zipPath = join(tempDir, 'two-task.zip');
257
+ await e3.export(pkg, zipPath);
258
+ // Import
259
+ const importResult = await packageImport(storage, testRepo, zipPath);
260
+ assert.strictEqual(importResult.name, 'two-task-test');
261
+ assert.strictEqual(importResult.version, '1.0.0');
262
+ // Read the package object
263
+ const pkgObject = await packageRead(storage, testRepo, 'two-task-test', '1.0.0');
264
+ // Should have both tasks
265
+ assert.strictEqual(pkgObject.tasks.size, 2);
266
+ assert.ok(pkgObject.tasks.has('left'), 'Should have left task');
267
+ assert.ok(pkgObject.tasks.has('right'), 'Should have right task');
268
+ });
269
+ it('imports and reads package with diamond dependency (multiple tasks)', async () => {
270
+ // Create diamond dependency pattern:
271
+ // input_a, input_b -> task_left, task_right -> task_merge
272
+ const input_a = e3.input('a', IntegerType, 10n);
273
+ const input_b = e3.input('b', IntegerType, 5n);
274
+ const task_left = e3.task('left', [input_a, input_b], East.function([IntegerType, IntegerType], IntegerType, ($, a, b) => a.add(b)));
275
+ const task_right = e3.task('right', [input_a, input_b], East.function([IntegerType, IntegerType], IntegerType, ($, a, b) => a.multiply(b)));
276
+ const task_merge = e3.task('merge', [task_left.output, task_right.output], East.function([IntegerType, IntegerType], IntegerType, ($, left, right) => left.add(right)));
277
+ const pkg = e3.package('diamond-test', '1.0.0', task_merge);
278
+ const zipPath = join(tempDir, 'diamond.zip');
279
+ await e3.export(pkg, zipPath);
280
+ // Import
281
+ const importResult = await packageImport(storage, testRepo, zipPath);
282
+ assert.strictEqual(importResult.name, 'diamond-test');
283
+ assert.strictEqual(importResult.version, '1.0.0');
284
+ // Read the package object
285
+ const pkgObject = await packageRead(storage, testRepo, 'diamond-test', '1.0.0');
286
+ // Should have all 3 tasks
287
+ assert.strictEqual(pkgObject.tasks.size, 3);
288
+ assert.ok(pkgObject.tasks.has('left'), 'Should have left task');
289
+ assert.ok(pkgObject.tasks.has('right'), 'Should have right task');
290
+ assert.ok(pkgObject.tasks.has('merge'), 'Should have merge task');
291
+ // Verify task hashes are present (tasks Map contains name -> hash)
292
+ const mergeTaskHash = pkgObject.tasks.get('merge');
293
+ assert.ok(typeof mergeTaskHash === 'string', 'Task hash should be a string');
294
+ assert.strictEqual(mergeTaskHash.length, 64, 'Task hash should be 64 chars (SHA256)');
295
+ });
296
+ it('roundtrip export of package with tasks preserves content', async () => {
297
+ const input_x = e3.input('x', IntegerType, 10n);
298
+ const task_double = e3.task('double', [input_x], East.function([IntegerType], IntegerType, ($, x) => x.multiply(2n)));
299
+ const pkg = e3.package('task-roundtrip', '1.0.0', task_double);
300
+ const originalZip = join(tempDir, 'task-original.zip');
301
+ await e3.export(pkg, originalZip);
302
+ await packageImport(storage, testRepo, originalZip);
303
+ // Export from repo
304
+ const exportedZip = join(tempDir, 'task-exported.zip');
305
+ await packageExport(storage, testRepo, 'task-roundtrip', '1.0.0', exportedZip);
306
+ // Import into second repo
307
+ const testRepo2 = createTestRepo();
308
+ const storage2 = new LocalStorage();
309
+ try {
310
+ const result = await packageImport(storage2, testRepo2, exportedZip);
311
+ assert.strictEqual(result.name, 'task-roundtrip');
312
+ assert.strictEqual(result.version, '1.0.0');
313
+ // Verify tasks are preserved
314
+ const pkgObject = await packageRead(storage2, testRepo2, 'task-roundtrip', '1.0.0');
315
+ assert.strictEqual(pkgObject.tasks.size, 1);
316
+ assert.ok(pkgObject.tasks.has('double'));
317
+ }
318
+ finally {
319
+ removeTestRepo(testRepo2);
320
+ }
321
+ });
322
+ });
323
+ });
324
+ //# sourceMappingURL=packages.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packages.spec.js","sourceRoot":"","sources":["../../src/packages.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ import type { RepoStore, RepoStatus, RepoMetadata, BatchResult, GcObjectScanResult, GcRootScanResult } from '../interfaces.js';
6
+ /**
7
+ * In-memory implementation of RepoStore for testing.
8
+ *
9
+ * Stores all data in memory maps. Useful for unit tests
10
+ * where filesystem access is not needed.
11
+ *
12
+ * All methods are synchronous but return Promises to match the interface.
13
+ */
14
+ export declare class InMemoryRepoStore implements RepoStore {
15
+ private repos;
16
+ list(): Promise<string[]>;
17
+ exists(repo: string): Promise<boolean>;
18
+ getMetadata(repo: string): Promise<RepoMetadata | null>;
19
+ create(repo: string): Promise<void>;
20
+ setStatus(repo: string, status: RepoStatus, expected?: RepoStatus | RepoStatus[]): Promise<void>;
21
+ remove(repo: string): Promise<void>;
22
+ deleteRefsBatch(_repo: string, _cursor?: string): Promise<BatchResult>;
23
+ deleteObjectsBatch(_repo: string, _cursor?: string): Promise<BatchResult>;
24
+ gcScanPackageRoots(_repo: string, _cursor?: unknown): Promise<GcRootScanResult>;
25
+ gcScanWorkspaceRoots(_repo: string, _cursor?: unknown): Promise<GcRootScanResult>;
26
+ gcScanExecutionRoots(_repo: string, _cursor?: unknown): Promise<GcRootScanResult>;
27
+ gcScanObjects(_repo: string, _cursor?: unknown): Promise<GcObjectScanResult>;
28
+ gcDeleteObjects(_repo: string, _hashes: string[]): Promise<void>;
29
+ /**
30
+ * Clear all repositories.
31
+ * Useful for test cleanup.
32
+ */
33
+ clear(): void;
34
+ }
35
+ //# sourceMappingURL=InMemoryRepoStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryRepoStore.d.ts","sourceRoot":"","sources":["../../../../src/storage/in-memory/InMemoryRepoStore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,UAAU,EACV,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAO1B;;;;;;;GAOG;AAEH,qBAAa,iBAAkB,YAAW,SAAS;IACjD,OAAO,CAAC,KAAK,CAAmC;IAM1C,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAItC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAQvD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcnC,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,EAClB,QAAQ,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,GACnC,OAAO,CAAC,IAAI,CAAC;IAuBV,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAKtE,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IASzE,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI/E,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIjF,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIjF,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAI5E,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtE;;;OAGG;IACH,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ import { RepoNotFoundError, RepoAlreadyExistsError, RepoStatusConflictError, } from '../../errors.js';
6
+ /**
7
+ * In-memory implementation of RepoStore for testing.
8
+ *
9
+ * Stores all data in memory maps. Useful for unit tests
10
+ * where filesystem access is not needed.
11
+ *
12
+ * All methods are synchronous but return Promises to match the interface.
13
+ */
14
+ /* eslint-disable @typescript-eslint/require-await */
15
+ export class InMemoryRepoStore {
16
+ repos = new Map();
17
+ // ===========================================================================
18
+ // Queries
19
+ // ===========================================================================
20
+ async list() {
21
+ return [...this.repos.keys()];
22
+ }
23
+ async exists(repo) {
24
+ return this.repos.has(repo);
25
+ }
26
+ async getMetadata(repo) {
27
+ return this.repos.get(repo) ?? null;
28
+ }
29
+ // ===========================================================================
30
+ // Lifecycle
31
+ // ===========================================================================
32
+ async create(repo) {
33
+ if (this.repos.has(repo)) {
34
+ throw new RepoAlreadyExistsError(repo);
35
+ }
36
+ const now = new Date().toISOString();
37
+ this.repos.set(repo, {
38
+ name: repo,
39
+ status: 'active',
40
+ createdAt: now,
41
+ statusChangedAt: now,
42
+ });
43
+ }
44
+ async setStatus(repo, status, expected) {
45
+ const current = this.repos.get(repo);
46
+ if (!current) {
47
+ throw new RepoNotFoundError(repo);
48
+ }
49
+ // Check expected status (CAS)
50
+ if (expected !== undefined) {
51
+ const expectedArray = Array.isArray(expected) ? expected : [expected];
52
+ if (!expectedArray.includes(current.status)) {
53
+ throw new RepoStatusConflictError(repo, expected, current.status);
54
+ }
55
+ }
56
+ // Update status
57
+ const now = new Date().toISOString();
58
+ this.repos.set(repo, {
59
+ ...current,
60
+ status,
61
+ statusChangedAt: now,
62
+ });
63
+ }
64
+ async remove(repo) {
65
+ this.repos.delete(repo);
66
+ }
67
+ // ===========================================================================
68
+ // Batched Deletion
69
+ // ===========================================================================
70
+ async deleteRefsBatch(_repo, _cursor) {
71
+ // In-memory doesn't have refs to delete
72
+ return { status: 'done', deleted: 0 };
73
+ }
74
+ async deleteObjectsBatch(_repo, _cursor) {
75
+ // In-memory doesn't have objects to delete
76
+ return { status: 'done', deleted: 0 };
77
+ }
78
+ // ===========================================================================
79
+ // GC Primitives
80
+ // ===========================================================================
81
+ async gcScanPackageRoots(_repo, _cursor) {
82
+ return { roots: [] };
83
+ }
84
+ async gcScanWorkspaceRoots(_repo, _cursor) {
85
+ return { roots: [] };
86
+ }
87
+ async gcScanExecutionRoots(_repo, _cursor) {
88
+ return { roots: [] };
89
+ }
90
+ async gcScanObjects(_repo, _cursor) {
91
+ return { objects: [] };
92
+ }
93
+ async gcDeleteObjects(_repo, _hashes) {
94
+ // Nothing to delete
95
+ }
96
+ // ===========================================================================
97
+ // Test Utilities
98
+ // ===========================================================================
99
+ /**
100
+ * Clear all repositories.
101
+ * Useful for test cleanup.
102
+ */
103
+ clear() {
104
+ this.repos.clear();
105
+ }
106
+ }
107
+ //# sourceMappingURL=InMemoryRepoStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryRepoStore.js","sourceRoot":"","sources":["../../../../src/storage/in-memory/InMemoryRepoStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Licensed under BSL 1.1. See LICENSE for details.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=InMemoryRepoStore.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryRepoStore.spec.d.ts","sourceRoot":"","sources":["../../../../src/storage/in-memory/InMemoryRepoStore.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG"}