@marko/run 0.4.4 → 0.4.6

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.
@@ -1,27 +1,13 @@
1
1
  var __defProp = Object.defineProperty;
2
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
- var __publicField = (obj, key, value) => {
4
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
5
- return value;
6
- };
7
- var __accessCheck = (obj, member, msg) => {
8
- if (!member.has(obj))
9
- throw TypeError("Cannot " + msg);
10
- };
11
- var __privateGet = (obj, member, getter) => {
12
- __accessCheck(obj, member, "read from private field");
13
- return getter ? getter.call(obj) : member.get(obj);
14
- };
15
- var __privateAdd = (obj, member, value) => {
16
- if (member.has(obj))
17
- throw TypeError("Cannot add the same private member more than once");
18
- member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
19
- };
20
- var __privateSet = (obj, member, value, setter) => {
21
- __accessCheck(obj, member, "write to private field");
22
- setter ? setter.call(obj, value) : member.set(obj, value);
23
- return value;
2
+ var __typeError = (msg) => {
3
+ throw TypeError(msg);
24
4
  };
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
7
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
8
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
9
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
10
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
25
11
 
26
12
  // src/vite/plugin.ts
27
13
  import path3 from "path";
@@ -30,7 +16,7 @@ import { glob } from "glob";
30
16
  import { fileURLToPath } from "url";
31
17
  import browserslist from "browserslist";
32
18
  import { resolveToEsbuildTarget } from "esbuild-plugin-browserslist";
33
- import { mergeConfig } from "vite";
19
+ import { buildErrorMessage, mergeConfig } from "vite";
34
20
  import markoVitePlugin from "@marko/vite";
35
21
 
36
22
  // src/vite/constants.ts
@@ -52,8 +38,8 @@ var RoutableFileTypes = {
52
38
  var _dirs, _pathlessDirs;
53
39
  var _VDir = class _VDir {
54
40
  constructor(parent, segment, source) {
55
- __privateAdd(this, _dirs, void 0);
56
- __privateAdd(this, _pathlessDirs, void 0);
41
+ __privateAdd(this, _dirs);
42
+ __privateAdd(this, _pathlessDirs);
57
43
  __publicField(this, "parent");
58
44
  __publicField(this, "source");
59
45
  __publicField(this, "path");
@@ -193,8 +179,7 @@ var VDir = _VDir;
193
179
 
194
180
  // src/vite/routes/parse.ts
195
181
  function parseFlatRoute(pattern) {
196
- if (!pattern)
197
- throw new Error("Empty pattern");
182
+ if (!pattern) throw new Error("Empty pattern");
198
183
  const len = pattern.length;
199
184
  let i = 0;
200
185
  return parse2([
@@ -900,45 +885,6 @@ function writeRouteEntryHandler(writer, route, verb) {
900
885
  continuations.join();
901
886
  writer.writeBlockEnd("}");
902
887
  }
903
- function renderErrorRouter(error, options = {
904
- trailingSlashes: "RedirectWithout"
905
- }) {
906
- const writer = createStringWriter();
907
- writer.write(`
908
- // @marko/run/router
909
- import { createContext } from '${virtualFilePrefix}/runtime/internal';
910
- import errorPage from '${virtualFilePrefix}/${markoRunFilePrefix}error.marko${serverEntryQuery}';
911
-
912
- const error = new Error(\`${error.message}\`);
913
- error.name = '${error.name}';`);
914
- if (error.stack) {
915
- writer.write(`
916
- error.stack = \`${error.stack}\`;`);
917
- }
918
- writer.write(`
919
-
920
- globalThis.__marko_run__ = { match, fetch, invoke };
921
-
922
- export function match() {
923
- return { handler: errorPage, params: {}, meta: {}, path: '/*' }; // /$$
924
- }
925
-
926
- export async function invoke(route, request, platform, url) {
927
- const [context, buildInput] = createContext(route, request, platform, url);
928
- if (context.request.headers.get('Accept')?.includes('text/html')) {
929
- return new Response(errorPage.stream(buildInput({ error })), {
930
- status: 500,
931
- headers: { "content-type": "text/html;charset=UTF-8" },
932
- });
933
- }
934
- return new Response(error, {
935
- status: 500,
936
- });
937
- }
938
- `);
939
- renderFetch(writer, options);
940
- return writer.end();
941
- }
942
888
  function renderRouter(routes, options = {
943
889
  trailingSlashes: "RedirectWithout"
944
890
  }) {
@@ -1071,15 +1017,7 @@ export async function fetch(request, platform) {
1071
1017
  return await invoke(route, request, platform, url);
1072
1018
  } catch (error) {
1073
1019
  if (import.meta.env.DEV) {
1074
- let body;
1075
- if (error.cause) {
1076
- body = error.cause.stack || error.cause.message || error.cause;
1077
- } else {
1078
- body = error.stack || error.message || "Internal Server Error";
1079
- }
1080
- return new Response(body, {
1081
- status: 500
1082
- });
1020
+ throw error;
1083
1021
  }
1084
1022
  return new Response(null, {
1085
1023
  status: 500
@@ -1519,6 +1457,29 @@ function getExportIdentifiers(astProgramNode) {
1519
1457
  }
1520
1458
  return result;
1521
1459
  }
1460
+ function getViteSSRExportIdentifiers(astProgramNode, exportObjectName = "__vite_ssr_exports__") {
1461
+ const result = [];
1462
+ if (t.isProgram(astProgramNode)) {
1463
+ for (const node of astProgramNode.body) {
1464
+ if (t.isExpressionStatement(node)) {
1465
+ if (t.isAssignmentExpression(node.expression) && t.isMemberExpression(node.expression.left)) {
1466
+ const { object, property } = node.expression.left;
1467
+ if (t.isIdentifier(object) && object.name === exportObjectName && t.isIdentifier(property)) {
1468
+ result.push(property.name);
1469
+ }
1470
+ } else if (t.isCallExpression(node.expression) && t.isMemberExpression(node.expression.callee)) {
1471
+ const {
1472
+ arguments: [arg0, arg1]
1473
+ } = node.expression;
1474
+ if (t.isIdentifier(arg0) && arg0.name === exportObjectName && (t.isStringLiteral(arg1) || "value" in arg1 && typeof arg1.value === "string")) {
1475
+ result.push(arg1.value);
1476
+ }
1477
+ }
1478
+ }
1479
+ }
1480
+ }
1481
+ return result;
1482
+ }
1522
1483
 
1523
1484
  // src/vite/utils/log.ts
1524
1485
  import zlib from "node:zlib";
@@ -1639,12 +1600,9 @@ function prettySize([bytes, compBytes]) {
1639
1600
  const [size, prefix] = format(bytes, { decimals: 1 }).split(/\s+/);
1640
1601
  const compSize = format(compBytes, { decimals: 1, prefix, unit: "B" });
1641
1602
  let str = kleur.white(size) + kleur.gray("/");
1642
- if (compBytes < 20 * 1e3)
1643
- str += kleur.green(compSize);
1644
- else if (compBytes < 50 * 1e3)
1645
- str += kleur.yellow(compSize);
1646
- else
1647
- str += kleur.bold(kleur.red(compSize));
1603
+ if (compBytes < 20 * 1e3) str += kleur.green(compSize);
1604
+ else if (compBytes < 50 * 1e3) str += kleur.yellow(compSize);
1605
+ else str += kleur.bold(kleur.red(compSize));
1648
1606
  return str;
1649
1607
  }
1650
1608
  function prettyPath(path4) {
@@ -1714,6 +1672,31 @@ process.once("beforeExit", (code) => {
1714
1672
  }
1715
1673
  });
1716
1674
 
1675
+ // src/adapter/utils.ts
1676
+ import supporsColor from "supports-color";
1677
+ import kleur2 from "kleur";
1678
+ function stripAnsi(string) {
1679
+ return string.replace(
1680
+ /([\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><])/g,
1681
+ ""
1682
+ );
1683
+ }
1684
+ function cleanStack(stack) {
1685
+ return stack.split(/\n/).filter((l) => /^\s*at/.test(l)).join("\n");
1686
+ }
1687
+ function prepareError(err) {
1688
+ var _a;
1689
+ return {
1690
+ message: stripAnsi(err.message),
1691
+ stack: stripAnsi(cleanStack(err.stack || "")),
1692
+ id: err.id,
1693
+ frame: stripAnsi(err.frame || ""),
1694
+ plugin: err.plugin,
1695
+ pluginCode: (_a = err.pluginCode) == null ? void 0 : _a.toString(),
1696
+ loc: err.loc
1697
+ };
1698
+ }
1699
+
1717
1700
  // src/vite/plugin.ts
1718
1701
  var debug = createDebug("@marko/run");
1719
1702
  var __dirname = path3.dirname(fileURLToPath(import.meta.url));
@@ -1737,11 +1720,10 @@ function markoRun(opts = {}) {
1737
1720
  let devServer;
1738
1721
  let routes;
1739
1722
  let routeData;
1740
- let extractVerbs;
1723
+ let getExportsFromFile;
1741
1724
  let resolvedConfig;
1742
1725
  let typesFile;
1743
- let isStale = true;
1744
- let isRendered = false;
1726
+ let seenErrors = /* @__PURE__ */ new Set();
1745
1727
  const virtualFiles = /* @__PURE__ */ new Map();
1746
1728
  let times = {
1747
1729
  routesBuild: 0,
@@ -1764,97 +1746,134 @@ function markoRun(opts = {}) {
1764
1746
  }
1765
1747
  }
1766
1748
  }
1767
- const buildVirtualFiles = single(async (render) => {
1768
- var _a;
1769
- const routerOptions = {
1770
- trailingSlashes: opts.trailingSlashes || "RedirectWithout"
1771
- };
1772
- try {
1773
- if (isStale) {
1749
+ let buildVirtualFilesResult;
1750
+ function buildVirtualFiles() {
1751
+ return buildVirtualFilesResult ?? (buildVirtualFilesResult = new Promise(async (resolve, reject) => {
1752
+ try {
1774
1753
  virtualFiles.clear();
1775
- isRendered = false;
1776
- const buildStartTime = performance.now();
1777
1754
  routes = await buildRoutes({
1778
1755
  walker: createFSWalker(resolvedRoutesDir),
1779
1756
  importPrefix: routesDir
1780
1757
  });
1781
- times.routesBuild = performance.now() - buildStartTime;
1782
1758
  if (!routes.list.length) {
1783
1759
  throw new Error("No routes generated");
1784
1760
  }
1785
- }
1786
- const renderStartTime = performance.now();
1787
- for (const route of routes.list) {
1788
- if (render && route.handler) {
1789
- route.handler.verbs = await extractVerbs(route.handler.filePath);
1790
- if (!route.handler.verbs.length) {
1791
- throw new Error(
1792
- `Did not find any valid exports in middleware entry file:'${route.handler.filePath}' - expected to find any of 'GET', 'POST', 'PUT' or 'DELETE'`
1761
+ for (const route of routes.list) {
1762
+ if (route.page) {
1763
+ virtualFiles.set(
1764
+ path3.posix.join(root, `${route.entryName}.marko`),
1765
+ ""
1793
1766
  );
1794
1767
  }
1768
+ virtualFiles.set(path3.posix.join(root, `${route.entryName}.js`), "");
1795
1769
  }
1796
- if (route.page) {
1770
+ for (const route of Object.values(routes.special)) {
1797
1771
  virtualFiles.set(
1798
1772
  path3.posix.join(root, `${route.entryName}.marko`),
1799
- render ? renderRouteTemplate(route) : ""
1773
+ ""
1800
1774
  );
1801
1775
  }
1802
- virtualFiles.set(
1803
- path3.posix.join(root, `${route.entryName}.js`),
1804
- render ? renderRouteEntry(route) : ""
1805
- );
1806
- }
1807
- for (const route of Object.values(routes.special)) {
1808
- virtualFiles.set(
1809
- path3.posix.join(root, `${route.entryName}.marko`),
1810
- render ? renderRouteTemplate(route) : ""
1811
- );
1776
+ if (routes.middleware.length) {
1777
+ virtualFiles.set(
1778
+ path3.posix.join(root, `${markoRunFilePrefix}middleware.js`),
1779
+ ""
1780
+ );
1781
+ }
1782
+ virtualFiles.set("@marko/run/router", "");
1783
+ resolve(routes);
1784
+ } catch (err) {
1785
+ reject(err);
1812
1786
  }
1813
- if (routes.middleware.length) {
1787
+ }));
1788
+ }
1789
+ let renderVirtualFilesResult;
1790
+ function renderVirtualFiles(context) {
1791
+ return renderVirtualFilesResult ?? (renderVirtualFilesResult = new Promise(async (resolve) => {
1792
+ var _a;
1793
+ const routerOptions = {
1794
+ trailingSlashes: opts.trailingSlashes || "RedirectWithout"
1795
+ };
1796
+ try {
1797
+ const routes2 = await buildVirtualFiles();
1798
+ for (const route of routes2.list) {
1799
+ if (route.handler) {
1800
+ const exports = await getExportsFromFile(
1801
+ context,
1802
+ route.handler.filePath
1803
+ );
1804
+ route.handler.verbs = [];
1805
+ for (const name of exports) {
1806
+ const verb = name.toLowerCase();
1807
+ if (name === verb.toUpperCase() && httpVerbs.includes(verb)) {
1808
+ route.handler.verbs.push(verb);
1809
+ }
1810
+ }
1811
+ if (!route.handler.verbs.length) {
1812
+ context.warn(
1813
+ `Did not find any http verb exports in handler '${path3.relative(root, route.handler.filePath)}' - expected ${httpVerbs.map((v) => v.toUpperCase()).join(", ")}`
1814
+ );
1815
+ }
1816
+ }
1817
+ if (route.page) {
1818
+ virtualFiles.set(
1819
+ path3.posix.join(root, `${route.entryName}.marko`),
1820
+ renderRouteTemplate(route)
1821
+ );
1822
+ }
1823
+ virtualFiles.set(
1824
+ path3.posix.join(root, `${route.entryName}.js`),
1825
+ renderRouteEntry(route)
1826
+ );
1827
+ }
1828
+ for (const route of Object.values(routes2.special)) {
1829
+ virtualFiles.set(
1830
+ path3.posix.join(root, `${route.entryName}.marko`),
1831
+ renderRouteTemplate(route)
1832
+ );
1833
+ }
1834
+ if (routes2.middleware.length) {
1835
+ for (const middleware of routes2.middleware) {
1836
+ if (!(await getExportsFromFile(context, middleware.filePath)).includes("default")) {
1837
+ context.warn(
1838
+ `Did not find a default export in middleware '${path3.relative(root, middleware.filePath)}'`
1839
+ );
1840
+ }
1841
+ }
1842
+ virtualFiles.set(
1843
+ path3.posix.join(root, `${markoRunFilePrefix}middleware.js`),
1844
+ renderMiddleware(routes2.middleware)
1845
+ );
1846
+ }
1814
1847
  virtualFiles.set(
1815
- path3.posix.join(root, `${markoRunFilePrefix}middleware.js`),
1816
- render ? renderMiddleware(routes.middleware) : ""
1848
+ "@marko/run/router",
1849
+ renderRouter(routes2, routerOptions)
1817
1850
  );
1818
- }
1819
- virtualFiles.set(
1820
- "@marko/run/router",
1821
- render ? renderRouter(routes, routerOptions) : ""
1822
- );
1823
- times.routesRender = performance.now() - renderStartTime;
1824
- if (render) {
1825
- await writeTypesFile(routes);
1851
+ await writeTypesFile(routes2);
1826
1852
  if (adapter == null ? void 0 : adapter.routesGenerated) {
1827
1853
  await adapter.routesGenerated(
1828
- routes,
1854
+ routes2,
1829
1855
  new Map(virtualFiles.entries()),
1830
1856
  {
1831
1857
  buildTime: times.routesBuild,
1832
1858
  renderTime: times.routesRender
1833
1859
  }
1834
1860
  );
1861
+ if (!isBuild) {
1862
+ await ((_a = opts == null ? void 0 : opts.emitRoutes) == null ? void 0 : _a.call(opts, routes2.list));
1863
+ }
1835
1864
  }
1836
- if (!isBuild) {
1837
- await ((_a = opts == null ? void 0 : opts.emitRoutes) == null ? void 0 : _a.call(opts, routes.list));
1865
+ } catch (err) {
1866
+ if (isBuild) {
1867
+ throw err;
1838
1868
  }
1839
- isRendered = true;
1840
- }
1841
- } catch (err) {
1842
- if (isBuild) {
1843
- throw err;
1869
+ virtualFiles.set(
1870
+ "@marko/run/router",
1871
+ `throw ${JSON.stringify(prepareError(err))}`
1872
+ );
1844
1873
  }
1845
- console.error(err);
1846
- virtualFiles.set(
1847
- path3.posix.join(root, `${markoRunFilePrefix}error.marko`),
1848
- renderEntryTemplate(`${markoRunFilePrefix}error`, ["<dev-error-page>"])
1849
- );
1850
- virtualFiles.set(
1851
- "@marko/run/router",
1852
- renderErrorRouter(err, routerOptions)
1853
- );
1854
- isRendered = true;
1855
- }
1856
- isStale = false;
1857
- });
1874
+ resolve();
1875
+ }));
1876
+ }
1858
1877
  return [
1859
1878
  {
1860
1879
  name: `${PLUGIN_NAME_PREFIX}:pre`,
@@ -1890,12 +1909,6 @@ function markoRun(opts = {}) {
1890
1909
  template: normalizePath(
1891
1910
  path3.resolve(__dirname, "../components/dev-error-page.marko")
1892
1911
  )
1893
- },
1894
- "<*>": {
1895
- transform: path3.resolve(
1896
- __dirname,
1897
- "../components/src-attributes-transformer.cjs"
1898
- )
1899
1912
  }
1900
1913
  });
1901
1914
  routesDir = opts.routesDir || "src/routes";
@@ -1980,7 +1993,12 @@ function markoRun(opts = {}) {
1980
1993
  ] : void 0
1981
1994
  },
1982
1995
  resolve: isBuild ? {
1983
- mainFields: (isSSRBuild ? [] : ["browser"]).concat(["module", "jsnext:main", "jsnext", "main"]),
1996
+ mainFields: (isSSRBuild ? [] : ["browser"]).concat([
1997
+ "module",
1998
+ "jsnext:main",
1999
+ "jsnext",
2000
+ "main"
2001
+ ]),
1984
2002
  conditions: [
1985
2003
  isSSRBuild ? "node" : "browser",
1986
2004
  "import",
@@ -2015,29 +2033,44 @@ function markoRun(opts = {}) {
2015
2033
  } else {
2016
2034
  ssrEntryFiles = [];
2017
2035
  }
2036
+ const baseError = config2.logger.error;
2037
+ config2.logger.error = function(msg, options) {
2038
+ var _a;
2039
+ if (!((_a = options == null ? void 0 : options.error) == null ? void 0 : _a.message)) {
2040
+ baseError.call(this, msg, options);
2041
+ } else if (!seenErrors.has(options.error.message)) {
2042
+ seenErrors.add(options.error.message);
2043
+ console.error(buildErrorMessage(options.error));
2044
+ }
2045
+ };
2018
2046
  },
2019
2047
  configureServer(_server) {
2020
2048
  devServer = _server;
2021
2049
  devServer.watcher.on("all", async (type, filename) => {
2022
- const routableFileType = matchRoutableFile(path3.parse(filename).base);
2050
+ seenErrors.clear();
2051
+ const routableFileType = matchRoutableFile(
2052
+ path3.parse(filename).base
2053
+ );
2023
2054
  if (filename.startsWith(resolvedRoutesDir) && routableFileType) {
2024
- if (type === "add") {
2025
- isStale = true;
2026
- } else if (type === "unlink") {
2027
- isStale = true;
2028
- } else if (type === "change") {
2029
- if (routableFileType === RoutableFileTypes.Handler) {
2030
- isStale = true;
2031
- }
2032
- }
2033
- if (isStale) {
2034
- for (const id of virtualFiles.keys()) {
2035
- devServer.watcher.emit("change", id);
2036
- break;
2055
+ if (type === "add" || type === "unlink" || type === "change" && (routableFileType === RoutableFileTypes.Handler || routableFileType === RoutableFileTypes.Middleware)) {
2056
+ buildVirtualFilesResult = void 0;
2057
+ renderVirtualFilesResult = void 0;
2058
+ const module = devServer.moduleGraph.getModuleById(filename);
2059
+ const importers = module && getImporters(module, filename);
2060
+ if (importers == null ? void 0 : importers.size) {
2061
+ for (const file of importers) {
2062
+ devServer.watcher.emit("change", file);
2063
+ }
2064
+ } else {
2065
+ for (const file of virtualFiles.keys()) {
2066
+ if (!file.endsWith(".marko")) {
2067
+ devServer.watcher.emit("change", file);
2068
+ }
2069
+ }
2037
2070
  }
2038
2071
  }
2039
2072
  }
2040
- });
2073
+ }).unwatch(typesDir + "/*");
2041
2074
  },
2042
2075
  async buildStart(_options) {
2043
2076
  if (isBuild && !isSSRBuild) {
@@ -2053,10 +2086,10 @@ function markoRun(opts = {}) {
2053
2086
  for (const { key, code } of routeData.files) {
2054
2087
  virtualFiles.set(key, code);
2055
2088
  }
2056
- isStale = false;
2057
- isRendered = true;
2089
+ buildVirtualFilesResult = Promise.resolve(routes);
2090
+ renderVirtualFilesResult = Promise.resolve();
2058
2091
  } else {
2059
- extractVerbs = isBuild ? getVerbsFromFileBuild.bind(null, this) : getVerbsFromFileDev.bind(null, devServer);
2092
+ getExportsFromFile = isBuild ? getExportsFromFileBuild : getExportsFromFileDev.bind(null, devServer);
2060
2093
  }
2061
2094
  },
2062
2095
  async resolveId(importee, importer) {
@@ -2069,8 +2102,8 @@ function markoRun(opts = {}) {
2069
2102
  importee = path3.resolve(root, "." + importee);
2070
2103
  }
2071
2104
  importee = normalizePath(importee);
2072
- if (isStale) {
2073
- await buildVirtualFiles(false);
2105
+ if (!buildVirtualFilesResult) {
2106
+ await buildVirtualFiles();
2074
2107
  }
2075
2108
  if (virtualFiles.has(importee)) {
2076
2109
  resolved = importee;
@@ -2087,11 +2120,13 @@ function markoRun(opts = {}) {
2087
2120
  if (id.endsWith(serverEntryQuery)) {
2088
2121
  id = id.slice(0, -serverEntryQuery.length);
2089
2122
  }
2123
+ if (!renderVirtualFilesResult) {
2124
+ await renderVirtualFiles(this);
2125
+ }
2090
2126
  if (virtualFiles.has(id)) {
2091
- if (isStale || !isRendered) {
2092
- await buildVirtualFiles(true);
2093
- }
2094
2127
  return virtualFiles.get(id);
2128
+ } else if (path3.basename(id).startsWith(markoRunFilePrefix) && /^\.(js|marko)$/.test(path3.extname(id))) {
2129
+ return "";
2095
2130
  }
2096
2131
  }
2097
2132
  },
@@ -2149,57 +2184,20 @@ function markoRun(opts = {}) {
2149
2184
  }
2150
2185
  ];
2151
2186
  }
2152
- async function getVerbsFromFileBuild(context, filePath) {
2153
- const verbs = [];
2187
+ async function getExportsFromFileBuild(context, filePath) {
2154
2188
  const result = await context.load({
2155
2189
  id: filePath,
2156
2190
  resolveDependencies: false
2157
2191
  });
2158
- if (result) {
2159
- const exportIds = getExportIdentifiers(result.ast);
2160
- for (const id of exportIds) {
2161
- const verb = id.toLowerCase();
2162
- if (id === verb.toUpperCase() && httpVerbs.includes(verb)) {
2163
- verbs.push(verb);
2164
- }
2165
- }
2166
- }
2167
- return verbs;
2192
+ return result ? getExportIdentifiers(result.ast) : [];
2168
2193
  }
2169
- async function getVerbsFromFileDev(devServer, filePath) {
2170
- const verbs = [];
2194
+ async function getExportsFromFileDev(devServer, context, filePath) {
2171
2195
  const result = await devServer.transformRequest(filePath, { ssr: true });
2172
- if (result && result.code) {
2173
- const verbMatchReg = /__vite_ssr_exports__,\s+["'](GET|POST|PUT|DELETE)["']/gi;
2174
- let match = verbMatchReg.exec(result.code);
2175
- while (match) {
2176
- const id = match[1];
2177
- const verb = id.toLowerCase();
2178
- if (httpVerbs.includes(verb)) {
2179
- if (id === verb.toUpperCase()) {
2180
- verbs.push(verb);
2181
- } else {
2182
- console.warn(
2183
- `Found export '${id}' in handler ${filePath} which is close to '${verb.toUpperCase()}'. Exported handlers need to be uppercase: GET, POST, PUT or DELETE.`
2184
- );
2185
- }
2186
- }
2187
- match = verbMatchReg.exec(result.code);
2188
- }
2196
+ if (result) {
2197
+ const ast = context.parse(result.code);
2198
+ return getViteSSRExportIdentifiers(ast);
2189
2199
  }
2190
- return verbs;
2191
- }
2192
- function single(fn) {
2193
- let promise;
2194
- return async (...args) => {
2195
- if (promise) {
2196
- return promise;
2197
- }
2198
- promise = fn(...args);
2199
- const result = await promise;
2200
- promise = void 0;
2201
- return result;
2202
- };
2200
+ return [];
2203
2201
  }
2204
2202
  async function globFileExists(root, pattern) {
2205
2203
  return (await glob(pattern, { root })).length > 0;
@@ -2252,6 +2250,15 @@ function getEntryFileName(file) {
2252
2250
  const match = file && markoEntryFileRegex.exec(file);
2253
2251
  return match ? match[2] || "index" : void 0;
2254
2252
  }
2253
+ function getImporters(module, fileName, seen = /* @__PURE__ */ new Set()) {
2254
+ for (const importer of module.importers) {
2255
+ if (importer.id && !seen.has(importer.id)) {
2256
+ seen.add(importer.id);
2257
+ getImporters(importer, fileName, seen);
2258
+ }
2259
+ }
2260
+ return seen;
2261
+ }
2255
2262
 
2256
2263
  // src/vite/utils/server.ts
2257
2264
  import net from "net";
@@ -1 +1,2 @@
1
1
  export declare function getExportIdentifiers(astProgramNode: any): string[];
2
+ export declare function getViteSSRExportIdentifiers(astProgramNode: any, exportObjectName?: string): string[];
@@ -1,6 +1,3 @@
1
- /// <reference types="node" />
2
- /// <reference types="node" />
3
- /// <reference types="node" />
4
1
  import { type Socket } from "net";
5
2
  import { type ChildProcess, type StdioOptions } from "child_process";
6
3
  import { type Worker } from "cluster";