hardhat-external-artifacts 0.0.1 → 0.0.2

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/README.md CHANGED
@@ -41,6 +41,43 @@ const config: HardhatUserConfig = {
41
41
  export default config;
42
42
  ```
43
43
 
44
+ ### Loading from npm Packages
45
+
46
+ You can load artifacts directly from npm packages using the `modules` option. This uses Node.js module resolution, supporting both package exports and direct paths:
47
+
48
+ ```typescript
49
+ // hardhat.config.ts
50
+ import type {HardhatUserConfig} from 'hardhat/config';
51
+ import 'hardhat-external-artifacts';
52
+
53
+ const config: HardhatUserConfig = {
54
+ solidity: '0.8.20',
55
+ externalArtifacts: {
56
+ // Load from npm packages via module resolution
57
+ modules: [
58
+ '@my-org/contracts/artifacts', // Uses package.json "exports"
59
+ 'some-package/dist/artifacts', // Direct path in package
60
+ ],
61
+ },
62
+ };
63
+
64
+ export default config;
65
+ ```
66
+
67
+ **Note:** The `modules` option differs from `paths` in that it resolves module specifiers from `node_modules` using Node.js resolution, respecting the package's `exports` field. This is useful when a package explicitly exports its artifacts folder.
68
+
69
+ For example, if a package has:
70
+ ```json
71
+ {
72
+ "name": "@my-org/contracts",
73
+ "exports": {
74
+ "./artifacts": "./dist/artifacts"
75
+ }
76
+ }
77
+ ```
78
+
79
+ Then using `modules: ['@my-org/contracts/artifacts']` will correctly resolve to the exported path.
80
+
44
81
  ### Using a Resolver Function
45
82
 
46
83
  For more dynamic artifact loading, you can use a resolver function:
@@ -106,13 +143,14 @@ export default config;
106
143
 
107
144
  ## Configuration Options
108
145
 
109
- | Option | Type | Default | Description |
110
- | ------------------------ | ----------------------------------- | ----------- | ----------------------------------------------- |
111
- | `paths` | `string[]` | `[]` | Paths to artifact files or directories |
112
- | `resolver` | `() => Promise<ExternalArtifact[]>` | `undefined` | Function that returns artifacts dynamically |
113
- | `solcVersion` | `string` | `"0.8.20"` | Solc version for synthetic compilations |
114
- | `warnOnInvalidArtifacts` | `boolean` | `true` | Whether to log warnings for malformed artifacts |
115
- | `debug` | `boolean` | `false` | Enable debug logging for troubleshooting |
146
+ | Option | Type | Default | Description |
147
+ | ------------------------ | ----------------------------------- | ----------- | -------------------------------------------------------- |
148
+ | `paths` | `string[]` | `[]` | Paths to artifact files or directories (relative/absolute) |
149
+ | `modules` | `string[]` | `[]` | Module specifiers to resolve from node_modules |
150
+ | `resolver` | `() => Promise<ExternalArtifact[]>` | `undefined` | Function that returns artifacts dynamically |
151
+ | `solcVersion` | `string` | `"0.8.20"` | Solc version for synthetic compilations |
152
+ | `warnOnInvalidArtifacts` | `boolean` | `true` | Whether to log warnings for malformed artifacts |
153
+ | `debug` | `boolean` | `false` | Enable debug logging for troubleshooting |
116
154
 
117
155
  ## Artifact Format
118
156
 
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/artifacts/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,gBAAgB,EAEhB,uBAAuB,EACvB,MAAM,YAAY,CAAC;AAQpB,qBAAa,cAAc;;gBAId,MAAM,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM;IAK1D,OAAO,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;CA8H5C"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/artifacts/loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,gBAAgB,EAEhB,uBAAuB,EACvB,MAAM,YAAY,CAAC;AAuBpB,qBAAa,cAAc;;gBAId,MAAM,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM;IAK1D,OAAO,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;CA0Z5C"}
@@ -1,6 +1,8 @@
1
1
  import { readJsonFile, getAllFilesMatching, } from '@nomicfoundation/hardhat-utils/fs';
2
2
  import path from 'node:path';
3
3
  import fs from 'node:fs/promises';
4
+ import { createRequire } from 'node:module';
5
+ import { fileURLToPath } from 'node:url';
4
6
  export class ArtifactLoader {
5
7
  #config;
6
8
  #projectRoot;
@@ -10,13 +12,22 @@ export class ArtifactLoader {
10
12
  }
11
13
  async loadAll() {
12
14
  const artifacts = [];
13
- // Load from paths
15
+ // Load from paths (relative/absolute filesystem paths)
14
16
  if (this.#config.paths) {
15
17
  for (const pathOrGlob of this.#config.paths) {
16
18
  const absolutePath = path.resolve(this.#projectRoot, pathOrGlob);
17
19
  artifacts.push(...(await this.#loadFromPath(absolutePath)));
18
20
  }
19
21
  }
22
+ // Load from modules (node_modules resolution)
23
+ if (this.#config.modules) {
24
+ for (const moduleSpecifier of this.#config.modules) {
25
+ const resolvedPath = await this.#resolveModulePath(moduleSpecifier);
26
+ if (resolvedPath) {
27
+ artifacts.push(...(await this.#loadFromPath(resolvedPath)));
28
+ }
29
+ }
30
+ }
20
31
  // Load from resolver function
21
32
  if (this.#config.resolver) {
22
33
  const resolvedArtifacts = await this.#config.resolver();
@@ -24,6 +35,239 @@ export class ArtifactLoader {
24
35
  }
25
36
  return artifacts;
26
37
  }
38
+ /**
39
+ * Resolves a module specifier to an absolute filesystem path.
40
+ * Supports package.json "exports" field patterns like "./artifacts/*".
41
+ *
42
+ * @param moduleSpecifier - e.g., "@my-org/contracts/artifacts"
43
+ * @returns The resolved absolute path, or undefined if resolution fails
44
+ */
45
+ async #resolveModulePath(moduleSpecifier) {
46
+ // Parse the module specifier into package name and subpath
47
+ const { pkgName, subpath } = this.#parseModuleSpecifier(moduleSpecifier);
48
+ try {
49
+ // Find the package directory by locating its package.json
50
+ const { pkgDir, pkgJson } = await this.#findPackage(pkgName);
51
+ if (subpath && pkgJson.exports) {
52
+ // Try to resolve the subpath using the exports field
53
+ const resolvedSubpath = this.#resolveExportsSubpath(pkgJson.exports, `./${subpath}`);
54
+ if (resolvedSubpath) {
55
+ const targetPath = path.join(pkgDir, resolvedSubpath);
56
+ const stat = await fs.stat(targetPath).catch(() => null);
57
+ if (stat) {
58
+ return targetPath;
59
+ }
60
+ }
61
+ }
62
+ // Fallback: try direct path (for packages without exports or simple cases)
63
+ if (subpath) {
64
+ const targetPath = path.join(pkgDir, subpath);
65
+ const stat = await fs.stat(targetPath).catch(() => null);
66
+ if (stat) {
67
+ return targetPath;
68
+ }
69
+ }
70
+ // Try using import.meta.resolve for standard module resolution
71
+ try {
72
+ const resolvedUrl = import.meta.resolve(moduleSpecifier, `file://${this.#projectRoot}/`);
73
+ const resolvedPath = fileURLToPath(resolvedUrl);
74
+ const stat = await fs.stat(resolvedPath).catch(() => null);
75
+ if (stat?.isDirectory()) {
76
+ return resolvedPath;
77
+ }
78
+ if (stat?.isFile()) {
79
+ // If it resolved to an index file, return the directory
80
+ const basename = path.basename(resolvedPath);
81
+ if (basename.startsWith('index.')) {
82
+ return path.dirname(resolvedPath);
83
+ }
84
+ return resolvedPath;
85
+ }
86
+ }
87
+ catch {
88
+ // import.meta.resolve failed, continue to error handling
89
+ }
90
+ if (this.#config.warnOnInvalidArtifacts !== false) {
91
+ console.warn(`[hardhat-external-artifacts] Could not resolve module path: ${moduleSpecifier}`);
92
+ }
93
+ return undefined;
94
+ }
95
+ catch (error) {
96
+ if (this.#config.warnOnInvalidArtifacts !== false) {
97
+ console.warn(`[hardhat-external-artifacts] Failed to resolve module: ${moduleSpecifier}`, error instanceof Error ? error.message : error);
98
+ }
99
+ return undefined;
100
+ }
101
+ }
102
+ /**
103
+ * Find a package's directory and read its package.json.
104
+ * Handles packages with strict exports that don't include ./package.json.
105
+ */
106
+ async #findPackage(pkgName) {
107
+ const require = createRequire(path.join(this.#projectRoot, 'package.json'));
108
+ // Try method 1: Direct package.json resolution (works for most packages)
109
+ try {
110
+ const pkgJsonPath = require.resolve(`${pkgName}/package.json`);
111
+ const pkgDir = path.dirname(pkgJsonPath);
112
+ const pkgJson = await readJsonFile(pkgJsonPath);
113
+ return { pkgDir, pkgJson };
114
+ }
115
+ catch {
116
+ // Package has strict exports, try alternative methods
117
+ }
118
+ // Try method 2: Resolve main entry and walk up to find package.json
119
+ try {
120
+ const mainEntry = require.resolve(pkgName);
121
+ let dir = path.dirname(mainEntry);
122
+ // Walk up the directory tree to find package.json
123
+ while (dir !== path.dirname(dir)) { // Stop at filesystem root
124
+ const pkgJsonPath = path.join(dir, 'package.json');
125
+ try {
126
+ const pkgJson = await readJsonFile(pkgJsonPath);
127
+ // Verify this is the correct package
128
+ if (pkgJson.name === pkgName) {
129
+ return { pkgDir: dir, pkgJson };
130
+ }
131
+ }
132
+ catch {
133
+ // No package.json here, continue walking up
134
+ }
135
+ dir = path.dirname(dir);
136
+ }
137
+ }
138
+ catch {
139
+ // Main entry resolution failed
140
+ }
141
+ // Try method 3: Search node_modules directly
142
+ const nodeModulesPath = path.join(this.#projectRoot, 'node_modules', ...pkgName.split('/'));
143
+ const pkgJsonPath = path.join(nodeModulesPath, 'package.json');
144
+ try {
145
+ const stat = await fs.stat(pkgJsonPath);
146
+ if (stat.isFile()) {
147
+ const pkgJson = await readJsonFile(pkgJsonPath);
148
+ return { pkgDir: nodeModulesPath, pkgJson };
149
+ }
150
+ }
151
+ catch {
152
+ // Not found in direct node_modules
153
+ }
154
+ throw new Error(`Could not find package: ${pkgName}`);
155
+ }
156
+ /**
157
+ * Parse a module specifier into package name and subpath.
158
+ * Handles scoped packages (e.g., "@scope/pkg/subpath") and regular packages.
159
+ */
160
+ #parseModuleSpecifier(specifier) {
161
+ const parts = specifier.split('/');
162
+ const isScoped = specifier.startsWith('@');
163
+ if (isScoped) {
164
+ return {
165
+ pkgName: parts.slice(0, 2).join('/'),
166
+ subpath: parts.slice(2).join('/'),
167
+ };
168
+ }
169
+ return {
170
+ pkgName: parts[0],
171
+ subpath: parts.slice(1).join('/'),
172
+ };
173
+ }
174
+ /**
175
+ * Resolve a subpath against a package.json exports field.
176
+ * Handles subpath patterns like "./artifacts/*": "./dist/artifacts/*"
177
+ *
178
+ * @param exports - The exports field from package.json
179
+ * @param subpath - The subpath to resolve (e.g., "./artifacts")
180
+ * @returns The resolved path relative to the package root, or undefined
181
+ */
182
+ #resolveExportsSubpath(exports, subpath) {
183
+ if (exports === null) {
184
+ return undefined;
185
+ }
186
+ if (typeof exports === 'string') {
187
+ // Simple string export - only matches if subpath is "."
188
+ return subpath === '.' ? exports : undefined;
189
+ }
190
+ if (typeof exports !== 'object') {
191
+ return undefined;
192
+ }
193
+ // Check for exact match first
194
+ if (subpath in exports) {
195
+ return this.#resolveExportTarget(exports[subpath]);
196
+ }
197
+ // Check for pattern matches (e.g., "./artifacts/*")
198
+ for (const [pattern, target] of Object.entries(exports)) {
199
+ if (pattern.includes('*')) {
200
+ const resolved = this.#matchExportPattern(pattern, target, subpath);
201
+ if (resolved) {
202
+ return resolved;
203
+ }
204
+ }
205
+ }
206
+ // Check for directory patterns (e.g., "./artifacts/" matches "./artifacts/anything")
207
+ for (const [pattern, target] of Object.entries(exports)) {
208
+ if (pattern.endsWith('/') && subpath.startsWith(pattern)) {
209
+ const suffix = subpath.slice(pattern.length);
210
+ const resolvedTarget = this.#resolveExportTarget(target);
211
+ if (resolvedTarget) {
212
+ return resolvedTarget.endsWith('/')
213
+ ? resolvedTarget + suffix
214
+ : resolvedTarget + '/' + suffix;
215
+ }
216
+ }
217
+ }
218
+ return undefined;
219
+ }
220
+ /**
221
+ * Match a subpath against an export pattern with wildcards.
222
+ * E.g., pattern "./artifacts/*" with target "./dist/*" and subpath "./artifacts"
223
+ * would return "./dist"
224
+ */
225
+ #matchExportPattern(pattern, target, subpath) {
226
+ // Handle pattern like "./artifacts/*" matching "./artifacts" (the directory itself)
227
+ const patternBase = pattern.replace('/*', '');
228
+ if (subpath === patternBase) {
229
+ // User wants the base directory, not a specific file
230
+ // Resolve to the target base directory
231
+ const resolvedTarget = this.#resolveExportTarget(target);
232
+ if (resolvedTarget) {
233
+ return resolvedTarget.replace('/*', '').replace(/\*$/, '');
234
+ }
235
+ }
236
+ // Handle pattern matching for files within the directory
237
+ if (subpath.startsWith(patternBase + '/')) {
238
+ const wildcardValue = subpath.slice(patternBase.length + 1);
239
+ const resolvedTarget = this.#resolveExportTarget(target);
240
+ if (resolvedTarget && resolvedTarget.includes('*')) {
241
+ return resolvedTarget.replace('*', wildcardValue);
242
+ }
243
+ }
244
+ return undefined;
245
+ }
246
+ /**
247
+ * Resolve an export target, handling conditional exports.
248
+ */
249
+ #resolveExportTarget(target) {
250
+ if (target === null) {
251
+ return undefined;
252
+ }
253
+ if (typeof target === 'string') {
254
+ return target;
255
+ }
256
+ if (typeof target !== 'object') {
257
+ return undefined;
258
+ }
259
+ // Handle conditional exports - prefer 'import' for ESM, then 'default'
260
+ const conditions = ['import', 'default', 'node', 'require'];
261
+ for (const condition of conditions) {
262
+ if (condition in target) {
263
+ const result = this.#resolveExportTarget(target[condition]);
264
+ if (result) {
265
+ return result;
266
+ }
267
+ }
268
+ }
269
+ return undefined;
270
+ }
27
271
  async #loadFromPath(absolutePath) {
