@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,3 +1,3 @@
1
- export declare const fetch: <TPlatform extends import("./types").Platform = import("./types").Platform>(request: Request, platform: TPlatform) => Promise<void | Response>;
1
+ export declare const fetch: <TPlatform extends import("./types").Platform = import("./types").Platform>(request: Request, platform: TPlatform) => ReturnType<import("./types").Fetch<TPlatform>>;
2
2
  export declare const match: import("./types").Match;
3
- export declare const invoke: <TPlatform extends import("./types").Platform = import("./types").Platform>(route: import("./types").RouteWithHandler<import("./types").ParamsObject, unknown, string> | null, request: Request, platform: TPlatform) => Promise<void | Response>;
3
+ export declare const invoke: <TPlatform extends import("./types").Platform = import("./types").Platform>(route: import("./types").RouteWithHandler<import("./types").ParamsObject, unknown, string> | null, request: Request, platform: TPlatform) => ReturnType<import("./types").Invoke<TPlatform>>;
@@ -5,6 +5,9 @@ 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 __typeError = (msg) => {
9
+ throw TypeError(msg);
10
+ };
8
11
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
12
  var __export = (target, all) => {
10
13
  for (var name in all)
@@ -27,28 +30,11 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
27
30
  mod
28
31
  ));
29
32
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
- var __publicField = (obj, key, value) => {
31
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
32
- return value;
33
- };
34
- var __accessCheck = (obj, member, msg) => {
35
- if (!member.has(obj))
36
- throw TypeError("Cannot " + msg);
37
- };
38
- var __privateGet = (obj, member, getter) => {
39
- __accessCheck(obj, member, "read from private field");
40
- return getter ? getter.call(obj) : member.get(obj);
41
- };
42
- var __privateAdd = (obj, member, value) => {
43
- if (member.has(obj))
44
- throw TypeError("Cannot add the same private member more than once");
45
- member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
46
- };
47
- var __privateSet = (obj, member, value, setter) => {
48
- __accessCheck(obj, member, "write to private field");
49
- setter ? setter.call(obj, value) : member.set(obj, value);
50
- return value;
51
- };
33
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
34
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
35
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
36
+ 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);
37
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
52
38
 
53
39
  // src/vite/index.ts
54
40
  var vite_exports = {};
