@react-router/dev 0.0.0-experimental-9c1812606 → 0.0.0-experimental-a26b992a1

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.
Files changed (52) hide show
  1. package/bin.js +1 -1
  2. package/dist/cli/commands.js +1 -1
  3. package/dist/cli/detectPackageManager.js +1 -1
  4. package/dist/cli/index.d.ts +1 -1
  5. package/dist/cli/index.js +7 -6
  6. package/dist/cli/run.js +1 -1
  7. package/dist/cli/useJavascript.js +1 -1
  8. package/dist/colors.js +1 -1
  9. package/dist/config/defaults/entry.client.tsx +1 -1
  10. package/dist/config/format.js +1 -1
  11. package/dist/config/routes.d.ts +77 -50
  12. package/dist/config/routes.js +175 -43
  13. package/dist/invariant.js +1 -1
  14. package/dist/routes.d.ts +2 -0
  15. package/dist/routes.js +23 -0
  16. package/dist/vite/babel.d.ts +10 -10
  17. package/dist/vite/babel.js +1 -1
  18. package/dist/vite/build.js +2 -2
  19. package/dist/vite/cloudflare-dev-proxy.d.ts +7 -1
  20. package/dist/vite/cloudflare-dev-proxy.js +13 -6
  21. package/dist/vite/cloudflare.d.ts +1 -0
  22. package/dist/vite/cloudflare.js +19 -0
  23. package/dist/vite/combine-urls.js +1 -1
  24. package/dist/{config.d.ts → vite/config.d.ts} +15 -24
  25. package/dist/{config.js → vite/config.js} +61 -39
  26. package/dist/vite/dev.js +1 -1
  27. package/dist/vite/import-vite-esm-sync.js +1 -1
  28. package/dist/vite/node-adapter.js +1 -1
  29. package/dist/vite/plugin.d.ts +6 -3
  30. package/dist/vite/plugin.js +125 -89
  31. package/dist/vite/profiler.js +1 -1
  32. package/dist/vite/remove-exports.d.ts +2 -2
  33. package/dist/vite/remove-exports.js +113 -243
  34. package/dist/vite/resolve-file-url.js +1 -1
  35. package/dist/vite/static/refresh-utils.cjs +7 -26
  36. package/dist/vite/styles.d.ts +3 -2
  37. package/dist/vite/styles.js +23 -2
  38. package/dist/vite/vmod.js +1 -1
  39. package/dist/vite/with-props.d.ts +4 -0
  40. package/dist/vite/with-props.js +151 -0
  41. package/dist/vite.d.ts +2 -0
  42. package/dist/{cli.js → vite.js} +7 -8
  43. package/package.json +21 -12
  44. package/dist/cli.d.ts +0 -1
  45. package/dist/config/findConfig.d.ts +0 -1
  46. package/dist/config/findConfig.js +0 -32
  47. package/dist/config/flatRoutes.d.ts +0 -14
  48. package/dist/config/flatRoutes.js +0 -418
  49. package/dist/index.d.ts +0 -5
  50. package/dist/index.js +0 -23
  51. package/dist/vite/define-route.d.ts +0 -5
  52. package/dist/vite/define-route.js +0 -207
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-9c1812606
2
+ * @react-router/dev v0.0.0-experimental-a26b992a1
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -24,10 +24,17 @@ function importWrangler() {
24
24
  }
25
25
  }
26
26
  const PLUGIN_NAME = "react-router-cloudflare-vite-dev-proxy";
