@0xsequence/catapult 1.3.17 → 1.5.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 (232) hide show
  1. package/README.md +276 -0
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +1 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/index.d.ts +1 -0
  6. package/dist/commands/index.d.ts.map +1 -1
  7. package/dist/commands/index.js +1 -0
  8. package/dist/commands/index.js.map +1 -1
  9. package/dist/commands/list.d.ts.map +1 -1
  10. package/dist/commands/list.js +12 -0
  11. package/dist/commands/list.js.map +1 -1
  12. package/dist/commands/provenance.d.ts +3 -0
  13. package/dist/commands/provenance.d.ts.map +1 -0
  14. package/dist/commands/provenance.js +138 -0
  15. package/dist/commands/provenance.js.map +1 -0
  16. package/dist/lib/__tests__/deployer.spec.js +118 -1
  17. package/dist/lib/__tests__/deployer.spec.js.map +1 -1
  18. package/dist/lib/__tests__/network-loader.spec.js.map +1 -1
  19. package/dist/lib/__tests__/provenance.spec.d.ts +2 -0
  20. package/dist/lib/__tests__/provenance.spec.d.ts.map +1 -0
  21. package/dist/lib/__tests__/provenance.spec.js +205 -0
  22. package/dist/lib/__tests__/provenance.spec.js.map +1 -0
  23. package/dist/lib/contracts/__tests__/repository.spec.js +243 -0
  24. package/dist/lib/contracts/__tests__/repository.spec.js.map +1 -1
  25. package/dist/lib/contracts/repository.d.ts +9 -1
  26. package/dist/lib/contracts/repository.d.ts.map +1 -1
  27. package/dist/lib/contracts/repository.js +93 -7
  28. package/dist/lib/contracts/repository.js.map +1 -1
  29. package/dist/lib/core/__tests__/assert-action.spec.d.ts +2 -0
  30. package/dist/lib/core/__tests__/assert-action.spec.d.ts.map +1 -0
  31. package/dist/lib/core/__tests__/assert-action.spec.js +377 -0
  32. package/dist/lib/core/__tests__/assert-action.spec.js.map +1 -0
  33. package/dist/lib/core/__tests__/engine.spec.js +80 -0
  34. package/dist/lib/core/__tests__/engine.spec.js.map +1 -1
  35. package/dist/lib/core/__tests__/loader.spec.js +29 -0
  36. package/dist/lib/core/__tests__/loader.spec.js.map +1 -1
  37. package/dist/lib/core/__tests__/resolver.spec.js +405 -0
  38. package/dist/lib/core/__tests__/resolver.spec.js.map +1 -1
  39. package/dist/lib/core/__tests__/sign-actions.spec.d.ts +2 -0
  40. package/dist/lib/core/__tests__/sign-actions.spec.d.ts.map +1 -0
  41. package/dist/lib/core/__tests__/sign-actions.spec.js +128 -0
  42. package/dist/lib/core/__tests__/sign-actions.spec.js.map +1 -0
  43. package/dist/lib/core/__tests__/signer.spec.d.ts +2 -0
  44. package/dist/lib/core/__tests__/signer.spec.d.ts.map +1 -0
  45. package/dist/lib/core/__tests__/signer.spec.js +40 -0
  46. package/dist/lib/core/__tests__/signer.spec.js.map +1 -0
  47. package/dist/lib/core/context.d.ts +3 -2
  48. package/dist/lib/core/context.d.ts.map +1 -1
  49. package/dist/lib/core/context.js +3 -2
  50. package/dist/lib/core/context.js.map +1 -1
  51. package/dist/lib/core/engine.d.ts +4 -0
  52. package/dist/lib/core/engine.d.ts.map +1 -1
  53. package/dist/lib/core/engine.js +206 -0
  54. package/dist/lib/core/engine.js.map +1 -1
  55. package/dist/lib/core/loader.d.ts +1 -0
  56. package/dist/lib/core/loader.d.ts.map +1 -1
  57. package/dist/lib/core/loader.js +6 -1
  58. package/dist/lib/core/loader.js.map +1 -1
  59. package/dist/lib/core/resolver.d.ts +2 -0
  60. package/dist/lib/core/resolver.d.ts.map +1 -1
  61. package/dist/lib/core/resolver.js +89 -0
  62. package/dist/lib/core/resolver.js.map +1 -1
  63. package/dist/lib/core/signer.d.ts +7 -0
  64. package/dist/lib/core/signer.d.ts.map +1 -0
  65. package/dist/lib/core/signer.js +60 -0
  66. package/dist/lib/core/signer.js.map +1 -0
  67. package/dist/lib/deployer.d.ts.map +1 -1
  68. package/dist/lib/deployer.js +21 -4
  69. package/dist/lib/deployer.js.map +1 -1
  70. package/dist/lib/index.d.ts +1 -0
  71. package/dist/lib/index.d.ts.map +1 -1
  72. package/dist/lib/index.js +1 -0
  73. package/dist/lib/index.js.map +1 -1
  74. package/dist/lib/parsers/__tests__/job.spec.js +77 -0
  75. package/dist/lib/parsers/__tests__/job.spec.js.map +1 -1
  76. package/dist/lib/parsers/__tests__/source.spec.d.ts +2 -0
  77. package/dist/lib/parsers/__tests__/source.spec.d.ts.map +1 -0
  78. package/dist/lib/parsers/__tests__/source.spec.js +158 -0
  79. package/dist/lib/parsers/__tests__/source.spec.js.map +1 -0
  80. package/dist/lib/parsers/index.d.ts +1 -0
  81. package/dist/lib/parsers/index.d.ts.map +1 -1
  82. package/dist/lib/parsers/index.js +1 -0
  83. package/dist/lib/parsers/index.js.map +1 -1
  84. package/dist/lib/parsers/job.d.ts.map +1 -1
  85. package/dist/lib/parsers/job.js +11 -0
  86. package/dist/lib/parsers/job.js.map +1 -1
  87. package/dist/lib/parsers/source.d.ts +4 -0
  88. package/dist/lib/parsers/source.d.ts.map +1 -0
  89. package/dist/lib/parsers/source.js +107 -0
  90. package/dist/lib/parsers/source.js.map +1 -0
  91. package/dist/lib/provenance.d.ts +34 -0
  92. package/dist/lib/provenance.d.ts.map +1 -0
  93. package/dist/lib/provenance.js +694 -0
  94. package/dist/lib/provenance.js.map +1 -0
  95. package/dist/lib/types/actions.d.ts +42 -2
  96. package/dist/lib/types/actions.d.ts.map +1 -1
  97. package/dist/lib/types/actions.js +4 -0
  98. package/dist/lib/types/actions.js.map +1 -1
  99. package/dist/lib/types/contracts.d.ts +3 -0
  100. package/dist/lib/types/contracts.d.ts.map +1 -1
  101. package/dist/lib/types/definitions.d.ts +1 -0
  102. package/dist/lib/types/definitions.d.ts.map +1 -1
  103. package/dist/lib/types/index.d.ts +1 -0
  104. package/dist/lib/types/index.d.ts.map +1 -1
  105. package/dist/lib/types/index.js +1 -0
  106. package/dist/lib/types/index.js.map +1 -1
  107. package/dist/lib/types/source.d.ts +26 -0
  108. package/dist/lib/types/source.d.ts.map +1 -0
  109. package/dist/lib/types/source.js +3 -0
  110. package/dist/lib/types/source.js.map +1 -0
  111. package/dist/lib/types/values.d.ts +33 -1
  112. package/dist/lib/types/values.d.ts.map +1 -1
  113. package/package.json +4 -1
  114. package/.eslintrc.json +0 -29
  115. package/.github/workflows/ci.yml +0 -181
  116. package/CONCEPT.md +0 -24
  117. package/contracts/checked-call.huff +0 -65
  118. package/eslint.config.js +0 -48
  119. package/examples/jobs/guards-v1.yaml +0 -17
  120. package/examples/jobs/sequence-seq-0001-patch.yaml +0 -59
  121. package/examples/jobs/sequence-v1.yaml +0 -59
  122. package/examples/templates/sequence-factory-v1.yaml +0 -56
  123. package/jest.config.js +0 -25
  124. package/src/cli.ts +0 -17
  125. package/src/commands/common.ts +0 -61
  126. package/src/commands/dry.ts +0 -209
  127. package/src/commands/etherscan.ts +0 -360
  128. package/src/commands/index.ts +0 -5
  129. package/src/commands/list.ts +0 -249
  130. package/src/commands/run.ts +0 -146
  131. package/src/commands/utils.ts +0 -215
  132. package/src/index.ts +0 -67
  133. package/src/lib/__tests__/deployer-events.spec.ts +0 -338
  134. package/src/lib/__tests__/deployer.spec.ts +0 -2093
  135. package/src/lib/__tests__/network-loader.spec.ts +0 -150
  136. package/src/lib/__tests__/network-selection.spec.ts +0 -41
  137. package/src/lib/__tests__/network-utils.spec.ts +0 -230
  138. package/src/lib/artifacts/__tests__/fixtures/contract1.json +0 -19
  139. package/src/lib/artifacts/__tests__/fixtures/contract2.json +0 -19
  140. package/src/lib/artifacts/__tests__/fixtures/duplicate-name.json +0 -19
  141. package/src/lib/artifacts/__tests__/fixtures/nested/nested-contract.json +0 -18
  142. package/src/lib/artifacts/__tests__/fixtures/not-an-artifact.json +0 -8
  143. package/src/lib/artifacts/__tests__/fixtures/readme.txt +0 -2
  144. package/src/lib/contracts/__tests__/repository.spec.ts +0 -344
  145. package/src/lib/contracts/repository.ts +0 -313
  146. package/src/lib/core/__tests__/context.spec.ts +0 -37
  147. package/src/lib/core/__tests__/engine.spec.ts +0 -1889
  148. package/src/lib/core/__tests__/graph.spec.ts +0 -125
  149. package/src/lib/core/__tests__/json-integration.spec.ts +0 -425
  150. package/src/lib/core/__tests__/loader.spec.ts +0 -334
  151. package/src/lib/core/__tests__/multi-platform-verification.spec.ts +0 -406
  152. package/src/lib/core/__tests__/resolver.spec.ts +0 -2053
  153. package/src/lib/core/__tests__/static-action.spec.ts +0 -172
  154. package/src/lib/core/context.ts +0 -127
  155. package/src/lib/core/engine.ts +0 -1782
  156. package/src/lib/core/graph.ts +0 -252
  157. package/src/lib/core/loader.ts +0 -247
  158. package/src/lib/core/resolver.ts +0 -757
  159. package/src/lib/deployer.ts +0 -981
  160. package/src/lib/events/__tests__/event-system.spec.ts +0 -392
  161. package/src/lib/events/cli-adapter.ts +0 -369
  162. package/src/lib/events/emitter.ts +0 -62
  163. package/src/lib/events/index.ts +0 -3
  164. package/src/lib/events/types.ts +0 -520
  165. package/src/lib/index.ts +0 -14
  166. package/src/lib/network-loader.ts +0 -90
  167. package/src/lib/network-selection.ts +0 -73
  168. package/src/lib/network-utils.ts +0 -64
  169. package/src/lib/parsers/__tests__/buildinfo.spec.ts +0 -122
  170. package/src/lib/parsers/__tests__/fixtures/buildinfo/invalid-bytecode-buildinfo.json +0 -62
  171. package/src/lib/parsers/__tests__/fixtures/buildinfo/invalid-json.txt +0 -2
  172. package/src/lib/parsers/__tests__/fixtures/buildinfo/multi-contract-buildinfo.json +0 -89
  173. package/src/lib/parsers/__tests__/fixtures/buildinfo/no-contracts-buildinfo.json +0 -17
  174. package/src/lib/parsers/__tests__/fixtures/buildinfo/simple-buildinfo.json +0 -63
  175. package/src/lib/parsers/__tests__/fixtures/buildinfo/wrong-format.json +0 -4
  176. package/src/lib/parsers/__tests__/job.spec.ts +0 -358
  177. package/src/lib/parsers/__tests__/template.spec.ts +0 -111
  178. package/src/lib/parsers/artifact/__tests__/artifact.spec.ts +0 -117
  179. package/src/lib/parsers/artifact/__tests__/fixtures/empty-bytecode.json +0 -5
  180. package/src/lib/parsers/artifact/__tests__/fixtures/hardhat-artifact.json +0 -67
  181. package/src/lib/parsers/artifact/__tests__/fixtures/invalid-bytecode.json +0 -5
  182. package/src/lib/parsers/artifact/__tests__/fixtures/invalid-json.txt +0 -11
  183. package/src/lib/parsers/artifact/__tests__/fixtures/minimal-artifact.json +0 -5
  184. package/src/lib/parsers/artifact/__tests__/fixtures/missing-abi.json +0 -4
  185. package/src/lib/parsers/artifact/__tests__/fixtures/missing-bytecode.json +0 -11
  186. package/src/lib/parsers/artifact/__tests__/fixtures/missing-contract-name.json +0 -11
  187. package/src/lib/parsers/artifact/__tests__/fixtures/simple-artifact.json +0 -40
  188. package/src/lib/parsers/artifact/__tests__/fixtures/wrong-types.json +0 -7
  189. package/src/lib/parsers/artifact/foundry-1.2.ts +0 -72
  190. package/src/lib/parsers/artifact/index.ts +0 -27
  191. package/src/lib/parsers/artifact/types.ts +0 -9
  192. package/src/lib/parsers/buildinfo.ts +0 -127
  193. package/src/lib/parsers/constants.ts +0 -56
  194. package/src/lib/parsers/index.ts +0 -5
  195. package/src/lib/parsers/job.ts +0 -148
  196. package/src/lib/parsers/template.ts +0 -135
  197. package/src/lib/std/templates/arachnid-deterministic-deployment-proxy.yaml +0 -68
  198. package/src/lib/std/templates/assured-deployment.yaml +0 -46
  199. package/src/lib/std/templates/era-evm-predeploy.yaml +0 -35
  200. package/src/lib/std/templates/erc-2470.yaml +0 -70
  201. package/src/lib/std/templates/min-balance.yaml +0 -35
  202. package/src/lib/std/templates/nano-universal-deployer.yaml +0 -61
  203. package/src/lib/std/templates/raw-erc-2470.yaml +0 -62
  204. package/src/lib/std/templates/raw-nano-universal-deployer.yaml +0 -54
  205. package/src/lib/std/templates/raw-sequence-universal-deployer-2.yaml +0 -52
  206. package/src/lib/std/templates/sequence-universal-deployer-2.yaml +0 -61
  207. package/src/lib/types/__tests__/json-request-action.spec.ts +0 -243
  208. package/src/lib/types/__tests__/read-json-value.spec.ts +0 -278
  209. package/src/lib/types/__tests__/resolve-json-value.spec.ts +0 -769
  210. package/src/lib/types/actions.ts +0 -127
  211. package/src/lib/types/artifacts.ts +0 -21
  212. package/src/lib/types/buildinfo.ts +0 -116
  213. package/src/lib/types/conditions.ts +0 -50
  214. package/src/lib/types/contracts.ts +0 -23
  215. package/src/lib/types/definitions.ts +0 -70
  216. package/src/lib/types/index.ts +0 -8
  217. package/src/lib/types/network.ts +0 -33
  218. package/src/lib/types/project.ts +0 -9
  219. package/src/lib/types/task.ts +0 -9
  220. package/src/lib/types/values.ts +0 -150
  221. package/src/lib/utils/assertion.ts +0 -24
  222. package/src/lib/utils/validation.ts +0 -116
  223. package/src/lib/validation/contract-references.ts +0 -210
  224. package/src/lib/validation/index.ts +0 -1
  225. package/src/lib/verification/__tests__/etherscan.spec.ts +0 -710
  226. package/src/lib/verification/__tests__/sourcify.spec.ts +0 -288
  227. package/src/lib/verification/etherscan.ts +0 -547
  228. package/src/lib/verification/sourcify.ts +0 -248
  229. package/test_validation/artifacts/TestContract.json +0 -9
  230. package/test_validation/jobs/test-missing.yaml +0 -16
  231. package/test_validation/networks.yaml +0 -3
  232. package/tsconfig.json +0 -36
