@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/next-v2/config/index.ts","../../../src/config-v2/microfrontends/server/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/errors.ts","../../../src/config-v2/microfrontends-config/utils/get-config-from-env.ts","../../../src/config-v2/microfrontends-config/isomorphic/index.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/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","../../../src/config-v2/microfrontends-config/isomorphic/child.ts","../../../src/config-v2/microfrontends-config/isomorphic/main.ts","../../../src/config-v2/microfrontends/isomorphic/index.ts","../../../src/config-v2/microfrontends/server/utils/get-output-file-path.ts","../../../src/config-v2/microfrontends/server/constants.ts","../../../src/utils/is-vercel.ts","../../../src/config-v2/microfrontends/server/validation.ts","../../../src/config/errors.ts","../../../schema/schema-v2.json","../../../src/config-v2/schema/utils/load.ts","../../../src/next-v2/utils/check-proxy.ts","../../../src/next-v2/config/transforms/asset-prefix.ts","../../../src/next-v2/config/transforms/draft-mode.ts","../../../src/next-v2/config/transforms/headers.ts","../../../src/routing-v2/get-domain-from-environment.ts","../../../src/routing-v2/get-domain-for-current-environment.ts","../../../src/next-v2/config/transforms/rewrites.ts","../../../src/next-v2/config/transforms/server-actions.ts","../../../src/next-v2/config/transforms/webpack.ts","../../../src/next-v2/config/transforms/index.ts","../../../src/next-v2/config/env.ts"],"sourcesContent":["import fs from 'node:fs';\nimport type { NextConfig } from 'next';\nimport { MicrofrontendsServer } from '../../config-v2/microfrontends/server';\nimport { MicroFrontendError } from '../../config-v2/errors';\nimport { displayLocalProxyInfo } from '../utils/check-proxy';\nimport { isVercel } from '../../utils/is-vercel';\nimport { transforms } from './transforms';\nimport { setEnvironment } from './env';\nimport type { WithMicroFrontendsOptions } from './types';\n\nfunction typedEntries<T extends Record<string, unknown>>(\n obj: T,\n): [keyof T, T[keyof T]][] {\n return Object.entries(obj) as [keyof T, T[keyof T]][];\n}\n\nfunction isProduction(opts?: WithMicroFrontendsOptions): boolean {\n if (opts?.isProduction) {\n return opts.isProduction();\n }\n\n return process.env.VERCEL_ENV === 'production';\n}\n\n/**\n * Looks for a package.json file in the current directory, and\n * returns the application name and any additional context that we need\n *\n */\nfunction getApplicationContext(opts?: WithMicroFrontendsOptions): {\n name: string;\n} {\n if (opts?.appName) {\n return { name: opts.appName };\n }\n\n try {\n // load the package.json for the application\n const packageJsonString = fs.readFileSync('./package.json', 'utf-8');\n const packageJson = JSON.parse(packageJsonString) as { name?: string };\n\n if (!packageJson.name) {\n throw new MicroFrontendError(\n `package.json file missing required field \"name\"`,\n {\n type: 'packageJson',\n subtype: 'missing_field_name',\n source: '@vercel/micro-frontends/next',\n },\n );\n }\n\n return { name: packageJson.name };\n } catch (err) {\n throw MicroFrontendError.handle(err, {\n fileName: 'package.json',\n });\n }\n}\n\n/**\n * A function that wraps the next.config.js file to automatically configure zones\n * based on the micro-frontends configuration.\n */\nexport function withMicroFrontends(\n nextConfig: NextConfig,\n opts?: WithMicroFrontendsOptions,\n): NextConfig {\n if (opts?.debug) {\n process.env.MFE_DEBUG = 'true';\n }\n const { name: fromApp } = getApplicationContext(opts);\n const microfrontends = MicrofrontendsServer.fromFile({\n filePath: opts?.configPath ?? './microfrontends.json',\n meta: {\n fromApp,\n },\n });\n\n // fetch the config for the current app\n const app = microfrontends.config.getApplication(fromApp);\n\n // configure the environment\n setEnvironment({ app, microfrontends });\n\n let next = { ...nextConfig };\n\n for (const [key, transform] of typedEntries(transforms)) {\n if (opts?.skipTransforms?.includes(key)) {\n // eslint-disable-next-line no-console\n console.log(`Skipping ${key} transform`);\n continue;\n }\n\n try {\n const transformedConfig = transform({\n app,\n next,\n microFrontend: microfrontends.config,\n opts: {\n isProduction: isProduction(opts),\n },\n });\n next = transformedConfig.next;\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Error transforming next config', e);\n }\n }\n\n displayLocalProxyInfo(microfrontends.config.getLocalProxyPort());\n if (isVercel()) {\n microfrontends.writeConfig();\n }\n\n return next;\n}\n","import fs from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { ConfigMeta } from '../../microfrontends-config/isomorphic';\nimport type { Config } from '../../schema/types';\nimport { parseOverrides } from '../../overrides';\nimport { getConfigStringFromEnv } from '../../microfrontends-config/utils/get-config-from-env';\nimport { MicroFrontendError } from '../../errors';\nimport { Microfrontends } from '../isomorphic';\nimport { getOutputFilePath } from './utils/get-output-file-path';\nimport { validateSchema } from './validation';\n\nexport class MicrofrontendsServer extends Microfrontends {\n /**\n * Writes the configuration to a file.\n */\n writeConfig(\n opts: {\n pretty?: boolean;\n } = {\n pretty: true,\n },\n ): void {\n const outputPath = getOutputFilePath();\n\n // ensure the directory exists\n fs.mkdirSync(dirname(outputPath), { recursive: true });\n fs.writeFileSync(\n outputPath,\n JSON.stringify(\n this.config.toSchemaJson(),\n null,\n (opts.pretty ?? true) ? 2 : undefined,\n ),\n );\n }\n\n // --------- Static Methods ---------\n\n /**\n * Generates a MicrofrontendsServer instance from an unknown object.\n */\n static fromUnknown({\n config,\n cookies,\n meta,\n }: {\n config: unknown;\n cookies?: { name: string; value: string }[];\n meta: ConfigMeta;\n }): MicrofrontendsServer {\n const overrides = cookies ? parseOverrides(cookies) : undefined;\n if (typeof config === 'string') {\n return new MicrofrontendsServer({\n config: MicrofrontendsServer.validate(config),\n overrides,\n meta,\n });\n }\n if (typeof config === 'object') {\n return new MicrofrontendsServer({\n config: config as Config,\n overrides,\n meta,\n });\n }\n\n throw new MicroFrontendError(\n 'Invalid config: must be a string or an object',\n { type: 'config', subtype: 'does_not_match_schema' },\n );\n }\n\n /**\n * Generates a MicrofrontendsServer instance from the environment.\n * Uses additional validation that is only available when in a node runtime\n */\n static fromEnv({\n cookies,\n meta,\n }: {\n cookies: { name: string; value: string }[];\n meta: ConfigMeta;\n }): MicrofrontendsServer {\n return new MicrofrontendsServer({\n config: MicrofrontendsServer.validate(getConfigStringFromEnv()),\n overrides: parseOverrides(cookies),\n meta,\n });\n }\n\n /**\n * Validates the configuration against the JSON schema\n */\n static validate(config: string | Config): Config {\n if (typeof config === 'string') {\n const c = validateSchema(config);\n return c;\n }\n return config;\n }\n\n /*\n * Generates a MicrofrontendsServer instance from a file.\n */\n static fromFile({\n filePath,\n cookies,\n meta,\n }: {\n filePath: string;\n meta: ConfigMeta;\n cookies?: { name: string; value: string }[];\n }): MicrofrontendsServer {\n try {\n const config = fs.readFileSync(filePath, 'utf-8');\n return new MicrofrontendsServer({\n config: MicrofrontendsServer.validate(config),\n overrides: cookies ? parseOverrides(cookies) : undefined,\n meta,\n });\n } catch (e) {\n throw MicroFrontendError.handle(e, {\n fileName: filePath,\n });\n }\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","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 { 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","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","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","import type { ChildConfig } from '../../schema/types';\nimport type { OverridesConfig } from '../../overrides';\nimport { type ConfigMeta, MicroFrontendConfigIsomorphic } from '.';\n\nexport class MicroFrontendChildConfig extends MicroFrontendConfigIsomorphic {\n isMainConfig = false;\n partOf?: string;\n\n constructor({\n config,\n overrides,\n meta,\n }: {\n config: ChildConfig;\n overrides?: OverridesConfig;\n meta: ConfigMeta;\n }) {\n super({ config, overrides, meta });\n this.partOf = config.partOf;\n }\n}\n","import { isDefaultApp } from '../../schema/utils/is-default-app';\nimport type { MainConfig, Provider } from '../../schema/types';\nimport { MicroFrontendError } from '../../errors';\nimport type { OverridesConfig } from '../../overrides';\nimport { DefaultApplication, ChildApplication } from './application';\nimport { type ConfigMeta, MicroFrontendConfigIsomorphic } from '.';\n\nexport class MicroFrontendMainConfig extends MicroFrontendConfigIsomorphic {\n isMainConfig = true;\n provider: Provider;\n defaultApplication: DefaultApplication;\n\n constructor({\n config,\n overrides,\n meta,\n }: {\n config: MainConfig;\n overrides?: OverridesConfig;\n meta: ConfigMeta;\n }) {\n super({ config, overrides, meta });\n this.provider = config.provider;\n\n const disableOverrides = config.options?.vercel?.disableOverrides ?? false;\n\n let defaultApplication: DefaultApplication | undefined;\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 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\n // validate that this.defaultApplication is defined\n if (!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 this.defaultApplication = defaultApplication;\n }\n}\n","import {\n type ConfigMeta,\n MicroFrontendConfigIsomorphic,\n} from '../../microfrontends-config/isomorphic';\nimport { MicroFrontendChildConfig } from '../../microfrontends-config/isomorphic/child';\nimport { MicroFrontendMainConfig } from '../../microfrontends-config/isomorphic/main';\nimport type { MicrofrontendsConfig } from '../types';\nimport type { Config } from '../../schema/types';\nimport type { OverridesConfig } from '../../overrides';\nimport { isMainConfig } from '../../schema/utils/is-main-config';\n\nexport class Microfrontends {\n config: MicrofrontendsConfig;\n\n constructor({\n config,\n overrides,\n meta,\n }: { config: Config; overrides?: OverridesConfig; meta: ConfigMeta }) {\n if (isMainConfig(config)) {\n this.config = new MicroFrontendMainConfig({ config, overrides, meta });\n } else {\n this.config = new MicroFrontendChildConfig({ config, overrides, meta });\n }\n }\n\n isChildConfig(): boolean {\n return this.config instanceof MicroFrontendChildConfig;\n }\n\n static fromEnv({\n cookies,\n meta,\n }: {\n cookies?: { name: string; value: string }[];\n meta: ConfigMeta;\n }): Microfrontends {\n const config = MicroFrontendConfigIsomorphic.fromEnv({\n cookies,\n meta,\n });\n return new Microfrontends(config.serialize());\n }\n}\n","import path from 'node:path';\nimport {\n MFE_CONFIG_DEFAULT_FILE_PATH,\n MFE_CONFIG_DEFAULT_FILE_NAME,\n} from '../constants';\nimport { isVercel } from '../../../../utils/is-vercel';\n\nexport function getOutputFilePath(): string {\n if (isVercel()) {\n return path.join(\n '.vercel',\n MFE_CONFIG_DEFAULT_FILE_PATH,\n MFE_CONFIG_DEFAULT_FILE_NAME,\n );\n }\n return path.join(MFE_CONFIG_DEFAULT_FILE_PATH, MFE_CONFIG_DEFAULT_FILE_NAME);\n}\n","/**\n * Default path to use for the microfrontends configuration when output to a file.\n */\nexport const MFE_CONFIG_DEFAULT_FILE_PATH = 'microfrontends' as const;\n\n/**\n * Default name to use for the microfrontends configuration when output to a file.\n */\nexport const MFE_CONFIG_DEFAULT_FILE_NAME = 'microfrontends.json' as const;\n","export function isVercel(): boolean {\n return process.env.VERCEL === '1';\n}\n","import { parse } from 'jsonc-parser';\nimport { Ajv } from 'ajv';\nimport type { Config } from '../../schema/types';\nimport { MicroFrontendError } from '../../../config/errors';\nimport { SCHEMA } from '../../schema/utils/load';\n\nexport function validateSchema(configString: string): Config {\n const parsedConfig = parse(configString) as Config;\n const ajv = new Ajv();\n const validate = ajv.compile(SCHEMA);\n const isValid = validate(parsedConfig);\n if (!isValid) {\n throw new MicroFrontendError(\n `Invalid config: ${ajv.errorsText(validate.errors)}`,\n { type: 'config', subtype: 'does_not_match_schema' },\n );\n }\n return parsedConfig;\n}\n","export type MicroFrontendErrorType =\n | 'config'\n | 'packageJson'\n | 'vercelJson'\n | 'zone'\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 zone:\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","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$ref\": \"#/definitions/Config\",\n \"definitions\": {\n \"Config\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/definitions/MainConfig\"\n },\n {\n \"$ref\": \"#/definitions/ChildConfig\"\n }\n ]\n },\n \"MainConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\",\n \"const\": \"2\"\n },\n \"options\": {\n \"$ref\": \"#/definitions/Options\"\n },\n \"remotes\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"$ref\": \"#/definitions/Application\"\n },\n \"description\": \"Applications that only serve a subset of the microfrontend routes only need to reference the name of the primary application that owns the full microfrontends configuration.\"\n },\n \"provider\": {\n \"$ref\": \"#/definitions/Provider\"\n },\n \"applications\": {\n \"$ref\": \"#/definitions/ApplicationRouting\",\n \"description\": \"Mapping of application names to the routes that they host. Only needs to be defined in the application that owns the primary microfrontend domain\"\n }\n },\n \"required\": [\"applications\", \"provider\", \"version\"]\n },\n \"Options\": {\n \"type\": \"object\",\n \"properties\": {\n \"vercel\": {\n \"$ref\": \"#/definitions/VercelOptions\",\n \"description\": \"Micro-Frontends wide options for Vercel.\"\n },\n \"localProxy\": {\n \"$ref\": \"#/definitions/LocalProxyOptions\",\n \"description\": \"Options for local proxy.\"\n }\n }\n },\n \"VercelOptions\": {\n \"type\": \"object\",\n \"properties\": {\n \"previewDeploymentSuffix\": {\n \"type\": \"string\",\n \"description\": \"If your team uses a custom Preview Deployment Suffix, please specify it here. See https://vercel.com/docs/deployments/preview-deployment-suffix. The default is `vercel.app`.\"\n },\n \"teamSlug\": {\n \"type\": \"string\",\n \"description\": \"Team slug for the Vercel team\"\n },\n \"disableOverrides\": {\n \"type\": \"boolean\",\n \"description\": \"If you want to disable the overrides for the site. For example, if you are managing rewrites between applications externally, you may wish to disable the overrides on the toolbar as they will have no effect.\"\n }\n }\n },\n \"LocalProxyOptions\": {\n \"type\": \"object\",\n \"properties\": {\n \"port\": {\n \"type\": \"number\",\n \"description\": \"The port number used by the local proxy server.\\n\\nThe default is `3024`.\"\n }\n }\n },\n \"Application\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/definitions/DefaultApplication\"\n },\n {\n \"$ref\": \"#/definitions/ChildApplication\"\n }\n ]\n },\n \"DefaultApplication\": {\n \"type\": \"object\",\n \"properties\": {\n \"vercel\": {\n \"$ref\": \"#/definitions/Vercel\"\n },\n \"development\": {\n \"$ref\": \"#/definitions/Development\"\n },\n \"production\": {\n \"$ref\": \"#/definitions/HostConfig\"\n }\n },\n \"required\": [\"production\"]\n },\n \"Vercel\": {\n \"type\": \"object\",\n \"properties\": {\n \"projectId\": {\n \"type\": \"string\",\n \"description\": \"Vercel project ID\"\n },\n \"routeSpeedInsightsToDefaultZone\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\"projectId\"]\n },\n \"Development\": {\n \"type\": \"object\",\n \"properties\": {\n \"local\": {\n \"$ref\": \"#/definitions/LocalHostConfig\"\n },\n \"fallback\": {\n \"$ref\": \"#/definitions/HostConfig\",\n \"description\": \"Fallback for local development, could be a host config that points to any environment. If this is not provided, or the application is not running - requests to the application in local development will error.\"\n },\n \"task\": {\n \"type\": \"string\",\n \"description\": \"Optional task to run when starting the development server. Should reference a script in the package.json of the application.\"\n }\n }\n },\n \"LocalHostConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"host\": {\n \"type\": \"string\",\n \"description\": \"The hostname or IP address of the server. This can be a domain name (e.g., `example.com`) or an IP address (e.g., `192.168.1.1`).\"\n },\n \"protocol\": {\n \"type\": \"string\",\n \"enum\": [\"http\", \"https\"],\n \"description\": \"The protocol to be used for the connection.\\n- `http`: Hypertext Transfer Protocol (HTTP).\\n- `https`: Secure Hypertext Transfer Protocol (HTTPS).\\n\\n* @defaultValue \\\"http\\\" for local development, \\\"https\\\" for otherwise\"\n },\n \"port\": {\n \"type\": \"number\",\n \"description\": \"The port number to be used for the connection. Common values include `80` for HTTP and `443` for HTTPS.\"\n }\n }\n },\n \"HostConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"protocol\": {\n \"type\": \"string\",\n \"enum\": [\"http\", \"https\"],\n \"description\": \"The protocol to be used for the connection.\\n- `http`: Hypertext Transfer Protocol (HTTP).\\n- `https`: Secure Hypertext Transfer Protocol (HTTPS).\\n\\n* @defaultValue \\\"http\\\" for local development, \\\"https\\\" for otherwise\"\n },\n \"host\": {\n \"type\": \"string\",\n \"description\": \"The hostname or IP address of the server. This can be a domain name (e.g., `example.com`) or an IP address (e.g., `192.168.1.1`).\"\n },\n \"port\": {\n \"type\": \"number\",\n \"description\": \"The port number to be used for the connection. Common values include `80` for HTTP and `443` for HTTPS.\"\n }\n },\n \"required\": [\"host\"]\n },\n \"ChildApplication\": {\n \"type\": \"object\",\n \"properties\": {\n \"vercel\": {\n \"$ref\": \"#/definitions/Vercel\"\n },\n \"development\": {\n \"$ref\": \"#/definitions/Development\"\n },\n \"routing\": {\n \"$ref\": \"#/definitions/Routing\",\n \"description\": \"Groups of path expressions that are routed to this application.\"\n },\n \"production\": {\n \"$ref\": \"#/definitions/HostConfig\"\n }\n },\n \"required\": [\"routing\"]\n },\n \"Routing\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/PathGroup\"\n }\n },\n \"PathGroup\": {\n \"type\": \"object\",\n \"properties\": {\n \"group\": {\n \"type\": \"string\",\n \"description\": \"Optional group name for the paths\"\n },\n \"flag\": {\n \"type\": \"string\",\n \"description\": \"flag name that can be used to enable/disable all paths in the group\"\n },\n \"routeToDefaultApplication\": {\n \"type\": \"boolean\",\n \"description\": \"True to route the request to the default application for this micro-frontends set-up. This must be `true` when using `flag` or when you want to use custom logic to make the routing decision for this group of paths.\"\n },\n \"paths\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\"paths\"]\n },\n \"Provider\": {\n \"type\": \"string\",\n \"enum\": [\"vercel\", \"other\"]\n },\n \"ApplicationRouting\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"$ref\": \"#/definitions/Application\"\n }\n },\n \"ChildConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\",\n \"const\": \"2\"\n },\n \"options\": {\n \"$ref\": \"#/definitions/Options\"\n },\n \"remotes\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"$ref\": \"#/definitions/Application\"\n },\n \"description\": \"Applications that only serve a subset of the microfrontend routes only need to reference the name of the primary application that owns the full microfrontends configuration.\"\n },\n \"partOf\": {\n \"type\": \"string\",\n \"description\": \"Applications that only serve a subset of the microfrontend routes only need to reference the name of the primary application that owns the full microfrontends configuration.\"\n }\n },\n \"required\": [\"partOf\", \"version\"]\n }\n }\n}\n","import type { JSONSchema7 } from 'json-schema';\nimport jsonSchema from '../../../../schema/schema-v2.json';\n\nexport const SCHEMA = jsonSchema as JSONSchema7;\n","export function displayLocalProxyInfo(port: number): void {\n // TODO(olszewski): this is really icky, but since withMicroFrontends is called by two separate processes\n // we can't rely on some shared state so we instead use env to store state\n const { MFE_PROXY_MESSAGE_PRINTED, TURBO_TASK_HAS_MFE_PROXY } = process.env;\n if (\n TURBO_TASK_HAS_MFE_PROXY === 'true' &&\n MFE_PROXY_MESSAGE_PRINTED !== 'true'\n ) {\n process.env.MFE_PROXY_MESSAGE_PRINTED = 'true';\n // eslint-disable-next-line no-console\n console.log(`Microfrontends Proxy running on http://localhost:${port}`);\n }\n}\n","import type { TransformConfigInput, TransformConfigResponse } from './types';\n\nexport function transform(args: TransformConfigInput): TransformConfigResponse {\n const { next, app } = args;\n\n if (app.isDefault()) {\n return {\n next,\n };\n }\n\n // check if the val is already set\n if (\n next.assetPrefix !== undefined &&\n next.assetPrefix !== app.getAssetPrefix()\n ) {\n // TODO: Check if the route has been added, and if not - 2. add a better error here\n // eslint-disable-next-line no-console\n console.log(\n `\"assetPrefix\" already set. This route must be manually configured in your microfrontend.json file.`,\n );\n } else {\n // set new val\n next.assetPrefix = `/${app.getAssetPrefix()}`;\n }\n\n return {\n next,\n };\n}\n","import type { TransformConfigInput, TransformConfigResponse } from './types';\n\n/**\n * The `experimental.multiZoneDraftMode` field is used to prevent Next.js from\n * clearing the draft mode cookie that comes from a different zone.\n */\nexport function transform(args: TransformConfigInput): TransformConfigResponse {\n const { next } = args;\n\n if (next.experimental?.multiZoneDraftMode !== undefined) {\n return {\n next,\n };\n }\n\n next.experimental = next.experimental || {};\n next.experimental.multiZoneDraftMode = true;\n\n return {\n next,\n };\n}\n","import type { Header } from 'next/dist/lib/load-custom-routes';\nimport type { TransformConfigInput, TransformConfigResponse } from './types';\n\n/**\n * Adds to the `headers` function in `next.config.js` that adds a header to\n * every response from child zones that indicates the zone that served the\n * response. The default application does not set this header since it would\n * override the value from the child zone.\n */\nexport function transform(args: TransformConfigInput): TransformConfigResponse {\n const { next, app } = args;\n\n if (app.isDefault()) {\n return {\n next,\n };\n }\n\n const headersToAdd: Header[] = [\n {\n source: '/:path*',\n headers: [\n {\n key: 'X-Vercel-Zone',\n value: app.name,\n },\n {\n key: 'X-Vercel-MFE-App',\n value: app.name,\n },\n ],\n },\n {\n source: '/:path*',\n has: [\n {\n type: 'host',\n value: '(?<host>.*)',\n },\n ],\n headers: [\n {\n // TODO: we may want to revisit before launch whether we want to expose this\n // value on all responses publicly since users may not want to reveal this host\n // (maybe just in preview? or when the user is logged in to the toolbar?)\n key: 'X-Vercel-Host',\n value: ':host',\n },\n ],\n },\n ];\n if (next.headers && typeof next.headers === 'function') {\n const originalHeadersFn = next.headers;\n next.headers = async () => {\n const originalHeaders = await originalHeadersFn();\n return [...originalHeaders, ...headersToAdd];\n };\n } else {\n next.headers = () => {\n return Promise.resolve(headersToAdd);\n };\n }\n\n return {\n next,\n };\n}\n","/// <reference types=\"@edge-runtime/types\" />\n\nimport type { Application } from '../config-v2/microfrontends-config/isomorphic/application';\nimport type { VercelRelatedProject } from './types';\n\n/**\n * Gets the domain for a related project from the environment.\n *\n * This is used for preview, and production, and requires project linking in Vercel\n */\nexport function getDomainFromEnvironment({\n app,\n target,\n}: {\n app: Application;\n target: keyof VercelRelatedProject['aliases'];\n}): string {\n const projects = JSON.parse(\n process.env.VERCEL_RELATED_PROJECTS ?? '[]',\n ) as VercelRelatedProject[];\n\n if (projects.length === 0) {\n throw new Error('Missing related vercel project information');\n }\n\n // find the related project details for the application\n const vercelProject = projects.find(\n (project) =>\n project.projectId === app.vercel?.projectId ||\n project.appName === app.name,\n );\n\n if (!vercelProject) {\n throw new Error(\n `Missing related vercel project information for application \"${app.name}\"`,\n );\n }\n\n return vercelProject.aliases[target];\n}\n","/// <reference types=\"@edge-runtime/types\" />\n\nimport type { MicroFrontendMainConfig } from '../config-v2/microfrontends-config/isomorphic/main';\nimport { getDomainFromEnvironment } from './get-domain-from-environment';\n\nfunction debugDomains(zone: string, env: string, domain: string): void {\n if (process.env.MFE_DEBUG === 'true') {\n const indent = ' '.repeat(4);\n const header = 'domains (zone (env) -> domain)';\n const separator = '⎯'.repeat(header.length);\n const line = `${indent} 1. ${zone} (${env}) -> ${domain}`;\n\n // eslint-disable-next-line no-console\n console.log(`${indent}${header}\\n${indent}${separator}\\n${line}\\n`);\n }\n}\n\ninterface Environment {\n group: 'development' | 'preview' | 'production' | 'custom';\n name?: string;\n}\n\nfunction getCurrentEnvironment(): Environment {\n const isDevelopment =\n !process.env.VERCEL_ENV || process.env.VERCEL_ENV === 'development';\n const isPreview = process.env.VERCEL_ENV === 'preview';\n const isProduction = process.env.VERCEL_ENV === 'production';\n\n if (isDevelopment) {\n return { group: 'development' };\n } else if (isProduction) {\n return { group: 'production' };\n } else if (isPreview) {\n return { group: 'preview' };\n }\n\n return { group: 'custom', name: process.env.VERCEL_ENV };\n}\n/**\n * Returns the Vercel domain for the given application based on the current environment (local, preview, production).\n */\nexport function getDomainForCurrentEnvironment(\n config: MicroFrontendMainConfig,\n appName: string,\n): string {\n const app = config.getApplication(appName);\n if (app.overrides?.environment) {\n return app.overrides.environment.toString();\n }\n\n const { group } = getCurrentEnvironment();\n const productionHost = config.getDefaultApplication().production.toString();\n switch (group) {\n case 'development': {\n // TODO(mknichel): Convert this back to the local development domain once\n // there is local development proxy support.\n const domain =\n process.env.NODE_ENV === 'test'\n ? app.development.local.toString()\n : productionHost;\n debugDomains(appName, 'development', domain);\n return domain;\n }\n case 'preview': {\n return getDomainFromEnvironment({ app, target: 'branch' });\n }\n case 'production': {\n return getDomainFromEnvironment({ app, target: 'production' });\n }\n\n case 'custom':\n // eslint-disable-next-line no-console\n console.warn(\n `Custom environments are not supported in getDomainForCurrentEnvironment`,\n );\n return productionHost;\n }\n}\n","import type { Rewrite } from 'next/dist/lib/load-custom-routes';\nimport { getDomainForCurrentEnvironment } from '../../../routing-v2/get-domain-for-current-environment';\nimport { MicroFrontendMainConfig } from '../../../config-v2/microfrontends-config/isomorphic/main';\nimport type { TransformConfigInput, TransformConfigResponse } from './types';\n\nfunction debugRewrites(rewrites: Rewrite[]): void {\n if (process.env.MFE_DEBUG === 'true') {\n const indent = ' '.repeat(4);\n const header = 'rewrites (source → destination)';\n const separator = '⎯'.repeat(header.length);\n const maxSourceLength = Math.max(\n ...rewrites.map((key) => key.source.length),\n );\n const table = rewrites\n .map((route, idx) => {\n const paddedSource = route.source.padEnd(maxSourceLength);\n return `${indent} ${idx + 1}. ${paddedSource} → ${route.destination}`;\n })\n .join('\\n');\n\n // eslint-disable-next-line no-console\n console.log(`${indent}${header}\\n${indent}${separator}\\n${table}\\n`);\n }\n}\n\nfunction pathToRewrites(path: string): string[] {\n const regex = /(?<base>^.+)\\/:.+\\*$/;\n const match = regex.exec(path);\n\n const paths = [path];\n if (match?.groups?.base) {\n paths.unshift(match.groups.base);\n }\n\n return paths;\n}\n\ninterface DestinationConfig {\n pathname: string;\n domain?: string;\n}\n\ninterface RewriteConfig {\n destination: DestinationConfig;\n}\n\nfunction rewritesMapToArr(rewrites: Map<string, RewriteConfig>): Rewrite[] {\n return Array.from(rewrites.entries()).flatMap(([source, rewrite]) => {\n const destination = `${rewrite.destination.domain || ''}${rewrite.destination.pathname}`;\n if (source === destination) return [];\n return [\n {\n source,\n destination,\n },\n ];\n });\n}\n\nexport function transform(args: TransformConfigInput): TransformConfigResponse {\n const { next, microFrontend, app } = args;\n\n const buildBeforeFiles = (): Rewrite[] => {\n const rewrites = new Map<string, RewriteConfig>();\n\n // setup _next rewrite\n if (!app.isDefault()) {\n rewrites.set(`/${app.getAssetPrefix()}/_next/:path+`, {\n destination: {\n pathname: `/_next/:path+`,\n },\n });\n\n if (!app.vercel?.routeSpeedInsightsToDefaultZone) {\n rewrites.set(`/${app.getAssetPrefix()}/_vercel/:path*`, {\n destination: { pathname: '/_vercel/:path*' },\n });\n }\n // add rewrites\n } else if (microFrontend instanceof MicroFrontendMainConfig) {\n for (const [_, a] of Object.entries(\n microFrontend.getChildApplications(),\n )) {\n const { routing } = a;\n const domain = getDomainForCurrentEnvironment(microFrontend, a.name);\n // configure the asset rewrite\n rewrites.set(`/${a.getAssetPrefix()}/:path+`, {\n destination: {\n domain,\n pathname: `/${a.getAssetPrefix()}/:path+`,\n },\n });\n\n // Add the rewrites for the zone, each routing group requires either:\n // 1. routing through the default application (in the case of `group.options.routeToDefaultApplication`)\n // 2. evaluating a flag based on `group.options.flag`\n // 3. direct routing based on the paths\n for (const group of routing) {\n // route through the default application\n if (group.routeToDefaultApplication) {\n // already handled by middleware - skip\n continue;\n } else if (group.flag) {\n // Already handled by middleware - skip\n continue;\n } else {\n // configure the path rewrite\n for (const source of group.paths) {\n const paths = pathToRewrites(source);\n for (const p of paths) {\n rewrites.set(p, {\n destination: { domain, pathname: p },\n });\n }\n }\n }\n }\n }\n }\n\n return rewritesMapToArr(rewrites);\n };\n\n const newBeforeFiles = buildBeforeFiles();\n if (next.rewrites && typeof next.rewrites === 'function') {\n // we already have rewrites, we have to merge them\n const originalRewritesFn = next.rewrites;\n next.rewrites = async () => {\n const originalRewrites = await originalRewritesFn();\n if (\n typeof originalRewrites === 'object' &&\n !Array.isArray(originalRewrites)\n ) {\n const { beforeFiles = [] } = originalRewrites;\n return {\n beforeFiles: [...newBeforeFiles, ...beforeFiles],\n afterFiles: originalRewrites.afterFiles,\n fallback: originalRewrites.fallback,\n };\n }\n return {\n beforeFiles: newBeforeFiles,\n afterFiles: originalRewrites,\n fallback: [],\n };\n };\n } else {\n // rewrites aren't defined, we can write our own\n // eslint-disable-next-line @typescript-eslint/require-await\n next.rewrites = async () => ({\n beforeFiles: newBeforeFiles,\n afterFiles: [],\n fallback: [],\n });\n }\n\n debugRewrites(newBeforeFiles);\n\n return {\n next,\n };\n}\n","import { MicroFrontendChildConfig } from '../../../config-v2/microfrontends-config/isomorphic/child';\nimport { getDomainForCurrentEnvironment } from '../../../routing-v2/get-domain-for-current-environment';\nimport type { TransformConfigInput, TransformConfigResponse } from './types';\n\nconst formatDomainForServerAction = (domain: string): string =>\n domain.replace(/https?:\\/\\//, '');\n\nexport function transform(args: TransformConfigInput): TransformConfigResponse {\n const { next, app, microFrontend } = args;\n\n if (microFrontend instanceof MicroFrontendChildConfig) {\n // eslint-disable-next-line no-console\n console.warn(\n 'server actions transform requires the full config - skipping',\n );\n return {\n next,\n };\n }\n\n const defaultApplication = microFrontend.getDefaultApplication();\n const appsToAllow = [\n // this zone - this is included by default unless allowedOrigins is overridden (which we are)\n // so we re-add it here.\n app,\n // this is the default zone for the micro-frontend. Allow child zones to call server actions\n // that are in the default zone.\n defaultApplication,\n ];\n\n // server actions is handled under experimental right now\n const existingServerActionConfig = next.experimental?.serverActions;\n next.experimental = {\n ...next.experimental,\n serverActions: {\n ...existingServerActionConfig,\n allowedOrigins: Array.from(\n new Set([\n ...(existingServerActionConfig?.allowedOrigins ?? []),\n ...appsToAllow.flatMap((a) => [\n formatDomainForServerAction(\n defaultApplication.production.toString(),\n ),\n formatDomainForServerAction(\n getDomainForCurrentEnvironment(microFrontend, a.name),\n ),\n ]),\n ]),\n ),\n },\n };\n\n return {\n next,\n };\n}\n","import type { NextConfig } from 'next';\n// eslint-disable-next-line import/no-named-as-default\nimport type webpack from 'webpack';\nimport type { WebpackOptionsNormalized } from 'webpack';\nimport type { TransformConfigInput, TransformConfigResponse } from './types';\n\nexport function transform(args: TransformConfigInput): TransformConfigResponse {\n const { next, microFrontend } = args;\n\n const configWithWebpack: NextConfig = {\n ...next,\n webpack(cfg, context): unknown {\n // execute the client config first, otherwise their config may accidentally\n // overwrite our required config - leading to unexpected errors.\n const config = (\n typeof next.webpack === 'function' ? next.webpack(cfg, context) : cfg\n ) as WebpackOptionsNormalized;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { isServer, nextRuntime, webpack: wpFromNext } = context;\n\n if (isServer || nextRuntime === 'edge') {\n config.plugins.push(\n new (wpFromNext as typeof webpack).EnvironmentPlugin({\n MFE_CONFIG: JSON.stringify(microFrontend.serialize()),\n }),\n );\n }\n\n config.plugins.push(\n // Remove node: from import specifiers, because Next.js does not yet support node: scheme\n // https://github.com/vercel/next.js/issues/28774\n new (wpFromNext as typeof webpack).NormalModuleReplacementPlugin(\n /^node:/,\n (resource) => {\n resource.request = resource.request.replace(/^node:/, '');\n },\n ),\n );\n\n // Webpack 5 no longer polyfills Node.js core modules automatically which means\n // if you use them in your code running in browsers or alike, you will have to\n // install compatible modules from npm and include them yourself.\n // https://webpack.js.org/configuration/resolve/#resolvefallback\n if (!isServer) {\n config.resolve.fallback = {\n fs: false,\n path: false,\n crypto: false,\n ...config.resolve.fallback,\n };\n }\n\n return config;\n },\n };\n\n return {\n next: configWithWebpack,\n };\n}\n","import type { TransformConfigInput, TransformConfigResponse } from './types';\nimport { transform as assetPrefixTransform } from './asset-prefix';\nimport { transform as draftModeTransform } from './draft-mode';\nimport { transform as headersTransform } from './headers';\nimport { transform as rewritesTransform } from './rewrites';\nimport { transform as serverActionsTransform } from './server-actions';\nimport { transform as webpackTransform } from './webpack';\n\nexport type TransformKeys =\n | 'assetPrefix'\n | 'draftMode'\n | 'headers'\n | 'rewrites'\n | 'serverActions'\n | 'webpack';\n\nexport const transforms: Record<\n TransformKeys,\n (args: TransformConfigInput) => TransformConfigResponse\n> = {\n assetPrefix: assetPrefixTransform,\n draftMode: draftModeTransform,\n headers: headersTransform,\n rewrites: rewritesTransform,\n serverActions: serverActionsTransform,\n webpack: webpackTransform,\n} as const;\n","import type { MicrofrontendsServer } from '../../config-v2/microfrontends/server';\nimport type {\n ChildApplication,\n DefaultApplication,\n} from '../../config-v2/microfrontends-config/isomorphic/application';\n\nfunction debugEnv(env: Record<string, string>): void {\n if (process.env.MFE_DEBUG === 'true') {\n const indent = ' '.repeat(4);\n const header = 'env (key → val)';\n const separator = '⎯'.repeat(header.length);\n\n const maxKeyLength = Math.max(...Object.keys(env).map((key) => key.length));\n const table = Object.keys(env)\n .map((key, idx) => {\n const paddedKey = key.padEnd(maxKeyLength);\n return `${indent} ${idx + 1}. ${paddedKey} = ${env[key]}`;\n })\n .join('\\n');\n\n // eslint-disable-next-line no-console\n console.log(`${indent}${header}\\n${indent}${separator}\\n${table}\\n`);\n }\n} /**\n * Default application\n * - MFE_CURRENT_APPLICATION\n * - NEXT_PUBLIC_MFE_CURRENT_APPLICATION\n * - NEXT_PUBLIC_MFE_CLIENT_CONFIG\n * - MFE_CONFIG\n *\n * Child application(s):\n * - MFE_CURRENT_APPLICATION\n * - NEXT_PUBLIC_MFE_CURRENT_APPLICATION\n */\nexport function setEnvironment({\n app,\n microfrontends,\n}: {\n app: ChildApplication | DefaultApplication;\n microfrontends: MicrofrontendsServer;\n}): void {\n const clientEnvs = {\n NEXT_PUBLIC_MFE_CURRENT_APPLICATION: app.name,\n NEXT_PUBLIC_MFE_CLIENT_CONFIG: JSON.stringify(\n microfrontends.config.toClientConfig().serialize(),\n ),\n };\n\n const serverEnvs: Record<string, string> = {\n MFE_CURRENT_APPLICATION: app.name,\n MFE_CONFIG: JSON.stringify(microfrontends.config.getConfig()),\n };\n\n const allEnvs = { ...clientEnvs, ...serverEnvs };\n\n // set\n for (const [key, value] of Object.entries(allEnvs)) {\n process.env[key] = value;\n }\n\n // debug (optional)\n debugEnv(allEnvs);\n}\n"],"mappings":"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","names":["import_node_fs","import_node_path","path","import_path_to_regexp","path","parsePathRegexp","_a","path","import_jsonc_parser","MicroFrontendError","MicroFrontendError","fs","transform","transform","isProduction","path","transform","transform","transform","transform","fs","transform"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/next-v2/config/index.ts","../../../src/config-v2/microfrontends/server/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/errors.ts","../../../src/config-v2/microfrontends-config/utils/get-config-from-env.ts","../../../src/config-v2/microfrontends-config/isomorphic/index.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/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","../../../src/config-v2/microfrontends-config/isomorphic/child.ts","../../../src/config-v2/microfrontends-config/isomorphic/main.ts","../../../src/config-v2/microfrontends/isomorphic/index.ts","../../../src/config-v2/microfrontends/server/utils/get-output-file-path.ts","../../../src/config-v2/microfrontends/server/constants.ts","../../../src/utils/is-vercel.ts","../../../src/config-v2/microfrontends/server/validation.ts","../../../src/config/errors.ts","../../../schema/schema-v2.json","../../../src/config-v2/schema/utils/load.ts","../../../src/next-v2/utils/check-proxy.ts","../../../src/next-v2/config/transforms/asset-prefix.ts","../../../src/next-v2/config/transforms/draft-mode.ts","../../../src/next-v2/config/transforms/headers.ts","../../../src/routing-v2/get-domain-from-environment.ts","../../../src/routing-v2/get-domain-for-current-environment.ts","../../../src/next-v2/config/transforms/rewrites.ts","../../../src/next-v2/config/transforms/server-actions.ts","../../../src/next-v2/config/transforms/webpack.ts","../../../src/next-v2/config/transforms/index.ts","../../../src/next-v2/config/env.ts"],"sourcesContent":["import fs from 'node:fs';\nimport type { NextConfig } from 'next';\nimport { MicrofrontendsServer } from '../../config-v2/microfrontends/server';\nimport { MicrofrontendError } from '../../config-v2/errors';\nimport { displayLocalProxyInfo } from '../utils/check-proxy';\nimport { isVercel } from '../../utils/is-vercel';\nimport { transforms } from './transforms';\nimport { setEnvironment } from './env';\nimport type { WithMicrofrontendsOptions } from './types';\n\nfunction typedEntries<T extends Record<string, unknown>>(\n obj: T,\n): [keyof T, T[keyof T]][] {\n return Object.entries(obj) as [keyof T, T[keyof T]][];\n}\n\nfunction isProduction(opts?: WithMicrofrontendsOptions): boolean {\n if (opts?.isProduction) {\n return opts.isProduction();\n }\n\n return process.env.VERCEL_ENV === 'production';\n}\n\n/**\n * Looks for a package.json file in the current directory, and\n * returns the application name and any additional context that we need\n *\n */\nfunction getApplicationContext(opts?: WithMicrofrontendsOptions): {\n name: string;\n} {\n if (opts?.appName) {\n return { name: opts.appName };\n }\n\n try {\n // load the package.json for the application\n const packageJsonString = fs.readFileSync('./package.json', 'utf-8');\n const packageJson = JSON.parse(packageJsonString) as { name?: string };\n\n if (!packageJson.name) {\n throw new MicrofrontendError(\n `package.json file missing required field \"name\"`,\n {\n type: 'packageJson',\n subtype: 'missing_field_name',\n source: '@vercel/microfrontends/next',\n },\n );\n }\n\n return { name: packageJson.name };\n } catch (err) {\n throw MicrofrontendError.handle(err, {\n fileName: 'package.json',\n });\n }\n}\n\n/**\n * A function that wraps the next.config.js file to automatically configure zones\n * based on the microfrontends configuration.\n */\nexport function withMicrofrontends(\n nextConfig: NextConfig,\n opts?: WithMicrofrontendsOptions,\n): NextConfig {\n if (opts?.debug) {\n process.env.MFE_DEBUG = 'true';\n }\n const { name: fromApp } = getApplicationContext(opts);\n const microfrontends = MicrofrontendsServer.fromFile({\n filePath: opts?.configPath ?? './microfrontends.json',\n meta: {\n fromApp,\n },\n });\n\n // fetch the config for the current app\n const app = microfrontends.config.getApplication(fromApp);\n\n // configure the environment\n setEnvironment({ app, microfrontends });\n\n let next = { ...nextConfig };\n\n for (const [key, transform] of typedEntries(transforms)) {\n if (opts?.skipTransforms?.includes(key)) {\n // eslint-disable-next-line no-console\n console.log(`Skipping ${key} transform`);\n continue;\n }\n\n try {\n const transformedConfig = transform({\n app,\n next,\n microfrontend: microfrontends.config,\n opts: {\n isProduction: isProduction(opts),\n },\n });\n next = transformedConfig.next;\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error('Error transforming next config', e);\n }\n }\n\n displayLocalProxyInfo(microfrontends.config.getLocalProxyPort());\n if (isVercel()) {\n microfrontends.writeConfig();\n }\n\n return next;\n}\n","import fs from 'node:fs';\nimport { dirname } from 'node:path';\nimport type { ConfigMeta } from '../../microfrontends-config/isomorphic';\nimport type { Config } from '../../schema/types';\nimport { parseOverrides } from '../../overrides';\nimport type { OverridesConfig } from '../../overrides';\nimport { getConfigStringFromEnv } from '../../microfrontends-config/utils/get-config-from-env';\nimport { MicrofrontendError } from '../../errors';\nimport { Microfrontends } from '../isomorphic';\nimport { isMainConfig } from '../../schema/utils/is-main-config';\nimport { isDefaultApp } from '../../schema/utils/is-default-app';\nimport { getOutputFilePath } from './utils/get-output-file-path';\nimport { validateSchema } from './validation';\n\nexport class MicrofrontendsServer extends Microfrontends {\n /**\n * Writes the configuration to a file.\n */\n writeConfig(\n opts: {\n pretty?: boolean;\n } = {\n pretty: true,\n },\n ): void {\n const outputPath = getOutputFilePath();\n\n // ensure the directory exists\n fs.mkdirSync(dirname(outputPath), { recursive: true });\n fs.writeFileSync(\n outputPath,\n JSON.stringify(\n this.config.toSchemaJson(),\n null,\n (opts.pretty ?? true) ? 2 : undefined,\n ),\n );\n }\n\n // --------- Static Methods ---------\n\n /**\n * Generates a MicrofrontendsServer instance from an unknown object.\n */\n static fromUnknown({\n config,\n cookies,\n meta,\n }: {\n config: unknown;\n cookies?: { name: string; value: string }[];\n meta: ConfigMeta;\n }): MicrofrontendsServer {\n const overrides = cookies ? parseOverrides(cookies) : undefined;\n if (typeof config === 'string') {\n return new MicrofrontendsServer({\n config: MicrofrontendsServer.validate(config),\n overrides,\n meta,\n });\n }\n if (typeof config === 'object') {\n return new MicrofrontendsServer({\n config: config as Config,\n overrides,\n meta,\n });\n }\n\n throw new MicrofrontendError(\n 'Invalid config: must be a string or an object',\n { type: 'config', subtype: 'does_not_match_schema' },\n );\n }\n\n /**\n * Generates a MicrofrontendsServer instance from the environment.\n * Uses additional validation that is only available when in a node runtime\n */\n static fromEnv({\n cookies,\n meta,\n }: {\n cookies: { name: string; value: string }[];\n meta: ConfigMeta;\n }): MicrofrontendsServer {\n return new MicrofrontendsServer({\n config: MicrofrontendsServer.validate(getConfigStringFromEnv()),\n overrides: parseOverrides(cookies),\n meta,\n });\n }\n\n /**\n * Validates the configuration against the JSON schema\n */\n static validate(config: string | Config): Config {\n if (typeof config === 'string') {\n const c = validateSchema(config);\n return c;\n }\n return config;\n }\n\n /*\n * Generates a MicrofrontendsServer instance from a file.\n */\n static fromFile({\n filePath,\n cookies,\n meta,\n }: {\n filePath: string;\n meta: ConfigMeta;\n cookies?: { name: string; value: string }[];\n }): MicrofrontendsServer {\n try {\n const config = fs.readFileSync(filePath, 'utf-8');\n return new MicrofrontendsServer({\n config: MicrofrontendsServer.validate(config),\n overrides: cookies ? parseOverrides(cookies) : undefined,\n meta,\n });\n } catch (e) {\n throw MicrofrontendError.handle(e, {\n fileName: filePath,\n });\n }\n }\n\n /*\n * Generates a MicrofrontendMainConfig instance from a file.\n */\n static fromMainConfigFile({\n filePath,\n overrides,\n }: {\n filePath: string;\n overrides?: OverridesConfig;\n }): MicrofrontendsServer {\n try {\n const config = fs.readFileSync(filePath, 'utf-8');\n const validatedConfig = MicrofrontendsServer.validate(config);\n if (!isMainConfig(validatedConfig)) {\n throw new MicrofrontendError(\n `${filePath} is not a main microfrontend config`,\n {\n type: 'config',\n subtype: 'invalid_main_path',\n },\n );\n }\n const [defaultApplication] = Object.entries(validatedConfig.applications)\n .filter(([, app]) => isDefaultApp(app))\n .map(([name]) => name);\n // This should never get hit as MicrofrontendsServer.validate checks this if we're given a main config\n if (!defaultApplication) {\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 return new MicrofrontendsServer({\n config: validatedConfig,\n overrides,\n meta: { fromApp: defaultApplication },\n });\n } catch (e) {\n throw MicrofrontendError.handle(e, {\n fileName: filePath,\n });\n }\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","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 { 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","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","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","import type { ChildConfig } from '../../schema/types';\nimport type { OverridesConfig } from '../../overrides';\nimport { type ConfigMeta, MicrofrontendConfigIsomorphic } from '.';\n\nexport class MicrofrontendChildConfig extends MicrofrontendConfigIsomorphic {\n isMainConfig = false;\n partOf?: string;\n\n constructor({\n config,\n overrides,\n meta,\n }: {\n config: ChildConfig;\n overrides?: OverridesConfig;\n meta: ConfigMeta;\n }) {\n super({ config, overrides, meta });\n this.partOf = config.partOf;\n }\n}\n","import { isDefaultApp } from '../../schema/utils/is-default-app';\nimport type { MainConfig, Provider } from '../../schema/types';\nimport { MicrofrontendError } from '../../errors';\nimport type { OverridesConfig } from '../../overrides';\nimport { DefaultApplication, ChildApplication } from './application';\nimport { type ConfigMeta, MicrofrontendConfigIsomorphic } from '.';\n\nexport class MicrofrontendMainConfig extends MicrofrontendConfigIsomorphic {\n isMainConfig = true;\n provider: Provider;\n defaultApplication: DefaultApplication;\n\n constructor({\n config,\n overrides,\n meta,\n }: {\n config: MainConfig;\n overrides?: OverridesConfig;\n meta: ConfigMeta;\n }) {\n super({ config, overrides, meta });\n this.provider = config.provider;\n\n const disableOverrides = config.options?.vercel?.disableOverrides ?? false;\n\n let defaultApplication: DefaultApplication | undefined;\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 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\n // validate that this.defaultApplication is defined\n if (!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 this.defaultApplication = defaultApplication;\n }\n}\n","import {\n type ConfigMeta,\n MicrofrontendConfigIsomorphic,\n} from '../../microfrontends-config/isomorphic';\nimport { MicrofrontendChildConfig } from '../../microfrontends-config/isomorphic/child';\nimport { MicrofrontendMainConfig } from '../../microfrontends-config/isomorphic/main';\nimport type { MicrofrontendsConfig } from '../types';\nimport type { Config } from '../../schema/types';\nimport type { OverridesConfig } from '../../overrides';\nimport { isMainConfig } from '../../schema/utils/is-main-config';\n\nexport class Microfrontends {\n config: MicrofrontendsConfig;\n\n constructor({\n config,\n overrides,\n meta,\n }: { config: Config; overrides?: OverridesConfig; meta: ConfigMeta }) {\n if (isMainConfig(config)) {\n this.config = new MicrofrontendMainConfig({ config, overrides, meta });\n } else {\n this.config = new MicrofrontendChildConfig({ config, overrides, meta });\n }\n }\n\n isChildConfig(): boolean {\n return this.config instanceof MicrofrontendChildConfig;\n }\n\n static fromEnv({\n cookies,\n meta,\n }: {\n cookies?: { name: string; value: string }[];\n meta: ConfigMeta;\n }): Microfrontends {\n const config = MicrofrontendConfigIsomorphic.fromEnv({\n cookies,\n meta,\n });\n return new Microfrontends(config.serialize());\n }\n}\n","import path from 'node:path';\nimport {\n MFE_CONFIG_DEFAULT_FILE_PATH,\n MFE_CONFIG_DEFAULT_FILE_NAME,\n} from '../constants';\nimport { isVercel } from '../../../../utils/is-vercel';\n\nexport function getOutputFilePath(): string {\n if (isVercel()) {\n return path.join(\n '.vercel',\n MFE_CONFIG_DEFAULT_FILE_PATH,\n MFE_CONFIG_DEFAULT_FILE_NAME,\n );\n }\n return path.join(MFE_CONFIG_DEFAULT_FILE_PATH, MFE_CONFIG_DEFAULT_FILE_NAME);\n}\n","/**\n * Default path to use for the microfrontends configuration when output to a file.\n */\nexport const MFE_CONFIG_DEFAULT_FILE_PATH = 'microfrontends' as const;\n\n/**\n * Default name to use for the microfrontends configuration when output to a file.\n */\nexport const MFE_CONFIG_DEFAULT_FILE_NAME = 'microfrontends.json' as const;\n","export function isVercel(): boolean {\n return process.env.VERCEL === '1';\n}\n","import { parse } from 'jsonc-parser';\nimport { Ajv } from 'ajv';\nimport type { Config } from '../../schema/types';\nimport { MicrofrontendError } from '../../../config/errors';\nimport { SCHEMA } from '../../schema/utils/load';\n\nexport function validateSchema(configString: string): Config {\n const parsedConfig = parse(configString) as Config;\n const ajv = new Ajv();\n const validate = ajv.compile(SCHEMA);\n const isValid = validate(parsedConfig);\n if (!isValid) {\n throw new MicrofrontendError(\n `Invalid config: ${ajv.errorsText(validate.errors)}`,\n { type: 'config', subtype: 'does_not_match_schema' },\n );\n }\n return parsedConfig;\n}\n","export type MicrofrontendErrorType =\n | 'config'\n | 'packageJson'\n | 'vercelJson'\n | 'zone'\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 zone:\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","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$ref\": \"#/definitions/Config\",\n \"definitions\": {\n \"Config\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/definitions/MainConfig\"\n },\n {\n \"$ref\": \"#/definitions/ChildConfig\"\n }\n ]\n },\n \"MainConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\",\n \"const\": \"2\"\n },\n \"options\": {\n \"$ref\": \"#/definitions/Options\"\n },\n \"remotes\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"$ref\": \"#/definitions/Application\"\n },\n \"description\": \"Applications that only serve a subset of the microfrontend routes only need to reference the name of the primary application that owns the full microfrontends configuration.\"\n },\n \"provider\": {\n \"$ref\": \"#/definitions/Provider\"\n },\n \"applications\": {\n \"$ref\": \"#/definitions/ApplicationRouting\",\n \"description\": \"Mapping of application names to the routes that they host. Only needs to be defined in the application that owns the primary microfrontend domain\"\n }\n },\n \"required\": [\"applications\", \"provider\", \"version\"]\n },\n \"Options\": {\n \"type\": \"object\",\n \"properties\": {\n \"vercel\": {\n \"$ref\": \"#/definitions/VercelOptions\",\n \"description\": \"Micro-Frontends wide options for Vercel.\"\n },\n \"localProxy\": {\n \"$ref\": \"#/definitions/LocalProxyOptions\",\n \"description\": \"Options for local proxy.\"\n }\n }\n },\n \"VercelOptions\": {\n \"type\": \"object\",\n \"properties\": {\n \"previewDeploymentSuffix\": {\n \"type\": \"string\",\n \"description\": \"If your team uses a custom Preview Deployment Suffix, please specify it here. See https://vercel.com/docs/deployments/preview-deployment-suffix. The default is `vercel.app`.\"\n },\n \"teamSlug\": {\n \"type\": \"string\",\n \"description\": \"Team slug for the Vercel team\"\n },\n \"disableOverrides\": {\n \"type\": \"boolean\",\n \"description\": \"If you want to disable the overrides for the site. For example, if you are managing rewrites between applications externally, you may wish to disable the overrides on the toolbar as they will have no effect.\"\n }\n }\n },\n \"LocalProxyOptions\": {\n \"type\": \"object\",\n \"properties\": {\n \"port\": {\n \"type\": \"number\",\n \"description\": \"The port number used by the local proxy server.\\n\\nThe default is `3024`.\"\n }\n }\n },\n \"Application\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/definitions/DefaultApplication\"\n },\n {\n \"$ref\": \"#/definitions/ChildApplication\"\n }\n ]\n },\n \"DefaultApplication\": {\n \"type\": \"object\",\n \"properties\": {\n \"vercel\": {\n \"$ref\": \"#/definitions/Vercel\"\n },\n \"development\": {\n \"$ref\": \"#/definitions/Development\"\n },\n \"production\": {\n \"$ref\": \"#/definitions/HostConfig\"\n }\n },\n \"required\": [\"production\"]\n },\n \"Vercel\": {\n \"type\": \"object\",\n \"properties\": {\n \"projectId\": {\n \"type\": \"string\",\n \"description\": \"Vercel project ID\"\n },\n \"routeSpeedInsightsToDefaultZone\": {\n \"type\": \"boolean\"\n }\n },\n \"required\": [\"projectId\"]\n },\n \"Development\": {\n \"type\": \"object\",\n \"properties\": {\n \"local\": {\n \"$ref\": \"#/definitions/LocalHostConfig\"\n },\n \"fallback\": {\n \"$ref\": \"#/definitions/HostConfig\",\n \"description\": \"Fallback for local development, could be a host config that points to any environment. If this is not provided, or the application is not running - requests to the application in local development will error.\"\n },\n \"task\": {\n \"type\": \"string\",\n \"description\": \"Optional task to run when starting the development server. Should reference a script in the package.json of the application.\"\n }\n }\n },\n \"LocalHostConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"host\": {\n \"type\": \"string\",\n \"description\": \"The hostname or IP address of the server. This can be a domain name (e.g., `example.com`) or an IP address (e.g., `192.168.1.1`).\"\n },\n \"protocol\": {\n \"type\": \"string\",\n \"enum\": [\"http\", \"https\"],\n \"description\": \"The protocol to be used for the connection.\\n- `http`: Hypertext Transfer Protocol (HTTP).\\n- `https`: Secure Hypertext Transfer Protocol (HTTPS).\\n\\n* @defaultValue \\\"http\\\" for local development, \\\"https\\\" for otherwise\"\n },\n \"port\": {\n \"type\": \"number\",\n \"description\": \"The port number to be used for the connection. Common values include `80` for HTTP and `443` for HTTPS.\"\n }\n }\n },\n \"HostConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"protocol\": {\n \"type\": \"string\",\n \"enum\": [\"http\", \"https\"],\n \"description\": \"The protocol to be used for the connection.\\n- `http`: Hypertext Transfer Protocol (HTTP).\\n- `https`: Secure Hypertext Transfer Protocol (HTTPS).\\n\\n* @defaultValue \\\"http\\\" for local development, \\\"https\\\" for otherwise\"\n },\n \"host\": {\n \"type\": \"string\",\n \"description\": \"The hostname or IP address of the server. This can be a domain name (e.g., `example.com`) or an IP address (e.g., `192.168.1.1`).\"\n },\n \"port\": {\n \"type\": \"number\",\n \"description\": \"The port number to be used for the connection. Common values include `80` for HTTP and `443` for HTTPS.\"\n }\n },\n \"required\": [\"host\"]\n },\n \"ChildApplication\": {\n \"type\": \"object\",\n \"properties\": {\n \"vercel\": {\n \"$ref\": \"#/definitions/Vercel\"\n },\n \"development\": {\n \"$ref\": \"#/definitions/Development\"\n },\n \"routing\": {\n \"$ref\": \"#/definitions/Routing\",\n \"description\": \"Groups of path expressions that are routed to this application.\"\n },\n \"production\": {\n \"$ref\": \"#/definitions/HostConfig\"\n }\n },\n \"required\": [\"routing\"]\n },\n \"Routing\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/PathGroup\"\n }\n },\n \"PathGroup\": {\n \"type\": \"object\",\n \"properties\": {\n \"group\": {\n \"type\": \"string\",\n \"description\": \"Optional group name for the paths\"\n },\n \"flag\": {\n \"type\": \"string\",\n \"description\": \"flag name that can be used to enable/disable all paths in the group\"\n },\n \"routeToDefaultApplication\": {\n \"type\": \"boolean\",\n \"description\": \"True to route the request to the default application for this micro-frontends set-up. This must be `true` when using `flag` or when you want to use custom logic to make the routing decision for this group of paths.\"\n },\n \"paths\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n },\n \"required\": [\"paths\"]\n },\n \"Provider\": {\n \"type\": \"string\",\n \"enum\": [\"vercel\", \"other\"]\n },\n \"ApplicationRouting\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"$ref\": \"#/definitions/Application\"\n }\n },\n \"ChildConfig\": {\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\"\n },\n \"version\": {\n \"type\": \"string\",\n \"const\": \"2\"\n },\n \"options\": {\n \"$ref\": \"#/definitions/Options\"\n },\n \"remotes\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"$ref\": \"#/definitions/Application\"\n },\n \"description\": \"Applications that only serve a subset of the microfrontend routes only need to reference the name of the primary application that owns the full microfrontends configuration.\"\n },\n \"partOf\": {\n \"type\": \"string\",\n \"description\": \"Applications that only serve a subset of the microfrontend routes only need to reference the name of the primary application that owns the full microfrontends configuration.\"\n }\n },\n \"required\": [\"partOf\", \"version\"]\n }\n }\n}\n","import type { JSONSchema7 } from 'json-schema';\nimport jsonSchema from '../../../../schema/schema-v2.json';\n\nexport const SCHEMA = jsonSchema as JSONSchema7;\n","export function displayLocalProxyInfo(port: number): void {\n // TODO(olszewski): this is really icky, but since withMicroFrontends is called by two separate processes\n // we can't rely on some shared state so we instead use env to store state\n const { MFE_PROXY_MESSAGE_PRINTED, TURBO_TASK_HAS_MFE_PROXY } = process.env;\n if (\n TURBO_TASK_HAS_MFE_PROXY === 'true' &&\n MFE_PROXY_MESSAGE_PRINTED !== 'true'\n ) {\n process.env.MFE_PROXY_MESSAGE_PRINTED = 'true';\n // eslint-disable-next-line no-console\n console.log(`Microfrontends Proxy running on http://localhost:${port}`);\n }\n}\n","import type { TransformConfigInput, TransformConfigResponse } from './types';\n\nexport function transform(args: TransformConfigInput): TransformConfigResponse {\n const { next, app } = args;\n\n if (app.isDefault()) {\n return {\n next,\n };\n }\n\n // check if the val is already set\n if (\n next.assetPrefix !== undefined &&\n next.assetPrefix !== app.getAssetPrefix()\n ) {\n // TODO: Check if the route has been added, and if not - 2. add a better error here\n // eslint-disable-next-line no-console\n console.log(\n `\"assetPrefix\" already set. This route must be manually configured in your microfrontend.json file.`,\n );\n } else {\n // set new val\n next.assetPrefix = `/${app.getAssetPrefix()}`;\n }\n\n return {\n next,\n };\n}\n","import type { TransformConfigInput, TransformConfigResponse } from './types';\n\n/**\n * The `experimental.multiZoneDraftMode` field is used to prevent Next.js from\n * clearing the draft mode cookie that comes from a different zone.\n */\nexport function transform(args: TransformConfigInput): TransformConfigResponse {\n const { next } = args;\n\n if (next.experimental?.multiZoneDraftMode !== undefined) {\n return {\n next,\n };\n }\n\n next.experimental = next.experimental || {};\n next.experimental.multiZoneDraftMode = true;\n\n return {\n next,\n };\n}\n","import type { Header } from 'next/dist/lib/load-custom-routes';\nimport type { TransformConfigInput, TransformConfigResponse } from './types';\n\n/**\n * Adds to the `headers` function in `next.config.js` that adds a header to\n * every response from child zones that indicates the zone that served the\n * response. The default application does not set this header since it would\n * override the value from the child zone.\n */\nexport function transform(args: TransformConfigInput): TransformConfigResponse {\n const { next, app } = args;\n\n if (app.isDefault()) {\n return {\n next,\n };\n }\n\n const headersToAdd: Header[] = [\n {\n source: '/:path*',\n headers: [\n {\n key: 'X-Vercel-Zone',\n value: app.name,\n },\n {\n key: 'X-Vercel-MFE-App',\n value: app.name,\n },\n ],\n },\n {\n source: '/:path*',\n has: [\n {\n type: 'host',\n value: '(?<host>.*)',\n },\n ],\n headers: [\n {\n // TODO: we may want to revisit before launch whether we want to expose this\n // value on all responses publicly since users may not want to reveal this host\n // (maybe just in preview? or when the user is logged in to the toolbar?)\n key: 'X-Vercel-Host',\n value: ':host',\n },\n ],\n },\n ];\n if (next.headers && typeof next.headers === 'function') {\n const originalHeadersFn = next.headers;\n next.headers = async () => {\n const originalHeaders = await originalHeadersFn();\n return [...originalHeaders, ...headersToAdd];\n };\n } else {\n next.headers = () => {\n return Promise.resolve(headersToAdd);\n };\n }\n\n return {\n next,\n };\n}\n","/// <reference types=\"@edge-runtime/types\" />\n\nimport type { Application } from '../config-v2/microfrontends-config/isomorphic/application';\nimport type { VercelRelatedProject } from './types';\n\n/**\n * Gets the domain for a related project from the environment.\n *\n * This is used for preview, and production, and requires project linking in Vercel\n */\nexport function getDomainFromEnvironment({\n app,\n target,\n}: {\n app: Application;\n target: keyof VercelRelatedProject['aliases'];\n}): string {\n const projects = JSON.parse(\n process.env.VERCEL_RELATED_PROJECTS ?? '[]',\n ) as VercelRelatedProject[];\n\n if (projects.length === 0) {\n throw new Error('Missing related vercel project information');\n }\n\n // find the related project details for the application\n const vercelProject = projects.find(\n (project) =>\n project.projectId === app.vercel?.projectId ||\n project.appName === app.name,\n );\n\n if (!vercelProject) {\n throw new Error(\n `Missing related vercel project information for application \"${app.name}\"`,\n );\n }\n\n return vercelProject.aliases[target];\n}\n","/// <reference types=\"@edge-runtime/types\" />\n\nimport type { MicrofrontendMainConfig } from '../config-v2/microfrontends-config/isomorphic/main';\nimport { getDomainFromEnvironment } from './get-domain-from-environment';\n\nfunction debugDomains(zone: string, env: string, domain: string): void {\n if (process.env.MFE_DEBUG === 'true') {\n const indent = ' '.repeat(4);\n const header = 'domains (zone (env) -> domain)';\n const separator = '⎯'.repeat(header.length);\n const line = `${indent} 1. ${zone} (${env}) -> ${domain}`;\n\n // eslint-disable-next-line no-console\n console.log(`${indent}${header}\\n${indent}${separator}\\n${line}\\n`);\n }\n}\n\ninterface Environment {\n group: 'development' | 'preview' | 'production' | 'custom';\n name?: string;\n}\n\nfunction getCurrentEnvironment(): Environment {\n const isDevelopment =\n !process.env.VERCEL_ENV || process.env.VERCEL_ENV === 'development';\n const isPreview = process.env.VERCEL_ENV === 'preview';\n const isProduction = process.env.VERCEL_ENV === 'production';\n\n if (isDevelopment) {\n return { group: 'development' };\n } else if (isProduction) {\n return { group: 'production' };\n } else if (isPreview) {\n return { group: 'preview' };\n }\n\n return { group: 'custom', name: process.env.VERCEL_ENV };\n}\n/**\n * Returns the Vercel domain for the given application based on the current environment (local, preview, production).\n */\nexport function getDomainForCurrentEnvironment(\n config: MicrofrontendMainConfig,\n appName: string,\n): string {\n const app = config.getApplication(appName);\n if (app.overrides?.environment) {\n return app.overrides.environment.toString();\n }\n\n const { group } = getCurrentEnvironment();\n const productionHost = config.getDefaultApplication().production.toString();\n switch (group) {\n case 'development': {\n // TODO(mknichel): Convert this back to the local development domain once\n // there is local development proxy support.\n const domain =\n process.env.NODE_ENV === 'test'\n ? app.development.local.toString()\n : productionHost;\n debugDomains(appName, 'development', domain);\n return domain;\n }\n case 'preview': {\n return getDomainFromEnvironment({ app, target: 'branch' });\n }\n case 'production': {\n return getDomainFromEnvironment({ app, target: 'production' });\n }\n\n case 'custom':\n // eslint-disable-next-line no-console\n console.warn(\n `Custom environments are not supported in getDomainForCurrentEnvironment`,\n );\n return productionHost;\n }\n}\n","import type { Rewrite } from 'next/dist/lib/load-custom-routes';\nimport { getDomainForCurrentEnvironment } from '../../../routing-v2/get-domain-for-current-environment';\nimport { MicrofrontendMainConfig } from '../../../config-v2/microfrontends-config/isomorphic/main';\nimport type { TransformConfigInput, TransformConfigResponse } from './types';\n\nfunction debugRewrites(rewrites: Rewrite[]): void {\n if (process.env.MFE_DEBUG === 'true') {\n const indent = ' '.repeat(4);\n const header = 'rewrites (source → destination)';\n const separator = '⎯'.repeat(header.length);\n const maxSourceLength = Math.max(\n ...rewrites.map((key) => key.source.length),\n );\n const table = rewrites\n .map((route, idx) => {\n const paddedSource = route.source.padEnd(maxSourceLength);\n return `${indent} ${idx + 1}. ${paddedSource} → ${route.destination}`;\n })\n .join('\\n');\n\n // eslint-disable-next-line no-console\n console.log(`${indent}${header}\\n${indent}${separator}\\n${table}\\n`);\n }\n}\n\nfunction pathToRewrites(path: string): string[] {\n const regex = /(?<base>^.+)\\/:.+\\*$/;\n const match = regex.exec(path);\n\n const paths = [path];\n if (match?.groups?.base) {\n paths.unshift(match.groups.base);\n }\n\n return paths;\n}\n\ninterface DestinationConfig {\n pathname: string;\n domain?: string;\n}\n\ninterface RewriteConfig {\n destination: DestinationConfig;\n}\n\nfunction rewritesMapToArr(rewrites: Map<string, RewriteConfig>): Rewrite[] {\n return Array.from(rewrites.entries()).flatMap(([source, rewrite]) => {\n const destination = `${rewrite.destination.domain || ''}${rewrite.destination.pathname}`;\n if (source === destination) return [];\n return [\n {\n source,\n destination,\n },\n ];\n });\n}\n\nexport function transform(args: TransformConfigInput): TransformConfigResponse {\n const { next, microfrontend, app } = args;\n\n const buildBeforeFiles = (): Rewrite[] => {\n const rewrites = new Map<string, RewriteConfig>();\n\n // setup _next rewrite\n if (!app.isDefault()) {\n rewrites.set(`/${app.getAssetPrefix()}/_next/:path+`, {\n destination: {\n pathname: `/_next/:path+`,\n },\n });\n\n if (!app.vercel?.routeSpeedInsightsToDefaultZone) {\n rewrites.set(`/${app.getAssetPrefix()}/_vercel/:path*`, {\n destination: { pathname: '/_vercel/:path*' },\n });\n }\n // add rewrites\n } else if (microfrontend instanceof MicrofrontendMainConfig) {\n for (const [_, a] of Object.entries(\n microfrontend.getChildApplications(),\n )) {\n const { routing } = a;\n const domain = getDomainForCurrentEnvironment(microfrontend, a.name);\n // configure the asset rewrite\n rewrites.set(`/${a.getAssetPrefix()}/:path+`, {\n destination: {\n domain,\n pathname: `/${a.getAssetPrefix()}/:path+`,\n },\n });\n\n // Add the rewrites for the zone, each routing group requires either:\n // 1. routing through the default application (in the case of `group.options.routeToDefaultApplication`)\n // 2. evaluating a flag based on `group.options.flag`\n // 3. direct routing based on the paths\n for (const group of routing) {\n // route through the default application\n if (group.routeToDefaultApplication) {\n // already handled by middleware - skip\n continue;\n } else if (group.flag) {\n // Already handled by middleware - skip\n continue;\n } else {\n // configure the path rewrite\n for (const source of group.paths) {\n const paths = pathToRewrites(source);\n for (const p of paths) {\n rewrites.set(p, {\n destination: { domain, pathname: p },\n });\n }\n }\n }\n }\n }\n }\n\n return rewritesMapToArr(rewrites);\n };\n\n const newBeforeFiles = buildBeforeFiles();\n if (next.rewrites && typeof next.rewrites === 'function') {\n // we already have rewrites, we have to merge them\n const originalRewritesFn = next.rewrites;\n next.rewrites = async () => {\n const originalRewrites = await originalRewritesFn();\n if (\n typeof originalRewrites === 'object' &&\n !Array.isArray(originalRewrites)\n ) {\n const { beforeFiles = [] } = originalRewrites;\n return {\n beforeFiles: [...newBeforeFiles, ...beforeFiles],\n afterFiles: originalRewrites.afterFiles,\n fallback: originalRewrites.fallback,\n };\n }\n return {\n beforeFiles: newBeforeFiles,\n afterFiles: originalRewrites,\n fallback: [],\n };\n };\n } else {\n // rewrites aren't defined, we can write our own\n // eslint-disable-next-line @typescript-eslint/require-await\n next.rewrites = async () => ({\n beforeFiles: newBeforeFiles,\n afterFiles: [],\n fallback: [],\n });\n }\n\n debugRewrites(newBeforeFiles);\n\n return {\n next,\n };\n}\n","import { MicrofrontendChildConfig } from '../../../config-v2/microfrontends-config/isomorphic/child';\nimport { getDomainForCurrentEnvironment } from '../../../routing-v2/get-domain-for-current-environment';\nimport type { TransformConfigInput, TransformConfigResponse } from './types';\n\nconst formatDomainForServerAction = (domain: string): string =>\n domain.replace(/https?:\\/\\//, '');\n\nexport function transform(args: TransformConfigInput): TransformConfigResponse {\n const { next, app, microfrontend } = args;\n\n if (microfrontend instanceof MicrofrontendChildConfig) {\n // eslint-disable-next-line no-console\n console.warn(\n 'server actions transform requires the full config - skipping',\n );\n return {\n next,\n };\n }\n\n const defaultApplication = microfrontend.getDefaultApplication();\n const appsToAllow = [\n // this zone - this is included by default unless allowedOrigins is overridden (which we are)\n // so we re-add it here.\n app,\n // this is the default zone for the microfrontend. Allow child zones to call server actions\n // that are in the default zone.\n defaultApplication,\n ];\n\n // server actions is handled under experimental right now\n const existingServerActionConfig = next.experimental?.serverActions;\n next.experimental = {\n ...next.experimental,\n serverActions: {\n ...existingServerActionConfig,\n allowedOrigins: Array.from(\n new Set([\n ...(existingServerActionConfig?.allowedOrigins ?? []),\n ...appsToAllow.flatMap((a) => [\n formatDomainForServerAction(\n defaultApplication.production.toString(),\n ),\n formatDomainForServerAction(\n getDomainForCurrentEnvironment(microfrontend, a.name),\n ),\n ]),\n ]),\n ),\n },\n };\n\n return {\n next,\n };\n}\n","import type { NextConfig } from 'next';\n// eslint-disable-next-line import/no-named-as-default\nimport type webpack from 'webpack';\nimport type { WebpackOptionsNormalized } from 'webpack';\nimport type { TransformConfigInput, TransformConfigResponse } from './types';\n\nexport function transform(args: TransformConfigInput): TransformConfigResponse {\n const { next, microfrontend } = args;\n\n const configWithWebpack: NextConfig = {\n ...next,\n webpack(cfg, context): unknown {\n // execute the client config first, otherwise their config may accidentally\n // overwrite our required config - leading to unexpected errors.\n const config = (\n typeof next.webpack === 'function' ? next.webpack(cfg, context) : cfg\n ) as WebpackOptionsNormalized;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { isServer, nextRuntime, webpack: wpFromNext } = context;\n\n if (isServer || nextRuntime === 'edge') {\n config.plugins.push(\n new (wpFromNext as typeof webpack).EnvironmentPlugin({\n MFE_CONFIG: JSON.stringify(microfrontend.serialize()),\n }),\n );\n }\n\n config.plugins.push(\n // Remove node: from import specifiers, because Next.js does not yet support node: scheme\n // https://github.com/vercel/next.js/issues/28774\n new (wpFromNext as typeof webpack).NormalModuleReplacementPlugin(\n /^node:/,\n (resource) => {\n resource.request = resource.request.replace(/^node:/, '');\n },\n ),\n );\n\n // Webpack 5 no longer polyfills Node.js core modules automatically which means\n // if you use them in your code running in browsers or alike, you will have to\n // install compatible modules from npm and include them yourself.\n // https://webpack.js.org/configuration/resolve/#resolvefallback\n if (!isServer) {\n config.resolve.fallback = {\n fs: false,\n path: false,\n crypto: false,\n ...config.resolve.fallback,\n };\n }\n\n return config;\n },\n };\n\n return {\n next: configWithWebpack,\n };\n}\n","import type { TransformConfigInput, TransformConfigResponse } from './types';\nimport { transform as assetPrefixTransform } from './asset-prefix';\nimport { transform as draftModeTransform } from './draft-mode';\nimport { transform as headersTransform } from './headers';\nimport { transform as rewritesTransform } from './rewrites';\nimport { transform as serverActionsTransform } from './server-actions';\nimport { transform as webpackTransform } from './webpack';\n\nexport type TransformKeys =\n | 'assetPrefix'\n | 'draftMode'\n | 'headers'\n | 'rewrites'\n | 'serverActions'\n | 'webpack';\n\nexport const transforms: Record<\n TransformKeys,\n (args: TransformConfigInput) => TransformConfigResponse\n> = {\n assetPrefix: assetPrefixTransform,\n draftMode: draftModeTransform,\n headers: headersTransform,\n rewrites: rewritesTransform,\n serverActions: serverActionsTransform,\n webpack: webpackTransform,\n} as const;\n","import type { MicrofrontendsServer } from '../../config-v2/microfrontends/server';\nimport type {\n ChildApplication,\n DefaultApplication,\n} from '../../config-v2/microfrontends-config/isomorphic/application';\n\nfunction debugEnv(env: Record<string, string>): void {\n if (process.env.MFE_DEBUG === 'true') {\n const indent = ' '.repeat(4);\n const header = 'env (key → val)';\n const separator = '⎯'.repeat(header.length);\n\n const maxKeyLength = Math.max(...Object.keys(env).map((key) => key.length));\n const table = Object.keys(env)\n .map((key, idx) => {\n const paddedKey = key.padEnd(maxKeyLength);\n return `${indent} ${idx + 1}. ${paddedKey} = ${env[key]}`;\n })\n .join('\\n');\n\n // eslint-disable-next-line no-console\n console.log(`${indent}${header}\\n${indent}${separator}\\n${table}\\n`);\n }\n} /**\n * Default application\n * - MFE_CURRENT_APPLICATION\n * - NEXT_PUBLIC_MFE_CURRENT_APPLICATION\n * - NEXT_PUBLIC_MFE_CLIENT_CONFIG\n * - MFE_CONFIG\n *\n * Child application(s):\n * - MFE_CURRENT_APPLICATION\n * - NEXT_PUBLIC_MFE_CURRENT_APPLICATION\n */\nexport function setEnvironment({\n app,\n microfrontends,\n}: {\n app: ChildApplication | DefaultApplication;\n microfrontends: MicrofrontendsServer;\n}): void {\n const clientEnvs = {\n NEXT_PUBLIC_MFE_CURRENT_APPLICATION: app.name,\n NEXT_PUBLIC_MFE_CLIENT_CONFIG: JSON.stringify(\n microfrontends.config.toClientConfig().serialize(),\n ),\n };\n\n const serverEnvs: Record<string, string> = {\n MFE_CURRENT_APPLICATION: app.name,\n MFE_CONFIG: JSON.stringify(microfrontends.config.getConfig()),\n };\n\n const allEnvs = { ...clientEnvs, ...serverEnvs };\n\n // set\n for (const [key, value] of Object.entries(allEnvs)) {\n process.env[key] = value;\n }\n\n // debug (optional)\n debugEnv(allEnvs);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,kBAAe;;;ACAf,qBAAe;AACf,IAAAC,oBAAwB;;;ACDjB,IAAM,0BAA0B;AAChC,IAAM,8BAA8B,GAAG;;;ACCvC,SAAS,iBAAiB,QAAoC;AAFrE;AAGE,SAAO,SAAQ,YAAO,SAAP,mBAAa,WAAW,wBAAwB;AACjE;;;ACDO,SAAS,sBAAsB,QAGgB;AACpD,MAAI,CAAC,iBAAiB,MAAM,KAAK,CAAC,OAAO;AAAO;AAChD,SAAO;AAAA,IACL,aAAa,OAAO,KAAK,QAAQ,6BAA6B,EAAE;AAAA,IAChE,MAAM,OAAO;AAAA,EACf;AACF;;;ACTO,SAAS,eACd,SACiB;AACjB,QAAM,kBAAmC,EAAE,cAAc,CAAC,EAAE;AAE5D,UAAQ,QAAQ,CAAC,WAAW;AAC1B,UAAM,WAAW,sBAAsB,MAAM;AAC7C,QAAI,CAAC;AAAU;AACf,oBAAgB,aAAa,SAAS,WAAW,IAAI;AAAA,MACnD,aAAa,EAAE,MAAM,SAAS,KAAK;AAAA,IACrC;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;ACwDO,IAAM,qBAAN,cAEG,MAAM;AAAA,EAKd,YAAY,SAAiB,MAAqC;AAChE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,UAAS,6BAAM,WAAU;AAC9B,SAAK,QAAO,6BAAM,SAAS;AAC3B,SAAK,UAAU,6BAAM;AACrB,UAAM,kBAAkB,MAAM,kBAAkB;AAAA,EAClD;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,YAAqB;AACnB,WAAO,CAAC,KAAK,QAAQ;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,QACL,UACA,MAC4C;AAC5C,QAAI,6BAAM,UAAU;AAClB,YAAM,MAAM,mBAAmB,eAAe,UAAU,KAAK,QAAQ;AACrE,UAAI,KAAK;AACP,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QACE,SAAS,QAAQ;AAAA,MACf;AAAA,IACF,GACA;AACA,aAAO,IAAI,mBAAmB,SAAS,SAAS;AAAA,QAC9C,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,WAAO,IAAI,mBAAmB,SAAS,OAAO;AAAA,EAChD;AAAA,EAEA,OAAO,eACL,UACA,UACmD;AACnD,QAAI,oBAAoB,SAAS,UAAU,UAAU;AACnD,UAAI,SAAS,SAAS,UAAU;AAC9B,eAAO,IAAI,mBAAmB,mBAAmB,aAAa;AAAA,UAC5D,MAAM;AAAA,UACN,SAAS;AAAA,UACT,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AACA,UAAI,SAAS,SAAS,UAAU;AAC9B,eAAO,IAAI;AAAA,UACT,sCAAsC;AAAA,UACtC;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,YACT,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,oBAAoB,aAAa;AACnC,aAAO,IAAI;AAAA,QACT,oBAAoB;AAAA,QACpB;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OACL,KACA,MAC4C;AAC5C,QAAI,eAAe,oBAAoB;AACrC,aAAO;AAAA,IACT;AAGA,QAAI,eAAe,OAAO;AACxB,aAAO,mBAAmB,QAAQ,KAAK,IAAI;AAAA,IAC7C;AAGA,QAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAC3C,UAAI,aAAa,OAAO,OAAO,IAAI,YAAY,UAAU;AACvD,eAAO,mBAAmB,QAAQ,IAAI,MAAM,IAAI,OAAO,GAAG,IAAI;AAAA,MAChE;AAAA,IACF;AAEA,WAAO,IAAI,mBAAmB,2BAA2B;AAAA,EAC3D;AACF;;;AC7LO,SAAS,yBAAiC;AAC/C,QAAM,SAAS,QAAQ,IAAI;AAC3B,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,mBAAmB,wCAAwC;AAAA,MACnE,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,SAAO;AACT;;;ACdA,0BAAsB;;;ACEf,SAAS,aAAa,GAA4B;AACvD,SAAO,EAAE,YAAY;AACvB;;;ACFO,SAAS,aAAa,GAAyC;AACpE,SAAO,EAAE,aAAa;AACxB;;;ACJA,4BAA6B;AAOtB,IAAM,4BAAN,MAAgC;AAAA,EAKrC,YAAY,QAAsB,MAAyC;AAH3E,qBAAoC,CAAC;AAInC,SAAK,aAAa;AAClB,QAAI,6BAAM,oBAAoB;AAC5B,iBAAW,OAAO,OAAO,OAAO,OAAO,YAAY,GAAG;AACpD,YAAI,IAAI,SAAS;AACf,cAAI,UAAU,IAAI,QAAQ,OAAO,CAAC,UAAU,CAAC,MAAM,IAAI;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AACA,SAAK,eAAe,OAAO;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,QACL,QACA,MAC2B;AAC3B,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AACA,WAAO,IAAI;AAAA,MACT,KAAK,MAAM,MAAM;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAAQ,OAA2C;AACjD,WACE,KAAK,UAAU,KAAK,YAAY,MAAM,KAAK,UAAU,MAAM,YAAY;AAAA,EAE3E;AAAA,EAEA,0BAA0BC,OAA6B;AACrD,QAAI,CAACA,MAAK,WAAW,GAAG,GAAG;AACzB,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,QAAI,KAAK,UAAUA,KAAI,GAAG;AACxB,aAAO,KAAK,UAAUA,KAAI;AAAA,IAC5B;AAEA,UAAM,WAAW,IAAI,IAAIA,OAAM,qBAAqB,EAAE;AACtD,eAAW,CAAC,MAAM,WAAW,KAAK,OAAO,QAAQ,KAAK,YAAY,GAAG;AACnE,UAAI,YAAY,SAAS;AACvB,mBAAW,SAAS,YAAY,SAAS;AACvC,qBAAW,aAAa,MAAM,OAAO;AACnC,kBAAM,aAAS,oCAAa,SAAS;AACrC,gBAAI,OAAO,KAAK,QAAQ,GAAG;AACzB,mBAAK,UAAUA,KAAI,IAAI;AACvB,qBAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,UAAM,qBAAqB,OAAO,QAAQ,KAAK,YAAY,EAAE;AAAA,MAC3D,CAAC,CAAC,EAAE,WAAW,MAAM,YAAY;AAAA,IACnC;AACA,QAAI,CAAC,oBAAoB;AACvB,aAAO;AAAA,IACT;AAEA,SAAK,UAAUA,KAAI,IAAI,mBAAmB,CAAC;AAC3C,WAAO,mBAAmB,CAAC;AAAA,EAC7B;AAAA,EAEA,YAA0B;AACxB,WAAO,KAAK;AAAA,EACd;AACF;;;ACpFA,IAAAC,yBAAuD;AAWvD,IAAM,qBAAqB,CAAC,GAAG;AAExB,IAAM,wBAAwB,CAAC,YAA0B;AAC9D,MAAI,CAAC,mBAAmB,SAAS,OAAO,GAAG;AACzC,UAAM,IAAI;AAAA,MACR,wBAAwB,oCAAoC,mBAAmB;AAAA,QAC7E;AAAA,MACF;AAAA,MACA,EAAE,MAAM,UAAU,SAAS,sBAAsB;AAAA,IACnD;AAAA,EACF;AACF;AAKO,IAAM,sBAAsB,CACjC,2BACS;AACT,MAAI,CAAC,wBAAwB;AAC3B;AAAA,EACF;AAEA,QAAM,uBAAuB,oBAAI,IAO/B;AACF,QAAM,SAAmB,CAAC;AAE1B,aAAW,CAAC,IAAI,GAAG,KAAK,OAAO,QAAQ,sBAAsB,GAAG;AAC9D,QAAI,aAAa,GAAG,GAAG;AAErB;AAAA,IACF;AAEA,eAAW,aAAa,IAAI,SAAS;AACnC,iBAAWC,SAAQ,UAAU,OAAO;AAClC,cAAM,aAAS,uBAAAC,OAAgBD,KAAI;AACnC,mBAAW,SAAS,OAAO,MAAM,GAAG,EAAE,GAAG;AACvC,cAAI,OAAO,UAAU,UAAU;AAC7B,mBAAO;AAAA,cACL,QAAQA;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAEA,cAAM,WAAW,qBAAqB,IAAIA,KAAI;AAC9C,YAAI,UAAU;AACZ,mBAAS,aAAa,KAAK,EAAE;AAAA,QAC/B,OAAO;AACL,+BAAqB,IAAIA,OAAM;AAAA,YAC7B,cAAc,CAAC,EAAE;AAAA,YACjB,aAAS,qCAAaA,KAAI;AAAA,YAC1B,eAAe;AAAA,UACjB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,UAAU,MAAM,KAAK,qBAAqB,QAAQ,CAAC;AAEzD,UAAQ,QAAQ,CAAC,CAACA,OAAM,EAAE,cAAc,KAAK,SAAS,cAAc,CAAC,MAAM;AACzE,QAAI,IAAI,SAAS,GAAG;AAClB,aAAO;AAAA,QACL,mBAAmBA,4BAA2B,IAAI,KAAK,IAAI;AAAA,MAC7D;AAAA,IACF;AAEA,YAAQ;AAAA,MACN,CAAC;AAAA,QACC;AAAA,QACA,EAAE,cAAc,UAAU,eAAe,mBAAmB;AAAA,MAC9D,MAAM;AACJ,YAAIA,UAAS,WAAW;AAEtB;AAAA,QACF;AAEA,YAAI,kBAAkB,oBAAoB;AAExC;AAAA,QACF;AAEA,YAAI,QAAQ,KAAK,SAAS,GAAG;AAC3B,gBAAM,SAAS,IAAIA,wBAAuB,IAAI,SAAS,IAAI,MAAM,MAAM,IAAI,KAAK,IAAI;AACpF,gBAAM,cAAc,IAAI,4BAA4B,SAAS,SAAS,IAAI,MAAM,MAAM,SAAS,KAAK,IAAI;AAExG,iBAAO;AAAA,YACL,qCAAqC,cAAc;AAAA,UACrD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI,OAAO,QAAQ;AACjB,UAAM,IAAI,mBAAmB,kBAAkB,OAAO,KAAK,IAAI,KAAK;AAAA,MAClE,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAKO,IAAM,mBAAmB,CAC9B,MACA,QACS;AAET,aAAW,SAAS,IAAI,SAAS;AAC/B,eAAW,KAAK,MAAM,OAAO;AAC3B,UAAI,MAAM,KAAK;AACb;AAAA,MACF;AACA,UAAI,EAAE,SAAS,GAAG,GAAG;AACnB,cAAM,IAAI;AAAA,UACR,iCAAiC,UAAU;AAAA,UAC3C,EAAE,MAAM,eAAe,SAAS,eAAe;AAAA,QACjD;AAAA,MACF;AAEA,UAAI,CAAC,EAAE,WAAW,GAAG,GAAG;AACtB,cAAM,IAAI;AAAA,UACR,iCAAiC,UAAU;AAAA,UAC3C,EAAE,MAAM,eAAe,SAAS,eAAe;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,mCAAmC,CAC9C,2BACS;AACT,MAAI,CAAC,wBAAwB;AAC3B;AAAA,EACF;AAGA,QAAM,0BAA0B,OAAO,QAAQ,sBAAsB,EAAE;AAAA,IACrE,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,aAAa,GAAG;AAAA,EAChC;AAEA,QAAM,+BAA+B,wBAAwB;AAAA,IAC3D,CAAC,CAAC,GAAG,MAAM;AAAA,EACb;AACA,QAAM,kBAAkB,OAAO,KAAK,sBAAsB,EAAE;AAC5D,QAAM,6BAA6B,6BAA6B;AAChE,QAAM,gCACJ,kBAAkB;AAEpB,MAAI,kCAAkC,GAAG;AACvC,UAAM,IAAI;AAAA,MACR;AAAA,MACA,EAAE,MAAM,UAAU,SAAS,yBAAyB;AAAA,IACtD;AAAA,EACF;AAEA,MAAI,gCAAgC,GAAG;AACrC,UAAM,IAAI;AAAA,MACR,kDAAkD,6BAA6B,SAAS,OAAO,KAAK,sBAAsB,EAAE,SAAS;AAAA,MACrI,EAAE,MAAM,UAAU,SAAS,gCAAgC;AAAA,IAC7D;AAAA,EACF;AACF;AAEO,IAAM,wBAAwB,CAAC,YAA4B;AA1LlE;AA2LE,OAAI,wCAAS,WAAT,mBAAiB,yBAAyB;AAC5C,QACE,CAAC,+BAA+B;AAAA,MAC9B,QAAQ,OAAO;AAAA,IACjB,GACA;AACA,YAAM,IAAI;AAAA,QACR,sCAAsC,QAAQ,OAAO;AAAA,QACrD,EAAE,MAAM,UAAU,SAAS,oCAAoC;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AACF;;;ACvMA,IAAM,SAAS;AAER,SAAS,4BAA4B;AAAA,EAC1C;AACF,GAEW;AACT,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,SAAO,GAAG,UAAU;AACtB;;;ACZO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA,UAAU;AAAA,EACV,UAAU;AACZ,GAIW;AACT,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AAGA,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAEpC,YAAQ,QAAQ,KAAK,OAAO,KAAK,WAAW,CAAC;AAG7C,YAAQ;AAAA,EACV;AACA,SAAO,KAAK,IAAI,IAAI;AAGpB,QAAM,QAAQ,UAAU;AACxB,QAAM,OAAO,UAAW,OAAO;AAE/B,SAAO;AACT;;;ACfO,IAAM,OAAN,MAAW;AAAA,EAMhB,YAAY,YAAoC,SAAuB;AACrE,UAAM,EAAE,WAAW,SAAS,MAAM,KAAK,IAAI;AAC3C,SAAK,WAAW;AAChB,SAAK,OAAO;AACZ,SAAK,OAAO,KAAK,QAAQ,EAAE,MAAM,UAAU,KAAK,SAAS,CAAC;AAC1D,SAAK,QAAQ,mCAAS;AAAA,EACxB;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,SAAS,KAAK,SAAS,eAAe,KAAK,SAAS;AAAA,EAClE;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb;AAAA,IACA;AAAA,EACF,GAGW;AACT,QAAI,CAAC,MAAM;AACT,UAAI,aAAa,QAAQ;AACvB,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAyB;AACvB,WAAO,KAAK,SAAS,KAAK,QAAQ,EAAE,UAAU,KAAK,SAAS,CAAC;AAAA,EAC/D;AAAA,EAEA,SAAS,OAA2B,CAAC,GAAW;AAC9C,UAAM,MAAM,KAAK,MAAM,IAAI;AAE3B,WAAO,IAAI,SAAS,EAAE,QAAQ,OAAO,EAAE;AAAA,EACzC;AAAA,EAEA,MAAM,OAA2B,CAAC,GAAQ;AACxC,UAAM,EAAE,mBAAmB,IAAI;AAC/B,UAAM,MAAM,GAAG,KAAK,cAAc,KAAK,OAAO,KAAK,cAAc,KAAK,CAAC,qBAAqB,KAAK,IAAI,KAAK;AAE1G,WAAO,IAAI,IAAI,GAAG;AAAA,EACpB;AACF;AAKO,IAAM,YAAN,cAAwB,KAAK;AAAA,EAClC,YAAY;AAAA,IACV;AAAA,IACA,GAAG;AAAA,EACL,GAAgD;AAE9C,UAAM,OAAO,WAAW,QAAQ;AAChC,UAAM,OAAO,WAAW,QAAQ,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AACtE,UAAM,WAAW,WAAW,YAAY;AAExC,UAAM,EAAE,UAAU,MAAM,KAAK,CAAC;AAAA,EAChC;AACF;;;ACtEO,IAAM,cAAN,MAAkB;AAAA,EAcvB,YACE,MACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAKA;AArCJ;AAsCI,SAAK,OAAO;AACZ,SAAK,cAAc;AAAA,MACjB,OAAO,IAAI,UAAU;AAAA,QACnB,SAAS;AAAA,QACT,IAAG,SAAI,gBAAJ,mBAAiB;AAAA,MACtB,CAAC;AAAA,MACD,YAAU,SAAI,gBAAJ,mBAAiB,YACvB,IAAI,KAAK,IAAI,YAAY,QAAQ,IACjC;AAAA,IACN;AACA,SAAK,aAAa,IAAI,aAAa,IAAI,KAAK,IAAI,UAAU,IAAI;AAC9D,SAAK,SAAS,IAAI;AAClB,SAAK,aAAY,uCAAW,eACxB;AAAA,MACE,aAAa,IAAI,KAAK,UAAU,WAAW;AAAA,IAC7C,IACA;AACJ,SAAK,UAAU,aAAa;AAC5B,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,iBAAyB;AACvB,WAAO,4BAA4B,EAAE,MAAM,KAAK,KAAK,CAAC;AAAA,EACxD;AAAA,EAEA,YAA+B;AAC7B,WAAO,KAAK;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,YAAY;AAAA,EAIlD,YACE,MACA;AAAA,IACE;AAAA,IACA;AAAA,EACF,GAIA;AACA,UAAM,MAAM;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AAjBH,SAAS,UAAU;AAmBjB,SAAK,aAAa,IAAI,KAAK,IAAI,UAAU;AAAA,EAC3C;AACF;AAEO,IAAM,mBAAN,cAA+B,YAAY;AAAA,EAIhD,YACE,MACA;AAAA,IACE;AAAA,IACA;AAAA,EACF,GAIA;AAEA,qBAAiB,SAAS,MAAM,GAAG;AAEnC,UAAM,MAAM;AAAA,MACV;AAAA,MACA;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AApBH,SAAS,UAAU;AAsBjB,SAAK,UAAU,IAAI;AAAA,EACrB;AAAA,EAEA,OAAO,SAAS,MAAc,KAAmC;AAE/D,qBAAiB,MAAM,GAAG;AAAA,EAC5B;AACF;;;AC9HO,IAAM,2BAA2B;;;AT4BjC,IAAM,gCAAN,MAAoC;AAAA,EAezC,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAsE;AAdtE,6BAAsD,CAAC;AAjCzD;AAiDI,kCAA8B,SAAS,MAAM;AAE7C,UAAM,qBAAmB,kBAAO,YAAP,mBAAgB,WAAhB,mBAAwB,qBAAoB;AACrE,SAAK,YAAY,aAAa,CAAC,mBAAmB,YAAY;AAC9D,SAAK,eAAe,aAAa,MAAM;AAEvC,QAAI,aAAa,MAAM,GAAG;AAExB,iBAAW,CAAC,OAAO,SAAS,KAAK,OAAO,QAAQ,OAAO,YAAY,GAAG;AACpE,cAAM,eAAe,CAAC,oBAClB,UAAK,cAAL,mBAAgB,aAAa,SAC7B;AAEJ,YAAI,aAAa,SAAS,GAAG;AAC3B,eAAK,qBAAqB,IAAI,mBAAmB,OAAO;AAAA,YACtD,KAAK;AAAA,YACL,WAAW;AAAA,UACb,CAAC;AAAA,QACH,OAAO;AACL,eAAK,kBAAkB,KAAK,IAAI,IAAI,iBAAiB,OAAO;AAAA,YAC1D,KAAK;AAAA,YACL,WAAW;AAAA,UACb,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,OAAO;AACL,WAAK,SAAS,OAAO;AACrB,YAAM,eAAe,CAAC,oBAClB,UAAK,cAAL,mBAAgB,aAAa,KAAK,WAClC;AACJ,WAAK,kBAAkB,KAAK,OAAO,IAAI,IAAI;AAAA,QACzC,KAAK;AAAA,QACL;AAAA;AAAA,UAEE,KAAK,EAAE,SAAS,CAAC,EAAE;AAAA,UACnB,WAAW;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAGA,QAAI,aAAa,MAAM,KAAK,CAAC,KAAK,oBAAoB;AACpD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,SAAK,SAAS;AACd,SAAK,UAAU,OAAO;AACtB,SAAK,aAAa;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,SAAS,QAAiC;AAE/C,UAAM,IAAI,OAAO,WAAW,eAAY,2BAAM,MAAM,IAAe;AAEnE,QAAI,aAAa,CAAC,GAAG;AAEnB,4BAAsB,EAAE,OAAO;AAC/B,0BAAoB,EAAE,YAAY;AAClC,uCAAiC,EAAE,YAAY;AAAA,IACjD;AACA,0BAAsB,EAAE,OAAO;AAE/B,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb;AAAA,IACA;AAAA,EACF,GAGkC;AAChC,WAAO,IAAI,8BAA8B;AAAA,MACvC,YAAQ,2BAAM,uBAAuB,CAAC;AAAA,MACtC,WAAW,eAAe,WAAW,CAAC,CAAC;AAAA,MACvC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,sBAA+B;AA1IjC;AA2II,aAAO,gBAAK,YAAL,mBAAc,WAAd,mBAAsB,qBAAoB;AAAA,EACnD;AAAA,EAEA,YAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,wBAGE;AACA,WAAO;AAAA,MACL,oBAAoB,KAAK;AAAA,MACzB,cAAc,OAAO,OAAO,KAAK,iBAAiB;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,uBAA2C;AACzC,WAAO,OAAO,OAAO,KAAK,iBAAiB;AAAA,EAC7C;AAAA,EAEA,qBAAgE;AAC9D,WAAO;AAAA,MACL,KAAK;AAAA,MACL,GAAG,OAAO,OAAO,KAAK,iBAAiB;AAAA,IACzC,EAAE,OAAO,OAAO;AAAA,EAClB;AAAA,EAEA,eAAe,MAAqD;AAvKtE;AAyKI,UAAI,UAAK,uBAAL,mBAAyB,UAAS,MAAM;AAC1C,aAAO,KAAK;AAAA,IACd;AACA,UAAM,MAAM,KAAK,kBAAkB,IAAI;AACvC,QAAI,CAAC,KAAK;AACR,YAAM,IAAI;AAAA,QACR,gEAAgE;AAAA,QAChE;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,0BACE,WACmD;AA5LvD;AA8LI,UAAI,gBAAK,uBAAL,mBAAyB,WAAzB,mBAAiC,eAAc,WAAW;AAC5D,aAAO,KAAK;AAAA,IACd;AAEA,WAAO,OAAO,OAAO,KAAK,iBAAiB,EAAE;AAAA,MAC3C,CAAC,QAAK;AAnMZ,YAAAE;AAmMe,iBAAAA,MAAA,IAAI,WAAJ,gBAAAA,IAAY,eAAc;AAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAA4C;AAC1C,QAAI,CAAC,KAAK,oBAAoB;AAC5B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,oBAA4B;AA5N9B;AA6NI,aAAO,gBAAK,OAAO,YAAZ,mBAAqB,eAArB,mBAAiC,SAAQ;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAuB;AACrB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,iBAA4C;AAC1C,UAAM,eAA6C,OAAO;AAAA,MACxD,OAAO,QAAQ,KAAK,iBAAiB,EAAE,IAAI,CAAC,CAAC,MAAM,WAAW,MAAM;AAAA,QAClE;AAAA,QACA;AAAA,UACE,SAAS;AAAA,UACT,SAAS,YAAY;AAAA,QACvB;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI,KAAK,oBAAoB;AAC3B,mBAAa,KAAK,mBAAmB,IAAI,IAAI;AAAA,QAC3C,SAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO,IAAI,0BAA0B;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,YAIE;AACA,WAAO,KAAK;AAAA,EACd;AACF;;;AUnQO,IAAM,2BAAN,cAAuC,8BAA8B;AAAA,EAI1E,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AACD,UAAM,EAAE,QAAQ,WAAW,KAAK,CAAC;AAZnC,wBAAe;AAab,SAAK,SAAS,OAAO;AAAA,EACvB;AACF;;;ACbO,IAAM,0BAAN,cAAsC,8BAA8B;AAAA,EAKzE,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AApBL;AAqBI,UAAM,EAAE,QAAQ,WAAW,KAAK,CAAC;AAbnC,wBAAe;AAcb,SAAK,WAAW,OAAO;AAEvB,UAAM,qBAAmB,kBAAO,YAAP,mBAAgB,WAAhB,mBAAwB,qBAAoB;AAErE,QAAI;AACJ,eAAW,CAAC,OAAO,SAAS,KAAK,OAAO,QAAQ,OAAO,YAAY,GAAG;AACpE,YAAM,eAAe,CAAC,oBAClB,UAAK,cAAL,mBAAgB,aAAa,SAC7B;AAEJ,UAAI,aAAa,SAAS,GAAG;AAC3B,6BAAqB,IAAI,mBAAmB,OAAO;AAAA,UACjD,KAAK;AAAA,UACL,WAAW;AAAA,QACb,CAAC;AAAA,MACH,OAAO;AACL,aAAK,kBAAkB,KAAK,IAAI,IAAI,iBAAiB,OAAO;AAAA,UAC1D,KAAK;AAAA,UACL,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,CAAC,oBAAoB;AACvB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AACA,SAAK,qBAAqB;AAAA,EAC5B;AACF;;;AC9CO,IAAM,iBAAN,MAAqB;AAAA,EAG1B,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAsE;AACpE,QAAI,aAAa,MAAM,GAAG;AACxB,WAAK,SAAS,IAAI,wBAAwB,EAAE,QAAQ,WAAW,KAAK,CAAC;AAAA,IACvE,OAAO;AACL,WAAK,SAAS,IAAI,yBAAyB,EAAE,QAAQ,WAAW,KAAK,CAAC;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,gBAAyB;AACvB,WAAO,KAAK,kBAAkB;AAAA,EAChC;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb;AAAA,IACA;AAAA,EACF,GAGmB;AACjB,UAAM,SAAS,8BAA8B,QAAQ;AAAA,MACnD;AAAA,MACA;AAAA,IACF,CAAC;AACD,WAAO,IAAI,eAAe,OAAO,UAAU,CAAC;AAAA,EAC9C;AACF;;;AC3CA,uBAAiB;;;ACGV,IAAM,+BAA+B;AAKrC,IAAM,+BAA+B;;;ACRrC,SAAS,WAAoB;AAClC,SAAO,QAAQ,IAAI,WAAW;AAChC;;;AFKO,SAAS,oBAA4B;AAC1C,MAAI,SAAS,GAAG;AACd,WAAO,iBAAAC,QAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,iBAAAA,QAAK,KAAK,8BAA8B,4BAA4B;AAC7E;;;AGhBA,IAAAC,uBAAsB;AACtB,iBAAoB;;;ACwEb,IAAMC,sBAAN,cAEG,MAAM;AAAA,EAKd,YAAY,SAAiB,MAAqC;AAChE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,UAAS,6BAAM,WAAU;AAC9B,SAAK,QAAO,6BAAM,SAAS;AAC3B,SAAK,UAAU,6BAAM;AACrB,UAAM,kBAAkB,MAAMA,mBAAkB;AAAA,EAClD;AAAA,EAEA,UAAmB;AACjB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,YAAqB;AACnB,WAAO,CAAC,KAAK,QAAQ;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,QACL,UACA,MAC4C;AAC5C,QAAI,6BAAM,UAAU;AAClB,YAAM,MAAMA,oBAAmB,eAAe,UAAU,KAAK,QAAQ;AACrE,UAAI,KAAK;AACP,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QACE,SAAS,QAAQ;AAAA,MACf;AAAA,IACF,GACA;AACA,aAAO,IAAIA,oBAAmB,SAAS,SAAS;AAAA,QAC9C,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,WAAO,IAAIA,oBAAmB,SAAS,OAAO;AAAA,EAChD;AAAA,EAEA,OAAO,eACL,UACA,UACmD;AACnD,QAAI,oBAAoB,SAAS,UAAU,UAAU;AACnD,UAAI,SAAS,SAAS,UAAU;AAC9B,eAAO,IAAIA,oBAAmB,mBAAmB,aAAa;AAAA,UAC5D,MAAM;AAAA,UACN,SAAS;AAAA,UACT,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AACA,UAAI,SAAS,SAAS,UAAU;AAC9B,eAAO,IAAIA;AAAA,UACT,sCAAsC;AAAA,UACtC;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,YACT,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,oBAAoB,aAAa;AACnC,aAAO,IAAIA;AAAA,QACT,oBAAoB;AAAA,QACpB;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OACL,KACA,MAC4C;AAC5C,QAAI,eAAeA,qBAAoB;AACrC,aAAO;AAAA,IACT;AAGA,QAAI,eAAe,OAAO;AACxB,aAAOA,oBAAmB,QAAQ,KAAK,IAAI;AAAA,IAC7C;AAGA,QAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAC3C,UAAI,aAAa,OAAO,OAAO,IAAI,YAAY,UAAU;AACvD,eAAOA,oBAAmB,QAAQ,IAAI,MAAM,IAAI,OAAO,GAAG,IAAI;AAAA,MAChE;AAAA,IACF;AAEA,WAAO,IAAIA,oBAAmB,2BAA2B;AAAA,EAC3D;AACF;;;AClMA;AAAA,EACE,SAAW;AAAA,EACX,MAAQ;AAAA,EACR,aAAe;AAAA,IACb,QAAU;AAAA,MACR,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAc;AAAA,MACZ,MAAQ;AAAA,MACR,YAAc;AAAA,QACZ,SAAW;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA,SAAW;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,MAAQ;AAAA,UACR,sBAAwB;AAAA,YACtB,MAAQ;AAAA,UACV;AAAA,UACA,aAAe;AAAA,QACjB;AAAA,QACA,UAAY;AAAA,UACV,MAAQ;AAAA,QACV;AAAA,QACA,cAAgB;AAAA,UACd,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,MACF;AAAA,MACA,UAAY,CAAC,gBAAgB,YAAY,SAAS;AAAA,IACpD;AAAA,IACA,SAAW;AAAA,MACT,MAAQ;AAAA,MACR,YAAc;AAAA,QACZ,QAAU;AAAA,UACR,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,QACA,YAAc;AAAA,UACZ,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,eAAiB;AAAA,MACf,MAAQ;AAAA,MACR,YAAc;AAAA,QACZ,yBAA2B;AAAA,UACzB,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,QACA,UAAY;AAAA,UACV,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,QACA,kBAAoB;AAAA,UAClB,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,mBAAqB;AAAA,MACnB,MAAQ;AAAA,MACR,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,aAAe;AAAA,MACb,OAAS;AAAA,QACP;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,IACA,oBAAsB;AAAA,MACpB,MAAQ;AAAA,MACR,YAAc;AAAA,QACZ,QAAU;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,MAAQ;AAAA,QACV;AAAA,QACA,YAAc;AAAA,UACZ,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY,CAAC,YAAY;AAAA,IAC3B;AAAA,IACA,QAAU;AAAA,MACR,MAAQ;AAAA,MACR,YAAc;AAAA,QACZ,WAAa;AAAA,UACX,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,QACA,iCAAmC;AAAA,UACjC,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY,CAAC,WAAW;AAAA,IAC1B;AAAA,IACA,aAAe;AAAA,MACb,MAAQ;AAAA,MACR,YAAc;AAAA,QACZ,OAAS;AAAA,UACP,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,UACV,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,QACA,MAAQ;AAAA,UACN,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,iBAAmB;AAAA,MACjB,MAAQ;AAAA,MACR,YAAc;AAAA,QACZ,MAAQ;AAAA,UACN,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,QACA,UAAY;AAAA,UACV,MAAQ;AAAA,UACR,MAAQ,CAAC,QAAQ,OAAO;AAAA,UACxB,aAAe;AAAA,QACjB;AAAA,QACA,MAAQ;AAAA,UACN,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAc;AAAA,MACZ,MAAQ;AAAA,MACR,YAAc;AAAA,QACZ,UAAY;AAAA,UACV,MAAQ;AAAA,UACR,MAAQ,CAAC,QAAQ,OAAO;AAAA,UACxB,aAAe;AAAA,QACjB;AAAA,QACA,MAAQ;AAAA,UACN,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,QACA,MAAQ;AAAA,UACN,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,MACF;AAAA,MACA,UAAY,CAAC,MAAM;AAAA,IACrB;AAAA,IACA,kBAAoB;AAAA,MAClB,MAAQ;AAAA,MACR,YAAc;AAAA,QACZ,QAAU;AAAA,UACR,MAAQ;AAAA,QACV;AAAA,QACA,aAAe;AAAA,UACb,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,QACA,YAAc;AAAA,UACZ,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY,CAAC,SAAS;AAAA,IACxB;AAAA,IACA,SAAW;AAAA,MACT,MAAQ;AAAA,MACR,OAAS;AAAA,QACP,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,WAAa;AAAA,MACX,MAAQ;AAAA,MACR,YAAc;AAAA,QACZ,OAAS;AAAA,UACP,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,QACA,MAAQ;AAAA,UACN,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,QACA,2BAA6B;AAAA,UAC3B,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,QACA,OAAS;AAAA,UACP,MAAQ;AAAA,UACR,OAAS;AAAA,YACP,MAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,MACA,UAAY,CAAC,OAAO;AAAA,IACtB;AAAA,IACA,UAAY;AAAA,MACV,MAAQ;AAAA,MACR,MAAQ,CAAC,UAAU,OAAO;AAAA,IAC5B;AAAA,IACA,oBAAsB;AAAA,MACpB,MAAQ;AAAA,MACR,sBAAwB;AAAA,QACtB,MAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,aAAe;AAAA,MACb,MAAQ;AAAA,MACR,YAAc;AAAA,QACZ,SAAW;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,MAAQ;AAAA,UACR,OAAS;AAAA,QACX;AAAA,QACA,SAAW;AAAA,UACT,MAAQ;AAAA,QACV;AAAA,QACA,SAAW;AAAA,UACT,MAAQ;AAAA,UACR,sBAAwB;AAAA,YACtB,MAAQ;AAAA,UACV;AAAA,UACA,aAAe;AAAA,QACjB;AAAA,QACA,QAAU;AAAA,UACR,MAAQ;AAAA,UACR,aAAe;AAAA,QACjB;AAAA,MACF;AAAA,MACA,UAAY,CAAC,UAAU,SAAS;AAAA,IAClC;AAAA,EACF;AACF;;;AClQO,IAAM,SAAS;;;AHGf,SAAS,eAAe,cAA8B;AAC3D,QAAM,mBAAe,4BAAM,YAAY;AACvC,QAAM,MAAM,IAAI,eAAI;AACpB,QAAM,WAAW,IAAI,QAAQ,MAAM;AACnC,QAAM,UAAU,SAAS,YAAY;AACrC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAIC;AAAA,MACR,mBAAmB,IAAI,WAAW,SAAS,MAAM;AAAA,MACjD,EAAE,MAAM,UAAU,SAAS,wBAAwB;AAAA,IACrD;AAAA,EACF;AACA,SAAO;AACT;;;AvBJO,IAAM,uBAAN,cAAmC,eAAe;AAAA;AAAA;AAAA;AAAA,EAIvD,YACE,OAEI;AAAA,IACF,QAAQ;AAAA,EACV,GACM;AACN,UAAM,aAAa,kBAAkB;AAGrC,mBAAAC,QAAG,cAAU,2BAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACrD,mBAAAA,QAAG;AAAA,MACD;AAAA,MACA,KAAK;AAAA,QACH,KAAK,OAAO,aAAa;AAAA,QACzB;AAAA,QACC,KAAK,UAAU,OAAQ,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,YAAY;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIyB;AACvB,UAAM,YAAY,UAAU,eAAe,OAAO,IAAI;AACtD,QAAI,OAAO,WAAW,UAAU;AAC9B,aAAO,IAAI,qBAAqB;AAAA,QAC9B,QAAQ,qBAAqB,SAAS,MAAM;AAAA,QAC5C;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,OAAO,WAAW,UAAU;AAC9B,aAAO,IAAI,qBAAqB;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,IAAI;AAAA,MACR;AAAA,MACA,EAAE,MAAM,UAAU,SAAS,wBAAwB;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,QAAQ;AAAA,IACb;AAAA,IACA;AAAA,EACF,GAGyB;AACvB,WAAO,IAAI,qBAAqB;AAAA,MAC9B,QAAQ,qBAAqB,SAAS,uBAAuB,CAAC;AAAA,MAC9D,WAAW,eAAe,OAAO;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAS,QAAiC;AAC/C,QAAI,OAAO,WAAW,UAAU;AAC9B,YAAM,IAAI,eAAe,MAAM;AAC/B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAS;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIyB;AACvB,QAAI;AACF,YAAM,SAAS,eAAAA,QAAG,aAAa,UAAU,OAAO;AAChD,aAAO,IAAI,qBAAqB;AAAA,QAC9B,QAAQ,qBAAqB,SAAS,MAAM;AAAA,QAC5C,WAAW,UAAU,eAAe,OAAO,IAAI;AAAA,QAC/C;AAAA,MACF,CAAC;AAAA,IACH,SAAS,GAAP;AACA,YAAM,mBAAmB,OAAO,GAAG;AAAA,QACjC,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,mBAAmB;AAAA,IACxB;AAAA,IACA;AAAA,EACF,GAGyB;AACvB,QAAI;AACF,YAAM,SAAS,eAAAA,QAAG,aAAa,UAAU,OAAO;AAChD,YAAM,kBAAkB,qBAAqB,SAAS,MAAM;AAC5D,UAAI,CAAC,aAAa,eAAe,GAAG;AAClC,cAAM,IAAI;AAAA,UACR,GAAG;AAAA,UACH;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AACA,YAAM,CAAC,kBAAkB,IAAI,OAAO,QAAQ,gBAAgB,YAAY,EACrE,OAAO,CAAC,CAAC,EAAE,GAAG,MAAM,aAAa,GAAG,CAAC,EACrC,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AAEvB,UAAI,CAAC,oBAAoB;AACvB,cAAM,IAAI;AAAA,UACR;AAAA,UACA,EAAE,MAAM,UAAU,SAAS,yBAAyB;AAAA,QACtD;AAAA,MACF;AACA,aAAO,IAAI,qBAAqB;AAAA,QAC9B,QAAQ;AAAA,QACR;AAAA,QACA,MAAM,EAAE,SAAS,mBAAmB;AAAA,MACtC,CAAC;AAAA,IACH,SAAS,GAAP;AACA,YAAM,mBAAmB,OAAO,GAAG;AAAA,QACjC,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;A2B7KO,SAAS,sBAAsB,MAAoB;AAGxD,QAAM,EAAE,2BAA2B,yBAAyB,IAAI,QAAQ;AACxE,MACE,6BAA6B,UAC7B,8BAA8B,QAC9B;AACA,YAAQ,IAAI,4BAA4B;AAExC,YAAQ,IAAI,oDAAoD,MAAM;AAAA,EACxE;AACF;;;ACVO,SAAS,UAAU,MAAqD;AAC7E,QAAM,EAAE,MAAM,IAAI,IAAI;AAEtB,MAAI,IAAI,UAAU,GAAG;AACnB,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAGA,MACE,KAAK,gBAAgB,UACrB,KAAK,gBAAgB,IAAI,eAAe,GACxC;AAGA,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF,OAAO;AAEL,SAAK,cAAc,IAAI,IAAI,eAAe;AAAA,EAC5C;AAEA,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;ACvBO,SAASC,WAAU,MAAqD;AAN/E;AAOE,QAAM,EAAE,KAAK,IAAI;AAEjB,QAAI,UAAK,iBAAL,mBAAmB,wBAAuB,QAAW;AACvD,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,OAAK,eAAe,KAAK,gBAAgB,CAAC;AAC1C,OAAK,aAAa,qBAAqB;AAEvC,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;ACZO,SAASC,WAAU,MAAqD;AAC7E,QAAM,EAAE,MAAM,IAAI,IAAI;AAEtB,MAAI,IAAI,UAAU,GAAG;AACnB,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAyB;AAAA,IAC7B;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP;AAAA,UACE,KAAK;AAAA,UACL,OAAO,IAAI;AAAA,QACb;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,OAAO,IAAI;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,KAAK;AAAA,QACH;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,SAAS;AAAA,QACP;AAAA;AAAA;AAAA;AAAA,UAIE,KAAK;AAAA,UACL,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,KAAK,WAAW,OAAO,KAAK,YAAY,YAAY;AACtD,UAAM,oBAAoB,KAAK;AAC/B,SAAK,UAAU,YAAY;AACzB,YAAM,kBAAkB,MAAM,kBAAkB;AAChD,aAAO,CAAC,GAAG,iBAAiB,GAAG,YAAY;AAAA,IAC7C;AAAA,EACF,OAAO;AACL,SAAK,UAAU,MAAM;AACnB,aAAO,QAAQ,QAAQ,YAAY;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;ACxDO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AACF,GAGW;AACT,QAAM,WAAW,KAAK;AAAA,IACpB,QAAQ,IAAI,2BAA2B;AAAA,EACzC;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAGA,QAAM,gBAAgB,SAAS;AAAA,IAC7B,CAAC,YAAS;AA3Bd;AA4BM,qBAAQ,gBAAc,SAAI,WAAJ,mBAAY,cAClC,QAAQ,YAAY,IAAI;AAAA;AAAA,EAC5B;AAEA,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI;AAAA,MACR,+DAA+D,IAAI;AAAA,IACrE;AAAA,EACF;AAEA,SAAO,cAAc,QAAQ,MAAM;AACrC;;;AClCA,SAAS,aAAa,MAAc,KAAa,QAAsB;AACrE,MAAI,QAAQ,IAAI,cAAc,QAAQ;AACpC,UAAM,SAAS,IAAI,OAAO,CAAC;AAC3B,UAAM,SAAS;AACf,UAAM,YAAY,SAAI,OAAO,OAAO,MAAM;AAC1C,UAAM,OAAO,GAAG,aAAa,SAAS,WAAW;AAGjD,YAAQ,IAAI,GAAG,SAAS;AAAA,EAAW,SAAS;AAAA,EAAc;AAAA,CAAQ;AAAA,EACpE;AACF;AAOA,SAAS,wBAAqC;AAC5C,QAAM,gBACJ,CAAC,QAAQ,IAAI,cAAc,QAAQ,IAAI,eAAe;AACxD,QAAM,YAAY,QAAQ,IAAI,eAAe;AAC7C,QAAMC,gBAAe,QAAQ,IAAI,eAAe;AAEhD,MAAI,eAAe;AACjB,WAAO,EAAE,OAAO,cAAc;AAAA,EAChC,WAAWA,eAAc;AACvB,WAAO,EAAE,OAAO,aAAa;AAAA,EAC/B,WAAW,WAAW;AACpB,WAAO,EAAE,OAAO,UAAU;AAAA,EAC5B;AAEA,SAAO,EAAE,OAAO,UAAU,MAAM,QAAQ,IAAI,WAAW;AACzD;AAIO,SAAS,+BACd,QACA,SACQ;AA5CV;AA6CE,QAAM,MAAM,OAAO,eAAe,OAAO;AACzC,OAAI,SAAI,cAAJ,mBAAe,aAAa;AAC9B,WAAO,IAAI,UAAU,YAAY,SAAS;AAAA,EAC5C;AAEA,QAAM,EAAE,MAAM,IAAI,sBAAsB;AACxC,QAAM,iBAAiB,OAAO,sBAAsB,EAAE,WAAW,SAAS;AAC1E,UAAQ,OAAO;AAAA,IACb,KAAK,eAAe;AAGlB,YAAM,SACJ,QAAQ,IAAI,aAAa,SACrB,IAAI,YAAY,MAAM,SAAS,IAC/B;AACN,mBAAa,SAAS,eAAe,MAAM;AAC3C,aAAO;AAAA,IACT;AAAA,IACA,KAAK,WAAW;AACd,aAAO,yBAAyB,EAAE,KAAK,QAAQ,SAAS,CAAC;AAAA,IAC3D;AAAA,IACA,KAAK,cAAc;AACjB,aAAO,yBAAyB,EAAE,KAAK,QAAQ,aAAa,CAAC;AAAA,IAC/D;AAAA,IAEA,KAAK;AAEH,cAAQ;AAAA,QACN;AAAA,MACF;AACA,aAAO;AAAA,EACX;AACF;;;ACxEA,SAAS,cAAc,UAA2B;AAChD,MAAI,QAAQ,IAAI,cAAc,QAAQ;AACpC,UAAM,SAAS,IAAI,OAAO,CAAC;AAC3B,UAAM,SAAS;AACf,UAAM,YAAY,SAAI,OAAO,OAAO,MAAM;AAC1C,UAAM,kBAAkB,KAAK;AAAA,MAC3B,GAAG,SAAS,IAAI,CAAC,QAAQ,IAAI,OAAO,MAAM;AAAA,IAC5C;AACA,UAAM,QAAQ,SACX,IAAI,CAAC,OAAO,QAAQ;AACnB,YAAM,eAAe,MAAM,OAAO,OAAO,eAAe;AACxD,aAAO,GAAG,UAAU,MAAM,MAAM,wBAAmB,MAAM;AAAA,IAC3D,CAAC,EACA,KAAK,IAAI;AAGZ,YAAQ,IAAI,GAAG,SAAS;AAAA,EAAW,SAAS;AAAA,EAAc;AAAA,CAAS;AAAA,EACrE;AACF;AAEA,SAAS,eAAeC,OAAwB;AAzBhD;AA0BE,QAAM,QAAQ;AACd,QAAM,QAAQ,MAAM,KAAKA,KAAI;AAE7B,QAAM,QAAQ,CAACA,KAAI;AACnB,OAAI,oCAAO,WAAP,mBAAe,MAAM;AACvB,UAAM,QAAQ,MAAM,OAAO,IAAI;AAAA,EACjC;AAEA,SAAO;AACT;AAWA,SAAS,iBAAiB,UAAiD;AACzE,SAAO,MAAM,KAAK,SAAS,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,OAAO,MAAM;AACnE,UAAM,cAAc,GAAG,QAAQ,YAAY,UAAU,KAAK,QAAQ,YAAY;AAC9E,QAAI,WAAW;AAAa,aAAO,CAAC;AACpC,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEO,SAASC,WAAU,MAAqD;AAC7E,QAAM,EAAE,MAAM,eAAe,IAAI,IAAI;AAErC,QAAM,mBAAmB,MAAiB;AA9D5C;AA+DI,UAAM,WAAW,oBAAI,IAA2B;AAGhD,QAAI,CAAC,IAAI,UAAU,GAAG;AACpB,eAAS,IAAI,IAAI,IAAI,eAAe,kBAAkB;AAAA,QACpD,aAAa;AAAA,UACX,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAED,UAAI,GAAC,SAAI,WAAJ,mBAAY,kCAAiC;AAChD,iBAAS,IAAI,IAAI,IAAI,eAAe,oBAAoB;AAAA,UACtD,aAAa,EAAE,UAAU,kBAAkB;AAAA,QAC7C,CAAC;AAAA,MACH;AAAA,IAEF,WAAW,yBAAyB,yBAAyB;AAC3D,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO;AAAA,QAC1B,cAAc,qBAAqB;AAAA,MACrC,GAAG;AACD,cAAM,EAAE,QAAQ,IAAI;AACpB,cAAM,SAAS,+BAA+B,eAAe,EAAE,IAAI;AAEnE,iBAAS,IAAI,IAAI,EAAE,eAAe,YAAY;AAAA,UAC5C,aAAa;AAAA,YACX;AAAA,YACA,UAAU,IAAI,EAAE,eAAe;AAAA,UACjC;AAAA,QACF,CAAC;AAMD,mBAAW,SAAS,SAAS;AAE3B,cAAI,MAAM,2BAA2B;AAEnC;AAAA,UACF,WAAW,MAAM,MAAM;AAErB;AAAA,UACF,OAAO;AAEL,uBAAW,UAAU,MAAM,OAAO;AAChC,oBAAM,QAAQ,eAAe,MAAM;AACnC,yBAAW,KAAK,OAAO;AACrB,yBAAS,IAAI,GAAG;AAAA,kBACd,aAAa,EAAE,QAAQ,UAAU,EAAE;AAAA,gBACrC,CAAC;AAAA,cACH;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,iBAAiB,QAAQ;AAAA,EAClC;AAEA,QAAM,iBAAiB,iBAAiB;AACxC,MAAI,KAAK,YAAY,OAAO,KAAK,aAAa,YAAY;AAExD,UAAM,qBAAqB,KAAK;AAChC,SAAK,WAAW,YAAY;AAC1B,YAAM,mBAAmB,MAAM,mBAAmB;AAClD,UACE,OAAO,qBAAqB,YAC5B,CAAC,MAAM,QAAQ,gBAAgB,GAC/B;AACA,cAAM,EAAE,cAAc,CAAC,EAAE,IAAI;AAC7B,eAAO;AAAA,UACL,aAAa,CAAC,GAAG,gBAAgB,GAAG,WAAW;AAAA,UAC/C,YAAY,iBAAiB;AAAA,UAC7B,UAAU,iBAAiB;AAAA,QAC7B;AAAA,MACF;AACA,aAAO;AAAA,QACL,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,UAAU,CAAC;AAAA,MACb;AAAA,IACF;AAAA,EACF,OAAO;AAGL,SAAK,WAAW,aAAa;AAAA,MAC3B,aAAa;AAAA,MACb,YAAY,CAAC;AAAA,MACb,UAAU,CAAC;AAAA,IACb;AAAA,EACF;AAEA,gBAAc,cAAc;AAE5B,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;AC7JA,IAAM,8BAA8B,CAAC,WACnC,OAAO,QAAQ,eAAe,EAAE;AAE3B,SAASC,WAAU,MAAqD;AAP/E;AAQE,QAAM,EAAE,MAAM,KAAK,cAAc,IAAI;AAErC,MAAI,yBAAyB,0BAA0B;AAErD,YAAQ;AAAA,MACN;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAEA,QAAM,qBAAqB,cAAc,sBAAsB;AAC/D,QAAM,cAAc;AAAA;AAAA;AAAA,IAGlB;AAAA;AAAA;AAAA,IAGA;AAAA,EACF;AAGA,QAAM,8BAA6B,UAAK,iBAAL,mBAAmB;AACtD,OAAK,eAAe;AAAA,IAClB,GAAG,KAAK;AAAA,IACR,eAAe;AAAA,MACb,GAAG;AAAA,MACH,gBAAgB,MAAM;AAAA,QACpB,oBAAI,IAAI;AAAA,UACN,IAAI,yEAA4B,mBAAkB,CAAC;AAAA,UACnD,GAAG,YAAY,QAAQ,CAAC,MAAM;AAAA,YAC5B;AAAA,cACE,mBAAmB,WAAW,SAAS;AAAA,YACzC;AAAA,YACA;AAAA,cACE,+BAA+B,eAAe,EAAE,IAAI;AAAA,YACtD;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;ACjDO,SAASC,WAAU,MAAqD;AAC7E,QAAM,EAAE,MAAM,cAAc,IAAI;AAEhC,QAAM,oBAAgC;AAAA,IACpC,GAAG;AAAA,IACH,QAAQ,KAAK,SAAkB;AAG7B,YAAM,SACJ,OAAO,KAAK,YAAY,aAAa,KAAK,QAAQ,KAAK,OAAO,IAAI;AAIpE,YAAM,EAAE,UAAU,aAAa,SAAS,WAAW,IAAI;AAEvD,UAAI,YAAY,gBAAgB,QAAQ;AACtC,eAAO,QAAQ;AAAA,UACb,IAAK,WAA8B,kBAAkB;AAAA,YACnD,YAAY,KAAK,UAAU,cAAc,UAAU,CAAC;AAAA,UACtD,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO,QAAQ;AAAA;AAAA;AAAA,QAGb,IAAK,WAA8B;AAAA,UACjC;AAAA,UACA,CAAC,aAAa;AACZ,qBAAS,UAAU,SAAS,QAAQ,QAAQ,UAAU,EAAE;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AAMA,UAAI,CAAC,UAAU;AACb,eAAO,QAAQ,WAAW;AAAA,UACxB,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,GAAG,OAAO,QAAQ;AAAA,QACpB;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;;;AC5CO,IAAM,aAGT;AAAA,EACF,aAAa;AAAA,EACb,WAAWC;AAAA,EACX,SAASA;AAAA,EACT,UAAUA;AAAA,EACV,eAAeA;AAAA,EACf,SAASA;AACX;;;ACpBA,SAAS,SAAS,KAAmC;AACnD,MAAI,QAAQ,IAAI,cAAc,QAAQ;AACpC,UAAM,SAAS,IAAI,OAAO,CAAC;AAC3B,UAAM,SAAS;AACf,UAAM,YAAY,SAAI,OAAO,OAAO,MAAM;AAE1C,UAAM,eAAe,KAAK,IAAI,GAAG,OAAO,KAAK,GAAG,EAAE,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;AAC1E,UAAM,QAAQ,OAAO,KAAK,GAAG,EAC1B,IAAI,CAAC,KAAK,QAAQ;AACjB,YAAM,YAAY,IAAI,OAAO,YAAY;AACzC,aAAO,GAAG,UAAU,MAAM,MAAM,iBAAiB,IAAI,GAAG;AAAA,IAC1D,CAAC,EACA,KAAK,IAAI;AAGZ,YAAQ,IAAI,GAAG,SAAS;AAAA,EAAW,SAAS;AAAA,EAAc;AAAA,CAAS;AAAA,EACrE;AACF;AAWO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AACF,GAGS;AACP,QAAM,aAAa;AAAA,IACjB,qCAAqC,IAAI;AAAA,IACzC,+BAA+B,KAAK;AAAA,MAClC,eAAe,OAAO,eAAe,EAAE,UAAU;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,aAAqC;AAAA,IACzC,yBAAyB,IAAI;AAAA,IAC7B,YAAY,KAAK,UAAU,eAAe,OAAO,UAAU,CAAC;AAAA,EAC9D;AAEA,QAAM,UAAU,EAAE,GAAG,YAAY,GAAG,WAAW;AAG/C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AAClD,YAAQ,IAAI,GAAG,IAAI;AAAA,EACrB;AAGA,WAAS,OAAO;AAClB;;;AtCpDA,SAAS,aACP,KACyB;AACzB,SAAO,OAAO,QAAQ,GAAG;AAC3B;AAEA,SAAS,aAAa,MAA2C;AAC/D,MAAI,6BAAM,cAAc;AACtB,WAAO,KAAK,aAAa;AAAA,EAC3B;AAEA,SAAO,QAAQ,IAAI,eAAe;AACpC;AAOA,SAAS,sBAAsB,MAE7B;AACA,MAAI,6BAAM,SAAS;AACjB,WAAO,EAAE,MAAM,KAAK,QAAQ;AAAA,EAC9B;AAEA,MAAI;AAEF,UAAM,oBAAoB,gBAAAC,QAAG,aAAa,kBAAkB,OAAO;AACnE,UAAM,cAAc,KAAK,MAAM,iBAAiB;AAEhD,QAAI,CAAC,YAAY,MAAM;AACrB,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,UACT,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,MAAM,YAAY,KAAK;AAAA,EAClC,SAAS,KAAP;AACA,UAAM,mBAAmB,OAAO,KAAK;AAAA,MACnC,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AACF;AAMO,SAAS,mBACd,YACA,MACY;AAnEd;AAoEE,MAAI,6BAAM,OAAO;AACf,YAAQ,IAAI,YAAY;AAAA,EAC1B;AACA,QAAM,EAAE,MAAM,QAAQ,IAAI,sBAAsB,IAAI;AACpD,QAAM,iBAAiB,qBAAqB,SAAS;AAAA,IACnD,WAAU,6BAAM,eAAc;AAAA,IAC9B,MAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AAGD,QAAM,MAAM,eAAe,OAAO,eAAe,OAAO;AAGxD,iBAAe,EAAE,KAAK,eAAe,CAAC;AAEtC,MAAI,OAAO,EAAE,GAAG,WAAW;AAE3B,aAAW,CAAC,KAAKC,UAAS,KAAK,aAAa,UAAU,GAAG;AACvD,SAAI,kCAAM,mBAAN,mBAAsB,SAAS,MAAM;AAEvC,cAAQ,IAAI,YAAY,eAAe;AACvC;AAAA,IACF;AAEA,QAAI;AACF,YAAM,oBAAoBA,WAAU;AAAA,QAClC;AAAA,QACA;AAAA,QACA,eAAe,eAAe;AAAA,QAC9B,MAAM;AAAA,UACJ,cAAc,aAAa,IAAI;AAAA,QACjC;AAAA,MACF,CAAC;AACD,aAAO,kBAAkB;AAAA,IAC3B,SAAS,GAAP;AAEA,cAAQ,MAAM,kCAAkC,CAAC;AAAA,IACnD;AAAA,EACF;AAEA,wBAAsB,eAAe,OAAO,kBAAkB,CAAC;AAC/D,MAAI,SAAS,GAAG;AACd,mBAAe,YAAY;AAAA,EAC7B;AAEA,SAAO;AACT;","names":["import_node_fs","import_node_path","path","import_path_to_regexp","path","parsePathRegexp","_a","path","import_jsonc_parser","MicrofrontendError","MicrofrontendError","fs","transform","transform","isProduction","path","transform","transform","transform","transform","fs","transform"]}
|
package/dist/v2/next/config.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { NextConfig } from 'next';
|
|
|
2
2
|
|
|
3
3
|
type TransformKeys = 'assetPrefix' | 'draftMode' | 'headers' | 'rewrites' | 'serverActions' | 'webpack';
|
|
4
4
|
|
|
5
|
-
interface
|
|
5
|
+
interface WithMicrofrontendsOptions {
|
|
6
6
|
/**
|
|
7
7
|
* Explicitly set the name of the application instead of using the name from the package.json.
|
|
8
8
|
*/
|
|
@@ -15,8 +15,8 @@ interface WithMicroFrontendsOptions {
|
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* A function that wraps the next.config.js file to automatically configure zones
|
|
18
|
-
* based on the
|
|
18
|
+
* based on the microfrontends configuration.
|
|
19
19
|
*/
|
|
20
|
-
declare function
|
|
20
|
+
declare function withMicrofrontends(nextConfig: NextConfig, opts?: WithMicrofrontendsOptions): NextConfig;
|
|
21
21
|
|
|
22
|
-
export {
|
|
22
|
+
export { withMicrofrontends };
|