@react-router/dev 7.0.0-pre.2 → 7.0.0-pre.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/cli/index.d.ts +2 -1
- package/dist/cli/index.js +1352 -8
- package/dist/routes.d.ts +4 -2
- package/dist/routes.js +181 -11
- package/dist/typescript/plugin.d.ts +5 -2
- package/dist/typescript/plugin.js +479 -31
- package/dist/vite/cloudflare.d.ts +1 -1
- package/dist/vite/cloudflare.js +171 -5
- package/dist/vite.d.ts +2 -2
- package/dist/vite.js +2394 -5
- package/package.json +28 -7
- package/dist/cli/commands.d.ts +0 -13
- package/dist/cli/commands.js +0 -179
- package/dist/cli/detectPackageManager.d.ts +0 -10
- package/dist/cli/detectPackageManager.js +0 -39
- package/dist/cli/run.d.ts +0 -5
- package/dist/cli/run.js +0 -188
- package/dist/cli/useJavascript.d.ts +0 -4
- package/dist/cli/useJavascript.js +0 -66
- package/dist/colors.d.ts +0 -17
- package/dist/colors.js +0 -49
- package/dist/config/format.d.ts +0 -5
- package/dist/config/format.js +0 -68
- package/dist/config/routes.d.ts +0 -129
- package/dist/config/routes.js +0 -253
- package/dist/config/serverModes.d.ts +0 -9
- package/dist/invariant.d.ts +0 -2
- package/dist/invariant.js +0 -20
- package/dist/manifest.d.ts +0 -28
- package/dist/typescript/typegen.d.ts +0 -10
- package/dist/typescript/typegen.js +0 -190
- package/dist/vite/babel.d.ts +0 -20
- package/dist/vite/babel.js +0 -49
- package/dist/vite/build.d.ts +0 -15
- package/dist/vite/build.js +0 -249
- package/dist/vite/cloudflare-dev-proxy.d.ts +0 -21
- package/dist/vite/cloudflare-dev-proxy.js +0 -89
- package/dist/vite/combine-urls-test.d.ts +0 -1
- package/dist/vite/combine-urls.d.ts +0 -1
- package/dist/vite/combine-urls.js +0 -20
- package/dist/vite/config.d.ts +0 -234
- package/dist/vite/config.js +0 -282
- package/dist/vite/dev.d.ts +0 -15
- package/dist/vite/dev.js +0 -81
- package/dist/vite/import-vite-esm-sync.d.ts +0 -4
- package/dist/vite/import-vite-esm-sync.js +0 -28
- package/dist/vite/node-adapter.d.ts +0 -6
- package/dist/vite/node-adapter.js +0 -90
- package/dist/vite/plugin.d.ts +0 -75
- package/dist/vite/plugin.js +0 -1301
- package/dist/vite/profiler.d.ts +0 -5
- package/dist/vite/profiler.js +0 -55
- package/dist/vite/remove-exports-test.d.ts +0 -1
- package/dist/vite/remove-exports.d.ts +0 -2
- package/dist/vite/remove-exports.js +0 -148
- package/dist/vite/resolve-file-url.d.ts +0 -3
- package/dist/vite/resolve-file-url.js +0 -53
- package/dist/vite/styles.d.ts +0 -14
- package/dist/vite/styles.js +0 -199
- package/dist/vite/vite-node.d.ts +0 -9
- package/dist/vite/vite-node.js +0 -57
- package/dist/vite/vmod.d.ts +0 -3
- package/dist/vite/vmod.js +0 -21
- package/dist/vite/with-props.d.ts +0 -4
- package/dist/vite/with-props.js +0 -151
- /package/dist/{vite/static → static}/refresh-utils.cjs +0 -0
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @react-router/dev v7.0.0-pre.2
|
|
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 fs = require('node:fs');
|
|
16
|
-
var Chokidar = require('chokidar');
|
|
17
|
-
var dedent = require('dedent');
|
|
18
|
-
var Path = require('pathe');
|
|
19
|
-
var Pathe = require('pathe/utils');
|
|
20
|
-
var routes = require('../config/routes.js');
|
|
21
|
-
var viteNode = require('../vite/vite-node.js');
|
|
22
|
-
var config = require('../vite/config.js');
|
|
23
|
-
var plugin = require('../vite/plugin.js');
|
|
24
|
-
|
|
25
|
-
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
26
|
-
|
|
27
|
-
function _interopNamespace(e) {
|
|
28
|
-
if (e && e.__esModule) return e;
|
|
29
|
-
var n = Object.create(null);
|
|
30
|
-
if (e) {
|
|
31
|
-
Object.keys(e).forEach(function (k) {
|
|
32
|
-
if (k !== 'default') {
|
|
33
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
34
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
35
|
-
enumerable: true,
|
|
36
|
-
get: function () { return e[k]; }
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
n["default"] = e;
|
|
42
|
-
return Object.freeze(n);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
var fs__default = /*#__PURE__*/_interopDefaultLegacy(fs);
|
|
46
|
-
var Chokidar__default = /*#__PURE__*/_interopDefaultLegacy(Chokidar);
|
|
47
|
-
var dedent__default = /*#__PURE__*/_interopDefaultLegacy(dedent);
|
|
48
|
-
var Path__namespace = /*#__PURE__*/_interopNamespace(Path);
|
|
49
|
-
var Pathe__namespace = /*#__PURE__*/_interopNamespace(Pathe);
|
|
50
|
-
|
|
51
|
-
function getDirectory(ctx) {
|
|
52
|
-
return Path__namespace.join(ctx.rootDirectory, ".react-router/types");
|
|
53
|
-
}
|
|
54
|
-
function getPath(ctx, route) {
|
|
55
|
-
return Path__namespace.join(getDirectory(ctx), "app", Path__namespace.dirname(route.file), "+types." + Pathe__namespace.filename(route.file) + ".d.ts");
|
|
56
|
-
}
|
|
57
|
-
async function watch(rootDirectory) {
|
|
58
|
-
const vitePluginCtx = await plugin.loadPluginContext({
|
|
59
|
-
root: rootDirectory
|
|
60
|
-
});
|
|
61
|
-
const routesTsPath = Path__namespace.join(vitePluginCtx.reactRouterConfig.appDirectory, "routes.ts");
|
|
62
|
-
const routesViteNodeContext = await viteNode.createContext({
|
|
63
|
-
root: rootDirectory
|
|
64
|
-
});
|
|
65
|
-
async function getRoutes() {
|
|
66
|
-
const routes$1 = {};
|
|
67
|
-
const rootRouteFile = config.findEntry(vitePluginCtx.reactRouterConfig.appDirectory, "root");
|
|
68
|
-
if (rootRouteFile) {
|
|
69
|
-
routes$1.root = {
|
|
70
|
-
path: "",
|
|
71
|
-
id: "root",
|
|
72
|
-
file: rootRouteFile
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
routesViteNodeContext.devServer.moduleGraph.invalidateAll();
|
|
76
|
-
routesViteNodeContext.runner.moduleCache.clear();
|
|
77
|
-
const routeConfig = (await routesViteNodeContext.runner.executeFile(routesTsPath)).routes;
|
|
78
|
-
return {
|
|
79
|
-
...routes$1,
|
|
80
|
-
...routes.configRoutesToRouteManifest(await routeConfig)
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
const ctx = {
|
|
84
|
-
rootDirectory,
|
|
85
|
-
appDirectory: vitePluginCtx.reactRouterConfig.appDirectory,
|
|
86
|
-
routes: await getRoutes()
|
|
87
|
-
};
|
|
88
|
-
await writeAll(ctx);
|
|
89
|
-
const watcher = Chokidar__default["default"].watch(ctx.appDirectory, {
|
|
90
|
-
ignoreInitial: true
|
|
91
|
-
});
|
|
92
|
-
watcher.on("all", async (event, path) => {
|
|
93
|
-
path = Path__namespace.normalize(path);
|
|
94
|
-
ctx.routes = await getRoutes();
|
|
95
|
-
const routeConfigChanged = Boolean(routesViteNodeContext.devServer.moduleGraph.getModuleById(path));
|
|
96
|
-
if (routeConfigChanged) {
|
|
97
|
-
await writeAll(ctx);
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
const isRoute = Object.values(ctx.routes).find(route => path === Path__namespace.join(ctx.appDirectory, route.file));
|
|
101
|
-
if (isRoute && (event === "add" || event === "unlink")) {
|
|
102
|
-
await writeAll(ctx);
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
async function writeAll(ctx) {
|
|
108
|
-
fs__default["default"].rmSync(getDirectory(ctx), {
|
|
109
|
-
recursive: true,
|
|
110
|
-
force: true
|
|
111
|
-
});
|
|
112
|
-
Object.values(ctx.routes).forEach(route => {
|
|
113
|
-
if (!fs__default["default"].existsSync(Path__namespace.join(ctx.appDirectory, route.file))) return;
|
|
114
|
-
const typesPath = getPath(ctx, route);
|
|
115
|
-
const content = getModule(ctx.routes, route);
|
|
116
|
-
fs__default["default"].mkdirSync(Path__namespace.dirname(typesPath), {
|
|
117
|
-
recursive: true
|
|
118
|
-
});
|
|
119
|
-
fs__default["default"].writeFileSync(typesPath, content);
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
function getModule(routes, route) {
|
|
123
|
-
return dedent__default["default"]`
|
|
124
|
-
// React Router generated types for route:
|
|
125
|
-
// ${route.file}
|
|
126
|
-
|
|
127
|
-
import * as T from "react-router/types"
|
|
128
|
-
|
|
129
|
-
export type Params = {${formattedParamsProperties(routes, route)}}
|
|
130
|
-
|
|
131
|
-
type Route = typeof import("./${Pathe__namespace.filename(route.file)}")
|
|
132
|
-
|
|
133
|
-
export type LoaderData = T.CreateLoaderData<Route>
|
|
134
|
-
export type ActionData = T.CreateActionData<Route>
|
|
135
|
-
|
|
136
|
-
export type LoaderArgs = T.CreateServerLoaderArgs<Params>
|
|
137
|
-
export type ClientLoaderArgs = T.CreateClientLoaderArgs<Params, Route>
|
|
138
|
-
export type ActionArgs = T.CreateServerActionArgs<Params>
|
|
139
|
-
export type ClientActionArgs = T.CreateClientActionArgs<Params, Route>
|
|
140
|
-
|
|
141
|
-
export type HydrateFallbackProps = T.CreateHydrateFallbackProps<Params>
|
|
142
|
-
export type ComponentProps = T.CreateComponentProps<Params, LoaderData, ActionData>
|
|
143
|
-
export type ErrorBoundaryProps = T.CreateErrorBoundaryProps<Params, LoaderData, ActionData>
|
|
144
|
-
`;
|
|
145
|
-
}
|
|
146
|
-
function formattedParamsProperties(routes, route) {
|
|
147
|
-
const urlpath = routeLineage(routes, route).map(route => route.path).join("/");
|
|
148
|
-
const params = parseParams(urlpath);
|
|
149
|
-
const indent = " ".repeat(3);
|
|
150
|
-
const properties = Object.entries(params).map(([name, values]) => {
|
|
151
|
-
if (values.length === 1) {
|
|
152
|
-
const isOptional = values[0];
|
|
153
|
-
return indent + (isOptional ? `${name}?: string` : `${name}: string`);
|
|
154
|
-
}
|
|
155
|
-
const items = values.map(isOptional => isOptional ? "string | undefined" : "string");
|
|
156
|
-
return indent + `${name}: [${items.join(", ")}]`;
|
|
157
|
-
});
|
|
158
|
-
// prettier-ignore
|
|
159
|
-
const body = properties.length === 0 ? "" : "\n" + properties.join("\n") + "\n";
|
|
160
|
-
return body;
|
|
161
|
-
}
|
|
162
|
-
function routeLineage(routes, route) {
|
|
163
|
-
const result = [];
|
|
164
|
-
while (route) {
|
|
165
|
-
result.push(route);
|
|
166
|
-
if (!route.parentId) break;
|
|
167
|
-
route = routes[route.parentId];
|
|
168
|
-
}
|
|
169
|
-
result.reverse();
|
|
170
|
-
return result;
|
|
171
|
-
}
|
|
172
|
-
function parseParams(urlpath) {
|
|
173
|
-
const result = {};
|
|
174
|
-
let segments = urlpath.split("/");
|
|
175
|
-
segments.filter(s => s.startsWith(":")).forEach(param => {
|
|
176
|
-
param = param.slice(1); // omit leading `:`
|
|
177
|
-
let isOptional = param.endsWith("?");
|
|
178
|
-
if (isOptional) {
|
|
179
|
-
param = param.slice(0, -1); // omit trailing `?`
|
|
180
|
-
}
|
|
181
|
-
result[param] ??= [];
|
|
182
|
-
result[param].push(isOptional);
|
|
183
|
-
return;
|
|
184
|
-
});
|
|
185
|
-
return result;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
exports.getPath = getPath;
|
|
189
|
-
exports.watch = watch;
|
|
190
|
-
exports.writeAll = writeAll;
|
package/dist/vite/babel.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { NodePath } from "@babel/traverse";
|
|
2
|
-
import type { types as Babel } from "@babel/core";
|
|
3
|
-
import { parse, type ParseResult } from "@babel/parser";
|
|
4
|
-
import * as t from "@babel/types";
|
|
5
|
-
declare const traverse: {
|
|
6
|
-
<S>(parent: Babel.Node, opts: import("@babel/traverse").TraverseOptions<S>, scope: import("@babel/traverse").Scope | undefined, state: S, parentPath?: NodePath<Babel.Node> | undefined): void;
|
|
7
|
-
(parent: Babel.Node, opts?: import("@babel/traverse").TraverseOptions<Babel.Node> | undefined, scope?: import("@babel/traverse").Scope | undefined, state?: any, parentPath?: NodePath<Babel.Node> | undefined): void;
|
|
8
|
-
visitors: typeof import("@babel/traverse").visitors;
|
|
9
|
-
verify: typeof import("@babel/traverse").visitors.verify;
|
|
10
|
-
explode: typeof import("@babel/traverse").visitors.explode;
|
|
11
|
-
cheap: (node: Babel.Node, enter: (node: Babel.Node) => void) => void;
|
|
12
|
-
node: (node: Babel.Node, opts: import("@babel/traverse").TraverseOptions<Babel.Node>, scope?: import("@babel/traverse").Scope | undefined, state?: any, path?: NodePath<Babel.Node> | undefined, skipKeys?: Record<string, boolean> | undefined) => void;
|
|
13
|
-
clearNode: (node: Babel.Node, opts?: Babel.RemovePropertiesOptions | undefined) => void;
|
|
14
|
-
removeProperties: (tree: Babel.Node, opts?: Babel.RemovePropertiesOptions | undefined) => Babel.Node;
|
|
15
|
-
hasType: (tree: Babel.Node, type: "ArrayPattern" | "ObjectPattern" | "Identifier" | "RestElement" | "AssignmentPattern" | "TSAsExpression" | "TSSatisfiesExpression" | "TSTypeAssertion" | "TSNonNullExpression" | "MemberExpression" | "TSParameterProperty" | "ObjectProperty" | "ArrayExpression" | "AssignmentExpression" | "BinaryExpression" | "CallExpression" | "ConditionalExpression" | "FunctionExpression" | "StringLiteral" | "NumericLiteral" | "NullLiteral" | "BooleanLiteral" | "RegExpLiteral" | "LogicalExpression" | "NewExpression" | "ObjectExpression" | "SequenceExpression" | "ParenthesizedExpression" | "ThisExpression" | "UnaryExpression" | "UpdateExpression" | "ArrowFunctionExpression" | "ClassExpression" | "ImportExpression" | "MetaProperty" | "Super" | "TaggedTemplateExpression" | "TemplateLiteral" | "YieldExpression" | "AwaitExpression" | "Import" | "BigIntLiteral" | "OptionalMemberExpression" | "OptionalCallExpression" | "TypeCastExpression" | "JSXElement" | "JSXFragment" | "BindExpression" | "DoExpression" | "RecordExpression" | "TupleExpression" | "DecimalLiteral" | "ModuleExpression" | "TopicReference" | "PipelineTopicExpression" | "PipelineBareFunction" | "PipelinePrimaryTopicReference" | "TSInstantiationExpression" | "PrivateName" | "File" | "AnyTypeAnnotation" | "ArgumentPlaceholder" | "ArrayTypeAnnotation" | "BlockStatement" | "BooleanLiteralTypeAnnotation" | "BooleanTypeAnnotation" | "BreakStatement" | "CatchClause" | "ClassAccessorProperty" | "ClassBody" | "ClassDeclaration" | "ClassImplements" | "ClassMethod" | "ClassPrivateMethod" | "ClassPrivateProperty" | "ClassProperty" | "ContinueStatement" | "DebuggerStatement" | "DeclareClass" | "DeclareExportAllDeclaration" | "DeclareExportDeclaration" | "DeclareFunction" | "DeclareInterface" | "DeclareModule" | "DeclareModuleExports" | "DeclareOpaqueType" | "DeclareTypeAlias" | "DeclareVariable" | "DeclaredPredicate" | "Decorator" | "Directive" | "DirectiveLiteral" | "DoWhileStatement" | "EmptyStatement" | "EmptyTypeAnnotation" | "EnumBooleanBody" | "EnumBooleanMember" | "EnumDeclaration" | "EnumDefaultedMember" | "EnumNumberBody" | "EnumNumberMember" | "EnumStringBody" | "EnumStringMember" | "EnumSymbolBody" | "ExistsTypeAnnotation" | "ExportAllDeclaration" | "ExportDefaultDeclaration" | "ExportDefaultSpecifier" | "ExportNamedDeclaration" | "ExportNamespaceSpecifier" | "ExportSpecifier" | "ExpressionStatement" | "ForInStatement" | "ForOfStatement" | "ForStatement" | "FunctionDeclaration" | "FunctionTypeAnnotation" | "FunctionTypeParam" | "GenericTypeAnnotation" | "IfStatement" | "ImportAttribute" | "ImportDeclaration" | "ImportDefaultSpecifier" | "ImportNamespaceSpecifier" | "ImportSpecifier" | "IndexedAccessType" | "InferredPredicate" | "InterfaceDeclaration" | "InterfaceExtends" | "InterfaceTypeAnnotation" | "InterpreterDirective" | "IntersectionTypeAnnotation" | "JSXAttribute" | "JSXClosingElement" | "JSXClosingFragment" | "JSXEmptyExpression" | "JSXExpressionContainer" | "JSXIdentifier" | "JSXMemberExpression" | "JSXNamespacedName" | "JSXOpeningElement" | "JSXOpeningFragment" | "JSXSpreadAttribute" | "JSXSpreadChild" | "JSXText" | "LabeledStatement" | "MixedTypeAnnotation" | "Noop" | "NullLiteralTypeAnnotation" | "NullableTypeAnnotation" | "NumberLiteral" | "NumberLiteralTypeAnnotation" | "NumberTypeAnnotation" | "ObjectMethod" | "ObjectTypeAnnotation" | "ObjectTypeCallProperty" | "ObjectTypeIndexer" | "ObjectTypeInternalSlot" | "ObjectTypeProperty" | "ObjectTypeSpreadProperty" | "OpaqueType" | "OptionalIndexedAccessType" | "Placeholder" | "Program" | "QualifiedTypeIdentifier" | "RegexLiteral" | "RestProperty" | "ReturnStatement" | "SpreadElement" | "SpreadProperty" | "StaticBlock" | "StringLiteralTypeAnnotation" | "StringTypeAnnotation" | "SwitchCase" | "SwitchStatement" | "SymbolTypeAnnotation" | "TSAnyKeyword" | "TSArrayType" | "TSBigIntKeyword" | "TSBooleanKeyword" | "TSCallSignatureDeclaration" | "TSConditionalType" | "TSConstructSignatureDeclaration" | "TSConstructorType" | "TSDeclareFunction" | "TSDeclareMethod" | "TSEnumDeclaration" | "TSEnumMember" | "TSExportAssignment" | "TSExpressionWithTypeArguments" | "TSExternalModuleReference" | "TSFunctionType" | "TSImportEqualsDeclaration" | "TSImportType" | "TSIndexSignature" | "TSIndexedAccessType" | "TSInferType" | "TSInterfaceBody" | "TSInterfaceDeclaration" | "TSIntersectionType" | "TSIntrinsicKeyword" | "TSLiteralType" | "TSMappedType" | "TSMethodSignature" | "TSModuleBlock" | "TSModuleDeclaration" | "TSNamedTupleMember" | "TSNamespaceExportDeclaration" | "TSNeverKeyword" | "TSNullKeyword" | "TSNumberKeyword" | "TSObjectKeyword" | "TSOptionalType" | "TSParenthesizedType" | "TSPropertySignature" | "TSQualifiedName" | "TSRestType" | "TSStringKeyword" | "TSSymbolKeyword" | "TSThisType" | "TSTupleType" | "TSTypeAliasDeclaration" | "TSTypeAnnotation" | "TSTypeLiteral" | "TSTypeOperator" | "TSTypeParameter" | "TSTypeParameterDeclaration" | "TSTypeParameterInstantiation" | "TSTypePredicate" | "TSTypeQuery" | "TSTypeReference" | "TSUndefinedKeyword" | "TSUnionType" | "TSUnknownKeyword" | "TSVoidKeyword" | "TemplateElement" | "ThisTypeAnnotation" | "ThrowStatement" | "TryStatement" | "TupleTypeAnnotation" | "TypeAlias" | "TypeAnnotation" | "TypeParameter" | "TypeParameterDeclaration" | "TypeParameterInstantiation" | "TypeofTypeAnnotation" | "UnionTypeAnnotation" | "V8IntrinsicIdentifier" | "VariableDeclaration" | "VariableDeclarator" | "Variance" | "VoidTypeAnnotation" | "WhileStatement" | "WithStatement", denylistTypes?: string[] | undefined) => boolean;
|
|
16
|
-
cache: typeof import("@babel/traverse").cache;
|
|
17
|
-
};
|
|
18
|
-
declare const generate: typeof import("@babel/generator").default;
|
|
19
|
-
export { traverse, generate, parse, t };
|
|
20
|
-
export type { Babel, NodePath, ParseResult };
|
package/dist/vite/babel.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @react-router/dev v7.0.0-pre.2
|
|
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 parser = require('@babel/parser');
|
|
16
|
-
var t = require('@babel/types');
|
|
17
|
-
|
|
18
|
-
function _interopNamespace(e) {
|
|
19
|
-
if (e && e.__esModule) return e;
|
|
20
|
-
var n = Object.create(null);
|
|
21
|
-
if (e) {
|
|
22
|
-
Object.keys(e).forEach(function (k) {
|
|
23
|
-
if (k !== 'default') {
|
|
24
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
25
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
26
|
-
enumerable: true,
|
|
27
|
-
get: function () { return e[k]; }
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
n["default"] = e;
|
|
33
|
-
return Object.freeze(n);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
var t__namespace = /*#__PURE__*/_interopNamespace(t);
|
|
37
|
-
|
|
38
|
-
// These `require`s were needed to support building within vite-ecosystem-ci,
|
|
39
|
-
// otherwise we get errors that `traverse` and `generate` are not functions.
|
|
40
|
-
const traverse = require("@babel/traverse").default;
|
|
41
|
-
const generate = require("@babel/generator").default;
|
|
42
|
-
|
|
43
|
-
Object.defineProperty(exports, 'parse', {
|
|
44
|
-
enumerable: true,
|
|
45
|
-
get: function () { return parser.parse; }
|
|
46
|
-
});
|
|
47
|
-
exports.t = t__namespace;
|
|
48
|
-
exports.generate = generate;
|
|
49
|
-
exports.traverse = traverse;
|
package/dist/vite/build.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type * as Vite from "vite";
|
|
2
|
-
export interface ViteBuildOptions {
|
|
3
|
-
assetsInlineLimit?: number;
|
|
4
|
-
clearScreen?: boolean;
|
|
5
|
-
config?: string;
|
|
6
|
-
emptyOutDir?: boolean;
|
|
7
|
-
force?: boolean;
|
|
8
|
-
logLevel?: Vite.LogLevel;
|
|
9
|
-
minify?: Vite.BuildOptions["minify"];
|
|
10
|
-
mode?: string;
|
|
11
|
-
profile?: boolean;
|
|
12
|
-
sourcemapClient?: boolean | "inline" | "hidden";
|
|
13
|
-
sourcemapServer?: boolean | "inline" | "hidden";
|
|
14
|
-
}
|
|
15
|
-
export declare function build(root: string, { assetsInlineLimit, clearScreen, config: configFile, emptyOutDir, force, logLevel, minify, mode, sourcemapClient, sourcemapServer, }: ViteBuildOptions): Promise<void>;
|
package/dist/vite/build.js
DELETED
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @react-router/dev v7.0.0-pre.2
|
|
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 path = require('node:path');
|
|
16
|
-
var fse = require('fs-extra');
|
|
17
|
-
var colors = require('picocolors');
|
|
18
|
-
var plugin = require('./plugin.js');
|
|
19
|
-
var config = require('./config.js');
|
|
20
|
-
var invariant = require('../invariant.js');
|
|
21
|
-
var importViteEsmSync = require('./import-vite-esm-sync.js');
|
|
22
|
-
|
|
23
|
-
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
24
|
-
|
|
25
|
-
var path__default = /*#__PURE__*/_interopDefaultLegacy(path);
|
|
26
|
-
var fse__default = /*#__PURE__*/_interopDefaultLegacy(fse);
|
|
27
|
-
var colors__default = /*#__PURE__*/_interopDefaultLegacy(colors);
|
|
28
|
-
|
|
29
|
-
function getAddressableRoutes(routes) {
|
|
30
|
-
let nonAddressableIds = new Set();
|
|
31
|
-
for (let id in routes) {
|
|
32
|
-
let route = routes[id];
|
|
33
|
-
// We omit the parent route of index routes since the index route takes ownership of its parent's path
|
|
34
|
-
if (route.index) {
|
|
35
|
-
invariant(route.parentId, `Expected index route "${route.id}" to have "parentId" set`);
|
|
36
|
-
nonAddressableIds.add(route.parentId);
|
|
37
|
-
}
|
|
38
|
-
// We omit pathless routes since they can only be addressed via descendant routes
|
|
39
|
-
if (typeof route.path !== "string" && !route.index) {
|
|
40
|
-
nonAddressableIds.add(id);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return Object.values(routes).filter(route => !nonAddressableIds.has(route.id));
|
|
44
|
-
}
|
|
45
|
-
function getRouteBranch(routes, routeId) {
|
|
46
|
-
let branch = [];
|
|
47
|
-
let currentRouteId = routeId;
|
|
48
|
-
while (currentRouteId) {
|
|
49
|
-
let route = routes[currentRouteId];
|
|
50
|
-
invariant(route, `Missing route for ${currentRouteId}`);
|
|
51
|
-
branch.push(route);
|
|
52
|
-
currentRouteId = route.parentId;
|
|
53
|
-
}
|
|
54
|
-
return branch.reverse();
|
|
55
|
-
}
|
|
56
|
-
async function getServerBuilds(ctx) {
|
|
57
|
-
let {
|
|
58
|
-
rootDirectory
|
|
59
|
-
} = ctx;
|
|
60
|
-
const {
|
|
61
|
-
routes,
|
|
62
|
-
serverBuildFile,
|
|
63
|
-
serverBundles,
|
|
64
|
-
appDirectory
|
|
65
|
-
} = ctx.reactRouterConfig;
|
|
66
|
-
let serverBuildDirectory = plugin.getServerBuildDirectory(ctx);
|
|
67
|
-
if (!serverBundles) {
|
|
68
|
-
return {
|
|
69
|
-
serverBuilds: [{
|
|
70
|
-
ssr: true
|
|
71
|
-
}],
|
|
72
|
-
buildManifest: {
|
|
73
|
-
routes
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
let {
|
|
78
|
-
normalizePath
|
|
79
|
-
} = await import('vite');
|
|
80
|
-
let resolvedAppDirectory = path__default["default"].resolve(rootDirectory, appDirectory);
|
|
81
|
-
let rootRelativeRoutes = Object.fromEntries(Object.entries(routes).map(([id, route]) => {
|
|
82
|
-
let filePath = path__default["default"].join(resolvedAppDirectory, route.file);
|
|
83
|
-
let rootRelativeFilePath = normalizePath(path__default["default"].relative(rootDirectory, filePath));
|
|
84
|
-
return [id, {
|
|
85
|
-
...route,
|
|
86
|
-
file: rootRelativeFilePath
|
|
87
|
-
}];
|
|
88
|
-
}));
|
|
89
|
-
let buildManifest = {
|
|
90
|
-
serverBundles: {},
|
|
91
|
-
routeIdToServerBundleId: {},
|
|
92
|
-
routes: rootRelativeRoutes
|
|
93
|
-
};
|
|
94
|
-
let serverBundleBuildConfigById = new Map();
|
|
95
|
-
await Promise.all(getAddressableRoutes(routes).map(async route => {
|
|
96
|
-
let branch = getRouteBranch(routes, route.id);
|
|
97
|
-
let serverBundleId = await serverBundles({
|
|
98
|
-
branch: branch.map(route => config.configRouteToBranchRoute({
|
|
99
|
-
...route,
|
|
100
|
-
// Ensure absolute paths are passed to the serverBundles function
|
|
101
|
-
file: path__default["default"].join(resolvedAppDirectory, route.file)
|
|
102
|
-
}))
|
|
103
|
-
});
|
|
104
|
-
if (typeof serverBundleId !== "string") {
|
|
105
|
-
throw new Error(`The "serverBundles" function must return a string`);
|
|
106
|
-
}
|
|
107
|
-
if (!/^[a-zA-Z0-9-_]+$/.test(serverBundleId)) {
|
|
108
|
-
throw new Error(`The "serverBundles" function must only return strings containing alphanumeric characters, hyphens and underscores.`);
|
|
109
|
-
}
|
|
110
|
-
buildManifest.routeIdToServerBundleId[route.id] = serverBundleId;
|
|
111
|
-
let relativeServerBundleDirectory = path__default["default"].relative(rootDirectory, path__default["default"].join(serverBuildDirectory, serverBundleId));
|
|
112
|
-
let serverBuildConfig = serverBundleBuildConfigById.get(serverBundleId);
|
|
113
|
-
if (!serverBuildConfig) {
|
|
114
|
-
buildManifest.serverBundles[serverBundleId] = {
|
|
115
|
-
id: serverBundleId,
|
|
116
|
-
file: normalizePath(path__default["default"].join(relativeServerBundleDirectory, serverBuildFile))
|
|
117
|
-
};
|
|
118
|
-
serverBuildConfig = {
|
|
119
|
-
routes: {},
|
|
120
|
-
serverBundleId
|
|
121
|
-
};
|
|
122
|
-
serverBundleBuildConfigById.set(serverBundleId, serverBuildConfig);
|
|
123
|
-
}
|
|
124
|
-
for (let route of branch) {
|
|
125
|
-
serverBuildConfig.routes[route.id] = route;
|
|
126
|
-
}
|
|
127
|
-
}));
|
|
128
|
-
let serverBuilds = Array.from(serverBundleBuildConfigById.values()).map(serverBundleBuildConfig => {
|
|
129
|
-
let serverBuild = {
|
|
130
|
-
ssr: true,
|
|
131
|
-
serverBundleBuildConfig
|
|
132
|
-
};
|
|
133
|
-
return serverBuild;
|
|
134
|
-
});
|
|
135
|
-
return {
|
|
136
|
-
serverBuilds,
|
|
137
|
-
buildManifest
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
async function cleanBuildDirectory(viteConfig, ctx) {
|
|
141
|
-
let buildDirectory = ctx.reactRouterConfig.buildDirectory;
|
|
142
|
-
let isWithinRoot = () => {
|
|
143
|
-
let relativePath = path__default["default"].relative(ctx.rootDirectory, buildDirectory);
|
|
144
|
-
return !relativePath.startsWith("..") && !path__default["default"].isAbsolute(relativePath);
|
|
145
|
-
};
|
|
146
|
-
if (viteConfig.build.emptyOutDir ?? isWithinRoot()) {
|
|
147
|
-
await fse__default["default"].remove(buildDirectory);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
function getViteManifestPaths(ctx, serverBuilds) {
|
|
151
|
-
let buildRelative = pathname => path__default["default"].resolve(ctx.reactRouterConfig.buildDirectory, pathname);
|
|
152
|
-
let viteManifestPaths = ["client/.vite/manifest.json", ...serverBuilds.map(({
|
|
153
|
-
serverBundleBuildConfig
|
|
154
|
-
}) => {
|
|
155
|
-
let serverBundleId = serverBundleBuildConfig === null || serverBundleBuildConfig === void 0 ? void 0 : serverBundleBuildConfig.serverBundleId;
|
|
156
|
-
let serverBundlePath = serverBundleId ? serverBundleId + "/" : "";
|
|
157
|
-
return `server/${serverBundlePath}.vite/manifest.json`;
|
|
158
|
-
})].map(srcPath => buildRelative(srcPath));
|
|
159
|
-
return viteManifestPaths;
|
|
160
|
-
}
|
|
161
|
-
async function build(root, {
|
|
162
|
-
assetsInlineLimit,
|
|
163
|
-
clearScreen,
|
|
164
|
-
config: configFile,
|
|
165
|
-
emptyOutDir,
|
|
166
|
-
force,
|
|
167
|
-
logLevel,
|
|
168
|
-
minify,
|
|
169
|
-
mode,
|
|
170
|
-
sourcemapClient,
|
|
171
|
-
sourcemapServer
|
|
172
|
-
}) {
|
|
173
|
-
var _reactRouterConfig$bu;
|
|
174
|
-
// Ensure Vite's ESM build is preloaded at the start of the process
|
|
175
|
-
// so it can be accessed synchronously via `importViteEsmSync`
|
|
176
|
-
await importViteEsmSync.preloadViteEsm();
|
|
177
|
-
let viteConfig = await plugin.resolveViteConfig({
|
|
178
|
-
configFile,
|
|
179
|
-
mode,
|
|
180
|
-
root
|
|
181
|
-
});
|
|
182
|
-
const ctx = await plugin.extractPluginContext(viteConfig);
|
|
183
|
-
if (!ctx) {
|
|
184
|
-
console.error(colors__default["default"].red("React Router Vite plugin not found in Vite config"));
|
|
185
|
-
process.exit(1);
|
|
186
|
-
}
|
|
187
|
-
let {
|
|
188
|
-
reactRouterConfig
|
|
189
|
-
} = ctx;
|
|
190
|
-
let vite = await import('vite');
|
|
191
|
-
async function viteBuild({
|
|
192
|
-
ssr,
|
|
193
|
-
serverBundleBuildConfig
|
|
194
|
-
}) {
|
|
195
|
-
await vite.build({
|
|
196
|
-
root,
|
|
197
|
-
mode,
|
|
198
|
-
configFile,
|
|
199
|
-
build: {
|
|
200
|
-
assetsInlineLimit,
|
|
201
|
-
emptyOutDir,
|
|
202
|
-
minify,
|
|
203
|
-
ssr,
|
|
204
|
-
sourcemap: ssr ? sourcemapServer : sourcemapClient
|
|
205
|
-
},
|
|
206
|
-
optimizeDeps: {
|
|
207
|
-
force
|
|
208
|
-
},
|
|
209
|
-
clearScreen,
|
|
210
|
-
logLevel,
|
|
211
|
-
...(serverBundleBuildConfig ? {
|
|
212
|
-
__reactRouterServerBundleBuildConfig: serverBundleBuildConfig
|
|
213
|
-
} : {})
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
await cleanBuildDirectory(viteConfig, ctx);
|
|
217
|
-
// Run the Vite client build first
|
|
218
|
-
await viteBuild({
|
|
219
|
-
ssr: false
|
|
220
|
-
});
|
|
221
|
-
// Then run Vite SSR builds in parallel
|
|
222
|
-
let {
|
|
223
|
-
serverBuilds,
|
|
224
|
-
buildManifest
|
|
225
|
-
} = await getServerBuilds(ctx);
|
|
226
|
-
await Promise.all(serverBuilds.map(viteBuild));
|
|
227
|
-
let viteManifestPaths = getViteManifestPaths(ctx, serverBuilds);
|
|
228
|
-
await Promise.all(viteManifestPaths.map(async viteManifestPath => {
|
|
229
|
-
let manifestExists = await fse__default["default"].pathExists(viteManifestPath);
|
|
230
|
-
if (!manifestExists) return;
|
|
231
|
-
// Delete original Vite manifest file if consumer doesn't want it
|
|
232
|
-
if (!ctx.viteManifestEnabled) {
|
|
233
|
-
await fse__default["default"].remove(viteManifestPath);
|
|
234
|
-
}
|
|
235
|
-
// Remove .vite dir if it's now empty
|
|
236
|
-
let viteDir = path__default["default"].dirname(viteManifestPath);
|
|
237
|
-
let viteDirFiles = await fse__default["default"].readdir(viteDir);
|
|
238
|
-
if (viteDirFiles.length === 0) {
|
|
239
|
-
await fse__default["default"].remove(viteDir);
|
|
240
|
-
}
|
|
241
|
-
}));
|
|
242
|
-
await ((_reactRouterConfig$bu = reactRouterConfig.buildEnd) === null || _reactRouterConfig$bu === void 0 ? void 0 : _reactRouterConfig$bu.call(reactRouterConfig, {
|
|
243
|
-
buildManifest,
|
|
244
|
-
reactRouterConfig,
|
|
245
|
-
viteConfig
|
|
246
|
-
}));
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
exports.build = build;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { type AppLoadContext } from "react-router";
|
|
2
|
-
import { type Plugin } from "vite";
|
|
3
|
-
import { type GetPlatformProxyOptions, type PlatformProxy } from "wrangler";
|
|
4
|
-
type CfProperties = Record<string, unknown>;
|
|
5
|
-
type LoadContext<Env, Cf extends CfProperties> = {
|
|
6
|
-
cloudflare: Omit<PlatformProxy<Env, Cf>, "dispose">;
|
|
7
|
-
};
|
|
8
|
-
type GetLoadContext<Env, Cf extends CfProperties> = (args: {
|
|
9
|
-
request: Request;
|
|
10
|
-
context: LoadContext<Env, Cf>;
|
|
11
|
-
}) => AppLoadContext | Promise<AppLoadContext>;
|
|
12
|
-
/**
|
|
13
|
-
* Vite plugin that provides [Node proxies to local workerd
|
|
14
|
-
* bindings](https://developers.cloudflare.com/workers/wrangler/api/#getplatformproxy)
|
|
15
|
-
* to `context.cloudflare` in your server loaders and server actions during
|
|
16
|
-
* development.
|
|
17
|
-
*/
|
|
18
|
-
export declare const cloudflareDevProxyVitePlugin: <Env, Cf extends CfProperties>(options?: {
|
|
19
|
-
getLoadContext?: GetLoadContext<Env, Cf>;
|
|
20
|
-
} & GetPlatformProxyOptions) => Plugin;
|
|
21
|
-
export {};
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @react-router/dev v7.0.0-pre.2
|
|
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 reactRouter = require('react-router');
|
|
16
|
-
var nodeAdapter = require('./node-adapter.js');
|
|
17
|
-
|
|
18
|
-
let serverBuildId = "virtual:react-router/server-build";
|
|
19
|
-
function importWrangler() {
|
|
20
|
-
try {
|
|
21
|
-
return import('wrangler');
|
|
22
|
-
} catch (_) {
|
|
23
|
-
throw Error("Could not import `wrangler`. Do you have it installed?");
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
const PLUGIN_NAME = "react-router-cloudflare-vite-dev-proxy";
|
|
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;
|
|
38
|
-
return {
|
|
39
|
-
name: PLUGIN_NAME,
|
|
40
|
-
config: () => ({
|
|
41
|
-
ssr: {
|
|
42
|
-
resolve: {
|
|
43
|
-
externalConditions: ["workerd", "worker"]
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}),
|
|
47
|
-
configResolved: viteConfig => {
|
|
48
|
-
let pluginIndex = name => viteConfig.plugins.findIndex(plugin => plugin.name === name);
|
|
49
|
-
let reactRouterPluginIndex = pluginIndex("react-router");
|
|
50
|
-
if (reactRouterPluginIndex >= 0 && reactRouterPluginIndex < pluginIndex(PLUGIN_NAME)) {
|
|
51
|
-
throw new Error(`The "${PLUGIN_NAME}" plugin should be placed before the React Router plugin in your Vite config file`);
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
configureServer: async viteDevServer => {
|
|
55
|
-
let {
|
|
56
|
-
getPlatformProxy
|
|
57
|
-
} = await importWrangler();
|
|
58
|
-
// Do not include `dispose` in Cloudflare context
|
|
59
|
-
let {
|
|
60
|
-
dispose,
|
|
61
|
-
...cloudflare
|
|
62
|
-
} = await getPlatformProxy(restOptions);
|
|
63
|
-
let context = {
|
|
64
|
-
cloudflare
|
|
65
|
-
};
|
|
66
|
-
return () => {
|
|
67
|
-
if (!viteDevServer.config.server.middlewareMode) {
|
|
68
|
-
viteDevServer.middlewares.use(async (nodeReq, nodeRes, next) => {
|
|
69
|
-
try {
|
|
70
|
-
let build = await viteDevServer.ssrLoadModule(serverBuildId);
|
|
71
|
-
let handler = reactRouter.createRequestHandler(build, "development");
|
|
72
|
-
let req = nodeAdapter.fromNodeRequest(nodeReq, nodeRes);
|
|
73
|
-
let loadContext = getLoadContext ? await getLoadContext({
|
|
74
|
-
request: req,
|
|
75
|
-
context
|
|
76
|
-
}) : context;
|
|
77
|
-
let res = await handler(req, loadContext);
|
|
78
|
-
await nodeAdapter.toNodeRequest(res, nodeRes);
|
|
79
|
-
} catch (error) {
|
|
80
|
-
next(error);
|
|
81
|
-
}
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
exports.cloudflareDevProxyVitePlugin = cloudflareDevProxyVitePlugin;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function combineURLs(baseURL: string, relativeURL: string): string;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @react-router/dev v7.0.0-pre.2
|
|
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
|
-
// Borrowed from axios: https://github.com/axios/axios/blob/0e4f9fa29077ebee4499facea6be1492b42e8a26/lib/helpers/combineURLs.js#L11-L15
|
|
16
|
-
function combineURLs(baseURL, relativeURL) {
|
|
17
|
-
return relativeURL ? baseURL.replace(/\/+$/, "") + "/" + relativeURL.replace(/^\/+/, "") : baseURL;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
exports.combineURLs = combineURLs;
|