28
272
  let stat;
29
273
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/artifacts/loader.ts"],"names":[],"mappings":"AAKA,OAAO,EACN,YAAY,EACZ,mBAAmB,GACnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAElC,MAAM,OAAO,cAAc;IACjB,OAAO,CAA0B;IACjC,YAAY,CAAS;IAE9B,YAAY,MAA+B,EAAE,WAAmB;QAC/D,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,OAAO;QACZ,MAAM,SAAS,GAAuB,EAAE,CAAC;QAEzC,kBAAkB;QAClB,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACxB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;gBACjE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7D,CAAC;QACF,CAAC;QAED,8BAA8B;QAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YAC3B,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxD,SAAS,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,YAAoB;QACvC,IAAI,IAAyC,CAAC;QAE9C,IAAI,CAAC;YACJ,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACR,yCAAyC;YACzC,IAAI,IAAI,CAAC,OAAO,CAAC,sBAAsB,KAAK,KAAK,EAAE,CAAC;gBACnD,OAAO,CAAC,IAAI,CACX,gDAAgD,YAAY,EAAE,CAC9D,CAAC;YACH,CAAC;YACD,OAAO,EAAE,CAAC;QACX,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,IAAI,CAAC;gBACJ,OAAO,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,IAAI,CAAC,OAAO,CAAC,sBAAsB,KAAK,KAAK,EAAE,CAAC;oBACnD,OAAO,CAAC,IAAI,CACX,yDAAyD,YAAY,EAAE,EACvE,KAAK,CACL,CAAC;gBACH,CAAC;gBACD,OAAO,EAAE,CAAC;YACX,CAAC;QACF,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,4CAA4C;YAC5C,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAC3D,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CACnB,CAAC;YAEF,MAAM,eAAe,GAAuB,EAAE,CAAC;YAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBAC1B,IAAI,CAAC;oBACJ,eAAe,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1D,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,IAAI,IAAI,CAAC,OAAO,CAAC,sBAAsB,KAAK,KAAK,EAAE,CAAC;wBACnD,OAAO,CAAC,IAAI,CACX,yDAAyD,IAAI,EAAE,EAC/D,KAAK,CACL,CAAC;oBACH,CAAC;gBACF,CAAC;YACF,CAAC;YACD,OAAO,eAAe,CAAC;QACxB,CAAC;QAED,OAAO,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,QAAgB;QACvC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,kBAAkB,CAAC,GAAQ,EAAE,MAAc;QAC1C,wDAAwD;QACxD,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CACd,iBAAiB,MAAM,uDAAuD,CAC9E,CAAC;QACH,CAAC;QAED,mDAAmD;QACnD,qDAAqD;QACrD,IAAI,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;QACpC,IAAI,CAAC,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAChD,YAAY,GAAG,QAAQ,CAAC;QACzB,CAAC;QAED,iDAAiD;QACjD,oDAAoD;QACpD,IAAI,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QAChC,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE,CAAC;YACnD,UAAU,GAAG,YAAY,YAAY,MAAM,CAAC;QAC7C,CAAC;QAED,kCAAkC;QAClC,MAAM,QAAQ,GAAqB;YAClC,YAAY;YACZ,UAAU;YACV,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;YAC9B,gBAAgB,EAAE,GAAG,CAAC,gBAAgB,IAAI,IAAI;YAC9C,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,EAAE;YACxC,sBAAsB,EAAE,GAAG,CAAC,sBAAsB,IAAI,EAAE;SACxD,CAAC;QAEF,6DAA6D;QAC7D,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YACnB,4CAA4C;YAC3C,QAAyB,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;YACpD,QAAyB,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;YAClD,QAAyB,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;YACxC,QAAyB,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAC9C,QAAyB,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YAChD,QAAyB,CAAC,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;QAC9D,CAAC;QAED,OAAO,QAAQ,CAAC;IACjB,CAAC;CACD"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/artifacts/loader.ts"],"names":[],"mappings":"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"}
@@ -81,11 +81,23 @@ export type ArtifactResolver = () => Promise<ExternalArtifact[]> | ExternalArtif
81
81
  */
