@rollipop/core 0.1.0-alpha.1 → 0.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -5,6 +5,7 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
8
9
  var __export = (all, symbols) => {
9
10
  let target = {};
10
11
  for (var name in all) {
@@ -69,6 +70,26 @@ let hermes_parser = require("hermes-parser");
69
70
  hermes_parser = __toESM(hermes_parser);
70
71
  let image_size = require("image-size");
71
72
  let _svgr_core = require("@svgr/core");
73
+ let url = require("url");
74
+ url = __toESM(url);
75
+ let _react_native_community_cli_server_api = require("@react-native-community/cli-server-api");
76
+ let _react_native_dev_middleware = require("@react-native/dev-middleware");
77
+ let fastify = require("fastify");
78
+ fastify = __toESM(fastify);
79
+ let node_http = require("node:http");
80
+ node_http = __toESM(node_http);
81
+ let node_events = require("node:events");
82
+ node_events = __toESM(node_events);
83
+ let source_map = require("source-map");
84
+ let fastify_plugin = require("fastify-plugin");
85
+ fastify_plugin = __toESM(fastify_plugin);
86
+ let json_schema_to_ts = require("json-schema-to-ts");
87
+ let mime = require("mime");
88
+ mime = __toESM(mime);
89
+ let ajv = require("ajv");
90
+ ajv = __toESM(ajv);
91
+ let ws = require("ws");
92
+ ws = __toESM(ws);
72
93
  let c12 = require("c12");
73
94
  c12 = __toESM(c12);
74
95
 
@@ -86,7 +107,7 @@ function resolveBuildOptions(projectRoot, buildOptions) {
86
107
 
87
108
  //#endregion
88
109
  //#region src/constants.ts
89
- const ROLLIPOP_VERSION = "0.1.0-alpha.1";
110
+ const ROLLIPOP_VERSION = "0.1.0-alpha.2";
90
111
  const GLOBAL_IDENTIFIER = "__ROLLIPOP_GLOBAL__";
91
112
  /**
92
113
  * Unlike the Metro bundler configuration, this prioritizes resolving module(ESM) fields first.
@@ -185,7 +206,7 @@ function createId(config, buildOptions) {
185
206
 
186
207
  //#endregion
187
208
  //#region src/logger.ts
188
- const logger = new _rollipop_common.Logger("bundler");
209
+ const logger$1 = new _rollipop_common.Logger("bundler");
189
210
 
190
211
  //#endregion
191
212
  //#region src/core/cache/file-system-cache.ts
@@ -193,7 +214,7 @@ var FileSystemCache = class {
193
214
  constructor(cacheDirectory) {
194
215
  this.cacheDirectory = cacheDirectory;
195
216
  this.ensureCacheDirectory();
196
- logger.debug("cache directory:", cacheDirectory);
217
+ logger$1.debug("cache directory:", cacheDirectory);
197
218
  }
198
219
  ensureCacheDirectory() {
199
220
  if (!node_fs.default.existsSync(this.cacheDirectory)) node_fs.default.mkdirSync(this.cacheDirectory, { recursive: true });
@@ -209,7 +230,7 @@ var FileSystemCache = class {
209
230
  try {
210
231
  node_fs.default.writeFileSync(node_path.default.join(this.cacheDirectory, key), value);
211
232
  } catch {
212
- logger.error("Failed to write cache file", key);
233
+ logger$1.error("Failed to write cache file", key);
213
234
  }
214
235
  }
215
236
  clear() {
@@ -274,10 +295,10 @@ function asIdentifier(name) {
274
295
  function nodeEnvironment(dev$1) {
275
296
  return dev$1 ? "development" : "production";
276
297
  }
277
- function iife(body, path$10 = "<unknown>") {
298
+ function iife(body, path$11 = "<unknown>") {
278
299
  const bodyPlaceholder = "__BODY__";
279
300
  return dedent.default`
280
- // ${path$10}
301
+ // ${path$11}
281
302
  (function (global) {
282
303
  ${bodyPlaceholder}
283
304
  })(${GLOBAL_IDENTIFIER});
@@ -534,7 +555,7 @@ function progressBar(reporter, context, label) {
534
555
  renderProgress(id, totalModules, transformedModules);
535
556
  break;
536
557
  case Boolean(flags & ProgressFlags.WATCH_CHANGE):
537
- logger.debug("Transformed changed file", { id });
558
+ logger$1.debug("Transformed changed file", { id });
538
559
  break;
539
560
  }
540
561
  },
@@ -546,12 +567,12 @@ function progressBar(reporter, context, label) {
546
567
  function compat(reporter) {
547
568
  return withReporter(reporter, {
548
569
  onStart() {
549
- logger.info("Build started...");
570
+ logger$1.info("Build started...");
550
571
  },
551
572
  onEnd({ totalModules, duration }) {
552
573
  const time = _rollipop_common.chalk.blue(`${duration.toFixed(2)}ms`);
553
574
  const modules = _rollipop_common.chalk.blue(`(${totalModules} modules)`);
554
- logger.info(`Build finished in ${time} ${modules}`);
575
+ logger$1.info(`Build finished in ${time} ${modules}`);
555
576
  }
556
577
  });
557
578
  }
@@ -957,14 +978,14 @@ function getCacheKey(id, buildHash) {
957
978
  /**
958
979
  * Enhance a plugin to cache the result. (transform hook only)
959
980
  */
960
- function cacheable(plugin) {
961
- const originalTransform = plugin.transform;
962
- if (typeof originalTransform === "function") plugin.transform = function(code, id, meta) {
981
+ function cacheable(plugin$3) {
982
+ const originalTransform = plugin$3.transform;
983
+ if (typeof originalTransform === "function") plugin$3.transform = function(code, id, meta) {
963
984
  const moduleInfo = this.getModuleInfo(id);
964
985
  if (moduleInfo && isCacheHit(moduleInfo.meta)) return;
965
986
  return originalTransform.call(this, code, id, meta);
966
987
  };
967
- if (typeof originalTransform === "object") plugin.transform = {
988
+ if (typeof originalTransform === "object") plugin$3.transform = {
968
989
  ...originalTransform,
969
990
  handler(code, id, meta) {
970
991
  const moduleInfo = this.getModuleInfo(id);
@@ -972,7 +993,7 @@ function cacheable(plugin) {
972
993
  return originalTransform.handler.call(this, code, id, meta);
973
994
  }
974
995
  };
975
- return plugin;
996
+ return plugin$3;
976
997
  }
977
998
  const PluginUtils = Object.freeze({ cacheable });
978
999
 
@@ -1372,9 +1393,30 @@ var plugins_exports = /* @__PURE__ */ __export({
1372
1393
  svg: () => svgPlugin
1373
1394
  });
1374
1395
 
1396
+ //#endregion
1397
+ //#region src/core/plugins/context.ts
1398
+ const pluginLogger = new _rollipop_common.Logger();
1399
+ function createPluginContext(name) {
1400
+ return {
1401
+ debug: (log) => {
1402
+ printPluginLog("debug", log, name);
1403
+ },
1404
+ info: (log) => {
1405
+ printPluginLog("info", log, name);
1406
+ },
1407
+ warn: (log) => {
1408
+ printPluginLog("warn", log, name);
1409
+ }
1410
+ };
1411
+ }
1412
+ function printPluginLog(level, log, pluginName = "unknown") {
1413
+ const pluginLabel = _rollipop_common.chalk.magenta(`plugin:${pluginName}`);
1414
+ if (typeof log === "string") pluginLogger[level](pluginLabel, log);
1415
+ else pluginLogger[level](pluginLabel, log.stack ?? log.message);
1416
+ }
1417
+
1375
1418
  //#endregion
1376
1419
  //#region src/core/rolldown.ts
1377
- const rolldownLogger = new _rollipop_common.Logger("rolldown");
1378
1420
  resolveRolldownOptions.cache = /* @__PURE__ */ new Map();
1379
1421
  async function resolveRolldownOptions(context, config, buildOptions) {
1380
1422
  const cachedOptions = resolveRolldownOptions.cache.get(context.id);
@@ -1444,20 +1486,9 @@ async function resolveRolldownOptions(context, config, buildOptions) {
1444
1486
  pluginTimings: false
1445
1487
  },
1446
1488
  logLevel: isDebugEnabled() ? "debug" : "info",
1447
- onLog(level, log) {
1448
- const { message, code } = log;
1449
- const logArgs = [code, message].filter(es_toolkit.isNotNil);
1450
- switch (level) {
1451
- case "debug":
1452
- rolldownLogger.debug(...logArgs);
1453
- break;
1454
- case "info":
1455
- rolldownLogger.info(...logArgs);
1456
- break;
1457
- case "warn":
1458
- rolldownLogger.warn(...logArgs);
1459
- break;
1460
- }
1489
+ onLog(level, log, defaultHandler) {
1490
+ if (log.code?.startsWith("PLUGIN_")) printPluginLog(level, log, log.plugin);
1491
+ else defaultHandler(level, log);
1461
1492
  }
1462
1493
  }, {
1463
1494
  postBanner: [...getGlobalVariables(dev$1, context.mode)].join("\n"),
@@ -1480,9 +1511,9 @@ function getResolveExtensions({ platform, sourceExtensions, assetExtensions, pre
1480
1511
  function loadPolyfills(polyfills) {
1481
1512
  return polyfills.map((polyfill) => {
1482
1513
  if (typeof polyfill === "string") return node_fs.default.readFileSync(polyfill, "utf-8");
1483
- const path$10 = "path" in polyfill ? polyfill.path : void 0;
1514
+ const path$11 = "path" in polyfill ? polyfill.path : void 0;
1484
1515
  const content = "code" in polyfill ? polyfill.code : node_fs.default.readFileSync(polyfill.path, "utf-8");
1485
- return polyfill.type === "iife" ? iife(content, path$10) : content;
1516
+ return polyfill.type === "iife" ? iife(content, path$11) : content;
1486
1517
  });
1487
1518
  }
1488
1519
  async function applyDangerouslyOverrideOptionsFinalizer(config, inputOptions, outputOptions) {
@@ -1569,6 +1600,2348 @@ var Bundler = class Bundler {
1569
1600
  }
1570
1601
  };
1571
1602
 
1603
+ //#endregion
1604
+ //#region src/server/logger.ts
1605
+ const logger = new _rollipop_common.Logger("dev-server");
1606
+ var DevServerLogger = class {
1607
+ level = "trace";
1608
+ trace(...args) {
1609
+ logger.trace(...args);
1610
+ }
1611
+ debug(...args) {
1612
+ logger.debug(...args);
1613
+ }
1614
+ info(...args) {
1615
+ logger.info(...args);
1616
+ }
1617
+ warn(...args) {
1618
+ logger.warn(...args);
1619
+ }
1620
+ error(...args) {
1621
+ logger.error(...args);
1622
+ }
1623
+ silent(...args) {
1624
+ logger.trace(_rollipop_common.chalk.gray("(silent)"), ...args);
1625
+ }
1626
+ fatal(...args) {
1627
+ logger.error(_rollipop_common.chalk.magenta("(fatal)"), ...args);
1628
+ }
1629
+ child(_bindings) {
1630
+ return this;
1631
+ }
1632
+ };
1633
+
1634
+ //#endregion
1635
+ //#region src/utils/dev-server.ts
1636
+ async function assertDevServerStatus(options) {
1637
+ const { devServerUrl, projectRoot, port } = options;
1638
+ const status = await getDevServerStatus(devServerUrl, projectRoot);
1639
+ let shouldExit = false;
1640
+ switch (status) {
1641
+ case DevServerStatus.MATCHED_SERVER_RUNNING:
1642
+ logger.warn(`A dev server is already running for this project on port ${port}. Exiting.`);
1643
+ shouldExit = true;
1644
+ break;
1645
+ case DevServerStatus.PORT_TAKEN:
1646
+ logger.error(`Another process is running on port ${port}. Please terminate this process and try again, or use another port with "--port".`);
1647
+ shouldExit = true;
1648
+ break;
1649
+ }
1650
+ if (shouldExit) process.exit(1);
1651
+ }
1652
+ var DevServerStatus = /* @__PURE__ */ function(DevServerStatus$1) {
1653
+ DevServerStatus$1[DevServerStatus$1["NOT_RUNNING"] = 0] = "NOT_RUNNING";
1654
+ DevServerStatus$1[DevServerStatus$1["MATCHED_SERVER_RUNNING"] = 1] = "MATCHED_SERVER_RUNNING";
1655
+ DevServerStatus$1[DevServerStatus$1["PORT_TAKEN"] = 2] = "PORT_TAKEN";
1656
+ DevServerStatus$1[DevServerStatus$1["UNKNOWN"] = 3] = "UNKNOWN";
1657
+ return DevServerStatus$1;
1658
+ }(DevServerStatus || {});
1659
+ async function getDevServerStatus(devServerUrl, projectRoot) {
1660
+ const { hostname, port } = new URL(devServerUrl);
1661
+ try {
1662
+ if (!await isPortOccupied(hostname, port)) return DevServerStatus.NOT_RUNNING;
1663
+ const statusResponse = await fetch(`${devServerUrl}/status`);
1664
+ return await statusResponse.text() === "packager-status:running" && statusResponse.headers.get("X-React-Native-Project-Root") === projectRoot ? DevServerStatus.MATCHED_SERVER_RUNNING : DevServerStatus.PORT_TAKEN;
1665
+ } catch {
1666
+ return DevServerStatus.UNKNOWN;
1667
+ }
1668
+ }
1669
+ async function isPortOccupied(host, port) {
1670
+ let result = false;
1671
+ const server = node_http.default.createServer();
1672
+ return new Promise((resolve, reject) => {
1673
+ server.once("error", (error) => {
1674
+ server.close();
1675
+ if (error.code === "EADDRINUSE") result = true;
1676
+ else reject(error);
1677
+ });
1678
+ server.once("listening", () => {
1679
+ result = false;
1680
+ server.close();
1681
+ });
1682
+ server.once("close", () => resolve(result));
1683
+ server.listen({
1684
+ host,
1685
+ port
1686
+ });
1687
+ });
1688
+ }
1689
+
1690
+ //#endregion
1691
+ //#region src/utils/bundle.ts
1692
+ function getBaseBundleName(name) {
1693
+ return name.replace(/^\//, "").replace(/\.bundle$/, "");
1694
+ }
1695
+
1696
+ //#endregion
1697
+ //#region src/utils/config.ts
1698
+ function bindReporter(config, eventSource) {
1699
+ const originalReporter = config.reporter;
1700
+ config.reporter = { update(event) {
1701
+ switch (event.type) {
1702
+ case "bundle_build_started":
1703
+ eventSource.emit("buildStart");
1704
+ break;
1705
+ case "bundle_build_done":
1706
+ eventSource.emit("buildDone");
1707
+ break;
1708
+ case "bundle_build_failed":
1709
+ eventSource.emit("buildFailed", event.error);
1710
+ break;
1711
+ case "transform":
1712
+ eventSource.emit("transform", event.id, event.totalModules, event.transformedModules);
1713
+ break;
1714
+ case "watch_change":
1715
+ eventSource.emit("watchChange", event.id);
1716
+ break;
1717
+ }
1718
+ originalReporter.update(event);
1719
+ } };
1720
+ return config;
1721
+ }
1722
+
1723
+ //#endregion
1724
+ //#region src/utils/promise.ts
1725
+ function taskHandler() {
1726
+ let resolver;
1727
+ let rejector;
1728
+ return {
1729
+ task: new Promise((resolve, reject) => {
1730
+ resolver = resolve;
1731
+ rejector = reject;
1732
+ }),
1733
+ resolve: () => resolver?.(void 0),
1734
+ reject: (reason) => rejector?.(reason)
1735
+ };
1736
+ }
1737
+
1738
+ //#endregion
1739
+ //#region src/utils/source-map.ts
1740
+ function replaceSourceMappingURL(code, sourceMappingURL) {
1741
+ const marker = "//# sourceMappingURL=";
1742
+ const lastIndex = code.lastIndexOf(marker);
1743
+ if (lastIndex === -1) return code;
1744
+ let endIndex = code.indexOf("\n", lastIndex);
1745
+ if (endIndex === -1) endIndex = code.length;
1746
+ return [
1747
+ code.slice(0, lastIndex),
1748
+ `${marker}${sourceMappingURL}`,
1749
+ code.slice(endIndex)
1750
+ ].join("");
1751
+ }
1752
+
1753
+ //#endregion
1754
+ //#region src/server/bundle.ts
1755
+ var InMemoryBundle = class {
1756
+ lazySourceMapConsumer = null;
1757
+ constructor(_code, _sourceMap, sourceMappingURL) {
1758
+ this._code = _code;
1759
+ this._sourceMap = _sourceMap;
1760
+ this._code = replaceSourceMappingURL(this._code, sourceMappingURL);
1761
+ }
1762
+ get code() {
1763
+ return this._code;
1764
+ }
1765
+ get sourceMap() {
1766
+ return this._sourceMap;
1767
+ }
1768
+ get sourceMapConsumer() {
1769
+ (0, es_toolkit.invariant)(this._sourceMap, "Source map is not available");
1770
+ if (this.lazySourceMapConsumer == null) this.lazySourceMapConsumer = new source_map.SourceMapConsumer(this._sourceMap);
1771
+ return this.lazySourceMapConsumer;
1772
+ }
1773
+ };
1774
+
1775
+ //#endregion
1776
+ //#region src/server/bundler-pool.ts
1777
+ var BundlerDevEngine = class extends node_events.default {
1778
+ initializeHandle;
1779
+ _id;
1780
+ bundle = null;
1781
+ _devEngine = null;
1782
+ _state = "idle";
1783
+ constructor(options, config, buildOptions) {
1784
+ super();
1785
+ this.options = options;
1786
+ this.config = config;
1787
+ this.buildOptions = buildOptions;
1788
+ this._id = Bundler.createId(config, buildOptions);
1789
+ this.initializeHandle = taskHandler();
1790
+ this.initialize();
1791
+ }
1792
+ get id() {
1793
+ return this._id;
1794
+ }
1795
+ get devEngine() {
1796
+ (0, es_toolkit.invariant)(this._devEngine, "DevEngine is not initialized");
1797
+ return this._devEngine;
1798
+ }
1799
+ get ensureInitialized() {
1800
+ return this.initializeHandle.task;
1801
+ }
1802
+ get sourceMappingURL() {
1803
+ const { host, port } = this.options.server;
1804
+ const { platform, dev: dev$1 } = this.buildOptions;
1805
+ const [name] = this.config.entry.split(".");
1806
+ return `http://${host}:${port}/${name}.bundle.map?platform=${platform}&dev=${dev$1}`;
1807
+ }
1808
+ async initialize() {
1809
+ if (this._state !== "idle" || this._devEngine != null) return this;
1810
+ this._state = "initializing";
1811
+ const devEngine = await Bundler.devEngine(bindReporter(this.config, this), this.buildOptions, {
1812
+ host: this.options.server.host,
1813
+ port: this.options.server.port,
1814
+ onHmrUpdates: (errorOrResult) => {
1815
+ if (errorOrResult instanceof Error) logger.error("Failed to handle HMR updates", {
1816
+ bundlerId: this.id,
1817
+ error: errorOrResult
1818
+ });
1819
+ else {
1820
+ logger.trace("Detected changed files", {
1821
+ bundlerId: this.id,
1822
+ changedFiles: errorOrResult.changedFiles
1823
+ });
1824
+ this.emit("hmrUpdates", errorOrResult.updates);
1825
+ }
1826
+ },
1827
+ onOutput: (errorOrResult) => {
1828
+ if (errorOrResult instanceof Error) logger.error("Failed to build bundle", {
1829
+ bundlerId: this.id,
1830
+ error: errorOrResult
1831
+ });
1832
+ else {
1833
+ const output = errorOrResult.output[0];
1834
+ const sourceMap = output.map?.toString();
1835
+ this.bundle = new InMemoryBundle(output.code, sourceMap, this.sourceMappingURL);
1836
+ logger.debug("Build completed", {
1837
+ bundlerId: this.id,
1838
+ bundleName: output.name
1839
+ });
1840
+ }
1841
+ },
1842
+ rebuildStrategy: "auto",
1843
+ watch: this.config.watcher
1844
+ });
1845
+ await devEngine.run();
1846
+ this._devEngine = devEngine;
1847
+ this._state = "ready";
1848
+ this.initializeHandle.resolve();
1849
+ }
1850
+ async getBundle() {
1851
+ await this.ensureInitialized;
1852
+ if ((await this.devEngine.getBundleState()).hasStaleOutput || this.bundle == null) await this.devEngine.ensureLatestBuildOutput();
1853
+ (0, es_toolkit.invariant)(this.bundle, "Bundle is not available");
1854
+ return this.bundle;
1855
+ }
1856
+ };
1857
+ var BundlerPool = class BundlerPool {
1858
+ static instances = /* @__PURE__ */ new Map();
1859
+ constructor(config, resolvedServerOptions) {
1860
+ this.config = config;
1861
+ this.resolvedServerOptions = resolvedServerOptions;
1862
+ }
1863
+ instanceKey(bundleName, buildOptions) {
1864
+ return `${bundleName}-${Bundler.createId(this.config, buildOptions)}`;
1865
+ }
1866
+ get(bundleName, buildOptions) {
1867
+ const key = this.instanceKey(getBaseBundleName(bundleName), buildOptions);
1868
+ const instance = BundlerPool.instances.get(key);
1869
+ if (instance) return instance;
1870
+ else {
1871
+ logger.debug("Preparing new bundler instance", {
1872
+ bundleName,
1873
+ key
1874
+ });
1875
+ const instance$1 = new BundlerDevEngine({ server: this.resolvedServerOptions }, this.config, buildOptions);
1876
+ logger.debug("Setting new bundler instance", { key });
1877
+ BundlerPool.instances.set(key, instance$1);
1878
+ return instance$1;
1879
+ }
1880
+ }
1881
+ };
1882
+
1883
+ //#endregion
1884
+ //#region src/server/constants.ts
1885
+ const DEFAULT_PORT = 8081;
1886
+ const DEFAULT_HOST = "localhost";
1887
+
1888
+ //#endregion
1889
+ //#region src/server/error.ts
1890
+ function errorHandler(error, request, reply) {
1891
+ logger.error(`An error occurred while processing the request (${request.method} ${request.url}):`, error.message);
1892
+ logger.debug(error);
1893
+ reply.status(500).send("Internal Server Error");
1894
+ }
1895
+
1896
+ //#endregion
1897
+ //#region src/server/middlewares/serve-assets.ts
1898
+ const queryParamSchema = (0, json_schema_to_ts.asConst)({
1899
+ type: "object",
1900
+ properties: {
1901
+ platform: { type: "string" },
1902
+ hash: { type: "string" }
1903
+ },
1904
+ required: ["platform"]
1905
+ });
1906
+ const plugin$2 = (0, fastify_plugin.default)((fastify$1, options) => {
1907
+ const { projectRoot, host, port, https, preferNativePlatform } = options;
1908
+ const baseUrl = https ? `https://${host}:${port}` : `http://${host}:${port}`;
1909
+ function resolveAsset(asset) {
1910
+ return node_path.default.resolve(projectRoot, asset);
1911
+ }
1912
+ fastify$1.get(`/${_rollipop_common.DEV_SERVER_ASSET_PATH}/*`, {
1913
+ schema: { querystring: queryParamSchema },
1914
+ async handler(request, reply) {
1915
+ const { url: url$5, query } = request;
1916
+ const { pathname } = new URL(url$5, baseUrl);
1917
+ const assetPath = resolveAsset(pathname.replace(/* @__PURE__ */ new RegExp(`^/${_rollipop_common.DEV_SERVER_ASSET_PATH}/?`), ""));
1918
+ let handle = null;
1919
+ try {
1920
+ handle = await node_fs.default.promises.open(resolveAssetPath(assetPath, {
1921
+ platform: query.platform,
1922
+ preferNativePlatform
1923
+ }, 1), "r");
1924
+ const assetData = await handle.readFile();
1925
+ const { size } = await handle.stat();
1926
+ await reply.header("Content-Type", mime.default.getType(assetPath) ?? "").header("Content-Length", size).send(assetData);
1927
+ } catch (error) {
1928
+ fastify$1.log.error(error, "Failed to serve asset (scale assets resolving is not implemented yet)");
1929
+ await reply.status(500).send();
1930
+ } finally {
1931
+ await handle?.close();
1932
+ }
1933
+ }
1934
+ });
1935
+ }, { name: "serve-assets" });
1936
+
1937
+ //#endregion
1938
+ //#region src/utils/response.ts
1939
+ var BundleResponse = class BundleResponse {
1940
+ static CRLF = "\r\n";
1941
+ static THROTTLE_DELAY = 10;
1942
+ done = 0;
1943
+ total = 0;
1944
+ boundary;
1945
+ throttleTimer = null;
1946
+ constructor(reply) {
1947
+ this.reply = reply;
1948
+ const boundary = performance.now().toString();
1949
+ this.boundary = boundary;
1950
+ this.reply.raw.writeHead(200, { "Content-Type": `multipart/mixed; boundary="${boundary}"` });
1951
+ }
1952
+ writeChunk(data, headers, end = false) {
1953
+ if (this.reply.raw.writableEnded) return;
1954
+ const CRLF = BundleResponse.CRLF;
1955
+ this.reply.raw.write(`${CRLF}--${this.boundary}${CRLF}`);
1956
+ this.reply.raw.write(Object.entries(headers).map(([key, value]) => `${key}: ${value}`).join(CRLF) + CRLF + CRLF);
1957
+ if (data) this.reply.raw.write(data);
1958
+ if (end) {
1959
+ this.reply.raw.write(`${CRLF}--${this.boundary}--${CRLF}`);
1960
+ this.reply.raw.end();
1961
+ }
1962
+ }
1963
+ /**
1964
+ * Sample
1965
+ *
1966
+ * ```
1967
+ * --boundary
1968
+ *
1969
+ * Content-Type: application/json
1970
+ *
1971
+ * {"done":10,"total":100}
1972
+ * ```
1973
+ */
1974
+ writeBundleState(done, total) {
1975
+ const previousProgress = this.done / this.total;
1976
+ const currentProgress = done / total;
1977
+ this.done = done;
1978
+ this.total = total;
1979
+ if (total < 10 || this.throttleTimer != null || previousProgress >= currentProgress) return;
1980
+ this.writeChunk(JSON.stringify({
1981
+ done,
1982
+ total
1983
+ }), { "Content-Type": "application/json" });
1984
+ this.throttleTimer = setTimeout(() => {
1985
+ this.throttleTimer = null;
1986
+ }, BundleResponse.THROTTLE_DELAY);
1987
+ }
1988
+ /**
1989
+ * Sample
1990
+ *
1991
+ * ```
1992
+ * --boundary
1993
+ *
1994
+ * X-Metro-Files-Changed-Count: 0
1995
+ * Content-Type: application/json
1996
+ * Content-Length: 100
1997
+ * Last-Modified: Thu, 10 Aug 2023 12:00:00 GMT
1998
+ *
1999
+ * <bundle result>
2000
+ * ```
2001
+ */
2002
+ endWithBundle(bundle) {
2003
+ this.writeChunk(JSON.stringify({
2004
+ done: this.total,
2005
+ total: this.total
2006
+ }), { "Content-Type": "application/json" });
2007
+ this.writeChunk(bundle, {
2008
+ "X-Metro-Files-Changed-Count": String(0),
2009
+ "Content-Type": "application/javascript; charset=UTF-8",
2010
+ "Content-Length": String(Buffer.byteLength(bundle)),
2011
+ "Last-Modified": (/* @__PURE__ */ new Date()).toUTCString()
2012
+ }, true);
2013
+ }
2014
+ endWithError(error) {
2015
+ const errorData = JSON.stringify({
2016
+ type: error?.name ?? "InternalError",
2017
+ message: error?.message ?? "internal error",
2018
+ errors: []
2019
+ });
2020
+ this.writeChunk(errorData, {
2021
+ "Content-Type": "application/json",
2022
+ "X-Http-Status": "500"
2023
+ }, true);
2024
+ }
2025
+ };
2026
+
2027
+ //#endregion
2028
+ //#region src/server/common/schema.ts
2029
+ const bundleRequestSchema = (0, json_schema_to_ts.asConst)({
2030
+ type: "object",
2031
+ properties: {
2032
+ platform: { type: "string" },
2033
+ app: { type: "string" },
2034
+ dev: { type: "boolean" },
2035
+ minify: { type: "boolean" },
2036
+ runModule: { type: "boolean" },
2037
+ inlineSourceMap: { type: "boolean" },
2038
+ modulesOnly: { type: "boolean" }
2039
+ },
2040
+ required: ["platform"]
2041
+ });
2042
+ const validateBundleRequest = new ajv.default().compile(bundleRequestSchema);
2043
+
2044
+ //#endregion
2045
+ //#region src/server/middlewares/serve-bundle.ts
2046
+ const routeParamSchema = (0, json_schema_to_ts.asConst)({
2047
+ type: "object",
2048
+ properties: { name: { type: "string" } }
2049
+ });
2050
+ const plugin$1 = (0, fastify_plugin.default)((fastify$1, options) => {
2051
+ const { getBundler } = options;
2052
+ fastify$1.get("/:name.bundle", {
2053
+ schema: {
2054
+ params: routeParamSchema,
2055
+ querystring: bundleRequestSchema
2056
+ },
2057
+ async handler(request, reply) {
2058
+ const { params, query: buildOptions, headers: { accept } } = request;
2059
+ if (!params.name) {
2060
+ await reply.status(400).send("invalid bundle name");
2061
+ return;
2062
+ }
2063
+ const bundler = getBundler(params.name, buildOptions);
2064
+ if (accept?.includes("multipart/mixed") ?? false) {
2065
+ const bundleResponse = new BundleResponse(reply);
2066
+ const transformHandler = (_id, totalModules = 0, transformedModules) => {
2067
+ bundleResponse.writeBundleState(transformedModules, totalModules);
2068
+ };
2069
+ bundler.on("transform", transformHandler);
2070
+ await bundler.getBundle().then((bundle) => bundleResponse.endWithBundle(bundle.code)).catch((error) => {
2071
+ bundleResponse.endWithError(error);
2072
+ throw error;
2073
+ }).finally(() => bundler.off("transform", transformHandler));
2074
+ } else {
2075
+ this.log.debug(`client is not support multipart/mixed content: ${accept ?? "<empty>"}`);
2076
+ const code = (await bundler.getBundle()).code;
2077
+ await reply.header("Content-Type", "application/javascript").header("Content-Length", Buffer.byteLength(code)).status(200).send(code);
2078
+ }
2079
+ }
2080
+ });
2081
+ fastify$1.get("/:name.map", {
2082
+ schema: {
2083
+ params: routeParamSchema,
2084
+ querystring: bundleRequestSchema
2085
+ },
2086
+ async handler(request, reply) {
2087
+ const { params, query: buildOptions } = request;
2088
+ if (!params.name) {
2089
+ await reply.status(400).send("invalid bundle name");
2090
+ return;
2091
+ }
2092
+ const sourceMap = (await getBundler(params.name, buildOptions).getBundle()).sourceMap;
2093
+ (0, es_toolkit.invariant)(sourceMap, "Source map is not available");
2094
+ await reply.header("Access-Control-Allow-Origin", "devtools://devtools").header("Content-Type", "application/json").header("Content-Length", Buffer.byteLength(sourceMap)).status(200).send(sourceMap);
2095
+ }
2096
+ });
2097
+ }, { name: "serve-bundle" });
2098
+
2099
+ //#endregion
2100
+ //#region node_modules/picocolors/picocolors.js
2101
+ var require_picocolors = /* @__PURE__ */ __commonJSMin(((exports, module) => {
2102
+ let p = process || {}, argv = p.argv || [], env = p.env || {};
2103
+ let isColorSupported = !(!!env.NO_COLOR || argv.includes("--no-color")) && (!!env.FORCE_COLOR || argv.includes("--color") || p.platform === "win32" || (p.stdout || {}).isTTY && env.TERM !== "dumb" || !!env.CI);
2104
+ let formatter = (open, close, replace = open) => (input) => {
2105
+ let string = "" + input, index = string.indexOf(close, open.length);
2106
+ return ~index ? open + replaceClose(string, close, replace, index) + close : open + string + close;
2107
+ };
2108
+ let replaceClose = (string, close, replace, index) => {
2109
+ let result = "", cursor = 0;
2110
+ do {
2111
+ result += string.substring(cursor, index) + replace;
2112
+ cursor = index + close.length;
2113
+ index = string.indexOf(close, cursor);
2114
+ } while (~index);
2115
+ return result + string.substring(cursor);
2116
+ };
2117
+ let createColors = (enabled = isColorSupported) => {
2118
+ let f = enabled ? formatter : () => String;
2119
+ return {
2120
+ isColorSupported: enabled,
2121
+ reset: f("\x1B[0m", "\x1B[0m"),
2122
+ bold: f("\x1B[1m", "\x1B[22m", "\x1B[22m\x1B[1m"),
2123
+ dim: f("\x1B[2m", "\x1B[22m", "\x1B[22m\x1B[2m"),
2124
+ italic: f("\x1B[3m", "\x1B[23m"),
2125
+ underline: f("\x1B[4m", "\x1B[24m"),
2126
+ inverse: f("\x1B[7m", "\x1B[27m"),
2127
+ hidden: f("\x1B[8m", "\x1B[28m"),
2128
+ strikethrough: f("\x1B[9m", "\x1B[29m"),
2129
+ black: f("\x1B[30m", "\x1B[39m"),
2130
+ red: f("\x1B[31m", "\x1B[39m"),
2131
+ green: f("\x1B[32m", "\x1B[39m"),
2132
+ yellow: f("\x1B[33m", "\x1B[39m"),
2133
+ blue: f("\x1B[34m", "\x1B[39m"),
2134
+ magenta: f("\x1B[35m", "\x1B[39m"),
2135
+ cyan: f("\x1B[36m", "\x1B[39m"),
2136
+ white: f("\x1B[37m", "\x1B[39m"),
2137
+ gray: f("\x1B[90m", "\x1B[39m"),
2138
+ bgBlack: f("\x1B[40m", "\x1B[49m"),
2139
+ bgRed: f("\x1B[41m", "\x1B[49m"),
2140
+ bgGreen: f("\x1B[42m", "\x1B[49m"),
2141
+ bgYellow: f("\x1B[43m", "\x1B[49m"),
2142
+ bgBlue: f("\x1B[44m", "\x1B[49m"),
2143
+ bgMagenta: f("\x1B[45m", "\x1B[49m"),
2144
+ bgCyan: f("\x1B[46m", "\x1B[49m"),
2145
+ bgWhite: f("\x1B[47m", "\x1B[49m"),
2146
+ blackBright: f("\x1B[90m", "\x1B[39m"),
2147
+ redBright: f("\x1B[91m", "\x1B[39m"),
2148
+ greenBright: f("\x1B[92m", "\x1B[39m"),
2149
+ yellowBright: f("\x1B[93m", "\x1B[39m"),
2150
+ blueBright: f("\x1B[94m", "\x1B[39m"),
2151
+ magentaBright: f("\x1B[95m", "\x1B[39m"),
2152
+ cyanBright: f("\x1B[96m", "\x1B[39m"),
2153
+ whiteBright: f("\x1B[97m", "\x1B[39m"),
2154
+ bgBlackBright: f("\x1B[100m", "\x1B[49m"),
2155
+ bgRedBright: f("\x1B[101m", "\x1B[49m"),
2156
+ bgGreenBright: f("\x1B[102m", "\x1B[49m"),
2157
+ bgYellowBright: f("\x1B[103m", "\x1B[49m"),
2158
+ bgBlueBright: f("\x1B[104m", "\x1B[49m"),
2159
+ bgMagentaBright: f("\x1B[105m", "\x1B[49m"),
2160
+ bgCyanBright: f("\x1B[106m", "\x1B[49m"),
2161
+ bgWhiteBright: f("\x1B[107m", "\x1B[49m")
2162
+ };
2163
+ };
2164
+ module.exports = createColors();
2165
+ module.exports.createColors = createColors;
2166
+ }));
2167
+
2168
+ //#endregion
2169
+ //#region node_modules/js-tokens/index.js
2170
+ var require_js_tokens = /* @__PURE__ */ __commonJSMin(((exports) => {
2171
+ Object.defineProperty(exports, "__esModule", { value: true });
2172
+ exports.default = /((['"])(?:(?!\2|\\).|\\(?:\r\n|[\s\S]))*(\2)?|`(?:[^`\\$]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{[^}]*\}?)*\}?)*(`)?)|(\/\/.*)|(\/\*(?:[^*]|\*(?!\/))*(\*\/)?)|(\/(?!\*)(?:\[(?:(?![\]\\]).|\\.)*\]|(?![\/\]\\]).|\\.)+\/(?:(?!\s*(?:\b|[\u0080-\uFFFF$\\'"~({]|[+\-!](?!=)|\.?\d))|[gmiyus]{1,6}\b(?![\u0080-\uFFFF$\\]|\s*(?:[+\-*%&|^<>!=?({]|\/(?![\/*])))))|(0[xX][\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\d*\.\d+|\d+\.?)(?:[eE][+-]?\d+)?)|((?!\d)(?:(?!\s)[$\w\u0080-\uFFFF]|\\u[\da-fA-F]{4}|\\u\{[\da-fA-F]+\})+)|(--|\+\+|&&|\|\||=>|\.{3}|(?:[+\-\/%&|^]|\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\](){}])|(\s+)|(^$|[\s\S])/g;
2173
+ exports.matchToToken = function(match) {
2174
+ var token = {
2175
+ type: "invalid",
2176
+ value: match[0],
2177
+ closed: void 0
2178
+ };
2179
+ if (match[1]) token.type = "string", token.closed = !!(match[3] || match[4]);
2180
+ else if (match[5]) token.type = "comment";
2181
+ else if (match[6]) token.type = "comment", token.closed = !!match[7];
2182
+ else if (match[8]) token.type = "regex";
2183
+ else if (match[9]) token.type = "number";
2184
+ else if (match[10]) token.type = "name";
2185
+ else if (match[11]) token.type = "punctuator";
2186
+ else if (match[12]) token.type = "whitespace";
2187
+ return token;
2188
+ };
2189
+ }));
2190
+
2191
+ //#endregion
2192
+ //#region node_modules/@babel/helper-validator-identifier/lib/identifier.js
2193
+ var require_identifier = /* @__PURE__ */ __commonJSMin(((exports) => {
2194
+ Object.defineProperty(exports, "__esModule", { value: true });
2195
+ exports.isIdentifierChar = isIdentifierChar;
2196
+ exports.isIdentifierName = isIdentifierName;
2197
+ exports.isIdentifierStart = isIdentifierStart;
2198
+ let nonASCIIidentifierStartChars = "ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࡰ-ࢇࢉ-࢏ࢠ-ࣉऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚ౜ౝౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽ೜-ೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜑᜟ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭌᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲊᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-Ƛ꟱-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼA-Za-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ";
2199
+ let nonASCIIidentifierChars = "·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛ࢗ-࢟࣊-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄ఼ా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ೳഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-໎໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜕ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠏-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿ-᫝᫠-᫫ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷿‌‍‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯・꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏0-9_・";
2200
+ const nonASCIIidentifierStart = /* @__PURE__ */ new RegExp("[" + nonASCIIidentifierStartChars + "]");
2201
+ const nonASCIIidentifier = /* @__PURE__ */ new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
2202
+ nonASCIIidentifierStartChars = nonASCIIidentifierChars = null;
2203
+ const astralIdentifierStartCodes = [
2204
+ 0,
2205
+ 11,
2206
+ 2,
2207
+ 25,
2208
+ 2,
2209
+ 18,
2210
+ 2,
2211
+ 1,
2212
+ 2,
2213
+ 14,
2214
+ 3,
2215
+ 13,
2216
+ 35,
2217
+ 122,
2218
+ 70,
2219
+ 52,
2220
+ 268,
2221
+ 28,
2222
+ 4,
2223
+ 48,
2224
+ 48,
2225
+ 31,
2226
+ 14,
2227
+ 29,
2228
+ 6,
2229
+ 37,
2230
+ 11,
2231
+ 29,
2232
+ 3,
2233
+ 35,
2234
+ 5,
2235
+ 7,
2236
+ 2,
2237
+ 4,
2238
+ 43,
2239
+ 157,
2240
+ 19,
2241
+ 35,
2242
+ 5,
2243
+ 35,
2244
+ 5,
2245
+ 39,
2246
+ 9,
2247
+ 51,
2248
+ 13,
2249
+ 10,
2250
+ 2,
2251
+ 14,
2252
+ 2,
2253
+ 6,
2254
+ 2,
2255
+ 1,
2256
+ 2,
2257
+ 10,
2258
+ 2,
2259
+ 14,
2260
+ 2,
2261
+ 6,
2262
+ 2,
2263
+ 1,
2264
+ 4,
2265
+ 51,
2266
+ 13,
2267
+ 310,
2268
+ 10,
2269
+ 21,
2270
+ 11,
2271
+ 7,
2272
+ 25,
2273
+ 5,
2274
+ 2,
2275
+ 41,
2276
+ 2,
2277
+ 8,
2278
+ 70,
2279
+ 5,
2280
+ 3,
2281
+ 0,
2282
+ 2,
2283
+ 43,
2284
+ 2,
2285
+ 1,
2286
+ 4,
2287
+ 0,
2288
+ 3,
2289
+ 22,
2290
+ 11,
2291
+ 22,
2292
+ 10,
2293
+ 30,
2294
+ 66,
2295
+ 18,
2296
+ 2,
2297
+ 1,
2298
+ 11,
2299
+ 21,
2300
+ 11,
2301
+ 25,
2302
+ 7,
2303
+ 25,
2304
+ 39,
2305
+ 55,
2306
+ 7,
2307
+ 1,
2308
+ 65,
2309
+ 0,
2310
+ 16,
2311
+ 3,
2312
+ 2,
2313
+ 2,
2314
+ 2,
2315
+ 28,
2316
+ 43,
2317
+ 28,
2318
+ 4,
2319
+ 28,
2320
+ 36,
2321
+ 7,
2322
+ 2,
2323
+ 27,
2324
+ 28,
2325
+ 53,
2326
+ 11,
2327
+ 21,
2328
+ 11,
2329
+ 18,
2330
+ 14,
2331
+ 17,
2332
+ 111,
2333
+ 72,
2334
+ 56,
2335
+ 50,
2336
+ 14,
2337
+ 50,
2338
+ 14,
2339
+ 35,
2340
+ 39,
2341
+ 27,
2342
+ 10,
2343
+ 22,
2344
+ 251,
2345
+ 41,
2346
+ 7,
2347
+ 1,
2348
+ 17,
2349
+ 5,
2350
+ 57,
2351
+ 28,
2352
+ 11,
2353
+ 0,
2354
+ 9,
2355
+ 21,
2356
+ 43,
2357
+ 17,
2358
+ 47,
2359
+ 20,
2360
+ 28,
2361
+ 22,
2362
+ 13,
2363
+ 52,
2364
+ 58,
2365
+ 1,
2366
+ 3,
2367
+ 0,
2368
+ 14,
2369
+ 44,
2370
+ 33,
2371
+ 24,
2372
+ 27,
2373
+ 35,
2374
+ 30,
2375
+ 0,
2376
+ 3,
2377
+ 0,
2378
+ 9,
2379
+ 34,
2380
+ 4,
2381
+ 0,
2382
+ 13,
2383
+ 47,
2384
+ 15,
2385
+ 3,
2386
+ 22,
2387
+ 0,
2388
+ 2,
2389
+ 0,
2390
+ 36,
2391
+ 17,
2392
+ 2,
2393
+ 24,
2394
+ 20,
2395
+ 1,
2396
+ 64,
2397
+ 6,
2398
+ 2,
2399
+ 0,
2400
+ 2,
2401
+ 3,
2402
+ 2,
2403
+ 14,
2404
+ 2,
2405
+ 9,
2406
+ 8,
2407
+ 46,
2408
+ 39,
2409
+ 7,
2410
+ 3,
2411
+ 1,
2412
+ 3,
2413
+ 21,
2414
+ 2,
2415
+ 6,
2416
+ 2,
2417
+ 1,
2418
+ 2,
2419
+ 4,
2420
+ 4,
2421
+ 0,
2422
+ 19,
2423
+ 0,
2424
+ 13,
2425
+ 4,
2426
+ 31,
2427
+ 9,
2428
+ 2,
2429
+ 0,
2430
+ 3,
2431
+ 0,
2432
+ 2,
2433
+ 37,
2434
+ 2,
2435
+ 0,
2436
+ 26,
2437
+ 0,
2438
+ 2,
2439
+ 0,
2440
+ 45,
2441
+ 52,
2442
+ 19,
2443
+ 3,
2444
+ 21,
2445
+ 2,
2446
+ 31,
2447
+ 47,
2448
+ 21,
2449
+ 1,
2450
+ 2,
2451
+ 0,
2452
+ 185,
2453
+ 46,
2454
+ 42,
2455
+ 3,
2456
+ 37,
2457
+ 47,
2458
+ 21,
2459
+ 0,
2460
+ 60,
2461
+ 42,
2462
+ 14,
2463
+ 0,
2464
+ 72,
2465
+ 26,
2466
+ 38,
2467
+ 6,
2468
+ 186,
2469
+ 43,
2470
+ 117,
2471
+ 63,
2472
+ 32,
2473
+ 7,
2474
+ 3,
2475
+ 0,
2476
+ 3,
2477
+ 7,
2478
+ 2,
2479
+ 1,
2480
+ 2,
2481
+ 23,
2482
+ 16,
2483
+ 0,
2484
+ 2,
2485
+ 0,
2486
+ 95,
2487
+ 7,
2488
+ 3,
2489
+ 38,
2490
+ 17,
2491
+ 0,
2492
+ 2,
2493
+ 0,
2494
+ 29,
2495
+ 0,
2496
+ 11,
2497
+ 39,
2498
+ 8,
2499
+ 0,
2500
+ 22,
2501
+ 0,
2502
+ 12,
2503
+ 45,
2504
+ 20,
2505
+ 0,
2506
+ 19,
2507
+ 72,
2508
+ 200,
2509
+ 32,
2510
+ 32,
2511
+ 8,
2512
+ 2,
2513
+ 36,
2514
+ 18,
2515
+ 0,
2516
+ 50,
2517
+ 29,
2518
+ 113,
2519
+ 6,
2520
+ 2,
2521
+ 1,
2522
+ 2,
2523
+ 37,
2524
+ 22,
2525
+ 0,
2526
+ 26,
2527
+ 5,
2528
+ 2,
2529
+ 1,
2530
+ 2,
2531
+ 31,
2532
+ 15,
2533
+ 0,
2534
+ 24,
2535
+ 43,
2536
+ 261,
2537
+ 18,
2538
+ 16,
2539
+ 0,
2540
+ 2,
2541
+ 12,
2542
+ 2,
2543
+ 33,
2544
+ 125,
2545
+ 0,
2546
+ 80,
2547
+ 921,
2548
+ 103,
2549
+ 110,
2550
+ 18,
2551
+ 195,
2552
+ 2637,
2553
+ 96,
2554
+ 16,
2555
+ 1071,
2556
+ 18,
2557
+ 5,
2558
+ 26,
2559
+ 3994,
2560
+ 6,
2561
+ 582,
2562
+ 6842,
2563
+ 29,
2564
+ 1763,
2565
+ 568,
2566
+ 8,
2567
+ 30,
2568
+ 18,
2569
+ 78,
2570
+ 18,
2571
+ 29,
2572
+ 19,
2573
+ 47,
2574
+ 17,
2575
+ 3,
2576
+ 32,
2577
+ 20,
2578
+ 6,
2579
+ 18,
2580
+ 433,
2581
+ 44,
2582
+ 212,
2583
+ 63,
2584
+ 33,
2585
+ 24,
2586
+ 3,
2587
+ 24,
2588
+ 45,
2589
+ 74,
2590
+ 6,
2591
+ 0,
2592
+ 67,
2593
+ 12,
2594
+ 65,
2595
+ 1,
2596
+ 2,
2597
+ 0,
2598
+ 15,
2599
+ 4,
2600
+ 10,
2601
+ 7381,
2602
+ 42,
2603
+ 31,
2604
+ 98,
2605
+ 114,
2606
+ 8702,
2607
+ 3,
2608
+ 2,
2609
+ 6,
2610
+ 2,
2611
+ 1,
2612
+ 2,
2613
+ 290,
2614
+ 16,
2615
+ 0,
2616
+ 30,
2617
+ 2,
2618
+ 3,
2619
+ 0,
2620
+ 15,
2621
+ 3,
2622
+ 9,
2623
+ 395,
2624
+ 2309,
2625
+ 106,
2626
+ 6,
2627
+ 12,
2628
+ 4,
2629
+ 8,
2630
+ 8,
2631
+ 9,
2632
+ 5991,
2633
+ 84,
2634
+ 2,
2635
+ 70,
2636
+ 2,
2637
+ 1,
2638
+ 3,
2639
+ 0,
2640
+ 3,
2641
+ 1,
2642
+ 3,
2643
+ 3,
2644
+ 2,
2645
+ 11,
2646
+ 2,
2647
+ 0,
2648
+ 2,
2649
+ 6,
2650
+ 2,
2651
+ 64,
2652
+ 2,
2653
+ 3,
2654
+ 3,
2655
+ 7,
2656
+ 2,
2657
+ 6,
2658
+ 2,
2659
+ 27,
2660
+ 2,
2661
+ 3,
2662
+ 2,
2663
+ 4,
2664
+ 2,
2665
+ 0,
2666
+ 4,
2667
+ 6,
2668
+ 2,
2669
+ 339,
2670
+ 3,
2671
+ 24,
2672
+ 2,
2673
+ 24,
2674
+ 2,
2675
+ 30,
2676
+ 2,
2677
+ 24,
2678
+ 2,
2679
+ 30,
2680
+ 2,
2681
+ 24,
2682
+ 2,
2683
+ 30,
2684
+ 2,
2685
+ 24,
2686
+ 2,
2687
+ 30,
2688
+ 2,
2689
+ 24,
2690
+ 2,
2691
+ 7,
2692
+ 1845,
2693
+ 30,
2694
+ 7,
2695
+ 5,
2696
+ 262,
2697
+ 61,
2698
+ 147,
2699
+ 44,
2700
+ 11,
2701
+ 6,
2702
+ 17,
2703
+ 0,
2704
+ 322,
2705
+ 29,
2706
+ 19,
2707
+ 43,
2708
+ 485,
2709
+ 27,
2710
+ 229,
2711
+ 29,
2712
+ 3,
2713
+ 0,
2714
+ 208,
2715
+ 30,
2716
+ 2,
2717
+ 2,
2718
+ 2,
2719
+ 1,
2720
+ 2,
2721
+ 6,
2722
+ 3,
2723
+ 4,
2724
+ 10,
2725
+ 1,
2726
+ 225,
2727
+ 6,
2728
+ 2,
2729
+ 3,
2730
+ 2,
2731
+ 1,
2732
+ 2,
2733
+ 14,
2734
+ 2,
2735
+ 196,
2736
+ 60,
2737
+ 67,
2738
+ 8,
2739
+ 0,
2740
+ 1205,
2741
+ 3,
2742
+ 2,
2743
+ 26,
2744
+ 2,
2745
+ 1,
2746
+ 2,
2747
+ 0,
2748
+ 3,
2749
+ 0,
2750
+ 2,
2751
+ 9,
2752
+ 2,
2753
+ 3,
2754
+ 2,
2755
+ 0,
2756
+ 2,
2757
+ 0,
2758
+ 7,
2759
+ 0,
2760
+ 5,
2761
+ 0,
2762
+ 2,
2763
+ 0,
2764
+ 2,
2765
+ 0,
2766
+ 2,
2767
+ 2,
2768
+ 2,
2769
+ 1,
2770
+ 2,
2771
+ 0,
2772
+ 3,
2773
+ 0,
2774
+ 2,
2775
+ 0,
2776
+ 2,
2777
+ 0,
2778
+ 2,
2779
+ 0,
2780
+ 2,
2781
+ 0,
2782
+ 2,
2783
+ 1,
2784
+ 2,
2785
+ 0,
2786
+ 3,
2787
+ 3,
2788
+ 2,
2789
+ 6,
2790
+ 2,
2791
+ 3,
2792
+ 2,
2793
+ 3,
2794
+ 2,
2795
+ 0,
2796
+ 2,
2797
+ 9,
2798
+ 2,
2799
+ 16,
2800
+ 6,
2801
+ 2,
2802
+ 2,
2803
+ 4,
2804
+ 2,
2805
+ 16,
2806
+ 4421,
2807
+ 42719,
2808
+ 33,
2809
+ 4381,
2810
+ 3,
2811
+ 5773,
2812
+ 3,
2813
+ 7472,
2814
+ 16,
2815
+ 621,
2816
+ 2467,
2817
+ 541,
2818
+ 1507,
2819
+ 4938,
2820
+ 6,
2821
+ 8489
2822
+ ];
2823
+ const astralIdentifierCodes = [
2824
+ 509,
2825
+ 0,
2826
+ 227,
2827
+ 0,
2828
+ 150,
2829
+ 4,
2830
+ 294,
2831
+ 9,
2832
+ 1368,
2833
+ 2,
2834
+ 2,
2835
+ 1,
2836
+ 6,
2837
+ 3,
2838
+ 41,
2839
+ 2,
2840
+ 5,
2841
+ 0,
2842
+ 166,
2843
+ 1,
2844
+ 574,
2845
+ 3,
2846
+ 9,
2847
+ 9,
2848
+ 7,
2849
+ 9,
2850
+ 32,
2851
+ 4,
2852
+ 318,
2853
+ 1,
2854
+ 78,
2855
+ 5,
2856
+ 71,
2857
+ 10,
2858
+ 50,
2859
+ 3,
2860
+ 123,
2861
+ 2,
2862
+ 54,
2863
+ 14,
2864
+ 32,
2865
+ 10,
2866
+ 3,
2867
+ 1,
2868
+ 11,
2869
+ 3,
2870
+ 46,
2871
+ 10,
2872
+ 8,
2873
+ 0,
2874
+ 46,
2875
+ 9,
2876
+ 7,
2877
+ 2,
2878
+ 37,
2879
+ 13,
2880
+ 2,
2881
+ 9,
2882
+ 6,
2883
+ 1,
2884
+ 45,
2885
+ 0,
2886
+ 13,
2887
+ 2,
2888
+ 49,
2889
+ 13,
2890
+ 9,
2891
+ 3,
2892
+ 2,
2893
+ 11,
2894
+ 83,
2895
+ 11,
2896
+ 7,
2897
+ 0,
2898
+ 3,
2899
+ 0,
2900
+ 158,
2901
+ 11,
2902
+ 6,
2903
+ 9,
2904
+ 7,
2905
+ 3,
2906
+ 56,
2907
+ 1,
2908
+ 2,
2909
+ 6,
2910
+ 3,
2911
+ 1,
2912
+ 3,
2913
+ 2,
2914
+ 10,
2915
+ 0,
2916
+ 11,
2917
+ 1,
2918
+ 3,
2919
+ 6,
2920
+ 4,
2921
+ 4,
2922
+ 68,
2923
+ 8,
2924
+ 2,
2925
+ 0,
2926
+ 3,
2927
+ 0,
2928
+ 2,
2929
+ 3,
2930
+ 2,
2931
+ 4,
2932
+ 2,
2933
+ 0,
2934
+ 15,
2935
+ 1,
2936
+ 83,
2937
+ 17,
2938
+ 10,
2939
+ 9,
2940
+ 5,
2941
+ 0,
2942
+ 82,
2943
+ 19,
2944
+ 13,
2945
+ 9,
2946
+ 214,
2947
+ 6,
2948
+ 3,
2949
+ 8,
2950
+ 28,
2951
+ 1,
2952
+ 83,
2953
+ 16,
2954
+ 16,
2955
+ 9,
2956
+ 82,
2957
+ 12,
2958
+ 9,
2959
+ 9,
2960
+ 7,
2961
+ 19,
2962
+ 58,
2963
+ 14,
2964
+ 5,
2965
+ 9,
2966
+ 243,
2967
+ 14,
2968
+ 166,
2969
+ 9,
2970
+ 71,
2971
+ 5,
2972
+ 2,
2973
+ 1,
2974
+ 3,
2975
+ 3,
2976
+ 2,
2977
+ 0,
2978
+ 2,
2979
+ 1,
2980
+ 13,
2981
+ 9,
2982
+ 120,
2983
+ 6,
2984
+ 3,
2985
+ 6,
2986
+ 4,
2987
+ 0,
2988
+ 29,
2989
+ 9,
2990
+ 41,
2991
+ 6,
2992
+ 2,
2993
+ 3,
2994
+ 9,
2995
+ 0,
2996
+ 10,
2997
+ 10,
2998
+ 47,
2999
+ 15,
3000
+ 199,
3001
+ 7,
3002
+ 137,
3003
+ 9,
3004
+ 54,
3005
+ 7,
3006
+ 2,
3007
+ 7,
3008
+ 17,
3009
+ 9,
3010
+ 57,
3011
+ 21,
3012
+ 2,
3013
+ 13,
3014
+ 123,
3015
+ 5,
3016
+ 4,
3017
+ 0,
3018
+ 2,
3019
+ 1,
3020
+ 2,
3021
+ 6,
3022
+ 2,
3023
+ 0,
3024
+ 9,
3025
+ 9,
3026
+ 49,
3027
+ 4,
3028
+ 2,
3029
+ 1,
3030
+ 2,
3031
+ 4,
3032
+ 9,
3033
+ 9,
3034
+ 55,
3035
+ 9,
3036
+ 266,
3037
+ 3,
3038
+ 10,
3039
+ 1,
3040
+ 2,
3041
+ 0,
3042
+ 49,
3043
+ 6,
3044
+ 4,
3045
+ 4,
3046
+ 14,
3047
+ 10,
3048
+ 5350,
3049
+ 0,
3050
+ 7,
3051
+ 14,
3052
+ 11465,
3053
+ 27,
3054
+ 2343,
3055
+ 9,
3056
+ 87,
3057
+ 9,
3058
+ 39,
3059
+ 4,
3060
+ 60,
3061
+ 6,
3062
+ 26,
3063
+ 9,
3064
+ 535,
3065
+ 9,
3066
+ 470,
3067
+ 0,
3068
+ 2,
3069
+ 54,
3070
+ 8,
3071
+ 3,
3072
+ 82,
3073
+ 0,
3074
+ 12,
3075
+ 1,
3076
+ 19628,
3077
+ 1,
3078
+ 4178,
3079
+ 9,
3080
+ 519,
3081
+ 45,
3082
+ 3,
3083
+ 22,
3084
+ 543,
3085
+ 4,
3086
+ 4,
3087
+ 5,
3088
+ 9,
3089
+ 7,
3090
+ 3,
3091
+ 6,
3092
+ 31,
3093
+ 3,
3094
+ 149,
3095
+ 2,
3096
+ 1418,
3097
+ 49,
3098
+ 513,
3099
+ 54,
3100
+ 5,
3101
+ 49,
3102
+ 9,
3103
+ 0,
3104
+ 15,
3105
+ 0,
3106
+ 23,
3107
+ 4,
3108
+ 2,
3109
+ 14,
3110
+ 1361,
3111
+ 6,
3112
+ 2,
3113
+ 16,
3114
+ 3,
3115
+ 6,
3116
+ 2,
3117
+ 1,
3118
+ 2,
3119
+ 4,
3120
+ 101,
3121
+ 0,
3122
+ 161,
3123
+ 6,
3124
+ 10,
3125
+ 9,
3126
+ 357,
3127
+ 0,
3128
+ 62,
3129
+ 13,
3130
+ 499,
3131
+ 13,
3132
+ 245,
3133
+ 1,
3134
+ 2,
3135
+ 9,
3136
+ 233,
3137
+ 0,
3138
+ 3,
3139
+ 0,
3140
+ 8,
3141
+ 1,
3142
+ 6,
3143
+ 0,
3144
+ 475,
3145
+ 6,
3146
+ 110,
3147
+ 6,
3148
+ 6,
3149
+ 9,
3150
+ 4759,
3151
+ 9,
3152
+ 787719,
3153
+ 239
3154
+ ];
3155
+ function isInAstralSet(code, set) {
3156
+ let pos = 65536;
3157
+ for (let i = 0, length = set.length; i < length; i += 2) {
3158
+ pos += set[i];
3159
+ if (pos > code) return false;
3160
+ pos += set[i + 1];
3161
+ if (pos >= code) return true;
3162
+ }
3163
+ return false;
3164
+ }
3165
+ function isIdentifierStart(code) {
3166
+ if (code < 65) return code === 36;
3167
+ if (code <= 90) return true;
3168
+ if (code < 97) return code === 95;
3169
+ if (code <= 122) return true;
3170
+ if (code <= 65535) return code >= 170 && nonASCIIidentifierStart.test(String.fromCharCode(code));
3171
+ return isInAstralSet(code, astralIdentifierStartCodes);
3172
+ }
3173
+ function isIdentifierChar(code) {
3174
+ if (code < 48) return code === 36;
3175
+ if (code < 58) return true;
3176
+ if (code < 65) return false;
3177
+ if (code <= 90) return true;
3178
+ if (code < 97) return code === 95;
3179
+ if (code <= 122) return true;
3180
+ if (code <= 65535) return code >= 170 && nonASCIIidentifier.test(String.fromCharCode(code));
3181
+ return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes);
3182
+ }
3183
+ function isIdentifierName(name) {
3184
+ let isFirst = true;
3185
+ for (let i = 0; i < name.length; i++) {
3186
+ let cp = name.charCodeAt(i);
3187
+ if ((cp & 64512) === 55296 && i + 1 < name.length) {
3188
+ const trail = name.charCodeAt(++i);
3189
+ if ((trail & 64512) === 56320) cp = 65536 + ((cp & 1023) << 10) + (trail & 1023);
3190
+ }
3191
+ if (isFirst) {
3192
+ isFirst = false;
3193
+ if (!isIdentifierStart(cp)) return false;
3194
+ } else if (!isIdentifierChar(cp)) return false;
3195
+ }
3196
+ return !isFirst;
3197
+ }
3198
+ }));
3199
+
3200
+ //#endregion
3201
+ //#region node_modules/@babel/helper-validator-identifier/lib/keyword.js
3202
+ var require_keyword = /* @__PURE__ */ __commonJSMin(((exports) => {
3203
+ Object.defineProperty(exports, "__esModule", { value: true });
3204
+ exports.isKeyword = isKeyword;
3205
+ exports.isReservedWord = isReservedWord;
3206
+ exports.isStrictBindOnlyReservedWord = isStrictBindOnlyReservedWord;
3207
+ exports.isStrictBindReservedWord = isStrictBindReservedWord;
3208
+ exports.isStrictReservedWord = isStrictReservedWord;
3209
+ const reservedWords = {
3210
+ keyword: [
3211
+ "break",
3212
+ "case",
3213
+ "catch",
3214
+ "continue",
3215
+ "debugger",
3216
+ "default",
3217
+ "do",
3218
+ "else",
3219
+ "finally",
3220
+ "for",
3221
+ "function",
3222
+ "if",
3223
+ "return",
3224
+ "switch",
3225
+ "throw",
3226
+ "try",
3227
+ "var",
3228
+ "const",
3229
+ "while",
3230
+ "with",
3231
+ "new",
3232
+ "this",
3233
+ "super",
3234
+ "class",
3235
+ "extends",
3236
+ "export",
3237
+ "import",
3238
+ "null",
3239
+ "true",
3240
+ "false",
3241
+ "in",
3242
+ "instanceof",
3243
+ "typeof",
3244
+ "void",
3245
+ "delete"
3246
+ ],
3247
+ strict: [
3248
+ "implements",
3249
+ "interface",
3250
+ "let",
3251
+ "package",
3252
+ "private",
3253
+ "protected",
3254
+ "public",
3255
+ "static",
3256
+ "yield"
3257
+ ],
3258
+ strictBind: ["eval", "arguments"]
3259
+ };
3260
+ const keywords = new Set(reservedWords.keyword);
3261
+ const reservedWordsStrictSet = new Set(reservedWords.strict);
3262
+ const reservedWordsStrictBindSet = new Set(reservedWords.strictBind);
3263
+ function isReservedWord(word, inModule) {
3264
+ return inModule && word === "await" || word === "enum";
3265
+ }
3266
+ function isStrictReservedWord(word, inModule) {
3267
+ return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word);
3268
+ }
3269
+ function isStrictBindOnlyReservedWord(word) {
3270
+ return reservedWordsStrictBindSet.has(word);
3271
+ }
3272
+ function isStrictBindReservedWord(word, inModule) {
3273
+ return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word);
3274
+ }
3275
+ function isKeyword(word) {
3276
+ return keywords.has(word);
3277
+ }
3278
+ }));
3279
+
3280
+ //#endregion
3281
+ //#region node_modules/@babel/helper-validator-identifier/lib/index.js
3282
+ var require_lib$1 = /* @__PURE__ */ __commonJSMin(((exports) => {
3283
+ Object.defineProperty(exports, "__esModule", { value: true });
3284
+ Object.defineProperty(exports, "isIdentifierChar", {
3285
+ enumerable: true,
3286
+ get: function() {
3287
+ return _identifier.isIdentifierChar;
3288
+ }
3289
+ });
3290
+ Object.defineProperty(exports, "isIdentifierName", {
3291
+ enumerable: true,
3292
+ get: function() {
3293
+ return _identifier.isIdentifierName;
3294
+ }
3295
+ });
3296
+ Object.defineProperty(exports, "isIdentifierStart", {
3297
+ enumerable: true,
3298
+ get: function() {
3299
+ return _identifier.isIdentifierStart;
3300
+ }
3301
+ });
3302
+ Object.defineProperty(exports, "isKeyword", {
3303
+ enumerable: true,
3304
+ get: function() {
3305
+ return _keyword.isKeyword;
3306
+ }
3307
+ });
3308
+ Object.defineProperty(exports, "isReservedWord", {
3309
+ enumerable: true,
3310
+ get: function() {
3311
+ return _keyword.isReservedWord;
3312
+ }
3313
+ });
3314
+ Object.defineProperty(exports, "isStrictBindOnlyReservedWord", {
3315
+ enumerable: true,
3316
+ get: function() {
3317
+ return _keyword.isStrictBindOnlyReservedWord;
3318
+ }
3319
+ });
3320
+ Object.defineProperty(exports, "isStrictBindReservedWord", {
3321
+ enumerable: true,
3322
+ get: function() {
3323
+ return _keyword.isStrictBindReservedWord;
3324
+ }
3325
+ });
3326
+ Object.defineProperty(exports, "isStrictReservedWord", {
3327
+ enumerable: true,
3328
+ get: function() {
3329
+ return _keyword.isStrictReservedWord;
3330
+ }
3331
+ });
3332
+ var _identifier = require_identifier();
3333
+ var _keyword = require_keyword();
3334
+ }));
3335
+
3336
+ //#endregion
3337
+ //#region node_modules/@babel/code-frame/lib/index.js
3338
+ var require_lib = /* @__PURE__ */ __commonJSMin(((exports) => {
3339
+ Object.defineProperty(exports, "__esModule", { value: true });
3340
+ var picocolors = require_picocolors();
3341
+ var jsTokens = require_js_tokens();
3342
+ var helperValidatorIdentifier = require_lib$1();
3343
+ function isColorSupported() {
3344
+ return typeof process === "object" && (process.env.FORCE_COLOR === "0" || process.env.FORCE_COLOR === "false") ? false : picocolors.isColorSupported;
3345
+ }
3346
+ const compose = (f, g) => (v) => f(g(v));
3347
+ function buildDefs(colors) {
3348
+ return {
3349
+ keyword: colors.cyan,
3350
+ capitalized: colors.yellow,
3351
+ jsxIdentifier: colors.yellow,
3352
+ punctuator: colors.yellow,
3353
+ number: colors.magenta,
3354
+ string: colors.green,
3355
+ regex: colors.magenta,
3356
+ comment: colors.gray,
3357
+ invalid: compose(compose(colors.white, colors.bgRed), colors.bold),
3358
+ gutter: colors.gray,
3359
+ marker: compose(colors.red, colors.bold),
3360
+ message: compose(colors.red, colors.bold),
3361
+ reset: colors.reset
3362
+ };
3363
+ }
3364
+ const defsOn = buildDefs(picocolors.createColors(true));
3365
+ const defsOff = buildDefs(picocolors.createColors(false));
3366
+ function getDefs(enabled) {
3367
+ return enabled ? defsOn : defsOff;
3368
+ }
3369
+ const sometimesKeywords = new Set([
3370
+ "as",
3371
+ "async",
3372
+ "from",
3373
+ "get",
3374
+ "of",
3375
+ "set"
3376
+ ]);
3377
+ const NEWLINE$1 = /\r\n|[\n\r\u2028\u2029]/;
3378
+ const BRACKET = /^[()[\]{}]$/;
3379
+ let tokenize;
3380
+ {
3381
+ const JSX_TAG = /^[a-z][\w-]*$/i;
3382
+ const getTokenType = function(token, offset, text) {
3383
+ if (token.type === "name") {
3384
+ if (helperValidatorIdentifier.isKeyword(token.value) || helperValidatorIdentifier.isStrictReservedWord(token.value, true) || sometimesKeywords.has(token.value)) return "keyword";
3385
+ if (JSX_TAG.test(token.value) && (text[offset - 1] === "<" || text.slice(offset - 2, offset) === "</")) return "jsxIdentifier";
3386
+ if (token.value[0] !== token.value[0].toLowerCase()) return "capitalized";
3387
+ }
3388
+ if (token.type === "punctuator" && BRACKET.test(token.value)) return "bracket";
3389
+ if (token.type === "invalid" && (token.value === "@" || token.value === "#")) return "punctuator";
3390
+ return token.type;
3391
+ };
3392
+ tokenize = function* (text) {
3393
+ let match;
3394
+ while (match = jsTokens.default.exec(text)) {
3395
+ const token = jsTokens.matchToToken(match);
3396
+ yield {
3397
+ type: getTokenType(token, match.index, text),
3398
+ value: token.value
3399
+ };
3400
+ }
3401
+ };
3402
+ }
3403
+ function highlight(text) {
3404
+ if (text === "") return "";
3405
+ const defs = getDefs(true);
3406
+ let highlighted = "";
3407
+ for (const { type, value } of tokenize(text)) if (type in defs) highlighted += value.split(NEWLINE$1).map((str) => defs[type](str)).join("\n");
3408
+ else highlighted += value;
3409
+ return highlighted;
3410
+ }
3411
+ const NEWLINE = /\r\n|[\n\r\u2028\u2029]/;
3412
+ function getMarkerLines(loc, source, opts) {
3413
+ const startLoc = Object.assign({
3414
+ column: 0,
3415
+ line: -1
3416
+ }, loc.start);
3417
+ const endLoc = Object.assign({}, startLoc, loc.end);
3418
+ const { linesAbove = 2, linesBelow = 3 } = opts || {};
3419
+ const startLine = startLoc.line;
3420
+ const startColumn = startLoc.column;
3421
+ const endLine = endLoc.line;
3422
+ const endColumn = endLoc.column;
3423
+ let start = Math.max(startLine - (linesAbove + 1), 0);
3424
+ let end = Math.min(source.length, endLine + linesBelow);
3425
+ if (startLine === -1) start = 0;
3426
+ if (endLine === -1) end = source.length;
3427
+ const lineDiff = endLine - startLine;
3428
+ const markerLines = {};
3429
+ if (lineDiff) for (let i = 0; i <= lineDiff; i++) {
3430
+ const lineNumber = i + startLine;
3431
+ if (!startColumn) markerLines[lineNumber] = true;
3432
+ else if (i === 0) markerLines[lineNumber] = [startColumn, source[lineNumber - 1].length - startColumn + 1];
3433
+ else if (i === lineDiff) markerLines[lineNumber] = [0, endColumn];
3434
+ else markerLines[lineNumber] = [0, source[lineNumber - i].length];
3435
+ }
3436
+ else if (startColumn === endColumn) if (startColumn) markerLines[startLine] = [startColumn, 0];
3437
+ else markerLines[startLine] = true;
3438
+ else markerLines[startLine] = [startColumn, endColumn - startColumn];
3439
+ return {
3440
+ start,
3441
+ end,
3442
+ markerLines
3443
+ };
3444
+ }
3445
+ function codeFrameColumns(rawLines, loc, opts = {}) {
3446
+ const shouldHighlight = opts.forceColor || isColorSupported() && opts.highlightCode;
3447
+ const defs = getDefs(shouldHighlight);
3448
+ const { start, end, markerLines } = getMarkerLines(loc, rawLines.split(NEWLINE), opts);
3449
+ const hasColumns = loc.start && typeof loc.start.column === "number";
3450
+ const numberMaxWidth = String(end).length;
3451
+ let frame = (shouldHighlight ? highlight(rawLines) : rawLines).split(NEWLINE, end).slice(start, end).map((line, index) => {
3452
+ const number = start + 1 + index;
3453
+ const gutter = ` ${` ${number}`.slice(-numberMaxWidth)} |`;
3454
+ const hasMarker = markerLines[number];
3455
+ const lastMarkerLine = !markerLines[number + 1];
3456
+ if (hasMarker) {
3457
+ let markerLine = "";
3458
+ if (Array.isArray(hasMarker)) {
3459
+ const markerSpacing = line.slice(0, Math.max(hasMarker[0] - 1, 0)).replace(/[^\t]/g, " ");
3460
+ const numberOfMarkers = hasMarker[1] || 1;
3461
+ markerLine = [
3462
+ "\n ",
3463
+ defs.gutter(gutter.replace(/\d/g, " ")),
3464
+ " ",
3465
+ markerSpacing,
3466
+ defs.marker("^").repeat(numberOfMarkers)
3467
+ ].join("");
3468
+ if (lastMarkerLine && opts.message) markerLine += " " + defs.message(opts.message);
3469
+ }
3470
+ return [
3471
+ defs.marker(">"),
3472
+ defs.gutter(gutter),
3473
+ line.length > 0 ? ` ${line}` : "",
3474
+ markerLine
3475
+ ].join("");
3476
+ } else return ` ${defs.gutter(gutter)}${line.length > 0 ? ` ${line}` : ""}`;
3477
+ }).join("\n");
3478
+ if (opts.message && !hasColumns) frame = `${" ".repeat(numberMaxWidth + 1)}${opts.message}\n${frame}`;
3479
+ if (shouldHighlight) return defs.reset(frame);
3480
+ else return frame;
3481
+ }
3482
+ exports.codeFrameColumns = codeFrameColumns;
3483
+ }));
3484
+
3485
+ //#endregion
3486
+ //#region src/server/symbolicate.ts
3487
+ var import_lib = require_lib();
3488
+ /**
3489
+ * @see https://github.com/facebook/react-native/blob/0.83-stable/packages/metro-config/src/index.flow.js#L17
3490
+ */
3491
+ const INTERNAL_CALLSITES_REGEX = new RegExp([
3492
+ "/Libraries/BatchedBridge/MessageQueue\\.js$",
3493
+ "/Libraries/Core/.+\\.js$",
3494
+ "/Libraries/LogBox/.+\\.js$",
3495
+ "/Libraries/Network/.+\\.js$",
3496
+ "/Libraries/Pressability/.+\\.js$",
3497
+ "/Libraries/Renderer/implementations/.+\\.js$",
3498
+ "/Libraries/Utilities/.+\\.js$",
3499
+ "/Libraries/vendor/.+\\.js$",
3500
+ "/Libraries/WebSocket/.+\\.js$",
3501
+ "/src/private/renderer/errorhandling/.+\\.js$",
3502
+ "/metro-runtime/.+\\.js$",
3503
+ "/node_modules/@babel/runtime/.+\\.js$",
3504
+ "/node_modules/@react-native/js-polyfills/.+\\.js$",
3505
+ "/node_modules/invariant/.+\\.js$",
3506
+ "/node_modules/react-devtools-core/.+\\.js$",
3507
+ "/node_modules/react-native/index.js$",
3508
+ "/node_modules/react-refresh/.+\\.js$",
3509
+ "/node_modules/scheduler/.+\\.js$",
3510
+ "^\\[native code\\]$"
3511
+ ].map((pathPattern) => pathPattern.replaceAll("/", "[/\\\\]")).join("|"));
3512
+ async function symbolicate(bundle, stack) {
3513
+ const sourceMapConsumer = await bundle.sourceMapConsumer;
3514
+ const symbolicatedStack = stack.filter((frame) => frame.file?.startsWith("http")).map((frame) => originalPositionFor(sourceMapConsumer, frame)).map((frame) => collapseFrame(frame));
3515
+ return {
3516
+ stack: symbolicatedStack,
3517
+ codeFrame: getCodeFrame(sourceMapConsumer, symbolicatedStack, bundle)
3518
+ };
3519
+ }
3520
+ function originalPositionFor(sourceMapConsumer, frame) {
3521
+ if (frame.column == null || frame.lineNumber == null) return frame;
3522
+ const originalPosition = sourceMapConsumer.originalPositionFor({
3523
+ column: frame.column,
3524
+ line: frame.lineNumber
3525
+ });
3526
+ return Object.entries(originalPosition).reduce((frame$1, [key, value]) => {
3527
+ const targetKey = convertFrameKey(key);
3528
+ return {
3529
+ ...frame$1,
3530
+ ...value ? { [targetKey]: value } : null
3531
+ };
3532
+ }, frame);
3533
+ }
3534
+ function collapseFrame(frame) {
3535
+ return {
3536
+ ...frame,
3537
+ collapse: Boolean(frame.file && INTERNAL_CALLSITES_REGEX.test(frame.file))
3538
+ };
3539
+ }
3540
+ function isCollapsed(frame) {
3541
+ return "collapse" in frame && frame.collapse;
3542
+ }
3543
+ function convertFrameKey(key) {
3544
+ if (key === "line") return "lineNumber";
3545
+ else if (key === "source") return "file";
3546
+ else if (key === "name") return "methodName";
3547
+ return key;
3548
+ }
3549
+ function getCodeFrame(sourceMapConsumer, frames, bundle) {
3550
+ const frame = frames.find((frame$1) => {
3551
+ return frame$1.lineNumber != null && frame$1.column != null && !isCollapsed(frame$1);
3552
+ });
3553
+ if (frame?.file == null || frame.column == null || frame.lineNumber == null) return null;
3554
+ try {
3555
+ const { lineNumber, column, file } = frame;
3556
+ const unresolved = file.startsWith("http");
3557
+ const source = unresolved ? bundle.code : sourceMapConsumer.sourceContentFor(frame.file);
3558
+ const fileName = unresolved ? url.default.parse(file).pathname ?? "unknown" : file;
3559
+ let content = "";
3560
+ if (source) content = (0, import_lib.codeFrameColumns)(source, { start: {
3561
+ column,
3562
+ line: lineNumber
3563
+ } }, { highlightCode: true });
3564
+ return {
3565
+ content,
3566
+ fileName,
3567
+ location: {
3568
+ column,
3569
+ row: lineNumber
3570
+ }
3571
+ };
3572
+ } catch {
3573
+ return null;
3574
+ }
3575
+ }
3576
+
3577
+ //#endregion
3578
+ //#region src/server/middlewares/symbolicate.ts
3579
+ const bodySchema = (0, json_schema_to_ts.asConst)({
3580
+ type: "object",
3581
+ properties: {
3582
+ stack: {
3583
+ type: "array",
3584
+ items: {}
3585
+ },
3586
+ extraData: {}
3587
+ },
3588
+ required: ["stack"]
3589
+ });
3590
+ const plugin = (0, fastify_plugin.default)((fastify$1, options) => {
3591
+ const { getBundler } = options;
3592
+ fastify$1.post("/symbolicate", {
3593
+ schema: { body: bodySchema },
3594
+ async handler(request, reply) {
3595
+ const { stack } = request.body;
3596
+ const bundleUrl = stack.find((frame) => frame.file?.startsWith("http"));
3597
+ (0, es_toolkit.invariant)(bundleUrl?.file, "No bundle URL found in stack frames");
3598
+ const { pathname, query } = url.default.parse(bundleUrl.file, true);
3599
+ (0, es_toolkit.invariant)(pathname, "No pathname found in bundle URL");
3600
+ (0, es_toolkit.invariant)(query.platform, "No platform found in query");
3601
+ (0, es_toolkit.invariant)(query.dev, "No dev found in query");
3602
+ const bundle = await getBundler(getBaseBundleName(pathname), {
3603
+ platform: query.platform,
3604
+ dev: query.dev === "true"
3605
+ }).getBundle();
3606
+ await reply.header("Content-Type", "application/json").send(await symbolicate(bundle, stack));
3607
+ }
3608
+ });
3609
+ }, { name: "symbolicate" });
3610
+
3611
+ //#endregion
3612
+ //#region src/server/wss/server.ts
3613
+ var WebSocketServer = class extends node_events.default {
3614
+ clientId = 0;
3615
+ wss;
3616
+ logger;
3617
+ constructor(name, options) {
3618
+ super();
3619
+ const logger$2 = logger.child(name);
3620
+ const wss = new ws.WebSocketServer(options);
3621
+ wss.on("connection", (socket) => {
3622
+ const client = Object.defineProperty(socket, "id", {
3623
+ value: this.clientId++,
3624
+ writable: false
3625
+ });
3626
+ this.onConnection(client);
3627
+ this.emit("connection", client);
3628
+ client.on("message", (data) => {
3629
+ this.onMessage(client, data);
3630
+ this.emit("message", client, data);
3631
+ });
3632
+ client.on("error", (error) => {
3633
+ this.onError(client, error);
3634
+ this.emit("error", client, error);
3635
+ });
3636
+ client.on("close", () => {
3637
+ this.onClose(client);
3638
+ this.emit("close", client);
3639
+ });
3640
+ });
3641
+ this.wss = wss;
3642
+ this.logger = logger$2;
3643
+ }
3644
+ get server() {
3645
+ return this.wss;
3646
+ }
3647
+ send(client, data) {
3648
+ if (client.readyState === ws.WebSocket.OPEN) client.send(data);
3649
+ }
3650
+ sendAll(data) {
3651
+ this.wss.clients.forEach((client) => {
3652
+ if (client.readyState === ws.WebSocket.OPEN) client.send(data);
3653
+ });
3654
+ }
3655
+ rawDataToString(data) {
3656
+ if (Buffer.isBuffer(data)) return data.toString("utf8");
3657
+ if (Array.isArray(data)) return Buffer.concat(data).toString("utf8");
3658
+ return Buffer.from(data).toString("utf8");
3659
+ }
3660
+ };
3661
+ function getWebSocketUpgradeHandler(websocketEndpoints) {
3662
+ return (request, socket, head) => {
3663
+ if (request.url == null) {
3664
+ socket.destroy();
3665
+ return;
3666
+ }
3667
+ const { pathname } = url.default.parse(request.url, true);
3668
+ if (pathname != null && websocketEndpoints[pathname]) {
3669
+ const wss = websocketEndpoints[pathname];
3670
+ wss.handleUpgrade(request, socket, head, (socket$1) => {
3671
+ wss.emit("connection", socket$1, request);
3672
+ });
3673
+ } else socket.destroy();
3674
+ };
3675
+ }
3676
+
3677
+ //#endregion
3678
+ //#region src/server/wss/hmr-server.ts
3679
+ var HMRServer = class extends WebSocketServer {
3680
+ bundlerPool;
3681
+ reportEvent;
3682
+ instances = /* @__PURE__ */ new Map();
3683
+ bindings = /* @__PURE__ */ new Map();
3684
+ constructor({ bundlerPool, reportEvent }) {
3685
+ super("hmr", { noServer: true });
3686
+ this.bundlerPool = bundlerPool;
3687
+ this.reportEvent = reportEvent;
3688
+ }
3689
+ parseClientMessage(data) {
3690
+ const parsedData = JSON.parse(this.rawDataToString(data));
3691
+ const clientMessage = "type" in parsedData ? parsedData : null;
3692
+ (0, es_toolkit.invariant)(clientMessage, "Invalid HMR client message");
3693
+ return clientMessage;
3694
+ }
3695
+ async handleConnected(client, platform, bundleEntry) {
3696
+ try {
3697
+ this.logger.trace(`HMR client connected (clientId: ${client.id})`, {
3698
+ platform,
3699
+ bundleEntry
3700
+ });
3701
+ const devEngineInstance = this.bundlerPool.get(bundleEntry, {
3702
+ platform,
3703
+ dev: true
3704
+ });
3705
+ this.bindEvents(client, devEngineInstance);
3706
+ this.instances.set(client.id, devEngineInstance);
3707
+ this.logger.trace(`Bundler instance prepared (bundlerId: ${devEngineInstance.id})`);
3708
+ } catch (error) {
3709
+ this.logger.error(`Failed to prepare bundler instance`, error);
3710
+ }
3711
+ }
3712
+ bindEvents(client, instance) {
3713
+ if (this.bindings.get(client.id) == null) {
3714
+ const handleHmrUpdates = (updates) => {
3715
+ this.handleUpdates(client, updates);
3716
+ };
3717
+ const handleWatchChange = () => {
3718
+ this.send(client, JSON.stringify({ type: "hmr:update-start" }));
3719
+ };
3720
+ instance.addListener("hmrUpdates", handleHmrUpdates);
3721
+ instance.addListener("watchChange", handleWatchChange);
3722
+ this.bindings.set(client.id, {
3723
+ hmrUpdates: handleHmrUpdates,
3724
+ watchChange: handleWatchChange
3725
+ });
3726
+ this.logger.trace(`HMR event binding established (clientId: ${client.id})`);
3727
+ }
3728
+ }
3729
+ async handleModuleRegistered(client, modules) {
3730
+ try {
3731
+ const instance = this.instances.get(client.id);
3732
+ (0, es_toolkit.invariant)(instance != null, `Bundler instance not found for client clientId: ${client.id}`);
3733
+ await instance.ensureInitialized;
3734
+ await instance.devEngine.registerModules(client.id.toString(), modules);
3735
+ } catch (error) {
3736
+ this.logger.error(`Failed to handle module registered`, error);
3737
+ }
3738
+ }
3739
+ async handleInvalidate(client, moduleId) {
3740
+ try {
3741
+ const instance = this.instances.get(client.id);
3742
+ (0, es_toolkit.invariant)(instance != null, `Bundler instance not found for client clientId: ${client.id}`);
3743
+ await instance.ensureInitialized;
3744
+ const updates = await instance.devEngine.invalidate(moduleId);
3745
+ await this.handleUpdates(client, updates);
3746
+ } catch (error) {
3747
+ this.logger.error(`Failed to handle invalidate`, error);
3748
+ }
3749
+ }
3750
+ async handleUpdates(client, updates) {
3751
+ this.logger.trace(`HMR updates found (clientId: ${client.id})`, { updatesCount: updates.length });
3752
+ for (const clientUpdate of updates) {
3753
+ const update = clientUpdate.update;
3754
+ switch (update.type) {
3755
+ case "Patch":
3756
+ this.sendUpdateToClient(client, update);
3757
+ break;
3758
+ case "FullReload":
3759
+ this.sendReloadToClient(client);
3760
+ break;
3761
+ case "Noop":
3762
+ this.logger.warn(`Client ${clientUpdate.clientId} received noop update`);
3763
+ break;
3764
+ }
3765
+ }
3766
+ }
3767
+ sendUpdateToClient(client, update) {
3768
+ (0, es_toolkit.invariant)(update.type === "Patch", "Invalid HMR update type");
3769
+ const updateMessage = {
3770
+ type: "hmr:update",
3771
+ code: update.code
3772
+ };
3773
+ this.send(client, JSON.stringify(updateMessage));
3774
+ this.send(client, JSON.stringify({ type: "hmr:update-done" }));
3775
+ this.done(client);
3776
+ }
3777
+ sendReloadToClient(client) {
3778
+ this.logger.trace(`Sending HMR reload message to client (clientId: ${client.id})`);
3779
+ this.send(client, JSON.stringify({ type: "hmr:reload" }));
3780
+ this.done(client);
3781
+ }
3782
+ done(client) {
3783
+ this.send(client, JSON.stringify({ type: "hmr:update-done" }));
3784
+ }
3785
+ sendError(client, error) {
3786
+ try {
3787
+ this.send(client, JSON.stringify(error));
3788
+ } catch (error$1) {
3789
+ this.logger.error(`Failed to send HMR error message to client (clientId: ${client.id})`, error$1);
3790
+ }
3791
+ }
3792
+ cleanup(client) {
3793
+ this.logger.trace(`HMR client cleanup (clientId: ${client.id})`);
3794
+ const binding = this.bindings.get(client.id);
3795
+ const instance = this.instances.get(client.id);
3796
+ if (binding != null && instance != null) {
3797
+ instance.removeListener("hmrUpdates", binding.hmrUpdates);
3798
+ instance.removeListener("watchChange", binding.watchChange);
3799
+ }
3800
+ if (instance != null) instance.devEngine.removeClient(String(client.id));
3801
+ this.bindings.delete(client.id);
3802
+ this.instances.delete(client.id);
3803
+ }
3804
+ onMessage(client, data) {
3805
+ let message;
3806
+ try {
3807
+ message = this.parseClientMessage(data);
3808
+ this.logger.trace("HMR client message received", message);
3809
+ } catch (error) {
3810
+ const message$1 = "Failed to parse HMR client message";
3811
+ this.logger.error(message$1, error);
3812
+ this.sendError(client, {
3813
+ type: "InternalError",
3814
+ errors: [{ description: error instanceof Error ? error.message : String(error) }],
3815
+ message: message$1
3816
+ });
3817
+ return;
3818
+ }
3819
+ switch (message.type) {
3820
+ case "hmr:connected":
3821
+ this.handleConnected(client, message.platform, message.bundleEntry);
3822
+ break;
3823
+ case "hmr:module-registered":
3824
+ this.handleModuleRegistered(client, message.modules);
3825
+ break;
3826
+ case "hmr:invalidate":
3827
+ this.handleInvalidate(client, message.moduleId);
3828
+ break;
3829
+ case "hmr:log":
3830
+ this.reportEvent({
3831
+ type: "client_log",
3832
+ level: message.level,
3833
+ data: message.data
3834
+ });
3835
+ break;
3836
+ }
3837
+ }
3838
+ onConnection(client) {
3839
+ this.logger.trace(`connection established (clientId: ${client.id})`);
3840
+ }
3841
+ onError(client, error) {
3842
+ this.logger.error(`connection error (clientId: ${client.id})`, error);
3843
+ this.cleanup(client);
3844
+ }
3845
+ onClose(client) {
3846
+ this.logger.trace(`connection closed (clientId: ${client.id})`);
3847
+ this.cleanup(client);
3848
+ }
3849
+ };
3850
+
3851
+ //#endregion
3852
+ //#region src/server/create-dev-server.ts
3853
+ async function createDevServer(config, options) {
3854
+ const projectRoot = config.root;
3855
+ const { port = DEFAULT_PORT, host = DEFAULT_HOST, https = false, onDeviceConnected, onDeviceMessage, onDeviceConnectionError, onDeviceDisconnected } = options ?? {};
3856
+ if (https) throw new Error("HTTPS is not supported yet");
3857
+ const serverBaseUrl = url.default.format({
3858
+ protocol: https ? "https" : "http",
3859
+ hostname: host,
3860
+ port
3861
+ });
3862
+ await assertDevServerStatus({
3863
+ devServerUrl: serverBaseUrl,
3864
+ projectRoot,
3865
+ port
3866
+ });
3867
+ const fastify$1 = (0, fastify.default)({
3868
+ loggerInstance: new DevServerLogger(),
3869
+ disableRequestLogging: true
3870
+ });
3871
+ const bundlerPool = new BundlerPool(config, {
3872
+ host,
3873
+ port
3874
+ });
3875
+ const getBundler = (bundleName, buildOptions) => {
3876
+ return bundlerPool.get(bundleName, buildOptions);
3877
+ };
3878
+ const { middleware: communityMiddleware, websocketEndpoints: communityWebsocketEndpoints, messageSocketEndpoint: { server: messageServer, broadcast }, eventsSocketEndpoint: { server: eventsServer, reportEvent } } = (0, _react_native_community_cli_server_api.createDevServerMiddleware)({
3879
+ port,
3880
+ host,
3881
+ watchFolders: []
3882
+ });
3883
+ const { middleware: devMiddleware, websocketEndpoints } = (0, _react_native_dev_middleware.createDevMiddleware)({
3884
+ serverBaseUrl,
3885
+ logger: {
3886
+ info(...args) {
3887
+ if (args[0].includes("JavaScript logs have moved")) return;
3888
+ logger.info(...args);
3889
+ },
3890
+ warn: logger.warn.bind(logger),
3891
+ error: logger.error.bind(logger)
3892
+ },
3893
+ unstable_experiments: {
3894
+ enableNetworkInspector: true,
3895
+ enableStandaloneFuseboxShell: true
3896
+ }
3897
+ });
3898
+ const hmrServer = new HMRServer({
3899
+ bundlerPool,
3900
+ reportEvent: (event) => {
3901
+ reportEvent?.(event);
3902
+ config.reporter.update(event);
3903
+ }
3904
+ }).on("connection", (client) => onDeviceConnected?.(client)).on("message", (client, data) => onDeviceMessage?.(client, data)).on("error", (client, error) => onDeviceConnectionError?.(client, error)).on("close", (client) => onDeviceDisconnected?.(client));
3905
+ await fastify$1.register(import("@fastify/middie"));
3906
+ const devServer = {
3907
+ config,
3908
+ instance: fastify$1,
3909
+ middlewares: { use: fastify$1.use.bind(fastify$1) },
3910
+ message: Object.assign(messageServer, { broadcast }),
3911
+ events: Object.assign(eventsServer, { reportEvent }),
3912
+ hot: Object.assign(hmrServer.server, {
3913
+ send: hmrServer.send.bind(hmrServer),
3914
+ sendAll: hmrServer.sendAll.bind(hmrServer)
3915
+ })
3916
+ };
3917
+ const { invokePostConfigureServer } = await invokeConfigureServer(devServer, config.plugins ?? []);
3918
+ fastify$1.use(communityMiddleware).use(devMiddleware).register(plugin, { getBundler }).register(plugin$1, { getBundler }).register(plugin$2, {
3919
+ projectRoot,
3920
+ host,
3921
+ port,
3922
+ https,
3923
+ preferNativePlatform: config.resolver.preferNativePlatform
3924
+ }).setErrorHandler(errorHandler);
3925
+ fastify$1.server.on("upgrade", getWebSocketUpgradeHandler({
3926
+ ...communityWebsocketEndpoints,
3927
+ ...websocketEndpoints,
3928
+ "/hot": hmrServer.server
3929
+ }));
3930
+ await invokePostConfigureServer();
3931
+ return devServer;
3932
+ }
3933
+ async function invokeConfigureServer(server, plugins) {
3934
+ const postConfigureServerHandlers = [];
3935
+ for (const plugin$3 of plugins) {
3936
+ const context = createPluginContext(plugin$3.name);
3937
+ const result = await plugin$3.configureServer?.call(context, server);
3938
+ if (typeof result === "function") postConfigureServerHandlers.push(result);
3939
+ }
3940
+ return { invokePostConfigureServer: async () => {
3941
+ for (const handler of postConfigureServerHandlers) await handler();
3942
+ } };
3943
+ }
3944
+
1572
3945
  //#endregion
1573
3946
  //#region src/reporter.ts
1574
3947
  var TerminalReporter = class {
@@ -1589,18 +3962,17 @@ var TerminalReporter = class {
1589
3962
  function resolvePackagePath(basePath, packageName) {
1590
3963
  let packagePath = null;
1591
3964
  try {
1592
- packagePath = resolvePackagePathWithNodeRequire(basePath, packageName);
3965
+ packagePath = resolvePackagePathWithNodeRequire(basePath, packageName, "package.json");
1593
3966
  if (packagePath) return packagePath;
1594
3967
  } catch {}
1595
3968
  try {
1596
- packagePath = resolvePackagePathWithNodeRequire(basePath, packageName, "");
3969
+ packagePath = resolvePackagePathWithNodeRequire(basePath, packageName);
1597
3970
  if (packagePath) return packagePath;
1598
3971
  } catch {}
1599
3972
  throw new Error(`Failed to resolve package path for '${packageName}'`);
1600
3973
  }
1601
- function resolvePackagePathWithNodeRequire(basePath, packageName, lookupSubpath = "package.json") {
1602
- const lookupPath = lookupSubpath ? `/${lookupSubpath}` : "";
1603
- const resolvedPath = require.resolve(`${packageName}${lookupPath}`, { paths: [basePath] });
3974
+ function resolvePackagePathWithNodeRequire(basePath, packageName, subpath) {
3975
+ const resolvedPath = require.resolve(subpath ? `${packageName}/${subpath}` : packageName, { paths: [basePath] });
1604
3976
  const root = node_path.default.parse(resolvedPath).root;
1605
3977
  let currentPath = node_path.default.dirname(resolvedPath);
1606
3978
  while (currentPath !== root) {
@@ -1633,9 +4005,9 @@ function getDefaultConfig(basePath) {
1633
4005
  },
1634
4006
  serializer: {
1635
4007
  prelude: [getInitializeCorePath(basePath)],
1636
- polyfills: getPolyfillScriptPaths(reactNativePath).map((path$10) => ({
4008
+ polyfills: getPolyfillScriptPaths(reactNativePath).map((path$11) => ({
1637
4009
  type: "iife",
1638
- code: stripFlowSyntax(node_fs.default.readFileSync(path$10, "utf-8"), path$10).code
4010
+ code: stripFlowSyntax(node_fs.default.readFileSync(path$11, "utf-8"), path$11).code
1639
4011
  }))
1640
4012
  },
1641
4013
  watcher: {
@@ -1697,19 +4069,25 @@ async function loadConfig(options = {}) {
1697
4069
  ...commonOptions
1698
4070
  });
1699
4071
  const resolvedConfig = mergeConfig(defaultConfig, userConfig, await resolvePluginConfig(userConfig, userConfig.plugins ?? []));
1700
- await invokePluginConfigResolved(resolvedConfig, userConfig.plugins ?? []);
4072
+ await invokeConfigResolved(resolvedConfig, userConfig.plugins ?? []);
1701
4073
  return resolvedConfig;
1702
4074
  }
1703
4075
  async function resolvePluginConfig(baseConfig, plugins) {
1704
4076
  let mergedConfig = (0, es_toolkit.omit)(baseConfig, ["plugins", "dangerously_overrideRolldownOptions"]);
1705
- for (const plugin of plugins) if (typeof plugin.config === "function") {
1706
- const config = await plugin.config(mergedConfig);
1707
- if (config != null) mergedConfig = mergeConfig(mergedConfig, config);
1708
- } else if (typeof plugin.config === "object") mergedConfig = mergeConfig(mergedConfig, plugin.config);
4077
+ for (const plugin$3 of plugins) {
4078
+ const context = createPluginContext(plugin$3.name);
4079
+ if (typeof plugin$3.config === "function") {
4080
+ const config = await plugin$3.config.call(context, mergedConfig);
4081
+ if (config != null) mergedConfig = mergeConfig(mergedConfig, config);
4082
+ } else if (typeof plugin$3.config === "object") mergedConfig = mergeConfig(mergedConfig, plugin$3.config);
4083
+ }
1709
4084
  return mergedConfig;
1710
4085
  }
1711
- async function invokePluginConfigResolved(config, plugins) {
1712
- for (const plugin of plugins) await plugin.configResolved?.(config);
4086
+ async function invokeConfigResolved(config, plugins) {
4087
+ await Promise.all(plugins.map((plugin$3) => {
4088
+ const context = createPluginContext(plugin$3.name);
4089
+ return plugin$3.configResolved?.call(context, config);
4090
+ }));
1713
4091
  }
1714
4092
 
1715
4093
  //#endregion
@@ -1720,11 +4098,14 @@ Object.defineProperty(exports, 'AssetUtils', {
1720
4098
  }
1721
4099
  });
1722
4100
  exports.Bundler = Bundler;
4101
+ exports.DEFAULT_HOST = DEFAULT_HOST;
4102
+ exports.DEFAULT_PORT = DEFAULT_PORT;
1723
4103
  exports.DefaultReporter = TerminalReporter;
1724
4104
  exports.PluginUtils = PluginUtils;
4105
+ exports.createDevServer = createDevServer;
1725
4106
  exports.defineConfig = defineConfig;
1726
4107
  exports.getDefaultConfig = getDefaultConfig;
1727
- exports.invokePluginConfigResolved = invokePluginConfigResolved;
4108
+ exports.invokeConfigResolved = invokeConfigResolved;
1728
4109
  exports.loadConfig = loadConfig;
1729
4110
  exports.mergeConfig = mergeConfig;
1730
4111
  Object.defineProperty(exports, 'plugins', {