rocketh 0.16.0 → 0.17.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 (38) hide show
  1. package/dist/cli.js +0 -0
  2. package/dist/environment/index.d.ts +12 -2
  3. package/dist/environment/index.d.ts.map +1 -1
  4. package/dist/environment/index.js +94 -48
  5. package/dist/environment/index.js.map +1 -1
  6. package/dist/environment/utils/artifacts.d.ts +4 -4
  7. package/dist/executor/index.d.ts +16 -23
  8. package/dist/executor/index.d.ts.map +1 -1
  9. package/dist/executor/index.js +311 -128
  10. package/dist/executor/index.js.map +1 -1
  11. package/dist/index.d.ts +8 -10
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +8 -8
  14. package/dist/index.js.map +1 -1
  15. package/dist/internal/logging.d.ts +1 -1
  16. package/dist/internal/logging.d.ts.map +1 -1
  17. package/dist/internal/types.d.ts +0 -1
  18. package/dist/internal/types.d.ts.map +1 -1
  19. package/dist/types.d.ts +25 -0
  20. package/dist/types.d.ts.map +1 -1
  21. package/package.json +18 -17
  22. package/.prettierignore +0 -3
  23. package/.prettierrc +0 -7
  24. package/CHANGELOG.md +0 -961
  25. package/dist/environment/deployments.d.ts +0 -12
  26. package/dist/environment/deployments.d.ts.map +0 -1
  27. package/dist/environment/deployments.js +0 -108
  28. package/dist/environment/deployments.js.map +0 -1
  29. package/dist/executor/setup.test.d.ts +0 -14
  30. package/dist/executor/setup.test.d.ts.map +0 -1
  31. package/dist/executor/setup.test.js +0 -107
  32. package/dist/executor/setup.test.js.map +0 -1
  33. package/src/cli.ts +0 -35
  34. package/src/environment/deployment-store.ts +0 -72
  35. package/src/executor/index.ts +0 -329
  36. package/src/index.ts +0 -16
  37. package/src/utils/fs.ts +0 -70
  38. package/tsconfig.json +0 -18
