@trackunit/iris-app-sdk-vite 0.3.21 ā 0.4.1
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 +23 -0
- package/package.json +4 -4
- package/src/executors/build/executor.js.map +1 -0
- package/src/executors/serve/executor.js.map +1 -0
- package/src/executors/utils/accessTokenCache.js.map +1 -0
- package/src/executors/utils/checkCustomFields.js.map +1 -0
- package/src/executors/utils/deepEqual.js.map +1 -0
- package/src/executors/utils/defaultViteConfig.js.map +1 -0
- package/src/executors/utils/getTrackunitIrisAppVitePlugins.js +1 -1
- package/src/executors/utils/getTrackunitIrisAppVitePlugins.js.map +1 -0
- package/src/index.js.map +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,26 @@
|
|
|
1
|
+
## 0.4.1 (2026-04-29)
|
|
2
|
+
|
|
3
|
+
### š§± Updated Dependencies
|
|
4
|
+
|
|
5
|
+
- Updated iris-app-build-utilities to 1.16.1
|
|
6
|
+
- Updated iris-app to 1.19.1
|
|
7
|
+
|
|
8
|
+
## 0.4.0 (2026-04-29)
|
|
9
|
+
|
|
10
|
+
### š Features
|
|
11
|
+
|
|
12
|
+
- support relative markdown images in app descriptions ([#22774](https://github.com/Trackunit/manager/pull/22774))
|
|
13
|
+
|
|
14
|
+
### š§± Updated Dependencies
|
|
15
|
+
|
|
16
|
+
- Updated iris-app-build-utilities to 1.16.0
|
|
17
|
+
- Updated iris-app-api to 1.18.0
|
|
18
|
+
- Updated iris-app to 1.19.0
|
|
19
|
+
|
|
20
|
+
### ā¤ļø Thank You
|
|
21
|
+
|
|
22
|
+
- Kieran Prince @kpr-trackunit
|
|
23
|
+
|
|
1
24
|
## 0.3.21 (2026-04-28)
|
|
2
25
|
|
|
3
26
|
### š§± Updated Dependencies
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trackunit/iris-app-sdk-vite",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
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": "1.
|
|
14
|
-
"@trackunit/iris-app-api": "1.
|
|
13
|
+
"@trackunit/iris-app-build-utilities": "1.16.1",
|
|
14
|
+
"@trackunit/iris-app-api": "1.18.0",
|
|
15
15
|
"tslib": "^2.6.2",
|
|
16
16
|
"vite": "7.3.1",
|
|
17
17
|
"@module-federation/vite": "1.11.0",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"@tailwindcss/postcss": "^4.1.18",
|
|
23
23
|
"@vitejs/plugin-react-swc": "^4.2.3",
|
|
24
24
|
"@nx/devkit": "22.6.5",
|
|
25
|
-
"@trackunit/iris-app": "1.
|
|
25
|
+
"@trackunit/iris-app": "1.19.1",
|
|
26
26
|
"cross-keychain": "^1.1.0",
|
|
27
27
|
"jwt-decode": "^3.1.2"
|
|
28
28
|
},
|
|
@@ -0,0 +1 @@
|
|
|
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/src/utils/rxjs-for-await\";\nimport { checkPackageVersion, enableTsConfigPath } 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 { 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 const manifestPath = join(context.root, projectRoot, \"iris-app-manifest.ts\");\n\n // ā
CRITICAL: Register tsconfig paths BEFORE any @trackunit/* imports\n enableTsConfigPath({\n projectRootDir,\n });\n\n // Now we can safely import the manifest (it uses @trackunit/* imports)\n const IrisAppManifest = (await import(manifestPath)).default;\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 );\n\n return yield* eachValueFrom(observable);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
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/src/utils/rxjs-for-await\";\nimport { getSettings } from \"@trackunit/iris-app\";\nimport { IrisAppManifest } from \"@trackunit/iris-app-api\";\nimport {\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 { 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 const manifestPath = join(context.root, projectRoot, \"iris-app-manifest.ts\");\n\n // ā
CRITICAL: Register tsconfig paths BEFORE any @trackunit/* imports\n enableTsConfigPath({\n projectRootDir,\n });\n\n // Now we can safely import the manifest (it uses @trackunit/* imports)\n const irisAppManifest: IrisAppManifest = (await import(manifestPath)).default;\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, 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, please submit and get this version approved before you continue developing the app.\"\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 }\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 })\n );\n\n return yield* eachValueFrom(observable);\n } catch (error) {\n serversideResult.cleanup();\n throw error;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkCustomFields.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/checkCustomFields.ts"],"names":[],"mappings":";;;AAEA,yDAA0D;AAC1D,2CAAwC;AAIxC;;;;GAIG;AACI,MAAM,iBAAiB,GAAG,KAAK,EACpC,eAAgC,EAChC,QAAkB,EACgB,EAAE;IACpC,MAAM,WAAW,GAAG,eAAe,CAAC,sBAAsB,IAAI,EAAE,CAAC;IAEjE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,sCAAsC;IACtC,OAAO,CAAC,GAAG,CACT,yIAAyI,CAC1I,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,IAAA,uCAAoB,EAAC,QAAQ,CAAC,CAAC;IAEvD,MAAM,2BAA2B,GAAG,MAAM,2BAA2B,CACnE,eAAe,CAAC,oBAAoB,EACpC,SAAS,CAAC,YAAY,EACtB,QAAQ,CACT,CAAC;IAEF,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACjC,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,cAAc,GAAG,2BAA2B,CAAC,sBAAsB,IAAI,EAAE,CAAC;IAEhF,sCAAsC;IACtC,OAAO,CAAC,GAAG,CACT,gCAAgC,eAAe,CAAC,oBAAoB,QAAQ,cAAc,CAAC,MAAM,8BAA8B,CAChI,CAAC;IAEF,IAAI,mBAAmB,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,CAAC;QACrD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAtCW,QAAA,iBAAiB,qBAsC5B;AAEF,MAAM,iBAAiB,GAAG,CAAC,KAA4B,EAA+C,EAAE;IACtG,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACxC,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,CAC1B,WAAyC,EACzC,cAA4C,EACnC,EAAE;IACX,IAAI,WAAW,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QAC9B,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,CAAC,IAAA,qBAAS,EAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,8BAA8B,GAAG;;EAErC,CAAC;AAEH;;;;;;;;;GASG;AACH,KAAK,UAAU,2BAA2B,CACxC,SAAiB,EACjB,WAAmB,EACnB,QAAkB;IAElB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,EAAE;QACnE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;YAClC,aAAa,EAAE,UAAU,WAAW,EAAE;SACvC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,aAAa,EAAE,wBAAwB;YACvC,KAAK,EAAE,8BAA8B;YACrC,SAAS,EAAE,EAAE,SAAS,EAAE;SACzB,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,6CAA6C,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAC/G,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GACR,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAExB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,oDAAoD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpH,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC;AACrC,CAAC","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\";\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 // 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 const tokenData = await getCachedAccessToken(settings);\n\n const latestApprovedManifestIfAny = await fetchLatestApprovedManifest(\n irisAppManifest.moduleFederationName,\n tokenData.access_token,\n settings\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 return body.data?.manifest ?? null;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaultViteConfig.js","sourceRoot":"","sources":["../../../../../../../libs/iris-app-sdk/vite/src/executors/utils/defaultViteConfig.ts"],"names":[],"mappings":";;;AAIA,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;AAOF;;;;;;;;;GASG;AACI,MAAM,oBAAoB,GAAG,KAAK,EACvC,IAAkC,EAClC,SAAiB,EACjB,MAAc,EACd,gBAAiC,EACjC,OAAwB,EACxB,UAAuC,EAAE,EACpB,EAAE;IACvB,6DAA6D;IAE7D,MAAM,cAAc,GAAG,MAAM,IAAA,+DAA8B,EAAC;QAC1D,MAAM;QACN,aAAa,EAAE,SAAS;QACxB,MAAM,EAAE,EAAE,IAAI,EAAE;QAChB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;KAC3C,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,IAAI;QACJ,OAAO,EAAE,CAAC,GAAG,cAAc,EAAE,kBAAkB,CAAC;QAChD,mCAAmC;QACnC,YAAY,EAAE;YACZ,mEAAmE;YACnE,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,mBAAmB,CAAC;YACpD,6CAA6C;YAC7C,cAAc,EAAE;gBACd,MAAM,EAAE,QAAQ;aACjB;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,yDAAyD;YACzD,MAAM,EAAE,SAAS;YACjB,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;AA9DW,QAAA,oBAAoB,wBA8D/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 { 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};\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 (used for logging/validation)\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 config: { mode },\n serversidePortMap: options.serversidePortMap,\n skipTypeChecking: options.skipTypeChecking,\n });\n\n return {\n root: appDir,\n mode,\n plugins: [...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 // Use esbuild for faster dependency scanning\n esbuildOptions: {\n target: \"esnext\",\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 // Use esbuild for minification (MUCH faster than terser)\n minify: \"esbuild\",\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"]}
|
|
@@ -257,7 +257,7 @@ async function getTrackunitIrisAppVitePlugins(options) {
|
|
|
257
257
|
const appSrc = path.join(resolvedAppDir, "src");
|
|
258
258
|
manifestCopy.customFieldDefinitions = (0, iris_app_build_utilities_1.updateCustomFields)(manifestData.customFieldDefinitions, appSrc);
|
|
259
259
|
manifestCopy.extensions = (0, iris_app_build_utilities_1.updateExtensions)([...manifestData.extensions]);
|
|
260
|
-
return manifestCopy;
|
|
260
|
+
return (0, iris_app_build_utilities_1.injectFullDescriptionImages)(manifestCopy, resolvedAppDir);
|
|
261
261
|
};
|
|
262
262
|
// No explicit type annotation to avoid excessive stack depth error with federation plugin's complex types
|
|
263
263
|
const irisAppPlugin = {
|
|
@@ -0,0 +1 @@
|
|
|
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 cssInjectedByJsPlugin from \"vite-plugin-css-injected-by-js\";\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 serversidePortMap?: ServersidePortMap;\n config: UserConfig;\n skipTypeChecking?: 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 * Loads the Iris app manifest from the app directory.\n * Uses require() with cache clearing since Node.js doesn't support query strings in import paths.\n */\nconst loadManifest = (workspaceRoot: string, appDir: string): IrisAppManifest => {\n // Register tsconfig paths before loading the manifest\n registerTsConfigPaths(workspaceRoot, appDir);\n\n const manifestPath = path.join(appDir, \"iris-app-manifest.ts\");\n // Clear require cache to ensure fresh manifest on HMR\n try {\n delete require.cache[require.resolve(manifestPath)];\n } catch {\n // Ignore if not in cache\n }\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const manifestModule = require(manifestPath);\n manifestModule.default.moduleFormat = \"esm\";\n return manifestModule.default;\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}}\" 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 resolvedAppDir = path.resolve(options.appDir);\n const workspaceRoot = options.workspaceRoot ?? path.resolve(options.appDir, \"../..\");\n\n // Load manifest upfront for federation config\n const initialManifest = loadManifest(workspaceRoot, resolvedAppDir);\n\n // Get build utilities (tsconfig paths now registered via loadManifest)\n\n // Get an available port in the Iris app port range\n const port = await getAvailablePort(22220, 22229);\n\n // Get module federation configuration from manifest\n const webpackExposes = await getExposedExtensions({\n nxRootDir: workspaceRoot,\n manifest: initialManifest,\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 let manifest: IrisAppManifest | undefined = initialManifest;\n\n const reloadManifest = (): IrisAppManifest => {\n return loadManifest(workspaceRoot, resolvedAppDir);\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 return injectFullDescriptionImages(manifestCopy, resolvedAppDir);\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 // Use esbuild for fast minification (Vite's default)\n minify: \"esbuild\",\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 buildStart() {\n manifest = reloadManifest();\n },\n\n configureServer(server: ViteDevServer) {\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 const filePath = resolveExtensionAsset(url, manifest ?? reloadManifest(), 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 manifest = reloadManifest();\n const manifestJson = generateManifestJson(manifest);\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 if (req.url?.startsWith(\"/manifestAndToken\")) {\n void (async () => {\n try {\n const host = req.headers.host || \"localhost\";\n const resp = await fetch(`http://${host}/manifest.json`);\n const body = await resp.json();\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({ manifest: 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 extensionloader.js during development (async route - handle response ourselves)\n if (req.url?.startsWith(\"/extensionloader.js\")) {\n void (async () => {\n try {\n // To test extensionloader locally set LOCAL=true in front of the serve command\n let loaderUrl = \"https://iris.trackunit.app/extensionloader.js\";\n if (process.env.LOCAL === \"true\") {\n loaderUrl = \"http://localhost:3000/extensionloader.js\";\n }\n const resp = await fetch(loaderUrl);\n const body = await resp.text();\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 manifest = reloadManifest();\n const packageJsonPath = path.join(resolvedAppDir, \"package.json\");\n const packageJson = fs.readFileSync(packageJsonPath, \"utf8\");\n const html = generateIndexHtml({ manifest, packageJson, options });\n\n const transformedHtml = await server.transformIndexHtml(req.url ?? \"/\", html);\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 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 generateBundle() {\n if (!manifest) {\n manifest = reloadManifest();\n }\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 closeBundle() {\n if (config.command === \"build\") {\n const manifestForCopy = manifest ?? 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 getTailwindContentForApp() from 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 ];\n return plugins.filter(Boolean);\n}\n"]}
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/vite/src/index.ts"],"names":[],"mappings":"","sourcesContent":[""]}
|