@vercel/microfrontends 0.9.0 → 0.10.0
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/README.md +2 -2
- package/dist/bin/cli.cjs +1483 -186
- package/dist/config/edge.cjs +47 -47
- package/dist/config/edge.cjs.map +1 -1
- package/dist/config/edge.d.ts +6 -6
- package/dist/config/edge.js +46 -46
- package/dist/config/edge.js.map +1 -1
- package/dist/config.cjs +66 -60
- package/dist/config.cjs.map +1 -1
- package/dist/config.d.ts +3 -3
- package/dist/config.js +65 -59
- package/dist/config.js.map +1 -1
- package/dist/{index-eff254d8.d.ts → index-05742bef.d.ts} +11 -22
- package/dist/{micro-frontend-config-42886104.d.ts → microfrontend-config-2425db74.d.ts} +12 -12
- package/dist/next/config.cjs +83 -77
- package/dist/next/config.cjs.map +1 -1
- package/dist/next/config.d.ts +3 -3
- package/dist/next/config.js +82 -76
- package/dist/next/config.js.map +1 -1
- package/dist/next/middleware.cjs +55 -55
- package/dist/next/middleware.cjs.map +1 -1
- package/dist/next/middleware.d.ts +11 -11
- package/dist/next/middleware.js +53 -53
- package/dist/next/middleware.js.map +1 -1
- package/dist/next/testing.cjs +79 -73
- package/dist/next/testing.cjs.map +1 -1
- package/dist/next/testing.d.ts +9 -9
- package/dist/next/testing.js +79 -73
- package/dist/next/testing.js.map +1 -1
- package/dist/overrides.cjs +9 -9
- package/dist/overrides.cjs.map +1 -1
- package/dist/overrides.d.ts +1 -1
- package/dist/overrides.js +9 -9
- package/dist/overrides.js.map +1 -1
- package/dist/types-13f3e535.d.ts +15 -0
- package/dist/v2/config.cjs +39 -39
- package/dist/v2/config.cjs.map +1 -1
- package/dist/v2/config.d.ts +2 -1
- package/dist/v2/config.js +38 -38
- package/dist/v2/config.js.map +1 -1
- package/dist/v2/microfrontends/server.cjs +102 -65
- package/dist/v2/microfrontends/server.cjs.map +1 -1
- package/dist/v2/microfrontends/server.d.ts +6 -1
- package/dist/v2/microfrontends/server.js +102 -65
- package/dist/v2/microfrontends/server.js.map +1 -1
- package/dist/v2/microfrontends.cjs +44 -44
- package/dist/v2/microfrontends.cjs.map +1 -1
- package/dist/v2/microfrontends.d.ts +5 -4
- package/dist/v2/microfrontends.js +44 -44
- package/dist/v2/microfrontends.js.map +1 -1
- package/dist/v2/next/client.cjs +1 -1
- package/dist/v2/next/client.cjs.map +1 -1
- package/dist/v2/next/client.js +1 -1
- package/dist/v2/next/client.js.map +1 -1
- package/dist/v2/next/config.cjs +120 -83
- package/dist/v2/next/config.cjs.map +1 -1
- package/dist/v2/next/config.d.ts +4 -4
- package/dist/v2/next/config.js +119 -82
- package/dist/v2/next/config.js.map +1 -1
- package/dist/v2/next/endpoints.cjs +5 -5
- package/dist/v2/next/endpoints.cjs.map +1 -1
- package/dist/v2/next/endpoints.js +5 -5
- package/dist/v2/next/endpoints.js.map +1 -1
- package/dist/v2/next/middleware.cjs +54 -54
- package/dist/v2/next/middleware.cjs.map +1 -1
- package/dist/v2/next/middleware.d.ts +8 -8
- package/dist/v2/next/middleware.js +52 -52
- package/dist/v2/next/middleware.js.map +1 -1
- package/dist/v2/overrides.cjs +75 -0
- package/dist/v2/overrides.cjs.map +1 -0
- package/dist/v2/overrides.d.ts +24 -0
- package/dist/v2/overrides.js +45 -0
- package/dist/v2/overrides.js.map +1 -0
- package/dist/validation.cjs +20 -20
- package/dist/validation.cjs.map +1 -1
- package/dist/validation.js +20 -20
- package/dist/validation.js.map +1 -1
- package/package.json +10 -3
package/dist/v2/config.js
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
import { parse } from "jsonc-parser";
|
|
3
3
|
|
|
4
4
|
// src/config-v2/errors.ts
|
|
5
|
-
var
|
|
5
|
+
var MicrofrontendError = class extends Error {
|
|
6
6
|
constructor(message, opts) {
|
|
7
7
|
super(message);
|
|
8
|
-
this.name = "
|
|
9
|
-
this.source = (opts == null ? void 0 : opts.source) ?? "@vercel/
|
|
8
|
+
this.name = "MicrofrontendsError";
|
|
9
|
+
this.source = (opts == null ? void 0 : opts.source) ?? "@vercel/microfrontends";
|
|
10
10
|
this.type = (opts == null ? void 0 : opts.type) ?? "unknown";
|
|
11
11
|
this.subtype = opts == null ? void 0 : opts.subtype;
|
|
12
|
-
Error.captureStackTrace(this,
|
|
12
|
+
Error.captureStackTrace(this, MicrofrontendError);
|
|
13
13
|
}
|
|
14
14
|
isKnown() {
|
|
15
15
|
return this.type !== "unknown";
|
|
@@ -18,13 +18,13 @@ var MicroFrontendError = class extends Error {
|
|
|
18
18
|
return !this.isKnown();
|
|
19
19
|
}
|
|
20
20
|
/**
|
|
21
|
-
* Converts an error to a
|
|
21
|
+
* Converts an error to a MicrofrontendsError.
|
|
22
22
|
* @param original - The original error to convert.
|
|
23
|
-
* @returns The converted
|
|
23
|
+
* @returns The converted MicrofrontendsError.
|
|
24
24
|
*/
|
|
25
25
|
static convert(original, opts) {
|
|
26
26
|
if (opts == null ? void 0 : opts.fileName) {
|
|
27
|
-
const err =
|
|
27
|
+
const err = MicrofrontendError.convertFSError(original, opts.fileName);
|
|
28
28
|
if (err) {
|
|
29
29
|
return err;
|
|
30
30
|
}
|
|
@@ -32,25 +32,25 @@ var MicroFrontendError = class extends Error {
|
|
|
32
32
|
if (original.message.includes(
|
|
33
33
|
"Code generation from strings disallowed for this context"
|
|
34
34
|
)) {
|
|
35
|
-
return new
|
|
35
|
+
return new MicrofrontendError(original.message, {
|
|
36
36
|
type: "config",
|
|
37
37
|
subtype: "unsupported_validation_env",
|
|
38
38
|
source: "ajv"
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
|
-
return new
|
|
41
|
+
return new MicrofrontendError(original.message);
|
|
42
42
|
}
|
|
43
43
|
static convertFSError(original, fileName) {
|
|
44
44
|
if (original instanceof Error && "code" in original) {
|
|
45
45
|
if (original.code === "ENOENT") {
|
|
46
|
-
return new
|
|
46
|
+
return new MicrofrontendError(`Could not find "${fileName}"`, {
|
|
47
47
|
type: "config",
|
|
48
48
|
subtype: "unable_to_read_file",
|
|
49
49
|
source: "fs"
|
|
50
50
|
});
|
|
51
51
|
}
|
|
52
52
|
if (original.code === "EACCES") {
|
|
53
|
-
return new
|
|
53
|
+
return new MicrofrontendError(
|
|
54
54
|
`Permission denied while accessing "${fileName}"`,
|
|
55
55
|
{
|
|
56
56
|
type: "config",
|
|
@@ -61,7 +61,7 @@ var MicroFrontendError = class extends Error {
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
if (original instanceof SyntaxError) {
|
|
64
|
-
return new
|
|
64
|
+
return new MicrofrontendError(
|
|
65
65
|
`Failed to parse "${fileName}": Invalid JSON format.`,
|
|
66
66
|
{
|
|
67
67
|
type: "config",
|
|
@@ -73,23 +73,23 @@ var MicroFrontendError = class extends Error {
|
|
|
73
73
|
return null;
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
76
|
-
* Handles an unknown error and returns a
|
|
76
|
+
* Handles an unknown error and returns a MicrofrontendsError instance.
|
|
77
77
|
* @param err - The error to handle.
|
|
78
|
-
* @returns A
|
|
78
|
+
* @returns A MicrofrontendsError instance.
|
|
79
79
|
*/
|
|
80
80
|
static handle(err, opts) {
|
|
81
|
-
if (err instanceof
|
|
81
|
+
if (err instanceof MicrofrontendError) {
|
|
82
82
|
return err;
|
|
83
83
|
}
|
|
84
84
|
if (err instanceof Error) {
|
|
85
|
-
return
|
|
85
|
+
return MicrofrontendError.convert(err, opts);
|
|
86
86
|
}
|
|
87
87
|
if (typeof err === "object" && err !== null) {
|
|
88
88
|
if ("message" in err && typeof err.message === "string") {
|
|
89
|
-
return
|
|
89
|
+
return MicrofrontendError.convert(new Error(err.message), opts);
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
|
-
return new
|
|
92
|
+
return new MicrofrontendError("An unknown error occurred");
|
|
93
93
|
}
|
|
94
94
|
};
|
|
95
95
|
|
|
@@ -97,7 +97,7 @@ var MicroFrontendError = class extends Error {
|
|
|
97
97
|
function getConfigStringFromEnv() {
|
|
98
98
|
const config = process.env.MFE_CONFIG;
|
|
99
99
|
if (!config) {
|
|
100
|
-
throw new
|
|
100
|
+
throw new MicrofrontendError(`Missing "MFE_CONFIG" in environment.`, {
|
|
101
101
|
type: "config",
|
|
102
102
|
subtype: "not_found_in_env"
|
|
103
103
|
});
|
|
@@ -117,7 +117,7 @@ function isDefaultApp(a) {
|
|
|
117
117
|
|
|
118
118
|
// src/config-v2/microfrontends-config/client/index.ts
|
|
119
119
|
import { pathToRegexp } from "path-to-regexp";
|
|
120
|
-
var
|
|
120
|
+
var MicrofrontendConfigClient = class {
|
|
121
121
|
constructor(config, opts) {
|
|
122
122
|
this.pathCache = {};
|
|
123
123
|
this.serialized = config;
|
|
@@ -131,14 +131,14 @@ var MicroFrontendConfigClient = class {
|
|
|
131
131
|
this.applications = config.applications;
|
|
132
132
|
}
|
|
133
133
|
/**
|
|
134
|
-
* Create a new `
|
|
134
|
+
* Create a new `MicrofrontendConfigClient` from a JSON string.
|
|
135
135
|
* Config must be passed in to remain framework agnostic
|
|
136
136
|
*/
|
|
137
137
|
static fromEnv(config, opts) {
|
|
138
138
|
if (!config) {
|
|
139
|
-
throw new Error("No
|
|
139
|
+
throw new Error("No microfrontends configuration found");
|
|
140
140
|
}
|
|
141
|
-
return new
|
|
141
|
+
return new MicrofrontendConfigClient(
|
|
142
142
|
JSON.parse(config),
|
|
143
143
|
opts
|
|
144
144
|
);
|
|
@@ -220,7 +220,7 @@ import { pathToRegexp as pathToRegexp2, parse as parsePathRegexp } from "path-to
|
|
|
220
220
|
var SUPPORTED_VERSIONS = ["2"];
|
|
221
221
|
var validateConfigVersion = (version) => {
|
|
222
222
|
if (!SUPPORTED_VERSIONS.includes(version)) {
|
|
223
|
-
throw new
|
|
223
|
+
throw new MicrofrontendError(
|
|
224
224
|
`Unsupported version: ${version}. Supported versions are: ${SUPPORTED_VERSIONS.join(
|
|
225
225
|
", "
|
|
226
226
|
)}`,
|
|
@@ -290,7 +290,7 @@ var validateConfigPaths = (applicationConfigsById) => {
|
|
|
290
290
|
);
|
|
291
291
|
});
|
|
292
292
|
if (errors.length) {
|
|
293
|
-
throw new
|
|
293
|
+
throw new MicrofrontendError(`Invalid paths: ${errors.join(", ")}`, {
|
|
294
294
|
type: "config",
|
|
295
295
|
subtype: "conflicting_paths"
|
|
296
296
|
});
|
|
@@ -303,13 +303,13 @@ var validateAppPaths = (name, app) => {
|
|
|
303
303
|
continue;
|
|
304
304
|
}
|
|
305
305
|
if (p.endsWith("/")) {
|
|
306
|
-
throw new
|
|
306
|
+
throw new MicrofrontendError(
|
|
307
307
|
`Invalid path for application "${name}". ${p} must not end with a slash.`,
|
|
308
308
|
{ type: "application", subtype: "invalid_path" }
|
|
309
309
|
);
|
|
310
310
|
}
|
|
311
311
|
if (!p.startsWith("/")) {
|
|
312
|
-
throw new
|
|
312
|
+
throw new MicrofrontendError(
|
|
313
313
|
`Invalid path for application "${name}". ${p} must start with a slash.`,
|
|
314
314
|
{ type: "application", subtype: "invalid_path" }
|
|
315
315
|
);
|
|
@@ -331,13 +331,13 @@ var validateConfigDefaultApplication = (applicationConfigsById) => {
|
|
|
331
331
|
const numApplicationsWithRouting = applicationsWithRoutingNames.length;
|
|
332
332
|
const numApplicationsWithoutRouting = numApplications - numApplicationsWithRouting;
|
|
333
333
|
if (numApplicationsWithoutRouting === 0) {
|
|
334
|
-
throw new
|
|
334
|
+
throw new MicrofrontendError(
|
|
335
335
|
`No default application found. At least one application needs to be the default by omitting routing.`,
|
|
336
336
|
{ type: "config", subtype: "no_default_application" }
|
|
337
337
|
);
|
|
338
338
|
}
|
|
339
339
|
if (numApplicationsWithoutRouting > 1) {
|
|
340
|
-
throw new
|
|
340
|
+
throw new MicrofrontendError(
|
|
341
341
|
`Only one application can omit "routing". Found ${applicationsWithRoutingNames.length - Object.keys(applicationConfigsById).length > 1}.`,
|
|
342
342
|
{ type: "config", subtype: "multiple_default_applications" }
|
|
343
343
|
);
|
|
@@ -349,7 +349,7 @@ var validateConfigOptions = (options) => {
|
|
|
349
349
|
if (!/^[a-zA-Z]{2,}\.[a-zA-Z]{2,}$/.test(
|
|
350
350
|
options.vercel.previewDeploymentSuffix
|
|
351
351
|
)) {
|
|
352
|
-
throw new
|
|
352
|
+
throw new MicrofrontendError(
|
|
353
353
|
`Invalid preview deployment suffix: ${options.vercel.previewDeploymentSuffix}. Should have be formatted like "vercel.app".`,
|
|
354
354
|
{ type: "config", subtype: "invalid_preview_deployment_suffix" }
|
|
355
355
|
);
|
|
@@ -508,7 +508,7 @@ var ChildApplication = class extends Application {
|
|
|
508
508
|
var DEFAULT_LOCAL_PROXY_PORT = 3024;
|
|
509
509
|
|
|
510
510
|
// src/config-v2/microfrontends-config/isomorphic/index.ts
|
|
511
|
-
var
|
|
511
|
+
var MicrofrontendConfigIsomorphic = class {
|
|
512
512
|
constructor({
|
|
513
513
|
config,
|
|
514
514
|
overrides,
|
|
@@ -516,7 +516,7 @@ var MicroFrontendConfigIsomorphic = class {
|
|
|
516
516
|
}) {
|
|
517
517
|
this.childApplications = {};
|
|
518
518
|
var _a, _b, _c, _d;
|
|
519
|
-
|
|
519
|
+
MicrofrontendConfigIsomorphic.validate(config);
|
|
520
520
|
const disableOverrides = ((_b = (_a = config.options) == null ? void 0 : _a.vercel) == null ? void 0 : _b.disableOverrides) ?? false;
|
|
521
521
|
this.overrides = overrides && !disableOverrides ? overrides : void 0;
|
|
522
522
|
this.isMainConfig = isMainConfig(config);
|
|
@@ -548,7 +548,7 @@ var MicroFrontendConfigIsomorphic = class {
|
|
|
548
548
|
);
|
|
549
549
|
}
|
|
550
550
|
if (isMainConfig(config) && !this.defaultApplication) {
|
|
551
|
-
throw new
|
|
551
|
+
throw new MicrofrontendError(
|
|
552
552
|
`Could not find default application in microfrontends configuration`,
|
|
553
553
|
{
|
|
554
554
|
type: "application",
|
|
@@ -578,7 +578,7 @@ var MicroFrontendConfigIsomorphic = class {
|
|
|
578
578
|
meta,
|
|
579
579
|
cookies
|
|
580
580
|
}) {
|
|
581
|
-
return new
|
|
581
|
+
return new MicrofrontendConfigIsomorphic({
|
|
582
582
|
config: parse(getConfigStringFromEnv()),
|
|
583
583
|
overrides: parseOverrides(cookies ?? []),
|
|
584
584
|
meta
|
|
@@ -613,7 +613,7 @@ var MicroFrontendConfigIsomorphic = class {
|
|
|
613
613
|
}
|
|
614
614
|
const app = this.childApplications[name];
|
|
615
615
|
if (!app) {
|
|
616
|
-
throw new
|
|
616
|
+
throw new MicrofrontendError(
|
|
617
617
|
`Could not find microfrontends configuration for application "${name}"`,
|
|
618
618
|
{
|
|
619
619
|
type: "application",
|
|
@@ -641,7 +641,7 @@ var MicroFrontendConfigIsomorphic = class {
|
|
|
641
641
|
*/
|
|
642
642
|
getDefaultApplication() {
|
|
643
643
|
if (!this.defaultApplication) {
|
|
644
|
-
throw new
|
|
644
|
+
throw new MicrofrontendError(
|
|
645
645
|
`Could not find default application in microfrontends configuration`,
|
|
646
646
|
{
|
|
647
647
|
type: "application",
|
|
@@ -681,7 +681,7 @@ var MicroFrontendConfigIsomorphic = class {
|
|
|
681
681
|
default: true
|
|
682
682
|
};
|
|
683
683
|
}
|
|
684
|
-
return new
|
|
684
|
+
return new MicrofrontendConfigClient({
|
|
685
685
|
applications
|
|
686
686
|
});
|
|
687
687
|
}
|
|
@@ -690,6 +690,6 @@ var MicroFrontendConfigIsomorphic = class {
|
|
|
690
690
|
}
|
|
691
691
|
};
|
|
692
692
|
export {
|
|
693
|
-
|
|
693
|
+
MicrofrontendConfigIsomorphic
|
|
694
694
|
};
|
|
695
695
|
//# sourceMappingURL=config.js.map
|
package/dist/v2/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/config-v2/microfrontends-config/isomorphic/index.ts","../../src/config-v2/errors.ts","../../src/config-v2/microfrontends-config/utils/get-config-from-env.ts","../../src/config-v2/schema/utils/is-main-config.ts","../../src/config-v2/schema/utils/is-default-app.ts","../../src/config-v2/microfrontends-config/client/index.ts","../../src/config-v2/overrides/constants.ts","../../src/config-v2/overrides/is-override-cookie.ts","../../src/config-v2/overrides/get-override-from-cookie.ts","../../src/config-v2/overrides/parse-overrides.ts","../../src/config-v2/microfrontends-config/isomorphic/validation.ts","../../src/config-v2/microfrontends-config/isomorphic/utils/generate-asset-prefix.ts","../../src/config-v2/microfrontends-config/isomorphic/utils/generate-port.ts","../../src/config-v2/microfrontends-config/isomorphic/host.ts","../../src/config-v2/microfrontends-config/isomorphic/application.ts","../../src/config-v2/microfrontends-config/isomorphic/constants.ts"],"sourcesContent":["import { parse } from 'jsonc-parser';\nimport { getConfigStringFromEnv } from '../utils/get-config-from-env';\nimport { isMainConfig } from '../../schema/utils/is-main-config';\nimport { isDefaultApp } from '../../schema/utils/is-default-app';\nimport type { Config } from '../../schema/types';\nimport type { ClientConfig } from '../client/types';\nimport { MicroFrontendError } from '../../errors';\nimport { MicroFrontendConfigClient } from '../client';\nimport { type OverridesConfig, parseOverrides } from '../../overrides';\nimport { DefaultApplication, ChildApplication } from './application';\nimport { DEFAULT_LOCAL_PROXY_PORT } from './constants';\nimport {\n validateConfigDefaultApplication,\n validateConfigPaths,\n validateConfigVersion,\n validateConfigOptions,\n} from './validation';\n\nexport interface ConfigMeta {\n /**\n * The application name that the configuration is being loaded from.\n */\n fromApp: string;\n}\n\n/**\n * A class to manage the microfrontends configuration.\n */\nexport class MicroFrontendConfigIsomorphic {\n config: Config;\n isMainConfig: boolean;\n partOf?: string;\n defaultApplication?: DefaultApplication;\n childApplications: Record<string, ChildApplication> = {};\n overrides?: OverridesConfig;\n options?: Config['options'];\n\n private readonly serialized: {\n config: Config;\n overrides?: OverridesConfig;\n meta: ConfigMeta;\n };\n\n constructor({\n config,\n overrides,\n meta,\n }: { config: Config; overrides?: OverridesConfig; meta: ConfigMeta }) {\n // run validation on init\n MicroFrontendConfigIsomorphic.validate(config);\n\n const disableOverrides = config.options?.vercel?.disableOverrides ?? false;\n this.overrides = overrides && !disableOverrides ? overrides : undefined;\n this.isMainConfig = isMainConfig(config);\n\n if (isMainConfig(config)) {\n // create applications\n for (const [appId, appConfig] of Object.entries(config.applications)) {\n const appOverrides = !disableOverrides\n ? this.overrides?.applications[appId]\n : undefined;\n\n if (isDefaultApp(appConfig)) {\n this.defaultApplication = new DefaultApplication(appId, {\n app: appConfig,\n overrides: appOverrides,\n });\n } else {\n this.childApplications[appId] = new ChildApplication(appId, {\n app: appConfig,\n overrides: appOverrides,\n });\n }\n }\n } else {\n this.partOf = config.partOf;\n const appOverrides = !disableOverrides\n ? this.overrides?.applications[meta.fromApp]\n : undefined;\n this.childApplications[meta.fromApp] = new ChildApplication(\n meta.fromApp,\n {\n // we don't know routing because we're not in the main config\n app: { routing: [] },\n overrides: appOverrides,\n },\n );\n }\n\n // the main configuration file should ALWAYS have the default\n if (isMainConfig(config) && !this.defaultApplication) {\n throw new MicroFrontendError(\n `Could not find default application in microfrontends configuration`,\n {\n type: 'application',\n subtype: 'not_found',\n },\n );\n }\n\n this.config = config;\n this.options = config.options;\n this.serialized = {\n config,\n overrides,\n meta,\n };\n }\n\n static validate(config: string | Config): Config {\n // let this throw if it's not valid JSON\n const c = typeof config === 'string' ? (parse(config) as Config) : config;\n\n if (isMainConfig(c)) {\n // run validation\n validateConfigVersion(c.version);\n validateConfigPaths(c.applications);\n validateConfigDefaultApplication(c.applications);\n }\n validateConfigOptions(c.options);\n\n return c;\n }\n\n static fromEnv({\n meta,\n cookies,\n }: {\n meta: ConfigMeta;\n cookies?: { name: string; value: string }[];\n }): MicroFrontendConfigIsomorphic {\n return new MicroFrontendConfigIsomorphic({\n config: parse(getConfigStringFromEnv()) as Config,\n overrides: parseOverrides(cookies ?? []),\n meta,\n });\n }\n\n isOverridesDisabled(): boolean {\n return this.options?.vercel?.disableOverrides ?? false;\n }\n\n getConfig(): Config {\n return this.config;\n }\n\n getApplicationsByType(): {\n defaultApplication?: DefaultApplication;\n applications: ChildApplication[];\n } {\n return {\n defaultApplication: this.defaultApplication,\n applications: Object.values(this.childApplications),\n };\n }\n\n getChildApplications(): ChildApplication[] {\n return Object.values(this.childApplications);\n }\n\n getAllApplications(): (DefaultApplication | ChildApplication)[] {\n return [\n this.defaultApplication,\n ...Object.values(this.childApplications),\n ].filter(Boolean) as (DefaultApplication | ChildApplication)[];\n }\n\n getApplication(name: string): DefaultApplication | ChildApplication {\n // check the default\n if (this.defaultApplication?.name === name) {\n return this.defaultApplication;\n }\n const app = this.childApplications[name];\n if (!app) {\n throw new MicroFrontendError(\n `Could not find microfrontends configuration for application \"${name}\"`,\n {\n type: 'application',\n subtype: 'not_found',\n },\n );\n }\n\n return app;\n }\n\n getApplicationByProjectId(\n projectId: string,\n ): DefaultApplication | ChildApplication | undefined {\n // check the default\n if (this.defaultApplication?.vercel?.projectId === projectId) {\n return this.defaultApplication;\n }\n\n return Object.values(this.childApplications).find(\n (app) => app.vercel?.projectId === projectId,\n );\n }\n\n /**\n * Returns the default application. This can throw if the default application\n * is undefined ( )\n */\n getDefaultApplication(): DefaultApplication {\n if (!this.defaultApplication) {\n throw new MicroFrontendError(\n `Could not find default application in microfrontends configuration`,\n {\n type: 'application',\n subtype: 'not_found',\n },\n );\n }\n\n return this.defaultApplication;\n }\n\n /**\n * Returns the configured port for the local proxy\n */\n getLocalProxyPort(): number {\n return this.config.options?.localProxy?.port ?? DEFAULT_LOCAL_PROXY_PORT;\n }\n\n /**\n * Serializes the class back to the Schema type.\n *\n * NOTE: This is used when writing the config to disk and must always match the input Schema\n */\n toSchemaJson(): Config {\n return this.serialized.config;\n }\n\n toClientConfig(): MicroFrontendConfigClient {\n const applications: ClientConfig['applications'] = Object.fromEntries(\n Object.entries(this.childApplications).map(([name, application]) => [\n name,\n {\n default: false,\n routing: application.routing,\n },\n ]),\n );\n\n // add the default application\n if (this.defaultApplication) {\n applications[this.defaultApplication.name] = {\n default: true,\n };\n }\n\n return new MicroFrontendConfigClient({\n applications,\n });\n }\n\n serialize(): {\n config: Config;\n overrides?: OverridesConfig;\n meta: ConfigMeta;\n } {\n return this.serialized;\n }\n}\n","export type MicroFrontendErrorType =\n | 'config'\n | 'packageJson'\n | 'vercelJson'\n | 'application'\n | 'unknown';\n\nexport type MicroFrontendErrorSubtype =\n | 'not_found'\n | 'not_found_in_env'\n | 'invalid_asset_prefix'\n | 'invalid_main_path'\n | 'does_not_match_schema'\n | 'unable_to_read_file'\n | 'unsupported_validation_env'\n | 'unsupported_version'\n | 'invalid_path'\n | 'invalid_permissions'\n | 'invalid_syntax'\n | 'missing_microFrontend_config_path'\n | 'unsupported_operation';\n\n// A mapping of error types to their subtypes.\ninterface TypeToSubtype {\n application:\n | 'invalid_asset_prefix'\n | 'invalid_path'\n | 'multiple_package_managers'\n | 'not_found';\n config:\n | 'conflicting_paths'\n | 'does_not_match_schema'\n | 'invalid_main_path'\n | 'invalid_preview_deployment_suffix'\n | 'multiple_default_applications'\n | 'no_default_application'\n | 'not_found_in_env'\n | 'not_found'\n | 'unable_to_read_file'\n | 'invalid_syntax'\n | 'invalid_permissions'\n | 'unsupported_operation'\n | 'unsupported_validation_env'\n | 'unsupported_version';\n packageJson:\n | 'missing_field_name'\n | 'unable_to_read_file'\n | 'invalid_permissions'\n | 'invalid_syntax';\n vercelJson:\n | 'missing_field_microFrontend_config_path'\n | 'unable_to_read_file'\n | 'invalid_permissions'\n | 'invalid_syntax';\n unknown: never;\n}\n\nexport type MicroFrontendErrorSource =\n | '@vercel/micro-frontends'\n | '@vercel/micro-frontends/next'\n | 'fs'\n | 'ajv';\n\nexport interface MicroFrontendErrorOptions<T extends MicroFrontendErrorType> {\n source?: MicroFrontendErrorSource;\n type?: T;\n subtype?: TypeToSubtype[T];\n}\n\ninterface HandleOptions {\n fileName?: string;\n}\n\nexport class MicroFrontendError<\n T extends MicroFrontendErrorType = 'unknown',\n> extends Error {\n public source: MicroFrontendErrorSource;\n public type: T;\n public subtype?: TypeToSubtype[T];\n\n constructor(message: string, opts?: MicroFrontendErrorOptions<T>) {\n super(message);\n this.name = 'MicroFrontendsError';\n this.source = opts?.source ?? '@vercel/micro-frontends';\n this.type = opts?.type ?? ('unknown' as T);\n this.subtype = opts?.subtype;\n Error.captureStackTrace(this, MicroFrontendError);\n }\n\n isKnown(): boolean {\n return this.type !== 'unknown';\n }\n\n isUnknown(): boolean {\n return !this.isKnown();\n }\n\n /**\n * Converts an error to a MicroFrontendsError.\n * @param original - The original error to convert.\n * @returns The converted MicroFrontendsError.\n */\n static convert(\n original: Error,\n opts?: HandleOptions,\n ): MicroFrontendError<MicroFrontendErrorType> {\n if (opts?.fileName) {\n const err = MicroFrontendError.convertFSError(original, opts.fileName);\n if (err) {\n return err;\n }\n }\n\n if (\n original.message.includes(\n 'Code generation from strings disallowed for this context',\n )\n ) {\n return new MicroFrontendError(original.message, {\n type: 'config',\n subtype: 'unsupported_validation_env',\n source: 'ajv',\n });\n }\n\n // unknown catch-all\n return new MicroFrontendError(original.message);\n }\n\n static convertFSError(\n original: Error,\n fileName: string,\n ): MicroFrontendError<MicroFrontendErrorType> | null {\n if (original instanceof Error && 'code' in original) {\n if (original.code === 'ENOENT') {\n return new MicroFrontendError(`Could not find \"${fileName}\"`, {\n type: 'config',\n subtype: 'unable_to_read_file',\n source: 'fs',\n });\n }\n if (original.code === 'EACCES') {\n return new MicroFrontendError(\n `Permission denied while accessing \"${fileName}\"`,\n {\n type: 'config',\n subtype: 'invalid_permissions',\n source: 'fs',\n },\n );\n }\n }\n\n if (original instanceof SyntaxError) {\n return new MicroFrontendError(\n `Failed to parse \"${fileName}\": Invalid JSON format.`,\n {\n type: 'config',\n subtype: 'invalid_syntax',\n source: 'fs',\n },\n );\n }\n\n return null;\n }\n\n /**\n * Handles an unknown error and returns a MicroFrontendsError instance.\n * @param err - The error to handle.\n * @returns A MicroFrontendsError instance.\n */\n static handle(\n err: unknown,\n opts?: HandleOptions,\n ): MicroFrontendError<MicroFrontendErrorType> {\n if (err instanceof MicroFrontendError) {\n return err as MicroFrontendError<MicroFrontendErrorType>;\n }\n\n // handle Error instances\n if (err instanceof Error) {\n return MicroFrontendError.convert(err, opts);\n }\n\n // handle object errors\n if (typeof err === 'object' && err !== null) {\n if ('message' in err && typeof err.message === 'string') {\n return MicroFrontendError.convert(new Error(err.message), opts);\n }\n }\n\n return new MicroFrontendError('An unknown error occurred');\n }\n}\n","import { MicroFrontendError } from '../../errors';\n\n/**\n * Utility to fetch the microfrontend configuration string from the environment.\n */\nexport function getConfigStringFromEnv(): string {\n const config = process.env.MFE_CONFIG;\n if (!config) {\n throw new MicroFrontendError(`Missing \"MFE_CONFIG\" in environment.`, {\n type: 'config',\n subtype: 'not_found_in_env',\n });\n }\n return config;\n}\n","import type { Config, MainConfig } from '../types';\n\nexport function isMainConfig(c: Config): c is MainConfig {\n return !('partOf' in c);\n}\n","import type { Application, DefaultApplication } from '../types';\n\nexport function isDefaultApp(a: Application): a is DefaultApplication {\n return !('routing' in a);\n}\n","import { pathToRegexp } from 'path-to-regexp';\nimport type { ClientConfig } from './types';\n\ninterface MicroFrontendConfigClientOptions {\n removeFlaggedPaths?: boolean;\n}\n\nexport class MicroFrontendConfigClient {\n applications: ClientConfig['applications'];\n pathCache: Record<string, string> = {};\n private readonly serialized: ClientConfig;\n\n constructor(config: ClientConfig, opts?: MicroFrontendConfigClientOptions) {\n this.serialized = config;\n if (opts?.removeFlaggedPaths) {\n for (const app of Object.values(config.applications)) {\n if (app.routing) {\n app.routing = app.routing.filter((match) => !match.flag);\n }\n }\n }\n this.applications = config.applications;\n }\n\n /**\n * Create a new `MicroFrontendConfigClient` from a JSON string.\n * Config must be passed in to remain framework agnostic\n */\n static fromEnv(\n config: string | undefined,\n opts?: MicroFrontendConfigClientOptions,\n ): MicroFrontendConfigClient {\n if (!config) {\n throw new Error('No micro-frontends configuration found');\n }\n return new MicroFrontendConfigClient(\n JSON.parse(config) as ClientConfig,\n opts,\n );\n }\n\n isEqual(other: MicroFrontendConfigClient): boolean {\n return (\n JSON.stringify(this.applications) === JSON.stringify(other.applications)\n );\n }\n\n getApplicationNameForPath(path: string): string | null {\n if (!path.startsWith('/')) {\n throw new Error(`Path must start with a /`);\n }\n\n if (this.pathCache[path]) {\n return this.pathCache[path];\n }\n\n const pathname = new URL(path, 'https://example.com').pathname;\n for (const [name, application] of Object.entries(this.applications)) {\n if (application.routing) {\n for (const group of application.routing) {\n for (const childPath of group.paths) {\n const regexp = pathToRegexp(childPath);\n if (regexp.test(pathname)) {\n this.pathCache[path] = name;\n return name;\n }\n }\n }\n }\n }\n const defaultApplication = Object.entries(this.applications).find(\n ([, application]) => application.default,\n );\n if (!defaultApplication) {\n return null;\n }\n\n this.pathCache[path] = defaultApplication[0];\n return defaultApplication[0];\n }\n\n serialize(): ClientConfig {\n return this.serialized;\n }\n}\n","export const OVERRIDES_COOKIE_PREFIX = 'vercel-microfrontends-override';\nexport const OVERRIDES_ENV_COOKIE_PREFIX = `${OVERRIDES_COOKIE_PREFIX}:env:`;\n","import { OVERRIDES_COOKIE_PREFIX } from './constants';\n\nexport function isOverrideCookie(cookie: { name?: string }): boolean {\n return Boolean(cookie.name?.startsWith(OVERRIDES_COOKIE_PREFIX));\n}\n","import { isOverrideCookie } from './is-override-cookie';\nimport { OVERRIDES_ENV_COOKIE_PREFIX } from './constants';\n\nexport function getOverrideFromCookie(cookie: {\n name: string;\n value?: string | null;\n}): { application: string; host: string } | undefined {\n if (!isOverrideCookie(cookie) || !cookie.value) return;\n return {\n application: cookie.name.replace(OVERRIDES_ENV_COOKIE_PREFIX, ''),\n host: cookie.value,\n };\n}\n","import type { OverridesConfig } from './types';\nimport { getOverrideFromCookie } from './get-override-from-cookie';\n\nexport function parseOverrides(\n cookies: { name: string; value?: string | null }[],\n): OverridesConfig {\n const overridesConfig: OverridesConfig = { applications: {} };\n\n cookies.forEach((cookie) => {\n const override = getOverrideFromCookie(cookie);\n if (!override) return;\n overridesConfig.applications[override.application] = {\n environment: { host: override.host },\n };\n });\n\n return overridesConfig;\n}\n","import { pathToRegexp, parse as parsePathRegexp } from 'path-to-regexp';\nimport type {\n ApplicationId,\n PathGroup,\n ApplicationRouting,\n ChildApplication as ChildApplicationConfig,\n Options,\n} from '../../schema/types';\nimport { MicroFrontendError } from '../../errors';\nimport { isDefaultApp } from '../../schema/utils/is-default-app';\n\nconst SUPPORTED_VERSIONS = ['2'];\n\nexport const validateConfigVersion = (version: string): void => {\n if (!SUPPORTED_VERSIONS.includes(version)) {\n throw new MicroFrontendError(\n `Unsupported version: ${version}. Supported versions are: ${SUPPORTED_VERSIONS.join(\n ', ',\n )}`,\n { type: 'config', subtype: 'unsupported_version' },\n );\n }\n};\n\n/**\n * Validate all paths in a configuration - ensures paths do not overlap\n */\nexport const validateConfigPaths = (\n applicationConfigsById?: ApplicationRouting,\n): void => {\n if (!applicationConfigsById) {\n return;\n }\n\n const pathsByApplicationId = new Map<\n PathGroup['paths'][number],\n {\n applications: ApplicationId[];\n matcher: RegExp;\n applicationId?: ApplicationId;\n }\n >();\n const errors: string[] = [];\n\n for (const [id, app] of Object.entries(applicationConfigsById)) {\n if (isDefaultApp(app)) {\n // default applications do not have routing\n continue;\n }\n\n for (const pathMatch of app.routing) {\n for (const path of pathMatch.paths) {\n const tokens = parsePathRegexp(path);\n for (const token of tokens.slice(0, -1)) {\n if (typeof token !== 'string') {\n errors.push(\n `Path ${path} may only have a :wildcard in the last path component`,\n );\n }\n }\n\n const existing = pathsByApplicationId.get(path);\n if (existing) {\n existing.applications.push(id);\n } else {\n pathsByApplicationId.set(path, {\n applications: [id],\n matcher: pathToRegexp(path),\n applicationId: id,\n });\n }\n }\n }\n }\n const entries = Array.from(pathsByApplicationId.entries());\n\n entries.forEach(([path, { applications: ids, matcher, applicationId }]) => {\n if (ids.length > 1) {\n errors.push(\n `Duplicate path \"${path}\" for applications \"${ids.join(', ')}\"`,\n );\n }\n\n entries.forEach(\n ([\n matchPath,\n { applications: matchIds, applicationId: matchApplicationId },\n ]) => {\n if (path === matchPath) {\n // we're comparing to ourselves, so skip\n return;\n }\n\n if (applicationId === matchApplicationId) {\n // we're comparing to paths within our own application, which are allowed to overlap, so skip\n return;\n }\n\n if (matcher.test(matchPath)) {\n const source = `\"${path}\" of application${ids.length > 0 ? 's' : ''} ${ids.join(', ')}`;\n const destination = `\"${matchPath}\" of application${matchIds.length > 0 ? 's' : ''} ${matchIds.join(', ')}`;\n\n errors.push(\n `Overlapping path detected between ${source} and ${destination}`,\n );\n }\n },\n );\n });\n\n if (errors.length) {\n throw new MicroFrontendError(`Invalid paths: ${errors.join(', ')}`, {\n type: 'config',\n subtype: 'conflicting_paths',\n });\n }\n};\n\n/**\n * Validate all paths in an application - ensures paths are the correct format\n */\nexport const validateAppPaths = (\n name: string,\n app: ChildApplicationConfig,\n): void => {\n // validate routes\n for (const group of app.routing) {\n for (const p of group.paths) {\n if (p === '/') {\n continue;\n }\n if (p.endsWith('/')) {\n throw new MicroFrontendError(\n `Invalid path for application \"${name}\". ${p} must not end with a slash.`,\n { type: 'application', subtype: 'invalid_path' },\n );\n }\n\n if (!p.startsWith('/')) {\n throw new MicroFrontendError(\n `Invalid path for application \"${name}\". ${p} must start with a slash.`,\n { type: 'application', subtype: 'invalid_path' },\n );\n }\n }\n }\n};\n\n/**\n * Make sure only one `Application` defines routing\n * */\nexport const validateConfigDefaultApplication = (\n applicationConfigsById?: ApplicationRouting,\n): void => {\n if (!applicationConfigsById) {\n return;\n }\n\n // find all applications that have routing\n const applicationsWithRouting = Object.entries(applicationConfigsById).filter(\n ([, app]) => !isDefaultApp(app),\n );\n // get all the application names\n const applicationsWithRoutingNames = applicationsWithRouting.map(\n ([key]) => key,\n );\n const numApplications = Object.keys(applicationConfigsById).length;\n const numApplicationsWithRouting = applicationsWithRoutingNames.length;\n const numApplicationsWithoutRouting =\n numApplications - numApplicationsWithRouting;\n\n if (numApplicationsWithoutRouting === 0) {\n throw new MicroFrontendError(\n `No default application found. At least one application needs to be the default by omitting routing.`,\n { type: 'config', subtype: 'no_default_application' },\n );\n }\n\n if (numApplicationsWithoutRouting > 1) {\n throw new MicroFrontendError(\n `Only one application can omit \"routing\". Found ${applicationsWithRoutingNames.length - Object.keys(applicationConfigsById).length > 1}.`,\n { type: 'config', subtype: 'multiple_default_applications' },\n );\n }\n};\n\nexport const validateConfigOptions = (options?: Options): void => {\n if (options?.vercel?.previewDeploymentSuffix) {\n if (\n !/^[a-zA-Z]{2,}\\.[a-zA-Z]{2,}$/.test(\n options.vercel.previewDeploymentSuffix,\n )\n ) {\n throw new MicroFrontendError(\n `Invalid preview deployment suffix: ${options.vercel.previewDeploymentSuffix}. Should have be formatted like \"vercel.app\".`,\n { type: 'config', subtype: 'invalid_preview_deployment_suffix' },\n );\n }\n }\n};\n","const PREFIX = 'vc-ap';\n\nexport function generateAssetPrefixFromName({\n name,\n}: {\n name: string;\n}): string {\n if (!name) {\n throw new Error('Name is required to generate an asset prefix');\n }\n\n return `${PREFIX}-${name}`;\n}\n","export function generatePortFromName({\n name,\n minPort = 3000,\n maxPort = 8000,\n}: {\n name: string;\n minPort?: number;\n maxPort?: number;\n}): number {\n if (!name) {\n throw new Error('Name is required to generate a port');\n }\n\n // hash the name\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n // eslint-disable-next-line no-bitwise\n hash = (hash << 5) - hash + name.charCodeAt(i);\n // Convert to 32-bit\n // eslint-disable-next-line no-bitwise\n hash |= 0;\n }\n hash = Math.abs(hash);\n\n // Map the hash to the port range\n const range = maxPort - minPort;\n const port = minPort + (hash % range);\n\n return port;\n}\n","import type {\n HostConfig as RemoteHostConfigSchema,\n LocalHostConfig as LocalHostConfigSchema,\n} from '../../schema/types';\nimport { generatePortFromName } from './utils/generate-port';\n\ninterface HostDisplayOptions {\n includeDefaultPort?: boolean;\n}\n\ninterface HostOptions {\n isLocal?: boolean;\n}\n\nexport class Host {\n protocol: 'http' | 'https';\n host: string;\n port: number;\n local: boolean | undefined;\n\n constructor(hostConfig: RemoteHostConfigSchema, options?: HostOptions) {\n const { protocol = 'https', host, port } = hostConfig;\n this.protocol = protocol;\n this.host = host;\n this.port = Host.getPort({ port, protocol: this.protocol });\n this.local = options?.isLocal;\n }\n\n isLocal(): boolean {\n return this.local || this.host === 'localhost' || this.host === '127.0.0.1';\n }\n\n static getPort({\n protocol,\n port,\n }: {\n protocol: RemoteHostConfigSchema['protocol'];\n port?: RemoteHostConfigSchema['port'];\n }): number {\n if (!port) {\n if (protocol === 'http') {\n return 80;\n }\n return 443;\n }\n\n return port;\n }\n\n isDefaultPort(): boolean {\n return this.port === Host.getPort({ protocol: this.protocol });\n }\n\n toString(opts: HostDisplayOptions = {}): string {\n const url = this.toUrl(opts);\n // strip the trailing slash\n return url.toString().replace(/\\/$/, '');\n }\n\n toUrl(opts: HostDisplayOptions = {}): URL {\n const { includeDefaultPort } = opts;\n const url = `${this.protocol}://${this.host}${this.isDefaultPort() && !includeDefaultPort ? '' : `:${this.port}`}`;\n\n return new URL(url);\n }\n}\n\n/**\n * A Host subclass with defaults for locally running applications\n */\nexport class LocalHost extends Host {\n constructor({\n appName,\n ...hostConfig\n }: LocalHostConfigSchema & { appName: string }) {\n // set defaults for local\n const host = hostConfig.host ?? 'localhost';\n const port = hostConfig.port ?? generatePortFromName({ name: appName });\n const protocol = hostConfig.protocol ?? 'http';\n\n super({ protocol, host, port });\n }\n}\n","import type {\n Application as ApplicationConfig,\n DefaultApplication as DefaultApplicationConfig,\n ChildApplication as ChildApplicationConfig,\n PathGroup,\n Vercel,\n} from '../../schema/types';\nimport type { ApplicationOverrideConfig } from '../../overrides';\nimport { validateAppPaths } from './validation';\nimport { generateAssetPrefixFromName } from './utils/generate-asset-prefix';\nimport { Host, LocalHost } from './host';\n\nexport class Application {\n readonly default: boolean;\n name: string;\n development: {\n local: LocalHost;\n fallback?: Host;\n };\n production?: Host;\n vercel?: Vercel;\n overrides?: {\n environment?: Host;\n };\n readonly serialized: ApplicationConfig;\n\n constructor(\n name: string,\n {\n app,\n overrides,\n isDefault,\n }: {\n app: ApplicationConfig;\n overrides?: ApplicationOverrideConfig;\n isDefault?: boolean;\n },\n ) {\n this.name = name;\n this.development = {\n local: new LocalHost({\n appName: name,\n ...app.development?.local,\n }),\n fallback: app.development?.fallback\n ? new Host(app.development.fallback)\n : undefined,\n };\n this.production = app.production ? new Host(app.production) : undefined;\n this.vercel = app.vercel;\n this.overrides = overrides?.environment\n ? {\n environment: new Host(overrides.environment),\n }\n : undefined;\n this.default = isDefault ?? false;\n this.serialized = app;\n }\n\n isDefault(): boolean {\n return this.default;\n }\n\n getAssetPrefix(): string {\n return generateAssetPrefixFromName({ name: this.name });\n }\n\n serialize(): ApplicationConfig {\n return this.serialized;\n }\n}\n\nexport class DefaultApplication extends Application {\n readonly default = true;\n production: Host;\n\n constructor(\n name: string,\n {\n app,\n overrides,\n }: {\n app: DefaultApplicationConfig;\n overrides?: ApplicationOverrideConfig;\n },\n ) {\n super(name, {\n app,\n overrides,\n isDefault: true,\n });\n\n this.production = new Host(app.production);\n }\n}\n\nexport class ChildApplication extends Application {\n readonly default = false;\n routing: PathGroup[];\n\n constructor(\n name: string,\n {\n app,\n overrides,\n }: {\n app: ChildApplicationConfig;\n overrides?: ApplicationOverrideConfig;\n },\n ) {\n // validate\n ChildApplication.validate(name, app);\n\n super(name, {\n app,\n overrides,\n isDefault: false,\n });\n\n this.routing = app.routing;\n }\n\n static validate(name: string, app: ChildApplicationConfig): void {\n // validate routes\n validateAppPaths(name, app);\n }\n}\n","export const DEFAULT_LOCAL_PROXY_PORT = 3024;\n"],"mappings":"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","names":["pathToRegexp","pathToRegexp","_a"]}
|
|
1
|
+
{"version":3,"sources":["../../src/config-v2/microfrontends-config/isomorphic/index.ts","../../src/config-v2/errors.ts","../../src/config-v2/microfrontends-config/utils/get-config-from-env.ts","../../src/config-v2/schema/utils/is-main-config.ts","../../src/config-v2/schema/utils/is-default-app.ts","../../src/config-v2/microfrontends-config/client/index.ts","../../src/config-v2/overrides/constants.ts","../../src/config-v2/overrides/is-override-cookie.ts","../../src/config-v2/overrides/get-override-from-cookie.ts","../../src/config-v2/overrides/parse-overrides.ts","../../src/config-v2/microfrontends-config/isomorphic/validation.ts","../../src/config-v2/microfrontends-config/isomorphic/utils/generate-asset-prefix.ts","../../src/config-v2/microfrontends-config/isomorphic/utils/generate-port.ts","../../src/config-v2/microfrontends-config/isomorphic/host.ts","../../src/config-v2/microfrontends-config/isomorphic/application.ts","../../src/config-v2/microfrontends-config/isomorphic/constants.ts"],"sourcesContent":["import { parse } from 'jsonc-parser';\nimport { getConfigStringFromEnv } from '../utils/get-config-from-env';\nimport { isMainConfig } from '../../schema/utils/is-main-config';\nimport { isDefaultApp } from '../../schema/utils/is-default-app';\nimport type { Config } from '../../schema/types';\nimport type { ClientConfig } from '../client/types';\nimport { MicrofrontendError } from '../../errors';\nimport { MicrofrontendConfigClient } from '../client';\nimport { type OverridesConfig, parseOverrides } from '../../overrides';\nimport { DefaultApplication, ChildApplication } from './application';\nimport { DEFAULT_LOCAL_PROXY_PORT } from './constants';\nimport {\n validateConfigDefaultApplication,\n validateConfigPaths,\n validateConfigVersion,\n validateConfigOptions,\n} from './validation';\n\nexport interface ConfigMeta {\n /**\n * The application name that the configuration is being loaded from.\n */\n fromApp: string;\n}\n\n/**\n * A class to manage the microfrontends configuration.\n */\nexport class MicrofrontendConfigIsomorphic {\n config: Config;\n isMainConfig: boolean;\n partOf?: string;\n defaultApplication?: DefaultApplication;\n childApplications: Record<string, ChildApplication> = {};\n overrides?: OverridesConfig;\n options?: Config['options'];\n\n private readonly serialized: {\n config: Config;\n overrides?: OverridesConfig;\n meta: ConfigMeta;\n };\n\n constructor({\n config,\n overrides,\n meta,\n }: { config: Config; overrides?: OverridesConfig; meta: ConfigMeta }) {\n // run validation on init\n MicrofrontendConfigIsomorphic.validate(config);\n\n const disableOverrides = config.options?.vercel?.disableOverrides ?? false;\n this.overrides = overrides && !disableOverrides ? overrides : undefined;\n this.isMainConfig = isMainConfig(config);\n\n if (isMainConfig(config)) {\n // create applications\n for (const [appId, appConfig] of Object.entries(config.applications)) {\n const appOverrides = !disableOverrides\n ? this.overrides?.applications[appId]\n : undefined;\n\n if (isDefaultApp(appConfig)) {\n this.defaultApplication = new DefaultApplication(appId, {\n app: appConfig,\n overrides: appOverrides,\n });\n } else {\n this.childApplications[appId] = new ChildApplication(appId, {\n app: appConfig,\n overrides: appOverrides,\n });\n }\n }\n } else {\n this.partOf = config.partOf;\n const appOverrides = !disableOverrides\n ? this.overrides?.applications[meta.fromApp]\n : undefined;\n this.childApplications[meta.fromApp] = new ChildApplication(\n meta.fromApp,\n {\n // we don't know routing because we're not in the main config\n app: { routing: [] },\n overrides: appOverrides,\n },\n );\n }\n\n // the main configuration file should ALWAYS have the default\n if (isMainConfig(config) && !this.defaultApplication) {\n throw new MicrofrontendError(\n `Could not find default application in microfrontends configuration`,\n {\n type: 'application',\n subtype: 'not_found',\n },\n );\n }\n\n this.config = config;\n this.options = config.options;\n this.serialized = {\n config,\n overrides,\n meta,\n };\n }\n\n static validate(config: string | Config): Config {\n // let this throw if it's not valid JSON\n const c = typeof config === 'string' ? (parse(config) as Config) : config;\n\n if (isMainConfig(c)) {\n // run validation\n validateConfigVersion(c.version);\n validateConfigPaths(c.applications);\n validateConfigDefaultApplication(c.applications);\n }\n validateConfigOptions(c.options);\n\n return c;\n }\n\n static fromEnv({\n meta,\n cookies,\n }: {\n meta: ConfigMeta;\n cookies?: { name: string; value: string }[];\n }): MicrofrontendConfigIsomorphic {\n return new MicrofrontendConfigIsomorphic({\n config: parse(getConfigStringFromEnv()) as Config,\n overrides: parseOverrides(cookies ?? []),\n meta,\n });\n }\n\n isOverridesDisabled(): boolean {\n return this.options?.vercel?.disableOverrides ?? false;\n }\n\n getConfig(): Config {\n return this.config;\n }\n\n getApplicationsByType(): {\n defaultApplication?: DefaultApplication;\n applications: ChildApplication[];\n } {\n return {\n defaultApplication: this.defaultApplication,\n applications: Object.values(this.childApplications),\n };\n }\n\n getChildApplications(): ChildApplication[] {\n return Object.values(this.childApplications);\n }\n\n getAllApplications(): (DefaultApplication | ChildApplication)[] {\n return [\n this.defaultApplication,\n ...Object.values(this.childApplications),\n ].filter(Boolean) as (DefaultApplication | ChildApplication)[];\n }\n\n getApplication(name: string): DefaultApplication | ChildApplication {\n // check the default\n if (this.defaultApplication?.name === name) {\n return this.defaultApplication;\n }\n const app = this.childApplications[name];\n if (!app) {\n throw new MicrofrontendError(\n `Could not find microfrontends configuration for application \"${name}\"`,\n {\n type: 'application',\n subtype: 'not_found',\n },\n );\n }\n\n return app;\n }\n\n getApplicationByProjectId(\n projectId: string,\n ): DefaultApplication | ChildApplication | undefined {\n // check the default\n if (this.defaultApplication?.vercel?.projectId === projectId) {\n return this.defaultApplication;\n }\n\n return Object.values(this.childApplications).find(\n (app) => app.vercel?.projectId === projectId,\n );\n }\n\n /**\n * Returns the default application. This can throw if the default application\n * is undefined ( )\n */\n getDefaultApplication(): DefaultApplication {\n if (!this.defaultApplication) {\n throw new MicrofrontendError(\n `Could not find default application in microfrontends configuration`,\n {\n type: 'application',\n subtype: 'not_found',\n },\n );\n }\n\n return this.defaultApplication;\n }\n\n /**\n * Returns the configured port for the local proxy\n */\n getLocalProxyPort(): number {\n return this.config.options?.localProxy?.port ?? DEFAULT_LOCAL_PROXY_PORT;\n }\n\n /**\n * Serializes the class back to the Schema type.\n *\n * NOTE: This is used when writing the config to disk and must always match the input Schema\n */\n toSchemaJson(): Config {\n return this.serialized.config;\n }\n\n toClientConfig(): MicrofrontendConfigClient {\n const applications: ClientConfig['applications'] = Object.fromEntries(\n Object.entries(this.childApplications).map(([name, application]) => [\n name,\n {\n default: false,\n routing: application.routing,\n },\n ]),\n );\n\n // add the default application\n if (this.defaultApplication) {\n applications[this.defaultApplication.name] = {\n default: true,\n };\n }\n\n return new MicrofrontendConfigClient({\n applications,\n });\n }\n\n serialize(): {\n config: Config;\n overrides?: OverridesConfig;\n meta: ConfigMeta;\n } {\n return this.serialized;\n }\n}\n","export type MicrofrontendErrorType =\n | 'config'\n | 'packageJson'\n | 'vercelJson'\n | 'application'\n | 'unknown';\n\nexport type MicrofrontendErrorSubtype =\n | 'not_found'\n | 'not_found_in_env'\n | 'invalid_asset_prefix'\n | 'invalid_main_path'\n | 'does_not_match_schema'\n | 'unable_to_read_file'\n | 'unsupported_validation_env'\n | 'unsupported_version'\n | 'invalid_path'\n | 'invalid_permissions'\n | 'invalid_syntax'\n | 'missing_microfrontend_config_path'\n | 'unsupported_operation';\n\n// A mapping of error types to their subtypes.\ninterface TypeToSubtype {\n application:\n | 'invalid_asset_prefix'\n | 'invalid_path'\n | 'multiple_package_managers'\n | 'not_found';\n config:\n | 'conflicting_paths'\n | 'does_not_match_schema'\n | 'invalid_main_path'\n | 'invalid_preview_deployment_suffix'\n | 'multiple_default_applications'\n | 'no_default_application'\n | 'not_found_in_env'\n | 'not_found'\n | 'unable_to_read_file'\n | 'invalid_syntax'\n | 'invalid_permissions'\n | 'unsupported_operation'\n | 'unsupported_validation_env'\n | 'unsupported_version';\n packageJson:\n | 'missing_field_name'\n | 'unable_to_read_file'\n | 'invalid_permissions'\n | 'invalid_syntax';\n vercelJson:\n | 'missing_field_microfrontend_config_path'\n | 'unable_to_read_file'\n | 'invalid_permissions'\n | 'invalid_syntax';\n unknown: never;\n}\n\nexport type MicrofrontendErrorSource =\n | '@vercel/microfrontends'\n | '@vercel/microfrontends/next'\n | 'fs'\n | 'ajv';\n\nexport interface MicrofrontendErrorOptions<T extends MicrofrontendErrorType> {\n source?: MicrofrontendErrorSource;\n type?: T;\n subtype?: TypeToSubtype[T];\n}\n\ninterface HandleOptions {\n fileName?: string;\n}\n\nexport class MicrofrontendError<\n T extends MicrofrontendErrorType = 'unknown',\n> extends Error {\n public source: MicrofrontendErrorSource;\n public type: T;\n public subtype?: TypeToSubtype[T];\n\n constructor(message: string, opts?: MicrofrontendErrorOptions<T>) {\n super(message);\n this.name = 'MicrofrontendsError';\n this.source = opts?.source ?? '@vercel/microfrontends';\n this.type = opts?.type ?? ('unknown' as T);\n this.subtype = opts?.subtype;\n Error.captureStackTrace(this, MicrofrontendError);\n }\n\n isKnown(): boolean {\n return this.type !== 'unknown';\n }\n\n isUnknown(): boolean {\n return !this.isKnown();\n }\n\n /**\n * Converts an error to a MicrofrontendsError.\n * @param original - The original error to convert.\n * @returns The converted MicrofrontendsError.\n */\n static convert(\n original: Error,\n opts?: HandleOptions,\n ): MicrofrontendError<MicrofrontendErrorType> {\n if (opts?.fileName) {\n const err = MicrofrontendError.convertFSError(original, opts.fileName);\n if (err) {\n return err;\n }\n }\n\n if (\n original.message.includes(\n 'Code generation from strings disallowed for this context',\n )\n ) {\n return new MicrofrontendError(original.message, {\n type: 'config',\n subtype: 'unsupported_validation_env',\n source: 'ajv',\n });\n }\n\n // unknown catch-all\n return new MicrofrontendError(original.message);\n }\n\n static convertFSError(\n original: Error,\n fileName: string,\n ): MicrofrontendError<MicrofrontendErrorType> | null {\n if (original instanceof Error && 'code' in original) {\n if (original.code === 'ENOENT') {\n return new MicrofrontendError(`Could not find \"${fileName}\"`, {\n type: 'config',\n subtype: 'unable_to_read_file',\n source: 'fs',\n });\n }\n if (original.code === 'EACCES') {\n return new MicrofrontendError(\n `Permission denied while accessing \"${fileName}\"`,\n {\n type: 'config',\n subtype: 'invalid_permissions',\n source: 'fs',\n },\n );\n }\n }\n\n if (original instanceof SyntaxError) {\n return new MicrofrontendError(\n `Failed to parse \"${fileName}\": Invalid JSON format.`,\n {\n type: 'config',\n subtype: 'invalid_syntax',\n source: 'fs',\n },\n );\n }\n\n return null;\n }\n\n /**\n * Handles an unknown error and returns a MicrofrontendsError instance.\n * @param err - The error to handle.\n * @returns A MicrofrontendsError instance.\n */\n static handle(\n err: unknown,\n opts?: HandleOptions,\n ): MicrofrontendError<MicrofrontendErrorType> {\n if (err instanceof MicrofrontendError) {\n return err as MicrofrontendError<MicrofrontendErrorType>;\n }\n\n // handle Error instances\n if (err instanceof Error) {\n return MicrofrontendError.convert(err, opts);\n }\n\n // handle object errors\n if (typeof err === 'object' && err !== null) {\n if ('message' in err && typeof err.message === 'string') {\n return MicrofrontendError.convert(new Error(err.message), opts);\n }\n }\n\n return new MicrofrontendError('An unknown error occurred');\n }\n}\n","import { MicrofrontendError } from '../../errors';\n\n/**\n * Utility to fetch the microfrontend configuration string from the environment.\n */\nexport function getConfigStringFromEnv(): string {\n const config = process.env.MFE_CONFIG;\n if (!config) {\n throw new MicrofrontendError(`Missing \"MFE_CONFIG\" in environment.`, {\n type: 'config',\n subtype: 'not_found_in_env',\n });\n }\n return config;\n}\n","import type { Config, MainConfig } from '../types';\n\nexport function isMainConfig(c: Config): c is MainConfig {\n return !('partOf' in c);\n}\n","import type { Application, DefaultApplication } from '../types';\n\nexport function isDefaultApp(a: Application): a is DefaultApplication {\n return !('routing' in a);\n}\n","import { pathToRegexp } from 'path-to-regexp';\nimport type { ClientConfig } from './types';\n\ninterface MicrofrontendConfigClientOptions {\n removeFlaggedPaths?: boolean;\n}\n\nexport class MicrofrontendConfigClient {\n applications: ClientConfig['applications'];\n pathCache: Record<string, string> = {};\n private readonly serialized: ClientConfig;\n\n constructor(config: ClientConfig, opts?: MicrofrontendConfigClientOptions) {\n this.serialized = config;\n if (opts?.removeFlaggedPaths) {\n for (const app of Object.values(config.applications)) {\n if (app.routing) {\n app.routing = app.routing.filter((match) => !match.flag);\n }\n }\n }\n this.applications = config.applications;\n }\n\n /**\n * Create a new `MicrofrontendConfigClient` from a JSON string.\n * Config must be passed in to remain framework agnostic\n */\n static fromEnv(\n config: string | undefined,\n opts?: MicrofrontendConfigClientOptions,\n ): MicrofrontendConfigClient {\n if (!config) {\n throw new Error('No microfrontends configuration found');\n }\n return new MicrofrontendConfigClient(\n JSON.parse(config) as ClientConfig,\n opts,\n );\n }\n\n isEqual(other: MicrofrontendConfigClient): boolean {\n return (\n JSON.stringify(this.applications) === JSON.stringify(other.applications)\n );\n }\n\n getApplicationNameForPath(path: string): string | null {\n if (!path.startsWith('/')) {\n throw new Error(`Path must start with a /`);\n }\n\n if (this.pathCache[path]) {\n return this.pathCache[path];\n }\n\n const pathname = new URL(path, 'https://example.com').pathname;\n for (const [name, application] of Object.entries(this.applications)) {\n if (application.routing) {\n for (const group of application.routing) {\n for (const childPath of group.paths) {\n const regexp = pathToRegexp(childPath);\n if (regexp.test(pathname)) {\n this.pathCache[path] = name;\n return name;\n }\n }\n }\n }\n }\n const defaultApplication = Object.entries(this.applications).find(\n ([, application]) => application.default,\n );\n if (!defaultApplication) {\n return null;\n }\n\n this.pathCache[path] = defaultApplication[0];\n return defaultApplication[0];\n }\n\n serialize(): ClientConfig {\n return this.serialized;\n }\n}\n","export const OVERRIDES_COOKIE_PREFIX = 'vercel-microfrontends-override';\nexport const OVERRIDES_ENV_COOKIE_PREFIX = `${OVERRIDES_COOKIE_PREFIX}:env:`;\n","import { OVERRIDES_COOKIE_PREFIX } from './constants';\n\nexport function isOverrideCookie(cookie: { name?: string }): boolean {\n return Boolean(cookie.name?.startsWith(OVERRIDES_COOKIE_PREFIX));\n}\n","import { isOverrideCookie } from './is-override-cookie';\nimport { OVERRIDES_ENV_COOKIE_PREFIX } from './constants';\n\nexport function getOverrideFromCookie(cookie: {\n name: string;\n value?: string | null;\n}): { application: string; host: string } | undefined {\n if (!isOverrideCookie(cookie) || !cookie.value) return;\n return {\n application: cookie.name.replace(OVERRIDES_ENV_COOKIE_PREFIX, ''),\n host: cookie.value,\n };\n}\n","import type { OverridesConfig } from './types';\nimport { getOverrideFromCookie } from './get-override-from-cookie';\n\nexport function parseOverrides(\n cookies: { name: string; value?: string | null }[],\n): OverridesConfig {\n const overridesConfig: OverridesConfig = { applications: {} };\n\n cookies.forEach((cookie) => {\n const override = getOverrideFromCookie(cookie);\n if (!override) return;\n overridesConfig.applications[override.application] = {\n environment: { host: override.host },\n };\n });\n\n return overridesConfig;\n}\n","import { pathToRegexp, parse as parsePathRegexp } from 'path-to-regexp';\nimport type {\n ApplicationId,\n PathGroup,\n ApplicationRouting,\n ChildApplication as ChildApplicationConfig,\n Options,\n} from '../../schema/types';\nimport { MicrofrontendError } from '../../errors';\nimport { isDefaultApp } from '../../schema/utils/is-default-app';\n\nconst SUPPORTED_VERSIONS = ['2'];\n\nexport const validateConfigVersion = (version: string): void => {\n if (!SUPPORTED_VERSIONS.includes(version)) {\n throw new MicrofrontendError(\n `Unsupported version: ${version}. Supported versions are: ${SUPPORTED_VERSIONS.join(\n ', ',\n )}`,\n { type: 'config', subtype: 'unsupported_version' },\n );\n }\n};\n\n/**\n * Validate all paths in a configuration - ensures paths do not overlap\n */\nexport const validateConfigPaths = (\n applicationConfigsById?: ApplicationRouting,\n): void => {\n if (!applicationConfigsById) {\n return;\n }\n\n const pathsByApplicationId = new Map<\n PathGroup['paths'][number],\n {\n applications: ApplicationId[];\n matcher: RegExp;\n applicationId?: ApplicationId;\n }\n >();\n const errors: string[] = [];\n\n for (const [id, app] of Object.entries(applicationConfigsById)) {\n if (isDefaultApp(app)) {\n // default applications do not have routing\n continue;\n }\n\n for (const pathMatch of app.routing) {\n for (const path of pathMatch.paths) {\n const tokens = parsePathRegexp(path);\n for (const token of tokens.slice(0, -1)) {\n if (typeof token !== 'string') {\n errors.push(\n `Path ${path} may only have a :wildcard in the last path component`,\n );\n }\n }\n\n const existing = pathsByApplicationId.get(path);\n if (existing) {\n existing.applications.push(id);\n } else {\n pathsByApplicationId.set(path, {\n applications: [id],\n matcher: pathToRegexp(path),\n applicationId: id,\n });\n }\n }\n }\n }\n const entries = Array.from(pathsByApplicationId.entries());\n\n entries.forEach(([path, { applications: ids, matcher, applicationId }]) => {\n if (ids.length > 1) {\n errors.push(\n `Duplicate path \"${path}\" for applications \"${ids.join(', ')}\"`,\n );\n }\n\n entries.forEach(\n ([\n matchPath,\n { applications: matchIds, applicationId: matchApplicationId },\n ]) => {\n if (path === matchPath) {\n // we're comparing to ourselves, so skip\n return;\n }\n\n if (applicationId === matchApplicationId) {\n // we're comparing to paths within our own application, which are allowed to overlap, so skip\n return;\n }\n\n if (matcher.test(matchPath)) {\n const source = `\"${path}\" of application${ids.length > 0 ? 's' : ''} ${ids.join(', ')}`;\n const destination = `\"${matchPath}\" of application${matchIds.length > 0 ? 's' : ''} ${matchIds.join(', ')}`;\n\n errors.push(\n `Overlapping path detected between ${source} and ${destination}`,\n );\n }\n },\n );\n });\n\n if (errors.length) {\n throw new MicrofrontendError(`Invalid paths: ${errors.join(', ')}`, {\n type: 'config',\n subtype: 'conflicting_paths',\n });\n }\n};\n\n/**\n * Validate all paths in an application - ensures paths are the correct format\n */\nexport const validateAppPaths = (\n name: string,\n app: ChildApplicationConfig,\n): void => {\n // validate routes\n for (const group of app.routing) {\n for (const p of group.paths) {\n if (p === '/') {\n continue;\n }\n if (p.endsWith('/')) {\n throw new MicrofrontendError(\n `Invalid path for application \"${name}\". ${p} must not end with a slash.`,\n { type: 'application', subtype: 'invalid_path' },\n );\n }\n\n if (!p.startsWith('/')) {\n throw new MicrofrontendError(\n `Invalid path for application \"${name}\". ${p} must start with a slash.`,\n { type: 'application', subtype: 'invalid_path' },\n );\n }\n }\n }\n};\n\n/**\n * Make sure only one `Application` defines routing\n * */\nexport const validateConfigDefaultApplication = (\n applicationConfigsById?: ApplicationRouting,\n): void => {\n if (!applicationConfigsById) {\n return;\n }\n\n // find all applications that have routing\n const applicationsWithRouting = Object.entries(applicationConfigsById).filter(\n ([, app]) => !isDefaultApp(app),\n );\n // get all the application names\n const applicationsWithRoutingNames = applicationsWithRouting.map(\n ([key]) => key,\n );\n const numApplications = Object.keys(applicationConfigsById).length;\n const numApplicationsWithRouting = applicationsWithRoutingNames.length;\n const numApplicationsWithoutRouting =\n numApplications - numApplicationsWithRouting;\n\n if (numApplicationsWithoutRouting === 0) {\n throw new MicrofrontendError(\n `No default application found. At least one application needs to be the default by omitting routing.`,\n { type: 'config', subtype: 'no_default_application' },\n );\n }\n\n if (numApplicationsWithoutRouting > 1) {\n throw new MicrofrontendError(\n `Only one application can omit \"routing\". Found ${applicationsWithRoutingNames.length - Object.keys(applicationConfigsById).length > 1}.`,\n { type: 'config', subtype: 'multiple_default_applications' },\n );\n }\n};\n\nexport const validateConfigOptions = (options?: Options): void => {\n if (options?.vercel?.previewDeploymentSuffix) {\n if (\n !/^[a-zA-Z]{2,}\\.[a-zA-Z]{2,}$/.test(\n options.vercel.previewDeploymentSuffix,\n )\n ) {\n throw new MicrofrontendError(\n `Invalid preview deployment suffix: ${options.vercel.previewDeploymentSuffix}. Should have be formatted like \"vercel.app\".`,\n { type: 'config', subtype: 'invalid_preview_deployment_suffix' },\n );\n }\n }\n};\n","const PREFIX = 'vc-ap';\n\nexport function generateAssetPrefixFromName({\n name,\n}: {\n name: string;\n}): string {\n if (!name) {\n throw new Error('Name is required to generate an asset prefix');\n }\n\n return `${PREFIX}-${name}`;\n}\n","export function generatePortFromName({\n name,\n minPort = 3000,\n maxPort = 8000,\n}: {\n name: string;\n minPort?: number;\n maxPort?: number;\n}): number {\n if (!name) {\n throw new Error('Name is required to generate a port');\n }\n\n // hash the name\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n // eslint-disable-next-line no-bitwise\n hash = (hash << 5) - hash + name.charCodeAt(i);\n // Convert to 32-bit\n // eslint-disable-next-line no-bitwise\n hash |= 0;\n }\n hash = Math.abs(hash);\n\n // Map the hash to the port range\n const range = maxPort - minPort;\n const port = minPort + (hash % range);\n\n return port;\n}\n","import type {\n HostConfig as RemoteHostConfigSchema,\n LocalHostConfig as LocalHostConfigSchema,\n} from '../../schema/types';\nimport { generatePortFromName } from './utils/generate-port';\n\ninterface HostDisplayOptions {\n includeDefaultPort?: boolean;\n}\n\ninterface HostOptions {\n isLocal?: boolean;\n}\n\nexport class Host {\n protocol: 'http' | 'https';\n host: string;\n port: number;\n local: boolean | undefined;\n\n constructor(hostConfig: RemoteHostConfigSchema, options?: HostOptions) {\n const { protocol = 'https', host, port } = hostConfig;\n this.protocol = protocol;\n this.host = host;\n this.port = Host.getPort({ port, protocol: this.protocol });\n this.local = options?.isLocal;\n }\n\n isLocal(): boolean {\n return this.local || this.host === 'localhost' || this.host === '127.0.0.1';\n }\n\n static getPort({\n protocol,\n port,\n }: {\n protocol: RemoteHostConfigSchema['protocol'];\n port?: RemoteHostConfigSchema['port'];\n }): number {\n if (!port) {\n if (protocol === 'http') {\n return 80;\n }\n return 443;\n }\n\n return port;\n }\n\n isDefaultPort(): boolean {\n return this.port === Host.getPort({ protocol: this.protocol });\n }\n\n toString(opts: HostDisplayOptions = {}): string {\n const url = this.toUrl(opts);\n // strip the trailing slash\n return url.toString().replace(/\\/$/, '');\n }\n\n toUrl(opts: HostDisplayOptions = {}): URL {\n const { includeDefaultPort } = opts;\n const url = `${this.protocol}://${this.host}${this.isDefaultPort() && !includeDefaultPort ? '' : `:${this.port}`}`;\n\n return new URL(url);\n }\n}\n\n/**\n * A Host subclass with defaults for locally running applications\n */\nexport class LocalHost extends Host {\n constructor({\n appName,\n ...hostConfig\n }: LocalHostConfigSchema & { appName: string }) {\n // set defaults for local\n const host = hostConfig.host ?? 'localhost';\n const port = hostConfig.port ?? generatePortFromName({ name: appName });\n const protocol = hostConfig.protocol ?? 'http';\n\n super({ protocol, host, port });\n }\n}\n","import type {\n Application as ApplicationConfig,\n DefaultApplication as DefaultApplicationConfig,\n ChildApplication as ChildApplicationConfig,\n PathGroup,\n Vercel,\n} from '../../schema/types';\nimport type { ApplicationOverrideConfig } from '../../overrides';\nimport { validateAppPaths } from './validation';\nimport { generateAssetPrefixFromName } from './utils/generate-asset-prefix';\nimport { Host, LocalHost } from './host';\n\nexport class Application {\n readonly default: boolean;\n name: string;\n development: {\n local: LocalHost;\n fallback?: Host;\n };\n production?: Host;\n vercel?: Vercel;\n overrides?: {\n environment?: Host;\n };\n readonly serialized: ApplicationConfig;\n\n constructor(\n name: string,\n {\n app,\n overrides,\n isDefault,\n }: {\n app: ApplicationConfig;\n overrides?: ApplicationOverrideConfig;\n isDefault?: boolean;\n },\n ) {\n this.name = name;\n this.development = {\n local: new LocalHost({\n appName: name,\n ...app.development?.local,\n }),\n fallback: app.development?.fallback\n ? new Host(app.development.fallback)\n : undefined,\n };\n this.production = app.production ? new Host(app.production) : undefined;\n this.vercel = app.vercel;\n this.overrides = overrides?.environment\n ? {\n environment: new Host(overrides.environment),\n }\n : undefined;\n this.default = isDefault ?? false;\n this.serialized = app;\n }\n\n isDefault(): boolean {\n return this.default;\n }\n\n getAssetPrefix(): string {\n return generateAssetPrefixFromName({ name: this.name });\n }\n\n serialize(): ApplicationConfig {\n return this.serialized;\n }\n}\n\nexport class DefaultApplication extends Application {\n readonly default = true;\n production: Host;\n\n constructor(\n name: string,\n {\n app,\n overrides,\n }: {\n app: DefaultApplicationConfig;\n overrides?: ApplicationOverrideConfig;\n },\n ) {\n super(name, {\n app,\n overrides,\n isDefault: true,\n });\n\n this.production = new Host(app.production);\n }\n}\n\nexport class ChildApplication extends Application {\n readonly default = false;\n routing: PathGroup[];\n\n constructor(\n name: string,\n {\n app,\n overrides,\n }: {\n app: ChildApplicationConfig;\n overrides?: ApplicationOverrideConfig;\n },\n ) {\n // validate\n ChildApplication.validate(name, app);\n\n super(name, {\n app,\n overrides,\n isDefault: false,\n });\n\n this.routing = app.routing;\n }\n\n static validate(name: string, app: ChildApplicationConfig): void {\n // validate routes\n validateAppPaths(name, app);\n }\n}\n","export const DEFAULT_LOCAL_PROXY_PORT = 3024;\n"],"mappings":"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","names":["pathToRegexp","pathToRegexp","_a"]}
|