@@ -97,8 +83,8 @@ var RoutableFileTypes = {
97
83
  var _dirs, _pathlessDirs;
98
84
  var _VDir = class _VDir {
99
85
  constructor(parent, segment, source) {
100
- __privateAdd(this, _dirs, void 0);
101
- __privateAdd(this, _pathlessDirs, void 0);
86
+ __privateAdd(this, _dirs);
87
+ __privateAdd(this, _pathlessDirs);
102
88
  __publicField(this, "parent");
103
89
  __publicField(this, "source");
104
90
  __publicField(this, "path");
@@ -238,8 +224,7 @@ var VDir = _VDir;
238
224
 
239
225
  // src/vite/routes/parse.ts
240
226
  function parseFlatRoute(pattern) {
241
- if (!pattern)
242
- throw new Error("Empty pattern");
227
+ if (!pattern) throw new Error("Empty pattern");
243
228
  const len = pattern.length;
244
229
  let i = 0;
245
230
  return parse2([
@@ -945,45 +930,6 @@ function writeRouteEntryHandler(writer, route, verb) {
945
930
  continuations.join();
946
931
  writer.writeBlockEnd("}");
947
932
  }
948
- function renderErrorRouter(error, options = {
949
- trailingSlashes: "RedirectWithout"
950
- }) {
951
- const writer = createStringWriter();
952
- writer.write(`
953
- // @marko/run/router
954
- import { createContext } from '${virtualFilePrefix}/runtime/internal';
955
- import errorPage from '${virtualFilePrefix}/${markoRunFilePrefix}error.marko${serverEntryQuery}';
956
-
957
- const error = new Error(\`${error.message}\`);
958
- error.name = '${error.name}';`);
959
- if (error.stack) {
960
- writer.write(`
961
- error.stack = \`${error.stack}\`;`);
962
- }
963
- writer.write(`
964
-
965
- globalThis.__marko_run__ = { match, fetch, invoke };
966
-
967
- export function match() {
968
- return { handler: errorPage, params: {}, meta: {}, path: '/*' }; // /$$
969
- }
970
-
971
- export async function invoke(route, request, platform, url) {
972
- const [context, buildInput] = createContext(route, request, platform, url);
973
- if (context.request.headers.get('Accept')?.includes('text/html')) {
974
- return new Response(errorPage.stream(buildInput({ error })), {
975
- status: 500,
976
- headers: { "content-type": "text/html;charset=UTF-8" },
977
- });
978
- }
979
- return new Response(error, {
980
- status: 500,
981
- });
982
- }
983
- `);
984
- renderFetch(writer, options);
985
- return writer.end();
986
- }
987
933
  function renderRouter(routes, options = {
988
934
  trailingSlashes: "RedirectWithout"
989
935
  }) {
@@ -1116,15 +1062,7 @@ export async function fetch(request, platform) {
1116
1062
  return await invoke(route, request, platform, url);
1117
1063
  } catch (error) {
1118
1064
  if (import.meta.env.DEV) {
1119
- let body;
1120
- if (error.cause) {
1121
- body = error.cause.stack || error.cause.message || error.cause;
1122
- } else {
1123
- body = error.stack || error.message || "Internal Server Error";
1124
- }
1125
- return new Response(body, {
1126
- status: 500
1127
- });
1065
+ throw error;
1128
1066
  }
1129
1067
  return new Response(null, {
1130
1068
  status: 500
@@ -1564,6 +1502,29 @@ function getExportIdentifiers(astProgramNode) {
1564
1502
  }
1565
1503
  return result;
1566
1504
  }
1505
+ function getViteSSRExportIdentifiers(astProgramNode, exportObjectName = "__vite_ssr_exports__") {
1506
+ const result = [];
1507
+ if (t.isProgram(astProgramNode)) {
1508
+ for (const node of astProgramNode.body) {
1509
+ if (t.isExpressionStatement(node)) {
1510
+ if (t.isAssignmentExpression(node.expression) && t.isMemberExpression(node.expression.left)) {
1511
+ const { object, property } = node.expression.left;
1512
+ if (t.isIdentifier(object) && object.name === exportObjectName && t.isIdentifier(property)) {
1513
+ result.push(property.name);
1514
+ }
1515
+ } else if (t.isCallExpression(node.expression) && t.isMemberExpression(node.expression.callee)) {
1516
+ const {
1517
+ arguments: [arg0, arg1]
1518
+ } = node.expression;
1519
+ if (t.isIdentifier(arg0) && arg0.name === exportObjectName && (t.isStringLiteral(arg1) || "value" in arg1 && typeof arg1.value === "string")) {
1520
+ result.push(arg1.value);
1521
+ }
1522
+ }
1523
+ }
1524
+ }
1525
+ }
1526
+ return result;
1527
+ }
1567
1528
 
1568
1529
  // src/vite/utils/log.ts
1569
1530
  var import_node_zlib = __toESM(require("node:zlib"), 1);
@@ -1684,12 +1645,9 @@ function prettySize([bytes, compBytes]) {
1684
1645
  const [size, prefix] = (0, import_human_format.default)(bytes, { decimals: 1 }).split(/\s+/);
1685
1646
  const compSize = (0, import_human_format.default)(compBytes, { decimals: 1, prefix, unit: "B" });
1686
1647
  let str = import_kleur.default.white(size) + import_kleur.default.gray("/");
1687
- if (compBytes < 20 * 1e3)
1688
- str += import_kleur.default.green(compSize);
1689
- else if (compBytes < 50 * 1e3)
1690
- str += import_kleur.default.yellow(compSize);
1691
- else
1692
- str += import_kleur.default.bold(import_kleur.default.red(compSize));
1648
+ if (compBytes < 20 * 1e3) str += import_kleur.default.green(compSize);
1649
+ else if (compBytes < 50 * 1e3) str += import_kleur.default.yellow(compSize);
1650
+ else str += import_kleur.default.bold(import_kleur.default.red(compSize));
1693
1651
  return str;
1694
1652
  }
1695
1653
  function prettyPath(path4) {
@@ -1759,6 +1717,31 @@ process.once("beforeExit", (code) => {
1759
1717
  }
1760
1718
  });
1761
1719
 
1720
+ // src/adapter/utils.ts
1721
+ var import_supports_color = __toESM(require("supports-color"), 1);
1722
+ var import_kleur2 = __toESM(require("kleur"), 1);
1723
+ function stripAnsi(string) {
1724
+ return string.replace(
1725
+ /([\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><])/g,
1726
+ ""
1727
+ );
1728
+ }
1729
+ function cleanStack(stack) {
1730
+ return stack.split(/\n/).filter((l) => /^\s*at/.test(l)).join("\n");
1731
+ }
1732
+ function prepareError(err) {
1733
+ var _a;
1734
+ return {
1735
+ message: stripAnsi(err.message),
1736
+ stack: stripAnsi(cleanStack(err.stack || "")),
1737
+ id: err.id,
1738
+ frame: stripAnsi(err.frame || ""),
1739
+ plugin: err.plugin,
1740
+ pluginCode: (_a = err.pluginCode) == null ? void 0 : _a.toString(),
1741
+ loc: err.loc
1742
+ };
1743
+ }
1744
+
1762
1745
  // src/vite/plugin.ts
1763
1746
  var debug = (0, import_debug.default)("@marko/run");
1764
1747
  var __dirname = import_path3.default.dirname((0, import_url2.fileURLToPath)(__importMetaURL));
@@ -1782,11 +1765,10 @@ function markoRun(opts = {}) {
1782
1765
  let devServer;
1783
1766
  let routes;
1784
1767
  let routeData;
1785
- let extractVerbs;
1768
+ let getExportsFromFile;
1786
1769
  let resolvedConfig;
1787
1770
  let typesFile;
1788
- let isStale = true;
1789
- let isRendered = false;
1771
+ let seenErrors = /* @__PURE__ */ new Set();
1790
1772
  const virtualFiles = /* @__PURE__ */ new Map();
1791
1773
  let times = {
1792
1774
  routesBuild: 0,
@@ -1809,97 +1791,134 @@ function markoRun(opts = {}) {
1809
1791
  }
1810
1792
  }
1811
1793
  }
1812
- const buildVirtualFiles = single(async (render) => {
1813
- var _a;
1814
- const routerOptions = {
1815
- trailingSlashes: opts.trailingSlashes || "RedirectWithout"
1816
- };
1817
- try {
1818
- if (isStale) {
1794
+ let buildVirtualFilesResult;
1795
+ function buildVirtualFiles() {
1796
+ return buildVirtualFilesResult ?? (buildVirtualFilesResult = new Promise(async (resolve, reject) => {
1797
+ try {
1819
1798
  virtualFiles.clear();
1820
- isRendered = false;
1821
- const buildStartTime = performance.now();
1822
1799
  routes = await buildRoutes({
1823
1800
  walker: createFSWalker(resolvedRoutesDir),
1824
1801
  importPrefix: routesDir
1825
1802
  });
1826
- times.routesBuild = performance.now() - buildStartTime;
1827
1803
  if (!routes.list.length) {
1828
1804
  throw new Error("No routes generated");
1829
1805
  }
1830
- }
1831
- const renderStartTime = performance.now();
1832
- for (const route of routes.list) {
1833
- if (render && route.handler) {
1834
- route.handler.verbs = await extractVerbs(route.handler.filePath);
1835
- if (!route.handler.verbs.length) {
1836
- throw new Error(
1837
- `Did not find any valid exports in middleware entry file:'${route.handler.filePath}' - expected to find any of 'GET', 'POST', 'PUT' or 'DELETE'`
1806
+ for (const route of routes.list) {
1807
+ if (route.page) {
1808
+ virtualFiles.set(
1809
+ import_path3.default.posix.join(root, `${route.entryName}.marko`),
1810
+ ""
1838
1811
  );
1839
1812
  }
1813
+ virtualFiles.set(import_path3.default.posix.join(root, `${route.entryName}.js`), "");
1840
1814
  }
1841
- if (route.page) {
1815
+ for (const route of Object.values(routes.special)) {
1842
1816
  virtualFiles.set(
1843
1817
  import_path3.default.posix.join(root, `${route.entryName}.marko`),
1844
- render ? renderRouteTemplate(route) : ""
1818
+ ""
1845
1819
  );
1846
1820
  }
1847
- virtualFiles.set(
1848
- import_path3.default.posix.join(root, `${route.entryName}.js`),
1849
- render ? renderRouteEntry(route) : ""
1850
- );
1851
- }
1852
- for (const route of Object.values(routes.special)) {
1853
- virtualFiles.set(
1854
- import_path3.default.posix.join(root, `${route.entryName}.marko`),
1855
- render ? renderRouteTemplate(route) : ""
1856
- );
1821
+ if (routes.middleware.length) {
1822
+ virtualFiles.set(
1823
+ import_path3.default.posix.join(root, `${markoRunFilePrefix}middleware.js`),
1824
+ ""
1825
+ );
1826
+ }
1827
+ virtualFiles.set("@marko/run/router", "");
1828
+ resolve(routes);
1829
+ } catch (err) {
1830
+ reject(err);
1857
1831
  }
1858
- if (routes.middleware.length) {
1832
+ }));
1833
+ }
1834
+ let renderVirtualFilesResult;
1835
+ function renderVirtualFiles(context) {
1836
+ return renderVirtualFilesResult ?? (renderVirtualFilesResult = new Promise(async (resolve) => {
1837
+ var _a;
1838
+ const routerOptions = {
1839
+ trailingSlashes: opts.trailingSlashes || "RedirectWithout"
1840
+ };
1841
+ try {
1842
+ const routes2 = await buildVirtualFiles();
1843
+ for (const route of routes2.list) {
1844
+ if (route.handler) {
1845
+ const exports2 = await getExportsFromFile(
1846
+ context,
1847
+ route.handler.filePath
1848
+ );
1849
+ route.handler.verbs = [];
1850
+ for (const name of exports2) {
1851
+ const verb = name.toLowerCase();
1852
+ if (name === verb.toUpperCase() && httpVerbs.includes(verb)) {
1853
+ route.handler.verbs.push(verb);
1854
+ }
1855
+ }
1856
+ if (!route.handler.verbs.length) {
1857
+ context.warn(
1858
+ `Did not find any http verb exports in handler '${import_path3.default.relative(root, route.handler.filePath)}' - expected ${httpVerbs.map((v) => v.toUpperCase()).join(", ")}`
1859
+ );
1860
+ }
1861
+ }
1862
+ if (route.page) {
1863
+ virtualFiles.set(
1864
+ import_path3.default.posix.join(root, `${route.entryName}.marko`),
1865
+ renderRouteTemplate(route)
1866
+ );
1867
+ }
1868
+ virtualFiles.set(
1869
+ import_path3.default.posix.join(root, `${route.entryName}.js`),
1870
+ renderRouteEntry(route)
1871
+ );
1872
+ }
1873
+ for (const route of Object.values(routes2.special)) {
1874
+ virtualFiles.set(
1875
+ import_path3.default.posix.join(root, `${route.entryName}.marko`),
1876
+ renderRouteTemplate(route)
1877
+ );
1878
+ }
1879
+ if (routes2.middleware.length) {
1880
+ for (const middleware of routes2.middleware) {
1881
+ if (!(await getExportsFromFile(context, middleware.filePath)).includes("default")) {
1882
+ context.warn(
1883
+ `Did not find a default export in middleware '${import_path3.default.relative(root, middleware.filePath)}'`
1884
+ );
1885
+ }
1886
+ }
1887
+ virtualFiles.set(
1888
+ import_path3.default.posix.join(root, `${markoRunFilePrefix}middleware.js`),
1889
+ renderMiddleware(routes2.middleware)
1890
+ );
1891
+ }
1859
1892
  virtualFiles.set(
1860
- import_path3.default.posix.join(root, `${markoRunFilePrefix}middleware.js`),
1861
- render ? renderMiddleware(routes.middleware) : ""
1893
+ "@marko/run/router",
1894
+ renderRouter(routes2, routerOptions)
1862
1895
  );
1863
- }
1864
- virtualFiles.set(
1865
- "@marko/run/router",
1866
- render ? renderRouter(routes, routerOptions) : ""
1867
- );
1868
- times.routesRender = performance.now() - renderStartTime;
1869
- if (render) {
1870
- await writeTypesFile(routes);
1896
+ await writeTypesFile(routes2);
1871
1897
  if (adapter == null ? void 0 : adapter.routesGenerated) {
1872
1898
  await adapter.routesGenerated(
1873
- routes,
1899
+ routes2,
1874
1900
  new Map(virtualFiles.entries()),
1875
1901
  {
1876
1902
  buildTime: times.routesBuild,
1877
1903
  renderTime: times.routesRender
1878
1904
  }
1879
1905
  );
1906
+ if (!isBuild) {
1907
+ await ((_a = opts == null ? void 0 : opts.emitRoutes) == null ? void 0 : _a.call(opts, routes2.list));
1908
+ }
1880
1909
  }
1881
- if (!isBuild) {
1882
- await ((_a = opts == null ? void 0 : opts.emitRoutes) == null ? void 0 : _a.call(opts, routes.list));
1910
+ } catch (err) {
1911
+ if (isBuild) {
1912
+ throw err;
1883
1913
  }
1884
- isRendered = true;
1885
- }
1886
- } catch (err) {
1887
- if (isBuild) {
1888
- throw err;
1914
+ virtualFiles.set(
1915
+ "@marko/run/router",
1916
+ `throw ${JSON.stringify(prepareError(err))}`
1917
+ );
1889
1918
  }
1890
- console.error(err);
1891
- virtualFiles.set(
1892
- import_path3.default.posix.join(root, `${markoRunFilePrefix}error.marko`),
1893
- renderEntryTemplate(`${markoRunFilePrefix}error`, ["<dev-error-page>"])
1894
- );
1895
- virtualFiles.set(
1896
- "@marko/run/router",
1897
- renderErrorRouter(err, routerOptions)
1898
- );
1899
- isRendered = true;
1900
- }
1901
- isStale = false;
1902
- });
1919
+ resolve();
1920
+ }));
1921
+ }
1903
1922
  return [
1904
1923
  {
1905
1924
  name: `${PLUGIN_NAME_PREFIX}:pre`,
@@ -1935,12 +1954,6 @@ function markoRun(opts = {}) {
1935
1954
  template: normalizePath(
1936
1955
  import_path3.default.resolve(__dirname, "../components/dev-error-page.marko")
1937
1956
  )
1938
- },
1939
- "<*>": {
1940
- transform: import_path3.default.resolve(
1941
- __dirname,
1942
- "../components/src-attributes-transformer.cjs"
1943
- )
1944
1957
  }
1945
1958
  });
1946
1959
  routesDir = opts.routesDir || "src/routes";
@@ -2025,7 +2038,12 @@ function markoRun(opts = {}) {
2025
2038
  ] : void 0
2026
2039
  },
2027
2040
  resolve: isBuild ? {
2028
- mainFields: (isSSRBuild ? [] : ["browser"]).concat(["module", "jsnext:main", "jsnext", "main"]),
2041
+ mainFields: (isSSRBuild ? [] : ["browser"]).concat([
2042
+ "module",
2043
+ "jsnext:main",
2044
+ "jsnext",
2045
+ "main"
2046
+ ]),
2029
2047
  conditions: [
2030
2048
  isSSRBuild ? "node" : "browser",
2031
2049
  "import",
@@ -2060,29 +2078,44 @@ function markoRun(opts = {}) {
2060
2078
  } else {
2061
2079
  ssrEntryFiles = [];
2062
2080
  }
2081
+ const baseError = config2.logger.error;
2082
+ config2.logger.error = function(msg, options) {
2083
+ var _a;
2084
+ if (!((_a = options == null ? void 0 : options.error) == null ? void 0 : _a.message)) {
2085
+ baseError.call(this, msg, options);
2086
+ } else if (!seenErrors.has(options.error.message)) {
2087
+ seenErrors.add(options.error.message);
2088
+ console.error((0, import_vite.buildErrorMessage)(options.error));
2089
+ }
2090
+ };
2063
2091
  },
2064
2092
  configureServer(_server) {
2065
2093
  devServer = _server;
2066
2094
  devServer.watcher.on("all", async (type, filename) => {
2067
- const routableFileType = matchRoutableFile(import_path3.default.parse(filename).base);
2095
+ seenErrors.clear();
2096
+ const routableFileType = matchRoutableFile(
2097
+ import_path3.default.parse(filename).base
2098
+ );
2068
2099
  if (filename.startsWith(resolvedRoutesDir) && routableFileType) {
2069
- if (type === "add") {
2070
- isStale = true;
2071
- } else if (type === "unlink") {
2072
- isStale = true;
2073
- } else if (type === "change") {
2074
- if (routableFileType === RoutableFileTypes.Handler) {
2075
- isStale = true;
2076
- }
2077
- }
2078
- if (isStale) {
2079
- for (const id of virtualFiles.keys()) {
2080
- devServer.watcher.emit("change", id);
2081
- break;
2100
+ if (type === "add" || type === "unlink" || type === "change" && (routableFileType === RoutableFileTypes.Handler || routableFileType === RoutableFileTypes.Middleware)) {
2101
+ buildVirtualFilesResult = void 0;
2102
+ renderVirtualFilesResult = void 0;
2103
+ const module2 = devServer.moduleGraph.getModuleById(filename);
2104
+ const importers = module2 && getImporters(module2, filename);
2105
+ if (importers == null ? void 0 : importers.size) {
2106
+ for (const file of importers) {
2107
+ devServer.watcher.emit("change", file);
2108
+ }
2109
+ } else {
2110
+ for (const file of virtualFiles.keys()) {
2111
+ if (!file.endsWith(".marko")) {
2112
+ devServer.watcher.emit("change", file);
2113
+ }
2114
+ }
2082
2115
  }
2083
2116
  }
2084
2117
  }
2085
- });
2118
+ }).unwatch(typesDir + "/*");
2086
2119
  },
2087
2120
  async buildStart(_options) {
2088
2121
  if (isBuild && !isSSRBuild) {
@@ -2098,10 +2131,10 @@ function markoRun(opts = {}) {
2098
2131
  for (const { key, code } of routeData.files) {
2099
2132
  virtualFiles.set(key, code);
2100
2133
  }
2101
- isStale = false;
2102
- isRendered = true;
2134
+ buildVirtualFilesResult = Promise.resolve(routes);
2135
+ renderVirtualFilesResult = Promise.resolve();
2103
2136
  } else {
2104
- extractVerbs = isBuild ? getVerbsFromFileBuild.bind(null, this) : getVerbsFromFileDev.bind(null, devServer);
2137
+ getExportsFromFile = isBuild ? getExportsFromFileBuild : getExportsFromFileDev.bind(null, devServer);
2105
2138
  }
2106
2139
  },
2107
2140
  async resolveId(importee, importer) {
@@ -2114,8 +2147,8 @@ function markoRun(opts = {}) {
2114
2147
  importee = import_path3.default.resolve(root, "." + importee);
2115
2148
  }
2116
2149
  importee = normalizePath(importee);
2117
- if (isStale) {
2118
- await buildVirtualFiles(false);
2150
+ if (!buildVirtualFilesResult) {
2151
+ await buildVirtualFiles();
2119
2152
  }
2120
2153
  if (virtualFiles.has(importee)) {
2121
2154
  resolved = importee;
@@ -2132,11 +2165,13 @@ function markoRun(opts = {}) {
2132
2165
  if (id.endsWith(serverEntryQuery)) {
2133
2166
  id = id.slice(0, -serverEntryQuery.length);
2134
2167
  }
2168
+ if (!renderVirtualFilesResult) {
2169
+ await renderVirtualFiles(this);
2170
+ }
2135
2171
  if (virtualFiles.has(id)) {
2136
- if (isStale || !isRendered) {
2137
- await buildVirtualFiles(true);
2138
- }
2139
2172
  return virtualFiles.get(id);
2173
+ } else if (import_path3.default.basename(id).startsWith(markoRunFilePrefix) && /^\.(js|marko)$/.test(import_path3.default.extname(id))) {
2174
+ return "";
2140
2175
  }
2141
2176
  }
2142
2177
  },
@@ -2194,57 +2229,20 @@ function markoRun(opts = {}) {
2194
2229
  }
2195
2230
  ];
2196
2231
  }
2197
- async function getVerbsFromFileBuild(context, filePath) {
2198
- const verbs = [];
2232
+ async function getExportsFromFileBuild(context, filePath) {
2199
2233
  const result = await context.load({
2200
2234
  id: filePath,
2201
2235
  resolveDependencies: false
2202
2236
  });
2203
- if (result) {
2204
- const exportIds = getExportIdentifiers(result.ast);
2205
- for (const id of exportIds) {
2206
- const verb = id.toLowerCase();
2207
- if (id === verb.toUpperCase() && httpVerbs.includes(verb)) {
2208
- verbs.push(verb);
2209
- }
2210
- }
2211
- }
2212
- return verbs;
2237
+ return result ? getExportIdentifiers(result.ast) : [];
2213
2238
  }
2214
- async function getVerbsFromFileDev(devServer, filePath) {
2215
- const verbs = [];
2239
+ async function getExportsFromFileDev(devServer, context, filePath) {
2216
2240
  const result = await devServer.transformRequest(filePath, { ssr: true });
2217
- if (result && result.code) {
2218
- const verbMatchReg = /__vite_ssr_exports__,\s+["'](GET|POST|PUT|DELETE)["']/gi;
2219
- let match = verbMatchReg.exec(result.code);
2220
- while (match) {
2221
- const id = match[1];
2222
- const verb = id.toLowerCase();
2223
- if (httpVerbs.includes(verb)) {
2224
- if (id === verb.toUpperCase()) {
2225
- verbs.push(verb);
2226
- } else {
2227
- console.warn(
2228
- `Found export '${id}' in handler ${filePath} which is close to '${verb.toUpperCase()}'. Exported handlers need to be uppercase: GET, POST, PUT or DELETE.`
2229
- );
2230
- }
2231
- }
2232
- match = verbMatchReg.exec(result.code);
2233
- }
2241
+ if (result) {
2242
+ const ast = context.parse(result.code);
2243
+ return getViteSSRExportIdentifiers(ast);
2234
2244
  }
2235
- return verbs;
2236
- }
2237
- function single(fn) {
2238
- let promise;
2239
- return async (...args) => {
2240
- if (promise) {
2241
- return promise;
2242
- }
2243
- promise = fn(...args);
2244
- const result = await promise;
2245
- promise = void 0;
2246
- return result;
2247
- };
2245
+ return [];
2248
2246
  }
2249
2247
  async function globFileExists(root, pattern) {
2250
2248
  return (await (0, import_glob.glob)(pattern, { root })).length > 0;
@@ -2297,6 +2295,15 @@ function getEntryFileName(file) {
2297
2295
  const match = file && markoEntryFileRegex.exec(file);
2298
2296
  return match ? match[2] || "index" : void 0;
2299
2297
  }
2298
+ function getImporters(module2, fileName, seen = /* @__PURE__ */ new Set()) {
2299
+ for (const importer of module2.importers) {
2300
+ if (importer.id && !seen.has(importer.id)) {
2301
+ seen.add(importer.id);
2302
+ getImporters(importer, fileName, seen);
2303
+ }
2304
+ }
2305
+ return seen;
2306
+ }
2300
2307
 
2301
2308
  // src/vite/utils/server.ts
2302
2309
  var import_net = __toESM(require("net"), 1);