@anansi/core 0.20.38 → 0.20.40

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/CHANGELOG.md CHANGED
@@ -3,6 +3,26 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [0.20.40](/github.com/ntucker/anansi/compare/@anansi/core@0.20.39...@anansi/core@0.20.40) (2025-11-15)
7
+
8
+ ### 🐛 Bug Fix
9
+
10
+ * Properly handle fallbacks to node_modules in multiple directories ([#2864](/github.com/ntucker/anansi/issues/2864)) ([136bcb5](/github.com/ntucker/anansi/commit/136bcb5a2a3a895931200f16eeccd7c3b071b11b))
11
+
12
+ ### 📦 Package
13
+
14
+ * Update all non-major dependencies ([#2866](/github.com/ntucker/anansi/issues/2866)) ([930d19a](/github.com/ntucker/anansi/commit/930d19aa7ff8768fb2ba9f220543374435c25fbf))
15
+
16
+ ## [0.20.39](/github.com/ntucker/anansi/compare/@anansi/core@0.20.38...@anansi/core@0.20.39) (2025-11-09)
17
+
18
+ ### 🐛 Bug Fix
19
+
20
+ * Update types ([7b36890](/github.com/ntucker/anansi/commit/7b3689004a45de9ac14091a130eae8177d4baed4))
21
+
22
+ ### 📦 Package
23
+
24
+ * Update all non-major dependencies ([#2858](/github.com/ntucker/anansi/issues/2858)) ([ea62701](/github.com/ntucker/anansi/commit/ea6270186daa1634ef55e2cbd158879bcfc6bbdd))
25
+
6
26
  ## [0.20.38](/github.com/ntucker/anansi/compare/@anansi/core@0.20.37...@anansi/core@0.20.38) (2025-10-14)
7
27
 
8
28
  ### 📦 Package
@@ -0,0 +1,16 @@
1
+ import { createFsRequire } from 'fs-require';
2
+ import { type IUnionFs } from 'unionfs';
3
+ /**
4
+ * Creates a hybrid require function that combines fs-require (for in-memory files)
5
+ * with Node's native require (for bare specifiers from project node_modules).
6
+ *
7
+ * This solves the issue where fs-require cannot resolve bare specifiers like
8
+ * `@anansi/core/server` from workspace node_modules when they're not in the
9
+ * memfs bundle.
10
+ *
11
+ * @param ufs - The unionfs instance (disk first, then memfs)
12
+ * @param projectRoot - Optional project root directory. Defaults to process.cwd()
13
+ * @returns A require function that tries memfs first, then falls back to project node_modules
14
+ */
15
+ export declare function createHybridRequire(ufs: IUnionFs, projectRoot?: string): ReturnType<typeof createFsRequire>;
16
+ //# sourceMappingURL=createHybridRequire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createHybridRequire.d.ts","sourceRoot":"","sources":["../../src/scripts/createHybridRequire.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG7C,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,QAAQ,EACb,WAAW,GAAE,MAAsB,GAClC,UAAU,CAAC,OAAO,eAAe,CAAC,CAqBpC"}
@@ -0,0 +1,36 @@
1
+ import { createFsRequire } from 'fs-require';
2
+ import { createRequire } from 'module';
3
+ import path from 'path';
4
+ /**
5
+ * Creates a hybrid require function that combines fs-require (for in-memory files)
6
+ * with Node's native require (for bare specifiers from project node_modules).
7
+ *
8
+ * This solves the issue where fs-require cannot resolve bare specifiers like
9
+ * `@anansi/core/server` from workspace node_modules when they're not in the
10
+ * memfs bundle.
11
+ *
12
+ * @param ufs - The unionfs instance (disk first, then memfs)
13
+ * @param projectRoot - Optional project root directory. Defaults to process.cwd()
14
+ * @returns A require function that tries memfs first, then falls back to project node_modules
15
+ */
16
+ export function createHybridRequire(ufs, projectRoot = process.cwd()) {
17
+ const fsRequire = createFsRequire(ufs);
18
+ const projectRequire = createRequire(path.join(projectRoot, 'package.json'));
19
+ function hybridRequire(id) {
20
+ try {
21
+ return fsRequire(id);
22
+ } catch (error) {
23
+ const isBare = !id.startsWith('.') && !path.isAbsolute(id);
24
+ if (isBare && error?.code === 'MODULE_NOT_FOUND') {
25
+ return projectRequire(id);
26
+ }
27
+ throw error;
28
+ }
29
+ }
30
+
31
+ // Preserve cache and resolve properties from fsRequire
32
+ hybridRequire.cache = fsRequire.cache;
33
+ hybridRequire.resolve = fsRequire.resolve;
34
+ return hybridRequire;
35
+ }
36
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVGc1JlcXVpcmUiLCJjcmVhdGVSZXF1aXJlIiwicGF0aCIsImNyZWF0ZUh5YnJpZFJlcXVpcmUiLCJ1ZnMiLCJwcm9qZWN0Um9vdCIsInByb2Nlc3MiLCJjd2QiLCJmc1JlcXVpcmUiLCJwcm9qZWN0UmVxdWlyZSIsImpvaW4iLCJoeWJyaWRSZXF1aXJlIiwiaWQiLCJlcnJvciIsImlzQmFyZSIsInN0YXJ0c1dpdGgiLCJpc0Fic29sdXRlIiwiY29kZSIsImNhY2hlIiwicmVzb2x2ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL2NyZWF0ZUh5YnJpZFJlcXVpcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlRnNSZXF1aXJlIH0gZnJvbSAnZnMtcmVxdWlyZSc7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgdHlwZSBJVW5pb25GcyB9IGZyb20gJ3VuaW9uZnMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoeWJyaWQgcmVxdWlyZSBmdW5jdGlvbiB0aGF0IGNvbWJpbmVzIGZzLXJlcXVpcmUgKGZvciBpbi1tZW1vcnkgZmlsZXMpXG4gKiB3aXRoIE5vZGUncyBuYXRpdmUgcmVxdWlyZSAoZm9yIGJhcmUgc3BlY2lmaWVycyBmcm9tIHByb2plY3Qgbm9kZV9tb2R1bGVzKS5cbiAqXG4gKiBUaGlzIHNvbHZlcyB0aGUgaXNzdWUgd2hlcmUgZnMtcmVxdWlyZSBjYW5ub3QgcmVzb2x2ZSBiYXJlIHNwZWNpZmllcnMgbGlrZVxuICogYEBhbmFuc2kvY29yZS9zZXJ2ZXJgIGZyb20gd29ya3NwYWNlIG5vZGVfbW9kdWxlcyB3aGVuIHRoZXkncmUgbm90IGluIHRoZVxuICogbWVtZnMgYnVuZGxlLlxuICpcbiAqIEBwYXJhbSB1ZnMgLSBUaGUgdW5pb25mcyBpbnN0YW5jZSAoZGlzayBmaXJzdCwgdGhlbiBtZW1mcylcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIE9wdGlvbmFsIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkuIERlZmF1bHRzIHRvIHByb2Nlc3MuY3dkKClcbiAqIEByZXR1cm5zIEEgcmVxdWlyZSBmdW5jdGlvbiB0aGF0IHRyaWVzIG1lbWZzIGZpcnN0LCB0aGVuIGZhbGxzIGJhY2sgdG8gcHJvamVjdCBub2RlX21vZHVsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUh5YnJpZFJlcXVpcmUoXG4gIHVmczogSVVuaW9uRnMsXG4gIHByb2plY3RSb290OiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuKTogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRnNSZXF1aXJlPiB7XG4gIGNvbnN0IGZzUmVxdWlyZSA9IGNyZWF0ZUZzUmVxdWlyZSh1ZnMpO1xuICBjb25zdCBwcm9qZWN0UmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUocGF0aC5qb2luKHByb2plY3RSb290LCAncGFja2FnZS5qc29uJykpO1xuXG4gIGZ1bmN0aW9uIGh5YnJpZFJlcXVpcmUoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnNSZXF1aXJlKGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCBpc0JhcmUgPSAhaWQuc3RhcnRzV2l0aCgnLicpICYmICFwYXRoLmlzQWJzb2x1dGUoaWQpO1xuICAgICAgaWYgKGlzQmFyZSAmJiBlcnJvcj8uY29kZSA9PT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICAgIHJldHVybiBwcm9qZWN0UmVxdWlyZShpZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvLyBQcmVzZXJ2ZSBjYWNoZSBhbmQgcmVzb2x2ZSBwcm9wZXJ0aWVzIGZyb20gZnNSZXF1aXJlXG4gIGh5YnJpZFJlcXVpcmUuY2FjaGUgPSBmc1JlcXVpcmUuY2FjaGU7XG4gIGh5YnJpZFJlcXVpcmUucmVzb2x2ZSA9IGZzUmVxdWlyZS5yZXNvbHZlO1xuXG4gIHJldHVybiBoeWJyaWRSZXF1aXJlIGFzIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUZzUmVxdWlyZT47XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGVBQWUsUUFBUSxZQUFZO0FBQzVDLFNBQVNDLGFBQWEsUUFBUSxRQUFRO0FBQ3RDLE9BQU9DLElBQUksTUFBTSxNQUFNO0FBR3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sU0FBU0MsbUJBQW1CQSxDQUNqQ0MsR0FBYSxFQUNiQyxXQUFtQixHQUFHQyxPQUFPLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEVBQ0M7RUFDcEMsTUFBTUMsU0FBUyxHQUFHUixlQUFlLENBQUNJLEdBQUcsQ0FBQztFQUN0QyxNQUFNSyxjQUFjLEdBQUdSLGFBQWEsQ0FBQ0MsSUFBSSxDQUFDUSxJQUFJLENBQUNMLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztFQUU1RSxTQUFTTSxhQUFhQSxDQUFDQyxFQUFVLEVBQUU7SUFDakMsSUFBSTtNQUNGLE9BQU9KLFNBQVMsQ0FBQ0ksRUFBRSxDQUFDO0lBQ3RCLENBQUMsQ0FBQyxPQUFPQyxLQUFVLEVBQUU7TUFDbkIsTUFBTUMsTUFBTSxHQUFHLENBQUNGLEVBQUUsQ0FBQ0csVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUNiLElBQUksQ0FBQ2MsVUFBVSxDQUFDSixFQUFFLENBQUM7TUFDMUQsSUFBSUUsTUFBTSxJQUFJRCxLQUFLLEVBQUVJLElBQUksS0FBSyxrQkFBa0IsRUFBRTtRQUNoRCxPQUFPUixjQUFjLENBQUNHLEVBQUUsQ0FBQztNQUMzQjtNQUNBLE1BQU1DLEtBQUs7SUFDYjtFQUNGOztFQUVBO0VBQ0FGLGFBQWEsQ0FBQ08sS0FBSyxHQUFHVixTQUFTLENBQUNVLEtBQUs7RUFDckNQLGFBQWEsQ0FBQ1EsT0FBTyxHQUFHWCxTQUFTLENBQUNXLE9BQU87RUFFekMsT0FBT1IsYUFBYTtBQUN0QiIsImlnbm9yZUxpc3QiOltdfQ==
@@ -1,3 +1,3 @@
1
- import webpack from 'webpack';
2
- export declare function getWebpackConfig(): Promise<(env: any, argv: any) => webpack.Configuration>;
1
+ import type { Configuration } from 'webpack';
2
+ export declare function getWebpackConfig(): Promise<(env: any, argv: any) => Configuration>;
3
3
  //# sourceMappingURL=getWebpackConfig.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getWebpackConfig.d.ts","sourceRoot":"","sources":["../../src/scripts/getWebpackConfig.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,SAAS,CAAC;AAS9B,wBAAsB,gBAAgB,IAAI,OAAO,CAC/C,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,aAAa,CAC/C,CAOA"}
1
+ {"version":3,"file":"getWebpackConfig.d.ts","sourceRoot":"","sources":["../../src/scripts/getWebpackConfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAS7C,wBAAsB,gBAAgB,IAAI,OAAO,CAC/C,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK,aAAa,CACvC,CAOA"}
@@ -12,4 +12,4 @@ export async function getWebpackConfig() {
12
12
  }
13
13
  return (await import(configPath)).default;
14
14
  }
15
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZWZhdWx0IiwiZW5oYW5jZWQiLCJyZXNvbHZlIiwiY3JlYXRlIiwic3luYyIsIm1vZHVsZXMiLCJleHRlbnNpb25zIiwiZ2V0V2VicGFja0NvbmZpZyIsImNvbmZpZ1BhdGgiLCJwcm9jZXNzIiwiY3dkIiwiRXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9nZXRXZWJwYWNrQ29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmF1bHQgYXMgZW5oYW5jZWQgfSBmcm9tICdlbmhhbmNlZC1yZXNvbHZlJztcbmltcG9ydCB3ZWJwYWNrIGZyb20gJ3dlYnBhY2snO1xuXG5jb25zdCByZXNvbHZlID0gZW5oYW5jZWQuY3JlYXRlLnN5bmMoe1xuICBtb2R1bGVzOiBbJy4nXSxcbiAgLy8gb3IgcmVzb2x2ZS5jcmVhdGUuc3luY1xuICBleHRlbnNpb25zOiBbJy5qcycsICcuY2pzJywgJy5tanMnXSxcbiAgLy8gc2VlIG1vcmUgb3B0aW9ucyBiZWxvd1xufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXZWJwYWNrQ29uZmlnKCk6IFByb21pc2U8XG4gIChlbnY6IGFueSwgYXJndjogYW55KSA9PiB3ZWJwYWNrLkNvbmZpZ3VyYXRpb25cbj4ge1xuICBjb25zdCBjb25maWdQYXRoID0gcmVzb2x2ZSh7fSwgcHJvY2Vzcy5jd2QoKSwgJ3dlYnBhY2suY29uZmlnJyk7XG4gIGlmICghY29uZmlnUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgd2VicGFjay5jb25maWcgaW4gJyArIHByb2Nlc3MuY3dkKCkpO1xuICB9XG5cbiAgcmV0dXJuIChhd2FpdCBpbXBvcnQoY29uZmlnUGF0aCkpLmRlZmF1bHQ7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE9BQU8sSUFBSUMsUUFBUSxRQUFRLGtCQUFrQjtBQUd0RCxNQUFNQyxPQUFPLEdBQUdELFFBQVEsQ0FBQ0UsTUFBTSxDQUFDQyxJQUFJLENBQUM7RUFDbkNDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQztFQUNkO0VBQ0FDLFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTTtFQUNsQztBQUNGLENBQUMsQ0FBQztBQUVGLE9BQU8sZUFBZUMsZ0JBQWdCQSxDQUFBLEVBRXBDO0VBQ0EsTUFBTUMsVUFBVSxHQUFHTixPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUVPLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQztFQUMvRCxJQUFJLENBQUNGLFVBQVUsRUFBRTtJQUNmLE1BQU0sSUFBSUcsS0FBSyxDQUFDLGdDQUFnQyxHQUFHRixPQUFPLENBQUNDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDbkU7RUFFQSxPQUFPLENBQUMsTUFBTSxNQUFNLENBQUNGLFVBQVUsQ0FBQyxFQUFFUixPQUFPO0FBQzNDIiwiaWdub3JlTGlzdCI6W119
15
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZWZhdWx0IiwiZW5oYW5jZWQiLCJyZXNvbHZlIiwiY3JlYXRlIiwic3luYyIsIm1vZHVsZXMiLCJleHRlbnNpb25zIiwiZ2V0V2VicGFja0NvbmZpZyIsImNvbmZpZ1BhdGgiLCJwcm9jZXNzIiwiY3dkIiwiRXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9nZXRXZWJwYWNrQ29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmF1bHQgYXMgZW5oYW5jZWQgfSBmcm9tICdlbmhhbmNlZC1yZXNvbHZlJztcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJ3dlYnBhY2snO1xuXG5jb25zdCByZXNvbHZlID0gZW5oYW5jZWQuY3JlYXRlLnN5bmMoe1xuICBtb2R1bGVzOiBbJy4nXSxcbiAgLy8gb3IgcmVzb2x2ZS5jcmVhdGUuc3luY1xuICBleHRlbnNpb25zOiBbJy5qcycsICcuY2pzJywgJy5tanMnXSxcbiAgLy8gc2VlIG1vcmUgb3B0aW9ucyBiZWxvd1xufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXZWJwYWNrQ29uZmlnKCk6IFByb21pc2U8XG4gIChlbnY6IGFueSwgYXJndjogYW55KSA9PiBDb25maWd1cmF0aW9uXG4+IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHJlc29sdmUoe30sIHByb2Nlc3MuY3dkKCksICd3ZWJwYWNrLmNvbmZpZycpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIHdlYnBhY2suY29uZmlnIGluICcgKyBwcm9jZXNzLmN3ZCgpKTtcbiAgfVxuXG4gIHJldHVybiAoYXdhaXQgaW1wb3J0KGNvbmZpZ1BhdGgpKS5kZWZhdWx0O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxPQUFPLElBQUlDLFFBQVEsUUFBUSxrQkFBa0I7QUFHdEQsTUFBTUMsT0FBTyxHQUFHRCxRQUFRLENBQUNFLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDO0VBQ25DQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUM7RUFDZDtFQUNBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU07RUFDbEM7QUFDRixDQUFDLENBQUM7QUFFRixPQUFPLGVBQWVDLGdCQUFnQkEsQ0FBQSxFQUVwQztFQUNBLE1BQU1DLFVBQVUsR0FBR04sT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFTyxPQUFPLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUM7RUFDL0QsSUFBSSxDQUFDRixVQUFVLEVBQUU7SUFDZixNQUFNLElBQUlHLEtBQUssQ0FBQyxnQ0FBZ0MsR0FBR0YsT0FBTyxDQUFDQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ25FO0VBRUEsT0FBTyxDQUFDLE1BQU0sTUFBTSxDQUFDRixVQUFVLENBQUMsRUFBRVIsT0FBTztBQUMzQyIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,36 @@
1
+ import { createFsRequire } from 'fs-require';
2
+ import { createRequire } from 'module';
3
+ import path from 'path';
4
+ /**
5
+ * Creates a hybrid require function that combines fs-require (for in-memory files)
6
+ * with Node's native require (for bare specifiers from project node_modules).
7
+ *
8
+ * This solves the issue where fs-require cannot resolve bare specifiers like
9
+ * `@anansi/core/server` from workspace node_modules when they're not in the
10
+ * memfs bundle.
11
+ *
12
+ * @param ufs - The unionfs instance (disk first, then memfs)
13
+ * @param projectRoot - Optional project root directory. Defaults to process.cwd()
14
+ * @returns A require function that tries memfs first, then falls back to project node_modules
15
+ */
16
+ export function createHybridRequire(ufs, projectRoot = process.cwd()) {
17
+ const fsRequire = createFsRequire(ufs);
18
+ const projectRequire = createRequire(path.join(projectRoot, 'package.json'));
19
+ function hybridRequire(id) {
20
+ try {
21
+ return fsRequire(id);
22
+ } catch (error) {
23
+ const isBare = !id.startsWith('.') && !path.isAbsolute(id);
24
+ if (isBare && error?.code === 'MODULE_NOT_FOUND') {
25
+ return projectRequire(id);
26
+ }
27
+ throw error;
28
+ }
29
+ }
30
+
31
+ // Preserve cache and resolve properties from fsRequire
32
+ hybridRequire.cache = fsRequire.cache;
33
+ hybridRequire.resolve = fsRequire.resolve;
34
+ return hybridRequire;
35
+ }
36
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVGc1JlcXVpcmUiLCJjcmVhdGVSZXF1aXJlIiwicGF0aCIsImNyZWF0ZUh5YnJpZFJlcXVpcmUiLCJ1ZnMiLCJwcm9qZWN0Um9vdCIsInByb2Nlc3MiLCJjd2QiLCJmc1JlcXVpcmUiLCJwcm9qZWN0UmVxdWlyZSIsImpvaW4iLCJoeWJyaWRSZXF1aXJlIiwiaWQiLCJlcnJvciIsImlzQmFyZSIsInN0YXJ0c1dpdGgiLCJpc0Fic29sdXRlIiwiY29kZSIsImNhY2hlIiwicmVzb2x2ZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zY3JpcHRzL2NyZWF0ZUh5YnJpZFJlcXVpcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlRnNSZXF1aXJlIH0gZnJvbSAnZnMtcmVxdWlyZSc7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgdHlwZSBJVW5pb25GcyB9IGZyb20gJ3VuaW9uZnMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoeWJyaWQgcmVxdWlyZSBmdW5jdGlvbiB0aGF0IGNvbWJpbmVzIGZzLXJlcXVpcmUgKGZvciBpbi1tZW1vcnkgZmlsZXMpXG4gKiB3aXRoIE5vZGUncyBuYXRpdmUgcmVxdWlyZSAoZm9yIGJhcmUgc3BlY2lmaWVycyBmcm9tIHByb2plY3Qgbm9kZV9tb2R1bGVzKS5cbiAqXG4gKiBUaGlzIHNvbHZlcyB0aGUgaXNzdWUgd2hlcmUgZnMtcmVxdWlyZSBjYW5ub3QgcmVzb2x2ZSBiYXJlIHNwZWNpZmllcnMgbGlrZVxuICogYEBhbmFuc2kvY29yZS9zZXJ2ZXJgIGZyb20gd29ya3NwYWNlIG5vZGVfbW9kdWxlcyB3aGVuIHRoZXkncmUgbm90IGluIHRoZVxuICogbWVtZnMgYnVuZGxlLlxuICpcbiAqIEBwYXJhbSB1ZnMgLSBUaGUgdW5pb25mcyBpbnN0YW5jZSAoZGlzayBmaXJzdCwgdGhlbiBtZW1mcylcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIE9wdGlvbmFsIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkuIERlZmF1bHRzIHRvIHByb2Nlc3MuY3dkKClcbiAqIEByZXR1cm5zIEEgcmVxdWlyZSBmdW5jdGlvbiB0aGF0IHRyaWVzIG1lbWZzIGZpcnN0LCB0aGVuIGZhbGxzIGJhY2sgdG8gcHJvamVjdCBub2RlX21vZHVsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUh5YnJpZFJlcXVpcmUoXG4gIHVmczogSVVuaW9uRnMsXG4gIHByb2plY3RSb290OiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuKTogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRnNSZXF1aXJlPiB7XG4gIGNvbnN0IGZzUmVxdWlyZSA9IGNyZWF0ZUZzUmVxdWlyZSh1ZnMpO1xuICBjb25zdCBwcm9qZWN0UmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUocGF0aC5qb2luKHByb2plY3RSb290LCAncGFja2FnZS5qc29uJykpO1xuXG4gIGZ1bmN0aW9uIGh5YnJpZFJlcXVpcmUoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnNSZXF1aXJlKGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCBpc0JhcmUgPSAhaWQuc3RhcnRzV2l0aCgnLicpICYmICFwYXRoLmlzQWJzb2x1dGUoaWQpO1xuICAgICAgaWYgKGlzQmFyZSAmJiBlcnJvcj8uY29kZSA9PT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICAgIHJldHVybiBwcm9qZWN0UmVxdWlyZShpZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvLyBQcmVzZXJ2ZSBjYWNoZSBhbmQgcmVzb2x2ZSBwcm9wZXJ0aWVzIGZyb20gZnNSZXF1aXJlXG4gIGh5YnJpZFJlcXVpcmUuY2FjaGUgPSBmc1JlcXVpcmUuY2FjaGU7XG4gIGh5YnJpZFJlcXVpcmUucmVzb2x2ZSA9IGZzUmVxdWlyZS5yZXNvbHZlO1xuXG4gIHJldHVybiBoeWJyaWRSZXF1aXJlIGFzIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUZzUmVxdWlyZT47XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGVBQWUsUUFBUSxZQUFZO0FBQzVDLFNBQVNDLGFBQWEsUUFBUSxRQUFRO0FBQ3RDLE9BQU9DLElBQUksTUFBTSxNQUFNO0FBR3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sU0FBU0MsbUJBQW1CQSxDQUNqQ0MsR0FBYSxFQUNiQyxXQUFtQixHQUFHQyxPQUFPLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEVBQ0M7RUFDcEMsTUFBTUMsU0FBUyxHQUFHUixlQUFlLENBQUNJLEdBQUcsQ0FBQztFQUN0QyxNQUFNSyxjQUFjLEdBQUdSLGFBQWEsQ0FBQ0MsSUFBSSxDQUFDUSxJQUFJLENBQUNMLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztFQUU1RSxTQUFTTSxhQUFhQSxDQUFDQyxFQUFVLEVBQUU7SUFDakMsSUFBSTtNQUNGLE9BQU9KLFNBQVMsQ0FBQ0ksRUFBRSxDQUFDO0lBQ3RCLENBQUMsQ0FBQyxPQUFPQyxLQUFVLEVBQUU7TUFDbkIsTUFBTUMsTUFBTSxHQUFHLENBQUNGLEVBQUUsQ0FBQ0csVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUNiLElBQUksQ0FBQ2MsVUFBVSxDQUFDSixFQUFFLENBQUM7TUFDMUQsSUFBSUUsTUFBTSxJQUFJRCxLQUFLLEVBQUVJLElBQUksS0FBSyxrQkFBa0IsRUFBRTtRQUNoRCxPQUFPUixjQUFjLENBQUNHLEVBQUUsQ0FBQztNQUMzQjtNQUNBLE1BQU1DLEtBQUs7SUFDYjtFQUNGOztFQUVBO0VBQ0FGLGFBQWEsQ0FBQ08sS0FBSyxHQUFHVixTQUFTLENBQUNVLEtBQUs7RUFDckNQLGFBQWEsQ0FBQ1EsT0FBTyxHQUFHWCxTQUFTLENBQUNXLE9BQU87RUFFekMsT0FBT1IsYUFBYTtBQUN0QiIsImlnbm9yZUxpc3QiOltdfQ==
@@ -12,4 +12,4 @@ export async function getWebpackConfig() {
12
12
  }
13
13
  return (await import(configPath)).default;
14
14
  }
15
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZWZhdWx0IiwiZW5oYW5jZWQiLCJyZXNvbHZlIiwiY3JlYXRlIiwic3luYyIsIm1vZHVsZXMiLCJleHRlbnNpb25zIiwiZ2V0V2VicGFja0NvbmZpZyIsImNvbmZpZ1BhdGgiLCJwcm9jZXNzIiwiY3dkIiwiRXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NyaXB0cy9nZXRXZWJwYWNrQ29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmF1bHQgYXMgZW5oYW5jZWQgfSBmcm9tICdlbmhhbmNlZC1yZXNvbHZlJztcbmltcG9ydCB3ZWJwYWNrIGZyb20gJ3dlYnBhY2snO1xuXG5jb25zdCByZXNvbHZlID0gZW5oYW5jZWQuY3JlYXRlLnN5bmMoe1xuICBtb2R1bGVzOiBbJy4nXSxcbiAgLy8gb3IgcmVzb2x2ZS5jcmVhdGUuc3luY1xuICBleHRlbnNpb25zOiBbJy5qcycsICcuY2pzJywgJy5tanMnXSxcbiAgLy8gc2VlIG1vcmUgb3B0aW9ucyBiZWxvd1xufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXZWJwYWNrQ29uZmlnKCk6IFByb21pc2U8XG4gIChlbnY6IGFueSwgYXJndjogYW55KSA9PiB3ZWJwYWNrLkNvbmZpZ3VyYXRpb25cbj4ge1xuICBjb25zdCBjb25maWdQYXRoID0gcmVzb2x2ZSh7fSwgcHJvY2Vzcy5jd2QoKSwgJ3dlYnBhY2suY29uZmlnJyk7XG4gIGlmICghY29uZmlnUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgd2VicGFjay5jb25maWcgaW4gJyArIHByb2Nlc3MuY3dkKCkpO1xuICB9XG5cbiAgcmV0dXJuIChhd2FpdCBpbXBvcnQoY29uZmlnUGF0aCkpLmRlZmF1bHQ7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE9BQU8sSUFBSUMsUUFBUSxRQUFRLGtCQUFrQjtBQUd0RCxNQUFNQyxPQUFPLEdBQUdELFFBQVEsQ0FBQ0UsTUFBTSxDQUFDQyxJQUFJLENBQUM7RUFDbkNDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQztFQUNkO0VBQ0FDLFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTTtFQUNsQztBQUNGLENBQUMsQ0FBQztBQUVGLE9BQU8sZUFBZUMsZ0JBQWdCQSxDQUFBLEVBRXBDO0VBQ0EsTUFBTUMsVUFBVSxHQUFHTixPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUVPLE9BQU8sQ0FBQ0MsR0FBRyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQztFQUMvRCxJQUFJLENBQUNGLFVBQVUsRUFBRTtJQUNmLE1BQU0sSUFBSUcsS0FBSyxDQUFDLGdDQUFnQyxHQUFHRixPQUFPLENBQUNDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDbkU7RUFFQSxPQUFPLENBQUMsTUFBTSxNQUFNLENBQUNGLFVBQVUsQ0FBQyxFQUFFUixPQUFPO0FBQzNDIiwiaWdub3JlTGlzdCI6W119
15
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJkZWZhdWx0IiwiZW5oYW5jZWQiLCJyZXNvbHZlIiwiY3JlYXRlIiwic3luYyIsIm1vZHVsZXMiLCJleHRlbnNpb25zIiwiZ2V0V2VicGFja0NvbmZpZyIsImNvbmZpZ1BhdGgiLCJwcm9jZXNzIiwiY3dkIiwiRXJyb3IiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NyaXB0cy9nZXRXZWJwYWNrQ29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlZmF1bHQgYXMgZW5oYW5jZWQgfSBmcm9tICdlbmhhbmNlZC1yZXNvbHZlJztcbmltcG9ydCB0eXBlIHsgQ29uZmlndXJhdGlvbiB9IGZyb20gJ3dlYnBhY2snO1xuXG5jb25zdCByZXNvbHZlID0gZW5oYW5jZWQuY3JlYXRlLnN5bmMoe1xuICBtb2R1bGVzOiBbJy4nXSxcbiAgLy8gb3IgcmVzb2x2ZS5jcmVhdGUuc3luY1xuICBleHRlbnNpb25zOiBbJy5qcycsICcuY2pzJywgJy5tanMnXSxcbiAgLy8gc2VlIG1vcmUgb3B0aW9ucyBiZWxvd1xufSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXZWJwYWNrQ29uZmlnKCk6IFByb21pc2U8XG4gIChlbnY6IGFueSwgYXJndjogYW55KSA9PiBDb25maWd1cmF0aW9uXG4+IHtcbiAgY29uc3QgY29uZmlnUGF0aCA9IHJlc29sdmUoe30sIHByb2Nlc3MuY3dkKCksICd3ZWJwYWNrLmNvbmZpZycpO1xuICBpZiAoIWNvbmZpZ1BhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIHdlYnBhY2suY29uZmlnIGluICcgKyBwcm9jZXNzLmN3ZCgpKTtcbiAgfVxuXG4gIHJldHVybiAoYXdhaXQgaW1wb3J0KGNvbmZpZ1BhdGgpKS5kZWZhdWx0O1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxPQUFPLElBQUlDLFFBQVEsUUFBUSxrQkFBa0I7QUFHdEQsTUFBTUMsT0FBTyxHQUFHRCxRQUFRLENBQUNFLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDO0VBQ25DQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUM7RUFDZDtFQUNBQyxVQUFVLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU07RUFDbEM7QUFDRixDQUFDLENBQUM7QUFFRixPQUFPLGVBQWVDLGdCQUFnQkEsQ0FBQSxFQUVwQztFQUNBLE1BQU1DLFVBQVUsR0FBR04sT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFTyxPQUFPLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLENBQUM7RUFDL0QsSUFBSSxDQUFDRixVQUFVLEVBQUU7SUFDZixNQUFNLElBQUlHLEtBQUssQ0FBQyxnQ0FBZ0MsR0FBR0YsT0FBTyxDQUFDQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ25FO0VBRUEsT0FBTyxDQUFDLE1BQU0sTUFBTSxDQUFDRixVQUFVLENBQUMsRUFBRVIsT0FBTztBQUMzQyIsImlnbm9yZUxpc3QiOltdfQ==
@@ -3,7 +3,6 @@ Object.hasOwn = Object.hasOwn || /* istanbul ignore next */function hasOwn(it, k
3
3
  return Object.prototype.hasOwnProperty.call(it, key);
4
4
  };
5
5
  import diskFs from 'fs';
6
- import { createFsRequire } from 'fs-require';
7
6
  import { createFsFromVolume, Volume } from 'memfs';
8
7
  import path from 'path';
9
8
  import sourceMapSupport from 'source-map-support';
@@ -14,6 +13,7 @@ import webpack from 'webpack';
14
13
  import logging from 'webpack/lib/logging/runtime.js';
15
14
  import WebpackDevServer from 'webpack-dev-server';
16
15
  import 'cross-fetch/dist/node-polyfill.js';
16
+ import { createHybridRequire } from './createHybridRequire.js';
17
17
  import { getWebpackConfig } from './getWebpackConfig.js';
18
18
  // run directly from node
19
19
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -36,10 +36,8 @@ export default async function startDevServer(entrypoint, env = {}) {
36
36
  const volume = new Volume();
37
37
  const fs = createFsFromVolume(volume);
38
38
  ufs.use(diskFs).use(fs);
39
- const fsRequire = createFsRequire(ufs);
39
+ const fsRequire = createHybridRequire(ufs);
40
40
  const readFile = promisify(ufs.readFile);
41
- let server;
42
-
43
41
  // Generate a temporary file so we can hot reload from the root of the application
44
42
  function hotEntry(entryPath) {
45
43
  // eslint-disable-next-line
@@ -231,4 +229,4 @@ export default async function startDevServer(entrypoint, env = {}) {
231
229
  });
232
230
  runServer();
233
231
  }
234
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzUmVxdWlyZSIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiZ2V0V2VicGFja0NvbmZpZyIsImltcG9ydCIsIm1ldGEiLCJtYWluIiwiZW50cnlwb2ludCIsInByb2Nlc3MiLCJhcmd2IiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJzdGFydERldlNlcnZlciIsInNlcnZlckZpbGVDb250ZW50cyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2VydmVyRW50cnkiLCJlbnYiLCJ3ZWJwYWNrQ29uZmlnIiwiZ2V0TG9nZ2VyIiwidm9sdW1lIiwiZnMiLCJ1c2UiLCJmc1JlcXVpcmUiLCJyZWFkRmlsZSIsInNlcnZlciIsImhvdEVudHJ5IiwiZW50cnlQYXRoIiwiZ2VuZXJhdGVkRW50cnlwb2ludCIsImZpbGVTeW5jIiwicG9zdGZpeCIsIndyaXRlU3luYyIsImZkIiwiY3dkIiwid2VicGFja0NvbmZpZ3MiLCJlbnRyeXBhdGgiLCJuYW1lIiwibW9kZSIsInJlcGxhY2UiLCJCUk9XU0VSU0xJU1RfRU5WIiwidGFyZ2V0IiwiY29tcGlsZXIiLCJlcnJvciIsImluc3RhbGwiLCJob29rUmVxdWlyZSIsImdldFNlcnZlckJ1bmRsZSIsInNlcnZlclN0YXRzIiwic2VydmVySnNvbiIsInRvSnNvbiIsImFzc2V0cyIsImpvaW4iLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJuZXh0IiwieCIsImluaXRSZW5kZXIiLCJyZW5kZXIiLCJhcmdzIiwicHVzaCIsImltcG9ydFJlbmRlciIsInN0YXRzIiwiY2xpZW50U3RhdHMiLCJjb21waWxhdGlvbiIsImVycm9ycyIsImxlbmd0aCIsIkFycmF5IiwiaXNBcnJheSIsImluZm8iLCJjbGllbnRNYW5pZmVzdCIsInRoZW4iLCJidWYiLCJ0b1N0cmluZyIsImtleXMiLCJjYWNoZSIsImZvckVhY2giLCJkZWZhdWx0IiwiYmluZCIsInVuZGVmaW5lZCIsImluaXQiLCJlIiwiZGV2U2VydmVyIiwiZGV2TWlkZGxld2FyZSIsIm91dHB1dEZpbGVTeXN0ZW0iLCJzZXR1cE1pZGRsZXdhcmVzIiwibWlkZGxld2FyZXMiLCJFcnJvciIsIm90aGVyUm91dGVzIiwiV0VCUEFDS19QVUJMSUNfUEFUSCIsInByb3h5IiwiZmlsdGVyIiwiZmxhdE1hcCIsImNvbnRleHQiLCJhcHAiLCJnZXQiLCJSZWdFeHAiLCJ1cmwiLCJlbmRzV2l0aCIsInN0YXR1c0NvZGUiLCJzZXRIZWFkZXIiLCJzZW5kIiwic29ja2V0Iiwib24iLCJjb2RlIiwicnVuU2VydmVyIiwic3RhcnQiLCJob29rcyIsImRvbmUiLCJ0YXAiLCJtdWx0aVN0YXRzIiwiZmluZGVyIiwiZmlsZVRleHQiLCJ0ZXh0Um93cyIsInNwbGl0IiwibWF0Y2giLCJzdGFjayIsIm1hdGNoQWxsIiwicm93IiwiTnVtYmVyIiwicGFyc2VJbnQiLCJjb2wiLCJiYXNlbmFtZSIsIndyaXRlRmlsZVN5bmMiLCJzdG9wU2VydmVyIiwic3RvcCIsIndhcm4iXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NyaXB0cy9zdGFydERldnNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5PYmplY3QuaGFzT3duID1cbiAgT2JqZWN0Lmhhc093biB8fFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG4gIH07XG5pbXBvcnQgdHlwZSB7IE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGRpc2tGcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBjcmVhdGVGc1JlcXVpcmUgfSBmcm9tICdmcy1yZXF1aXJlJztcbmltcG9ydCB7IFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgY3JlYXRlRnNGcm9tVm9sdW1lLCBWb2x1bWUgfSBmcm9tICdtZW1mcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzb3VyY2VNYXBTdXBwb3J0IGZyb20gJ3NvdXJjZS1tYXAtc3VwcG9ydCc7XG5pbXBvcnQgdG1wIGZyb20gJ3RtcCc7XG5pbXBvcnQgeyB1ZnMgfSBmcm9tICd1bmlvbmZzJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHdlYnBhY2ssIHsgTXVsdGlDb21waWxlciB9IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IGxvZ2dpbmcgZnJvbSAnd2VicGFjay9saWIvbG9nZ2luZy9ydW50aW1lLmpzJztcbmltcG9ydCBXZWJwYWNrRGV2U2VydmVyIGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvZGlzdC9ub2RlLXBvbHlmaWxsLmpzJztcbmltcG9ydCB7IGdldFdlYnBhY2tDb25maWcgfSBmcm9tICcuL2dldFdlYnBhY2tDb25maWcuanMnO1xuaW1wb3J0IHsgQm91bmRSZW5kZXIgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8gcnVuIGRpcmVjdGx5IGZyb20gbm9kZVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLWlnbm9yZVxuaWYgKGltcG9ydC5tZXRhLm1haW4pIHtcbiAgY29uc3QgZW50cnlwb2ludCA9IHByb2Nlc3MuYXJndlsyXTtcblxuICBpZiAoIWVudHJ5cG9pbnQpIHtcbiAgICBjb25zb2xlLmxvZyhgVXNhZ2U6IHN0YXJ0LWFuYW5zaSA8ZW50cnlwb2ludC1maWxlPmApO1xuICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gIH1cblxuICBzdGFydERldlNlcnZlcihlbnRyeXBvaW50KTtcbn1cblxubGV0IHNlcnZlckZpbGVDb250ZW50czogUHJvbWlzZTxzdHJpbmc+ID0gUHJvbWlzZS5yZXNvbHZlKCcnKTtcbmxldCBzZXJ2ZXJFbnRyeSA9ICcnO1xuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBzdGFydERldlNlcnZlcihcbiAgZW50cnlwb2ludDogc3RyaW5nLFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4pIHtcbiAgY29uc3Qgd2VicGFja0NvbmZpZyA9IGF3YWl0IGdldFdlYnBhY2tDb25maWcoKTtcblxuICBjb25zdCBsb2cgPSBsb2dnaW5nLmdldExvZ2dlcignYW5hbnNpLWRldnNlcnZlcicpO1xuXG4gIC8vIFNldCB1cCBpbiBtZW1vcnkgZmlsZXN5c3RlbVxuICBjb25zdCB2b2x1bWUgPSBuZXcgVm9sdW1lKCk7XG4gIGNvbnN0IGZzID0gY3JlYXRlRnNGcm9tVm9sdW1lKHZvbHVtZSk7XG4gIHVmcy51c2UoZGlza0ZzKS51c2UoZnMgYXMgYW55KTtcblxuICBjb25zdCBmc1JlcXVpcmUgPSBjcmVhdGVGc1JlcXVpcmUodWZzKTtcbiAgY29uc3QgcmVhZEZpbGUgPSBwcm9taXNpZnkodWZzLnJlYWRGaWxlKTtcbiAgbGV0IHNlcnZlcjogU2VydmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IGZpbGUgc28gd2UgY2FuIGhvdCByZWxvYWQgZnJvbSB0aGUgcm9vdCBvZiB0aGUgYXBwbGljYXRpb25cbiAgZnVuY3Rpb24gaG90RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAvLyBAdHMtaWdub3JlIGZvciBzb21lIHJlYXNvbiBpdCdzIG5vdCBwaWNraW5nIHVwIHRoYXQgb3RoZXIgb3B0aW9ucyBhcmUgb3B0aW9uYWxcbiAgICBjb25zdCBnZW5lcmF0ZWRFbnRyeXBvaW50ID0gdG1wLmZpbGVTeW5jKHsgcG9zdGZpeDogJy5qcycgfSk7XG4gICAgZGlza0ZzLndyaXRlU3luYyhcbiAgICAgIGdlbmVyYXRlZEVudHJ5cG9pbnQuZmQsXG4gICAgICBgXG4gIGltcG9ydCBlbnRyeSBmcm9tIFwiJHtwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZW50cnlQYXRoKX1cIjtcblxuICBpZiAoaW1wb3J0Lm1ldGEud2VicGFja0hvdCkge1xuICAgIGltcG9ydC5tZXRhLndlYnBhY2tIb3QuYWNjZXB0KCk7XG4gIH1cblxuICBleHBvcnQgZGVmYXVsdCBlbnRyeTtcbiAgICBgLFxuICAgICk7XG4gICAgcmV0dXJuIGdlbmVyYXRlZEVudHJ5cG9pbnQ7XG4gIH1cblxuICBjb25zdCB3ZWJwYWNrQ29uZmlncyA9IFtcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogaG90RW50cnkoZW50cnlwb2ludCkubmFtZSxcbiAgICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgICB9LFxuICAgICAgeyBtb2RlOiAnZGV2ZWxvcG1lbnQnIH0sXG4gICAgKSxcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogZW50cnlwb2ludC5yZXBsYWNlKCcudHN4JywgJy5zZXJ2ZXIudHN4JyksXG4gICAgICAgIG5hbWU6ICdzZXJ2ZXInLFxuICAgICAgICBCUk9XU0VSU0xJU1RfRU5WOiAnY3VycmVudCBub2RlJyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcsIHRhcmdldDogJ25vZGUnIH0sXG4gICAgKSxcbiAgXSBhcyBjb25zdDtcblxuICAvLyBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyXG4gIGNvbnN0IGNvbXBpbGVyID0gd2VicGFjayh3ZWJwYWNrQ29uZmlncyk7XG4gIGlmICghY29tcGlsZXIpIHtcbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyJyk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7IGhvb2tSZXF1aXJlOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0czogd2VicGFjay5TdGF0cykge1xuICAgIGNvbnN0IHNlcnZlckpzb24gPSBzZXJ2ZXJTdGF0cy50b0pzb24oeyBhc3NldHM6IHRydWUgfSk7XG4gICAgcmV0dXJuIHBhdGguam9pbihzZXJ2ZXJKc29uLm91dHB1dFBhdGggPz8gJycsICdzZXJ2ZXIuanMnKTtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVFcnJvcnM8XG4gICAgRiBleHRlbmRzIChcbiAgICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICAgIHJlczogUmVzcG9uc2UgfCBTZXJ2ZXJSZXNwb25zZSxcbiAgICApID0+IFByb21pc2U8dm9pZD4sXG4gID4oZm46IEYpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKHJlcSwgcmVzKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgbmV4dCh4KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgbGV0IGluaXRSZW5kZXI6XG4gICAgfCB7IGFyZ3M6IFBhcmFtZXRlcnM8Qm91bmRSZW5kZXI+OyByZXNvbHZlOiAoKSA9PiB2b2lkIH1bXVxuICAgIHwgdW5kZWZpbmVkID0gW107XG4gIGxldCByZW5kZXI6IEJvdW5kUmVuZGVyID0gKC4uLmFyZ3MpID0+XG4gICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpbml0UmVuZGVyPy5wdXNoKHsgYXJncywgcmVzb2x2ZSB9KTtcbiAgICB9KTtcblxuICBmdW5jdGlvbiBpbXBvcnRSZW5kZXIoc3RhdHM6IHdlYnBhY2suU3RhdHNbXSkge1xuICAgIGNvbnN0IFtjbGllbnRTdGF0cywgc2VydmVyU3RhdHNdID0gc3RhdHM7XG4gICAgaWYgKFxuICAgICAgY2xpZW50U3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aCB8fFxuICAgICAgc2VydmVyU3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aFxuICAgICkge1xuICAgICAgbG9nLmVycm9yKCdFcnJvcnMgZm9yIGNsaWVudCBidWlsZDogJyArIGNsaWVudFN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgICBsb2cuZXJyb3IoJ0Vycm9ycyBmb3Igc2VydmVyIGJ1aWxkOiAnICsgc2VydmVyU3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAgIC8vIGZpcnN0IHRpbWUsIHJhdGhlciB0aGFuIHJlLXJlbmRlclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcignQWJvdmUgY29tcGlsZXIgZXJyb3JzIGJsb2NraW5nIHJlbG9hZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbygnTGF1bmNoaW5nIFNTUicpO1xuICAgIH1cblxuICAgIC8vIEFTU0VUU1xuICAgIGNvbnN0IGNsaWVudE1hbmlmZXN0ID0gY2xpZW50U3RhdHMudG9Kc29uKCk7XG5cbiAgICBzZXJ2ZXJFbnRyeSA9IGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0cyk7XG4gICAgc2VydmVyRmlsZUNvbnRlbnRzID0gcmVhZEZpbGUoc2VydmVyRW50cnkpLnRoZW4oYnVmID0+IGJ1Zi50b1N0cmluZygpKTtcbiAgICAvLyByZWxvYWQgbW9kdWxlc1xuICAgIE9iamVjdC5rZXlzKGZzUmVxdWlyZS5jYWNoZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgZGVsZXRlIGZzUmVxdWlyZS5jYWNoZVtrZXldO1xuICAgIH0pO1xuICAgIHJlbmRlciA9IChmc1JlcXVpcmUoc2VydmVyRW50cnkpIGFzIGFueSkuZGVmYXVsdC5iaW5kKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xpZW50TWFuaWZlc3QsXG4gICAgKTtcbiAgICAvLyBTRVJWRVIgU0lERSBFTlRSWVBPSU5UXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgIGluaXRSZW5kZXIuZm9yRWFjaChhc3luYyBpbml0ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuaW5mbygnUmVzb2x2aW5nIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGF3YWl0IHJlbmRlciguLi5pbml0LmFyZ3MpO1xuICAgICAgICAgIGluaXQucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gcmVuZGVyIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGxvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpbml0UmVuZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRldlNlcnZlciA9IG5ldyBXZWJwYWNrRGV2U2VydmVyKFxuICAgIC8vIHdyaXRlIHRvIG1lbW9yeSBmaWxlc3lzdGVtIHNvIHdlIGNhbiBpbXBvcnRcbiAgICB7XG4gICAgICAuLi53ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIsXG4gICAgICBkZXZNaWRkbGV3YXJlOiB7XG4gICAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdPy5kZXZTZXJ2ZXI/LmRldk1pZGRsZXdhcmUsXG4gICAgICAgIG91dHB1dEZpbGVTeXN0ZW06IHtcbiAgICAgICAgICAuLi5mcyxcbiAgICAgICAgICBqb2luOiBwYXRoLmpvaW4gYXMgYW55LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0sXG4gICAgICBzZXR1cE1pZGRsZXdhcmVzOiAobWlkZGxld2FyZXMsIGRldlNlcnZlcikgPT4ge1xuICAgICAgICBpZiAoIWRldlNlcnZlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd2VicGFjay1kZXYtc2VydmVyIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdGhlclJvdXRlcyA9IFtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRILFxuICAgICAgICAgIC4uLih3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXI/LnByb3h5XG4gICAgICAgICAgICA/LmZpbHRlcihwcm94eSA9PiB0eXBlb2YgcHJveHkgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgPy5mbGF0TWFwKHByb3h5ID0+IHByb3h5LmNvbnRleHQpID8/IFtdKSxcbiAgICAgICAgXTtcbiAgICAgICAgLy8gc2VydmUgU1NSIGZvciBub24tV0VCUEFDS19QVUJMSUNfUEFUSFxuICAgICAgICBkZXZTZXJ2ZXIuYXBwPy5nZXQoXG4gICAgICAgICAgbmV3IFJlZ0V4cChgXig/ISR7b3RoZXJSb3V0ZXMuam9pbignfCcpfSlgKSxcbiAgICAgICAgICBoYW5kbGVFcnJvcnMoYXN5bmMgZnVuY3Rpb24gKHJlcTogYW55LCByZXM6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJlcS51cmwuZW5kc1dpdGgoJ2Zhdmljb24uaWNvJykpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XG4gICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgcmVzLnNlbmQoJ25vdCBmb3VuZCcpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhdGFsOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFQ09OTlJFU0VUJykge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICdFQ09OTlJFU0VUIGlzIHVzdWFsbHkgZHVlIHRvIGJyb3dzZXIgY2xvc2luZyB0aGUgY29ubmVjdGlvbicsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHJlbmRlcihyZXEsIHJlcyk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHdlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uc2V0dXBNaWRkbGV3YXJlcykge1xuICAgICAgICAgIHJldHVybiB3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIuc2V0dXBNaWRkbGV3YXJlcyhcbiAgICAgICAgICAgIG1pZGRsZXdhcmVzLFxuICAgICAgICAgICAgZGV2U2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWlkZGxld2FyZXM7XG4gICAgICB9LFxuICAgIH0sXG4gICAgY29tcGlsZXIsXG4gICk7XG4gIGNvbnN0IHJ1blNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RhcnQoKTtcbiAgICBkZXZTZXJ2ZXIuY29tcGlsZXIuaG9va3MuZG9uZS50YXAoXG4gICAgICAnQW5hbnNpIFNlcnZlcicsXG4gICAgICAobXVsdGlTdGF0czogd2VicGFjay5NdWx0aVN0YXRzIHwgd2VicGFjay5TdGF0cykgPT4ge1xuICAgICAgICBpZiAoIW11bHRpU3RhdHMpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ3N0YXRzIG5vdCBzZW5kJyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0Lmhhc093bihtdWx0aVN0YXRzLCAnc3RhdHMnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGltcG9ydFJlbmRlcigobXVsdGlTdGF0cyBhcyB3ZWJwYWNrLk11bHRpU3RhdHMpLnN0YXRzKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2VydmUgZW50cnlwb2ludCcpO1xuICAgICAgICAgICAgY29uc3QgZmluZGVyID0gbmV3IFJlZ0V4cChgJHtzZXJ2ZXJFbnRyeX06KFtcXFxcZF0rKTooW1xcXFxkXSspYCwgJ2cnKTtcbiAgICAgICAgICAgIHNlcnZlckZpbGVDb250ZW50cy50aGVuKGZpbGVUZXh0ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdGV4dFJvd3MgPSBmaWxlVGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICAgIGxvZy5lcnJvcignPj4+IFN0YWNrIENvbnRleHQgW3NlcnZlIGVudHJ5cG9pbnRdIDw8PCcpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGUuc3RhY2subWF0Y2hBbGwoZmluZGVyKSA/PyBbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IocGF0aC5iYXNlbmFtZShzZXJ2ZXJFbnRyeSkgKyAnICcgKyByb3cgKyAnOicgKyBjb2wpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgLSAyXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyAtIDFdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoQXJyYXkoY29sKS5qb2luKCcgJykgKyAnXicpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3ddKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93ICsgMV0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgKyAyXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGlza0ZzLndyaXRlRmlsZVN5bmMoc2VydmVyRW50cnksIGZpbGVUZXh0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ09ubHkgY29tcGlsZXIgb25lIHN0YXQnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9O1xuICBjb25zdCBzdG9wU2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICAgIGxvZy5pbmZvKCdTdG9wcGluZyBzZXJ2ZXIuLi4nKTtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RvcCgpO1xuICAgIGxvZy5pbmZvKCdTZXJ2ZXIgY2xvc2VkJyk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGxvZy53YXJuKCdSZWNlaXZlZCBTSUdJTlQsIGRldnNlcnZlciBzaHV0dGluZyBkb3duJyk7XG4gICAgc3RvcFNlcnZlcigpO1xuICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gIH0pO1xuXG4gIHJ1blNlcnZlcigpO1xufVxuIl0sIm1hcHBpbmdzIjoi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
232
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiY3JlYXRlSHlicmlkUmVxdWlyZSIsImdldFdlYnBhY2tDb25maWciLCJpbXBvcnQiLCJtZXRhIiwibWFpbiIsImVudHJ5cG9pbnQiLCJwcm9jZXNzIiwiYXJndiIsImNvbnNvbGUiLCJsb2ciLCJleGl0Iiwic3RhcnREZXZTZXJ2ZXIiLCJzZXJ2ZXJGaWxlQ29udGVudHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNlcnZlckVudHJ5IiwiZW52Iiwid2VicGFja0NvbmZpZyIsImdldExvZ2dlciIsInZvbHVtZSIsImZzIiwidXNlIiwiZnNSZXF1aXJlIiwicmVhZEZpbGUiLCJob3RFbnRyeSIsImVudHJ5UGF0aCIsImdlbmVyYXRlZEVudHJ5cG9pbnQiLCJmaWxlU3luYyIsInBvc3RmaXgiLCJ3cml0ZVN5bmMiLCJmZCIsImN3ZCIsIndlYnBhY2tDb25maWdzIiwiZW50cnlwYXRoIiwibmFtZSIsIm1vZGUiLCJyZXBsYWNlIiwiQlJPV1NFUlNMSVNUX0VOViIsInRhcmdldCIsImNvbXBpbGVyIiwiZXJyb3IiLCJpbnN0YWxsIiwiaG9va1JlcXVpcmUiLCJnZXRTZXJ2ZXJCdW5kbGUiLCJzZXJ2ZXJTdGF0cyIsInNlcnZlckpzb24iLCJ0b0pzb24iLCJhc3NldHMiLCJqb2luIiwib3V0cHV0UGF0aCIsImhhbmRsZUVycm9ycyIsImZuIiwicmVxIiwicmVzIiwibmV4dCIsIngiLCJpbml0UmVuZGVyIiwicmVuZGVyIiwiYXJncyIsInB1c2giLCJpbXBvcnRSZW5kZXIiLCJzdGF0cyIsImNsaWVudFN0YXRzIiwiY29tcGlsYXRpb24iLCJlcnJvcnMiLCJsZW5ndGgiLCJBcnJheSIsImlzQXJyYXkiLCJpbmZvIiwiY2xpZW50TWFuaWZlc3QiLCJ0aGVuIiwiYnVmIiwidG9TdHJpbmciLCJrZXlzIiwiY2FjaGUiLCJmb3JFYWNoIiwiZGVmYXVsdCIsImJpbmQiLCJ1bmRlZmluZWQiLCJpbml0IiwiZSIsImRldlNlcnZlciIsImRldk1pZGRsZXdhcmUiLCJvdXRwdXRGaWxlU3lzdGVtIiwic2V0dXBNaWRkbGV3YXJlcyIsIm1pZGRsZXdhcmVzIiwiRXJyb3IiLCJvdGhlclJvdXRlcyIsIldFQlBBQ0tfUFVCTElDX1BBVEgiLCJwcm94eSIsImZpbHRlciIsImZsYXRNYXAiLCJjb250ZXh0IiwiYXBwIiwiZ2V0IiwiUmVnRXhwIiwidXJsIiwiZW5kc1dpdGgiLCJzdGF0dXNDb2RlIiwic2V0SGVhZGVyIiwic2VuZCIsInNvY2tldCIsIm9uIiwiY29kZSIsInJ1blNlcnZlciIsInN0YXJ0IiwiaG9va3MiLCJkb25lIiwidGFwIiwibXVsdGlTdGF0cyIsImZpbmRlciIsImZpbGVUZXh0IiwidGV4dFJvd3MiLCJzcGxpdCIsIm1hdGNoIiwic3RhY2siLCJtYXRjaEFsbCIsInJvdyIsIk51bWJlciIsInBhcnNlSW50IiwiY29sIiwiYmFzZW5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwic3RvcFNlcnZlciIsInN0b3AiLCJ3YXJuIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NjcmlwdHMvc3RhcnREZXZzZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuT2JqZWN0Lmhhc093biA9XG4gIE9iamVjdC5oYXNPd24gfHxcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xuICB9O1xuaW1wb3J0IHR5cGUgeyBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBkaXNrRnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgY3JlYXRlRnNGcm9tVm9sdW1lLCBWb2x1bWUgfSBmcm9tICdtZW1mcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzb3VyY2VNYXBTdXBwb3J0IGZyb20gJ3NvdXJjZS1tYXAtc3VwcG9ydCc7XG5pbXBvcnQgdG1wIGZyb20gJ3RtcCc7XG5pbXBvcnQgeyB1ZnMgfSBmcm9tICd1bmlvbmZzJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHdlYnBhY2ssIHsgdHlwZSBDb25maWd1cmF0aW9uLCB0eXBlIE11bHRpQ29uZmlndXJhdGlvbiB9IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IGxvZ2dpbmcgZnJvbSAnd2VicGFjay9saWIvbG9nZ2luZy9ydW50aW1lLmpzJztcbmltcG9ydCBXZWJwYWNrRGV2U2VydmVyIGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvZGlzdC9ub2RlLXBvbHlmaWxsLmpzJztcbmltcG9ydCB7IGNyZWF0ZUh5YnJpZFJlcXVpcmUgfSBmcm9tICcuL2NyZWF0ZUh5YnJpZFJlcXVpcmUuanMnO1xuaW1wb3J0IHsgZ2V0V2VicGFja0NvbmZpZyB9IGZyb20gJy4vZ2V0V2VicGFja0NvbmZpZy5qcyc7XG5pbXBvcnQgeyBCb3VuZFJlbmRlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyBydW4gZGlyZWN0bHkgZnJvbSBub2RlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zdCBlbnRyeXBvaW50ID0gcHJvY2Vzcy5hcmd2WzJdO1xuXG4gIGlmICghZW50cnlwb2ludCkge1xuICAgIGNvbnNvbGUubG9nKGBVc2FnZTogc3RhcnQtYW5hbnNpIDxlbnRyeXBvaW50LWZpbGU+YCk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHN0YXJ0RGV2U2VydmVyKGVudHJ5cG9pbnQpO1xufVxuXG5sZXQgc2VydmVyRmlsZUNvbnRlbnRzOiBQcm9taXNlPHN0cmluZz4gPSBQcm9taXNlLnJlc29sdmUoJycpO1xubGV0IHNlcnZlckVudHJ5ID0gJyc7XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0RGV2U2VydmVyKFxuICBlbnRyeXBvaW50OiBzdHJpbmcsXG4gIGVudjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbikge1xuICBjb25zdCB3ZWJwYWNrQ29uZmlnID0gYXdhaXQgZ2V0V2VicGFja0NvbmZpZygpO1xuXG4gIGNvbnN0IGxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdhbmFuc2ktZGV2c2VydmVyJyk7XG5cbiAgLy8gU2V0IHVwIGluIG1lbW9yeSBmaWxlc3lzdGVtXG4gIGNvbnN0IHZvbHVtZSA9IG5ldyBWb2x1bWUoKTtcbiAgY29uc3QgZnMgPSBjcmVhdGVGc0Zyb21Wb2x1bWUodm9sdW1lKTtcbiAgdWZzLnVzZShkaXNrRnMpLnVzZShmcyBhcyBhbnkpO1xuXG4gIGNvbnN0IGZzUmVxdWlyZSA9IGNyZWF0ZUh5YnJpZFJlcXVpcmUodWZzKTtcblxuICBjb25zdCByZWFkRmlsZSA9IHByb21pc2lmeSh1ZnMucmVhZEZpbGUpO1xuICAvLyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlIHNvIHdlIGNhbiBob3QgcmVsb2FkIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGFwcGxpY2F0aW9uXG4gIGZ1bmN0aW9uIGhvdEVudHJ5KGVudHJ5UGF0aDogc3RyaW5nKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgLy8gQHRzLWlnbm9yZSBmb3Igc29tZSByZWFzb24gaXQncyBub3QgcGlja2luZyB1cCB0aGF0IG90aGVyIG9wdGlvbnMgYXJlIG9wdGlvbmFsXG4gICAgY29uc3QgZ2VuZXJhdGVkRW50cnlwb2ludCA9IHRtcC5maWxlU3luYyh7IHBvc3RmaXg6ICcuanMnIH0pO1xuICAgIGRpc2tGcy53cml0ZVN5bmMoXG4gICAgICBnZW5lcmF0ZWRFbnRyeXBvaW50LmZkLFxuICAgICAgYFxuICBpbXBvcnQgZW50cnkgZnJvbSBcIiR7cGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGVudHJ5UGF0aCl9XCI7XG5cbiAgaWYgKGltcG9ydC5tZXRhLndlYnBhY2tIb3QpIHtcbiAgICBpbXBvcnQubWV0YS53ZWJwYWNrSG90LmFjY2VwdCgpO1xuICB9XG5cbiAgZXhwb3J0IGRlZmF1bHQgZW50cnk7XG4gICAgYCxcbiAgICApO1xuICAgIHJldHVybiBnZW5lcmF0ZWRFbnRyeXBvaW50O1xuICB9XG5cbiAgY29uc3Qgd2VicGFja0NvbmZpZ3M6IENvbmZpZ3VyYXRpb25bXSA9IFtcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogaG90RW50cnkoZW50cnlwb2ludCkubmFtZSxcbiAgICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgICB9LFxuICAgICAgeyBtb2RlOiAnZGV2ZWxvcG1lbnQnIH0sXG4gICAgKSxcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogZW50cnlwb2ludC5yZXBsYWNlKCcudHN4JywgJy5zZXJ2ZXIudHN4JyksXG4gICAgICAgIG5hbWU6ICdzZXJ2ZXInLFxuICAgICAgICBCUk9XU0VSU0xJU1RfRU5WOiAnY3VycmVudCBub2RlJyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcsIHRhcmdldDogJ25vZGUnIH0sXG4gICAgKSxcbiAgXTtcblxuICAvLyBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyXG4gIGNvbnN0IGNvbXBpbGVyID0gd2VicGFjayh3ZWJwYWNrQ29uZmlncyBhcyB1bmtub3duIGFzIE11bHRpQ29uZmlndXJhdGlvbik7XG4gIGlmICghY29tcGlsZXIpIHtcbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyJyk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7IGhvb2tSZXF1aXJlOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0czogd2VicGFjay5TdGF0cykge1xuICAgIGNvbnN0IHNlcnZlckpzb24gPSBzZXJ2ZXJTdGF0cy50b0pzb24oeyBhc3NldHM6IHRydWUgfSk7XG4gICAgcmV0dXJuIHBhdGguam9pbihzZXJ2ZXJKc29uLm91dHB1dFBhdGggPz8gJycsICdzZXJ2ZXIuanMnKTtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVFcnJvcnM8XG4gICAgRiBleHRlbmRzIChcbiAgICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICAgIHJlczogUmVzcG9uc2UgfCBTZXJ2ZXJSZXNwb25zZSxcbiAgICApID0+IFByb21pc2U8dm9pZD4sXG4gID4oZm46IEYpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKHJlcSwgcmVzKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgbmV4dCh4KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgbGV0IGluaXRSZW5kZXI6XG4gICAgfCB7IGFyZ3M6IFBhcmFtZXRlcnM8Qm91bmRSZW5kZXI+OyByZXNvbHZlOiAoKSA9PiB2b2lkIH1bXVxuICAgIHwgdW5kZWZpbmVkID0gW107XG4gIGxldCByZW5kZXI6IEJvdW5kUmVuZGVyID0gKC4uLmFyZ3MpID0+XG4gICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpbml0UmVuZGVyPy5wdXNoKHsgYXJncywgcmVzb2x2ZSB9KTtcbiAgICB9KTtcblxuICBmdW5jdGlvbiBpbXBvcnRSZW5kZXIoc3RhdHM6IHdlYnBhY2suU3RhdHNbXSkge1xuICAgIGNvbnN0IFtjbGllbnRTdGF0cywgc2VydmVyU3RhdHNdID0gc3RhdHM7XG4gICAgaWYgKFxuICAgICAgY2xpZW50U3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aCB8fFxuICAgICAgc2VydmVyU3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aFxuICAgICkge1xuICAgICAgbG9nLmVycm9yKCdFcnJvcnMgZm9yIGNsaWVudCBidWlsZDogJyArIGNsaWVudFN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgICBsb2cuZXJyb3IoJ0Vycm9ycyBmb3Igc2VydmVyIGJ1aWxkOiAnICsgc2VydmVyU3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAgIC8vIGZpcnN0IHRpbWUsIHJhdGhlciB0aGFuIHJlLXJlbmRlclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcignQWJvdmUgY29tcGlsZXIgZXJyb3JzIGJsb2NraW5nIHJlbG9hZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbygnTGF1bmNoaW5nIFNTUicpO1xuICAgIH1cblxuICAgIC8vIEFTU0VUU1xuICAgIGNvbnN0IGNsaWVudE1hbmlmZXN0ID0gY2xpZW50U3RhdHMudG9Kc29uKCk7XG5cbiAgICBzZXJ2ZXJFbnRyeSA9IGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0cyk7XG4gICAgc2VydmVyRmlsZUNvbnRlbnRzID0gcmVhZEZpbGUoc2VydmVyRW50cnkpLnRoZW4oYnVmID0+IGJ1Zi50b1N0cmluZygpKTtcbiAgICAvLyByZWxvYWQgbW9kdWxlc1xuICAgIE9iamVjdC5rZXlzKGZzUmVxdWlyZS5jYWNoZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgZGVsZXRlIGZzUmVxdWlyZS5jYWNoZVtrZXldO1xuICAgIH0pO1xuICAgIHJlbmRlciA9IChmc1JlcXVpcmUoc2VydmVyRW50cnkpIGFzIGFueSkuZGVmYXVsdC5iaW5kKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xpZW50TWFuaWZlc3QsXG4gICAgKTtcbiAgICAvLyBTRVJWRVIgU0lERSBFTlRSWVBPSU5UXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgIGluaXRSZW5kZXIuZm9yRWFjaChhc3luYyBpbml0ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuaW5mbygnUmVzb2x2aW5nIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGF3YWl0IHJlbmRlciguLi5pbml0LmFyZ3MpO1xuICAgICAgICAgIGluaXQucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gcmVuZGVyIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGxvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpbml0UmVuZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRldlNlcnZlciA9IG5ldyBXZWJwYWNrRGV2U2VydmVyKFxuICAgIC8vIHdyaXRlIHRvIG1lbW9yeSBmaWxlc3lzdGVtIHNvIHdlIGNhbiBpbXBvcnRcbiAgICB7XG4gICAgICAuLi53ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIsXG4gICAgICBkZXZNaWRkbGV3YXJlOiB7XG4gICAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdPy5kZXZTZXJ2ZXI/LmRldk1pZGRsZXdhcmUsXG4gICAgICAgIG91dHB1dEZpbGVTeXN0ZW06IHtcbiAgICAgICAgICAuLi5mcyxcbiAgICAgICAgICBqb2luOiBwYXRoLmpvaW4gYXMgYW55LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0sXG4gICAgICBzZXR1cE1pZGRsZXdhcmVzOiAobWlkZGxld2FyZXMsIGRldlNlcnZlcikgPT4ge1xuICAgICAgICBpZiAoIWRldlNlcnZlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd2VicGFjay1kZXYtc2VydmVyIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdGhlclJvdXRlcyA9IFtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRILFxuICAgICAgICAgIC4uLih3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXI/LnByb3h5XG4gICAgICAgICAgICA/LmZpbHRlcihwcm94eSA9PiB0eXBlb2YgcHJveHkgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgPy5mbGF0TWFwKHByb3h5ID0+IHByb3h5LmNvbnRleHQpID8/IFtdKSxcbiAgICAgICAgXTtcbiAgICAgICAgLy8gc2VydmUgU1NSIGZvciBub24tV0VCUEFDS19QVUJMSUNfUEFUSFxuICAgICAgICBkZXZTZXJ2ZXIuYXBwPy5nZXQoXG4gICAgICAgICAgbmV3IFJlZ0V4cChgXig/ISR7b3RoZXJSb3V0ZXMuam9pbignfCcpfSlgKSxcbiAgICAgICAgICBoYW5kbGVFcnJvcnMoYXN5bmMgZnVuY3Rpb24gKHJlcTogYW55LCByZXM6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJlcS51cmwuZW5kc1dpdGgoJ2Zhdmljb24uaWNvJykpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XG4gICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgcmVzLnNlbmQoJ25vdCBmb3VuZCcpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhdGFsOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFQ09OTlJFU0VUJykge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICdFQ09OTlJFU0VUIGlzIHVzdWFsbHkgZHVlIHRvIGJyb3dzZXIgY2xvc2luZyB0aGUgY29ubmVjdGlvbicsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHJlbmRlcihyZXEsIHJlcyk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHdlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uc2V0dXBNaWRkbGV3YXJlcykge1xuICAgICAgICAgIHJldHVybiB3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIuc2V0dXBNaWRkbGV3YXJlcyhcbiAgICAgICAgICAgIG1pZGRsZXdhcmVzLFxuICAgICAgICAgICAgZGV2U2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWlkZGxld2FyZXM7XG4gICAgICB9LFxuICAgIH0sXG4gICAgY29tcGlsZXIsXG4gICk7XG4gIGNvbnN0IHJ1blNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RhcnQoKTtcbiAgICBkZXZTZXJ2ZXIuY29tcGlsZXIuaG9va3MuZG9uZS50YXAoXG4gICAgICAnQW5hbnNpIFNlcnZlcicsXG4gICAgICAobXVsdGlTdGF0czogd2VicGFjay5NdWx0aVN0YXRzIHwgd2VicGFjay5TdGF0cykgPT4ge1xuICAgICAgICBpZiAoIW11bHRpU3RhdHMpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ3N0YXRzIG5vdCBzZW5kJyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0Lmhhc093bihtdWx0aVN0YXRzLCAnc3RhdHMnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGltcG9ydFJlbmRlcigobXVsdGlTdGF0cyBhcyB3ZWJwYWNrLk11bHRpU3RhdHMpLnN0YXRzKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2VydmUgZW50cnlwb2ludCcpO1xuICAgICAgICAgICAgY29uc3QgZmluZGVyID0gbmV3IFJlZ0V4cChgJHtzZXJ2ZXJFbnRyeX06KFtcXFxcZF0rKTooW1xcXFxkXSspYCwgJ2cnKTtcbiAgICAgICAgICAgIHNlcnZlckZpbGVDb250ZW50cy50aGVuKGZpbGVUZXh0ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdGV4dFJvd3MgPSBmaWxlVGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICAgIGxvZy5lcnJvcignPj4+IFN0YWNrIENvbnRleHQgW3NlcnZlIGVudHJ5cG9pbnRdIDw8PCcpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGUuc3RhY2subWF0Y2hBbGwoZmluZGVyKSA/PyBbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IocGF0aC5iYXNlbmFtZShzZXJ2ZXJFbnRyeSkgKyAnICcgKyByb3cgKyAnOicgKyBjb2wpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgLSAyXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyAtIDFdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoQXJyYXkoY29sKS5qb2luKCcgJykgKyAnXicpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3ddKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93ICsgMV0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgKyAyXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGlza0ZzLndyaXRlRmlsZVN5bmMoc2VydmVyRW50cnksIGZpbGVUZXh0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ09ubHkgY29tcGlsZXIgb25lIHN0YXQnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9O1xuICBjb25zdCBzdG9wU2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICAgIGxvZy5pbmZvKCdTdG9wcGluZyBzZXJ2ZXIuLi4nKTtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RvcCgpO1xuICAgIGxvZy5pbmZvKCdTZXJ2ZXIgY2xvc2VkJyk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGxvZy53YXJuKCdSZWNlaXZlZCBTSUdJTlQsIGRldnNlcnZlciBzaHV0dGluZyBkb3duJyk7XG4gICAgc3RvcFNlcnZlcigpO1xuICAgIHByb2Nlc3MuZXhpdCgtMSk7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
@@ -1 +1 @@
1
- {"version":3,"file":"startDevserver.d.ts","sourceRoot":"","sources":["../../src/scripts/startDevserver.ts"],"names":[],"mappings":";AAoBA,OAAO,mCAAmC,CAAC;AAqB3C,wBAA8B,cAAc,CAC1C,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,iBA8PlC"}
1
+ {"version":3,"file":"startDevserver.d.ts","sourceRoot":"","sources":["../../src/scripts/startDevserver.ts"],"names":[],"mappings":";AAmBA,OAAO,mCAAmC,CAAC;AAsB3C,wBAA8B,cAAc,CAC1C,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,iBA6PlC"}
@@ -3,7 +3,6 @@ Object.hasOwn = Object.hasOwn || /* istanbul ignore next */function hasOwn(it, k
3
3
  return Object.prototype.hasOwnProperty.call(it, key);
4
4
  };
5
5
  import diskFs from 'fs';
6
- import { createFsRequire } from 'fs-require';
7
6
  import { createFsFromVolume, Volume } from 'memfs';
8
7
  import path from 'path';
9
8
  import sourceMapSupport from 'source-map-support';
@@ -14,6 +13,7 @@ import webpack from 'webpack';
14
13
  import logging from 'webpack/lib/logging/runtime.js';
15
14
  import WebpackDevServer from 'webpack-dev-server';
16
15
  import 'cross-fetch/dist/node-polyfill.js';
16
+ import { createHybridRequire } from './createHybridRequire.js';
17
17
  import { getWebpackConfig } from './getWebpackConfig.js';
18
18
  // run directly from node
19
19
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -36,10 +36,8 @@ export default async function startDevServer(entrypoint, env = {}) {
36
36
  const volume = new Volume();
37
37
  const fs = createFsFromVolume(volume);
38
38
  ufs.use(diskFs).use(fs);
39
- const fsRequire = createFsRequire(ufs);
39
+ const fsRequire = createHybridRequire(ufs);
40
40
  const readFile = promisify(ufs.readFile);
41
- let server;
42
-
43
41
  // Generate a temporary file so we can hot reload from the root of the application
44
42
  function hotEntry(entryPath) {
45
43
  // eslint-disable-next-line
@@ -231,4 +229,4 @@ export default async function startDevServer(entrypoint, env = {}) {
231
229
  });
232
230
  runServer();
233
231
  }
234
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzUmVxdWlyZSIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiZ2V0V2VicGFja0NvbmZpZyIsImltcG9ydCIsIm1ldGEiLCJtYWluIiwiZW50cnlwb2ludCIsInByb2Nlc3MiLCJhcmd2IiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJzdGFydERldlNlcnZlciIsInNlcnZlckZpbGVDb250ZW50cyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2VydmVyRW50cnkiLCJlbnYiLCJ3ZWJwYWNrQ29uZmlnIiwiZ2V0TG9nZ2VyIiwidm9sdW1lIiwiZnMiLCJ1c2UiLCJmc1JlcXVpcmUiLCJyZWFkRmlsZSIsInNlcnZlciIsImhvdEVudHJ5IiwiZW50cnlQYXRoIiwiZ2VuZXJhdGVkRW50cnlwb2ludCIsImZpbGVTeW5jIiwicG9zdGZpeCIsIndyaXRlU3luYyIsImZkIiwiY3dkIiwid2VicGFja0NvbmZpZ3MiLCJlbnRyeXBhdGgiLCJuYW1lIiwibW9kZSIsInJlcGxhY2UiLCJCUk9XU0VSU0xJU1RfRU5WIiwidGFyZ2V0IiwiY29tcGlsZXIiLCJlcnJvciIsImluc3RhbGwiLCJob29rUmVxdWlyZSIsImdldFNlcnZlckJ1bmRsZSIsInNlcnZlclN0YXRzIiwic2VydmVySnNvbiIsInRvSnNvbiIsImFzc2V0cyIsImpvaW4iLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJuZXh0IiwieCIsImluaXRSZW5kZXIiLCJyZW5kZXIiLCJhcmdzIiwicHVzaCIsImltcG9ydFJlbmRlciIsInN0YXRzIiwiY2xpZW50U3RhdHMiLCJjb21waWxhdGlvbiIsImVycm9ycyIsImxlbmd0aCIsIkFycmF5IiwiaXNBcnJheSIsImluZm8iLCJjbGllbnRNYW5pZmVzdCIsInRoZW4iLCJidWYiLCJ0b1N0cmluZyIsImtleXMiLCJjYWNoZSIsImZvckVhY2giLCJkZWZhdWx0IiwiYmluZCIsInVuZGVmaW5lZCIsImluaXQiLCJlIiwiZGV2U2VydmVyIiwiZGV2TWlkZGxld2FyZSIsIm91dHB1dEZpbGVTeXN0ZW0iLCJzZXR1cE1pZGRsZXdhcmVzIiwibWlkZGxld2FyZXMiLCJFcnJvciIsIm90aGVyUm91dGVzIiwiV0VCUEFDS19QVUJMSUNfUEFUSCIsInByb3h5IiwiZmlsdGVyIiwiZmxhdE1hcCIsImNvbnRleHQiLCJhcHAiLCJnZXQiLCJSZWdFeHAiLCJ1cmwiLCJlbmRzV2l0aCIsInN0YXR1c0NvZGUiLCJzZXRIZWFkZXIiLCJzZW5kIiwic29ja2V0Iiwib24iLCJjb2RlIiwicnVuU2VydmVyIiwic3RhcnQiLCJob29rcyIsImRvbmUiLCJ0YXAiLCJtdWx0aVN0YXRzIiwiZmluZGVyIiwiZmlsZVRleHQiLCJ0ZXh0Um93cyIsInNwbGl0IiwibWF0Y2giLCJzdGFjayIsIm1hdGNoQWxsIiwicm93IiwiTnVtYmVyIiwicGFyc2VJbnQiLCJjb2wiLCJiYXNlbmFtZSIsIndyaXRlRmlsZVN5bmMiLCJzdG9wU2VydmVyIiwic3RvcCIsIndhcm4iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9zdGFydERldnNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5PYmplY3QuaGFzT3duID1cbiAgT2JqZWN0Lmhhc093biB8fFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG4gIH07XG5pbXBvcnQgdHlwZSB7IE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGRpc2tGcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBjcmVhdGVGc1JlcXVpcmUgfSBmcm9tICdmcy1yZXF1aXJlJztcbmltcG9ydCB7IFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgY3JlYXRlRnNGcm9tVm9sdW1lLCBWb2x1bWUgfSBmcm9tICdtZW1mcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzb3VyY2VNYXBTdXBwb3J0IGZyb20gJ3NvdXJjZS1tYXAtc3VwcG9ydCc7XG5pbXBvcnQgdG1wIGZyb20gJ3RtcCc7XG5pbXBvcnQgeyB1ZnMgfSBmcm9tICd1bmlvbmZzJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHdlYnBhY2ssIHsgTXVsdGlDb21waWxlciB9IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IGxvZ2dpbmcgZnJvbSAnd2VicGFjay9saWIvbG9nZ2luZy9ydW50aW1lLmpzJztcbmltcG9ydCBXZWJwYWNrRGV2U2VydmVyIGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvZGlzdC9ub2RlLXBvbHlmaWxsLmpzJztcbmltcG9ydCB7IGdldFdlYnBhY2tDb25maWcgfSBmcm9tICcuL2dldFdlYnBhY2tDb25maWcuanMnO1xuaW1wb3J0IHsgQm91bmRSZW5kZXIgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuLy8gcnVuIGRpcmVjdGx5IGZyb20gbm9kZVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuLy8gQHRzLWlnbm9yZVxuaWYgKGltcG9ydC5tZXRhLm1haW4pIHtcbiAgY29uc3QgZW50cnlwb2ludCA9IHByb2Nlc3MuYXJndlsyXTtcblxuICBpZiAoIWVudHJ5cG9pbnQpIHtcbiAgICBjb25zb2xlLmxvZyhgVXNhZ2U6IHN0YXJ0LWFuYW5zaSA8ZW50cnlwb2ludC1maWxlPmApO1xuICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gIH1cblxuICBzdGFydERldlNlcnZlcihlbnRyeXBvaW50KTtcbn1cblxubGV0IHNlcnZlckZpbGVDb250ZW50czogUHJvbWlzZTxzdHJpbmc+ID0gUHJvbWlzZS5yZXNvbHZlKCcnKTtcbmxldCBzZXJ2ZXJFbnRyeSA9ICcnO1xuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBzdGFydERldlNlcnZlcihcbiAgZW50cnlwb2ludDogc3RyaW5nLFxuICBlbnY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4pIHtcbiAgY29uc3Qgd2VicGFja0NvbmZpZyA9IGF3YWl0IGdldFdlYnBhY2tDb25maWcoKTtcblxuICBjb25zdCBsb2cgPSBsb2dnaW5nLmdldExvZ2dlcignYW5hbnNpLWRldnNlcnZlcicpO1xuXG4gIC8vIFNldCB1cCBpbiBtZW1vcnkgZmlsZXN5c3RlbVxuICBjb25zdCB2b2x1bWUgPSBuZXcgVm9sdW1lKCk7XG4gIGNvbnN0IGZzID0gY3JlYXRlRnNGcm9tVm9sdW1lKHZvbHVtZSk7XG4gIHVmcy51c2UoZGlza0ZzKS51c2UoZnMgYXMgYW55KTtcblxuICBjb25zdCBmc1JlcXVpcmUgPSBjcmVhdGVGc1JlcXVpcmUodWZzKTtcbiAgY29uc3QgcmVhZEZpbGUgPSBwcm9taXNpZnkodWZzLnJlYWRGaWxlKTtcbiAgbGV0IHNlcnZlcjogU2VydmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IGZpbGUgc28gd2UgY2FuIGhvdCByZWxvYWQgZnJvbSB0aGUgcm9vdCBvZiB0aGUgYXBwbGljYXRpb25cbiAgZnVuY3Rpb24gaG90RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAvLyBAdHMtaWdub3JlIGZvciBzb21lIHJlYXNvbiBpdCdzIG5vdCBwaWNraW5nIHVwIHRoYXQgb3RoZXIgb3B0aW9ucyBhcmUgb3B0aW9uYWxcbiAgICBjb25zdCBnZW5lcmF0ZWRFbnRyeXBvaW50ID0gdG1wLmZpbGVTeW5jKHsgcG9zdGZpeDogJy5qcycgfSk7XG4gICAgZGlza0ZzLndyaXRlU3luYyhcbiAgICAgIGdlbmVyYXRlZEVudHJ5cG9pbnQuZmQsXG4gICAgICBgXG4gIGltcG9ydCBlbnRyeSBmcm9tIFwiJHtwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZW50cnlQYXRoKX1cIjtcblxuICBpZiAoaW1wb3J0Lm1ldGEud2VicGFja0hvdCkge1xuICAgIGltcG9ydC5tZXRhLndlYnBhY2tIb3QuYWNjZXB0KCk7XG4gIH1cblxuICBleHBvcnQgZGVmYXVsdCBlbnRyeTtcbiAgICBgLFxuICAgICk7XG4gICAgcmV0dXJuIGdlbmVyYXRlZEVudHJ5cG9pbnQ7XG4gIH1cblxuICBjb25zdCB3ZWJwYWNrQ29uZmlncyA9IFtcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogaG90RW50cnkoZW50cnlwb2ludCkubmFtZSxcbiAgICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgICB9LFxuICAgICAgeyBtb2RlOiAnZGV2ZWxvcG1lbnQnIH0sXG4gICAgKSxcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogZW50cnlwb2ludC5yZXBsYWNlKCcudHN4JywgJy5zZXJ2ZXIudHN4JyksXG4gICAgICAgIG5hbWU6ICdzZXJ2ZXInLFxuICAgICAgICBCUk9XU0VSU0xJU1RfRU5WOiAnY3VycmVudCBub2RlJyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcsIHRhcmdldDogJ25vZGUnIH0sXG4gICAgKSxcbiAgXSBhcyBjb25zdDtcblxuICAvLyBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyXG4gIGNvbnN0IGNvbXBpbGVyID0gd2VicGFjayh3ZWJwYWNrQ29uZmlncyk7XG4gIGlmICghY29tcGlsZXIpIHtcbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyJyk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7IGhvb2tSZXF1aXJlOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0czogd2VicGFjay5TdGF0cykge1xuICAgIGNvbnN0IHNlcnZlckpzb24gPSBzZXJ2ZXJTdGF0cy50b0pzb24oeyBhc3NldHM6IHRydWUgfSk7XG4gICAgcmV0dXJuIHBhdGguam9pbihzZXJ2ZXJKc29uLm91dHB1dFBhdGggPz8gJycsICdzZXJ2ZXIuanMnKTtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVFcnJvcnM8XG4gICAgRiBleHRlbmRzIChcbiAgICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICAgIHJlczogUmVzcG9uc2UgfCBTZXJ2ZXJSZXNwb25zZSxcbiAgICApID0+IFByb21pc2U8dm9pZD4sXG4gID4oZm46IEYpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKHJlcSwgcmVzKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgbmV4dCh4KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgbGV0IGluaXRSZW5kZXI6XG4gICAgfCB7IGFyZ3M6IFBhcmFtZXRlcnM8Qm91bmRSZW5kZXI+OyByZXNvbHZlOiAoKSA9PiB2b2lkIH1bXVxuICAgIHwgdW5kZWZpbmVkID0gW107XG4gIGxldCByZW5kZXI6IEJvdW5kUmVuZGVyID0gKC4uLmFyZ3MpID0+XG4gICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpbml0UmVuZGVyPy5wdXNoKHsgYXJncywgcmVzb2x2ZSB9KTtcbiAgICB9KTtcblxuICBmdW5jdGlvbiBpbXBvcnRSZW5kZXIoc3RhdHM6IHdlYnBhY2suU3RhdHNbXSkge1xuICAgIGNvbnN0IFtjbGllbnRTdGF0cywgc2VydmVyU3RhdHNdID0gc3RhdHM7XG4gICAgaWYgKFxuICAgICAgY2xpZW50U3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aCB8fFxuICAgICAgc2VydmVyU3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aFxuICAgICkge1xuICAgICAgbG9nLmVycm9yKCdFcnJvcnMgZm9yIGNsaWVudCBidWlsZDogJyArIGNsaWVudFN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgICBsb2cuZXJyb3IoJ0Vycm9ycyBmb3Igc2VydmVyIGJ1aWxkOiAnICsgc2VydmVyU3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAgIC8vIGZpcnN0IHRpbWUsIHJhdGhlciB0aGFuIHJlLXJlbmRlclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcignQWJvdmUgY29tcGlsZXIgZXJyb3JzIGJsb2NraW5nIHJlbG9hZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbygnTGF1bmNoaW5nIFNTUicpO1xuICAgIH1cblxuICAgIC8vIEFTU0VUU1xuICAgIGNvbnN0IGNsaWVudE1hbmlmZXN0ID0gY2xpZW50U3RhdHMudG9Kc29uKCk7XG5cbiAgICBzZXJ2ZXJFbnRyeSA9IGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0cyk7XG4gICAgc2VydmVyRmlsZUNvbnRlbnRzID0gcmVhZEZpbGUoc2VydmVyRW50cnkpLnRoZW4oYnVmID0+IGJ1Zi50b1N0cmluZygpKTtcbiAgICAvLyByZWxvYWQgbW9kdWxlc1xuICAgIE9iamVjdC5rZXlzKGZzUmVxdWlyZS5jYWNoZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgZGVsZXRlIGZzUmVxdWlyZS5jYWNoZVtrZXldO1xuICAgIH0pO1xuICAgIHJlbmRlciA9IChmc1JlcXVpcmUoc2VydmVyRW50cnkpIGFzIGFueSkuZGVmYXVsdC5iaW5kKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xpZW50TWFuaWZlc3QsXG4gICAgKTtcbiAgICAvLyBTRVJWRVIgU0lERSBFTlRSWVBPSU5UXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgIGluaXRSZW5kZXIuZm9yRWFjaChhc3luYyBpbml0ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuaW5mbygnUmVzb2x2aW5nIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGF3YWl0IHJlbmRlciguLi5pbml0LmFyZ3MpO1xuICAgICAgICAgIGluaXQucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gcmVuZGVyIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGxvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpbml0UmVuZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRldlNlcnZlciA9IG5ldyBXZWJwYWNrRGV2U2VydmVyKFxuICAgIC8vIHdyaXRlIHRvIG1lbW9yeSBmaWxlc3lzdGVtIHNvIHdlIGNhbiBpbXBvcnRcbiAgICB7XG4gICAgICAuLi53ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIsXG4gICAgICBkZXZNaWRkbGV3YXJlOiB7XG4gICAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdPy5kZXZTZXJ2ZXI/LmRldk1pZGRsZXdhcmUsXG4gICAgICAgIG91dHB1dEZpbGVTeXN0ZW06IHtcbiAgICAgICAgICAuLi5mcyxcbiAgICAgICAgICBqb2luOiBwYXRoLmpvaW4gYXMgYW55LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0sXG4gICAgICBzZXR1cE1pZGRsZXdhcmVzOiAobWlkZGxld2FyZXMsIGRldlNlcnZlcikgPT4ge1xuICAgICAgICBpZiAoIWRldlNlcnZlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd2VicGFjay1kZXYtc2VydmVyIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdGhlclJvdXRlcyA9IFtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRILFxuICAgICAgICAgIC4uLih3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXI/LnByb3h5XG4gICAgICAgICAgICA/LmZpbHRlcihwcm94eSA9PiB0eXBlb2YgcHJveHkgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgPy5mbGF0TWFwKHByb3h5ID0+IHByb3h5LmNvbnRleHQpID8/IFtdKSxcbiAgICAgICAgXTtcbiAgICAgICAgLy8gc2VydmUgU1NSIGZvciBub24tV0VCUEFDS19QVUJMSUNfUEFUSFxuICAgICAgICBkZXZTZXJ2ZXIuYXBwPy5nZXQoXG4gICAgICAgICAgbmV3IFJlZ0V4cChgXig/ISR7b3RoZXJSb3V0ZXMuam9pbignfCcpfSlgKSxcbiAgICAgICAgICBoYW5kbGVFcnJvcnMoYXN5bmMgZnVuY3Rpb24gKHJlcTogYW55LCByZXM6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJlcS51cmwuZW5kc1dpdGgoJ2Zhdmljb24uaWNvJykpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XG4gICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgcmVzLnNlbmQoJ25vdCBmb3VuZCcpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhdGFsOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFQ09OTlJFU0VUJykge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICdFQ09OTlJFU0VUIGlzIHVzdWFsbHkgZHVlIHRvIGJyb3dzZXIgY2xvc2luZyB0aGUgY29ubmVjdGlvbicsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHJlbmRlcihyZXEsIHJlcyk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHdlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uc2V0dXBNaWRkbGV3YXJlcykge1xuICAgICAgICAgIHJldHVybiB3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIuc2V0dXBNaWRkbGV3YXJlcyhcbiAgICAgICAgICAgIG1pZGRsZXdhcmVzLFxuICAgICAgICAgICAgZGV2U2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWlkZGxld2FyZXM7XG4gICAgICB9LFxuICAgIH0sXG4gICAgY29tcGlsZXIsXG4gICk7XG4gIGNvbnN0IHJ1blNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RhcnQoKTtcbiAgICBkZXZTZXJ2ZXIuY29tcGlsZXIuaG9va3MuZG9uZS50YXAoXG4gICAgICAnQW5hbnNpIFNlcnZlcicsXG4gICAgICAobXVsdGlTdGF0czogd2VicGFjay5NdWx0aVN0YXRzIHwgd2VicGFjay5TdGF0cykgPT4ge1xuICAgICAgICBpZiAoIW11bHRpU3RhdHMpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ3N0YXRzIG5vdCBzZW5kJyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0Lmhhc093bihtdWx0aVN0YXRzLCAnc3RhdHMnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGltcG9ydFJlbmRlcigobXVsdGlTdGF0cyBhcyB3ZWJwYWNrLk11bHRpU3RhdHMpLnN0YXRzKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2VydmUgZW50cnlwb2ludCcpO1xuICAgICAgICAgICAgY29uc3QgZmluZGVyID0gbmV3IFJlZ0V4cChgJHtzZXJ2ZXJFbnRyeX06KFtcXFxcZF0rKTooW1xcXFxkXSspYCwgJ2cnKTtcbiAgICAgICAgICAgIHNlcnZlckZpbGVDb250ZW50cy50aGVuKGZpbGVUZXh0ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdGV4dFJvd3MgPSBmaWxlVGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICAgIGxvZy5lcnJvcignPj4+IFN0YWNrIENvbnRleHQgW3NlcnZlIGVudHJ5cG9pbnRdIDw8PCcpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGUuc3RhY2subWF0Y2hBbGwoZmluZGVyKSA/PyBbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IocGF0aC5iYXNlbmFtZShzZXJ2ZXJFbnRyeSkgKyAnICcgKyByb3cgKyAnOicgKyBjb2wpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgLSAyXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyAtIDFdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoQXJyYXkoY29sKS5qb2luKCcgJykgKyAnXicpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3ddKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93ICsgMV0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgKyAyXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGlza0ZzLndyaXRlRmlsZVN5bmMoc2VydmVyRW50cnksIGZpbGVUZXh0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ09ubHkgY29tcGlsZXIgb25lIHN0YXQnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9O1xuICBjb25zdCBzdG9wU2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICAgIGxvZy5pbmZvKCdTdG9wcGluZyBzZXJ2ZXIuLi4nKTtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RvcCgpO1xuICAgIGxvZy5pbmZvKCdTZXJ2ZXIgY2xvc2VkJyk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGxvZy53YXJuKCdSZWNlaXZlZCBTSUdJTlQsIGRldnNlcnZlciBzaHV0dGluZyBkb3duJyk7XG4gICAgc3RvcFNlcnZlcigpO1xuICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4gIH0pO1xuXG4gIHJ1blNlcnZlcigpO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFB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
232
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiY3JlYXRlSHlicmlkUmVxdWlyZSIsImdldFdlYnBhY2tDb25maWciLCJpbXBvcnQiLCJtZXRhIiwibWFpbiIsImVudHJ5cG9pbnQiLCJwcm9jZXNzIiwiYXJndiIsImNvbnNvbGUiLCJsb2ciLCJleGl0Iiwic3RhcnREZXZTZXJ2ZXIiLCJzZXJ2ZXJGaWxlQ29udGVudHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNlcnZlckVudHJ5IiwiZW52Iiwid2VicGFja0NvbmZpZyIsImdldExvZ2dlciIsInZvbHVtZSIsImZzIiwidXNlIiwiZnNSZXF1aXJlIiwicmVhZEZpbGUiLCJob3RFbnRyeSIsImVudHJ5UGF0aCIsImdlbmVyYXRlZEVudHJ5cG9pbnQiLCJmaWxlU3luYyIsInBvc3RmaXgiLCJ3cml0ZVN5bmMiLCJmZCIsImN3ZCIsIndlYnBhY2tDb25maWdzIiwiZW50cnlwYXRoIiwibmFtZSIsIm1vZGUiLCJyZXBsYWNlIiwiQlJPV1NFUlNMSVNUX0VOViIsInRhcmdldCIsImNvbXBpbGVyIiwiZXJyb3IiLCJpbnN0YWxsIiwiaG9va1JlcXVpcmUiLCJnZXRTZXJ2ZXJCdW5kbGUiLCJzZXJ2ZXJTdGF0cyIsInNlcnZlckpzb24iLCJ0b0pzb24iLCJhc3NldHMiLCJqb2luIiwib3V0cHV0UGF0aCIsImhhbmRsZUVycm9ycyIsImZuIiwicmVxIiwicmVzIiwibmV4dCIsIngiLCJpbml0UmVuZGVyIiwicmVuZGVyIiwiYXJncyIsInB1c2giLCJpbXBvcnRSZW5kZXIiLCJzdGF0cyIsImNsaWVudFN0YXRzIiwiY29tcGlsYXRpb24iLCJlcnJvcnMiLCJsZW5ndGgiLCJBcnJheSIsImlzQXJyYXkiLCJpbmZvIiwiY2xpZW50TWFuaWZlc3QiLCJ0aGVuIiwiYnVmIiwidG9TdHJpbmciLCJrZXlzIiwiY2FjaGUiLCJmb3JFYWNoIiwiZGVmYXVsdCIsImJpbmQiLCJ1bmRlZmluZWQiLCJpbml0IiwiZSIsImRldlNlcnZlciIsImRldk1pZGRsZXdhcmUiLCJvdXRwdXRGaWxlU3lzdGVtIiwic2V0dXBNaWRkbGV3YXJlcyIsIm1pZGRsZXdhcmVzIiwiRXJyb3IiLCJvdGhlclJvdXRlcyIsIldFQlBBQ0tfUFVCTElDX1BBVEgiLCJwcm94eSIsImZpbHRlciIsImZsYXRNYXAiLCJjb250ZXh0IiwiYXBwIiwiZ2V0IiwiUmVnRXhwIiwidXJsIiwiZW5kc1dpdGgiLCJzdGF0dXNDb2RlIiwic2V0SGVhZGVyIiwic2VuZCIsInNvY2tldCIsIm9uIiwiY29kZSIsInJ1blNlcnZlciIsInN0YXJ0IiwiaG9va3MiLCJkb25lIiwidGFwIiwibXVsdGlTdGF0cyIsImZpbmRlciIsImZpbGVUZXh0IiwidGV4dFJvd3MiLCJzcGxpdCIsIm1hdGNoIiwic3RhY2siLCJtYXRjaEFsbCIsInJvdyIsIk51bWJlciIsInBhcnNlSW50IiwiY29sIiwiYmFzZW5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwic3RvcFNlcnZlciIsInN0b3AiLCJ3YXJuIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvc3RhcnREZXZzZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuT2JqZWN0Lmhhc093biA9XG4gIE9iamVjdC5oYXNPd24gfHxcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xuICB9O1xuaW1wb3J0IHR5cGUgeyBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBkaXNrRnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgY3JlYXRlRnNGcm9tVm9sdW1lLCBWb2x1bWUgfSBmcm9tICdtZW1mcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzb3VyY2VNYXBTdXBwb3J0IGZyb20gJ3NvdXJjZS1tYXAtc3VwcG9ydCc7XG5pbXBvcnQgdG1wIGZyb20gJ3RtcCc7XG5pbXBvcnQgeyB1ZnMgfSBmcm9tICd1bmlvbmZzJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHdlYnBhY2ssIHsgdHlwZSBDb25maWd1cmF0aW9uLCB0eXBlIE11bHRpQ29uZmlndXJhdGlvbiB9IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IGxvZ2dpbmcgZnJvbSAnd2VicGFjay9saWIvbG9nZ2luZy9ydW50aW1lLmpzJztcbmltcG9ydCBXZWJwYWNrRGV2U2VydmVyIGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvZGlzdC9ub2RlLXBvbHlmaWxsLmpzJztcbmltcG9ydCB7IGNyZWF0ZUh5YnJpZFJlcXVpcmUgfSBmcm9tICcuL2NyZWF0ZUh5YnJpZFJlcXVpcmUuanMnO1xuaW1wb3J0IHsgZ2V0V2VicGFja0NvbmZpZyB9IGZyb20gJy4vZ2V0V2VicGFja0NvbmZpZy5qcyc7XG5pbXBvcnQgeyBCb3VuZFJlbmRlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyBydW4gZGlyZWN0bHkgZnJvbSBub2RlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zdCBlbnRyeXBvaW50ID0gcHJvY2Vzcy5hcmd2WzJdO1xuXG4gIGlmICghZW50cnlwb2ludCkge1xuICAgIGNvbnNvbGUubG9nKGBVc2FnZTogc3RhcnQtYW5hbnNpIDxlbnRyeXBvaW50LWZpbGU+YCk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHN0YXJ0RGV2U2VydmVyKGVudHJ5cG9pbnQpO1xufVxuXG5sZXQgc2VydmVyRmlsZUNvbnRlbnRzOiBQcm9taXNlPHN0cmluZz4gPSBQcm9taXNlLnJlc29sdmUoJycpO1xubGV0IHNlcnZlckVudHJ5ID0gJyc7XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0RGV2U2VydmVyKFxuICBlbnRyeXBvaW50OiBzdHJpbmcsXG4gIGVudjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbikge1xuICBjb25zdCB3ZWJwYWNrQ29uZmlnID0gYXdhaXQgZ2V0V2VicGFja0NvbmZpZygpO1xuXG4gIGNvbnN0IGxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdhbmFuc2ktZGV2c2VydmVyJyk7XG5cbiAgLy8gU2V0IHVwIGluIG1lbW9yeSBmaWxlc3lzdGVtXG4gIGNvbnN0IHZvbHVtZSA9IG5ldyBWb2x1bWUoKTtcbiAgY29uc3QgZnMgPSBjcmVhdGVGc0Zyb21Wb2x1bWUodm9sdW1lKTtcbiAgdWZzLnVzZShkaXNrRnMpLnVzZShmcyBhcyBhbnkpO1xuXG4gIGNvbnN0IGZzUmVxdWlyZSA9IGNyZWF0ZUh5YnJpZFJlcXVpcmUodWZzKTtcblxuICBjb25zdCByZWFkRmlsZSA9IHByb21pc2lmeSh1ZnMucmVhZEZpbGUpO1xuICAvLyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlIHNvIHdlIGNhbiBob3QgcmVsb2FkIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGFwcGxpY2F0aW9uXG4gIGZ1bmN0aW9uIGhvdEVudHJ5KGVudHJ5UGF0aDogc3RyaW5nKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgLy8gQHRzLWlnbm9yZSBmb3Igc29tZSByZWFzb24gaXQncyBub3QgcGlja2luZyB1cCB0aGF0IG90aGVyIG9wdGlvbnMgYXJlIG9wdGlvbmFsXG4gICAgY29uc3QgZ2VuZXJhdGVkRW50cnlwb2ludCA9IHRtcC5maWxlU3luYyh7IHBvc3RmaXg6ICcuanMnIH0pO1xuICAgIGRpc2tGcy53cml0ZVN5bmMoXG4gICAgICBnZW5lcmF0ZWRFbnRyeXBvaW50LmZkLFxuICAgICAgYFxuICBpbXBvcnQgZW50cnkgZnJvbSBcIiR7cGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGVudHJ5UGF0aCl9XCI7XG5cbiAgaWYgKGltcG9ydC5tZXRhLndlYnBhY2tIb3QpIHtcbiAgICBpbXBvcnQubWV0YS53ZWJwYWNrSG90LmFjY2VwdCgpO1xuICB9XG5cbiAgZXhwb3J0IGRlZmF1bHQgZW50cnk7XG4gICAgYCxcbiAgICApO1xuICAgIHJldHVybiBnZW5lcmF0ZWRFbnRyeXBvaW50O1xuICB9XG5cbiAgY29uc3Qgd2VicGFja0NvbmZpZ3M6IENvbmZpZ3VyYXRpb25bXSA9IFtcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogaG90RW50cnkoZW50cnlwb2ludCkubmFtZSxcbiAgICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgICB9LFxuICAgICAgeyBtb2RlOiAnZGV2ZWxvcG1lbnQnIH0sXG4gICAgKSxcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogZW50cnlwb2ludC5yZXBsYWNlKCcudHN4JywgJy5zZXJ2ZXIudHN4JyksXG4gICAgICAgIG5hbWU6ICdzZXJ2ZXInLFxuICAgICAgICBCUk9XU0VSU0xJU1RfRU5WOiAnY3VycmVudCBub2RlJyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcsIHRhcmdldDogJ25vZGUnIH0sXG4gICAgKSxcbiAgXTtcblxuICAvLyBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyXG4gIGNvbnN0IGNvbXBpbGVyID0gd2VicGFjayh3ZWJwYWNrQ29uZmlncyBhcyB1bmtub3duIGFzIE11bHRpQ29uZmlndXJhdGlvbik7XG4gIGlmICghY29tcGlsZXIpIHtcbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyJyk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7IGhvb2tSZXF1aXJlOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0czogd2VicGFjay5TdGF0cykge1xuICAgIGNvbnN0IHNlcnZlckpzb24gPSBzZXJ2ZXJTdGF0cy50b0pzb24oeyBhc3NldHM6IHRydWUgfSk7XG4gICAgcmV0dXJuIHBhdGguam9pbihzZXJ2ZXJKc29uLm91dHB1dFBhdGggPz8gJycsICdzZXJ2ZXIuanMnKTtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVFcnJvcnM8XG4gICAgRiBleHRlbmRzIChcbiAgICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICAgIHJlczogUmVzcG9uc2UgfCBTZXJ2ZXJSZXNwb25zZSxcbiAgICApID0+IFByb21pc2U8dm9pZD4sXG4gID4oZm46IEYpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKHJlcSwgcmVzKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgbmV4dCh4KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgbGV0IGluaXRSZW5kZXI6XG4gICAgfCB7IGFyZ3M6IFBhcmFtZXRlcnM8Qm91bmRSZW5kZXI+OyByZXNvbHZlOiAoKSA9PiB2b2lkIH1bXVxuICAgIHwgdW5kZWZpbmVkID0gW107XG4gIGxldCByZW5kZXI6IEJvdW5kUmVuZGVyID0gKC4uLmFyZ3MpID0+XG4gICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpbml0UmVuZGVyPy5wdXNoKHsgYXJncywgcmVzb2x2ZSB9KTtcbiAgICB9KTtcblxuICBmdW5jdGlvbiBpbXBvcnRSZW5kZXIoc3RhdHM6IHdlYnBhY2suU3RhdHNbXSkge1xuICAgIGNvbnN0IFtjbGllbnRTdGF0cywgc2VydmVyU3RhdHNdID0gc3RhdHM7XG4gICAgaWYgKFxuICAgICAgY2xpZW50U3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aCB8fFxuICAgICAgc2VydmVyU3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aFxuICAgICkge1xuICAgICAgbG9nLmVycm9yKCdFcnJvcnMgZm9yIGNsaWVudCBidWlsZDogJyArIGNsaWVudFN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgICBsb2cuZXJyb3IoJ0Vycm9ycyBmb3Igc2VydmVyIGJ1aWxkOiAnICsgc2VydmVyU3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAgIC8vIGZpcnN0IHRpbWUsIHJhdGhlciB0aGFuIHJlLXJlbmRlclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcignQWJvdmUgY29tcGlsZXIgZXJyb3JzIGJsb2NraW5nIHJlbG9hZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbygnTGF1bmNoaW5nIFNTUicpO1xuICAgIH1cblxuICAgIC8vIEFTU0VUU1xuICAgIGNvbnN0IGNsaWVudE1hbmlmZXN0ID0gY2xpZW50U3RhdHMudG9Kc29uKCk7XG5cbiAgICBzZXJ2ZXJFbnRyeSA9IGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0cyk7XG4gICAgc2VydmVyRmlsZUNvbnRlbnRzID0gcmVhZEZpbGUoc2VydmVyRW50cnkpLnRoZW4oYnVmID0+IGJ1Zi50b1N0cmluZygpKTtcbiAgICAvLyByZWxvYWQgbW9kdWxlc1xuICAgIE9iamVjdC5rZXlzKGZzUmVxdWlyZS5jYWNoZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgZGVsZXRlIGZzUmVxdWlyZS5jYWNoZVtrZXldO1xuICAgIH0pO1xuICAgIHJlbmRlciA9IChmc1JlcXVpcmUoc2VydmVyRW50cnkpIGFzIGFueSkuZGVmYXVsdC5iaW5kKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xpZW50TWFuaWZlc3QsXG4gICAgKTtcbiAgICAvLyBTRVJWRVIgU0lERSBFTlRSWVBPSU5UXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgIGluaXRSZW5kZXIuZm9yRWFjaChhc3luYyBpbml0ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuaW5mbygnUmVzb2x2aW5nIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGF3YWl0IHJlbmRlciguLi5pbml0LmFyZ3MpO1xuICAgICAgICAgIGluaXQucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gcmVuZGVyIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGxvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpbml0UmVuZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRldlNlcnZlciA9IG5ldyBXZWJwYWNrRGV2U2VydmVyKFxuICAgIC8vIHdyaXRlIHRvIG1lbW9yeSBmaWxlc3lzdGVtIHNvIHdlIGNhbiBpbXBvcnRcbiAgICB7XG4gICAgICAuLi53ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIsXG4gICAgICBkZXZNaWRkbGV3YXJlOiB7XG4gICAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdPy5kZXZTZXJ2ZXI/LmRldk1pZGRsZXdhcmUsXG4gICAgICAgIG91dHB1dEZpbGVTeXN0ZW06IHtcbiAgICAgICAgICAuLi5mcyxcbiAgICAgICAgICBqb2luOiBwYXRoLmpvaW4gYXMgYW55LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0sXG4gICAgICBzZXR1cE1pZGRsZXdhcmVzOiAobWlkZGxld2FyZXMsIGRldlNlcnZlcikgPT4ge1xuICAgICAgICBpZiAoIWRldlNlcnZlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd2VicGFjay1kZXYtc2VydmVyIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdGhlclJvdXRlcyA9IFtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRILFxuICAgICAgICAgIC4uLih3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXI/LnByb3h5XG4gICAgICAgICAgICA/LmZpbHRlcihwcm94eSA9PiB0eXBlb2YgcHJveHkgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgPy5mbGF0TWFwKHByb3h5ID0+IHByb3h5LmNvbnRleHQpID8/IFtdKSxcbiAgICAgICAgXTtcbiAgICAgICAgLy8gc2VydmUgU1NSIGZvciBub24tV0VCUEFDS19QVUJMSUNfUEFUSFxuICAgICAgICBkZXZTZXJ2ZXIuYXBwPy5nZXQoXG4gICAgICAgICAgbmV3IFJlZ0V4cChgXig/ISR7b3RoZXJSb3V0ZXMuam9pbignfCcpfSlgKSxcbiAgICAgICAgICBoYW5kbGVFcnJvcnMoYXN5bmMgZnVuY3Rpb24gKHJlcTogYW55LCByZXM6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJlcS51cmwuZW5kc1dpdGgoJ2Zhdmljb24uaWNvJykpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XG4gICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgcmVzLnNlbmQoJ25vdCBmb3VuZCcpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhdGFsOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFQ09OTlJFU0VUJykge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICdFQ09OTlJFU0VUIGlzIHVzdWFsbHkgZHVlIHRvIGJyb3dzZXIgY2xvc2luZyB0aGUgY29ubmVjdGlvbicsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHJlbmRlcihyZXEsIHJlcyk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHdlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uc2V0dXBNaWRkbGV3YXJlcykge1xuICAgICAgICAgIHJldHVybiB3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIuc2V0dXBNaWRkbGV3YXJlcyhcbiAgICAgICAgICAgIG1pZGRsZXdhcmVzLFxuICAgICAgICAgICAgZGV2U2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWlkZGxld2FyZXM7XG4gICAgICB9LFxuICAgIH0sXG4gICAgY29tcGlsZXIsXG4gICk7XG4gIGNvbnN0IHJ1blNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RhcnQoKTtcbiAgICBkZXZTZXJ2ZXIuY29tcGlsZXIuaG9va3MuZG9uZS50YXAoXG4gICAgICAnQW5hbnNpIFNlcnZlcicsXG4gICAgICAobXVsdGlTdGF0czogd2VicGFjay5NdWx0aVN0YXRzIHwgd2VicGFjay5TdGF0cykgPT4ge1xuICAgICAgICBpZiAoIW11bHRpU3RhdHMpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ3N0YXRzIG5vdCBzZW5kJyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0Lmhhc093bihtdWx0aVN0YXRzLCAnc3RhdHMnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGltcG9ydFJlbmRlcigobXVsdGlTdGF0cyBhcyB3ZWJwYWNrLk11bHRpU3RhdHMpLnN0YXRzKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2VydmUgZW50cnlwb2ludCcpO1xuICAgICAgICAgICAgY29uc3QgZmluZGVyID0gbmV3IFJlZ0V4cChgJHtzZXJ2ZXJFbnRyeX06KFtcXFxcZF0rKTooW1xcXFxkXSspYCwgJ2cnKTtcbiAgICAgICAgICAgIHNlcnZlckZpbGVDb250ZW50cy50aGVuKGZpbGVUZXh0ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdGV4dFJvd3MgPSBmaWxlVGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICAgIGxvZy5lcnJvcignPj4+IFN0YWNrIENvbnRleHQgW3NlcnZlIGVudHJ5cG9pbnRdIDw8PCcpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGUuc3RhY2subWF0Y2hBbGwoZmluZGVyKSA/PyBbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IocGF0aC5iYXNlbmFtZShzZXJ2ZXJFbnRyeSkgKyAnICcgKyByb3cgKyAnOicgKyBjb2wpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgLSAyXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyAtIDFdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoQXJyYXkoY29sKS5qb2luKCcgJykgKyAnXicpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3ddKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93ICsgMV0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgKyAyXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGlza0ZzLndyaXRlRmlsZVN5bmMoc2VydmVyRW50cnksIGZpbGVUZXh0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ09ubHkgY29tcGlsZXIgb25lIHN0YXQnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9O1xuICBjb25zdCBzdG9wU2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICAgIGxvZy5pbmZvKCdTdG9wcGluZyBzZXJ2ZXIuLi4nKTtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RvcCgpO1xuICAgIGxvZy5pbmZvKCdTZXJ2ZXIgY2xvc2VkJyk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGxvZy53YXJuKCdSZWNlaXZlZCBTSUdJTlQsIGRldnNlcnZlciBzaHV0dGluZyBkb3duJyk7XG4gICAgc3RvcFNlcnZlcigpO1xuICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4g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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anansi/core",
3
- "version": "0.20.38",
3
+ "version": "0.20.40",
4
4
  "description": "React 19 Framework",
5
5
  "homepage": "https://github.com/ntucker/anansi/tree/master/packages/core#readme",
6
6
  "repository": {
@@ -71,11 +71,11 @@
71
71
  "@types/compression": "1.8.1",
72
72
  "@types/express": "^4.17.17",
73
73
  "@types/node": "^24.0.0",
74
- "@types/react": "19.2.2",
75
- "@types/react-dom": "19.2.1",
74
+ "@types/react": "19.2.5",
75
+ "@types/react-dom": "19.2.3",
76
76
  "@types/source-map-support": "0.5.10",
77
77
  "@types/tmp": "0.2.6",
78
- "@types/webpack-hot-middleware": "2.25.11",
78
+ "@types/webpack-hot-middleware": "2.25.12",
79
79
  "@types/webpack-node-externals": "^3",
80
80
  "react": "19.2.0",
81
81
  "react-dom": "19.2.0"
@@ -0,0 +1,172 @@
1
+ import diskFs from 'fs';
2
+ import { createFsFromVolume, Volume } from 'memfs';
3
+ import path from 'path';
4
+ import tmp from 'tmp';
5
+ import { ufs } from 'unionfs';
6
+
7
+ import { createHybridRequire } from '../createHybridRequire';
8
+
9
+ /**
10
+ * Regression test to ensure hybridRequire resolves from the initial
11
+ * working directory even if process.cwd() changes after initialization.
12
+ * This guards against future refactors that might call process.chdir.
13
+ */
14
+ describe('hybridRequire - process.cwd() variance regression', () => {
15
+ let tempDir: string;
16
+ let originalCwd: string;
17
+
18
+ beforeEach(() => {
19
+ originalCwd = process.cwd();
20
+ tempDir = tmp.dirSync({ unsafeCleanup: true }).name;
21
+ });
22
+
23
+ afterEach(() => {
24
+ process.chdir(originalCwd);
25
+ });
26
+
27
+ it('should capture projectRequire path at initialization time', () => {
28
+ const projectRoot = path.join(tempDir, 'project');
29
+ const otherDir = path.join(tempDir, 'other');
30
+
31
+ // Create project structure
32
+ diskFs.mkdirSync(projectRoot, { recursive: true });
33
+ diskFs.mkdirSync(otherDir, { recursive: true });
34
+
35
+ const nodeModulesDir = path.join(projectRoot, 'node_modules');
36
+ const testPackageDir = path.join(nodeModulesDir, 'test-package-cwd');
37
+ const testFile = path.join(testPackageDir, 'index.js');
38
+
39
+ diskFs.mkdirSync(testPackageDir, { recursive: true });
40
+ diskFs.writeFileSync(
41
+ testFile,
42
+ "module.exports = { default: 'from-project-root' };",
43
+ );
44
+ diskFs.writeFileSync(
45
+ path.join(testPackageDir, 'package.json'),
46
+ JSON.stringify({ name: 'test-package-cwd', main: 'index.js' }),
47
+ );
48
+
49
+ diskFs.writeFileSync(
50
+ path.join(projectRoot, 'package.json'),
51
+ JSON.stringify({ name: 'project' }),
52
+ );
53
+
54
+ // Create another package.json in otherDir (should not be used)
55
+ diskFs.writeFileSync(
56
+ path.join(otherDir, 'package.json'),
57
+ JSON.stringify({ name: 'other' }),
58
+ );
59
+
60
+ // Set up memfs WITHOUT diskFs to test fallback
61
+ const volume = new Volume();
62
+ const fs = createFsFromVolume(volume);
63
+ ufs.use(fs as any);
64
+
65
+ // Initialize hybridRequire while in projectRoot
66
+ process.chdir(projectRoot);
67
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
68
+
69
+ // Change to other directory
70
+ process.chdir(otherDir);
71
+
72
+ // Verify process.cwd() changed
73
+ expect(process.cwd()).toBe(otherDir);
74
+
75
+ // hybridRequire should still resolve from projectRoot (captured at init)
76
+ const result = hybridRequire('test-package-cwd');
77
+ expect(result.default).toBe('from-project-root');
78
+ });
79
+
80
+ it('should work correctly when process.cwd() is different from projectRoot', () => {
81
+ const projectRoot = path.join(tempDir, 'workspace', 'examples', 'app');
82
+ const nodeModulesDir = path.join(projectRoot, 'node_modules');
83
+ const testPackageDir = path.join(nodeModulesDir, 'test-package-nested');
84
+ const testFile = path.join(testPackageDir, 'index.js');
85
+
86
+ // Create nested structure
87
+ diskFs.mkdirSync(testPackageDir, { recursive: true });
88
+ diskFs.writeFileSync(
89
+ testFile,
90
+ "module.exports = { default: 'from-nested-workspace' };",
91
+ );
92
+ diskFs.writeFileSync(
93
+ path.join(testPackageDir, 'package.json'),
94
+ JSON.stringify({ name: 'test-package-nested', main: 'index.js' }),
95
+ );
96
+
97
+ diskFs.writeFileSync(
98
+ path.join(projectRoot, 'package.json'),
99
+ JSON.stringify({ name: 'app' }),
100
+ );
101
+
102
+ // Set up memfs WITHOUT diskFs to test fallback
103
+ const volume = new Volume();
104
+ const fs = createFsFromVolume(volume);
105
+ ufs.use(fs as any);
106
+
107
+ // Initialize from a different directory (simulating monorepo root)
108
+ const monorepoRoot = path.join(tempDir, 'workspace');
109
+ process.chdir(monorepoRoot);
110
+
111
+ // Create hybridRequire with explicit projectRoot (not process.cwd())
112
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
113
+
114
+ // Verify it resolves from projectRoot, not monorepoRoot
115
+ const result = hybridRequire('test-package-nested');
116
+ expect(result.default).toBe('from-nested-workspace');
117
+ });
118
+
119
+ it('should handle multiple chdir calls without breaking', () => {
120
+ const projectRoot = path.join(tempDir, 'project');
121
+ const dir1 = path.join(tempDir, 'dir1');
122
+ const dir2 = path.join(tempDir, 'dir2');
123
+
124
+ diskFs.mkdirSync(projectRoot, { recursive: true });
125
+ diskFs.mkdirSync(dir1, { recursive: true });
126
+ diskFs.mkdirSync(dir2, { recursive: true });
127
+
128
+ const nodeModulesDir = path.join(projectRoot, 'node_modules');
129
+ const testPackageDir = path.join(nodeModulesDir, 'test-package-stable');
130
+ const testFile = path.join(testPackageDir, 'index.js');
131
+
132
+ diskFs.mkdirSync(testPackageDir, { recursive: true });
133
+ diskFs.writeFileSync(
134
+ testFile,
135
+ "module.exports = { default: 'stable-reference' };",
136
+ );
137
+ diskFs.writeFileSync(
138
+ path.join(testPackageDir, 'package.json'),
139
+ JSON.stringify({ name: 'test-package-stable', main: 'index.js' }),
140
+ );
141
+
142
+ diskFs.writeFileSync(
143
+ path.join(projectRoot, 'package.json'),
144
+ JSON.stringify({ name: 'project' }),
145
+ );
146
+
147
+ // Set up memfs WITHOUT diskFs to test fallback
148
+ const volume = new Volume();
149
+ const fs = createFsFromVolume(volume);
150
+ ufs.use(fs as any);
151
+
152
+ // Initialize
153
+ process.chdir(projectRoot);
154
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
155
+
156
+ // Multiple chdir calls
157
+ process.chdir(dir1);
158
+ expect(hybridRequire('test-package-stable').default).toBe(
159
+ 'stable-reference',
160
+ );
161
+
162
+ process.chdir(dir2);
163
+ expect(hybridRequire('test-package-stable').default).toBe(
164
+ 'stable-reference',
165
+ );
166
+
167
+ process.chdir(projectRoot);
168
+ expect(hybridRequire('test-package-stable').default).toBe(
169
+ 'stable-reference',
170
+ );
171
+ });
172
+ });
@@ -0,0 +1,243 @@
1
+ import diskFs from 'fs';
2
+ import { createFsRequire } from 'fs-require';
3
+ import { createFsFromVolume, Volume } from 'memfs';
4
+ import path from 'path';
5
+ import tmp from 'tmp';
6
+ import { ufs } from 'unionfs';
7
+
8
+ import { createHybridRequire } from '../createHybridRequire';
9
+
10
+ describe('hybridRequire wrapper', () => {
11
+ let tempDir: string;
12
+ let originalCwd: string;
13
+
14
+ beforeEach(() => {
15
+ originalCwd = process.cwd();
16
+ tempDir = tmp.dirSync({ unsafeCleanup: true }).name;
17
+ });
18
+
19
+ afterEach(() => {
20
+ process.chdir(originalCwd);
21
+ });
22
+
23
+ describe('unit tests - fallback resolver', () => {
24
+ it('should resolve bare specifiers from project node_modules when not in memfs', () => {
25
+ // Set up a temp directory with node_modules containing a test package
26
+ const projectRoot = tempDir;
27
+ const nodeModulesDir = path.join(projectRoot, 'node_modules');
28
+ const testPackageDir = path.join(nodeModulesDir, 'test-package');
29
+ const testFile = path.join(testPackageDir, 'index.js');
30
+
31
+ // Create directory structure with a unique package name to avoid conflicts
32
+ diskFs.mkdirSync(testPackageDir, { recursive: true });
33
+ diskFs.writeFileSync(
34
+ testFile,
35
+ "module.exports = { default: 'test-export-value', test: 'value' };",
36
+ );
37
+
38
+ // Create package.json for the test package
39
+ diskFs.writeFileSync(
40
+ path.join(testPackageDir, 'package.json'),
41
+ JSON.stringify({ name: 'test-package', main: 'index.js' }),
42
+ );
43
+
44
+ // Create package.json in project root
45
+ diskFs.writeFileSync(
46
+ path.join(projectRoot, 'package.json'),
47
+ JSON.stringify({ name: 'test-project' }),
48
+ );
49
+
50
+ // Set up memfs WITHOUT diskFs to simulate memfs-only scenario
51
+ // This way fsRequire will fail (module not in memfs)
52
+ // and hybridRequire will fall back to projectRequire
53
+ const volume = new Volume();
54
+ const fs = createFsFromVolume(volume);
55
+ // Only use memfs, not disk - this simulates the webpack output scenario
56
+ ufs.use(fs as any);
57
+
58
+ const fsRequire = createFsRequire(ufs);
59
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
60
+
61
+ // Mock process.cwd to return our temp directory
62
+ const originalCwd = process.cwd;
63
+ process.cwd = jest.fn(() => projectRoot);
64
+
65
+ try {
66
+ // fsRequire should fail because test-package is not in memfs
67
+ expect(() => {
68
+ fsRequire('test-package');
69
+ }).toThrow();
70
+
71
+ // hybridRequire should succeed by falling back to project node_modules
72
+ const result = hybridRequire('test-package');
73
+ expect(result).toBeDefined();
74
+ expect(result.default).toBe('test-export-value');
75
+ expect(result.test).toBe('value');
76
+ } finally {
77
+ process.cwd = originalCwd;
78
+ }
79
+ });
80
+
81
+ it('should work with unionfs when module exists in both disk and memfs', () => {
82
+ const projectRoot = tempDir;
83
+ const nodeModulesDir = path.join(projectRoot, 'node_modules');
84
+ const testPackageDir = path.join(nodeModulesDir, 'test-package-union');
85
+ const testFile = path.join(testPackageDir, 'index.js');
86
+
87
+ // Create directory structure on disk
88
+ diskFs.mkdirSync(testPackageDir, { recursive: true });
89
+ diskFs.writeFileSync(
90
+ testFile,
91
+ "module.exports = { default: 'disk-version' };",
92
+ );
93
+ diskFs.writeFileSync(
94
+ path.join(testPackageDir, 'package.json'),
95
+ JSON.stringify({ name: 'test-package-union', main: 'index.js' }),
96
+ );
97
+
98
+ diskFs.writeFileSync(
99
+ path.join(projectRoot, 'package.json'),
100
+ JSON.stringify({ name: 'test-project' }),
101
+ );
102
+
103
+ // Set up memfs with the same module (different version)
104
+ const volume = new Volume();
105
+ const fs = createFsFromVolume(volume);
106
+ const memfsPath = path.join('/node_modules/test-package-union/index.js');
107
+ fs.mkdirSync(path.dirname(memfsPath), { recursive: true });
108
+ fs.writeFileSync(
109
+ memfsPath,
110
+ "module.exports = { default: 'memfs-version' };",
111
+ );
112
+
113
+ // unionfs checks disk first, then memfs (same as dev server)
114
+ ufs.use(diskFs).use(fs as any);
115
+
116
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
117
+
118
+ // hybridRequire should get disk version (unionfs checks disk first)
119
+ // This verifies that hybridRequire correctly uses fsRequire with unionfs
120
+ const result = hybridRequire('test-package-union');
121
+ expect(result.default).toBe('disk-version');
122
+ });
123
+
124
+ it('should handle relative paths without fallback', () => {
125
+ const projectRoot = tempDir;
126
+ diskFs.writeFileSync(
127
+ path.join(projectRoot, 'package.json'),
128
+ JSON.stringify({ name: 'test-project' }),
129
+ );
130
+
131
+ const volume = new Volume();
132
+ const fs = createFsFromVolume(volume);
133
+ const relativeFile = '/relative.js';
134
+ fs.writeFileSync(
135
+ relativeFile,
136
+ "module.exports = { default: 'relative-export' };",
137
+ );
138
+
139
+ ufs.use(diskFs).use(fs as any);
140
+
141
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
142
+
143
+ // Relative paths should work through memfs
144
+ const result = hybridRequire(relativeFile);
145
+ expect(result.default).toBe('relative-export');
146
+
147
+ // If relative path fails, it should throw (not fallback)
148
+ expect(() => hybridRequire('./nonexistent.js')).toThrow();
149
+ });
150
+
151
+ it('should throw non-MODULE_NOT_FOUND errors', () => {
152
+ const projectRoot = tempDir;
153
+ diskFs.writeFileSync(
154
+ path.join(projectRoot, 'package.json'),
155
+ JSON.stringify({ name: 'test-project' }),
156
+ );
157
+
158
+ const volume = new Volume();
159
+ const fs = createFsFromVolume(volume);
160
+ ufs.use(diskFs).use(fs as any);
161
+
162
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
163
+
164
+ // Create a file that will cause a different error
165
+ const badFile = '/bad.js';
166
+ fs.writeFileSync(badFile, 'invalid syntax !!!');
167
+
168
+ // Should throw the original error, not attempt fallback
169
+ expect(() => hybridRequire(badFile)).toThrow();
170
+ });
171
+
172
+ it('should preserve cache and resolve properties', () => {
173
+ const projectRoot = tempDir;
174
+ diskFs.writeFileSync(
175
+ path.join(projectRoot, 'package.json'),
176
+ JSON.stringify({ name: 'test-project' }),
177
+ );
178
+
179
+ const volume = new Volume();
180
+ const fs = createFsFromVolume(volume);
181
+ ufs.use(diskFs).use(fs as any);
182
+
183
+ // Create hybridRequire (which creates fsRequire internally)
184
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
185
+
186
+ // Verify cache and resolve are preserved from the internal fsRequire
187
+ expect(hybridRequire.cache).toBeDefined();
188
+ expect(typeof hybridRequire.cache).toBe('object');
189
+ expect(hybridRequire.resolve).toBeDefined();
190
+ expect(typeof hybridRequire.resolve).toBe('function');
191
+ // Verify resolve works
192
+ expect(() => hybridRequire.resolve('some-module')).not.toThrow();
193
+ });
194
+ });
195
+
196
+ describe('regression test - process.cwd variance', () => {
197
+ it('should resolve from initial working directory even after process.chdir', () => {
198
+ const projectRoot = tempDir;
199
+ const nodeModulesDir = path.join(projectRoot, 'node_modules');
200
+ const testPackageDir = path.join(nodeModulesDir, 'test-package-3');
201
+ const testFile = path.join(testPackageDir, 'index.js');
202
+
203
+ // Create directory structure
204
+ diskFs.mkdirSync(testPackageDir, { recursive: true });
205
+ diskFs.writeFileSync(
206
+ testFile,
207
+ "module.exports = { default: 'test-export-value' };",
208
+ );
209
+ diskFs.writeFileSync(
210
+ path.join(testPackageDir, 'package.json'),
211
+ JSON.stringify({ name: 'test-package-3', main: 'index.js' }),
212
+ );
213
+
214
+ diskFs.writeFileSync(
215
+ path.join(projectRoot, 'package.json'),
216
+ JSON.stringify({ name: 'test-project' }),
217
+ );
218
+
219
+ // Create another directory that we'll chdir to
220
+ const otherDir = tmp.dirSync({ unsafeCleanup: true }).name;
221
+ diskFs.writeFileSync(
222
+ path.join(otherDir, 'package.json'),
223
+ JSON.stringify({ name: 'other-project' }),
224
+ );
225
+
226
+ // Set up memfs WITHOUT diskFs to test fallback
227
+ const volume = new Volume();
228
+ const fs = createFsFromVolume(volume);
229
+ ufs.use(fs as any);
230
+
231
+ // Capture projectRequire at initial cwd
232
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
233
+
234
+ // Change directory
235
+ process.chdir(otherDir);
236
+
237
+ // hybridRequire should still resolve from the original projectRoot
238
+ // because projectRequire was created with that path
239
+ const result = hybridRequire('test-package-3');
240
+ expect(result.default).toBe('test-export-value');
241
+ });
242
+ });
243
+ });
@@ -0,0 +1,4 @@
1
+ {
2
+ "extends": "../../../tsconfig.test.json"
3
+ }
4
+
@@ -0,0 +1,42 @@
1
+ import { createFsRequire } from 'fs-require';
2
+ import { createRequire } from 'module';
3
+ import path from 'path';
4
+ import { type IUnionFs } from 'unionfs';
5
+
6
+ /**
7
+ * Creates a hybrid require function that combines fs-require (for in-memory files)
8
+ * with Node's native require (for bare specifiers from project node_modules).
9
+ *
10
+ * This solves the issue where fs-require cannot resolve bare specifiers like
11
+ * `@anansi/core/server` from workspace node_modules when they're not in the
12
+ * memfs bundle.
13
+ *
14
+ * @param ufs - The unionfs instance (disk first, then memfs)
15
+ * @param projectRoot - Optional project root directory. Defaults to process.cwd()
16
+ * @returns A require function that tries memfs first, then falls back to project node_modules
17
+ */
18
+ export function createHybridRequire(
19
+ ufs: IUnionFs,
20
+ projectRoot: string = process.cwd(),
21
+ ): ReturnType<typeof createFsRequire> {
22
+ const fsRequire = createFsRequire(ufs);
23
+ const projectRequire = createRequire(path.join(projectRoot, 'package.json'));
24
+
25
+ function hybridRequire(id: string) {
26
+ try {
27
+ return fsRequire(id);
28
+ } catch (error: any) {
29
+ const isBare = !id.startsWith('.') && !path.isAbsolute(id);
30
+ if (isBare && error?.code === 'MODULE_NOT_FOUND') {
31
+ return projectRequire(id);
32
+ }
33
+ throw error;
34
+ }
35
+ }
36
+
37
+ // Preserve cache and resolve properties from fsRequire
38
+ hybridRequire.cache = fsRequire.cache;
39
+ hybridRequire.resolve = fsRequire.resolve;
40
+
41
+ return hybridRequire as ReturnType<typeof createFsRequire>;
42
+ }
@@ -1,5 +1,5 @@
1
1
  import { default as enhanced } from 'enhanced-resolve';
2
- import webpack from 'webpack';
2
+ import type { Configuration } from 'webpack';
3
3
 
4
4
  const resolve = enhanced.create.sync({
5
5
  modules: ['.'],
@@ -9,7 +9,7 @@ const resolve = enhanced.create.sync({
9
9
  });
10
10
 
11
11
  export async function getWebpackConfig(): Promise<
12
- (env: any, argv: any) => webpack.Configuration
12
+ (env: any, argv: any) => Configuration
13
13
  > {
14
14
  const configPath = resolve({}, process.cwd(), 'webpack.config');
15
15
  if (!configPath) {
@@ -6,19 +6,19 @@ Object.hasOwn =
6
6
  };
7
7
  import type { NextFunction } from 'express';
8
8
  import diskFs from 'fs';
9
- import { createFsRequire } from 'fs-require';
10
- import { Server, IncomingMessage, ServerResponse } from 'http';
9
+ import { IncomingMessage, ServerResponse } from 'http';
11
10
  import { createFsFromVolume, Volume } from 'memfs';
12
11
  import path from 'path';
13
12
  import sourceMapSupport from 'source-map-support';
14
13
  import tmp from 'tmp';
15
14
  import { ufs } from 'unionfs';
16
15
  import { promisify } from 'util';
17
- import webpack, { MultiCompiler } from 'webpack';
16
+ import webpack, { type Configuration, type MultiConfiguration } from 'webpack';
18
17
  import logging from 'webpack/lib/logging/runtime.js';
19
18
  import WebpackDevServer from 'webpack-dev-server';
20
19
 
21
20
  import 'cross-fetch/dist/node-polyfill.js';
21
+ import { createHybridRequire } from './createHybridRequire.js';
22
22
  import { getWebpackConfig } from './getWebpackConfig.js';
23
23
  import { BoundRender } from './types.js';
24
24
 
@@ -52,10 +52,9 @@ export default async function startDevServer(
52
52
  const fs = createFsFromVolume(volume);
53
53
  ufs.use(diskFs).use(fs as any);
54
54
 
55
- const fsRequire = createFsRequire(ufs);
56
- const readFile = promisify(ufs.readFile);
57
- let server: Server | undefined;
55
+ const fsRequire = createHybridRequire(ufs);
58
56
 
57
+ const readFile = promisify(ufs.readFile);
59
58
  // Generate a temporary file so we can hot reload from the root of the application
60
59
  function hotEntry(entryPath: string) {
61
60
  // eslint-disable-next-line
@@ -76,7 +75,7 @@ export default async function startDevServer(
76
75
  return generatedEntrypoint;
77
76
  }
78
77
 
79
- const webpackConfigs = [
78
+ const webpackConfigs: Configuration[] = [
80
79
  webpackConfig(
81
80
  {
82
81
  ...env,
@@ -94,10 +93,10 @@ export default async function startDevServer(
94
93
  },
95
94
  { mode: 'development', target: 'node' },
96
95
  ),
97
- ] as const;
96
+ ];
98
97
 
99
98
  // initialize the webpack compiler
100
- const compiler = webpack(webpackConfigs);
99
+ const compiler = webpack(webpackConfigs as unknown as MultiConfiguration);
101
100
  if (!compiler) {
102
101
  log.error('Failed to initialize the webpack compiler');
103
102
  process.exit(-1);