82
82
  export interface ExternalArtifactsConfig {
83
83
  /**
84
- * Paths to artifact files or directories
84
+ * Paths to artifact files or directories (relative to project root)
85
85
  * - File path: loads single artifact JSON
86
86
  * - Directory path: loads all .json files recursively
87
87
  */
88
88
  paths?: string[];
89
+ /**
90
+ * Module specifiers to resolve from node_modules
91
+ * Uses Node.js module resolution to find exported artifact directories.
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * // If @my-org/contracts exports "./artifacts" in package.json:
96
+ * // "exports": { "./artifacts": "./dist/artifacts" }
97
+ * modules: ['@my-org/contracts/artifacts']
98
+ * ```
99
+ */
100
+ modules?: string[];
89
101
  /**
90
102
  * Function that resolves and returns artifacts dynamically
91
103
  * Useful for loading from APIs, databases, or complex logic
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/artifacts/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAChC,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IAErB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IAEnB,mBAAmB;IACnB,GAAG,EAAE,SAAS,GAAG,EAAE,CAAC;IAEpB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IAEjB,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,CAAC;IAEzB,sDAAsD;IACtD,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,oDAAoD;IACpD,sBAAsB,CAAC,EAAE,cAAc,CAAC;CACxC;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACrD,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,qEAAqE;IACrE,GAAG,CAAC,EAAE;QACL,QAAQ,EAAE;YACT,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,EAAE,MAAM,CAAC;YAClB,cAAc,EAAE,cAAc,CAAC;YAC/B,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC;YACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;SACxC,CAAC;QACF,gBAAgB,EAAE;YACjB,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,EAAE,MAAM,CAAC;YAClB,cAAc,EAAE,cAAc,CAAC;YAC/B,mBAAmB,CAAC,EAAE,MAAM,CAC3B,MAAM,EACN,KAAK,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAC,CAAC,CACtC,CAAC;YACF,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC;YACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;SACxC,CAAC;QACF,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3C,YAAY,CAAC,EAAE,GAAG,CAAC;KACnB,CAAC;IAEF,8BAA8B;IAC9B,MAAM,CAAC,EAAE,GAAG,CAAC;IAEb,yBAAyB;IACzB,OAAO,CAAC,EAAE,GAAG,CAAC;IAEd,qBAAqB;IACrB,aAAa,CAAC,EAAE,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC9B,CAAC,UAAU,EAAE,MAAM,GAAG;QACrB,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAC,CAAC,CAAC;KAC9D,CAAC;CACF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,QAAQ,EAAE,gBAAgB,GACxB,QAAQ,IAAI,YAAY,CAE1B;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAC5B,OAAO,CAAC,gBAAgB,EAAE,CAAC,GAC3B,gBAAgB,EAAE,CAAC;AAEtB;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB;;;OAGG;IACH,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAE5B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/artifacts/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAChC,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IAErB,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IAEnB,mBAAmB;IACnB,GAAG,EAAE,SAAS,GAAG,EAAE,CAAC;IAEpB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,CAAC;IAEjB,8CAA8C;IAC9C,gBAAgB,EAAE,MAAM,CAAC;IAEzB,sDAAsD;IACtD,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC,oDAAoD;IACpD,sBAAsB,CAAC,EAAE,cAAc,CAAC;CACxC;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACrD,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,qEAAqE;IACrE,GAAG,CAAC,EAAE;QACL,QAAQ,EAAE;YACT,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,EAAE,MAAM,CAAC;YAClB,cAAc,EAAE,cAAc,CAAC;YAC/B,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC;YACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;SACxC,CAAC;QACF,gBAAgB,EAAE;YACjB,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,EAAE,MAAM,CAAC;YAClB,cAAc,EAAE,cAAc,CAAC;YAC/B,mBAAmB,CAAC,EAAE,MAAM,CAC3B,MAAM,EACN,KAAK,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAC;gBAAC,MAAM,EAAE,MAAM,CAAA;aAAC,CAAC,CACtC,CAAC;YACF,gBAAgB,CAAC,EAAE,GAAG,EAAE,CAAC;YACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;SACxC,CAAC;QACF,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3C,YAAY,CAAC,EAAE,GAAG,CAAC;KACnB,CAAC;IAEF,8BAA8B;IAC9B,MAAM,CAAC,EAAE,GAAG,CAAC;IAEb,yBAAyB;IACzB,OAAO,CAAC,EAAE,GAAG,CAAC;IAEd,qBAAqB;IACrB,aAAa,CAAC,EAAE,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC9B,CAAC,UAAU,EAAE,MAAM,GAAG;QACrB,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAC,CAAC,CAAC;KAC9D,CAAC;CACF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,QAAQ,EAAE,gBAAgB,GACxB,QAAQ,IAAI,YAAY,CAE1B;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAC5B,OAAO,CAAC,gBAAgB,EAAE,CAAC,GAC3B,gBAAgB,EAAE,CAAC;AAEtB;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAE5B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CAChB"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/hooks/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAC;8BAG5B,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AAAtD,wBAuCE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/hooks/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,qBAAqB,CAAC;8BAG5B,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AAAtD,wBAwCE"}
@@ -7,6 +7,7 @@ export default async () => {
7
7
  // Apply defaults
8
8
  const externalArtifacts = {
9
9
  paths: externalArtifactsUserConfig?.paths ?? [],
10
+ modules: externalArtifactsUserConfig?.modules ?? [],
10
11
  resolver: externalArtifactsUserConfig?.resolver,
11
12
  solcVersion: externalArtifactsUserConfig?.solcVersion ?? '0.8.20',
12
13
  warnOnInvalidArtifacts: externalArtifactsUserConfig?.warnOnInvalidArtifacts ?? true,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/hooks/config.ts"],"names":[],"mappings":"AAGA,eAAe,KAAK,IAAmC,EAAE;IACxD,MAAM,QAAQ,GAAyB;QACtC,iBAAiB,EAAE,KAAK,EACvB,UAAU,EACV,4BAA4B,EAC5B,IAAI,EACH,EAAE;YACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAChC,UAAU,EACV,4BAA4B,CAC5B,CAAC;YAEF,uCAAuC;YACvC,MAAM,2BAA2B,GAAG,UAAU,CAAC,iBAEnC,CAAC;YAEb,iBAAiB;YACjB,MAAM,iBAAiB,GAInB;gBACH,KAAK,EAAE,2BAA2B,EAAE,KAAK,IAAI,EAAE;gBAC/C,QAAQ,EAAE,2BAA2B,EAAE,QAAQ;gBAC/C,WAAW,EAAE,2BAA2B,EAAE,WAAW,IAAI,QAAQ;gBACjE,sBAAsB,EACrB,2BAA2B,EAAE,sBAAsB,IAAI,IAAI;gBAC5D,KAAK,EAAE,2BAA2B,EAAE,KAAK,IAAI,KAAK;aAClD,CAAC;YAEF,OAAO;gBACN,GAAG,cAAc;gBACjB,iBAAiB;aACjB,CAAC;QACH,CAAC;KACD,CAAC;IAEF,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/hooks/config.ts"],"names":[],"mappings":"AAGA,eAAe,KAAK,IAAmC,EAAE;IACxD,MAAM,QAAQ,GAAyB;QACtC,iBAAiB,EAAE,KAAK,EACvB,UAAU,EACV,4BAA4B,EAC5B,IAAI,EACH,EAAE;YACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAChC,UAAU,EACV,4BAA4B,CAC5B,CAAC;YAEF,uCAAuC;YACvC,MAAM,2BAA2B,GAAG,UAAU,CAAC,iBAEnC,CAAC;YAEb,iBAAiB;YACjB,MAAM,iBAAiB,GAInB;gBACH,KAAK,EAAE,2BAA2B,EAAE,KAAK,IAAI,EAAE;gBAC/C,OAAO,EAAE,2BAA2B,EAAE,OAAO,IAAI,EAAE;gBACnD,QAAQ,EAAE,2BAA2B,EAAE,QAAQ;gBAC/C,WAAW,EAAE,2BAA2B,EAAE,WAAW,IAAI,QAAQ;gBACjE,sBAAsB,EACrB,2BAA2B,EAAE,sBAAsB,IAAI,IAAI;gBAC5D,KAAK,EAAE,2BAA2B,EAAE,KAAK,IAAI,KAAK;aAClD,CAAC;YAEF,OAAO;gBACN,GAAG,cAAc;gBACjB,iBAAiB;aACjB,CAAC;QACH,CAAC;KACD,CAAC;IAEF,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/hooks/network.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAc,MAAM,qBAAqB,CAAC;8BAS1C,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AAAvD,wBAsHE"}
1
+ {"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/hooks/network.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAc,MAAM,qBAAqB,CAAC;8BAS1C,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AAAvD,wBA6HE"}
@@ -4,15 +4,19 @@ import { isRichArtifact } from '../artifacts/types.js';
4
4
  export default async () => {
5
5
  const handlers = {
6
6
  newConnection: async (context, next) => {
7
+ console.log(`connecting...`);
7
8
  // Call the default behavior first to create the connection
8
9
  const connection = await next(context);
10
+ console.log(`...connected`);
9
11
  // Only inject artifacts for EDR networks (hardhat network)
10
12
  if (connection.networkConfig.type !== 'edr-simulated') {
11
13
  return connection;
12
14
  }
13
15
  const config = context.config.externalArtifacts;
14
16
  // Check if config exists and there's anything to load
15
- if (!config || (!config.paths?.length && !config.resolver)) {
17
+ if (!config ||
18
+ (!config.modules?.length && !config.paths?.length && !config.resolver)) {
19
+ console.log(`skipping`);
16
20
  return connection;
17
21
  }
18
22
  const debug = config.debug ?? false;
@@ -1 +1 @@
1
- {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/hooks/network.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/hooks/network.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,cAAc,EAAC,MAAM,wBAAwB,CAAC;AACtD,OAAO,EACN,uBAAuB,GAEvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAC,cAAc,EAAC,MAAM,uBAAuB,CAAC;AAErD,eAAe,KAAK,IAAoC,EAAE;IACzD,MAAM,QAAQ,GAA0B;QACvC,aAAa,EAAE,KAAK,EACnB,OAAoB,EACpB,IAE2C,EACF,EAAE;YAC3C,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC7B,2DAA2D;YAC3D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;YAEvC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAE5B,2DAA2D;YAC3D,IAAI,UAAU,CAAC,aAAa,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBACvD,OAAO,UAAU,CAAC;YACnB,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC;YAEhD,sDAAsD;YACtD,IACC,CAAC,MAAM;gBACP,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EACrE,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACxB,OAAO,UAAU,CAAC;YACnB,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;YACpC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YAEzD,IAAI,CAAC;gBACJ,0BAA0B;gBAC1B,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrE,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;gBAEzC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC5B,GAAG,CAAC,iDAAiD,CAAC,CAAC;oBACvD,OAAO,UAAU,CAAC;gBACnB,CAAC;gBAED,GAAG,CACF,uCAAuC,SAAS,CAAC,MAAM,eAAe,CACtE,CAAC;gBACF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBAClC,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;oBACxC,MAAM,sBAAsB,GAAG,QAAQ,CAAC,gBAAgB,EAAE,MAAM,IAAI,CAAC,CAAC;oBACtE,GAAG,CACF,OAAO,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,uBAAuB,sBAAsB,SAAS,CACxI,CAAC;gBACH,CAAC;gBAED,mCAAmC;gBACnC,2DAA2D;gBAC3D,4DAA4D;gBAC5D,MAAM,YAAY,GAAG,uBAAuB,CAC3C,SAAS,EACT,MAAM,CAAC,WAAW,CAClB,CAAC;gBAEF,GAAG,CACF,wCAAwC,YAAY,CAAC,MAAM,iBAAiB,CAC5E,CAAC;gBAEF,gGAAgG;gBAChG,MAAM,QAAQ,GAAG,UAAU,CAAC,QAM3B,CAAC;gBAEF,IAAI,OAAO,QAAQ,CAAC,oBAAoB,KAAK,UAAU,EAAE,CAAC;oBACzD,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;wBACxC,cAAc,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;wBAEjC,6DAA6D;wBAC7D,iDAAiD;wBACjD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAC5B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,aAAa,CAAC,CACzC,CAAC;wBACF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC7B,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,cAAc,CAAC,CAC1C,CAAC;wBAEF,GAAG,CACF,+EAA+E,WAAW,CAAC,WAAW,EAAE,CACxG,CAAC;wBAEF,MAAM,QAAQ,CAAC,oBAAoB,CAClC,WAAW,CAAC,WAAW,EACvB,UAAU,EACV,WAAW,CACX,CAAC;wBACF,GAAG,CACF,6EAA6E,CAC7E,CAAC;oBACH,CAAC;oBAED,OAAO,CAAC,GAAG,CACV,uCAAuC,SAAS,CAAC,MAAM,4BAA4B,YAAY,CAAC,MAAM,iBAAiB,CACvH,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACP,OAAO,CAAC,IAAI,CACX,wFAAwF;wBACvF,sDAAsD,CACvD,CAAC;gBACH,CAAC;YACF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,MAAM,CAAC,sBAAsB,KAAK,KAAK,EAAE,CAAC;oBAC7C,OAAO,CAAC,IAAI,CACX,0EAA0E,EAC1E,KAAK,CACL,CAAC;gBACH,CAAC;YACF,CAAC;YAED,OAAO,UAAU,CAAC;QACnB,CAAC;KACD,CAAC;IAEF,OAAO,QAAQ,CAAC;AACjB,CAAC,CAAC;AAEF,SAAS,cAAc,CACtB,WAAiC,EACjC,GAA6B;IAE7B,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACzD,GAAG,CAAC,kBAAkB,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;IACjD,GAAG,CACF,+BAA+B,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1F,CAAC;IACF,GAAG,CACF,gCAAgC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC5F,CAAC;IAEF,KAAK,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CACnD,WAAW,CAAC,cAAc,CAAC,SAAS,IAAI,EAAE,CAC1C,EAAE,CAAC;QACH,KAAK,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CACpD,SAAgC,CAChC,EAAE,CAAC;YACH,MAAM,sBAAsB,GAC3B,QAAQ,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;YACrD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAC9B,QAAQ,CAAC,GAAG,EAAE,iBAAiB,IAAI,EAAE,CACrC,CAAC,MAAM,CAAC;YACT,GAAG,CACF,KAAK,UAAU,IAAI,YAAY,wBAAwB,sBAAsB,WAAW,IAAI,CAAC,KAAK,CAAC,sBAAsB,GAAG,CAAC,CAAC,qBAAqB,WAAW,EAAE,CAChK,CAAC;YACF,mDAAmD;YACnD,IAAI,sBAAsB,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBACvE,GAAG,CAAC,yBAAyB,OAAO,KAAK,CAAC,CAAC;YAC5C,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hardhat-external-artifacts",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Hardhat plugin that allow hardhat to know about them",
5
5
  "keywords": [
6
6
  "hardhat",
@@ -9,6 +9,21 @@ import {
9
9
  } from '@nomicfoundation/hardhat-utils/fs';
10
10
  import path from 'node:path';
11
11
  import fs from 'node:fs/promises';
12
+ import {createRequire} from 'node:module';
13
+ import {fileURLToPath} from 'node:url';
14
+
15
+ /**
16
+ * Package.json exports field types
17
+ */
18
+ type ExportsField = string | null | ExportsConditions | ExportsMap;
19
+
20
+ interface ExportsConditions {
21
+ [condition: string]: ExportsField;
22
+ }
23
+
24
+ interface ExportsMap {
25
+ [subpath: string]: ExportsField;
26
+ }
12
27
 
13
28
  export class ArtifactLoader {
14
29
  readonly #config: ExternalArtifactsConfig;
@@ -22,7 +37,7 @@ export class ArtifactLoader {
22
37
  async loadAll(): Promise<ExternalArtifact[]> {
23
38
  const artifacts: ExternalArtifact[] = [];
24
39
 
25
- // Load from paths
40
+ // Load from paths (relative/absolute filesystem paths)
26
41
  if (this.#config.paths) {
27
42
  for (const pathOrGlob of this.#config.paths) {
28
43
  const absolutePath = path.resolve(this.#projectRoot, pathOrGlob);
@@ -30,6 +45,16 @@ export class ArtifactLoader {
30
45
  }
31
46
  }
32
47
 
48
+ // Load from modules (node_modules resolution)
49
+ if (this.#config.modules) {
50
+ for (const moduleSpecifier of this.#config.modules) {
51
+ const resolvedPath = await this.#resolveModulePath(moduleSpecifier);
52
+ if (resolvedPath) {
53
+ artifacts.push(...(await this.#loadFromPath(resolvedPath)));
54
+ }
55
+ }
56
+ }
57
+
33
58
  // Load from resolver function
34
59
  if (this.#config.resolver) {
35
60
  const resolvedArtifacts = await this.#config.resolver();
@@ -39,6 +64,280 @@ export class ArtifactLoader {
39
64
  return artifacts;
40
65
  }
41
66
 
67
+ /**
68
+ * Resolves a module specifier to an absolute filesystem path.
69
+ * Supports package.json "exports" field patterns like "./artifacts/*".
70
+ *
71
+ * @param moduleSpecifier - e.g., "@my-org/contracts/artifacts"
72
+ * @returns The resolved absolute path, or undefined if resolution fails
73
+ */
74
+ async #resolveModulePath(moduleSpecifier: string): Promise<string | undefined> {
75
+ // Parse the module specifier into package name and subpath
76
+ const {pkgName, subpath} = this.#parseModuleSpecifier(moduleSpecifier);
77
+
78
+ try {
79
+ // Find the package directory by locating its package.json
80
+ const {pkgDir, pkgJson} = await this.#findPackage(pkgName);
81
+
82
+ if (subpath && pkgJson.exports) {
83
+ // Try to resolve the subpath using the exports field
84
+ const resolvedSubpath = this.#resolveExportsSubpath(
85
+ pkgJson.exports,
86
+ `./${subpath}`,
87
+ );
88
+
89
+ if (resolvedSubpath) {
90
+ const targetPath = path.join(pkgDir, resolvedSubpath);
91
+ const stat = await fs.stat(targetPath).catch(() => null);
92
+ if (stat) {
93
+ return targetPath;
94
+ }
95
+ }
96
+ }
97
+
98
+ // Fallback: try direct path (for packages without exports or simple cases)
99
+ if (subpath) {
100
+ const targetPath = path.join(pkgDir, subpath);
101
+ const stat = await fs.stat(targetPath).catch(() => null);
102
+ if (stat) {
103
+ return targetPath;
104
+ }
105
+ }
106
+
107
+ // Try using import.meta.resolve for standard module resolution
108
+ try {
109
+ const resolvedUrl = import.meta.resolve(moduleSpecifier, `file://${this.#projectRoot}/`);
110
+ const resolvedPath = fileURLToPath(resolvedUrl);
111
+ const stat = await fs.stat(resolvedPath).catch(() => null);
112
+
113
+ if (stat?.isDirectory()) {
114
+ return resolvedPath;
115
+ }
116
+
117
+ if (stat?.isFile()) {
118
+ // If it resolved to an index file, return the directory
119
+ const basename = path.basename(resolvedPath);
120
+ if (basename.startsWith('index.')) {
121
+ return path.dirname(resolvedPath);
122
+ }
123
+ return resolvedPath;
124
+ }
125
+ } catch {
126
+ // import.meta.resolve failed, continue to error handling
127
+ }
128
+
129
+ if (this.#config.warnOnInvalidArtifacts !== false) {
130
+ console.warn(
131
+ `[hardhat-external-artifacts] Could not resolve module path: ${moduleSpecifier}`,
132
+ );
133
+ }
134
+ return undefined;
135
+
136
+ } catch (error) {
137
+ if (this.#config.warnOnInvalidArtifacts !== false) {
138
+ console.warn(
139
+ `[hardhat-external-artifacts] Failed to resolve module: ${moduleSpecifier}`,
140
+ error instanceof Error ? error.message : error,
141
+ );
142
+ }
143
+ return undefined;
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Find a package's directory and read its package.json.
149
+ * Handles packages with strict exports that don't include ./package.json.
150
+ */
151
+ async #findPackage(pkgName: string): Promise<{pkgDir: string; pkgJson: {exports?: ExportsField}}> {
152
+ const require = createRequire(path.join(this.#projectRoot, 'package.json'));
153
+
154
+ // Try method 1: Direct package.json resolution (works for most packages)
155
+ try {
156
+ const pkgJsonPath = require.resolve(`${pkgName}/package.json`);
157
+ const pkgDir = path.dirname(pkgJsonPath);
158
+ const pkgJson = await readJsonFile(pkgJsonPath) as {exports?: ExportsField};
159
+ return {pkgDir, pkgJson};
160
+ } catch {
161
+ // Package has strict exports, try alternative methods
162
+ }
163
+
164
+ // Try method 2: Resolve main entry and walk up to find package.json
165
+ try {
166
+ const mainEntry = require.resolve(pkgName);
167
+ let dir = path.dirname(mainEntry);
168
+
169
+ // Walk up the directory tree to find package.json
170
+ while (dir !== path.dirname(dir)) { // Stop at filesystem root
171
+ const pkgJsonPath = path.join(dir, 'package.json');
172
+ try {
173
+ const pkgJson = await readJsonFile(pkgJsonPath) as {name?: string; exports?: ExportsField};
174
+ // Verify this is the correct package
175
+ if (pkgJson.name === pkgName) {
176
+ return {pkgDir: dir, pkgJson};
177
+ }
178
+ } catch {
179
+ // No package.json here, continue walking up
180
+ }
181
+ dir = path.dirname(dir);
182
+ }
183
+ } catch {
184
+ // Main entry resolution failed
185
+ }
186
+
187
+ // Try method 3: Search node_modules directly
188
+ const nodeModulesPath = path.join(this.#projectRoot, 'node_modules', ...pkgName.split('/'));
189
+ const pkgJsonPath = path.join(nodeModulesPath, 'package.json');
190
+ try {
191
+ const stat = await fs.stat(pkgJsonPath);
192
+ if (stat.isFile()) {
193
+ const pkgJson = await readJsonFile(pkgJsonPath) as {exports?: ExportsField};
194
+ return {pkgDir: nodeModulesPath, pkgJson};
195
+ }
196
+ } catch {
197
+ // Not found in direct node_modules
198
+ }
199
+
200
+ throw new Error(`Could not find package: ${pkgName}`);
201
+ }
202
+
203
+ /**
204
+ * Parse a module specifier into package name and subpath.
205
+ * Handles scoped packages (e.g., "@scope/pkg/subpath") and regular packages.
206
+ */
207
+ #parseModuleSpecifier(specifier: string): {pkgName: string; subpath: string} {
208
+ const parts = specifier.split('/');
209
+ const isScoped = specifier.startsWith('@');
210
+
211
+ if (isScoped) {
212
+ return {
213
+ pkgName: parts.slice(0, 2).join('/'),
214
+ subpath: parts.slice(2).join('/'),
215
+ };
216
+ }
217
+
218
+ return {
219
+ pkgName: parts[0],
220
+ subpath: parts.slice(1).join('/'),
221
+ };
222
+ }
223
+
224
+ /**
225
+ * Resolve a subpath against a package.json exports field.
226
+ * Handles subpath patterns like "./artifacts/*": "./dist/artifacts/*"
227
+ *
228
+ * @param exports - The exports field from package.json
229
+ * @param subpath - The subpath to resolve (e.g., "./artifacts")
230
+ * @returns The resolved path relative to the package root, or undefined
231
+ */
232
+ #resolveExportsSubpath(exports: ExportsField, subpath: string): string | undefined {
233
+ if (exports === null) {
234
+ return undefined;
235
+ }
236
+
237
+ if (typeof exports === 'string') {
238
+ // Simple string export - only matches if subpath is "."
239
+ return subpath === '.' ? exports : undefined;
240
+ }
241
+
242
+ if (typeof exports !== 'object') {
243
+ return undefined;
244
+ }
245
+
246
+ // Check for exact match first
247
+ if (subpath in exports) {
248
+ return this.#resolveExportTarget(exports[subpath]);
249
+ }
250
+
251
+ // Check for pattern matches (e.g., "./artifacts/*")
252
+ for (const [pattern, target] of Object.entries(exports)) {
253
+ if (pattern.includes('*')) {
254
+ const resolved = this.#matchExportPattern(pattern, target, subpath);
255
+ if (resolved) {
256
+ return resolved;
257
+ }
258
+ }
259
+ }
260
+
261
+ // Check for directory patterns (e.g., "./artifacts/" matches "./artifacts/anything")
262
+ for (const [pattern, target] of Object.entries(exports)) {
263
+ if (pattern.endsWith('/') && subpath.startsWith(pattern)) {
264
+ const suffix = subpath.slice(pattern.length);
265
+ const resolvedTarget = this.#resolveExportTarget(target);
266
+ if (resolvedTarget) {
267
+ return resolvedTarget.endsWith('/')
268
+ ? resolvedTarget + suffix
269
+ : resolvedTarget + '/' + suffix;
270
+ }
271
+ }
272
+ }
273
+
274
+ return undefined;
275
+ }
276
+
277
+ /**
278
+ * Match a subpath against an export pattern with wildcards.
279
+ * E.g., pattern "./artifacts/*" with target "./dist/*" and subpath "./artifacts"
280
+ * would return "./dist"
281
+ */
282
+ #matchExportPattern(
283
+ pattern: string,
284
+ target: ExportsField,
285
+ subpath: string,
286
+ ): string | undefined {
287
+ // Handle pattern like "./artifacts/*" matching "./artifacts" (the directory itself)
288
+ const patternBase = pattern.replace('/*', '');
289
+
290
+ if (subpath === patternBase) {
291
+ // User wants the base directory, not a specific file
292
+ // Resolve to the target base directory
293
+ const resolvedTarget = this.#resolveExportTarget(target);
294
+ if (resolvedTarget) {
295
+ return resolvedTarget.replace('/*', '').replace(/\*$/, '');
296
+ }
297
+ }
298
+
299
+ // Handle pattern matching for files within the directory
300
+ if (subpath.startsWith(patternBase + '/')) {
301
+ const wildcardValue = subpath.slice(patternBase.length + 1);
302
+ const resolvedTarget = this.#resolveExportTarget(target);
303
+ if (resolvedTarget && resolvedTarget.includes('*')) {
304
+ return resolvedTarget.replace('*', wildcardValue);
305
+ }
306
+ }
307
+
308
+ return undefined;
309
+ }
310
+
311
+ /**
312
+ * Resolve an export target, handling conditional exports.
313
+ */
314
+ #resolveExportTarget(target: ExportsField): string | undefined {
315
+ if (target === null) {
316
+ return undefined;
317
+ }
318
+
319
+ if (typeof target === 'string') {
320
+ return target;
321
+ }
322
+
323
+ if (typeof target !== 'object') {
324
+ return undefined;
325
+ }
326
+
327
+ // Handle conditional exports - prefer 'import' for ESM, then 'default'
328
+ const conditions = ['import', 'default', 'node', 'require'];
329
+ for (const condition of conditions) {
330
+ if (condition in target) {
331
+ const result = this.#resolveExportTarget(target[condition]);
332
+ if (result) {
333
+ return result;
334
+ }
335
+ }
336
+ }
337
+
338
+ return undefined;
339
+ }
340
+
42
341
  async #loadFromPath(absolutePath: string): Promise<ExternalArtifact[]> {
43
342
  let stat: Awaited<ReturnType<typeof fs.stat>>;
44
343
 
@@ -100,12 +100,25 @@ export type ArtifactResolver = () =>
100
100
  */
101
101
  export interface ExternalArtifactsConfig {
102
102
  /**
103
- * Paths to artifact files or directories
103
+ * Paths to artifact files or directories (relative to project root)
104
104
  * - File path: loads single artifact JSON
105
105
  * - Directory path: loads all .json files recursively
106
106
  */
107
107
  paths?: string[];
108
108
 
109
+ /**
110
+ * Module specifiers to resolve from node_modules
111
+ * Uses Node.js module resolution to find exported artifact directories.
112
+ *
113
+ * @example
114
+ * ```ts
115
+ * // If @my-org/contracts exports "./artifacts" in package.json:
116
+ * // "exports": { "./artifacts": "./dist/artifacts" }
117
+ * modules: ['@my-org/contracts/artifacts']
118
+ * ```
119
+ */
120
+ modules?: string[];
121
+
109
122
  /**
110
123
  * Function that resolves and returns artifacts dynamically
111
124
  * Useful for loading from APIs, databases, or complex logic
@@ -25,6 +25,7 @@ export default async (): Promise<Partial<ConfigHooks>> => {
25
25
  resolver?: ExternalArtifactsConfig['resolver'];
26
26
  } = {
27
27
  paths: externalArtifactsUserConfig?.paths ?? [],
28
+ modules: externalArtifactsUserConfig?.modules ?? [],
28
29
  resolver: externalArtifactsUserConfig?.resolver,
29
30
  solcVersion: externalArtifactsUserConfig?.solcVersion ?? '0.8.20',
30
31
  warnOnInvalidArtifacts:
@@ -15,9 +15,12 @@ export default async (): Promise<Partial<NetworkHooks>> => {
15
15
  nextContext: HookContext,
16
16
  ) => Promise<NetworkConnection<ChainTypeT>>,
17
17
  ): Promise<NetworkConnection<ChainTypeT>> => {
18
+ console.log(`connecting...`);
18
19
  // Call the default behavior first to create the connection
19
20
  const connection = await next(context);
20
21
 
22
+ console.log(`...connected`);
23
+
21
24
  // Only inject artifacts for EDR networks (hardhat network)
22
25
  if (connection.networkConfig.type !== 'edr-simulated') {
23
26
  return connection;
@@ -26,7 +29,11 @@ export default async (): Promise<Partial<NetworkHooks>> => {
26
29
  const config = context.config.externalArtifacts;
27
30
 
28
31
  // Check if config exists and there's anything to load
29
- if (!config || (!config.paths?.length && !config.resolver)) {
32
+ if (
33
+ !config ||
34
+ (!config.modules?.length && !config.paths?.length && !config.resolver)
35
+ ) {
36
+ console.log(`skipping`);
30
37
  return connection;
31
38
  }
32
39
 
@@ -54,13 +61,13 @@ export default async (): Promise<Partial<NetworkHooks>> => {
54
61
  );
55
62
  }
56
63
 
57
- // Convert to compilation format(s)
58
- // Rich artifacts with solcInput get their own compilations
59
- // Simple artifacts get grouped into a synthetic compilation
60
- const compilations = artifactsToCompilations(
61
- artifacts,
62
- config.solcVersion, // Default already set in config.ts
63
- );
64
+ // Convert to compilation format(s)
65
+ // Rich artifacts with solcInput get their own compilations
66
+ // Simple artifacts get grouped into a synthetic compilation
67
+ const compilations = artifactsToCompilations(
68
+ artifacts,
69
+ config.solcVersion, // Default already set in config.ts
70
+ );
64
71
 
65
72
  log(
66
73
  `[hardhat-external-artifacts] Created ${compilations.length} compilation(s)`,