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.
- package/dist/cli.js +0 -0
- package/dist/environment/index.d.ts +12 -2
- package/dist/environment/index.d.ts.map +1 -1
- package/dist/environment/index.js +94 -48
- package/dist/environment/index.js.map +1 -1
- package/dist/environment/utils/artifacts.d.ts +4 -4
- package/dist/executor/index.d.ts +16 -23
- package/dist/executor/index.d.ts.map +1 -1
- package/dist/executor/index.js +311 -128
- package/dist/executor/index.js.map +1 -1
- package/dist/index.d.ts +8 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/dist/internal/logging.d.ts +1 -1
- package/dist/internal/logging.d.ts.map +1 -1
- package/dist/internal/types.d.ts +0 -1
- package/dist/internal/types.d.ts.map +1 -1
- package/dist/types.d.ts +25 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +18 -17
- package/.prettierignore +0 -3
- package/.prettierrc +0 -7
- package/CHANGELOG.md +0 -961
- package/dist/environment/deployments.d.ts +0 -12
- package/dist/environment/deployments.d.ts.map +0 -1
- package/dist/environment/deployments.js +0 -108
- package/dist/environment/deployments.js.map +0 -1
- package/dist/executor/setup.test.d.ts +0 -14
- package/dist/executor/setup.test.d.ts.map +0 -1
- package/dist/executor/setup.test.js +0 -107
- package/dist/executor/setup.test.js.map +0 -1
- package/src/cli.ts +0 -35
- package/src/environment/deployment-store.ts +0 -72
- package/src/executor/index.ts +0 -329
- package/src/index.ts +0 -16
- package/src/utils/fs.ts +0 -70
- package/tsconfig.json +0 -18
package/src/executor/index.ts
DELETED
|
@@ -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
|
-
}
|