@@ -1,334 +0,0 @@
1
- import * as fs from 'fs/promises'
2
- import * as path from 'path'
3
- import { randomBytes } from 'crypto'
4
- import { ProjectLoader } from '../loader'
5
- import { Job, Template } from '../../types'
6
-
7
- describe('ProjectLoader', () => {
8
- let tempDir: string
9
- let testRunId: string
10
- let baseTestDir: string
11
-
12
- beforeAll(() => {
13
- // Generate unique test run ID
14
- testRunId = `test_${Date.now()}_${randomBytes(4).toString('hex')}`
15
- baseTestDir = `/tmp/catapult_testing/${testRunId}`
16
- })
17
-
18
- beforeEach(async () => {
19
- // Create a unique temporary directory for each test
20
- const testId = randomBytes(4).toString('hex')
21
- tempDir = path.join(baseTestDir, testId)
22
- await fs.mkdir(tempDir, { recursive: true })
23
- })
24
-
25
- afterEach(async () => {
26
- // Clean up individual test directory
27
- try {
28
- await fs.rm(tempDir, { recursive: true, force: true })
29
- } catch (error) {
30
- // Ignore cleanup errors for individual tests
31
- }
32
- })
33
-
34
- afterAll(async () => {
35
- // Clean up entire test run directory as safety net
36
- try {
37
- await fs.rm(baseTestDir, { recursive: true, force: true })
38
- } catch (error) {
39
- // Ignore cleanup errors
40
- }
41
- })
42
-
43
- describe('job loading', () => {
44
- it('should load jobs from the root jobs directory', async () => {
45
- const jobsDir = path.join(tempDir, 'jobs')
46
- await fs.mkdir(jobsDir, { recursive: true })
47
-
48
- const jobYaml = `name: "test-job"
49
- version: "1"
50
- description: "A test job"
51
- depends_on: []
52
- actions:
53
- - name: "test-action"
54
- template: "test-template"
55
- arguments: {}`
56
-
57
- await fs.writeFile(path.join(jobsDir, 'test-job.yaml'), jobYaml)
58
-
59
- const loader = new ProjectLoader(tempDir)
60
- await loader.load()
61
-
62
- expect(loader.jobs.size).toBe(1)
63
- expect(loader.jobs.has('test-job')).toBe(true)
64
-
65
- const job = loader.jobs.get('test-job')!
66
- expect(job.name).toBe('test-job')
67
- expect(job.version).toBe('1')
68
- expect(job.description).toBe('A test job')
69
- })
70
-
71
- it('should recursively load jobs from nested directories', async () => {
72
- const jobsDir = path.join(tempDir, 'jobs')
73
- const nestedDir = path.join(jobsDir, 'nested', 'deeper')
74
- await fs.mkdir(nestedDir, { recursive: true })
75
-
76
- // Root level job
77
- const rootJobYaml = `name: "root-job"
78
- version: "1"
79
- description: "Root level job"
80
- depends_on: []
81
- actions: []`
82
-
83
- // Nested job
84
- const nestedJobYaml = `name: "nested-job"
85
- version: "1"
86
- description: "Nested job"
87
- depends_on: []
88
- actions: []`
89
-
90
- // Deep nested job
91
- const deepJobYaml = `name: "deep-job"
92
- version: "1"
93
- description: "Deep nested job"
94
- depends_on: []
95
- actions: []`
96
-
97
- await fs.writeFile(path.join(jobsDir, 'root-job.yaml'), rootJobYaml)
98
- await fs.writeFile(path.join(jobsDir, 'nested', 'nested-job.yml'), nestedJobYaml)
99
- await fs.writeFile(path.join(nestedDir, 'deep-job.yaml'), deepJobYaml)
100
-
101
- const loader = new ProjectLoader(tempDir)
102
- await loader.load()
103
-
104
- expect(loader.jobs.size).toBe(3)
105
- expect(loader.jobs.has('root-job')).toBe(true)
106
- expect(loader.jobs.has('nested-job')).toBe(true)
107
- expect(loader.jobs.has('deep-job')).toBe(true)
108
- })
109
-
110
- it('should ignore jobs in node_modules and other ignored directories', async () => {
111
- const jobsDir = path.join(tempDir, 'jobs')
112
- const nodeModulesDir = path.join(jobsDir, 'node_modules')
113
- const distDir = path.join(jobsDir, 'dist')
114
- await fs.mkdir(nodeModulesDir, { recursive: true })
115
- await fs.mkdir(distDir, { recursive: true })
116
-
117
- const validJobYaml = `name: "valid-job"
118
- version: "1"
119
- actions: []`
120
-
121
- const ignoredJobYaml = `name: "ignored-job"
122
- version: "1"
123
- actions: []`
124
-
125
- await fs.writeFile(path.join(jobsDir, 'valid-job.yaml'), validJobYaml)
126
- await fs.writeFile(path.join(nodeModulesDir, 'ignored-job.yaml'), ignoredJobYaml)
127
- await fs.writeFile(path.join(distDir, 'ignored-job2.yaml'), ignoredJobYaml)
128
-
129
- const loader = new ProjectLoader(tempDir)
130
- await loader.load()
131
-
132
- expect(loader.jobs.size).toBe(1)
133
- expect(loader.jobs.has('valid-job')).toBe(true)
134
- expect(loader.jobs.has('ignored-job')).toBe(false)
135
- })
136
-
137
- it('should handle malformed job files gracefully', async () => {
138
- const jobsDir = path.join(tempDir, 'jobs')
139
- await fs.mkdir(jobsDir, { recursive: true })
140
-
141
- const validJobYaml = `name: "valid-job"
142
- version: "1"
143
- actions: []`
144
-
145
- const invalidJobYaml = `invalid: yaml: content: [[[`
146
-
147
- await fs.writeFile(path.join(jobsDir, 'valid-job.yaml'), validJobYaml)
148
- await fs.writeFile(path.join(jobsDir, 'invalid-job.yaml'), invalidJobYaml)
149
-
150
- const loader = new ProjectLoader(tempDir)
151
- await loader.load()
152
-
153
- // Should load the valid job and skip the invalid one
154
- expect(loader.jobs.size).toBe(1)
155
- expect(loader.jobs.has('valid-job')).toBe(true)
156
- })
157
- })
158
-
159
- describe('template loading', () => {
160
- it('should load templates from the root templates directory', async () => {
161
- const templatesDir = path.join(tempDir, 'templates')
162
- await fs.mkdir(templatesDir, { recursive: true })
163
-
164
- const templateYaml = `name: "test-template"
165
- description: "A test template"
166
- actions:
167
- - name: "test-action"
168
- arguments: {}`
169
-
170
- await fs.writeFile(path.join(templatesDir, 'test-template.yaml'), templateYaml)
171
-
172
- const loader = new ProjectLoader(tempDir)
173
- await loader.load()
174
-
175
- expect(loader.templates.size).toBeGreaterThan(0) // Includes std templates
176
- expect(loader.templates.has('test-template')).toBe(true)
177
-
178
- const template = loader.templates.get('test-template')!
179
- expect(template.name).toBe('test-template')
180
- expect(template.description).toBe('A test template')
181
- })
182
-
183
- it('should recursively load templates from nested directories', async () => {
184
- const templatesDir = path.join(tempDir, 'templates')
185
- const nestedDir = path.join(templatesDir, 'nested')
186
- await fs.mkdir(nestedDir, { recursive: true })
187
-
188
- const rootTemplateYaml = `name: "root-template"
189
- actions: []`
190
-
191
- const nestedTemplateYaml = `name: "nested-template"
192
- actions: []`
193
-
194
- await fs.writeFile(path.join(templatesDir, 'root-template.yaml'), rootTemplateYaml)
195
- await fs.writeFile(path.join(nestedDir, 'nested-template.yml'), nestedTemplateYaml)
196
-
197
- const loader = new ProjectLoader(tempDir)
198
- await loader.load()
199
-
200
- expect(loader.templates.has('root-template')).toBe(true)
201
- expect(loader.templates.has('nested-template')).toBe(true)
202
- })
203
- })
204
-
205
- describe('artifact loading', () => {
206
- it('should load artifacts from nested directories', async () => {
207
- const artifactsDir = path.join(tempDir, 'artifacts', 'contracts')
208
- await fs.mkdir(artifactsDir, { recursive: true })
209
-
210
- const artifactJson = {
211
- contractName: "TestContract",
212
- abi: [],
213
- bytecode: "0x608060405234801561001057600080fd5b50",
214
- deployedBytecode: "0x608060405234801561001057600080fd5b50"
215
- }
216
-
217
- await fs.writeFile(path.join(artifactsDir, 'TestContract.json'), JSON.stringify(artifactJson))
218
-
219
- const loader = new ProjectLoader(tempDir)
220
- await loader.load()
221
-
222
- expect(loader.contractRepository.lookup('TestContract')).toBeDefined()
223
- })
224
- })
225
-
226
- describe('edge cases', () => {
227
- it('should handle missing jobs directory gracefully', async () => {
228
- const loader = new ProjectLoader(tempDir)
229
- await loader.load()
230
-
231
- expect(loader.jobs.size).toBe(0)
232
- })
233
-
234
- it('should handle missing templates directory gracefully', async () => {
235
- const loader = new ProjectLoader(tempDir, { loadStdTemplates: false })
236
- await loader.load()
237
-
238
- expect(loader.templates.size).toBe(0)
239
- })
240
-
241
- it('should load standard templates by default', async () => {
242
- const loader = new ProjectLoader(tempDir)
243
- await loader.load()
244
-
245
- // Standard templates should be loaded
246
- expect(loader.templates.size).toBeGreaterThan(0)
247
- })
248
-
249
- it('should skip standard templates when disabled', async () => {
250
- const loader = new ProjectLoader(tempDir, { loadStdTemplates: false })
251
- await loader.load()
252
-
253
- expect(loader.templates.size).toBe(0)
254
- })
255
- })
256
-
257
- describe('real project structure', () => {
258
- it('should load the examples project structure', async () => {
259
- const examplesRoot = path.resolve(__dirname, '../../../../examples')
260
- const loader = new ProjectLoader(examplesRoot)
261
- await loader.load()
262
-
263
- // Should load some jobs and templates from examples
264
- expect(loader.jobs.size).toBeGreaterThan(0)
265
- expect(loader.templates.size).toBeGreaterThan(0)
266
-
267
- // Check for known jobs from examples
268
- expect(loader.jobs.has('sequence-v1')).toBe(true)
269
- expect(loader.jobs.has('guards-v1')).toBe(true)
270
- })
271
-
272
- it('should load nested jobs from subdirectories', async () => {
273
- // Create a nested job structure similar to examples2
274
- const jobsDir = path.join(tempDir, 'jobs')
275
- const testContractDir = path.join(jobsDir, 'test_contract')
276
- const artifactsDir = path.join(testContractDir, 'artifacts')
277
-
278
- await fs.mkdir(artifactsDir, { recursive: true })
279
-
280
- // Create the nested job file
281
- const jobYaml = `name: "test-contract-deployment"
282
- version: "1"
283
- description: "Deploy a test contract"
284
- depends_on: []
285
-
286
- actions:
287
- - name: "deploy-test-contract"
288
- template: "sequence-universal-deployer-2"
289
- arguments:
290
- salt: "0x0000000000000000000000000000000000000000000000000000000000000003"
291
- creationCode: "{{creationCode(./artifacts/counter.json)}}"`
292
-
293
- // Create a sample artifact file
294
- const artifactJson = {
295
- abi: [
296
- {
297
- type: "function",
298
- name: "increment",
299
- inputs: [],
300
- outputs: [],
301
- stateMutability: "nonpayable"
302
- },
303
- {
304
- type: "function",
305
- name: "number",
306
- inputs: [],
307
- outputs: [{ name: "", type: "uint256", internalType: "uint256" }],
308
- stateMutability: "view"
309
- }
310
- ],
311
- bytecode: {
312
- object: "0x6080604052348015600e575f5ffd5b5060c180601a5f395ff3fe6080604052348015600e575f5ffd5b50600436106030575f3560e01c80638381f58a146034578063d09de08a14604d575b5f5ffd5b603b5f5481565b60405190815260200160405180910390f35b60536055565b005b5f805490806061836068565b9190505550565b5f60018201608457634e487b7160e01b5f52601160045260245ffd5b506001019056fea264697066735822122074300f82bc4b1d0eec22668b0edf09603d979df755b8315a9a2493d4f5c293c364736f6c634300081e0033"
313
- },
314
- deployedBytecode: {
315
- object: "0x6080604052348015600e575f5ffd5b50600436106030575f3560e01c80638381f58a146034578063d09de08a14604d575b5f5ffd5b603b5f5481565b60405190815260200160405180910390f35b60536055565b005b5f805490806061836068565b9190505550565b5f60018201608457634e487b7160e01b5f52601160045260245ffd5b506001019056fea264697066735822122074300f82bc4b1d0eec22668b0edf09603d979df755b8315a9a2493d4f5c293c364736f6c634300081e0033"
316
- }
317
- }
318
-
319
- await fs.writeFile(path.join(testContractDir, 'demo_contract.yaml'), jobYaml)
320
- await fs.writeFile(path.join(artifactsDir, 'counter.json'), JSON.stringify(artifactJson))
321
-
322
- const loader = new ProjectLoader(tempDir)
323
- await loader.load()
324
-
325
- // Should load the nested job
326
- expect(loader.jobs.size).toBeGreaterThan(0)
327
- expect(loader.jobs.has('test-contract-deployment')).toBe(true)
328
-
329
- const job = loader.jobs.get('test-contract-deployment')!
330
- expect(job.name).toBe('test-contract-deployment')
331
- expect(job.description).toBe('Deploy a test contract')
332
- })
333
- })
334
- })