@@ -1,329 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import prompts from 'prompts';
4
- import {
5
- type Environment,
6
- type ExecutionParams,
7
- type ResolvedExecutionParams,
8
- type UnknownDeployments,
9
- type UnresolvedNetworkSpecificData,
10
- type UnresolvedUnknownNamedAccounts,
11
- type DeployScriptModule,
12
- type EnhancedEnvironment,
13
- type ResolvedUserConfig,
14
- type ConfigOverrides,
15
- type UserConfig,
16
- type PromptExecutor,
17
- } from '@rocketh/core/types';
18
- import {
19
- withEnvironment,
20
- resolveConfig,
21
- resolveExecutionParams,
22
- createEnvironment,
23
- logger,
24
- getEnvironmentName,
25
- getChainIdForEnvironment,
26
- createExecutor,
27
- setupDeployScripts,
28
- loadDeployments,
29
- } from '@rocketh/core';
30
- import {traverseMultipleDirectory} from '../utils/fs.js';
31
- import {createFSDeploymentStore} from '../environment/deployment-store.js';
32
-
33
- /**
34
- * Setup function that creates the execute function for deploy scripts. It allow to specify a set of functions that will be available in the environment.
35
- *
36
- * @param functions - An object of utility functions that expect Environment as their first parameter
37
- * @returns An execute function that provides an enhanced environment with curried functions
38
- *
39
- * @example
40
- * ```typescript
41
- * const functions = {
42
- * deploy: (env: Environment) => ((contractName: string, args: any[]) => Promise<void>),
43
- * verify: (env: Environment) => ((address: string) => Promise<boolean>)
44
- * };
45
- *
46
- * const {deployScript} = setup(functions);
47
- *
48
- * export default deployScript(async (env, args) => {
49
- * // env now includes both the original environment AND the curried functions
50
- * await env.deploy('MyContract', []); // No need to pass env
51
- * await env.verify('0x123...'); // No need to pass env
52
- *
53
- * // Original environment properties are still available
54
- * console.log(env.network.name);
55
- * const deployment = env.get('MyContract');
56
- * }, { tags: ['deploy'] });
57
- * ```
58
- */
59
-
60
- export function setup<
61
- Extensions extends Record<string, (env: Environment<any, any, any>) => any> = {},
62
- NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
63
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
64
- Deployments extends UnknownDeployments = UnknownDeployments,
65
- Extra extends Record<string, unknown> = Record<string, unknown>
66
- >(extensions: Extensions) {
67
- const {deployScript} = setupDeployScripts<Extensions, NamedAccounts, Data, Deployments, Extra>(extensions);
68
- const {loadAndExecuteDeployments} = setupEnvironmentFromFiles<Extensions, NamedAccounts, Data, Deployments, Extra>(
69
- extensions
70
- );
71
- return {deployScript, loadAndExecuteDeployments};
72
- }
73
-
74
- export function setupEnvironmentFromFiles<
75
- Extensions extends Record<string, (env: Environment<any, any, any>) => any> = {},
76
- NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
77
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
78
- Deployments extends UnknownDeployments = UnknownDeployments,
79
- Extra extends Record<string, unknown> = Record<string, unknown>
80
- >(extensions: Extensions) {
81
- async function loadAndExecuteDeploymentsWithExtensions<
82
- Extra extends Record<string, unknown> = Record<string, unknown>,
83
- ArgumentsType = undefined
84
- >(
85
- executionParams: ExecutionParams<Extra>,
86
- args?: ArgumentsType
87
- ): Promise<EnhancedEnvironment<NamedAccounts, Data, UnknownDeployments, Extensions>> {
88
- const env = await loadAndExecuteDeployments<NamedAccounts, Data, ArgumentsType, Extra>(executionParams, args);
89
- return enhanceEnvIfNeeded(env, extensions);
90
- }
91
-
92
- async function loadEnvironmentWithExtensions(
93
- executionParams: ExecutionParams<Extra>
94
- ): Promise<EnhancedEnvironment<NamedAccounts, Data, UnknownDeployments, Extensions>> {
95
- const env = await loadEnvironment<NamedAccounts, Data, Extra>(executionParams);
96
- return enhanceEnvIfNeeded(env, extensions);
97
- }
98
-
99
- return {
100
- loadAndExecuteDeployments: loadAndExecuteDeploymentsWithExtensions,
101
- loadEnvironment: loadEnvironmentWithExtensions,
102
- };
103
- }
104
-
105
- export function enhanceEnvIfNeeded<
106
- Extensions extends Record<string, (env: Environment<any, any, any>) => any> = {},
107
- NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
108
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
109
- Extra extends Record<string, unknown> = Record<string, unknown>
110
- >(
111
- env: Environment,
112
- extensions: Extensions
113
- ): EnhancedEnvironment<NamedAccounts, Data, UnknownDeployments, Extensions, Extra> {
114
- // Use the original env object as the base
115
- const enhancedEnv = env as EnhancedEnvironment<NamedAccounts, Data, UnknownDeployments, Extensions, Extra>;
116
-
117
- // Only create curried functions for extensions not already present in env
118
- for (const key in extensions) {
119
- if (!Object.prototype.hasOwnProperty.call(env, key)) {
120
- // Create curried function only for this specific extension
121
- const singleExtension: Record<string, unknown> = {};
122
- singleExtension[key] = (extensions as any)[key];
123
- const curriedFunction = withEnvironment(env, singleExtension as any);
124
- (enhancedEnv as any)[key] = (curriedFunction as any)[key];
125
- }
126
- }
127
- return enhancedEnv;
128
- }
129
-
130
- export async function readConfig<
131
- NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
132
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData
133
- >(): Promise<UserConfig> {
134
- type ConfigFile = UserConfig<NamedAccounts, Data>;
135
- let configFile: ConfigFile | undefined;
136
-
137
- let tsVersion: string | undefined;
138
- let jsVersion: string | undefined;
139
-
140
- if (typeof process !== 'undefined') {
141
- const listOfFileToTryForTS = [
142
- path.join(process.cwd(), 'rocketh.ts'),
143
- path.join(process.cwd(), 'rocketh', 'config.ts'),
144
- ];
145
- for (const filepath of listOfFileToTryForTS) {
146
- if (fs.existsSync(filepath)) {
147
- tsVersion = `file://${filepath}`;
148
- break;
149
- }
150
- }
151
- const listOfFileToTryForJS = [
152
- path.join(process.cwd(), 'rocketh.js'),
153
- path.join(process.cwd(), 'rocketh', 'config.s'),
154
- ];
155
- for (const filepath of listOfFileToTryForJS) {
156
- if (fs.existsSync(filepath)) {
157
- jsVersion = `file://${filepath}`;
158
- break;
159
- }
160
- }
161
- }
162
- const existingConfigs = [tsVersion, jsVersion].filter(Boolean).length;
163
-
164
- // console.log({tsFilePath, tsVersionExists, existingConfigs});
165
-
166
- // Throw error if multiple config files exist
167
- if (existingConfigs > 1) {
168
- throw new Error('Multiple configuration files found. Please use only one of: rocketh.ts, rocketh.js');
169
- }
170
- if (tsVersion) {
171
- const moduleLoaded = await import(tsVersion);
172
- configFile = moduleLoaded.config;
173
- // console.log({tsVersionExists: configFile});
174
- // if ((configFile as any).default) {
175
- // configFile = (configFile as any).default as ConfigFile;
176
- // if ((configFile as any).default) {
177
- // logger.warn(`double default...`);
178
- // configFile = (configFile as any).default as ConfigFile;
179
- // }
180
- // }
181
- } else if (jsVersion) {
182
- const moduleLoaded = await import(jsVersion);
183
- configFile = moduleLoaded.config;
184
- }
185
-
186
- return configFile || {};
187
- }
188
-
189
- export async function readAndResolveConfig<
190
- NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
191
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData
192
- >(overrides?: ConfigOverrides): Promise<ResolvedUserConfig<NamedAccounts, Data>> {
193
- const configFile = await readConfig();
194
- return resolveConfig(configFile, overrides);
195
- }
196
-
197
- const deploymentStore = createFSDeploymentStore();
198
- const promptExecutor: PromptExecutor = async (request: {type: 'confirm'; name: string; message: string}) => {
199
- const answer = await prompts<string>(request);
200
- return {
201
- proceed: answer.proceed,
202
- };
203
- };
204
- const executor = createExecutor(deploymentStore, promptExecutor);
205
-
206
- export function loadDeploymentsFromFiles(
207
- deploymentsPath: string,
208
- networkName: string,
209
- onlyABIAndAddress?: boolean,
210
- expectedChain?: {chainId: string; genesisHash?: `0x${string}`; deleteDeploymentsIfDifferentGenesisHash?: boolean}
211
- ): Promise<{
212
- deployments: UnknownDeployments;
213
- migrations: Record<string, number>;
214
- chainId?: string;
215
- genesisHash?: `0x${string}`;
216
- }> {
217
- return loadDeployments(deploymentStore, deploymentsPath, networkName, onlyABIAndAddress, expectedChain);
218
- }
219
-
220
- export async function loadEnvironment<
221
- NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
222
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
223
- Extra extends Record<string, unknown> = Record<string, unknown>
224
- >(executionParams: ExecutionParams<Extra>): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
225
- const userConfig = await readAndResolveConfig<NamedAccounts, Data>(executionParams.config);
226
- const {name: environmentName, fork} = getEnvironmentName(executionParams);
227
- const chainId = await getChainIdForEnvironment(userConfig, environmentName, executionParams.provider);
228
- const resolvedExecutionParams = resolveExecutionParams(userConfig, executionParams, chainId);
229
- // console.log(JSON.stringify(resolvedConfig, null, 2));
230
- const {external, internal} = await createEnvironment<NamedAccounts, Data, UnknownDeployments>(
231
- userConfig,
232
- resolvedExecutionParams,
233
- deploymentStore
234
- );
235
- return external;
236
- }
237
-
238
- export async function loadAndExecuteDeployments<
239
- NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
240
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
241
- ArgumentsType = undefined,
242
- Extra extends Record<string, unknown> = Record<string, unknown>
243
- >(
244
- executionParams: ExecutionParams<Extra>,
245
- args?: ArgumentsType
246
- ): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
247
- const userConfig = await readAndResolveConfig<NamedAccounts, Data>(executionParams.config);
248
- const {name: environmentName, fork} = getEnvironmentName(executionParams);
249
- const chainId = await getChainIdForEnvironment(userConfig, environmentName, executionParams.provider);
250
- const resolvedExecutionParams = resolveExecutionParams(userConfig, executionParams, chainId);
251
- // console.log(JSON.stringify(options, null, 2));
252
- // console.log(JSON.stringify(resolvedConfig, null, 2));
253
-
254
- return _executeDeployScripts<NamedAccounts, Data, ArgumentsType>(userConfig, resolvedExecutionParams, args);
255
- }
256
-
257
- export async function executeDeployScripts<
258
- NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
259
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
260
- ArgumentsType = undefined,
261
- Extra extends Record<string, unknown> = Record<string, unknown>
262
- >(
263
- userConfig: UserConfig,
264
- executionParams?: ExecutionParams<Extra>,
265
- args?: ArgumentsType
266
- ): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
267
- executionParams = executionParams || {};
268
- const resolveduserConfig = resolveConfig<NamedAccounts, Data>(userConfig, executionParams.config);
269
- const {name: environmentName, fork} = getEnvironmentName(executionParams);
270
- const chainId = await getChainIdForEnvironment(resolveduserConfig, environmentName, executionParams.provider);
271
- const resolvedExecutionParams = resolveExecutionParams(resolveduserConfig, executionParams, chainId);
272
- return _executeDeployScripts<NamedAccounts, Data, ArgumentsType>(resolveduserConfig, resolvedExecutionParams, args);
273
- }
274
-
275
- async function _executeDeployScripts<
276
- NamedAccounts extends UnresolvedUnknownNamedAccounts = UnresolvedUnknownNamedAccounts,
277
- Data extends UnresolvedNetworkSpecificData = UnresolvedNetworkSpecificData,
278
- ArgumentsType = undefined
279
- >(
280
- userConfig: ResolvedUserConfig<NamedAccounts, Data>,
281
- resolvedExecutionParams: ResolvedExecutionParams,
282
- args?: ArgumentsType
283
- ): Promise<Environment<NamedAccounts, Data, UnknownDeployments>> {
284
- let filepaths;
285
- filepaths = traverseMultipleDirectory(resolvedExecutionParams.scripts);
286
- filepaths = filepaths
287
- .filter((v) => !path.basename(v).startsWith('_'))
288
- .sort((a: string, b: string) => {
289
- if (a < b) {
290
- return -1;
291
- }
292
- if (a > b) {
293
- return 1;
294
- }
295
- return 0;
296
- });
297
-
298
- const moduleObjects: {id: string; module: DeployScriptModule<NamedAccounts, Data, ArgumentsType>}[] = [];
299
- for (const filepath of filepaths) {
300
- const scriptFilePath = path.resolve(filepath);
301
- let scriptModule: DeployScriptModule<NamedAccounts, Data, ArgumentsType>;
302
- try {
303
- scriptModule = await import(`file://${scriptFilePath}`);
304
-
305
- // console.log({
306
- // scriptFilePath,
307
- // scriptModule,
308
- // });
309
- if ((scriptModule as any).default) {
310
- scriptModule = (scriptModule as any).default as DeployScriptModule<NamedAccounts, Data, ArgumentsType>;
311
- if ((scriptModule as any).default) {
312
- logger.warn(`double default...`);
313
- scriptModule = (scriptModule as any).default as DeployScriptModule<NamedAccounts, Data, ArgumentsType>;
314
- }
315
- }
316
- moduleObjects.push({id: scriptFilePath, module: scriptModule});
317
- } catch (e) {
318
- logger.error(`could not import ${filepath}`);
319
- throw e;
320
- }
321
- }
322
-
323
- return executor.executeDeployScriptModules<NamedAccounts, Data, ArgumentsType>(
324
- moduleObjects,
325
- userConfig,
326
- resolvedExecutionParams,
327
- args
328
- );
329
- }
package/src/index.ts DELETED
@@ -1,16 +0,0 @@
1
- export {
2
- executeDeployScripts, // TODO rename ...FromFiles
3
- setupEnvironmentFromFiles, // TODO rename ...FromFiles
4
- enhanceEnvIfNeeded,
5
- loadEnvironment, // TODO rename loadEnvironmentFromFiles
6
- readAndResolveConfig, // TODO rename ...FromFiles
7
- loadAndExecuteDeployments, // TODO rename ...FromFiles
8
- setup, // TODO remove, we use split setup to make it explicity which require file system access
9
- loadDeploymentsFromFiles,
10
- } from './executor/index.js';
11
-
12
- export {setupDeployScripts, chainByCanonicalName} from '@rocketh/core';
13
-
14
- export type * from '@rocketh/core/types';
15
-
16
- export type * from 'eip-1193';
package/src/utils/fs.ts DELETED
@@ -1,70 +0,0 @@
1
- // taken from https://github.com/vitejs/vite/blob/63524bac878e8d3771d34ad7ad2e10cd16870ff4/packages/vite/src/node/utils.ts#L371-L400
2
- import fs from 'node:fs';
3
- import path from 'node:path';
4
-
5
- interface LookupFileOptions {
6
- pathOnly?: boolean;
7
- rootDir?: string;
8
- predicate?: (file: string) => boolean;
9
- }
10
-
11
- export function lookupFile(dir: string, formats: string[], options?: LookupFileOptions): string | undefined {
12
- for (const format of formats) {
13
- const fullPath = path.join(dir, format);
14
- if (fs.existsSync(fullPath) && fs.statSync(fullPath).isFile()) {
15
- const result = options?.pathOnly ? fullPath : fs.readFileSync(fullPath, 'utf-8');
16
- if (!options?.predicate || options.predicate(result)) {
17
- return result;
18
- }
19
- }
20
- }
21
- const parentDir = path.dirname(dir);
22
- if (parentDir !== dir && (!options?.rootDir || parentDir.startsWith(options?.rootDir))) {
23
- return lookupFile(parentDir, formats, options);
24
- }
25
- }
26
-
27
- export function traverseMultipleDirectory(dirs: readonly string[]): string[] {
28
- const filepaths = [];
29
- for (const dir of dirs) {
30
- let filesStats = traverse(dir);
31
- filesStats = filesStats.filter((v) => !v.directory);
32
- for (const filestat of filesStats) {
33
- filepaths.push(path.join(dir, filestat.relativePath));
34
- }
35
- }
36
- return filepaths;
37
- }
38
-
39
- export const traverse = function (
40
- dir: string,
41
- result: any[] = [],
42
- topDir?: string,
43
- filter?: (name: string, stats: any) => boolean // TODO any is Stats
44
- ): Array<{
45
- name: string;
46
- path: string;
47
- relativePath: string;
48
- mtimeMs: number;
49
- directory: boolean;
50
- }> {
51
- fs.readdirSync(dir).forEach((name) => {
52
- const fPath = path.resolve(dir, name);
53
- const stats = fs.statSync(fPath);
54
- if ((!filter && !name.startsWith('.')) || (filter && filter(name, stats))) {
55
- const fileStats = {
56
- name,
57
- path: fPath,
58
- relativePath: path.relative(topDir || dir, fPath),
59
- mtimeMs: stats.mtimeMs,
60
- directory: stats.isDirectory(),
61
- };
62
- if (fileStats.directory) {
63
- result.push(fileStats);
64
- return traverse(fPath, result, topDir || dir, filter);
65
- }
66
- result.push(fileStats);
67
- }
68
- });
69
- return result;
70
- };
package/tsconfig.json DELETED
@@ -1,18 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "strict": true,
4
- "strictNullChecks": true,
5
- "target": "ESNext",
6
- "module": "NodeNext",
7
- "lib": ["ESNext", "dom"],
8
- "moduleResolution": "NodeNext",
9
- "resolveJsonModule": true,
10
- "skipLibCheck": true,
11
- "sourceMap": true,
12
- "declaration": true,
13
- "declarationMap": true,
14
- "rootDir": "./src",
15
- "outDir": "./dist"
16
- },
17
- "include": ["src/**/*.ts"]
18
- }