prool 0.1.0 → 0.1.1

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.
@@ -13,10 +13,33 @@ export declare function command(parameters: tempo.Parameters): string[];
13
13
  */
14
14
  export declare const tempo: Instance.define.ReturnType<{
15
15
  args: {
16
+ [x: string]: unknown;
16
17
  /**
17
18
  * Interval between blocks.
18
19
  */
19
20
  blockTime?: string | undefined;
21
+ /**
22
+ * How many transactions to mine per block
23
+ */
24
+ blockMaxTransactions?: number | undefined;
25
+ /**
26
+ * Path to a configuration file.
27
+ */
28
+ config?: string | undefined;
29
+ /**
30
+ * The chain this node is running.
31
+ * Possible values are either a built-in chain or the path to a chain specification file.
32
+ *
33
+ * Built-in chains:
34
+ * - testnet
35
+ *
36
+ * @default "testnet"
37
+ */
38
+ chain?: string | undefined;
39
+ /**
40
+ * The path to the data dir for all reth files and subdirectories.
41
+ */
42
+ datadir?: string | undefined;
20
43
  /**
21
44
  * Faucet options.
22
45
  */
@@ -38,6 +61,11 @@ export declare const tempo: Instance.define.ReturnType<{
38
61
  * Host the server will listen on.
39
62
  */
40
63
  host?: string | undefined;
64
+ /**
65
+ * Derive dev accounts from a fixed mnemonic instead of random ones.
66
+ * @default "test test test test test test test test test test test junk"
67
+ */
68
+ mnemonic?: string | undefined;
41
69
  /**
42
70
  * Port the server will listen on.
43
71
  */
@@ -55,6 +83,28 @@ export declare namespace tempo {
55
83
  * Interval between blocks.
56
84
  */
57
85
  blockTime?: string | undefined;
86
+ /**
87
+ * How many transactions to mine per block
88
+ */
89
+ blockMaxTransactions?: number | undefined;
90
+ /**
91
+ * Path to a configuration file.
92
+ */
93
+ config?: string | undefined;
94
+ /**
95
+ * The chain this node is running.
96
+ * Possible values are either a built-in chain or the path to a chain specification file.
97
+ *
98
+ * Built-in chains:
99
+ * - testnet
100
+ *
101
+ * @default "testnet"
102
+ */
103
+ chain?: string | undefined;
104
+ /**
105
+ * The path to the data dir for all reth files and subdirectories.
106
+ */
107
+ datadir?: string | undefined;
58
108
  /**
59
109
  * Faucet options.
60
110
  */
@@ -81,11 +131,16 @@ export declare namespace tempo {
81
131
  * Host the server will listen on.
82
132
  */
83
133
  host?: string | undefined;
134
+ /**
135
+ * Derive dev accounts from a fixed mnemonic instead of random ones.
136
+ * @default "test test test test test test test test test test test junk"
137
+ */
138
+ mnemonic?: string | undefined;
84
139
  /**
85
140
  * Port the server will listen on.
86
141
  */
87
142
  port?: number | undefined;
88
- };
143
+ } & Record<string, unknown>;
89
144
  }
90
145
  /**
91
146
  * Defines a Tempo instance.
@@ -100,6 +155,7 @@ export declare namespace tempo {
100
155
  */
101
156
  export declare const tempoDocker: Instance.define.ReturnType<{
102
157
  args: {
158
+ [x: string]: unknown;
103
159
  /**
104
160
  * Host the server will listen on.
105
161
  */
@@ -108,30 +164,6 @@ export declare const tempoDocker: Instance.define.ReturnType<{
108
164
  * Port the server will listen on.
109
165
  */
110
166
  port?: number | undefined;
111
- blockTime?: string | undefined
112
- /**
113
- * Faucet options.
114
- */
115
- | undefined;
116
- faucet?: {
117
- /**
118
- * Target token addresses for the faucet to be funding with
119
- */
120
- addresses?: string[] | undefined;
121
- /**
122
- * Amount for each faucet funding transaction
123
- */
124
- amount?: bigint | undefined;
125
- /**
126
- * Faucet funding mnemonic
127
- */
128
- privateKey?: string | undefined;
129
- } | undefined
130
- /**
131
- * Rust log level configuration (sets RUST_LOG environment variable).
132
- * Can be a log level or a custom filter string.
133
- */
134
- | undefined;
135
167
  };
136
168
  }, Instance.tempoDocker.Parameters | undefined>;
137
169
  export declare namespace tempoDocker {
@@ -1 +1 @@
1
- {"version":3,"file":"tempo.d.ts","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAG1C,wBAAgB,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,EAAE,CAoC9D;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,KAAK;;QA+Dd;;WAEG;oBACS,MAAM,GAAG,SAAS;QAC9B;;WAEG;iBAEC;YACE;;eAEG;YACH,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;YAChC;;eAEG;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YAC3B;;eAEG;YACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAChC,GACD,SAAS;QAcb;;WAEG;eACI,MAAM,GAAG,SAAS;QACzB;;WAEG;eACI,MAAM,GAAG,SAAS;;;yCAnD3B,CAAA;AAEF,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,KAAY,UAAU,GAAG;QACvB;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B;;WAEG;QACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC9B;;WAEG;QACH,MAAM,CAAC,EACH;YACE;;eAEG;YACH,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;YAChC;;eAEG;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YAC3B;;eAEG;YACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAChC,GACD,SAAS,CAAA;QACb;;;WAGG;QACH,GAAG,CAAC,EACA,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,CAAC,MAAM,GAAG,EAAE,CAAC,GACb,OAAO,GACP,SAAS,CAAA;QACb;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,CAAA;CACF;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW;;QAwFpB;;WAEG;eACI,MAAM,GAAG,SAAS;QACzB;;WAEG;eACI,MAAM,GAAG,SAAS;oBAtJb,MAAM,GAAG,SAAS;QAC9B;;WAEG;;iBAEC;YACE;;eAEG;YACH,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;YAChC;;eAEG;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YAC3B;;eAEG;YACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAChC,GACD,SAAS;QACb;;;WAGG;;;+CA4GN,CAAA;AAED,MAAM,CAAC,OAAO,WAAW,WAAW,CAAC;IACnC,KAAY,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG;QAC1D;;WAEG;QACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAClC;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1B;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,CAAA;CACF"}
1
+ {"version":3,"file":"tempo.d.ts","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAI1C,wBAAgB,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,EAAE,CAoD9D;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,KAAK;;;QA+Dd;;WAEG;oBACS,MAAM,GAAG,SAAS;QAC9B;;WAEG;+BACoB,MAAM,GAAG,SAAS;QACzC;;WAEG;iBACM,MAAM,GAAG,SAAS;QAC3B;;;;;;;;WAQG;gBACK,MAAM,GAAG,SAAS;QAC1B;;WAEG;kBACO,MAAM,GAAG,SAAS;QAC5B;;WAEG;iBAEC;YACE;;eAEG;YACH,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;YAChC;;eAEG;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YAC3B;;eAEG;YACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAChC,GACD,SAAS;QAcb;;WAEG;eACI,MAAM,GAAG,SAAS;QACzB;;;WAGG;mBACQ,MAAM,GAAG,SAAS;QAC7B;;WAEG;eACI,MAAM,GAAG,SAAS;;;yCA9E3B,CAAA;AAEF,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,KAAY,UAAU,GAAG;QACvB;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B;;WAEG;QACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC9B;;WAEG;QACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzC;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B;;;;;;;;WAQG;QACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1B;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B;;WAEG;QACH,MAAM,CAAC,EACH;YACE;;eAEG;YACH,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;YAChC;;eAEG;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YAC3B;;eAEG;YACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAChC,GACD,SAAS,CAAA;QACb;;;WAGG;QACH,GAAG,CAAC,EACA,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,CAAC,MAAM,GAAG,EAAE,CAAC,GACb,OAAO,GACP,SAAS,CAAA;QACb;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB;;;WAGG;QACH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC7B;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC5B;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW;;;QAwFpB;;WAEG;eACI,MAAM,GAAG,SAAS;QACzB;;WAEG;eACI,MAAM,GAAG,SAAS;;+CAnB5B,CAAA;AAED,MAAM,CAAC,OAAO,WAAW,WAAW,CAAC;IACnC,KAAY,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG;QAC1D;;WAEG;QACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAClC;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1B;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,CAAA;CACF"}
@@ -2,42 +2,55 @@ import * as os from 'node:os';
2
2
  import * as path from 'node:path';
3
3
  import { GenericContainer, Wait, } from 'testcontainers';
4
4
  import * as Instance from '../Instance.js';
5
+ import { deepAssign, toArgs } from '../internal/utils.js';
5
6
  import { execa } from '../processes/execa.js';
6
7
  export function command(parameters) {
7
- const { faucet, port } = parameters;
8
- const dataDir = path.join(os.tmpdir(), '.prool', `tempo.${port}`);
8
+ const { blockMaxTransactions, blockTime, mnemonic, port, ...rest } = parameters;
9
+ const datadir = path.join(os.tmpdir(), '.prool', `tempo.${port}`);
10
+ const defaultParameters = {
11
+ authrpc: {
12
+ port: port + 30,
13
+ },
14
+ datadir,
15
+ dev: [
16
+ true,
17
+ {
18
+ blockTime: blockTime ?? '50ms',
19
+ ...(blockMaxTransactions ? { blockMaxTransactions } : {}),
20
+ ...(mnemonic ? { mnemonic } : {}),
21
+ },
22
+ ],
23
+ engine: {
24
+ disablePrecompileCache: true,
25
+ legacyStateRoot: true,
26
+ },
27
+ faucet: {
28
+ address: [
29
+ '0x20c0000000000000000000000000000000000000',
30
+ '0x20c0000000000000000000000000000000000001',
31
+ '0x20c0000000000000000000000000000000000002',
32
+ '0x20c0000000000000000000000000000000000003',
33
+ ],
34
+ amount: '1000000000000',
35
+ enabled: true,
36
+ privateKey: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
37
+ },
38
+ http: {
39
+ addr: '0.0.0.0',
40
+ api: 'all',
41
+ corsdomain: '*',
42
+ port: port,
43
+ },
44
+ port: port + 10,
45
+ ws: {
46
+ port: port + 20,
47
+ },
48
+ };
9
49
  return [
10
50
  'node',
11
- `--authrpc.port=${port + 30}`,
12
- `--datadir=${dataDir}`,
13
- '--dev',
14
- `--dev.block-time=${parameters?.blockTime ?? '50ms'}`,
15
- '--engine.disable-precompile-cache',
16
- '--engine.legacy-state-root',
17
- '--faucet.address',
18
- ...(faucet?.addresses ?? [
19
- '0x20c0000000000000000000000000000000000000',
20
- '0x20c0000000000000000000000000000000000001',
21
- '0x20c0000000000000000000000000000000000002',
22
- '0x20c0000000000000000000000000000000000003',
23
- ]),
24
- `--faucet.amount=${faucet?.amount ?? '1000000000000'}`,
25
- '--faucet.enabled',
26
- `--faucet.private-key=${faucet?.privateKey ?? '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'}`,
27
- '--http',
28
- '--http.addr=0.0.0.0',
29
- '--http.api=all',
30
- '--http.corsdomain=*',
31
- `--http.port=${port}`,
32
- `--port=${port + 10}`,
33
- '--txpool.basefee-max-count=10000000000000',
34
- '--txpool.basefee-max-size=10000',
35
- '--txpool.max-account-slots=500000',
36
- '--txpool.pending-max-count=10000000000000',
37
- '--txpool.pending-max-size=10000',
38
- '--txpool.queued-max-count=10000000000000',
39
- '--txpool.queued-max-size=10000',
40
- `--ws.port=${port + 20}`,
51
+ ...toArgs(deepAssign(defaultParameters, rest), {
52
+ arraySeparator: null,
53
+ }),
41
54
  ];
42
55
  }
43
56
  /**
@@ -79,7 +92,7 @@ export const tempo = Instance.define((parameters) => {
79
92
  env: {
80
93
  RUST_LOG,
81
94
  },
82
- }) `${[binary, ...command({ ...parameters, port })]}`, {
95
+ }) `${[binary, ...command({ ...args, port })]}`, {
83
96
  ...options,
84
97
  // Resolve when the process is listening via "RPC HTTP server started" message.
85
98
  resolver({ process, reject, resolve }) {
@@ -147,7 +160,7 @@ export const tempoDocker = Instance.define((parameters) => {
147
160
  ])
148
161
  .withName(containerName)
149
162
  .withEnvironment({ RUST_LOG })
150
- .withCommand(command({ ...parameters, port }))
163
+ .withCommand(command({ ...args, port }))
151
164
  .withWaitStrategy(Wait.forLogMessage(/RPC HTTP server started/))
152
165
  .withLogConsumer((stream) => {
153
166
  stream.on('data', (data) => {
@@ -1 +1 @@
1
- {"version":3,"file":"tempo.js","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EACL,gBAAgB,EAEhB,IAAI,GACL,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAE7C,MAAM,UAAU,OAAO,CAAC,UAA4B;IAClD,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAA;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC,CAAA;IACjE,OAAO;QACL,MAAM;QACN,kBAAkB,IAAK,GAAG,EAAE,EAAE;QAC9B,aAAa,OAAO,EAAE;QACtB,OAAO;QACP,oBAAoB,UAAU,EAAE,SAAS,IAAI,MAAM,EAAE;QACrD,mCAAmC;QACnC,4BAA4B;QAC5B,kBAAkB;QAClB,GAAG,CAAC,MAAM,EAAE,SAAS,IAAI;YACvB,4CAA4C;YAC5C,4CAA4C;YAC5C,4CAA4C;YAC5C,4CAA4C;SAC7C,CAAC;QACF,mBAAmB,MAAM,EAAE,MAAM,IAAI,eAAe,EAAE;QACtD,kBAAkB;QAClB,wBAAwB,MAAM,EAAE,UAAU,IAAI,oEAAoE,EAAE;QACpH,QAAQ;QACR,qBAAqB;QACrB,gBAAgB;QAChB,qBAAqB;QACrB,eAAe,IAAK,EAAE;QACtB,UAAU,IAAK,GAAG,EAAE,EAAE;QACtB,2CAA2C;QAC3C,iCAAiC;QACjC,mCAAmC;QACnC,2CAA2C;QAC3C,iCAAiC;QACjC,0CAA0C;QAC1C,gCAAgC;QAChC,aAAa,IAAK,GAAG,EAAE,EAAE;KAC1B,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,UAA6B,EAAE,EAAE;IACrE,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,UAAU,IAAI,EAAE,CAAA;IAEjE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE;QAChB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAc,CAAC,CAAA;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC,CAAC,EAAE,CAAA;IACJ,MAAM,QAAQ,GAAG,GAAG,IAAI,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAE3D,MAAM,IAAI,GAAG,OAAO,CAAA;IACpB,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IAE/B,OAAO;QACL,SAAS,EAAE;YACT,IAAI;YACJ,IAAI,OAAO;gBACT,OAAO,OAAO,CAAC,SAAS,CAAC,OAAO,CAAA;YAClC,CAAC;SACF;QACD,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,WAAW;QAC9B,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;QACvB,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO;YACvC,OAAO,MAAM,OAAO,CAAC,KAAK,CACxB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC;gBACA,GAAG,EAAE;oBACH,QAAQ;iBACT;aACF,CAAC,CAAA,GAAG,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EACtD;gBACE,GAAG,OAAO;gBACV,+EAA+E;gBAC/E,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;oBACnC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;wBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;wBAC/B,IAAI,GAAG;4BAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;wBAC7B,IAAI,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAC;4BAAE,OAAO,EAAE,CAAA;wBAC1D,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;4BAAE,MAAM,CAAC,eAAe,CAAC,CAAA;oBAChE,CAAC,CAAC,CAAA;oBACF,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;wBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;wBAC/B,IAAI,GAAG;4BAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;oBACjC,CAAC,CAAC,CAAA;gBACJ,CAAC;aACF,CACF,CAAA;QACH,CAAC;QACD,KAAK,CAAC,IAAI;YACR,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;QACtB,CAAC;KACF,CAAA;AACH,CAAC,CAAC,CAAA;AAuDF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CACxC,CAAC,UAAmC,EAAE,EAAE;IACtC,MAAM,EACJ,aAAa,GAAG,SAAS,MAAM,CAAC,UAAU,EAAE,EAAE,EAC9C,KAAK,GAAG,+BAA+B,EACvC,GAAG,EAAE,IAAI,EACT,GAAG,IAAI,EACR,GAAG,UAAU,IAAI,EAAE,CAAA;IAEpB,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE;QAChB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAc,CAAC,CAAA;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC,CAAC,EAAE,CAAA;IACJ,MAAM,QAAQ,GAAG,GAAG,IAAI,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAE3D,MAAM,IAAI,GAAG,OAAO,CAAA;IACpB,IAAI,SAA2C,CAAA;IAE/C,OAAO;QACL,SAAS,EAAE;YACT,IAAI;SACL;QACD,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,WAAW;QAC9B,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;QACvB,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE;YAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,EAAQ,CAAA;YAE7C,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,KAAK,CAAC;iBAClC,YAAY,CAAC,cAAc,CAAC;iBAC5B,eAAe,CAAC,MAAM,CAAC;iBACvB,cAAc,CAAC;gBACd,EAAE,IAAI,EAAE,sBAAsB,EAAE,SAAS,EAAE,cAAc,EAAE;gBAC3D,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE;aACjD,CAAC;iBACD,QAAQ,CAAC,aAAa,CAAC;iBACvB,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC;iBAC7B,WAAW,CAAC,OAAO,CAAC,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC7C,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,yBAAyB,CAAC,CAAC;iBAC/D,eAAe,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC1B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;oBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;oBAC/B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;oBAChC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;oBAC/B,IAAI,GAAG;wBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;oBAC7B,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;wBACnC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC,CAAA;gBAC5D,CAAC,CAAC,CAAA;gBACF,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC3B,IAAI,GAAG;wBAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;oBACrC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;oBACtC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAA;oBACrC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;gBAChE,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC;iBACD,kBAAkB,CAAC,MAAM,CAAC,CAAA;YAE7B,CAAC,CAAC,KAAK,EAAE;iBACN,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;gBACV,SAAS,GAAG,CAAC,CAAA;gBACb,OAAO,CAAC,OAAO,EAAE,CAAA;YACnB,CAAC,CAAC;iBACD,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YAExB,OAAO,OAAO,CAAC,OAAO,CAAA;QACxB,CAAC;QACD,KAAK,CAAC,IAAI;YACR,IAAI,CAAC,SAAS;gBAAE,OAAM;YACtB,MAAM,SAAS,CAAC,IAAI,EAAE,CAAA;YACtB,SAAS,GAAG,SAAS,CAAA;QACvB,CAAC;KACF,CAAA;AACH,CAAC,CACF,CAAA"}
1
+ {"version":3,"file":"tempo.js","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"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"}
@@ -22,11 +22,11 @@ export declare function stripColors(message: string): string;
22
22
  * @param options The options object.
23
23
  * @returns The command line arguments.
24
24
  */
25
- export declare function toArgs(obj: {
26
- [key: string]: Record<string, any> | string | readonly string[] | boolean | number | bigint | undefined;
27
- }, options?: {
28
- casing: 'kebab' | 'snake';
29
- }): any[];
25
+ export declare function toArgs(obj: Record<string, unknown>, options?: {
26
+ arraySeparator?: string | null | undefined;
27
+ casing?: 'kebab' | 'snake' | undefined;
28
+ }): string[];
30
29
  /** Converts to a --flag-case string. */
31
30
  export declare function toFlagCase(str: string, separator?: string): string;
31
+ export declare function deepAssign(target: Record<string, unknown>, ...sources: Record<string, unknown>[]): Record<string, unknown>;
32
32
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAkBlE;AAMD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,UAE1C;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CACpB,GAAG,EAAE;IACH,CAAC,GAAG,EAAE,MAAM,GACR,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACnB,MAAM,GACN,SAAS,MAAM,EAAE,GACjB,OAAO,GACP,MAAM,GACN,MAAM,GACN,SAAS,CAAA;CACd,EACD,OAAO,GAAE;IAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAA;CAAwB,SA6B7D;AAED,wCAAwC;AACxC,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAM,UAatD"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAkBlE;AAMD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,UAE1C;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAC1C,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAA;CAClC,GACL,MAAM,EAAE,CAqCV;AAED,wCAAwC;AACxC,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAM,UAatD;AAMD,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB"}
@@ -36,19 +36,27 @@ export function stripColors(message) {
36
36
  * @param options The options object.
37
37
  * @returns The command line arguments.
38
38
  */
39
- export function toArgs(obj, options = { casing: 'kebab' }) {
40
- const { casing } = options;
39
+ export function toArgs(obj, options = {}) {
40
+ const { arraySeparator = ',', casing = 'kebab' } = options;
41
41
  return Object.entries(obj).flatMap(([key, value]) => {
42
42
  if (value === undefined)
43
43
  return [];
44
- if (Array.isArray(value))
45
- return [toFlagCase(key), value.join(',')];
44
+ if (Array.isArray(value)) {
45
+ if (value[0] === true)
46
+ return [toFlagCase(key), ...toArgs({ [key]: value[1] }, options)];
47
+ const arrayValue = (() => {
48
+ if (arraySeparator === null)
49
+ return value;
50
+ return value.join(arraySeparator);
51
+ })();
52
+ return [toFlagCase(key), arrayValue].flat();
53
+ }
46
54
  if (typeof value === 'object' && value !== null) {
47
55
  return Object.entries(value).flatMap(([subKey, subValue]) => {
48
56
  if (subValue === undefined)
49
57
  return [];
50
58
  const flag = toFlagCase(`${key}.${subKey}`, casing === 'kebab' ? '-' : '_');
51
- return [flag, Array.isArray(subValue) ? subValue.join(',') : subValue];
59
+ return toArgs({ [flag.slice(2)]: subValue }, options);
52
60
  });
53
61
  }
54
62
  const flag = toFlagCase(key, casing === 'kebab' ? '-' : '_');
@@ -56,7 +64,7 @@ export function toArgs(obj, options = { casing: 'kebab' }) {
56
64
  return [flag, 'false'];
57
65
  if (value === true)
58
66
  return [flag];
59
- const stringified = value.toString();
67
+ const stringified = value?.toString() ?? '';
60
68
  if (stringified === '')
61
69
  return [flag];
62
70
  return [flag, stringified];
@@ -76,4 +84,26 @@ export function toFlagCase(str, separator = '-') {
76
84
  }
77
85
  return `--${keys.join('.')}`;
78
86
  }
87
+ function isPlainObject(value) {
88
+ return Object.prototype.toString.call(value) === '[object Object]';
89
+ }
90
+ export function deepAssign(target, ...sources) {
91
+ for (const source of sources) {
92
+ if (!isPlainObject(source))
93
+ continue;
94
+ for (const key of Reflect.ownKeys(source)) {
95
+ const srcVal = source[key];
96
+ const tgtVal = target[key];
97
+ // If both are plain objects, merge recursively
98
+ if (isPlainObject(srcVal) && isPlainObject(tgtVal)) {
99
+ deepAssign(tgtVal, srcVal);
100
+ continue;
101
+ }
102
+ // Otherwise, assign a deep clone of the source value
103
+ ;
104
+ target[key] = structuredClone(srcVal);
105
+ }
106
+ }
107
+ return target;
108
+ }
79
109
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "prool",
3
3
  "description": "HTTP testing instances for Ethereum",
4
- "version": "0.1.0",
4
+ "version": "0.1.1",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "files": [
@@ -6,43 +6,60 @@ import {
6
6
  Wait,
7
7
  } from 'testcontainers'
8
8
  import * as Instance from '../Instance.js'
9
+ import { deepAssign, toArgs } from '../internal/utils.js'
9
10
  import { execa } from '../processes/execa.js'
10
11
 
11
12
  export function command(parameters: tempo.Parameters): string[] {
12
- const { faucet, port } = parameters
13
- const dataDir = path.join(os.tmpdir(), '.prool', `tempo.${port}`)
13
+ const { blockMaxTransactions, blockTime, mnemonic, port, ...rest } =
14
+ parameters
15
+
16
+ const datadir = path.join(os.tmpdir(), '.prool', `tempo.${port}`)
17
+ const defaultParameters = {
18
+ authrpc: {
19
+ port: port! + 30,
20
+ },
21
+ datadir,
22
+ dev: [
23
+ true,
24
+ {
25
+ blockTime: blockTime ?? '50ms',
26
+ ...(blockMaxTransactions ? { blockMaxTransactions } : {}),
27
+ ...(mnemonic ? { mnemonic } : {}),
28
+ },
29
+ ],
30
+ engine: {
31
+ disablePrecompileCache: true,
32
+ legacyStateRoot: true,
33
+ },
34
+ faucet: {
35
+ address: [
36
+ '0x20c0000000000000000000000000000000000000',
37
+ '0x20c0000000000000000000000000000000000001',
38
+ '0x20c0000000000000000000000000000000000002',
39
+ '0x20c0000000000000000000000000000000000003',
40
+ ],
41
+ amount: '1000000000000',
42
+ enabled: true,
43
+ privateKey:
44
+ '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
45
+ },
46
+ http: {
47
+ addr: '0.0.0.0',
48
+ api: 'all',
49
+ corsdomain: '*',
50
+ port: port!,
51
+ },
52
+ port: port! + 10,
53
+ ws: {
54
+ port: port! + 20,
55
+ },
56
+ }
57
+
14
58
  return [
15
59
  'node',
16
- `--authrpc.port=${port! + 30}`,
17
- `--datadir=${dataDir}`,
18
- '--dev',
19
- `--dev.block-time=${parameters?.blockTime ?? '50ms'}`,
20
- '--engine.disable-precompile-cache',
21
- '--engine.legacy-state-root',
22
- '--faucet.address',
23
- ...(faucet?.addresses ?? [
24
- '0x20c0000000000000000000000000000000000000',
25
- '0x20c0000000000000000000000000000000000001',
26
- '0x20c0000000000000000000000000000000000002',
27
- '0x20c0000000000000000000000000000000000003',
28
- ]),
29
- `--faucet.amount=${faucet?.amount ?? '1000000000000'}`,
30
- '--faucet.enabled',
31
- `--faucet.private-key=${faucet?.privateKey ?? '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'}`,
32
- '--http',
33
- '--http.addr=0.0.0.0',
34
- '--http.api=all',
35
- '--http.corsdomain=*',
36
- `--http.port=${port!}`,
37
- `--port=${port! + 10}`,
38
- '--txpool.basefee-max-count=10000000000000',
39
- '--txpool.basefee-max-size=10000',
40
- '--txpool.max-account-slots=500000',
41
- '--txpool.pending-max-count=10000000000000',
42
- '--txpool.pending-max-size=10000',
43
- '--txpool.queued-max-count=10000000000000',
44
- '--txpool.queued-max-size=10000',
45
- `--ws.port=${port! + 20}`,
60
+ ...toArgs(deepAssign(defaultParameters, rest), {
61
+ arraySeparator: null,
62
+ }),
46
63
  ]
47
64
  }
48
65
 
@@ -89,7 +106,7 @@ export const tempo = Instance.define((parameters?: tempo.Parameters) => {
89
106
  env: {
90
107
  RUST_LOG,
91
108
  },
92
- })`${[binary, ...command({ ...parameters, port })]}`,
109
+ })`${[binary, ...command({ ...args, port })]}`,
93
110
  {
94
111
  ...options,
95
112
  // Resolve when the process is listening via "RPC HTTP server started" message.
@@ -124,6 +141,28 @@ export declare namespace tempo {
124
141
  * Interval between blocks.
125
142
  */
126
143
  blockTime?: string | undefined
144
+ /**
145
+ * How many transactions to mine per block
146
+ */
147
+ blockMaxTransactions?: number | undefined
148
+ /**
149
+ * Path to a configuration file.
150
+ */
151
+ config?: string | undefined
152
+ /**
153
+ * The chain this node is running.
154
+ * Possible values are either a built-in chain or the path to a chain specification file.
155
+ *
156
+ * Built-in chains:
157
+ * - testnet
158
+ *
159
+ * @default "testnet"
160
+ */
161
+ chain?: string | undefined
162
+ /**
163
+ * The path to the data dir for all reth files and subdirectories.
164
+ */
165
+ datadir?: string | undefined
127
166
  /**
128
167
  * Faucet options.
129
168
  */
@@ -160,11 +199,16 @@ export declare namespace tempo {
160
199
  * Host the server will listen on.
161
200
  */
162
201
  host?: string | undefined
202
+ /**
203
+ * Derive dev accounts from a fixed mnemonic instead of random ones.
204
+ * @default "test test test test test test test test test test test junk"
205
+ */
206
+ mnemonic?: string | undefined
163
207
  /**
164
208
  * Port the server will listen on.
165
209
  */
166
210
  port?: number | undefined
167
- }
211
+ } & Record<string, unknown>
168
212
  }
169
213
 
170
214
  /**
@@ -218,7 +262,7 @@ export const tempoDocker = Instance.define(
218
262
  ])
219
263
  .withName(containerName)
220
264
  .withEnvironment({ RUST_LOG })
221
- .withCommand(command({ ...parameters, port }))
265
+ .withCommand(command({ ...args, port }))
222
266
  .withWaitStrategy(Wait.forLogMessage(/RPC HTTP server started/))
223
267
  .withLogConsumer((stream) => {
224
268
  stream.on('data', (data) => {
@@ -30,10 +30,12 @@ test.each([
30
30
  [[{ foo: 0 }], ['--foo', '0']],
31
31
  [[{ foo: 1 }], ['--foo', '1']],
32
32
  [[{ foo: 1n }], ['--foo', '1']],
33
+ [[{ foo: 1n }], ['--foo', '1']],
33
34
  [[{ foo: 'bar', baz: 1 }], ['--foo', 'bar', '--baz', '1']],
34
35
  [[{ fooBar: 'test' }], ['--foo-bar', 'test']],
35
36
  [[{ foo: ['bar', 'baz'] }], ['--foo', 'bar,baz']],
36
37
  [[{ foo: { barBaz: 'test' } }], ['--foo.bar-baz', 'test']],
38
+ [[{ foo: [true, { barBaz: 'test' }] }], ['--foo', '--foo.bar-baz', 'test']],
37
39
  [[{ foo: { barBaz: ['test', 'test2'] } }], ['--foo.bar-baz', 'test,test2']],
38
40
  [
39
41
  [{ fooBar: 'test' }, { casing: 'snake' }],
@@ -43,6 +45,18 @@ test.each([
43
45
  [{ foo: { barBaz: 'test' } }, { casing: 'snake' }],
44
46
  ['--foo.bar_baz', 'test'],
45
47
  ],
48
+ [
49
+ [{ foo: ['bar', 'baz'] }, { arraySeparator: null }],
50
+ ['--foo', 'bar', 'baz'],
51
+ ],
52
+ [
53
+ [{ foo: { bar: ['baz', 'qux'] } }, { arraySeparator: null }],
54
+ ['--foo.bar', 'baz', 'qux'],
55
+ ],
56
+ [
57
+ [{ foo: ['bar', 'baz'] }, { arraySeparator: null }],
58
+ ['--foo', 'bar', 'baz'],
59
+ ],
46
60
  ] as [Parameters<typeof toArgs>, string[]][])('toArgs(%o) -> %o', ([
47
61
  input,
48
62
  options,
@@ -50,23 +50,26 @@ export function stripColors(message: string) {
50
50
  * @returns The command line arguments.
51
51
  */
52
52
  export function toArgs(
53
- obj: {
54
- [key: string]:
55
- | Record<string, any>
56
- | string
57
- | readonly string[]
58
- | boolean
59
- | number
60
- | bigint
61
- | undefined
62
- },
63
- options: { casing: 'kebab' | 'snake' } = { casing: 'kebab' },
64
- ) {
65
- const { casing } = options
53
+ obj: Record<string, unknown>,
54
+ options: {
55
+ arraySeparator?: string | null | undefined
56
+ casing?: 'kebab' | 'snake' | undefined
57
+ } = {},
58
+ ): string[] {
59
+ const { arraySeparator = ',', casing = 'kebab' } = options
66
60
  return Object.entries(obj).flatMap(([key, value]) => {
67
61
  if (value === undefined) return []
68
62
 
69
- if (Array.isArray(value)) return [toFlagCase(key), value.join(',')]
63
+ if (Array.isArray(value)) {
64
+ if (value[0] === true)
65
+ return [toFlagCase(key), ...toArgs({ [key]: value[1] }, options)]
66
+ const arrayValue = (() => {
67
+ if (arraySeparator === null) return value
68
+ return value.join(arraySeparator)
69
+ })()
70
+
71
+ return [toFlagCase(key), arrayValue].flat()
72
+ }
70
73
 
71
74
  if (typeof value === 'object' && value !== null) {
72
75
  return Object.entries(value).flatMap(([subKey, subValue]) => {
@@ -75,7 +78,7 @@ export function toArgs(
75
78
  `${key}.${subKey}`,
76
79
  casing === 'kebab' ? '-' : '_',
77
80
  )
78
- return [flag, Array.isArray(subValue) ? subValue.join(',') : subValue]
81
+ return toArgs({ [flag.slice(2)]: subValue }, options)
79
82
  })
80
83
  }
81
84
 
@@ -84,7 +87,7 @@ export function toArgs(
84
87
  if (value === false) return [flag, 'false']
85
88
  if (value === true) return [flag]
86
89
 
87
- const stringified = value.toString()
90
+ const stringified = value?.toString() ?? ''
88
91
  if (stringified === '') return [flag]
89
92
 
90
93
  return [flag, stringified]
@@ -106,3 +109,30 @@ export function toFlagCase(str: string, separator = '-') {
106
109
  }
107
110
  return `--${keys.join('.')}`
108
111
  }
112
+
113
+ function isPlainObject(value: unknown): value is Record<string, unknown> {
114
+ return Object.prototype.toString.call(value) === '[object Object]'
115
+ }
116
+
117
+ export function deepAssign(
118
+ target: Record<string, unknown>,
119
+ ...sources: Record<string, unknown>[]
120
+ ): Record<string, unknown> {
121
+ for (const source of sources) {
122
+ if (!isPlainObject(source)) continue
123
+
124
+ for (const key of Reflect.ownKeys(source)) {
125
+ const srcVal = source[key as keyof typeof source]
126
+ const tgtVal = target[key as keyof typeof target]
127
+
128
+ // If both are plain objects, merge recursively
129
+ if (isPlainObject(srcVal) && isPlainObject(tgtVal)) {
130
+ deepAssign(tgtVal, srcVal)
131
+ continue
132
+ }
133
+ // Otherwise, assign a deep clone of the source value
134
+ ;(target as any)[key] = structuredClone(srcVal)
135
+ }
136
+ }
137
+ return target
138
+ }