27
- const cloudflareDevProxyVitePlugin = ({
28
- getLoadContext,
29
- ...options
30
- } = {}) => {
27
+ /**
28
+ * Vite plugin that provides [Node proxies to local workerd
29
+ * bindings](https://developers.cloudflare.com/workers/wrangler/api/#getplatformproxy)
30
+ * to `context.cloudflare` in your server loaders and server actions during
31
+ * development.
32
+ */
33
+ const cloudflareDevProxyVitePlugin = (options = {}) => {
34
+ let {
35
+ getLoadContext,
36
+ ...restOptions
37
+ } = options;
31
38
  return {
32
39
  name: PLUGIN_NAME,
33
40
  config: () => ({
@@ -52,7 +59,7 @@ const cloudflareDevProxyVitePlugin = ({
52
59
  let {
53
60
  dispose,
54
61
  ...cloudflare
55
- } = await getPlatformProxy(options);
62
+ } = await getPlatformProxy(restOptions);
56
63
  let context = {
57
64
  cloudflare
58
65
  };
@@ -0,0 +1 @@
1
+ export { cloudflareDevProxyVitePlugin as cloudflareDevProxy } from "./cloudflare-dev-proxy";
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @react-router/dev v0.0.0-experimental-a26b992a1
3
+ *
4
+ * Copyright (c) Remix Software Inc.
5
+ *
6
+ * This source code is licensed under the MIT license found in the
7
+ * LICENSE.md file in the root directory of this source tree.
8
+ *
9
+ * @license MIT
10
+ */
11
+ 'use strict';
12
+
13
+ Object.defineProperty(exports, '__esModule', { value: true });
14
+
15
+ var cloudflareDevProxy = require('./cloudflare-dev-proxy.js');
16
+
17
+
18
+
19
+ exports.cloudflareDevProxy = cloudflareDevProxy.cloudflareDevProxyVitePlugin;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-9c1812606
2
+ * @react-router/dev v0.0.0-experimental-a26b992a1
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,20 +1,21 @@
1
1
  import type * as Vite from "vite";
2
- import { type RouteManifest, type ConfigRoute, type DefineRoutesFunction } from "./config/routes";
2
+ import type { ViteNodeRunner } from "vite-node/client";
3
+ import { type RouteManifest, type RouteManifestEntry } from "../config/routes";
3
4
  declare const excludedConfigPresetKeys: readonly ["presets"];
4
5
  type ExcludedConfigPresetKey = (typeof excludedConfigPresetKeys)[number];
5
- type ConfigPreset = Omit<VitePluginConfig, ExcludedConfigPresetKey>;
6
+ type ConfigPreset = Omit<ReactRouterConfig, ExcludedConfigPresetKey>;
6
7
  export type Preset = {
7
8
  name: string;
8
9
  reactRouterConfig?: (args: {
9
- reactRouterUserConfig: VitePluginConfig;
10
+ reactRouterUserConfig: ReactRouterConfig;
10
11
  }) => ConfigPreset | Promise<ConfigPreset>;
11
12
  reactRouterConfigResolved?: (args: {
12
- reactRouterConfig: ResolvedVitePluginConfig;
13
+ reactRouterConfig: ResolvedReactRouterConfig;
13
14
  }) => void | Promise<void>;
14
15
  };
15
16
  declare const branchRouteProperties: readonly ["id", "path", "file", "index"];
16
- type BranchRoute = Pick<ConfigRoute, (typeof branchRouteProperties)[number]>;
17
- export declare const configRouteToBranchRoute: (configRoute: ConfigRoute) => BranchRoute;
17
+ type BranchRoute = Pick<RouteManifestEntry, (typeof branchRouteProperties)[number]>;
18
+ export declare const configRouteToBranchRoute: (configRoute: RouteManifestEntry) => BranchRoute;
18
19
  export type ServerBundlesFunction = (args: {
19
20
  branch: BranchRoute[];
20
21
  }) => string | Promise<string>;
@@ -40,31 +41,19 @@ interface FutureConfig {
40
41
  export type BuildManifest = DefaultBuildManifest | ServerBundlesBuildManifest;
41
42
  type BuildEndHook = (args: {
42
43
  buildManifest: BuildManifest | undefined;
43
- reactRouterConfig: ResolvedVitePluginConfig;
44
+ reactRouterConfig: ResolvedReactRouterConfig;
44
45
  viteConfig: Vite.ResolvedConfig;
45
46
  }) => void | Promise<void>;
46
- export type VitePluginConfig = {
47
+ export type ReactRouterConfig = {
47
48
  /**
48
49
  * The path to the `app` directory, relative to `remix.config.js`. Defaults
49
50
  * to `"app"`.
50
51
  */
51
52
  appDirectory?: string;
52
- /**
53
- * A function for defining custom routes, in addition to those already defined
54
- * using the filesystem convention in `app/routes`. Both sets of routes will
55
- * be merged.
56
- */
57
- routes?: (defineRoutes: DefineRoutesFunction) => ReturnType<DefineRoutesFunction> | Promise<ReturnType<DefineRoutesFunction>>;
58
53
  /**
59
54
  * The output format of the server build. Defaults to "esm".
60
55
  */
61
56
  serverModuleFormat?: ServerModuleFormat;
62
- /**
63
- * A list of filenames or a glob patterns to match files in the `app/routes`
64
- * directory that Remix will ignore. Matching files will not be recognized as
65
- * routes.
66
- */
67
- ignoredRouteFiles?: string[];
68
57
  /**
69
58
  * Enabled future flags
70
59
  */
@@ -114,7 +103,7 @@ export type VitePluginConfig = {
114
103
  */
115
104
  ssr?: boolean;
116
105
  };
117
- export type ResolvedVitePluginConfig = Readonly<{
106
+ export type ResolvedReactRouterConfig = Readonly<{
118
107
  /**
119
108
  * The absolute path to the application source directory.
120
109
  */
@@ -168,11 +157,13 @@ export type ResolvedVitePluginConfig = Readonly<{
168
157
  ssr: boolean;
169
158
  }>;
170
159
  export declare function resolvePublicPath(viteUserConfig: Vite.UserConfig): string;
171
- export declare function resolveReactRouterConfig({ rootDirectory, reactRouterUserConfig, viteUserConfig, viteCommand, }: {
160
+ export declare function resolveReactRouterConfig({ rootDirectory, reactRouterUserConfig, routeConfigChanged, viteUserConfig, viteCommand, viteNodeRunner, }: {
172
161
  rootDirectory: string;
173
- reactRouterUserConfig: VitePluginConfig;
162
+ reactRouterUserConfig: ReactRouterConfig;
163
+ routeConfigChanged: boolean;
174
164
  viteUserConfig: Vite.UserConfig;
175
165
  viteCommand: Vite.ConfigEnv["command"];
166
+ viteNodeRunner: ViteNodeRunner;
176
167
  }): Promise<Readonly<{
177
168
  /**
178
169
  * The absolute path to the application source directory.
@@ -228,7 +219,7 @@ export declare function resolveReactRouterConfig({ rootDirectory, reactRouterUse
228
219
  }>>;
229
220
  export declare function resolveEntryFiles({ rootDirectory, reactRouterConfig, }: {
230
221
  rootDirectory: string;
231
- reactRouterConfig: ResolvedVitePluginConfig;
222
+ reactRouterConfig: ResolvedReactRouterConfig;
232
223
  }): Promise<{
233
224
  entryClientFilePath: string;
234
225
  entryServerFilePath: string;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-9c1812606
2
+ * @react-router/dev v0.0.0-experimental-a26b992a1
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -19,9 +19,9 @@ var colors = require('picocolors');
19
19
  var pick = require('lodash/pick');
20
20
  var omit = require('lodash/omit');
21
21
  var PackageJson = require('@npmcli/package-json');
22
- var routes = require('./config/routes.js');
23
- var flatRoutes = require('./config/flatRoutes.js');
24
- var detectPackageManager = require('./cli/detectPackageManager.js');
22
+ var routes = require('../config/routes.js');
23
+ var detectPackageManager = require('../cli/detectPackageManager.js');
24
+ var importViteEsmSync = require('./import-vite-esm-sync.js');
25
25
 
26
26
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
27
27
 
@@ -54,21 +54,8 @@ let mergeReactRouterConfig = (...configs) => {
54
54
  ...configB.future
55
55
  }
56
56
  } : {}),
57
- ...(mergeRequired("ignoredRouteFiles") ? {
58
- ignoredRouteFiles: Array.from(new Set([...(configA.ignoredRouteFiles ?? []), ...(configB.ignoredRouteFiles ?? [])]))
59
- } : {}),
60
57
  ...(mergeRequired("presets") ? {
61
58
  presets: [...(configA.presets ?? []), ...(configB.presets ?? [])]
62
- } : {}),
63
- ...(mergeRequired("routes") ? {
64
- routes: async (...args) => {
65
- var _configA$routes, _configB$routes;
66
- let [routesA, routesB] = await Promise.all([(_configA$routes = configA.routes) === null || _configA$routes === void 0 ? void 0 : _configA$routes.call(configA, ...args), (_configB$routes = configB.routes) === null || _configB$routes === void 0 ? void 0 : _configB$routes.call(configB, ...args)]);
67
- return {
68
- ...routesA,
69
- ...routesB
70
- };
71
- }
72
59
  } : {})
73
60
  };
74
61
  };
@@ -89,13 +76,21 @@ let deepFreeze = o => {
89
76
  function resolvePublicPath(viteUserConfig) {
90
77
  return viteUserConfig.base ?? "/";
91
78
  }
79
+ let isFirstLoad = true;
80
+ let lastValidRoutes = {};
92
81
  async function resolveReactRouterConfig({
93
82
  rootDirectory,
94
83
  reactRouterUserConfig,
84
+ routeConfigChanged,
95
85
  viteUserConfig,
96
- viteCommand
86
+ viteCommand,
87
+ viteNodeRunner
97
88
  }) {
98
89
  var _viteUserConfig$serve;
90
+ let vite = importViteEsmSync.importViteEsmSync();
91
+ let logger = vite.createLogger(viteUserConfig.logLevel, {
92
+ prefix: "[react-router]"
93
+ });
99
94
  let presets = (await Promise.all((reactRouterUserConfig.presets ?? []).map(async preset => {
100
95
  if (!preset.name) {
101
96
  throw new Error("React Router presets must have a `name` property defined.");
@@ -122,8 +117,6 @@ async function resolveReactRouterConfig({
122
117
  basename,
123
118
  buildDirectory: userBuildDirectory,
124
119
  buildEnd,
125
- ignoredRouteFiles,
126
- routes: userRoutesFunction,
127
120
  prerender: prerenderConfig,
128
121
  serverBuildFile,
129
122
  serverBundles,
@@ -146,18 +139,22 @@ async function resolveReactRouterConfig({
146
139
  } else if (typeof prerenderConfig === "function") {
147
140
  prerender = await prerenderConfig();
148
141
  } else {
149
- throw new Error("The `prerender` config must be an array of string paths, or a function " + "returning an array of string paths");
142
+ logger.error(colors__default["default"].red("The `prerender` config must be an array of string paths, or a function " + "returning an array of string paths"));
143
+ process.exit(1);
150
144
  }
151
145
  }
152
146
  let appDirectory = path__default["default"].resolve(rootDirectory, userAppDirectory || "app");
153
147
  let buildDirectory = path__default["default"].resolve(rootDirectory, userBuildDirectory);
154
148
  let publicPath = resolvePublicPath(viteUserConfig);
155
149
  if (basename !== "/" && viteCommand === "serve" && !((_viteUserConfig$serve = viteUserConfig.server) !== null && _viteUserConfig$serve !== void 0 && _viteUserConfig$serve.middlewareMode) && !basename.startsWith(publicPath)) {
156
- throw new Error("When using the React Router `basename` and the Vite `base` config, " + "the `basename` config must begin with `base` for the default " + "Vite dev server.");
150
+ logger.error(colors__default["default"].red("When using the React Router `basename` and the Vite `base` config, " + "the `basename` config must begin with `base` for the default " + "Vite dev server."));
151
+ process.exit(1);
157
152
  }
158
153
  let rootRouteFile = findEntry(appDirectory, "root");
159
154
  if (!rootRouteFile) {
160
- throw new Error(`Missing "root" route file in ${appDirectory}`);
155
+ let rootRouteDisplayPath = path__default["default"].relative(rootDirectory, path__default["default"].join(appDirectory, "root.tsx"));
156
+ logger.error(colors__default["default"].red(`Could not find a root route module in the app directory as "${rootRouteDisplayPath}"`));
157
+ process.exit(1);
161
158
  }
162
159
  let routes$1 = {
163
160
  root: {
@@ -166,23 +163,47 @@ async function resolveReactRouterConfig({
166
163
  file: rootRouteFile
167
164
  }
168
165
  };
169
- if (fse__default["default"].existsSync(path__default["default"].resolve(appDirectory, "routes"))) {
170
- let fileRoutes = flatRoutes.flatRoutes(appDirectory, ignoredRouteFiles);
171
- for (let route of Object.values(fileRoutes)) {
172
- routes$1[route.id] = {
173
- ...route,
174
- parentId: route.parentId || "root"
175
- };
166
+ let routeConfigFile = findEntry(appDirectory, "routes");
167
+ class FriendlyError extends Error {}
168
+ try {
169
+ if (!routeConfigFile) {
170
+ let routeConfigDisplayPath = vite.normalizePath(path__default["default"].relative(rootDirectory, path__default["default"].join(appDirectory, "routes.ts")));
171
+ throw new FriendlyError(`Route config file not found at "${routeConfigDisplayPath}".`);
176
172
  }
177
- }
178
- if (userRoutesFunction) {
179
- let userRoutes = await userRoutesFunction(routes.defineRoutes);
180
- for (let route of Object.values(userRoutes)) {
181
- routes$1[route.id] = {
182
- ...route,
183
- parentId: route.parentId || "root"
184
- };
173
+ routes.setAppDirectory(appDirectory);
174
+ let routeConfigExport = (await viteNodeRunner.executeFile(path__default["default"].join(appDirectory, routeConfigFile))).routes;
175
+ let routeConfig = await routeConfigExport;
176
+ let result = routes.validateRouteConfig({
177
+ routeConfigFile,
178
+ routeConfig
179
+ });
180
+ if (!result.valid) {
181
+ throw new FriendlyError(result.message);
182
+ }
183
+ routes$1 = {
184
+ ...routes$1,
185
+ ...routes.configRoutesToRouteManifest(routeConfig)
186
+ };
187
+ lastValidRoutes = routes$1;
188
+ if (routeConfigChanged) {
189
+ logger.info(colors__default["default"].green("Route config changed."), {
190
+ clear: true,
191
+ timestamp: true
192
+ });
193
+ }
194
+ } catch (error) {
195
+ var _error$loc, _error$loc2, _error$frame$trim, _error$frame;
196
+ logger.error(error instanceof FriendlyError ? colors__default["default"].red(error.message) : [colors__default["default"].red(`Route config in "${routeConfigFile}" is invalid.`), "", (_error$loc = error.loc) !== null && _error$loc !== void 0 && _error$loc.file && (_error$loc2 = error.loc) !== null && _error$loc2 !== void 0 && _error$loc2.column && error.frame ? [path__default["default"].relative(appDirectory, error.loc.file) + ":" + error.loc.line + ":" + error.loc.column, (_error$frame$trim = (_error$frame = error.frame).trim) === null || _error$frame$trim === void 0 ? void 0 : _error$frame$trim.call(_error$frame)] : error.stack].flat().join("\n") + "\n", {
197
+ error,
198
+ clear: !isFirstLoad,
199
+ timestamp: !isFirstLoad
200
+ });
201
+ // Bail if this is the first time loading config, otherwise keep the dev server running
202
+ if (isFirstLoad) {
203
+ process.exit(1);
185
204
  }
205
+ // Keep dev server running with the last valid routes to allow for correction
206
+ routes$1 = lastValidRoutes;
186
207
  }
187
208
  let future = {};
188
209
  let reactRouterConfig = deepFreeze({
@@ -204,6 +225,7 @@ async function resolveReactRouterConfig({
204
225
  reactRouterConfig
205
226
  }));
206
227
  }
228
+ isFirstLoad = false;
207
229
  return reactRouterConfig;
208
230
  }
209
231
  async function resolveEntryFiles({
@@ -213,7 +235,7 @@ async function resolveEntryFiles({
213
235
  let {
214
236
  appDirectory
215
237
  } = reactRouterConfig;
216
- let defaultsDirectory = path__default["default"].resolve(__dirname, "config", "defaults");
238
+ let defaultsDirectory = path__default["default"].resolve(__dirname, "..", "config", "defaults");
217
239
  let userEntryClientFile = findEntry(appDirectory, "entry.client");
218
240
  let userEntryServerFile = findEntry(appDirectory, "entry.server");
219
241
  let entryServerFile;
package/dist/vite/dev.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-9c1812606
2
+ * @react-router/dev v0.0.0-experimental-a26b992a1
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-9c1812606
2
+ * @react-router/dev v0.0.0-experimental-a26b992a1
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @react-router/dev v0.0.0-experimental-9c1812606
2
+ * @react-router/dev v0.0.0-experimental-a26b992a1
3
3
  *
4
4
  * Copyright (c) Remix Software Inc.
5
5
  *
@@ -1,7 +1,7 @@
1
1
  import type * as Vite from "vite";
2
2
  import { type RouteManifest } from "../config/routes";
3
3
  import type { Manifest as ReactRouterManifest } from "../manifest";
4
- import { type VitePluginConfig, type ResolvedVitePluginConfig } from "../config";
4
+ import { type ReactRouterConfig, type ResolvedReactRouterConfig } from "./config";
5
5
  export declare function resolveViteConfig({ configFile, mode, root, }: {
6
6
  configFile?: string;
7
7
  mode?: string;
@@ -61,12 +61,15 @@ export type ReactRouterPluginContext = ReactRouterPluginSsrBuildContext & {
61
61
  entryClientFilePath: string;
62
62
  entryServerFilePath: string;
63
63
  publicPath: string;
64
- reactRouterConfig: ResolvedVitePluginConfig;
64
+ reactRouterConfig: ResolvedReactRouterConfig;
65
65
  viteManifestEnabled: boolean;
66
66
  };
67
67
  export declare let getServerBuildDirectory: (ctx: ReactRouterPluginContext) => string;
68
68
  type MaybePromise<T> = T | Promise<T>;
69
69
  export declare let setReactRouterDevLoadContext: (loadContext: (request: Request) => MaybePromise<Record<string, unknown>>) => void;
70
- type ReactRouterVitePlugin = (config?: VitePluginConfig) => Vite.Plugin[];
70
+ type ReactRouterVitePlugin = (config?: ReactRouterConfig) => Vite.Plugin[];
71
+ /**
72
+ * React Router [Vite plugin.](https://vitejs.dev/guide/using-plugins.html)
73
+ */
71
74
  export declare const reactRouterVitePlugin: ReactRouterVitePlugin;
72
75
  export {};