@trackunit/iris-app-sdk-vite 1.4.20 ā 1.4.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/package.json +4 -4
- package/migrations/entry.js.map +0 -1
- package/src/executors/build/executor.js.map +0 -1
- package/src/executors/serve/executor.js.map +0 -1
- package/src/executors/utils/accessTokenCache.js.map +0 -1
- package/src/executors/utils/checkCustomFields.js.map +0 -1
- package/src/executors/utils/customFieldsDegradedReminderPlugin.js.map +0 -1
- package/src/executors/utils/deepEqual.js.map +0 -1
- package/src/executors/utils/defaultViteConfig.js.map +0 -1
- package/src/executors/utils/devServerTiming.js.map +0 -1
- package/src/executors/utils/extensionLoaderCache.js.map +0 -1
- package/src/executors/utils/getTrackunitIrisAppVitePlugins.js.map +0 -1
- package/src/executors/utils/loadCssInjectedByJsPlugin.js.map +0 -1
- package/src/executors/utils/manifestCache.js.map +0 -1
- package/src/executors/utils/manifestLoader.js.map +0 -1
- package/src/executors/utils/manifestModuleLoader.js.map +0 -1
- package/src/executors/utils/resolveSdkVersion.js.map +0 -1
- package/src/index.js.map +0 -1
- package/src/svgSpriteInline.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
## 1.4.24 (2026-08-27)
|
|
2
|
+
|
|
3
|
+
### š§± Updated Dependencies
|
|
4
|
+
|
|
5
|
+
- Updated iris-app-build-utilities to 2.4.23
|
|
6
|
+
- Updated iris-app-api to 2.4.17
|
|
7
|
+
- Updated iris-app to 2.5.24
|
|
8
|
+
|
|
9
|
+
## 1.4.23 (2026-08-27)
|
|
10
|
+
|
|
11
|
+
### š§± Updated Dependencies
|
|
12
|
+
|
|
13
|
+
- Updated iris-app-build-utilities to 2.4.22
|
|
14
|
+
- Updated iris-app-api to 2.4.16
|
|
15
|
+
- Updated iris-app to 2.5.23
|
|
16
|
+
|
|
17
|
+
## 1.4.22 (2026-08-27)
|
|
18
|
+
|
|
19
|
+
### š§± Updated Dependencies
|
|
20
|
+
|
|
21
|
+
- Updated iris-app-build-utilities to 2.4.21
|
|
22
|
+
- Updated iris-app-api to 2.4.15
|
|
23
|
+
- Updated iris-app to 2.5.22
|
|
24
|
+
|
|
25
|
+
## 1.4.21 (2026-08-27)
|
|
26
|
+
|
|
27
|
+
### š§± Updated Dependencies
|
|
28
|
+
|
|
29
|
+
- Updated iris-app-build-utilities to 2.4.20
|
|
30
|
+
- Updated iris-app-api to 2.4.14
|
|
31
|
+
- Updated iris-app to 2.5.21
|
|
32
|
+
|
|
1
33
|
## 1.4.20 (2026-08-27)
|
|
2
34
|
|
|
3
35
|
### š§± Updated Dependencies
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trackunit/iris-app-sdk-vite",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.24",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
5
5
|
"repository": "https://github.com/Trackunit/manager",
|
|
6
6
|
"executors": "./executors.json",
|
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"rxjs": "7.8.1",
|
|
12
12
|
"win-ca": "^3.5.1",
|
|
13
|
-
"@trackunit/iris-app-build-utilities": "2.4.
|
|
14
|
-
"@trackunit/iris-app-api": "2.4.
|
|
13
|
+
"@trackunit/iris-app-build-utilities": "2.4.23",
|
|
14
|
+
"@trackunit/iris-app-api": "2.4.17",
|
|
15
15
|
"tslib": "^2.6.2",
|
|
16
16
|
"vite": "8.1.5",
|
|
17
17
|
"@module-federation/vite": "1.18.1",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"@tailwindcss/postcss": "^4.1.18",
|
|
23
23
|
"@vitejs/plugin-react-swc": "^4.3.2",
|
|
24
24
|
"@nx/devkit": "23.1.0",
|
|
25
|
-
"@trackunit/iris-app": "2.5.
|
|
25
|
+
"@trackunit/iris-app": "2.5.24",
|
|
26
26
|
"cross-keychain": "^1.1.0",
|
|
27
27
|
"jwt-decode": "^3.1.2"
|
|
28
28
|
},
|
package/migrations/entry.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/vite/migrations/entry.ts"],"names":[],"mappings":"","sourcesContent":["export {};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/build/executor.ts"],"names":[],"mappings":"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","sourcesContent":["import { ExecutorContext } from \"@nx/devkit\";\nimport { eachValueFrom } from \"@nx/devkit/internal\";\nimport {\n checkContentInsetAdoption,\n checkPackageVersion,\n enableTsConfigPath,\n} from \"@trackunit/iris-app-build-utilities\";\nimport { existsSync, rmSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport { Observable } from \"rxjs\";\nimport * as op from \"rxjs/operators\";\nimport \"win-ca\";\nimport { getDefaultViteConfig } from \"../utils/defaultViteConfig\";\nimport { closeManifestLoader, loadManifest } from \"../utils/manifestLoader\";\nimport { resolveSdkVersion } from \"../utils/resolveSdkVersion\";\nimport { BuildExecutorSchema } from \"./schema\";\n\nexport type NodeBuildEvent = {\n outfile: string;\n success: boolean;\n};\n\nconst deleteOutputDir = (root: string, outputPath: string) => {\n const resolvedOutputPath = resolve(root, outputPath);\n if (resolvedOutputPath === root) {\n throw new Error(\"Output path MUST not be project root directory!\");\n }\n rmSync(resolvedOutputPath, { recursive: true, force: true });\n};\n\n/**\n * Build executor for building Iris Apps with Vite.\n *\n * @param {BuildExecutorSchema} options build executor options for this nx executor\n * @param {ExecutorContext} context build executor context for this nx executor\n * @yields {NodeBuildEvent} the build event\n */\nexport default async function* buildExecutor(\n options: BuildExecutorSchema,\n context: ExecutorContext\n): AsyncGenerator<NodeBuildEvent> {\n await checkPackageVersion(false);\n const skipTypeChecking = options.skipTypeChecking ?? false;\n\n // eslint-disable-next-line @trackunit/no-typescript-assertion, @typescript-eslint/no-non-null-assertion\n const projectRoot = context.projectsConfigurations.projects[context.projectName!]!.root;\n const projectRootDir = join(context.root, projectRoot);\n\n // The app's own `vite.config.ts` is pulled in with a CommonJS `require` below,\n // which needs the TypeScript require hooks and the workspace's path aliases.\n enableTsConfigPath({ projectRootDir, workspaceRoot: context.root });\n\n // `loadManifest` lives in the shared loader module so specs can intercept the\n // import via `vi.mock(\"../utils/manifestLoader\", ...)`. Previously the\n // manifest was imported in-line via `await import(manifestPath)`, which Node's\n // resolver could not satisfy against the synthetic `/workspace/...` paths used\n // by the spec - the import threw before the spec's beforeEach `vi.mock(...)`\n // had any chance to intercept it.\n const IrisAppManifest = await loadManifest(context.root, projectRootDir);\n\n // Stamp the *installed* `@trackunit/iris-app` version (not the declared\n // range) so the host can decide content-inset behaviour from the published\n // manifest. Fail-soft: absent version keeps the legacy-inset default.\n const sdkVersion = resolveSdkVersion(projectRootDir);\n if (sdkVersion !== undefined) {\n IrisAppManifest.sdkVersion = sdkVersion;\n }\n // Advisory: warn when past the content-inset cutoff without `p-content-space`.\n checkContentInsetAdoption(sdkVersion, projectRootDir);\n\n const defaultConfig = await getDefaultViteConfig(\n \"production\",\n context.root,\n projectRootDir,\n IrisAppManifest,\n context,\n {\n skipTypeChecking,\n }\n );\n\n // Load optional custom config\n let finalConfig = defaultConfig;\n if (options.viteConfig || existsSync(join(projectRootDir, \"vite.config.ts\"))) {\n const customConfigFile = await import(options.viteConfig ?? join(projectRootDir, \"vite.config.ts\"));\n let customConfig = customConfigFile.default(defaultConfig);\n const isPromise = customConfig instanceof Promise;\n if (isPromise) {\n customConfig = await customConfig;\n }\n finalConfig = customConfig;\n }\n\n // Set output path\n finalConfig.build = {\n ...finalConfig.build,\n outDir: resolve(context.root, options.outputPath),\n emptyOutDir: true,\n };\n\n // Delete existing output\n deleteOutputDir(context.root, options.outputPath);\n\n if (context.isVerbose) {\n // eslint-disable-next-line no-console\n console.log(\"Using Vite config\", JSON.stringify(finalConfig.plugins, null, 2));\n }\n\n const observable = new Observable<NodeBuildEvent>(subscriber => {\n void (async () => {\n try {\n const { build } = await import(\"vite\");\n\n const buildResult = await build({ ...finalConfig, configFile: false });\n\n // Log build stats if available\n if (context.isVerbose) {\n // eslint-disable-next-line no-console\n console.log(\"Build completed:\", buildResult);\n }\n\n subscriber.next({\n success: true,\n outfile: resolve(context.root, options.outputPath),\n });\n subscriber.complete();\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"Vite build error:\", error);\n subscriber.next({\n success: false,\n outfile: resolve(context.root, options.outputPath),\n });\n subscriber.complete();\n }\n })();\n }).pipe(\n op.tap(({ success, outfile }) => {\n if (success) {\n // eslint-disable-next-line no-console\n console.info(`\\n ā
Iris App build completed: ${outfile}\\n`);\n } else {\n // eslint-disable-next-line no-console\n console.error(`\\n ā Iris App build failed\\n`);\n }\n }),\n // The loader holds a Vite server open; without this the process never exits.\n op.finalize(() => {\n void closeManifestLoader();\n })\n );\n\n return yield* eachValueFrom(observable);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/serve/executor.ts"],"names":[],"mappings":"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","sourcesContent":["import { ExecutorContext } from \"@nx/devkit\";\nimport { eachValueFrom } from \"@nx/devkit/internal\";\nimport { getSettings } from \"@trackunit/iris-app\";\nimport { IrisAppManifest } from \"@trackunit/iris-app-api\";\nimport {\n checkContentInsetAdoption,\n checkPackageVersion,\n enableTsConfigPath,\n spawnServersideExtensions,\n} from \"@trackunit/iris-app-build-utilities\";\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { Observable } from \"rxjs\";\nimport * as op from \"rxjs/operators\";\nimport \"win-ca\";\nimport { checkCustomFields } from \"../utils/checkCustomFields\";\nimport { getDefaultViteConfig } from \"../utils/defaultViteConfig\";\nimport { closeManifestLoader, loadManifest } from \"../utils/manifestLoader\";\nimport { resolveSdkVersion } from \"../utils/resolveSdkVersion\";\nimport { ServeExecutorSchema } from \"./schema\";\ntype ServeResult = { baseUrl: string; success: boolean };\n\n/**\n * Serve executor for serving Iris Apps with Vite.\n *\n * @param {ServeExecutorSchema} options serve executor options for this nx executor\n * @param {ExecutorContext} context serve executor context for this nx executor\n * @yields {ServeResult} the serve result\n */\nexport default async function* serveExecutor(\n options: ServeExecutorSchema,\n context: ExecutorContext\n): AsyncGenerator<ServeResult> {\n await checkPackageVersion(false);\n const settings = getSettings();\n const skipTypeChecking = options.skipTypeChecking ?? false;\n\n // eslint-disable-next-line @trackunit/no-typescript-assertion, @typescript-eslint/no-non-null-assertion\n const projectRoot = context.projectsConfigurations.projects[context.projectName!]!.root;\n const projectRootDir = join(context.root, projectRoot);\n\n // The app's own `vite.config.ts` is pulled in with a CommonJS `require` below,\n // which needs the TypeScript require hooks and the workspace's path aliases.\n enableTsConfigPath({ projectRootDir, workspaceRoot: context.root });\n\n // `loadManifest` lives in the shared loader module so specs can intercept the\n // import via `vi.mock(\"../utils/manifestLoader\", ...)`. Previously the\n // manifest was imported in-line via `await import(manifestPath)`, which Node's\n // resolver could not satisfy against the synthetic `/workspace/...` paths used\n // by the spec - the import threw before the spec's beforeEach `vi.mock(...)`\n // had any chance to intercept it.\n const irisAppManifest: IrisAppManifest = await loadManifest(context.root, projectRootDir);\n\n // Stamp the installed SDK version so serve's published /manifest.json matches\n // production builds (plugin also refreshes on emit after disk reloads).\n const sdkVersion = resolveSdkVersion(projectRootDir);\n if (sdkVersion !== undefined) {\n irisAppManifest.sdkVersion = sdkVersion;\n }\n // Advisory: warn when past the content-inset cutoff without `p-content-space`.\n checkContentInsetAdoption(sdkVersion, projectRootDir);\n\n const checkCustomFieldsResult = await checkCustomFields(irisAppManifest, settings);\n if (checkCustomFieldsResult === \"out-of-sync\") {\n throw new Error(\n \"Custom fields are out of sync with the latest approved manifest, which can cause the app to behave in unexpected ways. Please submit and get this version approved before you continue developing the app.\"\n );\n }\n if (checkCustomFieldsResult === \"not-submitted\") {\n throw new Error(\n \"Custom fields are not submitted, which can cause the app to behave in unexpected ways. Please submit and get this version approved before you continue developing the app.\"\n );\n }\n if (checkCustomFieldsResult === \"unverified\") {\n // The check could not be completed (network/auth/server failure). This is\n // non-fatal for local development: warn loudly and continue serving rather\n // than crashing. The underlying reason was already logged by checkCustomFields.\n // eslint-disable-next-line no-console\n console.warn(\n \"\\n ā ļø Custom-field in-sync check was skipped ā the latest approved manifest could not be verified \" +\n \"(see the warning above). The dev server will start, but your custom fields were NOT validated against the approved manifest. \" +\n \"If your local custom field definitions are out of sync, the app may behave in unexpected ways.\\n\"\n );\n }\n\n const serversideResult = await spawnServersideExtensions(irisAppManifest, context.root);\n\n try {\n // Get default config (internally imports @trackunit/iris-app-vite-plugin)\n const defaultConfig = await getDefaultViteConfig(\n \"development\",\n context.root,\n projectRootDir,\n irisAppManifest,\n context,\n {\n serversidePortMap: serversideResult.portMap,\n skipTypeChecking,\n // Surface a persistent rebuild reminder when the in-sync check was skipped.\n degraded: checkCustomFieldsResult === \"unverified\",\n }\n );\n\n // Load optional custom config\n let finalConfig = defaultConfig;\n if (options.viteConfig || existsSync(join(projectRootDir, \"vite.config.ts\"))) {\n const customConfigFile = await import(options.viteConfig ?? join(projectRootDir, \"vite.config.ts\"));\n let customConfig = customConfigFile.default(defaultConfig);\n const isPromise = customConfig instanceof Promise;\n if (isPromise) {\n customConfig = await customConfig;\n }\n finalConfig = customConfig;\n }\n\n // Apply port override if specified\n if (options.port !== undefined) {\n finalConfig.server = { ...finalConfig.server, port: options.port };\n }\n if (options.host) {\n finalConfig.server = { ...finalConfig.server, host: options.host };\n }\n\n if (context.isVerbose) {\n // eslint-disable-next-line no-console\n console.log(\"Using Vite config\", JSON.stringify(finalConfig.plugins, null, 2));\n }\n\n // Create and start Vite dev server\n const observable = new Observable<{ baseUrl: string; success: boolean }>(subscriber => {\n void (async () => {\n try {\n // Dynamic import vite to avoid issues\n const { createServer } = await import(\"vite\");\n\n const server = await createServer({ ...finalConfig, configFile: false });\n await server.listen();\n\n const address = server.httpServer?.address();\n const port = typeof address === \"object\" && address !== null ? address.port : (options.port ?? 22220);\n const host = options.host ?? \"localhost\";\n const baseUrl = `http://${host}:${port}`;\n\n subscriber.next({\n baseUrl,\n success: true,\n });\n\n // Keep alive - server continues running until interrupted\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"Vite server error:\", error);\n subscriber.error(error);\n }\n })();\n\n return () => {\n // Cleanup on unsubscribe - handled by Vite's signal handling\n };\n }).pipe(\n op.tap(({ baseUrl }) => {\n // eslint-disable-next-line no-console\n console.info(\n `\\n š Iris App dev server running at: ${baseUrl} for iris app: ${irisAppManifest.moduleFederationName}\\n`\n );\n }),\n op.map(({ baseUrl, success }) => ({\n baseUrl,\n success,\n })),\n op.finalize(() => {\n serversideResult.cleanup();\n void closeManifestLoader();\n })\n );\n\n return yield* eachValueFrom(observable);\n } catch (error) {\n serversideResult.cleanup();\n await closeManifestLoader();\n throw error;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"accessTokenCache.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/accessTokenCache.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Settings, getAccessToken } from \"@trackunit/iris-app\";\nimport { getPassword, setPassword } from \"cross-keychain\";\nimport jwtDecode from \"jwt-decode\";\n\nconst SERVICE = \"trackunit-iris-app-sdk\";\nconst SKEW_MS = 60_000;\n\ntype CachedTokenPayload = {\n readonly access_token: string;\n readonly token_type: string;\n readonly scope: string;\n readonly id_token: string;\n readonly expires_at: number;\n};\n\ntype TokenDataSuccess = {\n readonly token_type: string;\n readonly expires_in: number;\n readonly access_token: string;\n readonly scope: string;\n readonly id_token: string;\n};\n\n/**\n * Returns an access token, preferring a cached keychain entry when it is still\n * valid. Falls through to the interactive device-code login when the cache is\n * missing, expired, or unreadable, then persists the fresh token.\n *\n * CI paths (TU_TOKEN / TU_CLIENT_ID_*) bypass the cache entirely.\n */\nexport const getCachedAccessToken = async (settings: Settings): Promise<TokenDataSuccess> => {\n if (isCiEnvironment(settings.env)) {\n return unwrapTokenData(await getAccessToken(settings.env));\n }\n\n // on mac you can delete it using security delete-generic-password -s \"trackunit-iris-app-sdk\" -a \"iris-app-serve-access-token-LOCAL\"\n const account = `iris-app-serve-access-token-${settings.env}`;\n\n const cached = await safeReadToken(account);\n if (cached && cached.expires_at - SKEW_MS > Date.now()) {\n // eslint-disable-next-line no-console\n console.log(\"š Using cached access token from system keychain.\");\n return {\n access_token: cached.access_token,\n token_type: cached.token_type,\n scope: cached.scope,\n id_token: cached.id_token,\n expires_in: Math.max(0, Math.floor((cached.expires_at - Date.now()) / 1000)),\n };\n }\n\n const fresh = unwrapTokenData(await getAccessToken(settings.env));\n await safeStoreToken(account, {\n access_token: fresh.access_token,\n token_type: fresh.token_type,\n scope: fresh.scope,\n id_token: fresh.id_token,\n expires_at: computeExpiresAt(fresh),\n });\n\n return fresh;\n};\n\nconst isCiEnvironment = (env: string): boolean =>\n Boolean(process.env.TU_TOKEN) || Boolean(process.env[`TU_CLIENT_ID_${env}`]);\n\nconst unwrapTokenData = (tokenData: Awaited<ReturnType<typeof getAccessToken>>): TokenDataSuccess => {\n if (!(\"access_token\" in tokenData)) {\n if (\"error\" in tokenData && tokenData.error === \"expired_token\") {\n throw new Error(\"Authentication attempt expired\");\n }\n const description = \"error_description\" in tokenData ? ` ${tokenData.error_description}` : \"\";\n const errorName = \"error\" in tokenData ? tokenData.error : \"unknown\";\n throw new Error(`Failed to get access token: ${errorName}${description}`);\n }\n return tokenData;\n};\n\nconst computeExpiresAt = (token: TokenDataSuccess): number => {\n try {\n const decoded: unknown = jwtDecode(token.access_token);\n if (decoded !== null && typeof decoded === \"object\" && \"exp\" in decoded && typeof decoded.exp === \"number\") {\n return decoded.exp * 1000;\n }\n } catch {\n // JWT decode failed ā fall through to expires_in\n }\n return Date.now() + token.expires_in * 1000;\n};\n\nconst safeReadToken = async (account: string): Promise<CachedTokenPayload | undefined> => {\n try {\n const raw = await getPassword(SERVICE, account);\n if (!raw) {\n return undefined;\n }\n const parsed: unknown = JSON.parse(raw);\n if (!isValidCachedPayload(parsed)) {\n return undefined;\n }\n return parsed;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n // eslint-disable-next-line no-console\n console.warn(`ā ļø Could not read cached token from system keychain: ${reason}. Falling back to interactive login.`);\n return undefined;\n }\n};\n\nconst safeStoreToken = async (account: string, payload: CachedTokenPayload): Promise<void> => {\n try {\n await setPassword(SERVICE, account, JSON.stringify(payload));\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n // eslint-disable-next-line no-console\n console.warn(`ā ļø Could not cache access token in system keychain: ${reason}. Token will not be persisted.`);\n }\n};\n\nconst isValidCachedPayload = (value: unknown): value is CachedTokenPayload =>\n value !== null &&\n typeof value === \"object\" &&\n \"access_token\" in value &&\n typeof value.access_token === \"string\" &&\n \"expires_at\" in value &&\n typeof value.expires_at === \"number\" &&\n \"token_type\" in value &&\n typeof value.token_type === \"string\" &&\n \"scope\" in value &&\n typeof value.scope === \"string\" &&\n \"id_token\" in value &&\n typeof value.id_token === \"string\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checkCustomFields.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/checkCustomFields.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Settings } from \"@trackunit/iris-app\";\nimport { CustomFieldDefinition, IrisAppManifest, PublicIrisAppManifest } from \"@trackunit/iris-app-api\";\nimport { getCachedAccessToken } from \"./accessTokenCache\";\nimport { deepEqual } from \"./deepEqual\";\n\nexport type CheckCustomFieldsResult = \"in-sync\" | \"out-of-sync\" | \"not-submitted\" | \"unverified\";\n\n/**\n * Checks if the custom field definitions are in sync with the latest approved manifest.\n *\n * @param irisAppManifest - The iris app manifest.\n */\nexport const checkCustomFields = async (\n irisAppManifest: IrisAppManifest,\n settings: Settings\n): Promise<CheckCustomFieldsResult> => {\n const localFields = irisAppManifest.customFieldDefinitions ?? [];\n\n if (localFields.length === 0) {\n return \"in-sync\";\n }\n\n if (process.env.IGNORE_CUSTOM_FIELDS_CHECK === \"true\") {\n if (process.env.NODE_ENV === \"production\") {\n throw new Error(\n \"IGNORE_CUSTOM_FIELDS_CHECK is a local development escape hatch and cannot be used when NODE_ENV=production.\"\n );\n }\n // eslint-disable-next-line no-console\n console.warn(\n \"[checkCustomFields] IGNORE_CUSTOM_FIELDS_CHECK=true ā skipping custom-field approval check. \" +\n \"Local development only: deploys against unapproved custom-field definitions will be rejected by the SDK submit path.\"\n );\n return \"in-sync\";\n }\n\n // eslint-disable-next-line no-console\n console.log(\n \"This app is using custom fields, fetching the latest approved manifest to validate that the local custom field definitions are in sync.\"\n );\n // The in-sync check is advisory for local development: when it cannot be\n // completed (auth can't be obtained, the endpoint is unreachable, returns an\n // error, or sends back a malformed body) we degrade to \"unverified\" and let\n // the caller continue, rather than throwing and aborting `serve`. Genuine\n // \"the check ran and found a problem\" outcomes (out-of-sync / not-submitted)\n // are still returned below. Mirrors the warn-and-continue idiom in\n // accessTokenCache.ts.\n let latestApprovedManifestIfAny: PublicIrisAppManifest | null;\n try {\n const tokenData = await getCachedAccessToken(settings);\n\n latestApprovedManifestIfAny = await fetchLatestApprovedManifest(\n irisAppManifest.moduleFederationName,\n tokenData.access_token,\n settings\n );\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n // eslint-disable-next-line no-console\n console.warn(\n `[checkCustomFields] Could not verify custom fields against the latest approved manifest: ${reason}. ` +\n \"Skipping the in-sync check for this session and continuing ā your custom fields were NOT validated.\"\n );\n return \"unverified\";\n }\n\n if (!latestApprovedManifestIfAny) {\n return \"not-submitted\";\n }\n\n const approvedFields = latestApprovedManifestIfAny.customFieldDefinitions ?? [];\n\n // eslint-disable-next-line no-console\n console.log(\n `Latest approved manifest for ${irisAppManifest.moduleFederationName} has ${approvedFields.length} custom field definition(s).`\n );\n\n if (hasCustomFieldDrift(localFields, approvedFields)) {\n return \"out-of-sync\";\n }\n\n return \"in-sync\";\n};\n\nconst stripTranslations = (field: CustomFieldDefinition): Omit<CustomFieldDefinition, \"translations\"> => {\n const { translations, ...rest } = field;\n return rest;\n};\n\n/**\n * Returns true when the local and approved custom field sets differ.\n * The comparison is symmetric: added, removed, and modified fields are all detected.\n * Translations are excluded from the comparison.\n */\nconst hasCustomFieldDrift = (\n localFields: Array<CustomFieldDefinition>,\n approvedFields: Array<CustomFieldDefinition>\n): boolean => {\n if (localFields.length !== approvedFields.length) {\n return true;\n }\n\n return localFields.some(local => {\n const approved = approvedFields.find(a => a.key === local.key);\n if (!approved) {\n return true;\n }\n return !deepEqual(stripTranslations(local), stripTranslations(approved));\n });\n};\n\nconst LATEST_APPROVED_MANIFEST_QUERY = `query LatestApprovedManifest($irisAppId: String!) {\n manifest(irisAppId: $irisAppId)\n}`;\n\n/**\n * Fetches the latest approved public manifest for the given iris app id from the\n * internal GraphQL endpoint. Returns null if the app is not subscribed on the\n * caller's account or does not have an approved version yet.\n *\n * @param {string} irisAppId The iris app id, typically the manifest's moduleFederationName.\n * @param {string} accessToken The Trackunit access token to authenticate the request.\n * @param {Settings} settings The Iris App SDK settings.\n * @returns {Promise<PublicIrisAppManifest | null>} The latest approved manifest or null.\n */\nasync function fetchLatestApprovedManifest(\n irisAppId: string,\n accessToken: string,\n settings: Settings\n): Promise<PublicIrisAppManifest | null> {\n const response = await fetch(settings.graphqlInternalUrl.toString(), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${accessToken}`,\n },\n body: JSON.stringify({\n operationName: \"LatestApprovedManifest\",\n query: LATEST_APPROVED_MANIFEST_QUERY,\n variables: { irisAppId },\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch latest approved manifest: ${response.status} ${response.statusText} ${await response.text()}`\n );\n }\n\n const body: { data?: { manifest?: PublicIrisAppManifest | null }; errors?: Array<{ message: string }> } =\n await response.json();\n\n if (body.errors && body.errors.length > 0) {\n throw new Error(`GraphQL error fetching latest approved manifest: ${body.errors.map(e => e.message).join(\", \")}`);\n }\n\n // A well-formed response always carries the `manifest` field (possibly null\n // when the app has no approved version yet). Anything else means we cannot\n // trust the result, so treat it as a failed fetch (ā \"unverified\" upstream)\n // rather than misreporting it as \"not-submitted\".\n if (!body.data || !(\"manifest\" in body.data)) {\n throw new Error(`Malformed response fetching latest approved manifest: missing data.manifest in ${JSON.stringify(body)}`);\n }\n\n return body.data.manifest ?? null;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"customFieldsDegradedReminderPlugin.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/customFieldsDegradedReminderPlugin.ts"],"names":[],"mappings":";;;AAEA;;;;;;;GAOG;AACU,QAAA,+BAA+B,GAC1C,gHAAgH;IAChH,+HAA+H,CAAC;AAUlI;;;;;;;;;GASG;AACI,MAAM,wCAAwC,GAAG,CAAC,QAAiB,EAA0B,EAAE,CAAC,CAAC;IACtG,IAAI,EAAE,oDAAoD;IAC1D,eAAe,EAAE,GAAG,EAAE;QACpB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QACD,sCAAsC;QACtC,OAAO,CAAC,IAAI,CAAC,uCAA+B,CAAC,CAAC;IAChD,CAAC;CACF,CAAC,CAAC;AATU,QAAA,wCAAwC,4CASlD","sourcesContent":["import type { Plugin } from \"vite\";\n\n/**\n * Reminder re-emitted on every rebuild / hot-update while the custom-field\n * in-sync check is in a degraded state (Phase 1's `\"unverified\"` outcome).\n *\n * Kept short and consistent with the verbose startup warning in the serve\n * executor so that a long-running session keeps reminding the developer their\n * custom fields were never validated against the approved manifest.\n */\nexport const CUSTOM_FIELDS_DEGRADED_REMINDER =\n \"ā ļø Reminder: the custom-field in-sync check was skipped this session ā your custom fields were NOT validated \" +\n \"against the approved manifest. If your local custom field definitions are out of sync, the app may behave in unexpected ways.\";\n\n/**\n * A `Plugin` whose `handleHotUpdate` takes no arguments (it only logs). The\n * narrowed hook signature keeps the factory's return type explicit while\n * staying assignable to Vite's `Plugin`, and lets callers invoke the hook\n * directly in tests without constructing an `HmrContext`.\n */\ntype DegradedReminderPlugin = Plugin & { handleHotUpdate: () => void };\n\n/**\n * Vite plugin that re-logs the degraded custom-field warning on every hot\n * update / rebuild, so the one-time startup warning isn't forgotten during a\n * long serve session. The hook is a no-op unless `degraded` is true.\n *\n * State is injected via the factory argument (rather than read from a global)\n * so the plugin is unit-testable without a running Vite server.\n *\n * @param degraded whether the custom-field check ended in the `\"unverified\"` state.\n */\nexport const createCustomFieldsDegradedReminderPlugin = (degraded: boolean): DegradedReminderPlugin => ({\n name: \"trackunit-iris-app-custom-fields-degraded-reminder\",\n handleHotUpdate: () => {\n if (!degraded) {\n return;\n }\n // eslint-disable-next-line no-console\n console.warn(CUSTOM_FIELDS_DEGRADED_REMINDER);\n },\n});\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deepEqual.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/deepEqual.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACI,MAAM,SAAS,GAAG,CAAC,CAAU,EAAE,CAAU,EAAW,EAAE;IAC3D,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC/E,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAA,iBAAS,EAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,8DAA8D;IAC9D,MAAM,IAAI,GAAG,CAA4B,CAAC;IAC1C,8DAA8D;IAC9D,MAAM,IAAI,GAAG,CAA4B,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAA,iBAAS,EAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC;AA1BW,QAAA,SAAS,aA0BpB","sourcesContent":["/**\n * Deeply compares two values for equality.\n *\n * @param a - The first value to compare.\n * @param b - The second value to compare.\n * @returns {boolean} - true if the values are equal, false otherwise.\n */\nexport const deepEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) {\n return true;\n }\n if (a === null || b === null || typeof a !== \"object\" || typeof b !== \"object\") {\n return false;\n }\n if (Array.isArray(a) !== Array.isArray(b)) {\n return false;\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n return a.every((item, i) => deepEqual(item, b[i]));\n }\n // eslint-disable-next-line @trackunit/no-typescript-assertion\n const aObj = a as Record<string, unknown>;\n // eslint-disable-next-line @trackunit/no-typescript-assertion\n const bObj = b as Record<string, unknown>;\n const aKeys = Object.keys(aObj);\n const bKeys = Object.keys(bObj);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n return aKeys.every(key => deepEqual(aObj[key], bObj[key]));\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"defaultViteConfig.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/defaultViteConfig.ts"],"names":[],"mappings":";;;AAIA,2DAAwD;AACxD,qFAAkF;AAElF,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAClD,MAAM,yBAAyB,GAAG,KAAK,gBAAgB,EAAE,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAiB;IACvC,IAAI,EAAE,wBAAwB;IAC9B,SAAS,CAAC,EAAU;QAClB,IAAI,EAAE,KAAK,gBAAgB,EAAE,CAAC;YAC5B,OAAO,yBAAyB,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,EAAU;QACb,IAAI,EAAE,KAAK,yBAAyB,EAAE,CAAC;YACrC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AASF;;;;;;;;;GASG;AACI,MAAM,oBAAoB,GAAG,KAAK,EACvC,IAAkC,EAClC,SAAiB,EACjB,MAAc,EACd,eAAgC,EAChC,OAAwB,EACxB,UAAuC,EAAE,EACpB,EAAE;IACvB,6DAA6D;IAE7D,MAAM,cAAc,GAAG,MAAM,IAAA,+DAA8B,EAAC;QAC1D,MAAM;QACN,aAAa,EAAE,SAAS;QACxB,iFAAiF;QACjF,gFAAgF;QAChF,2EAA2E;QAC3E,QAAQ,EAAE,eAAe;QACzB,MAAM,EAAE,EAAE,IAAI,EAAE;QAChB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI;QACJ,OAAO,EAAE,CAAC,IAAA,iCAAe,GAAE,EAAE,GAAG,cAAc,EAAE,kBAAkB,CAAC;QACnE,mCAAmC;QACnC,YAAY,EAAE;YACZ,mEAAmE;YACnE,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,mBAAmB,CAAC;YACpD,eAAe,EAAE;gBACf,SAAS,EAAE;oBACT,MAAM,EAAE,QAAQ;iBACjB;aACF;SACF;QACD,KAAK,EAAE;YACL,MAAM,EAAE,aAAa,OAAO,CAAC,WAAW,EAAE;YAC1C,WAAW,EAAE,IAAI;YACjB,+DAA+D;YAC/D,MAAM,EAAE,QAAQ;YAChB,2EAA2E;YAC3E,4DAA4D;YAC5D,MAAM,EAAE,KAAK;YACb,sDAAsD;YACtD,SAAS,EAAE,KAAK;YAChB,oCAAoC;YACpC,qBAAqB,EAAE,IAAI;YAC3B,8DAA8D;YAC9D,SAAS,EAAE,EAAE;YACb,2EAA2E;YAC3E,oEAAoE;YACpE,aAAa,EAAE;gBACb,KAAK,EAAE,gBAAgB;gBACvB,mEAAmE;gBACnE,MAAM,EAAE;oBACN,mCAAmC;oBACnC,MAAM,EAAE,KAAK;oBACb,6CAA6C;oBAC7C,cAAc,EAAE,WAAW;oBAC3B,mBAAmB;oBACnB,cAAc,EAAE,kBAAkB;oBAClC,gBAAgB;oBAChB,cAAc,EAAE,+BAA+B;iBAChD;aACF;SACF;KACF,CAAC;AACJ,CAAC,CAAC;AArEW,QAAA,oBAAoB,wBAqE/B","sourcesContent":["import { ExecutorContext } from \"@nx/devkit\";\nimport type { IrisAppManifest } from \"@trackunit/iris-app-api\";\nimport type { ServersidePortMap } from \"@trackunit/iris-app-build-utilities\";\nimport type { PluginOption, UserConfig } from \"vite\";\nimport { svgSpriteInline } from \"../../svgSpriteInline\";\nimport { getTrackunitIrisAppVitePlugins } from \"./getTrackunitIrisAppVitePlugins\";\n\nconst VIRTUAL_ENTRY_ID = \"virtual:iris-app-entry\";\nconst RESOLVED_VIRTUAL_ENTRY_ID = `\\0${VIRTUAL_ENTRY_ID}`;\n\n/**\n * Rollup plugin providing a virtual empty entry module.\n * Iris apps use Module Federation which generates remoteEntry.js as the real entry,\n * so we just need a no-op input to satisfy Rollup's requirement for an entry point.\n * Using a virtual module avoids tsconfig path resolution issues that occur when\n * referencing physical files inside node_modules.\n */\nconst virtualEntryPlugin: PluginOption = {\n name: \"iris-app-virtual-entry\",\n resolveId(id: string) {\n if (id === VIRTUAL_ENTRY_ID) {\n return RESOLVED_VIRTUAL_ENTRY_ID;\n }\n return null;\n },\n load(id: string) {\n if (id === RESOLVED_VIRTUAL_ENTRY_ID) {\n return \"\";\n }\n return null;\n },\n};\n\ntype GetDefaultViteConfigOptions = {\n serversidePortMap?: ServersidePortMap;\n skipTypeChecking?: boolean;\n /** When true, register the plugin that re-warns about the skipped custom-field check on each rebuild. */\n degraded?: boolean;\n};\n\n/**\n * Gets the default Vite config for Iris Apps.\n *\n * @param mode - \"production\" or \"development\"\n * @param nxRootDir - the root of the nx workspace\n * @param appDir - the app directory\n * @param irisAppManifest - the iris app manifest (may already carry a stamped `sdkVersion`)\n * @param context - NX executor context\n * @returns {Promise<UserConfig>} the default Vite config\n */\nexport const getDefaultViteConfig = async (\n mode: \"production\" | \"development\",\n nxRootDir: string,\n appDir: string,\n irisAppManifest: IrisAppManifest,\n context: ExecutorContext,\n options: GetDefaultViteConfigOptions = {}\n): Promise<UserConfig> => {\n // Dynamic import - safe after enableTsConfigPath() is called\n\n const irisAppPlugins = await getTrackunitIrisAppVitePlugins({\n appDir,\n workspaceRoot: nxRootDir,\n // Pass the executor-loaded (and possibly sdkVersion-stamped) manifest through so\n // federation config and the first emit seed share one object ā the plugin still\n // refreshes `sdkVersion` on every generateManifestJson after disk reloads.\n manifest: irisAppManifest,\n config: { mode },\n serversidePortMap: options.serversidePortMap,\n skipTypeChecking: options.skipTypeChecking,\n degraded: options.degraded,\n });\n\n return {\n root: appDir,\n mode,\n plugins: [svgSpriteInline(), ...irisAppPlugins, virtualEntryPlugin],\n // Optimize dependency pre-bundling\n optimizeDeps: {\n // Force include common dependencies to speed up dev server startup\n include: [\"react\", \"react-dom\", \"react/jsx-runtime\"],\n rolldownOptions: {\n transform: {\n target: \"esnext\",\n },\n },\n },\n build: {\n outDir: `dist/apps/${context.projectName}`,\n emptyOutDir: true,\n // Target modern browsers - faster builds, no legacy transforms\n target: \"esnext\",\n // Vite 8's default minifier. \"esbuild\" would require esbuild as a separate\n // install, which generated Iris app workspaces do not have.\n minify: \"oxc\",\n // Disable source maps in production for faster builds\n sourcemap: false,\n // Increase chunk size warning limit\n chunkSizeWarningLimit: 1000,\n // Put remoteEntry.js at root (not in assets/) to match rspack\n assetsDir: \"\",\n // Use JavaScript entry instead of index.html for Module Federation remotes\n // The MF plugin generates remoteEntry.js as the actual bundle entry\n rollupOptions: {\n input: VIRTUAL_ENTRY_ID,\n // Preserve the entry file name for Module Federation compatibility\n output: {\n // ESM format for Module Federation\n format: \"esm\",\n // Entry files at root level (same as rspack)\n entryFileNames: \"[name].js\",\n // Chunks with hash\n chunkFileNames: \"[name]-[hash].js\",\n // Static assets\n assetFileNames: \"static/[name]-[hash][extname]\",\n },\n },\n },\n };\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"devServerTiming.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/devServerTiming.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IncomingMessage, ServerResponse } from \"node:http\";\n\n// ---------------------------------------------------------------------------\n// Dev-server timing instrumentation\n//\n// Lightweight, zero-dependency timing logs for the Iris-app dev server.\n// Disabled by default; opt in with IRIS_TIMING=true. Logs to stdout with the\n// \"[iris-timing]\" prefix so they're easy to grep / filter.\n//\n// Each log line looks like:\n// [iris-timing] T+<elapsed_since_module_load> <duration> <label>\n//\n// Durations >1000ms are highlighted red, >200ms yellow, so the slow stuff\n// jumps out in a typical terminal. Per-request lines below the\n// TRANSFORM_LOG_THRESHOLD_MS are dropped to keep the output usable.\n// ---------------------------------------------------------------------------\n\n// Read lazily so tests / users can flip IRIS_TIMING at runtime.\n// Disabled by default; set IRIS_TIMING=true to enable.\nconst isTimingEnabled = (): boolean => process.env.IRIS_TIMING === \"true\";\nconst TRANSFORM_LOG_THRESHOLD_MS = 50;\nconst TIMING_MODULE_START = performance.now();\n\nconst padMs = (ms: number): string => `${ms.toFixed(0).padStart(6, \" \")}ms`;\nconst colorize = (ms: number, text: string): string => {\n if (ms > 1000) return `\\x1b[31m${text}\\x1b[0m`; // red\n if (ms > 200) return `\\x1b[33m${text}\\x1b[0m`; // yellow\n return text;\n};\n\n/**\n * Logs a single timing line: elapsed-since-module-load, duration, and label.\n * Slow durations are colorized so they stand out in the terminal.\n */\nexport const logTiming = (durationMs: number, label: string): void => {\n if (!isTimingEnabled()) return;\n const elapsed = padMs(performance.now() - TIMING_MODULE_START);\n const dur = colorize(durationMs, padMs(durationMs));\n // eslint-disable-next-line no-console\n console.log(`\\x1b[36m[iris-timing]\\x1b[0m T+${elapsed} ${dur} ${label}`);\n};\n\n/**\n * Logs a non-timed event (no duration column), e.g. \"server: listening\".\n * Useful for marking moments in the dev-server lifecycle.\n */\nexport const logEvent = (label: string): void => {\n if (!isTimingEnabled()) return;\n const elapsed = padMs(performance.now() - TIMING_MODULE_START);\n // eslint-disable-next-line no-console\n console.log(`\\x1b[36m[iris-timing]\\x1b[0m T+${elapsed} ${label}`);\n};\n\n/** Wraps a synchronous function and logs its duration. */\nexport const time = <TResult>(label: string, fn: () => TResult): TResult => {\n if (!isTimingEnabled()) return fn();\n const start = performance.now();\n try {\n return fn();\n } finally {\n logTiming(performance.now() - start, label);\n }\n};\n\n/** Wraps an async function and logs its duration. */\nexport const timeAsync = async <TResult>(label: string, fn: () => Promise<TResult> | TResult): Promise<TResult> => {\n if (!isTimingEnabled()) return fn();\n const start = performance.now();\n try {\n return await fn();\n } finally {\n logTiming(performance.now() - start, label);\n }\n};\n\n/**\n * Shortens long absolute paths to a workspace-relative form for log lines.\n * \"/@fs/Users/mta/.../manager1/libs/css/core/src/lib/core.css\"\n * -> \"libs/css/core/src/lib/core.css\"\n */\nexport const shortenPath = (urlOrPath: string): string => {\n const idx = urlOrPath.indexOf(\"/manager1/\");\n if (idx >= 0) return urlOrPath.substring(idx + \"/manager1/\".length);\n const fsPrefix = \"/@fs/\";\n if (urlOrPath.startsWith(fsPrefix)) return urlOrPath.substring(fsPrefix.length);\n return urlOrPath;\n};\n\n/**\n * Logs the total server-side response time per request via the `finish` event,\n * which fires once the response has been fully written. This corresponds to\n * the `wait` time you see in browser network panels.\n *\n * Combined with the per-handler timings inside our own middleware, it lets us\n * see whether slowness is in our code or in downstream Vite work (transforms,\n * optimizeDeps, etc).\n */\nexport const wrapResponseTiming = (req: IncomingMessage, res: ServerResponse): void => {\n if (!isTimingEnabled()) return;\n const start = performance.now();\n res.on(\"finish\", () => {\n const durationMs = performance.now() - start;\n if (durationMs >= TRANSFORM_LOG_THRESHOLD_MS) {\n const url = req.url ?? \"(no url)\";\n logTiming(durationMs, `${req.method ?? \"GET\"} ${shortenPath(url)}`);\n }\n });\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extensionLoaderCache.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/extensionLoaderCache.ts"],"names":[],"mappings":";;;AAAA,uDAAwD;AAgBxD,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAErC;;;;;;;;;;;;;GAaG;AACI,MAAM,0BAA0B,GAAG,CAAC,EACzC,MAAM,EACN,KAAK,GAAG,cAAc,EACtB,iBAAiB,GACQ,EAAwB,EAAE;IACnD,IAAI,MAAM,GAA4D,IAAI,CAAC;IAC3E,IAAI,QAAQ,GAAkD,IAAI,CAAC;IAEnE,MAAM,4BAA4B,GAAG,KAAK,IAAqB,EAAE;QAC/D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,MAAM,MAAM,GAAG,iBAAiB,EAAE,EAAE,KAAK,IAAI,CAAC;QAC9C,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,GAAG,KAAK,EAAE,CAAC;YACvF,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC;YAC/B,OAAO,OAAO,CAAC,IAAI,CAAC;QACtB,CAAC;QAED,MAAM,YAAY,GAAG,CAAC,KAAK,IAA4C,EAAE;YACvE,IAAA,0BAAQ,EAAC,qCAAqC,GAAG,GAAG,CAAC,CAAC;YACtD,MAAM,IAAI,GAAG,MAAM,IAAA,2BAAS,EAAC,SAAS,GAAG,EAAE,EAAE,KAAK,IAAI,EAAE;gBACtD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;gBACzE,CAAC;gBACD,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,MAAM,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC9C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACvB,CAAC,CAAC,EAAE,CAAC;QACL,QAAQ,GAAG,YAAY,CAAC;QAExB,gFAAgF;QAChF,8EAA8E;QAC9E,0EAA0E;QAC1E,MAAM,2BAA2B,GAAG,GAAS,EAAE;YAC7C,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;gBAC9B,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QACF,YAAY,CAAC,IAAI,CAAC,2BAA2B,EAAE,2BAA2B,CAAC,CAAC;QAE5E,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC;QACnC,OAAO,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC,CAAC;IAEF,OAAO,EAAE,4BAA4B,EAAE,CAAC;AAC1C,CAAC,CAAC;AAlDW,QAAA,0BAA0B,8BAkDrC","sourcesContent":["import { logEvent, timeAsync } from \"./devServerTiming\";\n\ninterface ExtensionLoaderCacheDeps {\n /** Returns the URL to fetch the extension loader from. Re-evaluated on every read so it can change at runtime. */\n getUrl: () => string;\n /** TTL in milliseconds for the cached body. Defaults to 5 minutes. */\n ttlMs?: number;\n /** When true, bypass the cache for this read; inflight dedup still applies. Defaults to never bypass. */\n shouldBypassCache?: () => boolean;\n}\n\nexport interface ExtensionLoaderCache {\n /** Fetches the extension loader script body. Caches with TTL and dedupes concurrent fetches. */\n getCachedExtensionLoaderBody: () => Promise<string>;\n}\n\nconst DEFAULT_TTL_MS = 5 * 60 * 1000;\n\n/**\n * Creates an in-memory cache for the /extensionloader.js script.\n *\n * The /extensionloader.js handler proxies to https://iris.trackunit.app\n * (or http://localhost:3000 when LOCAL=true). Without caching, every page\n * load triggers a fresh network fetch -- and during a single cold load Vite\n * typically reloads the page 2-3 times (because of optimizeDeps cascades),\n * so the upstream is hit 3+ times. HAR profiling showed individual fetches\n * costing 200ms-5s+ depending on CDN health, and one trace recorded a single\n * ~5.2s fetch as the dominant gap in the dev waterfall.\n *\n * The script changes very rarely, so we cache it in memory with a TTL and\n * dedupe concurrent fetches.\n */\nexport const createExtensionLoaderCache = ({\n getUrl,\n ttlMs = DEFAULT_TTL_MS,\n shouldBypassCache,\n}: ExtensionLoaderCacheDeps): ExtensionLoaderCache => {\n let cached: { url: string; body: string; fetchedAt: number } | null = null;\n let inflight: Promise<{ url: string; body: string }> | null = null;\n\n const getCachedExtensionLoaderBody = async (): Promise<string> => {\n const url = getUrl();\n const now = Date.now();\n\n const bypass = shouldBypassCache?.() === true;\n if (!bypass && cached !== null && cached.url === url && now - cached.fetchedAt < ttlMs) {\n return cached.body;\n }\n if (inflight !== null) {\n const settled = await inflight;\n return settled.body;\n }\n\n const fetchPromise = (async (): Promise<{ url: string; body: string }> => {\n logEvent(`extensionloader cache: cold load (${url})`);\n const body = await timeAsync(`fetch ${url}`, async () => {\n const resp = await fetch(url);\n if (!resp.ok) {\n throw new Error(`upstream returned ${resp.status} ${resp.statusText}`);\n }\n return resp.text();\n });\n cached = { url, body, fetchedAt: Date.now() };\n return { url, body };\n })();\n inflight = fetchPromise;\n\n // Clear the inflight pointer once the fetch settles. Use then(cleanup, cleanup)\n // instead of finally() so a rejection isn't re-thrown from this side-channel;\n // the caller still observes the rejection via the awaited `fetchPromise`.\n const clearInflightIfStillCurrent = (): void => {\n if (inflight === fetchPromise) {\n inflight = null;\n }\n };\n fetchPromise.then(clearInflightIfStillCurrent, clearInflightIfStillCurrent);\n\n const fetched = await fetchPromise;\n return fetched.body;\n };\n\n return { getCachedExtensionLoaderBody };\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getTrackunitIrisAppVitePlugins.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/getTrackunitIrisAppVitePlugins.ts"],"names":[],"mappings":"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","sourcesContent":["import { federation } from \"@module-federation/vite\";\nimport { nxViteTsPaths } from \"@nx/vite/plugins/nx-tsconfig-paths.plugin\";\nimport type { Exposes, IrisAppManifest, Shared } from \"@trackunit/iris-app-api\";\nimport {\n CopyPattern,\n createInvokeProxyMiddleware,\n enableTsConfigPath,\n getAvailablePort,\n getCopyPatterns,\n getExposedExtensions,\n getSharedDependencies,\n injectFullDescriptionImages,\n logInfo,\n ServersidePortMap,\n updateCustomFields,\n updateExtensions,\n updateIndexHtml,\n} from \"@trackunit/iris-app-build-utilities\";\nimport react from \"@vitejs/plugin-react-swc\";\nimport * as fs from \"node:fs\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport * as path from \"node:path\";\nimport { mergeConfig, type PluginOption, type ResolvedConfig, type UserConfig, type ViteDevServer } from \"vite\";\nimport checker from \"vite-plugin-checker\";\nimport { createCustomFieldsDegradedReminderPlugin } from \"./customFieldsDegradedReminderPlugin\";\nimport { logEvent, logTiming, shortenPath, timeAsync, wrapResponseTiming } from \"./devServerTiming\";\nimport { createExtensionLoaderCache } from \"./extensionLoaderCache\";\nimport { loadCssInjectedByJsPlugin } from \"./loadCssInjectedByJsPlugin\";\nimport { createManifestCache } from \"./manifestCache\";\nimport { invalidateManifestSource, loadManifestWithSources } from \"./manifestLoader\";\nimport { resolveSdkVersion } from \"./resolveSdkVersion\";\n\n// Only import enableTsConfigPath statically - other utilities are dynamically imported\n// AFTER tsconfig paths are registered to avoid oxc analysis warnings\n\n// MIME types for serving extension assets during development\nconst MIME_TYPES: Record<string, string> = {\n \".svg\": \"image/svg+xml\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".ico\": \"image/x-icon\",\n};\n\nconst getMimeType = (filePath: string): string =>\n MIME_TYPES[path.extname(filePath).toLowerCase()] || \"application/octet-stream\";\n\n/**\n * Resolves a URL path like \"/{extensionId}/assets/icon.svg\" to the actual file path on disk.\n * Returns null if no matching extension is found or the file doesn't exist.\n */\nconst resolveExtensionAsset = (url: string, manifest: IrisAppManifest, workspaceRoot: string): string | null => {\n for (const ext of manifest.extensions) {\n if (url.startsWith(`/${ext.id}/`)) {\n const assetPath = url.substring(ext.id.length + 2);\n const filePath = path.join(workspaceRoot, ext.sourceRoot, assetPath);\n\n if (fs.existsSync(filePath) && fs.statSync(filePath).isFile()) {\n return filePath;\n }\n }\n }\n return null;\n};\n\ninterface TrackunitIrisAppVitePluginOptions {\n appDir: string;\n /** Path to the workspace root (where tsconfig.base.json is located) */\n workspaceRoot?: string;\n /**\n * Manifest already loaded by the build/serve executor (optionally with a stamped\n * `sdkVersion`). When omitted the plugin loads from disk itself ā tests and\n * direct callers use that path.\n */\n manifest?: IrisAppManifest;\n serversidePortMap?: ServersidePortMap;\n config: UserConfig;\n skipTypeChecking?: boolean;\n /** When true, register the plugin that re-warns about the skipped custom-field check on each rebuild. */\n degraded?: boolean;\n}\n\ninterface ViteSharedConfig {\n [key: string]: {\n singleton?: boolean;\n eager?: boolean;\n requiredVersion?: string;\n /** When false, the shared dependency is NOT bundled - it's loaded from the host at runtime */\n import?: false;\n };\n}\n\ninterface ViteExposesConfig {\n [key: string]: string;\n}\n\n// Flag to track if tsconfig paths have been registered\nlet tsconfigPathsRegistered = false;\n\n/**\n * Registers tsconfig paths for resolving @trackunit/* imports at runtime.\n * This is needed because the manifest file imports from @trackunit/* packages.\n */\nconst registerTsConfigPaths = (workspaceRoot: string, appDir: string): void => {\n if (tsconfigPathsRegistered) {\n return;\n }\n\n enableTsConfigPath({ projectRootDir: appDir, workspaceRoot });\n tsconfigPathsRegistered = true;\n};\n\n/**\n * Converts the shared dependencies from webpack format to Vite module federation format.\n * Handles both array and object variants of the Shared type.\n *\n * NOTE: We do NOT set `import: false` here because iris apps run in an iframe (separate\n * JavaScript context). The host's shared dependencies are NOT accessible across the iframe\n * boundary, so the iris app must bundle its own copies as a fallback. The `singleton: true`\n * config ensures that within the iframe context, only one instance is used.\n */\nconst convertSharedToViteFormat = (shared: Shared): ViteSharedConfig => {\n const result: ViteSharedConfig = {};\n\n const processItem = (item: unknown): void => {\n if (typeof item === \"string\") {\n // Bundle this dependency - iris apps need their own copy since they run in an iframe\n result[item] = {};\n } else if (item !== null && typeof item === \"object\") {\n for (const [key, value] of Object.entries(item)) {\n const baseConfig = typeof value === \"string\" ? {} : (value ?? {});\n // Remove import: false if it was set - we need to bundle shared deps for iframe isolation\n const { import: _import, ...restConfig } = baseConfig;\n result[key] = restConfig;\n }\n }\n };\n\n // Handle both array and object variants of Shared type\n if (Array.isArray(shared)) {\n for (const item of shared) {\n processItem(item);\n }\n } else {\n processItem(shared);\n }\n // For now we do not use any shared for vite build - as it create random crashes, it seemed like react was not garanteed to be loaded\n return {};\n // return result;\n};\n\n/**\n * Converts the webpack Exposes type to Vite's expected format.\n * getExposedExtensions returns an object with string values, but the Exposes type\n * is a union that includes arrays. This extracts just the object entries.\n *\n */\nconst convertExposesToViteFormat = (exposes: Exposes): ViteExposesConfig => {\n const result: ViteExposesConfig = {};\n\n if (typeof exposes === \"object\" && !Array.isArray(exposes)) {\n for (const [key, value] of Object.entries(exposes)) {\n if (typeof value === \"string\") {\n result[key] = value;\n }\n }\n }\n\n return result;\n};\n\nconst generateIndexHtml = ({\n manifest,\n packageJson,\n options,\n}: {\n manifest: IrisAppManifest;\n packageJson: string;\n options: TrackunitIrisAppVitePluginOptions;\n}): string => {\n // Register tsconfig paths to load the utility\n registerTsConfigPaths(options.workspaceRoot ?? options.appDir, options.appDir);\n\n // Only include dev scripts and React DevTools connection in development\n const iframeRedirect =\n options.config.mode === \"development\"\n ? `<script nonce=\"{{nonce}}\">\n if (window.self === window.top) { window.location.replace(\"https://new.manager.trackunit.com/goto/iris-app-dev\"); }\n </script>`\n : \"\";\n\n const devtools =\n options.config.mode === \"development\"\n ? `<script nonce=\"{{nonce}}\" defer src=\"http://localhost:8097\"></script>\n ${iframeRedirect}\n <script nonce=\"{{nonce}}\">\n if (typeof global === 'undefined') { window.global = window; }\n if (typeof process === 'undefined') { window.process = { env: {} }; }\n </script>\n`\n : `\n<script nonce=\"{{nonce}}\">\n if (typeof global === 'undefined') { window.global = window; }\n if (typeof process === 'undefined') { window.process = { env: {} }; }\n </script>`;\n\n return updateIndexHtml({ manifest, packageJson, devtools });\n};\n\n/**\n * Vite plugin that generates manifest.json, package.json, and index.html for Iris Apps.\n * This is the Vite equivalent of TrackunitIrisAppWebpackPlugin.\n *\n * Returns an array of plugins including Module Federation configuration.\n */\nexport async function getTrackunitIrisAppVitePlugins(\n options: TrackunitIrisAppVitePluginOptions\n): Promise<Array<PluginOption>> {\n const pluginConstructionStart = performance.now();\n logEvent(\"plugin construction: started\");\n\n const resolvedAppDir = path.resolve(options.appDir);\n const workspaceRoot = options.workspaceRoot ?? path.resolve(options.appDir, \"../..\");\n\n // ESM-only since v5 (Vite 8). Load via file URL ā Nx CJS executor hooks cannot\n // resolve the package's import-only exports map.\n const cssInjectedByJsPlugin = await loadCssInjectedByJsPlugin(workspaceRoot);\n\n // Prefer the executor-provided manifest (may already carry stamped sdkVersion);\n // fall back to a fresh disk load for direct/plugin-only callers.\n const initialLoad =\n options.manifest === undefined\n ? await loadManifestWithSources(workspaceRoot, resolvedAppDir)\n : { manifest: options.manifest, sourcePaths: [] };\n const initialManifest = initialLoad.manifest;\n\n // Directories holding the sources the manifest was derived from. The dev\n // server's own watcher only covers the app root, but a manifest reads across\n // the workspace ā an `aiNavigation` catalog comes off a route tree in `libs/` ā\n // so those directories are watched explicitly or an edit there is never seen.\n // Deduplicated to directories because watching each of a few thousand files\n // individually is far more expensive for the same coverage.\n let watchedSourceDirectories = new Set(initialLoad.sourcePaths.map(sourcePath => path.dirname(sourcePath)));\n let devServer: ViteDevServer | undefined;\n\n const watchManifestSources = (): void => {\n if (devServer === undefined) {\n return;\n }\n for (const directory of watchedSourceDirectories) {\n devServer.watcher.add(directory);\n }\n };\n\n // Get an available port in the Iris app port range\n const port = await timeAsync(\"getAvailablePort\", () => getAvailablePort(22220, 22229));\n\n // Get module federation configuration from manifest\n const webpackExposes = await timeAsync(`getExposedExtensions (${initialManifest.extensions.length} extensions)`, () =>\n getExposedExtensions({\n nxRootDir: workspaceRoot,\n manifest: initialManifest,\n })\n );\n const shared = getSharedDependencies({ manifest: initialManifest });\n const viteExposes = convertExposesToViteFormat(webpackExposes);\n const viteShared = convertSharedToViteFormat(shared);\n const hasExposes = Object.keys(viteExposes).length > 0;\n\n // Only create the federation plugin when there are modules to expose.\n // @module-federation/vite deadlocks during build when exposes is empty because\n // its proxyRemoteEntry plugin waits for a module-parse promise that never resolves.\n let federationPlugin: PluginOption | null = null;\n if (hasExposes) {\n federationPlugin = federation({\n name: initialManifest.moduleFederationName,\n filename: \"remoteEntry.js\",\n library: { type: \"global\", name: initialManifest.moduleFederationName },\n exposes: viteExposes,\n shared: viteShared,\n remotes: {},\n manifest: false,\n dts: false,\n shareStrategy: \"loaded-first\",\n getPublicPath: `return (function() {\n var base;\n if (typeof import.meta !== 'undefined' && import.meta.url) {\n base = new URL('./', import.meta.url).href;\n } else if (typeof document !== 'undefined' && document.currentScript) {\n base = new URL('./', document.currentScript.src).href;\n } else {\n base = document.baseURI;\n }\n return base;\n })()`,\n });\n }\n\n // Conditionally create bundle analyzer plugin (same pattern as webpack/rspack)\n // Created here so we have access to the output directory path\n let bundleAnalyzerPlugin: PluginOption | null = null;\n if (process.env.BUNDLE_ANALYSE === \"true\") {\n // Compute output directory: dist/apps/{app-name}\n const appName = path.basename(resolvedAppDir);\n const statsPath = path.join(workspaceRoot, \"dist\", \"apps\", appName, \"stats.html\");\n\n // Dynamic ESM import for optional dependency\n const { visualizer } = await import(\"rollup-plugin-visualizer\");\n bundleAnalyzerPlugin = visualizer({\n filename: statsPath,\n template: \"treemap\",\n gzipSize: true,\n brotliSize: true,\n });\n\n // eslint-disable-next-line no-console\n console.log(`\\nš Bundle analyzer enabled - stats.html will be created at:\\n ${statsPath}\\n`);\n }\n\n // Plugin to disable hostAutoInit for pure remotes\n // The @module-federation/vite plugin always injects a hostAutoInit module\n // that auto-initializes the federation runtime. For pure remotes (Iris Apps),\n // we don't need this - the host handles initialization. This plugin intercepts\n // the virtual module and returns an empty module to prevent the build error.\n const disableHostAutoInitPlugin: PluginOption = {\n name: \"disable-host-auto-init\",\n enforce: \"pre\",\n resolveId(id) {\n // Match the hostAutoInit virtual module pattern: __H_A_I__hostAutoInit__H_A_I__\n if (id.includes(\"__H_A_I__hostAutoInit__H_A_I__\")) {\n return \"\\0virtual:empty-host-auto-init\";\n }\n return null;\n },\n load(id) {\n if (id === \"\\0virtual:empty-host-auto-init\") {\n // Return empty module - no auto-initialization needed for pure remotes\n return \"export default {}\";\n }\n return null;\n },\n };\n\n // Create the iris app plugin\n let config: ResolvedConfig;\n\n const reloadManifest = async (): Promise<IrisAppManifest> => {\n const loaded = await loadManifestWithSources(workspaceRoot, resolvedAppDir);\n // A reload can pull in sources the previous one never reached, e.g. a route\n // file added since, so the watch set is widened to match.\n watchedSourceDirectories = new Set(loaded.sourcePaths.map(sourcePath => path.dirname(sourcePath)));\n watchManifestSources();\n\n return loaded.manifest;\n };\n\n const generateManifestJson = (manifestData: IrisAppManifest): IrisAppManifest => {\n // Register tsconfig paths to load utilities\n registerTsConfigPaths(workspaceRoot, resolvedAppDir);\n\n const manifestCopy = { ...manifestData };\n const appSrc = path.join(resolvedAppDir, \"src\");\n\n manifestCopy.customFieldDefinitions = updateCustomFields(manifestData.customFieldDefinitions, appSrc);\n manifestCopy.extensions = updateExtensions([...manifestData.extensions]);\n\n // Stamp (or refresh) the installed SDK version on every emit so serve HMR\n // reloads and production builds both publish it ā the build executor also\n // stamps before config construction, but this path reloads from disk.\n const sdkVersion = resolveSdkVersion(resolvedAppDir);\n if (sdkVersion !== undefined) {\n manifestCopy.sdkVersion = sdkVersion;\n }\n\n return injectFullDescriptionImages(manifestCopy, resolvedAppDir);\n };\n\n const manifestCache = createManifestCache({\n reloadManifest,\n generateManifestJson,\n initialManifest,\n });\n\n // The /extensionloader.js handler proxies to https://iris.trackunit.app\n // (or http://localhost:3000 when LOCAL=true). The script changes very\n // rarely, so we cache the body in memory with a TTL and dedupe concurrent\n // fetches via createExtensionLoaderCache. Set IRIS_EXTENSIONLOADER_NO_CACHE=1\n // to bypass the cache for debugging.\n const getExtensionLoaderUrl = (): string =>\n process.env.LOCAL === \"true\"\n ? \"http://localhost:3000/extensionloader.js\"\n : \"https://iris.trackunit.app/extensionloader.js\";\n\n const extensionLoaderCache = createExtensionLoaderCache({\n getUrl: getExtensionLoaderUrl,\n shouldBypassCache: () => process.env.IRIS_EXTENSIONLOADER_NO_CACHE === \"1\",\n });\n\n // No explicit type annotation to avoid excessive stack depth error with federation plugin's complex types\n const irisAppPlugin = {\n name: \"trackunit-iris-app-vite-configuration\",\n\n config(conf: UserConfig) {\n // Base config for both serve and build\n const baseConfig: UserConfig = {\n // Use empty base for runtime URL resolution - assets will use relative paths\n base: \"\",\n // Runtime URL resolution - equivalent to rspack's publicPath: \"auto\"\n // Uses document.currentScript to determine base URL at runtime\n experimental: {\n renderBuiltUrl(filename, { hostType }) {\n // CSS files cannot execute JavaScript runtime expressions - use relative paths instead\n // This applies to fonts, images, and other assets referenced via url() in CSS\n if (hostType === \"css\") {\n return { relative: true };\n }\n // For JS/HTML, use runtime resolution using document.currentScript (like webpack/rspack's publicPath: \"auto\")\n return {\n runtime: `((function() {\n return document.baseURI + ${JSON.stringify(filename)};\n })())`,\n };\n },\n },\n // PostCSS configuration for Tailwind CSS v4\n // Using @tailwindcss/postcss instead of @tailwindcss/vite for better monorepo support.\n css: {\n postcss: {\n plugins: [require(\"@tailwindcss/postcss\")({})],\n },\n },\n server: {\n port,\n strictPort: true,\n host: \"localhost\",\n // Enable CORS for cross-origin requests from new.manager.trackunit.com\n cors: {\n origin: true, // Reflect request origin (supports all origins)\n credentials: true,\n methods: [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"OPTIONS\"],\n allowedHeaders: [\n \"X-Requested-With\",\n \"baggage\",\n \"content-type\",\n \"Authorization\",\n \"sentry-trace\",\n \"session-id\",\n \"commit-number\",\n \"x-trackunitappversion\",\n ],\n maxAge: 3600,\n },\n },\n // Production build optimization\n build: {\n // Vite 8's default minifier. \"esbuild\" would require esbuild as a separate\n // install, which generated Iris app workspaces do not have.\n minify: \"oxc\",\n // CSS code splitting is required for relativeCSSInjection to work\n // (cssInjectedByJsPlugin enforces cssCodeSplit: true when relativeCSSInjection is enabled)\n // Each chunk's CSS is injected when that chunk loads - ideal for Module Federation\n // NOTE: We don't set cssCodeSplit here because the plugin controls it\n cssCodeSplit: true,\n rollupOptions: {\n output: {\n // Chunk splitting strategy - bundle small modules together to reduce HTTP requests\n manualChunks(id: string) {\n // Skip Module Federation virtual modules and runtime - let MF handle these\n if (\n id.includes(\"__mf__virtual\") ||\n id.includes(\"@mf-types\") ||\n id.includes(\"virtualExposes\") ||\n id.includes(\"virtual_mf-exposes\") ||\n id.includes(\"remoteEntry\") ||\n id.includes(\"_mf_\")\n ) {\n return undefined;\n }\n\n // Skip node_modules - let Rollup handle vendor chunking\n if (id.includes(\"node_modules\")) {\n return undefined;\n }\n\n // 1. Split translations per language (like Rspack's splitChunks cacheGroups)\n const translationMatch = id.match(/[\\\\/]locales[\\\\/]([^/\\\\]+)[\\\\/]translation\\.json$/);\n if (translationMatch) {\n return `translations-${translationMatch[1]}`;\n }\n\n // Let Rollup handle everything else - default chunking is fine\n // Vite/Rollup will merge small chunks automatically\n return undefined;\n },\n },\n },\n },\n };\n\n return mergeConfig(conf, baseConfig, false); // false = don't concatenate root-level arrays\n },\n\n configResolved(resolvedConfig: ResolvedConfig) {\n config = resolvedConfig;\n },\n async buildStart() {\n await manifestCache.reloadManifest();\n },\n\n configureServer(server: ViteDevServer) {\n // Invalidate the manifest cache when the manifest, or any source it was\n // derived from, changes so HMR picks up edits (e.g. adding an extension,\n // or annotating a route for AI navigation). All other paths serve from the\n // cache populated by the first request.\n //\n // `invalidateManifestSource` answers both questions at once: it drops the\n // file from the loader's module graph and reports whether the manifest was\n // derived from it in the first place.\n devServer = server;\n const manifestFilePath = path.join(resolvedAppDir, \"iris-app-manifest.ts\");\n server.watcher.add(manifestFilePath);\n watchManifestSources();\n server.watcher.on(\"change\", changedPath => {\n if (invalidateManifestSource(changedPath)) {\n manifestCache.invalidateManifestCache();\n logEvent(\n `manifest cache: invalidated (${path.relative(workspaceRoot, path.normalize(changedPath))} changed)`\n );\n }\n });\n\n // Request timing middleware - MUST be registered before any other middleware\n // so we observe the full server-side response time. Logs to stdout when\n // the response takes longer than TRANSFORM_LOG_THRESHOLD_MS. Enable with\n // IRIS_TIMING=true.\n server.middlewares.use((req: IncomingMessage, res: ServerResponse, next: () => void) => {\n wrapResponseTiming(req, res);\n next();\n });\n\n // Route /invoke requests to local serverside extensions when available.\n server.middlewares.use(\"/invoke\", createInvokeProxyMiddleware(options.serversidePortMap));\n\n // Serve extension assets from source during development (/{extensionId}/... ā {sourceRoot}/...)\n server.middlewares.use((req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const url = req.url?.split(\"?\")[0] ?? \"/\";\n // Use the in-memory manifest if available; fall back to initialManifest\n // (loaded once at plugin construction) so this synchronous middleware\n // never blocks on a slow manifest reload.\n const filePath = resolveExtensionAsset(url, manifestCache.getManifestSync() ?? initialManifest, workspaceRoot);\n\n if (filePath) {\n res.setHeader(\"Content-Type\", getMimeType(filePath));\n res.end(fs.readFileSync(filePath));\n return;\n }\n next();\n });\n\n // Global CORS headers middleware - must be first to set headers on all responses\n server.middlewares.use((req: IncomingMessage, res: ServerResponse, next: () => void) => {\n // Set Access-Control-Allow-Origin based on request origin (needed for CORS preflight)\n const origin = req.headers.origin || \"https://dev.manager.trackunit.com\";\n res.setHeader(\"Access-Control-Allow-Origin\", origin);\n res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n res.setHeader(\"Access-Control-Max-Age\", \"3600\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, PUT, DELETE, OPTIONS\");\n res.setHeader(\n \"Access-Control-Allow-Headers\",\n \"X-Requested-With, baggage, content-type, Authorization, sentry-trace, session-id, commit-number, x-trackunitappversion\"\n );\n next();\n });\n\n // IMPORTANT: This middleware must be synchronous for requests we want to pass through to Vite.\n // Async middlewares break Connect's middleware chain when calling next().\n // We use a sync wrapper and only do async work for routes we handle ourselves.\n server.middlewares.use((req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const url = req.url?.split(\"?\")[0] ?? \"/\";\n\n // Let Vite handle its internal routes (@fs, @vite, @react-refresh, node_modules, etc.)\n // MUST call next() synchronously for these to work properly\n const isViteInternal =\n url.startsWith(\"/@\") ||\n url.startsWith(\"/node_modules/\") ||\n url.startsWith(\"/__mf__virtual/\") ||\n url.startsWith(\"/__vite\");\n if (isViteInternal) {\n next();\n return;\n }\n\n // CORS preflight handler - respond to OPTIONS requests\n if (req.method === \"OPTIONS\") {\n res.statusCode = 204;\n res.end();\n return;\n }\n\n // For non-GET/HEAD/OPTIONS on root path, return allowed methods\n if (req.url?.endsWith(\"/\") && req.method !== \"GET\" && req.method !== \"HEAD\") {\n res.end(\"GET, HEAD\");\n return;\n }\n\n // Serve manifest.json during development (async route - handle response ourselves)\n if (req.url === \"/manifest.json\") {\n void (async () => {\n try {\n const manifestJson = await manifestCache.getCachedManifestJson();\n\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify(manifestJson, null, 2));\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"Error generating manifest.json:\", error);\n res.statusCode = 500;\n res.end(String(error));\n }\n })();\n return; // Don't call next() - we're handling this route\n }\n\n // Serve package.json during development\n if (req.url === \"/package.json\") {\n try {\n const packageJsonPath = path.join(resolvedAppDir, \"package.json\");\n const packageJson = fs.readFileSync(packageJsonPath, \"utf8\");\n\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(packageJson);\n return;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"Error serving package.json:\", error);\n }\n }\n\n // Serve manifestAndToken during development (async route - handle response ourselves)\n // Calls getCachedManifestJson directly instead of HTTP-fetching /manifest.json\n // to avoid a redundant manifest reload on every request (the host calls this\n // endpoint multiple times during initial app boot).\n if (req.url?.startsWith(\"/manifestAndToken\")) {\n void (async () => {\n try {\n const manifestJson = await manifestCache.getCachedManifestJson();\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({ manifest: manifestJson }));\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"ERROR: \", e);\n res.statusCode = 500;\n res.end(String(e));\n }\n })();\n return; // Don't call next() - we're handling this route\n }\n\n // Serve extensionloader.js during development.\n // To test extensionloader locally set LOCAL=true in front of the serve command.\n // The fetched body is cached in memory; see createExtensionLoaderCache.\n if (req.url?.startsWith(\"/extensionloader.js\")) {\n void (async () => {\n try {\n const body = await extensionLoaderCache.getCachedExtensionLoaderBody();\n res.setHeader(\"Content-Type\", \"application/javascript\");\n res.end(body);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"ERROR: \", e);\n res.statusCode = 500;\n res.end(String(e));\n }\n })();\n return; // Don't call next() - we're handling this route\n }\n\n // Serve generated index.html for root path and SPA fallback routes\n // This handles the case where no physical index.html exists (async route - handle response ourselves)\n if (req.method === \"GET\") {\n const acceptsHtml = req.headers.accept?.includes(\"text/html\");\n const hasExtension = /\\.\\w+$/.test(url);\n const isRootOrSpaRoute = url === \"/\" || url === \"/index.html\" || (!hasExtension && acceptsHtml);\n\n if (isRootOrSpaRoute) {\n void (async () => {\n try {\n const currentManifest = await manifestCache.getCachedManifest();\n const packageJsonPath = path.join(resolvedAppDir, \"package.json\");\n const packageJson = fs.readFileSync(packageJsonPath, \"utf8\");\n const html = generateIndexHtml({ manifest: currentManifest, packageJson, options });\n\n const transformedHtml = await timeAsync(`server.transformIndexHtml(${shortenPath(url)})`, () =>\n server.transformIndexHtml(req.url ?? \"/\", html)\n );\n\n res.setHeader(\"Content-Type\", \"text/html\");\n res.end(transformedHtml);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\"Error generating index.html:\", error);\n res.statusCode = 500;\n res.end(String(error));\n }\n })();\n return; // Don't call next() - we're handling this route\n }\n }\n next();\n });\n\n // Log success message when server starts\n server.httpServer?.once(\"listening\", () => {\n logEvent(\"server: listening\");\n setTimeout(() => {\n logInfo(\n `\\n⨠Iris App is now started, check it out āØ\\nhttps://new.manager.trackunit.com/goto/iris-app-dev\\n`\n );\n }, 100);\n });\n },\n\n async generateBundle() {\n const manifest = manifestCache.getManifestSync() ?? (await manifestCache.reloadManifest());\n\n const packageJsonPath = path.join(resolvedAppDir, \"package.json\");\n const packageJson = fs.readFileSync(packageJsonPath, \"utf8\");\n\n // Generate and emit manifest.json\n const manifestJson = generateManifestJson(manifest);\n this.emitFile({\n type: \"asset\",\n fileName: \"manifest.json\",\n source: JSON.stringify(manifestJson, null, 2),\n });\n\n // Emit package.json\n this.emitFile({\n type: \"asset\",\n fileName: \"package.json\",\n source: packageJson,\n });\n\n const html = generateIndexHtml({ manifest, packageJson, options });\n this.emitFile({\n type: \"asset\",\n fileName: \"index.html\",\n source: html,\n });\n },\n\n async closeBundle() {\n if (config.command === \"build\") {\n const manifestForCopy = manifestCache.getManifestSync() ?? (await manifestCache.reloadManifest());\n const copyPatterns = getCopyPatterns({\n nxRootDir: workspaceRoot,\n appDir: resolvedAppDir,\n manifest: manifestForCopy,\n mode: \"production\",\n });\n\n const nonExistingPatterns: Array<CopyPattern> = [];\n for (const pattern of copyPatterns) {\n const exists = fs.existsSync(pattern.from);\n if (!exists) {\n nonExistingPatterns.push(pattern);\n }\n }\n if (nonExistingPatterns.length > 0) {\n throw new Error(`Copy patterns do not exist: ${nonExistingPatterns.map(p => p.from).join(\", \")}`);\n }\n\n for (const pattern of copyPatterns) {\n try {\n if (fs.existsSync(pattern.from)) {\n const stat = fs.statSync(pattern.from);\n if (stat.isDirectory()) {\n // Copy directory recursively\n fs.cpSync(pattern.from, pattern.to, { recursive: true });\n } else {\n // Copy single file\n const targetDir = path.dirname(pattern.to);\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n fs.copyFileSync(pattern.from, pattern.to);\n }\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(`Error: Could not copy ${pattern.from} to ${pattern.to}:`, error);\n throw error;\n }\n }\n }\n },\n };\n\n // Return array of plugins:\n // 1. nxViteTsPaths - handles tsconfig path resolution\n // 2. disableHostAutoInitPlugin - intercepts hostAutoInit virtual module (must be before federation)\n // 3. federationPlugin - Module Federation for micro-frontends\n // 4. irisAppPlugin - Iris App specific handling\n // 5. cssInjectedByJsPlugin - Vite equivalent of rspack's \"style-loader\"\n // Injects CSS via JS as inline <style> tags instead of external CSS files\n // 6. bundleAnalyzerPlugin - optional bundle analysis\n //\n // NOTE: Tailwind CSS is configured via PostCSS (in baseConfig.css.postcss above)\n // NOT using @tailwindcss/vite because it doesn't respect tailwind.config.js content paths\n // PostCSS approach matches Rspack and properly uses Tailwind v4 config files.\n const plugins: Array<PluginOption> = [\n nxViteTsPaths(),\n // React Fast Refresh ā enables HMR for React components so file changes\n // are hot-swapped without a full page reload. Safe with Module Federation\n // because Iris apps bundle their own React (iframe isolation).\n react({}),\n hasExposes && disableHostAutoInitPlugin,\n federationPlugin,\n !options.skipTypeChecking &&\n checker({ typescript: { tsconfigPath: path.join(resolvedAppDir, \"tsconfig.app.json\") } }),\n irisAppPlugin,\n // Equivalent to rspack's style-loader - injects CSS as inline <style> tags\n // topExecutionPriority ensures CSS is injected before other code runs,\n // relativeCSSInjection: true ensures CSS is injected per chunk (requires cssCodeSplit: true)\n // This is ideal for Module Federation - CSS loads with each remote chunk\n cssInjectedByJsPlugin({\n topExecutionPriority: true,\n relativeCSSInjection: true,\n }),\n bundleAnalyzerPlugin,\n // When the custom-field in-sync check could not be completed, keep reminding\n // the developer on every rebuild that their custom fields were not validated.\n options.degraded && createCustomFieldsDegradedReminderPlugin(true),\n ];\n logTiming(performance.now() - pluginConstructionStart, \"plugin construction: complete\");\n return plugins.filter(Boolean);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loadCssInjectedByJsPlugin.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/loadCssInjectedByJsPlugin.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Indirect loader for `vite-plugin-css-injected-by-js` (ESM-only since v5).\n *\n * ## Why this file exists\n *\n * 1. Iris remotes must inject CSS into the JS bundle. The host iframe's CSP\n * blocks external stylesheets, so a separate `.css` file leaves the app\n * unstyled. Vite 8/Rolldown stopped emitting CSS the way Rollup did, so we\n * need this plugin (v5+) to inline it.\n * 2. The plugin only publishes an `import` export condition. A plain\n * `import ⦠from \"vite-plugin-css-injected-by-js\"` (or a static `require`)\n * fails under Nx's CJS executor hooks, which rewrite dynamic `import()` into\n * `require()` and hit `ERR_PACKAGE_PATH_NOT_EXPORTED`.\n *\n * This module therefore resolves the package's ESM entry from its manifest and\n * loads it via an indirect `new Function(\"return import(...)\")` so Node really\n * does an ESM import.\n *\n * ## When to delete this file\n *\n * Replace the call site in `getTrackunitIrisAppVitePlugins.ts` with a normal\n * `import cssInjectedByJsPlugin from \"vite-plugin-css-injected-by-js\"` and\n * delete this module once **all** of the following are true:\n *\n * - Nx executors for this package run as native ESM (no CJS rewrite of\n * `import()`), **or** the plugin ships a CJS/`require` export again; and\n * - A plain static import of the plugin works inside\n * `yarn nx build <any-iris-app>` (Iris apps still load with styles).\n *\n * Until then, do not \"simplify\" this back to a static import ā that is the\n * regression that left Iris apps blank after the Vite 8 upgrade.\n */\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n// Type-only import: erased at compile time so Nx's CJS executor never emits a\n// require() for this ESM-only package, while the dependency checker still sees\n// it as used (the runtime value is loaded via file URL below).\nimport type cssInjectedByJsPlugin from \"vite-plugin-css-injected-by-js\";\n\ntype CssInjectedByJsPluginFactory = typeof cssInjectedByJsPlugin;\n\nconst PACKAGE_NAME = \"vite-plugin-css-injected-by-js\";\nconst PREFERRED_CONDITIONS = [\"import\", \"module\"];\n// \"require\" would resolve to a CJS build that the ESM import below cannot use.\nconst IGNORED_CONDITIONS = new Set([\"require\", \"types\"]);\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => typeof value === \"object\" && value !== null;\n\n/**\n * Find the installed package directory by walking node_modules upwards.\n *\n * require.resolve() cannot be used here: the package only publishes an\n * \"import\" export condition, so CJS resolution fails with\n * ERR_PACKAGE_PATH_NOT_EXPORTED.\n */\nfunction findPackageDirFrom(startDir: string): string | undefined {\n let dir = path.resolve(startDir);\n\n for (;;) {\n const candidate = path.join(dir, \"node_modules\", PACKAGE_NAME);\n if (fs.existsSync(path.join(candidate, \"package.json\"))) {\n return candidate;\n }\n\n const parent = path.dirname(dir);\n if (parent === dir) {\n return undefined;\n }\n dir = parent;\n }\n}\n\n/**\n * Search this module's own tree before the consumer's workspace root.\n *\n * Under isolated node_modules layouts (pnpm, Yarn's `nodeLinker: pnpm`) this\n * package is installed beside the SDK and never appears at the consumer root,\n * so a root-only walk would fail for published consumers.\n */\nexport const defaultSearchRoots = (workspaceRoot: string): ReadonlyArray<string> => [__dirname, workspaceRoot];\n\nfunction findPackageDir(searchRoots: ReadonlyArray<string>): string | undefined {\n for (const root of searchRoots) {\n const found = findPackageDirFrom(root);\n if (found) {\n return found;\n }\n }\n return undefined;\n}\n\n/** Walk nested export conditions, preferring the ESM ones. */\nfunction pickEsmEntry(target: unknown): string | undefined {\n if (typeof target === \"string\") {\n return target;\n }\n if (!isRecord(target)) {\n return undefined;\n }\n\n const remaining = Object.keys(target).filter(\n condition => !PREFERRED_CONDITIONS.includes(condition) && !IGNORED_CONDITIONS.has(condition)\n );\n\n for (const condition of [...PREFERRED_CONDITIONS, ...remaining]) {\n const entry = pickEsmEntry(target[condition]);\n if (entry) {\n return entry;\n }\n }\n return undefined;\n}\n\n/**\n * Resolve the absolute ESM entry point of the installed package.\n *\n * The entry is read from the package manifest so that a renamed or relocated\n * published entry point does not break the build.\n */\nexport function resolveCssInjectedByJsPluginEntry(\n workspaceRoot: string,\n searchRoots: ReadonlyArray<string> = defaultSearchRoots(workspaceRoot)\n): string {\n const packageDir = findPackageDir(searchRoots);\n\n if (!packageDir) {\n throw new Error(`${PACKAGE_NAME} not found in node_modules under ${searchRoots.join(\", \")}. Run yarn install.`);\n }\n\n const manifest: unknown = JSON.parse(fs.readFileSync(path.join(packageDir, \"package.json\"), \"utf-8\"));\n\n if (!isRecord(manifest)) {\n throw new Error(`${PACKAGE_NAME} has an unreadable package.json in ${packageDir}.`);\n }\n\n // \"exports\" is either a bare entry or a subpath map holding the root entry.\n const exportsField = manifest.exports;\n const rootExport = isRecord(exportsField) ? exportsField[\".\"] : exportsField;\n\n const entry =\n pickEsmEntry(rootExport) ?? pickEsmEntry(manifest.module) ?? pickEsmEntry(manifest.main) ?? \"dist/index.js\";\n const entryPath = path.join(packageDir, entry);\n\n if (!fs.existsSync(entryPath)) {\n throw new Error(`${PACKAGE_NAME} entry point not found at ${entryPath}. Run yarn install.`);\n }\n\n return entryPath;\n}\n\n/**\n * Load the CSS-injection plugin factory. See the file-level comment for why\n * this cannot be a static import, and what has to change before it can be.\n */\nexport async function loadCssInjectedByJsPlugin(workspaceRoot: string): Promise<CssInjectedByJsPluginFactory> {\n const entryPath = resolveCssInjectedByJsPluginEntry(workspaceRoot);\n\n const importEsm = new Function(\"specifier\", \"return import(specifier)\");\n const mod: unknown = await importEsm(pathToFileURL(entryPath).href);\n const factory = isRecord(mod) ? mod.default : undefined;\n\n if (typeof factory !== \"function\") {\n throw new Error(`${PACKAGE_NAME} at ${entryPath} did not export a plugin factory as its default export.`);\n }\n\n return options => factory(options);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manifestCache.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/manifestCache.ts"],"names":[],"mappings":";;;AACA,uDAAmD;AAwBnD;;;;;;;;;;;GAWG;AACI,MAAM,mBAAmB,GAAG,CAAC,EAClC,cAAc,EACd,oBAAoB,EACpB,eAAe,GACG,EAAiB,EAAE;IACrC,IAAI,QAAQ,GAAgC,eAAe,CAAC;IAC5D,IAAI,iBAAiB,GAA2B,IAAI,CAAC;IACrD,6EAA6E;IAC7E,wCAAwC;IACxC,IAAI,sBAAsB,GAAoC,IAAI,CAAC;IAEnE,MAAM,oBAAoB,GAAG,GAA6B,EAAE;QAC1D,IAAI,QAAQ,KAAK,SAAS,IAAI,iBAAiB,KAAK,IAAI,EAAE,CAAC;YACzD,OAAO,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,sBAAsB,KAAK,IAAI,EAAE,CAAC;YACpC,IAAA,0BAAQ,EAAC,oDAAoD,CAAC,CAAC;YAC/D,OAAO,sBAAsB,CAAC;QAChC,CAAC;QACD,IAAA,0BAAQ,EAAC,yCAAyC,CAAC,CAAC;QACpD,MAAM,aAAa,GAAG,CAAC,KAAK,IAA8B,EAAE;YAC1D,MAAM,cAAc,GAAG,QAAQ,IAAI,CAAC,MAAM,cAAc,EAAE,CAAC,CAAC;YAC5D,QAAQ,GAAG,cAAc,CAAC;YAC1B,iBAAiB,GAAG,IAAA,sBAAI,EAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC,CAAC;YAC7F,OAAO,iBAAiB,CAAC;QAC3B,CAAC,CAAC,EAAE,CAAC;QACL,sBAAsB,GAAG,aAAa,CAAC;QACvC,wEAAwE;QACxE,qEAAqE;QACrE,uEAAuE;QACvE,wEAAwE;QACxE,yEAAyE;QACzE,uEAAuE;QACvE,2DAA2D;QAC3D,MAAM,2BAA2B,GAAG,GAAS,EAAE;YAC7C,IAAI,sBAAsB,KAAK,aAAa,EAAE,CAAC;gBAC7C,sBAAsB,GAAG,IAAI,CAAC;YAChC,CAAC;QACH,CAAC,CAAC;QACF,aAAa,CAAC,IAAI,CAAC,2BAA2B,EAAE,2BAA2B,CAAC,CAAC;QAC7E,OAAO,aAAa,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,GAA6B,EAAE,CAAC,oBAAoB,EAAE,CAAC;IAErF,MAAM,iBAAiB,GAAG,KAAK,IAA8B,EAAE;QAC7D,MAAM,oBAAoB,EAAE,CAAC;QAC7B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,GAAgC,EAAE,CAAC,QAAQ,CAAC;IAEpE,MAAM,MAAM,GAAG,KAAK,IAA8B,EAAE;QAClD,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC;QACrC,QAAQ,GAAG,KAAK,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,uBAAuB,GAAG,GAAS,EAAE;QACzC,iBAAiB,GAAG,IAAI,CAAC;QACzB,QAAQ,GAAG,SAAS,CAAC;IACvB,CAAC,CAAC;IAEF,OAAO;QACL,qBAAqB;QACrB,iBAAiB;QACjB,eAAe;QACf,cAAc,EAAE,MAAM;QACtB,uBAAuB;KACxB,CAAC;AACJ,CAAC,CAAC;AAzEW,QAAA,mBAAmB,uBAyE9B","sourcesContent":["import type { IrisAppManifest } from \"@trackunit/iris-app-api\";\nimport { logEvent, time } from \"./devServerTiming\";\n\ninterface ManifestCacheDeps {\n /** Loads (or reloads) the manifest from disk. */\n reloadManifest: () => Promise<IrisAppManifest>;\n /** Processes the raw manifest into the JSON form served to clients. */\n generateManifestJson: (manifest: IrisAppManifest) => IrisAppManifest;\n /** Optional manifest already loaded by the caller (e.g. for federation config) so the first request is warm. */\n initialManifest?: IrisAppManifest;\n}\n\nexport interface ManifestCache {\n /** Returns the processed manifest JSON. Cached and deduplicates concurrent calls. */\n getCachedManifestJson: () => Promise<IrisAppManifest>;\n /** Returns the raw (un-processed) manifest. Triggers a load if the cache is empty. */\n getCachedManifest: () => Promise<IrisAppManifest>;\n /** Returns the current raw manifest synchronously, or undefined if it has not been loaded yet. */\n getManifestSync: () => IrisAppManifest | undefined;\n /** Forces a reload from disk and stores the fresh manifest. Does not clear the JSON cache. */\n reloadManifest: () => Promise<IrisAppManifest>;\n /** Clears all cached state so the next read re-runs the full pipeline. */\n invalidateManifestCache: () => void;\n}\n\n/**\n * Creates an in-memory cache for the Iris-app manifest.\n *\n * The cache deduplicates concurrent /manifest.json and /manifestAndToken\n * requests so they don't re-resolve the manifest + all 25 extension entries\n * on every call. Cold-load profiling showed each request taking ~3s; with the\n * host firing several parallel calls during boot, that stacked into >6s of\n * latency before any extension code could load.\n *\n * The cache is invalidated when iris-app-manifest.ts changes; callers wire\n * that up through the dev server's file watcher.\n */\nexport const createManifestCache = ({\n reloadManifest,\n generateManifestJson,\n initialManifest,\n}: ManifestCacheDeps): ManifestCache => {\n let manifest: IrisAppManifest | undefined = initialManifest;\n let manifestJsonCache: IrisAppManifest | null = null;\n // Shared promise for an in-flight reload, used to dedupe concurrent requests\n // that arrive while the cache is empty.\n let inflightManifestReload: Promise<IrisAppManifest> | null = null;\n\n const ensureManifestLoaded = (): Promise<IrisAppManifest> => {\n if (manifest !== undefined && manifestJsonCache !== null) {\n return Promise.resolve(manifestJsonCache);\n }\n if (inflightManifestReload !== null) {\n logEvent(\"manifest cache: joining in-flight reload (deduped)\");\n return inflightManifestReload;\n }\n logEvent(\"manifest cache: cold load (cache empty)\");\n const reloadPromise = (async (): Promise<IrisAppManifest> => {\n const loadedManifest = manifest ?? (await reloadManifest());\n manifest = loadedManifest;\n manifestJsonCache = time(\"generateManifestJson\", () => generateManifestJson(loadedManifest));\n return manifestJsonCache;\n })();\n inflightManifestReload = reloadPromise;\n // Clear the inflight pointer once the reload settles so post-invalidate\n // reads start a fresh load instead of joining this resolved/rejected\n // promise. The identity check guards against `invalidateManifestCache`\n // having already nulled it out (or replaced it with a newer reload). We\n // attach the cleanup with then(cleanup, cleanup) instead of finally() so\n // a rejection isn't re-thrown from this side-channel; the caller still\n // observes the rejection via the returned `reloadPromise`.\n const clearInflightIfStillCurrent = (): void => {\n if (inflightManifestReload === reloadPromise) {\n inflightManifestReload = null;\n }\n };\n reloadPromise.then(clearInflightIfStillCurrent, clearInflightIfStillCurrent);\n return reloadPromise;\n };\n\n const getCachedManifestJson = (): Promise<IrisAppManifest> => ensureManifestLoaded();\n\n const getCachedManifest = async (): Promise<IrisAppManifest> => {\n await ensureManifestLoaded();\n if (manifest === undefined) {\n throw new Error(\"Manifest unexpectedly undefined after reload\");\n }\n return manifest;\n };\n\n const getManifestSync = (): IrisAppManifest | undefined => manifest;\n\n const reload = async (): Promise<IrisAppManifest> => {\n const fresh = await reloadManifest();\n manifest = fresh;\n return fresh;\n };\n\n const invalidateManifestCache = (): void => {\n manifestJsonCache = null;\n manifest = undefined;\n };\n\n return {\n getCachedManifestJson,\n getCachedManifest,\n getManifestSync,\n reloadManifest: reload,\n invalidateManifestCache,\n };\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manifestLoader.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/manifestLoader.ts"],"names":[],"mappings":";;;;AACA,wDAAkC;AAClC,uDAA8C;AAC9C,iEAA+F;AAE/F,gFAAgF;AAChF,iFAAiF;AACjF,0EAA0E;AAC1E,IAAI,aAAwD,CAAC;AAC7D,IAAI,MAAwC,CAAC;AAE7C,MAAM,SAAS,GAAG,KAAK,EAAE,aAAqB,EAAiC,EAAE;IAC/E,aAAa,KAAb,aAAa,GAAK,IAAA,iDAA0B,EAAC,EAAE,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QAC7E,MAAM,GAAG,OAAO,CAAC;QAEjB,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,EAAC;IAEH,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC;AAWF;;;;;;;;;GASG;AACI,MAAM,uBAAuB,GAAG,KAAK,EAAE,aAAqB,EAAE,MAAc,EAA2B,EAAE,CAC9G,IAAA,2BAAS,EAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;IACnE,MAAM,oBAAoB,GAAG,MAAM,SAAS,CAAC,aAAa,CAAC,CAAC;IAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAC/D,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAgC,YAAY,CAAC,CAAC;IAE9G,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,IAAI,YAAY,mEAAmE,CAAC,CAAC;IACvG,CAAC;IACD,QAAQ,CAAC,YAAY,GAAG,KAAK,CAAC;IAE9B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;AACnC,CAAC,CAAC,CAAC;AAbQ,QAAA,uBAAuB,2BAa/B;AAEL;;;;;;GAMG;AACI,MAAM,YAAY,GAAG,KAAK,EAAE,aAAqB,EAAE,MAAc,EAA4B,EAAE,CACpG,CAAC,MAAM,IAAA,+BAAuB,EAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;AADrD,QAAA,YAAY,gBACyC;AAElE;;;;;;;;GAQG;AACI,MAAM,wBAAwB,GAAG,CAAC,WAAmB,EAAW,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;AAAtG,QAAA,wBAAwB,4BAA8E;AAEnH;;;;;GAKG;AACI,MAAM,mBAAmB,GAAG,KAAK,IAAmB,EAAE;IAC3D,MAAM,OAAO,GAAG,aAAa,CAAC;IAC9B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,aAAa,GAAG,SAAS,CAAC;IAC1B,MAAM,GAAG,SAAS,CAAC;IACnB,MAAM,CAAC,MAAM,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;AAChC,CAAC,CAAC;AARW,QAAA,mBAAmB,uBAQ9B","sourcesContent":["import type { IrisAppManifest } from \"@trackunit/iris-app-api\";\nimport * as path from \"node:path\";\nimport { timeAsync } from \"./devServerTiming\";\nimport { createManifestModuleLoader, type ManifestModuleLoader } from \"./manifestModuleLoader\";\n\n// One loader ā and so one Vite server ā per executor process. Kept module-local\n// rather than passed around so a `serve` run reuses the warm module graph across\n// reloads instead of paying the cold load again on every manifest change.\nlet loaderPromise: Promise<ManifestModuleLoader> | undefined;\nlet loader: ManifestModuleLoader | undefined;\n\nconst getLoader = async (workspaceRoot: string): Promise<ManifestModuleLoader> => {\n loaderPromise ??= createManifestModuleLoader({ workspaceRoot }).then(created => {\n loader = created;\n\n return created;\n });\n\n return loaderPromise;\n};\n\nexport type LoadedManifest = {\n readonly manifest: IrisAppManifest;\n /**\n * Workspace sources the manifest was built from, so the dev server can\n * invalidate its cache when any of them changes ā not just the manifest file.\n */\n readonly sourcePaths: ReadonlyArray<string>;\n};\n\n/**\n * Loads the Iris app manifest from the app directory.\n *\n * Lives in its own module so specs can mock the loader via\n * `vi.mock(\"./manifestLoader\", () => ({ loadManifest: vi.fn(...) }))`.\n *\n * @param workspaceRoot - Absolute Nx workspace root.\n * @param appDir - Absolute Iris app directory.\n * @returns {Promise<LoadedManifest>} The manifest and the workspace sources it was derived from.\n */\nexport const loadManifestWithSources = async (workspaceRoot: string, appDir: string): Promise<LoadedManifest> =>\n timeAsync(\"loadManifest (evaluate iris-app-manifest.ts)\", async () => {\n const manifestModuleLoader = await getLoader(workspaceRoot);\n const manifestPath = path.join(appDir, \"iris-app-manifest.ts\");\n const { exports, sourcePaths } = await manifestModuleLoader.load<{ default?: IrisAppManifest }>(manifestPath);\n\n const manifest = exports.default;\n if (manifest === undefined) {\n throw new Error(`'${manifestPath}' has no default export, so no Iris app manifest could be loaded.`);\n }\n manifest.moduleFormat = \"esm\";\n\n return { manifest, sourcePaths };\n });\n\n/**\n * Loads the Iris app manifest, discarding the source list.\n *\n * @param workspaceRoot - Absolute Nx workspace root.\n * @param appDir - Absolute Iris app directory.\n * @returns {Promise<IrisAppManifest>} The loaded manifest.\n */\nexport const loadManifest = async (workspaceRoot: string, appDir: string): Promise<IrisAppManifest> =>\n (await loadManifestWithSources(workspaceRoot, appDir)).manifest;\n\n/**\n * Marks a changed file as stale so the next manifest load re-evaluates it.\n *\n * Synchronous because it is called from the dev server's watcher callback; by\n * the time a watcher can fire, the manifest has already been loaded once.\n *\n * @param changedPath - Absolute path of the file that changed.\n * @returns {boolean} Whether the file was one the manifest was derived from.\n */\nexport const invalidateManifestSource = (changedPath: string): boolean => loader?.invalidate(changedPath) ?? false;\n\n/**\n * Shuts down the Vite server backing the loader. Callers that load a manifest\n * are responsible for this, otherwise the process will not exit.\n *\n * @returns {Promise<void>} Resolves once the server is closed.\n */\nexport const closeManifestLoader = async (): Promise<void> => {\n const pending = loaderPromise;\n if (pending === undefined) {\n return;\n }\n loaderPromise = undefined;\n loader = undefined;\n await (await pending).close();\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manifestModuleLoader.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/manifestModuleLoader.ts"],"names":[],"mappings":"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","sourcesContent":["import { nxViteTsPaths } from \"@nx/vite/plugins/nx-tsconfig-paths.plugin\";\nimport * as path from \"node:path\";\nimport { createServer, createServerModuleRunner, normalizePath, type Plugin, type ViteDevServer } from \"vite\";\n\n/**\n * Packages that ship CommonJS with named exports the module runner cannot\n * statically analyse. Vite externalises dependencies for server environments by\n * default, which leaves Node to interpret them and rejects\n * `import { useLazyQuery } from \"@apollo/client\"`. Inlining them instead routes\n * them through Vite's CommonJS interop.\n */\nconst cjsPackagesRequiringInlining: ReadonlyArray<string> = [\"@apollo/client\"];\n\nconst compilableFile = /\\.[cm]?[jt]sx?$/;\nconst declaresOwnDirname = /\\b(?:const|let|var|function)\\s+__dirname\\b/;\n\n/** Module ids carry Vite's query suffixes (`?raw`, `?v=`); file paths do not. */\nconst withoutQuery = (id: string): string => id.split(\"?\")[0] ?? id;\n\n/**\n * Iris app manifests are authored as CommonJS and reach for `__dirname`, but the\n * module runner evaluates ESM, where that global does not exist. Every manifest\n * in the workspace uses it, and manifests in Iris apps built outside this\n * repository do too, so the global is supplied rather than the manifests being\n * rewritten.\n *\n * The declarations are prepended to the first line rather than on a line of\n * their own so line numbers in stack traces still match the file on disk.\n */\nconst commonJsGlobalsPlugin = (): Plugin => ({\n name: \"iris-manifest-commonjs-globals\",\n transform(code: string, id: string) {\n const file = withoutQuery(id);\n if (\n !compilableFile.test(file) ||\n file.includes(\"node_modules\") ||\n !code.includes(\"__dirname\") ||\n declaresOwnDirname.test(code)\n ) {\n return undefined;\n }\n\n const declarations = `const __filename=${JSON.stringify(file)};const __dirname=${JSON.stringify(path.dirname(file))};`;\n\n return { code: `${declarations}${code}`, map: null };\n },\n});\n\nconst isWorkspaceSource = (file: string): boolean =>\n !file.startsWith(\"\\0\") && !file.includes(\"node_modules\") && path.isAbsolute(file);\n\nconst collectWorkspaceSources = (server: ViteDevServer): ReadonlyArray<string> => {\n const sources = new Set<string>();\n for (const id of server.environments.ssr.moduleGraph.idToModuleMap.keys()) {\n const file = withoutQuery(id);\n if (isWorkspaceSource(file)) {\n sources.add(path.normalize(file));\n }\n }\n\n return [...sources];\n};\n\nconst cjsInteropFailure = /The requested module '([^']+)' is a CommonJS module/;\n\nconst describeLoadFailure = (error: unknown, entryPath: string): Error => {\n const cause = error instanceof Error ? error : new Error(String(error));\n const offendingPackage = cjsInteropFailure.exec(cause.message)?.[1];\n if (offendingPackage === undefined) {\n return cause;\n }\n\n return new Error(\n `Could not load '${entryPath}': '${offendingPackage}' is a CommonJS package whose named exports could not be ` +\n `resolved. Add it to 'cjsPackagesRequiringInlining' in manifestModuleLoader.ts so Vite inlines and interops it.`,\n { cause }\n );\n};\n\nexport type LoadedModule<TExports> = {\n readonly exports: TExports;\n /**\n * Absolute paths of the workspace sources the module was built from, so\n * callers can watch them for changes. Dependencies under `node_modules` are\n * left out because they cannot change while the process runs.\n */\n readonly sourcePaths: ReadonlyArray<string>;\n};\n\nexport type ManifestModuleLoader = {\n load: <TExports>(entryPath: string) => Promise<LoadedModule<TExports>>;\n /**\n * Drops a source from the loader's module graph so the next load re-evaluates\n * it. Returns whether the path was part of the graph at all.\n */\n invalidate: (changedPath: string) => boolean;\n close: () => Promise<void>;\n};\n\n/**\n * Creates a loader for TypeScript modules that reach into application code.\n *\n * Extension manifests derive fields from application code ā an `aiNavigation`\n * catalog read off a router's route tree, for example ā so loading a manifest\n * means evaluating `.tsx` route trees and whatever they import. That is done by\n * a Vite server in middleware mode driving a module runner, which gives the\n * transforms, asset handling and per-module invalidation Vite already has.\n *\n * The server is deliberately minimal and separate from the one the app is\n * served with: the app's config depends on the manifest (module federation\n * derives `exposes` from it), so loading the manifest through that config would\n * be circular. No framework plugin is registered either ā Vite's built-in\n * esbuild transform reads the `jsx` setting from the project's own tsconfig, so\n * this stays independent of which UI framework an app is written in.\n *\n * The returned loader owns a running server and must be closed.\n *\n * @param options - Workspace location.\n * @param options.workspaceRoot - Absolute Nx workspace root.\n * @returns {Promise<ManifestModuleLoader>} A loader bound to a running Vite server.\n */\nexport const createManifestModuleLoader = async ({\n workspaceRoot,\n}: {\n readonly workspaceRoot: string;\n}): Promise<ManifestModuleLoader> => {\n const server = await createServer({\n configFile: false,\n root: workspaceRoot,\n appType: \"custom\",\n logLevel: \"error\",\n // The app's own dev server owns file watching; this one is driven through\n // `invalidate`, so a second watcher would only duplicate the work.\n server: { middlewareMode: true, watch: null, hmr: false },\n // Nothing is bundled for a browser here, so scanning for dependencies to\n // prebundle is pure overhead.\n optimizeDeps: { noDiscovery: true },\n // Kept out of the app's own cache directory so the two servers cannot\n // invalidate each other's entries.\n cacheDir: path.join(workspaceRoot, \"node_modules/.vite-iris-manifest\"),\n ssr: { noExternal: [...cjsPackagesRequiringInlining] },\n plugins: [nxViteTsPaths(), commonJsGlobalsPlugin()],\n });\n\n const runner = createServerModuleRunner(server.environments.ssr);\n\n return {\n load: async <TExports>(entryPath: string): Promise<LoadedModule<TExports>> => {\n try {\n const exports = await runner.import<TExports>(entryPath);\n\n return { exports, sourcePaths: collectWorkspaceSources(server) };\n } catch (error) {\n throw describeLoadFailure(error, entryPath);\n }\n },\n\n invalidate: (changedPath: string): boolean => {\n const { moduleGraph } = server.environments.ssr;\n const changedModule = moduleGraph.getModuleById(normalizePath(path.resolve(changedPath)));\n if (changedModule === undefined) {\n return false;\n }\n // Invalidation cascades to importers, so a manifest is re-derived even\n // when the edit was several modules deep in a route tree.\n moduleGraph.invalidateModule(changedModule);\n\n return true;\n },\n\n close: (): Promise<void> => server.close(),\n };\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolveSdkVersion.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/resolveSdkVersion.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nconst PACKAGE_NAME = \"@trackunit/iris-app\";\n\nconst readPackageName = (packageDir: string): string | undefined => {\n try {\n const packageJson: unknown = JSON.parse(fs.readFileSync(path.join(packageDir, \"package.json\"), \"utf-8\"));\n if (\n typeof packageJson === \"object\" &&\n packageJson !== null &&\n \"name\" in packageJson &&\n typeof packageJson.name === \"string\"\n ) {\n return packageJson.name;\n }\n return undefined;\n } catch {\n return undefined;\n }\n};\n\nconst isIrisAppPackageDir = (packageDir: string): boolean =>\n fs.existsSync(path.join(packageDir, \"package.json\")) && readPackageName(packageDir) === PACKAGE_NAME;\n\n/**\n * Walks `node_modules` upwards from `fromDir` looking for `@trackunit/iris-app`.\n * Mirrors the layout-tolerant walk in `loadCssInjectedByJsPlugin` so both classic\n * hoisted installs and Yarn/pnpm isolated layouts resolve correctly.\n */\nconst findIrisAppInNodeModules = (fromDir: string): string | undefined => {\n let dir = path.resolve(fromDir);\n\n for (;;) {\n const candidate = path.join(dir, \"node_modules\", \"@trackunit\", \"iris-app\");\n if (isIrisAppPackageDir(candidate)) {\n return candidate;\n }\n\n const parent = path.dirname(dir);\n if (parent === dir) {\n return undefined;\n }\n dir = parent;\n }\n};\n\n/**\n * Manager monorepo layout: `@trackunit/iris-app` lives at\n * `libs/iris-app-sdk/iris-app` beside `@trackunit/iris-app-sdk-vite`, and is\n * often *not* linked into any `node_modules` (Yarn `nodeLinker: pnpm` + TS path\n * mappings). Walking up from the vite package and accepting a sibling / child\n * `iris-app` directory recovers the stamped version for in-repo Iris app builds.\n */\nconst findIrisAppAsMonorepoSibling = (fromDir: string): string | undefined => {\n let dir = path.resolve(fromDir);\n\n for (;;) {\n const sibling = path.join(path.dirname(dir), \"iris-app\");\n if (isIrisAppPackageDir(sibling)) {\n return sibling;\n }\n const child = path.join(dir, \"iris-app\");\n if (isIrisAppPackageDir(child)) {\n return child;\n }\n\n const parent = path.dirname(dir);\n if (parent === dir) {\n return undefined;\n }\n dir = parent;\n }\n};\n\n/**\n * Search the consumer app first, then this vite package's own tree.\n *\n * Under isolated node_modules layouts (pnpm, Yarn's `nodeLinker: pnpm`) monorepo\n * Iris apps typically do not link `@trackunit/iris-app` under the app root ā it\n * sits beside `@trackunit/iris-app-sdk-vite` instead. A root-only walk then\n * leaves `sdkVersion` unstamped and the host keeps the legacy content inset.\n * ASA leftovers without `p-content-space` go flush; that is the GLU-1873\n * proving state on this feature branch (pad/accept before master), not a\n * reason to skip the stamp.\n */\nexport const defaultSearchRoots = (fromDir: string): ReadonlyArray<string> => [fromDir, __dirname];\n\nconst findIrisAppPackageDirFromRoots = (searchRoots: ReadonlyArray<string>): string | undefined => {\n for (const root of searchRoots) {\n if (isIrisAppPackageDir(root)) {\n return root;\n }\n const inNodeModules = findIrisAppInNodeModules(root);\n if (inNodeModules !== undefined) {\n return inNodeModules;\n }\n }\n for (const root of searchRoots) {\n const sibling = findIrisAppAsMonorepoSibling(root);\n if (sibling !== undefined) {\n return sibling;\n }\n }\n return undefined;\n};\n\n/**\n * Resolves the *installed* `@trackunit/iris-app` version from `node_modules`\n * (not the declared semver range in package.json). Returns `undefined` on any\n * failure so callers can keep the safe \"absent means legacy inset\" default.\n *\n * @param fromDir - Directory to start the node_modules walk from (typically the app root)\n * @param searchRoots - Optional override of roots to walk (defaults to app + this package)\n * @returns {string | undefined} the installed package version, or undefined if unresolved\n */\nexport const resolveSdkVersion = (\n fromDir: string,\n searchRoots: ReadonlyArray<string> = defaultSearchRoots(fromDir)\n): string | undefined => {\n try {\n const packageDir = findIrisAppPackageDirFromRoots(searchRoots);\n if (packageDir === undefined) {\n return undefined;\n }\n\n const packageJson: unknown = JSON.parse(fs.readFileSync(path.join(packageDir, \"package.json\"), \"utf-8\"));\n if (\n typeof packageJson !== \"object\" ||\n packageJson === null ||\n !(\"version\" in packageJson) ||\n typeof packageJson.version !== \"string\" ||\n packageJson.version.length === 0\n ) {\n return undefined;\n }\n\n return packageJson.version;\n } catch {\n return undefined;\n }\n};\n\nexport const IRIS_APP_SDK_PACKAGE_NAME = PACKAGE_NAME;\n"]}
|
package/src/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/vite/src/index.ts"],"names":[],"mappings":";;;AAAA,qDAAoD;AAA3C,kHAAA,eAAe,OAAA","sourcesContent":["export { svgSpriteInline } from \"./svgSpriteInline\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"svgSpriteInline.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/vite/src/svgSpriteInline.ts"],"names":[],"mappings":";;;AAAA,qCAAuC;AAGvC,MAAM,6BAA6B,GAAG,4BAA4B,CAAC;AAEnE;;;;;GAKG;AACI,MAAM,eAAe,GAAG,GAAW,EAAE,CAAC,CAAC;IAC5C,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,KAAK;IACd,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1D,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,6BAA6B,EAAE,QAAQ,CAAC,CAAC;QAE3F,OAAO;YACL,qBAAqB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG;YAChD,+EAA+E;YAC/E,4CAA4C;YAC5C,qBAAqB;YACrB,0CAA0C;YAC1C,kCAAkC;YAClC,wBAAwB;YACxB,yBAAyB;YACzB,gCAAgC;YAChC,mBAAmB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG;YACzC,6BAA6B;YAC7B,GAAG;YACH,oBAAoB;SACrB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;CACF,CAAC,CAAC;AA3BU,QAAA,eAAe,mBA2BzB","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type { Plugin } from \"vite\";\n\nconst ICON_SPRITE_FILE_NAME_PATTERN = /^.*\\/(icons-sprite-[^/]+)$/;\n\n/**\n * Inlines icon sprite imports into the document once and exports an empty URL.\n *\n * This turns Icon hrefs from `icons-sprite-*.svg#IconName` into `#IconName`,\n * avoiding repeated browser resolution of external SVG sprite documents.\n */\nexport const svgSpriteInline = (): Plugin => ({\n name: \"svg-sprite-inline\",\n enforce: \"pre\",\n load(id) {\n if (!id.includes(\"icons-sprite-\") || !id.endsWith(\".svg\")) {\n return undefined;\n }\n\n const svg = readFileSync(id, \"utf-8\");\n const spriteId = id.replace(/\\.svg$/, \"\").replace(ICON_SPRITE_FILE_NAME_PATTERN, \"$1.svg\");\n\n return [\n `const SPRITE_ID = ${JSON.stringify(spriteId)};`,\n `if (typeof document !== \"undefined\" && !document.getElementById(SPRITE_ID)) {`,\n ` const c = document.createElement(\"div\");`,\n ` c.id = SPRITE_ID;`,\n ` c.setAttribute(\"aria-hidden\", \"true\");`,\n ` c.style.position = \"absolute\";`,\n ` c.style.width = \"0\";`,\n ` c.style.height = \"0\";`,\n ` c.style.overflow = \"hidden\";`,\n ` c.innerHTML = ${JSON.stringify(svg)};`,\n ` document.body.prepend(c);`,\n `}`,\n `export default \"\";`,\n ].join(\"\\n\");\n },\n});\n"]}
|