@trackunit/iris-app-build-utilities 1.12.57 → 1.12.58
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 +6 -0
- package/package.json +2 -2
- package/src/checkPackageVersion.js.map +1 -0
- package/src/createInvokeProxyMiddleware.js.map +1 -0
- package/src/devServerUtils.js.map +1 -0
- package/src/enableTsConfigPath.js.map +1 -0
- package/src/getAliasesFromTsConfig.js.map +1 -0
- package/src/getAvailablePort.js.map +1 -0
- package/src/getCopyPatterns.js.map +1 -0
- package/src/getExposedExtensions.js.map +1 -0
- package/src/getGraphqlCodeGenConfig.js.map +1 -0
- package/src/getIrisAppDevServer.js.map +1 -0
- package/src/getSharedDependencies.js.map +1 -0
- package/src/getTailwindContentForApp.js.map +1 -0
- package/src/index.js.map +1 -0
- package/src/plugin-shared/consoleUtils.js.map +1 -0
- package/src/plugin-shared/customFieldUtil.js.map +1 -0
- package/src/plugin-shared/extensionUtil.js.map +1 -0
- package/src/plugin-shared/indexHtmlUtil.js.map +1 -0
- package/src/plugin-shared/irisAppTranslationUtils.js.map +1 -0
- package/src/serverlessUtils.js.map +1 -0
- package/src/spawnServerlessExtensions.js.map +1 -0
- package/src/version.js.map +1 -0
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@trackunit/iris-app-build-utilities",
|
|
3
|
-
"version": "1.12.
|
|
3
|
+
"version": "1.12.58",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
5
5
|
"repository": "https://github.com/Trackunit/manager",
|
|
6
6
|
"engines": {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"tslib": "^2.6.2",
|
|
16
16
|
"csp-header": "^5.2.1",
|
|
17
17
|
"@rspack/core": "1.6.7",
|
|
18
|
-
"@trackunit/iris-app-api": "1.14.
|
|
18
|
+
"@trackunit/iris-app-api": "1.14.53",
|
|
19
19
|
"@nx/devkit": "22.4.4",
|
|
20
20
|
"@trackunit/shared-utils": "1.13.51",
|
|
21
21
|
"http-proxy-middleware": "3.0.5",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkPackageVersion.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/checkPackageVersion.ts"],"names":[],"mappings":";;;;AAAA,uCAA0C;AAC1C,0DAA4D;AAC5D,iDAAyC;AACzC,uDAAiC;AACjC,uDAAiC;AAEjC;;;;;;GAMG;AACI,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,UAAkB,EAAE,KAAa,EAAE,UAAU,GAAG,IAAI,EAAE,EAAE;IAChG,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,CAAC,wBAAwB;IAC1F,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,gEAAgE;IAEzH,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,YAAY,GAAG,+BAA+B,KAAK,mBAAmB,UAAU,kDAAkD,GAAG,IAAI,KAAK,6FAA6F,CAAC;QACxP,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAfW,QAAA,YAAY,gBAevB;AAEF;;;;;GAKG;AACI,MAAM,sBAAsB,GAAG,KAAK,EAAE,GAAW,EAAE,UAAU,GAAG,IAAI,EAA+B,EAAE;IAC1G,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC5C,OAAO,QAAQ,CAAC,OAAO,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACf,uCAAuC,GAAG,gGAAgG,CACzI,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAZW,QAAA,sBAAsB,0BAYjC;AAEF;;;;;GAKG;AACI,MAAM,cAAc,GAAG,KAAK,EAAE,gBAAwB,EAAE,UAAU,GAAG,IAAI,EAAoB,EAAE;IACpG,MAAM,gBAAgB,GAAG,IAAA,wBAAQ,EAAC,cAAc,CAAC;SAC9C,QAAQ,CAAC,OAAO,CAAC;SACjB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,gCAAgC;IAC5D,OAAO,IAAA,oBAAY,EAAC,IAAI,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,UAAU,CAAC,CAAC;AAC5E,CAAC,CAAA;AALY,QAAA,cAAc,kBAK1B;AAED;;;;;;GAMG;AACI,MAAM,sBAAsB,GAAG,KAAK,EAAE,YAAoC,EAAE,UAAU,GAAG,IAAI,EAAoB,EAAE;IACxH,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAuB,MAAM,IAAA,8BAAsB,EAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACxF,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,sBAAsB,GAAuB,YAAY,CAAC,GAAG,CAAC,CAAC;YACrE,iHAAiH;YACjH,IAAI,sBAAsB,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxE,IAAA,oBAAY,EAAC,GAAG,EAAE,sBAAsB,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAA;AAZY,QAAA,sBAAsB,0BAYlC;AAED,SAAS,YAAY;IACnB,MAAM,gBAAgB,GAAoD,IAAA,qBAAY,EAAC,cAAc,CAAC,CAAC;IACvG,MAAM,qBAAqB,GAAG,IAAA,gCAAiB,EAC7C,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CACrG,CAAC;IACF,MAAM,wBAAwB,GAAG,IAAA,gCAAiB,EAChD,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CACxG,CAAC;IACF,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACM,MAAM,mBAAmB,GAAG,KAAK,EAAE,UAAU,GAAG,IAAI,EAAoB,EAAE;IAC/E,MAAM,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,GAAG,YAAY,EAAE,CAAC;IAC3E,qDAAqD;IACrD,sDAAsD;IACtD,MAAM,IAAA,8BAAsB,EAAC,qBAAqB,EAAE,UAAU,CAAC,CAAC;IAChE,MAAM,IAAA,8BAAsB,EAAC,wBAAwB,EAAE,UAAU,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC,CAAA;AAPY,QAAA,mBAAmB,uBAO/B","sourcesContent":["import { readJsonFile } from \"@nx/devkit\";\nimport { objectFromEntries } from \"@trackunit/shared-utils\";\nimport { execSync } from \"child_process\";\nimport * as pacote from \"pacote\";\nimport * as semver from \"semver\";\n\n/**\n *\n * @param pkg package to look for.\n * @param localRange local version of the package.\n * @param range range\n * @returns { boolean } true if its a valid version\n */\nexport const versionCheck = (pkg: string, localRange: string, range: string, throwError = true) => {\n const localVersion = semver.minVersion(localRange) ?? localRange; // ('^1.0.0') => '1.0.0'\n const remoteVersion = semver.minVersion(range) ?? range; // Assume range is in a format that semver.minVersion can handle\n\n if (!semver.satisfies(localVersion, range)) {\n const msg = `Package \"${pkg}\" outdated. Remote Version: ${range} Local version: ${localRange}. 👈\\n Update package using command: \\n npm i ${pkg}@${range}\\n ...or to update all trackunit dependencies: \\n npx npm-check-updates \"/@trackunit/\" -u`;\n if (semver.major(localVersion) < semver.major(remoteVersion) && throwError) {\n throw new Error(msg);\n } else {\n // eslint-disable-next-line no-console\n console.warn(\"⚠️ \" + msg + \"\\n\");\n return true;\n }\n }\n return true;\n};\n\n/**\n * Get the latest version of the package from the registry.\n *\n * @param pkg package to look for.\n * @returns { Promise<string> } returns version\n */\nexport const getLatestRemoteVersion = async (pkg: string, throwError = true): Promise<string | undefined> => {\n try {\n const manifest = await pacote.manifest(pkg);\n return manifest.version;\n } catch (error) {\n if (throwError) {\n throw new Error(\n `Error fetching manifest for package ${pkg}. This package might need to be published, or it has been included as a dependency by mistake.`\n );\n }\n }\n return undefined;\n};\n\n/**\n * Check if the current version of the package is the same as the one in the manager.\n *\n * @param {string} managerNxVersion version of nx in the manager\n * @returns { boolean} true if its a valid version\n */\nexport const checkNxVersion = async (managerNxVersion: string, throwError = true): Promise<boolean> => {\n const currentNxVersion = execSync(\"nx --version\")\n .toString(\"utf-8\")\n .replace(/\\r?\\n|\\r/, \"\"); // regex removes any line breaks\n return versionCheck(\"nx\", currentNxVersion, managerNxVersion, throwError);\n}\n\n/**\n * Check if the current version of the trackunit packages is the same as the one in the manager.\n *\n * @param {Record<string, string>} dependencies - The dependencies to check.\n * @param {boolean} throwError - Whether to throw an error if the version is not the same.\n * @returns {Promise<boolean>} true if the versions are the same.\n */\nexport const checkTrackunitPackages = async (dependencies: Record<string, string>, throwError = true): Promise<boolean> => {\n for (const key in dependencies) {\n const remoteVersion: string | undefined = await getLatestRemoteVersion(key, throwError);\n if (remoteVersion) {\n const localDependencyVersion: string | undefined = dependencies[key];\n // If @trackunit dependencies are linked/added locally using \"file:\", skip the version check, used for E2E tests.\n if (localDependencyVersion && !localDependencyVersion.includes(\"file:\")) {\n versionCheck(key, localDependencyVersion, remoteVersion, throwError);\n }\n }\n }\n return true;\n}\n\nfunction getLibraries() {\n const packageJsonLocal: Record<string, string | Record<string, string>> = readJsonFile(\"package.json\");\n const trackunitDependencies = objectFromEntries(\n Object.entries(packageJsonLocal.dependencies || {}).filter(([key]) => key.startsWith(\"@trackunit/\"))\n );\n const trackunitDevDependencies = objectFromEntries(\n Object.entries(packageJsonLocal.devDependencies || {}).filter(([key]) => key.startsWith(\"@trackunit/\"))\n );\n return { trackunitDependencies, trackunitDevDependencies };\n}\n\n/**\n * Check if the current version of the packages is the same as the one in the manager.\n * \n * @param {boolean} throwError - Whether to throw an error if the version is not the same.\n * @returns {Promise<boolean>} true if the versions are the same.\n */\n export const checkPackageVersion = async (throwError = true): Promise<boolean> => {\n const { trackunitDependencies, trackunitDevDependencies } = getLibraries();\n // const managerNxVersion = version.managerNxVersion;\n // await checkNxVersion(managerNxVersion, throwError);\n await checkTrackunitPackages(trackunitDependencies, throwError);\n await checkTrackunitPackages(trackunitDevDependencies, throwError);\n return true;\n }\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createInvokeProxyMiddleware.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/createInvokeProxyMiddleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { createProxyMiddleware } from \"http-proxy-middleware\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { buildLocalTarget, extractEndpointPath, getLocalPort, parseExtensionIdFromPath } from \"./devServerUtils\";\nimport { logError, logInfo } from \"./plugin-shared/consoleUtils\";\nimport type { ServerlessPortMap } from \"./spawnServerlessExtensions\";\n\ntype MiddlewareRequest = IncomingMessage & {\n originalUrl?: string;\n};\ntype MiddlewareResponse = ServerResponse<IncomingMessage>;\n\ntype MiddlewareNext = () => void;\ntype ProxyHandler = (req: MiddlewareRequest, res: MiddlewareResponse, next: MiddlewareNext) => void;\n\nconst createRemoteIrisProxy = (): ProxyHandler => {\n const proxy = createProxyMiddleware({\n target: \"https://dev.iris.trackunit.app\",\n changeOrigin: true,\n secure: true,\n });\n return (req, res, next) => {\n void proxy(req, res, next);\n };\n};\n\nconst createLocalExtensionProxy = (target: string, extensionId: string): ProxyHandler => {\n const proxy = createProxyMiddleware({\n target,\n changeOrigin: true,\n pathRewrite: path => extractEndpointPath(path),\n on: {\n error: (err, _proxyReq, proxyRes) => {\n logError(`[Proxy] Error proxying to ${extensionId}: ${err.message}`);\n if (\"writeHead\" in proxyRes && \"end\" in proxyRes) {\n proxyRes.writeHead(502, { \"Content-Type\": \"application/json\" });\n proxyRes.end(JSON.stringify({ error: `Serverless extension ${extensionId} unavailable` }));\n }\n },\n },\n });\n\n return (req, res, next) => {\n void proxy(req, res, next);\n };\n};\n\nconst getOrCreateLocalProxy = (cache: Map<string, ProxyHandler>, extensionId: string, port: number): ProxyHandler => {\n const existing = cache.get(extensionId);\n if (existing !== undefined) {\n return existing;\n }\n\n const target = buildLocalTarget(port);\n const newProxy = createLocalExtensionProxy(target, extensionId);\n cache.set(extensionId, newProxy);\n return newProxy;\n};\n\n/**\n * Creates /invoke middleware that routes to local serverless processes when available.\n */\nexport const createInvokeProxyMiddleware = (serverlessPortMap: ServerlessPortMap | undefined): ProxyHandler => {\n const localProxyCache = new Map<string, ProxyHandler>();\n const remoteProxy = createRemoteIrisProxy();\n\n return (req: MiddlewareRequest, res: MiddlewareResponse, next: MiddlewareNext): void => {\n const fullPath = req.originalUrl ?? `/invoke${req.url ?? \"\"}`;\n const extensionId = parseExtensionIdFromPath(fullPath);\n const localPort = getLocalPort(extensionId, serverlessPortMap);\n\n if (localPort !== undefined && extensionId !== undefined) {\n const endpointPath = extractEndpointPath(fullPath);\n logInfo(`[Proxy] ${fullPath} -> ${buildLocalTarget(localPort)}${endpointPath}`);\n\n const proxy = getOrCreateLocalProxy(localProxyCache, extensionId, localPort);\n proxy(req, res, next);\n return;\n }\n\n remoteProxy(req, res, next);\n };\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devServerUtils.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/devServerUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,0CAA0C;AAC7B,QAAA,iBAAiB,GAAG,KAAK,CAAC;AAC1B,QAAA,iBAAiB,GAAG,KAAK,CAAC;AAEvC,2DAA2D;AAC9C,QAAA,cAAc,GAAG,mCAAmC,CAAC;AAElE,+BAA+B;AAClB,QAAA,oBAAoB,GAC/B,wHAAwH,CAAC;AAE3H,uDAAuD;AAC1C,QAAA,YAAY,GAAG;IAC1B,kCAAkC,EAAE,MAAM;IAC1C,wBAAwB,EAAE,MAAM;IAChC,8BAA8B,EAAE,iCAAiC;IACjE,8BAA8B,EAAE,4BAAoB;CAC5C,CAAC;AAEX;;;;;;GAMG;AACI,MAAM,wBAAwB,GAAG,CAAC,IAAY,EAAsB,EAAE;IAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC9D,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC;AAHW,QAAA,wBAAwB,4BAGnC;AAEF;;;;;;;;;;GAUG;AACI,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAU,EAAE;IAC1D,kDAAkD;IAClD,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC3E,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,eAAe,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IACnC,CAAC;IACD,2DAA2D;IAC3D,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACtE,OAAO,kBAAkB,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AACxC,CAAC,CAAC;AATW,QAAA,mBAAmB,uBAS9B;AAEF;;;;;;GAMG;AACI,MAAM,SAAS,GAAG,CAAC,OAA4B,EAAU,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,sBAAc,CAAC;AAAvF,QAAA,SAAS,aAA8E;AAEpG;;;;;;GAMG;AACI,MAAM,YAAY,GAAG,CAC1B,WAA+B,EAC/B,iBAAkD,EAC9B,EAAE;IACtB,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,iBAAiB,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;AAC7C,CAAC,CAAC;AARW,QAAA,YAAY,gBAQvB;AAEF;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,oBAAoB,IAAI,EAAE,CAAC;AAAxE,QAAA,gBAAgB,oBAAwD","sourcesContent":["/**\n * Pure utility functions for Iris App dev server configuration.\n * These functions are side-effect free and easily testable.\n */\n\n/** Port range for Iris App dev servers */\nexport const IRIS_APP_PORT_MIN = 22220;\nexport const IRIS_APP_PORT_MAX = 22229;\n\n/** Default origin for CORS when not provided in request */\nexport const DEFAULT_ORIGIN = \"https://dev.manager.trackunit.com\";\n\n/** Allowed headers for CORS */\nexport const CORS_ALLOWED_HEADERS =\n \"X-Requested-With, baggage, content-type, Authorization, sentry-trace, session-id, commit-number, x-trackunitappversion\";\n\n/** Static CORS headers for dev server configuration */\nexport const CORS_HEADERS = {\n \"Access-Control-Allow-Credentials\": \"true\",\n \"Access-Control-Max-Age\": \"3600\",\n \"Access-Control-Allow-Methods\": \"GET, POST, PUT, DELETE, OPTIONS\",\n \"Access-Control-Allow-Headers\": CORS_ALLOWED_HEADERS,\n} as const;\n\n/**\n * Parses the extension ID from an invoke URL path.\n * Format: /invoke/@{org}/{app}/{extension-id}/{endpoint}\n *\n * @param path - The URL path to parse\n * @returns {string | undefined} The extension ID or undefined if not found\n */\nexport const parseExtensionIdFromPath = (path: string): string | undefined => {\n const match = path.match(/^\\/invoke\\/@[^/]+\\/[^/]+\\/([^/]+)/);\n return match?.[1];\n};\n\n/**\n * Extracts the endpoint path from an invoke URL.\n * Format: /invoke/@{org}/{app}/{extension-id}/{endpoint}\n *\n * Handles both:\n * - Full path with /invoke prefix (from originalUrl)\n * - Path without /invoke prefix (from req.url after Express mount strips it)\n *\n * @param path - The URL path to extract endpoint from\n * @returns {string} The endpoint path, defaults to \"/\" if no endpoint found\n */\nexport const extractEndpointPath = (path: string): string => {\n // Try with /invoke prefix first (for originalUrl)\n const matchWithInvoke = path.match(/^\\/invoke\\/@[^/]+\\/[^/]+\\/[^/]+(.*)$/);\n if (matchWithInvoke?.[1] !== undefined) {\n return matchWithInvoke[1] || \"/\";\n }\n // Then without (for req.url after Express mount strips it)\n const matchWithoutInvoke = path.match(/^\\/@[^/]+\\/[^/]+\\/[^/]+(.*)$/);\n return matchWithoutInvoke?.[1] || \"/\";\n};\n\n/**\n * Gets the origin from a request's headers, falling back to default.\n *\n * @param headers - Request headers object\n * @param headers.origin - The origin header value\n * @returns {string} The origin string\n */\nexport const getOrigin = (headers: { origin?: string }): string => headers.origin ?? DEFAULT_ORIGIN;\n\n/**\n * Determines if a request should be routed to a local extension.\n *\n * @param extensionId - The parsed extension ID\n * @param serverlessPortMap - Map of extension IDs to local ports\n * @returns {number | undefined} The local port if available, undefined otherwise\n */\nexport const getLocalPort = (\n extensionId: string | undefined,\n serverlessPortMap: Map<string, number> | undefined\n): number | undefined => {\n if (extensionId === undefined) {\n return undefined;\n }\n return serverlessPortMap?.get(extensionId);\n};\n\n/**\n * Builds the local proxy target URL.\n *\n * @param port - The local port number\n * @returns {string} The localhost URL string\n */\nexport const buildLocalTarget = (port: number): string => `http://localhost:${port}`;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enableTsConfigPath.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/enableTsConfigPath.ts"],"names":[],"mappings":";;;AAAA,2BAAkC;AAClC,+BAA4B;AAC5B,mDAAiF;AAOjF,IAAI,QAAqC,CAAC;AAE1C;;;;;GAKG;AACI,MAAM,kBAAkB,GAAG,CAAC,OAAwB,EAAE,EAAE;IAC7D,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAA,WAAI,EAAC,OAAO,CAAC,cAAc,EAAE,mBAAmB,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrH,MAAM,MAAM,GAAG,QAAQ,CAAC,0BAA0B,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAE5G,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,EAAE,QAAQ;QAC/C,MAAM,KAAK,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE9C,MAAM,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE;YACrD,eAAe,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE;SAC7E,CAAC,CAAC;QAEH,8DAA8D;QAC7D,CAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,IAAA,2BAAU,EAC3B,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,IAAA,WAAI,EAAC,OAAO,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CACtE,CAAC;IAC/B,IAAA,yBAAQ,EAAC;QACP,OAAO,EAAE,OAAO,CAAC,aAAa,IAAI,IAAA,WAAI,EAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;QACxF,KAAK,EAAE,UAAU,CAAC,KAAK;KACxB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAvBW,QAAA,kBAAkB,sBAuB7B","sourcesContent":["import { readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { ConfigLoaderSuccessResult, loadConfig, register } from \"tsconfig-paths\";\n\ninterface TSConfigOptions {\n projectRootDir: string;\n workspaceRoot?: string;\n}\n\nlet tsModule: typeof import(\"typescript\");\n\n/**\n * This enables typescript file to load projects from the path section in tsconfig file.\n *\n * @param options - The options to enable tsconfig path\n * @returns {import(\"typescript\").ParsedCommandLine} - Returns the parsed command line\n */\nexport const enableTsConfigPath = (options: TSConfigOptions) => {\n tsModule = require(\"typescript\");\n const readResult = tsModule.readConfigFile(join(options.projectRootDir, \"tsconfig.app.json\"), tsModule.sys.readFile);\n const result = tsModule.parseJsonConfigFileContent(readResult.config, tsModule.sys, options.projectRootDir);\n\n require.extensions[\".ts\"] = function (m, filename) {\n const input = readFileSync(filename, \"utf-8\");\n\n const { outputText } = tsModule.transpileModule(input, {\n compilerOptions: { ...result.options, module: tsModule.ModuleKind.CommonJS },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (m as any)._compile(outputText, filename);\n };\n const loadedConf = loadConfig(\n options.workspaceRoot ? join(options.workspaceRoot, \"tsconfig.base.json\") : options.projectRootDir\n ) as ConfigLoaderSuccessResult;\n register({\n baseUrl: options.workspaceRoot || join(options.projectRootDir, loadedConf.baseUrl || \"\"),\n paths: loadedConf.paths,\n });\n return result;\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getAliasesFromTsConfig.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/getAliasesFromTsConfig.ts"],"names":[],"mappings":";;;;AAAA,mDAA6B;AAC7B,uDAAiC;AAMjC;;;;;GAKG;AACH,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,EAAE;IACtC,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC;AACjH,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,EAAE;IACpC,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AACtG,CAAC,CAAC;AAEF;;;;GAIG;AACI,MAAM,sBAAsB,GAAG,KAAK,EAAE,OAAmC,EAAE,EAAE;IAClF,MAAM,QAAQ,GAAG,EAAE,CAAC,cAAc,CAChC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,gBAAgB,IAAI,oBAAoB,CAAC,EAC9E,EAAE,CAAC,GAAG,CAAC,QAAQ,CAChB,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;QAC5C,MAAM,KAAK,CAAC,oFAAoF,CAAC,CAAC;IACpG,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,KAAsC,CAAC,CAAC,MAAM,CAEnG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACtB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,SAAS,CAAC,wBAAwB,GAAG,eAAe,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACjF,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC,CAAC;AAlBW,QAAA,sBAAsB,0BAkBjC","sourcesContent":["import * as path from \"path\";\nimport * as ts from \"typescript\";\ninterface AliasesFromTsConfigOptions {\n nxRootDir: string;\n tsConfigFilePath?: string;\n}\n\n/**\n * Removes the /* from the end of the alias if it exists.\n *\n * @param tsAlias the alias from the tsconfig.json\n * @returns { string } substring of the alias if it ends with /*\n */\nconst fromTsAlias = (tsAlias: string) => {\n return tsAlias.indexOf(\"/*\") === tsAlias.length - 2 ? tsAlias.substring(0, tsAlias.length - 2) : `${tsAlias}$`;\n};\n\nconst fromTsPath = (tsPath: string) => {\n return tsPath.indexOf(\"/*\") === tsPath.length - 2 ? tsPath.substring(0, tsPath.length - 2) : tsPath;\n};\n\n/**\n * Generates a list of aliases from the options.tsConfigFilePath defaults to tsconfig.base.json.\n *\n * @returns { Promise<Record<string, string>> } aliases Exposes object for module federation.\n */\nexport const getAliasesFromTsConfig = async (options: AliasesFromTsConfigOptions) => {\n const tsConfig = ts.readConfigFile(\n path.join(options.nxRootDir, options.tsConfigFilePath || \"tsconfig.base.json\"),\n ts.sys.readFile\n );\n\n if (!tsConfig.config.compilerOptions?.paths) {\n throw Error(`option tsconfigFilePath missing paths property in (tsConfig.compilerOptions.paths)`);\n }\n return Object.entries(tsConfig.config.compilerOptions?.paths as Record<string, Array<string>>).reduce<\n Record<string, string>\n >((acc, [key, value]) => {\n if (value.length !== 1) {\n throw new TypeError(`Unsupported TS alias ${key} has length ${value.length}`);\n }\n acc[fromTsAlias(key)] = path.join(options.nxRootDir, fromTsPath(value[0] || \"\"));\n return acc;\n }, {});\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getAvailablePort.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/getAvailablePort.ts"],"names":[],"mappings":";;;;AAAA,iDAA2B;AAE3B;;;GAGG;AACH,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,IAAY,EAAoB,EAAE;IACrE,OAAO,IAAI,OAAO,CAAU,OAAO,CAAC,EAAE;QACpC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAElC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAElE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,eAAe,GAAG,KAAK,EAAE,IAAY,EAAoB,EAAE;IAC/D,MAAM,oBAAoB,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACpE,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,wBAAwB,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACtE,OAAO,wBAAwB,CAAC;AAClC,CAAC,CAAC;AAEF;;;;;;GAMG;AACI,MAAM,gBAAgB,GAAG,KAAK,EAAE,OAAe,EAAE,OAAe,EAAmB,EAAE;IAC1F,IAAI,OAAO,GAAG,IAAI,IAAI,OAAO,GAAG,KAAK,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,IAAI,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;AAChE,CAAC,CAAC;AAbW,QAAA,gBAAgB,oBAa3B","sourcesContent":["import * as net from \"net\";\n\n/**\n * Attempts to bind to a port on the specified host.\n * Returns true if successful, false if the port is in use.\n */\nconst canBindToPort = (port: number, host: string): Promise<boolean> => {\n return new Promise<boolean>(resolve => {\n const server = net.createServer();\n\n server.once(\"error\", () => resolve(false));\n server.once(\"listening\", () => server.close(() => resolve(true)));\n\n server.listen(port, host);\n });\n};\n\n/**\n * Checks if a port is available on both localhost and all interfaces (0.0.0.0).\n * Both must be available for the port to be considered free.\n */\nconst isPortAvailable = async (port: number): Promise<boolean> => {\n const availableOnLocalhost = await canBindToPort(port, \"localhost\");\n if (!availableOnLocalhost) {\n return false;\n }\n\n const availableOnAllInterfaces = await canBindToPort(port, \"0.0.0.0\");\n return availableOnAllInterfaces;\n};\n\n/**\n * Gets the first available port in the specified range.\n *\n * @param minPort min port number inclusive (1024 to avoid reserved ports)\n * @param maxPort max port number inclusive (65535 to avoid reserved ports)\n * @returns {number} the first available port in the range\n */\nexport const getAvailablePort = async (minPort: number, maxPort: number): Promise<number> => {\n if (minPort < 1023 || maxPort > 65535 || minPort > maxPort) {\n throw new Error(\"Invalid port range.\");\n }\n\n for (let port = minPort; port <= maxPort; port++) {\n const available = await isPortAvailable(port);\n if (available) {\n return port;\n }\n }\n\n throw new Error(\"No available ports in the specified range.\");\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getCopyPatterns.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/getCopyPatterns.ts"],"names":[],"mappings":"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","sourcesContent":["import { IrisAppManifest, isIconByPath, isImageByPath, serverSideExtensionTypes } from \"@trackunit/iris-app-api\";\nimport * as path from \"path\";\n\n/**\n * Represents a copy pattern for CopyWebpackPlugin/CopyRspackPlugin/vite-plugin-static-copy\n */\nexport interface CopyPattern {\n /** Source path (with forward slashes for glob compatibility) */\n from: string;\n /** Destination path */\n to: string;\n}\n\n/**\n * Represents an icon path extracted from the manifest\n */\ninterface IconPath {\n extensionId: string;\n path: string;\n sourceRoot: string;\n}\n\ninterface GetCopyPatternsOptions {\n /** The root of the nx workspace */\n nxRootDir: string;\n /** The app directory */\n appDir: string;\n /** The Iris app manifest */\n manifest: IrisAppManifest;\n /** Build mode - serverside extensions are only copied in production */\n mode: \"production\" | \"development\";\n}\n\n/**\n * Extracts icon paths from FLEET_EXTENSION menu items.\n * These are SVG icons that need to be copied to the output directory.\n */\nconst getFleetExtensionIconPaths = (manifest: IrisAppManifest): Array<IconPath> => {\n return manifest.extensions\n .filter(extension => {\n return extension.type === \"FLEET_EXTENSION\" && extension.menuItem.image && isIconByPath(extension.menuItem.image);\n })\n .map(extension => {\n if (\n extension.type !== \"FLEET_EXTENSION\" ||\n !extension.menuItem.image ||\n !isIconByPath(extension.menuItem.image)\n ) {\n throw new Error(\"Unexpected extension type after filter\");\n }\n return {\n extensionId: extension.id,\n path: extension.menuItem.image.path,\n sourceRoot: extension.sourceRoot,\n };\n });\n};\n\n/**\n * Extracts icon paths from WIDGET_EXTENSION headers and footers.\n * Widgets can have both a header image and a footer poweredByImage.\n */\nconst getWidgetExtensionIconPaths = (manifest: IrisAppManifest): Array<IconPath> => {\n return manifest.extensions.flatMap(extension => {\n const paths: Array<IconPath> = [];\n\n if (\n extension.type === \"WIDGET_EXTENSION\" &&\n extension.footer?.poweredByImage &&\n isImageByPath(extension.footer.poweredByImage)\n ) {\n paths.push({\n extensionId: extension.id,\n path: extension.footer.poweredByImage.path,\n sourceRoot: extension.sourceRoot,\n });\n }\n\n if (extension.type === \"WIDGET_EXTENSION\" && extension.header.image && isIconByPath(extension.header.image)) {\n paths.push({\n extensionId: extension.id,\n path: extension.header.image.path,\n sourceRoot: extension.sourceRoot,\n });\n }\n\n return paths;\n });\n};\n\n/**\n * Generates copy patterns for serverside extensions (LIFECYCLE_EXTENSION, SERVERLESS_FUNCTION_EXTENSION).\n * These are only copied in production mode.\n */\nconst getServersideExtensionPatterns = (options: GetCopyPatternsOptions): Array<CopyPattern> => {\n const { nxRootDir, appDir, manifest, mode } = options;\n const relativeAppDir = appDir.split(nxRootDir)[1] || \"<unknown appdir>\";\n\n // Only copy serverside extensions in production\n if (mode !== \"production\") {\n return [];\n }\n\n return manifest.extensions\n .filter(extension => serverSideExtensionTypes.includes(extension.type))\n .flatMap(extension => {\n const patterns: Array<CopyPattern> = [\n {\n // globs must use / in path to be valid\n from: path.resolve(nxRootDir, extension.sourceRoot.replace(/\\\\/g, \"/\")),\n to: path.join(nxRootDir, \"dist\", relativeAppDir, \"serverside\", extension.id),\n },\n ];\n\n // Check if extension has dependencyDefinitionFile and add it to patterns if it exists\n if (\"dependencyDefinitionFile\" in extension && extension.dependencyDefinitionFile) {\n const dependencyFileName = path.basename(extension.dependencyDefinitionFile);\n patterns.push({\n // globs must use / in path to be valid\n from: path.resolve(nxRootDir, extension.dependencyDefinitionFile.replace(/\\\\/g, \"/\")),\n // Must specify full file path (not just directory) for copyFileSync\n to: path.join(nxRootDir, \"dist\", relativeAppDir, \"serverside\", extension.id, dependencyFileName),\n });\n }\n\n return patterns;\n });\n};\n\n/**\n * Generates the copy pattern for the assets folder.\n */\nconst getAssetsPattern = (options: GetCopyPatternsOptions): CopyPattern => {\n const { nxRootDir, appDir } = options;\n const relativeAppDir = appDir.split(nxRootDir)[1] || \"<unknown appdir>\";\n\n return {\n // globs must use / in path to be valid\n from: path.join(appDir, \"assets/\").replace(/\\\\/g, \"/\"),\n to: path.join(nxRootDir, \"dist\", relativeAppDir, \"assets\"),\n };\n};\n\n/**\n * Strips the extensionId prefix from a path if present.\n * The updateExtensions function in extensionUtil.ts modifies image.path to include\n * the extensionId prefix for runtime loading, but we need the original path for copying.\n */\nconst stripExtensionIdPrefix = (iconPath: string, extensionId: string): string => {\n if (iconPath.startsWith(extensionId + \"/\")) {\n return iconPath.substring(extensionId.length + 1);\n }\n if (iconPath.startsWith(extensionId)) {\n return iconPath.substring(extensionId.length);\n }\n return iconPath;\n};\n\n/**\n * Generates copy patterns for extension icons (fleet menu icons and widget icons).\n */\nconst getIconPatterns = (options: GetCopyPatternsOptions): Array<CopyPattern> => {\n const { nxRootDir, appDir, manifest } = options;\n const relativeAppDir = appDir.split(nxRootDir)[1] || \"<unknown appdir>\";\n\n const fleetIconPaths = getFleetExtensionIconPaths(manifest);\n const widgetIconPaths = getWidgetExtensionIconPaths(manifest);\n const allIconPaths = [...fleetIconPaths, ...widgetIconPaths];\n\n return allIconPaths.map(iconPath => {\n // The path may have been modified to include extensionId prefix by updateExtensions.\n // We need the original path (without prefix) for the source file location.\n const originalPath = stripExtensionIdPrefix(iconPath.path, iconPath.extensionId);\n\n return {\n // Source file is at sourceRoot/originalPath (without extensionId prefix)\n // globs must use / in path to be valid\n from: path.join(nxRootDir, iconPath.sourceRoot, originalPath).replace(/\\\\/g, \"/\"),\n // Destination is at dist/appDir/extensionId/originalPath\n to: path.join(nxRootDir, \"dist\", relativeAppDir, iconPath.extensionId, originalPath),\n };\n });\n};\n\n/**\n * Gets all copy patterns for an Iris app build.\n *\n * This utility consolidates the copy patterns logic used by webpack, rspack, and vite builds.\n * It generates patterns for:\n * - Serverside extensions (only in production mode)\n * - Assets folder\n * - Extension icons (fleet menu icons and widget icons)\n *\n * @param options - Configuration options for generating copy patterns\n * @returns {Array<CopyPattern>} Array of copy patterns with `from` and `to` paths\n * @example\n * ```ts\n * const patterns = getCopyPatterns({\n * nxRootDir: '/path/to/workspace',\n * appDir: '/path/to/workspace/apps/my-app',\n * manifest: irisAppManifest,\n * mode: 'production',\n * });\n *\n * // Use with CopyWebpackPlugin\n * new CopyWebpackPlugin({ patterns });\n *\n * // Use with CopyRspackPlugin\n * new CopyRspackPlugin({ patterns });\n * ```\n */\nexport const getCopyPatterns = (options: GetCopyPatternsOptions): Array<CopyPattern> => {\n return [...getServersideExtensionPatterns(options), getAssetsPattern(options), ...getIconPatterns(options)];\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getExposedExtensions.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/getExposedExtensions.ts"],"names":[],"mappings":";;;;AAAA,0DAAwF;AACxF,mDAA6B;AAM7B;;;;;GAKG;AACI,MAAM,oBAAoB,GAAG,KAAK,EAAE,OAAiC,EAAoB,EAAE;IAChG,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QACpD,IAAI,CAAC,kCAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,KAAK,SAAS,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CACrC,OAAO,CAAC,SAAS,EACjB,SAAS,CAAC,UAAU,EACpB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAC9C,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAZW,QAAA,oBAAoB,wBAY/B","sourcesContent":["import { Exposes, IrisAppManifest, nonUiExtensionTypes } from \"@trackunit/iris-app-api\";\nimport * as path from \"path\";\n\ninterface ExposedExtensionsOptions {\n nxRootDir: string;\n manifest: IrisAppManifest;\n}\n/**\n * Generates a list of exposed extensions from a manifest.\n *\n * @param options {ExposedExtensionsOptions} The manifest to get the exposed extensions from.\n * @returns {Exposes} Exposes object for module federation.\n */\nexport const getExposedExtensions = async (options: ExposedExtensionsOptions): Promise<Exposes> => {\n const output: Exposes = {};\n for (const extension of options.manifest.extensions) {\n if (!nonUiExtensionTypes.includes(extension.type)) {\n output[`./${extension.id}`] = path.join(\n options.nxRootDir,\n extension.sourceRoot,\n extension.main ? extension.main : \"index.tsx\"\n );\n }\n }\n return output;\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getGraphqlCodeGenConfig.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/getGraphqlCodeGenConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import { CodegenConfig } from \"@graphql-codegen/cli\";\nimport { existsSync, rmSync } from \"fs\";\nimport { join } from \"path\";\n\n/**\n * This function returns the codegen config for trackunit public graphql-codegen.\n *\n * @param nxLibPath The library path.\n * @param gqlFilePaths (optional) An array of library relative paths to the graphql-files to generate hooks for.\n * @returns {CodegenConfig } GraphQL code generation config.\n */\nexport const getGraphqlCodegenConfig: (nxLibPath: string, gqlFilePaths?: Array<string>) => CodegenConfig = (\n nxLibPath: string,\n gqlFilePaths?: Array<string>\n) => {\n const internalSchemaFilePath = join(\n __dirname,\n \"..\",\n \"..\",\n \"..\",\n \"..\",\n \"libs\",\n \"api\",\n \"internal-gql-schema\",\n \"generated\",\n \"internal-schema.gql\"\n );\n const publicSchemaUrlOrInternalSchemaPath = existsSync(internalSchemaFilePath)\n ? internalSchemaFilePath\n : \"https://iris.trackunit.com/api/graphql/\";\n\n // eslint-disable-next-line no-console\n console.log(`Using schema: ${publicSchemaUrlOrInternalSchemaPath}`);\n\n // Adds a / to the end of the path to make gql client-preset happy - also on Windows\n const generatedGqlOutputFolder = join(nxLibPath, \"src\", \"generated\", \"graphql-api\") + \"/\";\n if (existsSync(generatedGqlOutputFolder)) {\n rmSync(generatedGqlOutputFolder, { recursive: true });\n // eslint-disable-next-line no-console\n console.log(`Cleanup path: ${generatedGqlOutputFolder}`);\n }\n const documents =\n gqlFilePaths && gqlFilePaths.length > 0 ? gqlFilePaths : [join(nxLibPath, \"src\", \"**\", \"*.graphql\")];\n if (!gqlFilePaths) {\n documents.push(join(`!${nxLibPath}`, \"src\", \"**\", \"*-manager.graphql\"));\n }\n\n const generates: CodegenConfig[\"generates\"] = {};\n generates[generatedGqlOutputFolder] = {\n schema: publicSchemaUrlOrInternalSchemaPath,\n documents,\n preset: \"client\",\n plugins: [\n {\n add: {\n content: [\n \"export type DateTimeISOString = string;\",\n \"import type { PublicIrisAppManifest } from '@trackunit/iris-app-api';\",\n ],\n },\n },\n ],\n config: {\n scalars: {\n Cursor: \"string\",\n Date: \"DateTimeISOString\",\n DateTime: \"DateTimeISOString\",\n GeoJSONCoordinates: \"[number, number] | [number, number][] | [number, number][][]\",\n PublicIrisAppManifest: \"PublicIrisAppManifest\",\n PhoneNumber: \"string\",\n EmailAddress: \"string\",\n Currency: \"string\",\n Url: \"string\",\n },\n namingConvention: {\n typeNames: \"keep\",\n enumValues: \"keep\",\n },\n avoidOptionals: {\n field: true,\n inputValue: false,\n object: true,\n defaultValue: true,\n },\n },\n presetConfig: {\n fragmentMasking: { unmaskFunctionName: \"getFragmentData\" },\n noExport: true,\n avoidOptionals: {\n field: true,\n inputValue: false,\n object: true,\n defaultValue: true,\n },\n noNamespaces: true,\n namingConvention: {\n typeNames: \"keep\",\n enumValues: \"keep\",\n },\n },\n };\n\n return {\n schema: \"\",\n ignoreNoDocuments: true, // for better experience with the watcher\n generates,\n };\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getIrisAppDevServer.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/getIrisAppDevServer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { DevServer as RspackDevServer } from \"@rspack/core\";\nimport type { Configuration as WebpackDevServerConfiguration } from \"webpack-dev-server\";\nimport { createInvokeProxyMiddleware } from \"./createInvokeProxyMiddleware\";\nimport { CORS_ALLOWED_HEADERS, CORS_HEADERS, getOrigin, IRIS_APP_PORT_MAX, IRIS_APP_PORT_MIN } from \"./devServerUtils\";\nimport { getAvailablePort } from \"./getAvailablePort\";\nimport type { ServerlessPortMap } from \"./spawnServerlessExtensions\";\n\nexport interface DevServerOptions {\n serverlessPortMap?: ServerlessPortMap;\n}\n\ntype MiddlewareRequest = {\n url?: string;\n originalUrl?: string;\n method?: string;\n headers: { origin?: string } & Record<string, string | undefined>;\n};\n\ntype MiddlewareResponse = {\n header: (name: string, value: string) => void;\n writeHead: (status: number, headers?: Record<string, string>) => void;\n end: (body?: string) => void;\n send: (body: unknown) => void;\n status: (code: number) => void;\n};\n\ntype MiddlewareNext = () => void;\n\ntype DevServerApp = { use: (path: string, handler: unknown) => void };\n\ntype MiddlewareEntry = { name?: string; path?: string; middleware: unknown };\n\n/** Sets CORS headers on the response. */\nconst setCorsHeaders = (response: Pick<MiddlewareResponse, \"header\">, headers: { origin?: string }): void => {\n response.header(\"Access-Control-Allow-Origin\", getOrigin(headers));\n response.header(\"Access-Control-Allow-Headers\", CORS_ALLOWED_HEADERS);\n};\n\n/** CORS preflight middleware - responds to non-GET requests with allowed methods. */\nconst corsPreflightMiddleware = (\n req: Pick<MiddlewareRequest, \"method\">,\n res: Pick<MiddlewareResponse, \"end\">,\n next: MiddlewareNext\n): void => {\n if (req.method === \"GET\") {\n next();\n } else {\n res.end(\"GET, HEAD\");\n }\n};\n\n/** CORS origin header middleware - sets Access-Control-Allow-Origin on all requests. */\nconst createCorsOriginHandler = () => {\n return (\n request: Pick<MiddlewareRequest, \"headers\">,\n response: Pick<MiddlewareResponse, \"header\">,\n next: MiddlewareNext\n ): void => {\n response.header(\"Access-Control-Allow-Origin\", getOrigin(request.headers));\n next();\n };\n};\n\n/** Creates the /manifestAndToken endpoint handler. */\nconst createManifestAndTokenHandler = (port: number) => {\n return async (\n request: Pick<MiddlewareRequest, \"headers\">,\n response: Pick<MiddlewareResponse, \"header\" | \"send\" | \"status\">\n ): Promise<void> => {\n setCorsHeaders(response, request.headers);\n try {\n const resp = await fetch(`http://localhost:${port}/manifest.json`);\n const body = await resp.json();\n response.send({ manifest: body });\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"ERROR: \", e);\n response.status(500);\n response.send(e);\n }\n };\n};\n\n/** Creates the /extensionloader.js endpoint handler. */\nconst createExtensionLoaderHandler = () => {\n return async (\n request: Pick<MiddlewareRequest, \"headers\">,\n response: Pick<MiddlewareResponse, \"header\" | \"send\" | \"status\">\n ): Promise<void> => {\n setCorsHeaders(response, request.headers);\n try {\n const url =\n process.env.LOCAL === \"true\"\n ? \"http://localhost:3000/extensionloader.js\"\n : \"https://iris.trackunit.app/extensionloader.js\";\n const resp = await fetch(url);\n const body = await resp.text();\n response.send(body);\n } catch (e) {\n // eslint-disable-next-line no-console\n console.error(\"ERROR: \", e);\n response.status(500);\n response.send(e);\n }\n };\n};\n\n/** Registers all middlewares on the dev server app. */\nconst registerMiddlewares = (\n app: DevServerApp,\n middlewares: Array<MiddlewareEntry>,\n port: number,\n options: DevServerOptions\n): Array<MiddlewareEntry> => {\n // Register /invoke proxy\n app.use(\"/invoke\", createInvokeProxyMiddleware(options.serverlessPortMap));\n\n // Register CORS origin handler on all routes\n app.use(\"/\", createCorsOriginHandler());\n\n // Register endpoint handlers\n app.use(\"/manifestAndToken\", createManifestAndTokenHandler(port));\n app.use(\"/extensionloader.js\", createExtensionLoaderHandler());\n\n // Add CORS preflight to middleware array\n middlewares.push({\n name: \"cors-preflight\",\n path: \"/\",\n middleware: corsPreflightMiddleware,\n });\n\n return middlewares;\n};\n\n/** Creates the base Iris App dev server configuration. */\nconst createIrisAppDevServerConfig = async (port: number, options: DevServerOptions = {}) => ({\n port,\n historyApiFallback: true,\n headers: CORS_HEADERS,\n onListening: () => {},\n setupMiddlewares: (middlewares: Array<MiddlewareEntry>, devServer: { app?: DevServerApp }) => {\n if (devServer.app) {\n return registerMiddlewares(devServer.app, middlewares, port, options);\n }\n return middlewares;\n },\n});\n\n/** Generates a dev server configuration for webpack. */\nexport const getIrisAppWebpackDevServer = async (\n webpackDevServerConfiguration: WebpackDevServerConfiguration = {},\n options: DevServerOptions = {}\n): Promise<WebpackDevServerConfiguration> => {\n const port = await getAvailablePort(IRIS_APP_PORT_MIN, IRIS_APP_PORT_MAX);\n const baseConfig = await createIrisAppDevServerConfig(port, options);\n\n // Type assertion required: webpack-dev-server and rspack have nominally different but\n // structurally identical DevServer types. This is a known limitation acknowledged by\n // the rspack team. See: https://github.com/web-infra-dev/rspack/blob/main/packages/rspack-dev-server/src/server.ts\n // eslint-disable-next-line @trackunit/no-typescript-assertion\n return { ...baseConfig, ...webpackDevServerConfiguration } as unknown as WebpackDevServerConfiguration;\n};\n\n/** Generates a dev server configuration for rspack. */\nexport const getIrisAppRspackDevServer = async (\n rspackDevServerConfiguration: RspackDevServer = {},\n options: DevServerOptions = {}\n): Promise<RspackDevServer> => {\n const port = await getAvailablePort(IRIS_APP_PORT_MIN, IRIS_APP_PORT_MAX);\n const baseConfig = await createIrisAppDevServerConfig(port, options);\n\n // Type assertion required: webpack-dev-server and rspack have nominally different but\n // structurally identical DevServer types. This is a known limitation acknowledged by\n // the rspack team. See: https://github.com/web-infra-dev/rspack/blob/main/packages/rspack-dev-server/src/server.ts\n // eslint-disable-next-line @trackunit/no-typescript-assertion\n return { ...baseConfig, ...rspackDevServerConfiguration } as unknown as RspackDevServer;\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getSharedDependencies.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/getSharedDependencies.ts"],"names":[],"mappings":";;;AAIA;;;;;GAKG;AACI,MAAM,qBAAqB,GAAG,CAAC,KAA8B,EAAU,EAAE;IAC9E,OAAO;QACL;YACE,KAAK,EAAE;gBACL,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,IAAI;gBACX,2DAA2D;gBAC3D,eAAe,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC;aACtD;SACF;QACD;YACE,WAAW,EAAE;gBACX,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,IAAI;gBACX,eAAe,EAAE,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC;aAC1D;SACF;QACD,kBAAkB;KACnB,CAAC;AACJ,CAAC,CAAC;AAnBW,QAAA,qBAAqB,yBAmBhC","sourcesContent":["import { IrisAppManifest, Shared } from \"@trackunit/iris-app-api\";\ninterface SharedDependenciesProps {\n manifest: IrisAppManifest;\n}\n/**\n * Generates a list of shared dependencies for module federation.\n *\n * @param props {ISharedDependenciesOptions} The app manifest file\n * @returns {Shared} The shared dependencies for module federation\n */\nexport const getSharedDependencies = (props: SharedDependenciesProps): Shared => {\n return [\n {\n react: {\n singleton: true,\n eager: true,\n // eslint-disable-next-line @typescript-eslint/dot-notation\n requiredVersion: props.manifest.dependencies[\"react\"],\n },\n },\n {\n \"react-dom\": {\n singleton: true,\n eager: true,\n requiredVersion: props.manifest.dependencies[\"react-dom\"],\n },\n },\n \"single-spa-react\",\n ];\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getTailwindContentForApp.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/getTailwindContentForApp.ts"],"names":[],"mappings":";;;;AAAA,iDAAuE;AACvE,2BAAgC;AAChC,mDAA6B;AAC7B,+BAA4B;AAmC5B;;;;;GAKG;AACI,MAAM,wBAAwB,GAAG,CAAC,OAA+B,EAAiB,EAAE;IACzF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAE9E,IAAI,CAAC,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,yIAAyI,CAC1I,CAAC;IACJ,CAAC;IACD,OAAO;QACL,GAAG,IAAA,4CAAiC,EAAC,OAAO,CAAC,MAAM,EAAE,8CAA8C,CAAC;QACpG,SAAS,GAAG,wEAAwE;KACrF,CAAC;AACJ,CAAC,CAAC;AAZW,QAAA,wBAAwB,4BAYnC;AAEF;;;;;;;;;;GAUG;AACI,MAAM,0BAA0B,GAAG,CAAC,OAAuC,EAAkB,EAAE;IACpG,OAAO;QACL,OAAO,EAAE,IAAA,gCAAwB,EAAC,OAAO,CAAC;KAC3C,CAAC;AACJ,CAAC,CAAC;AAJW,QAAA,0BAA0B,8BAIrC","sourcesContent":["import { createGlobPatternsForDependencies } from \"@nx/react/tailwind\";\nimport { existsSync } from \"fs\";\nimport * as path from \"path\";\nimport { join } from \"path\";\n\nexport interface TailwindContentOptions {\n /*\n * Root of the nx repo.\n */\n nxRootDir?: string;\n\n /**\n * The name of the folder in the nx repo this iris app is in.\n */\n appDir: string;\n}\n\nexport interface TrackunitTailwindConfigOptions {\n /*\n * Root of the nx repo.\n */\n nxRootDir?: string;\n\n /**\n * The name of the folder in the nx repo this iris app is in.\n */\n appDir: string;\n}\n\n/**\n * Tailwind CSS v4 configuration type.\n * In v4, config files are simplified to mainly contain content paths.\n * Theme configuration is done via CSS @theme blocks instead.\n */\nexport type TailwindConfig = {\n content: Array<string>;\n};\n\n/**\n * Generates a list of exposed extensions from a manifest.\n *\n * @param options {TailwindContentOptions} The options include necessary information to get the dependencies.\n * @returns {string[]} Exposes object for module federation. The list of files to include in the tailwind content.\n */\nexport const getTailwindContentForApp = (options: TailwindContentOptions): Array<string> => {\n const nxRootDir = options.nxRootDir || path.resolve(options.appDir, \"../../\");\n\n if (!existsSync(join(nxRootDir, \"nx.json\"))) {\n throw new Error(\n \"nx.json not found. Are you sure this is an nx repo, if you have more then 2 levels of nesting you need to pass in the nxRootDir option.\"\n );\n }\n return [\n ...createGlobPatternsForDependencies(options.appDir, \"/**/!(*.stories|*.spec).{tsx,jsx,ts,js,html}\"),\n nxRootDir + \"/node_modules/@trackunit/*/**/!(*.stories|*.spec).{tsx,jsx,ts,js,html}\",\n ];\n};\n\n/**\n * Generates a Tailwind CSS v4 config for use with iris apps.\n *\n * In Tailwind CSS v4, configuration is simplified:\n * - Theme values are defined via CSS @theme blocks (imported from @trackunit/css-core)\n * - Plugins like container-queries are built into v4\n * - Config files only need content paths for CSS purging\n *\n * @param options {TrackunitTailwindConfigOptions} The options include necessary information to get the dependencies.\n * @returns {TailwindConfig} Tailwind v4 config for the app (content paths only).\n */\nexport const getTrackunitTailwindConfig = (options: TrackunitTailwindConfigOptions): TailwindConfig => {\n return {\n content: getTailwindContentForApp(options),\n };\n};\n"]}
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/index.ts"],"names":[],"mappings":";;;AAAA,gEAAsC;AACtC,wEAA8C;AAC9C,+DAAqC;AACrC,mEAAyC;AACzC,6DAAmC;AACnC,4DAAkC;AAClC,iEAAuC;AACvC,oEAA0C;AAC1C,gEAAsC;AACtC,kEAAwC;AACxC,qEAA2C;AAC3C,uEAA6C;AAC7C,0EAAgD;AAChD,wEAA8C;AAC9C,wEAA8C;AAC9C,sEAA4C","sourcesContent":["export * from \"./checkPackageVersion\";\nexport * from \"./createInvokeProxyMiddleware\";\nexport * from \"./enableTsConfigPath\";\nexport * from \"./getAliasesFromTsConfig\";\nexport * from \"./getAvailablePort\";\nexport * from \"./getCopyPatterns\";\nexport * from \"./getExposedExtensions\";\nexport * from \"./getGraphqlCodeGenConfig\";\nexport * from \"./getIrisAppDevServer\";\nexport * from \"./getSharedDependencies\";\nexport * from \"./getTailwindContentForApp\";\nexport * from \"./plugin-shared/consoleUtils\";\nexport * from \"./plugin-shared/customFieldUtil\";\nexport * from \"./plugin-shared/extensionUtil\";\nexport * from \"./plugin-shared/indexHtmlUtil\";\nexport * from \"./spawnServerlessExtensions\";\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consoleUtils.js","sourceRoot":"","sources":["../../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/plugin-shared/consoleUtils.ts"],"names":[],"mappings":";;;AAAa,QAAA,KAAK,GAAG,SAAS,CAAC;AAClB,QAAA,KAAK,GAAG,UAAU,CAAC;AACnB,QAAA,GAAG,GAAG,UAAU,CAAC;AACjB,QAAA,MAAM,GAAG,UAAU,CAAC;AAEjC;;GAEG;AACI,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAE,EAAE;IAC1C,sCAAsC;IACtC,OAAO,CAAC,KAAK,CAAC,WAAG,EAAE,OAAO,EAAE,aAAK,CAAC,CAAC;AACrC,CAAC,CAAC;AAHW,QAAA,QAAQ,YAGnB;AAEF;;GAEG;AACI,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,EAAE;IAC5C,sCAAsC;IACtC,OAAO,CAAC,IAAI,CAAC,cAAM,EAAE,OAAO,EAAE,aAAK,CAAC,CAAC;AACvC,CAAC,CAAC;AAHW,QAAA,UAAU,cAGrB;AAEF;;GAEG;AACI,MAAM,OAAO,GAAG,CAAC,OAAe,EAAE,EAAE;IACzC,sCAAsC;IACtC,OAAO,CAAC,IAAI,CAAC,aAAK,EAAE,OAAO,EAAE,aAAK,CAAC,CAAC;AACtC,CAAC,CAAC;AAHW,QAAA,OAAO,WAGlB","sourcesContent":["export const RESET = \"\\x1b[0m\";\nexport const GREEN = \"\\x1b[32m\";\nexport const RED = \"\\x1b[31m\";\nexport const YELLOW = \"\\x1b[33m\";\n\n/**\n * Logs an error message and exits the program with a non-zero exit code.\n */\nexport const logError = (message: string) => {\n // eslint-disable-next-line no-console\n console.error(RED, message, RESET);\n};\n\n/**\n * Logs a warning message.\n */\nexport const logWarning = (message: string) => {\n // eslint-disable-next-line no-console\n console.warn(YELLOW, message, RESET);\n};\n\n/**\n * Logs an info message.\n */\nexport const logInfo = (message: string) => {\n // eslint-disable-next-line no-console\n console.info(GREEN, message, RESET);\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"customFieldUtil.js","sourceRoot":"","sources":["../../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/plugin-shared/customFieldUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CustomFieldDefinition,\n CustomFieldTranslationArray,\n isCustomFieldTranslationArray,\n TranslationLanguageKeys,\n} from \"@trackunit/iris-app-api\";\nimport { exit } from \"process\";\nimport { logError } from \"./consoleUtils\";\nimport { convertTranslationKeyIfNeeded, isTranslationsObject } from \"./irisAppTranslationUtils\";\n\n/**\n * Updates the custom field definitions with the given app source directory.\n * If the custom field definitions are not provided, it returns an empty array.\n * If the app source directory is not provided, it returns the custom field definitions.\n *\n * @returns {CustomFieldDefinition[]} the updated custom field definitions array\n */\nexport const updateCustomFields = (\n customFieldDefinitions?: Array<CustomFieldDefinition>,\n appSrc?: string\n): Array<CustomFieldDefinition> => {\n if (!customFieldDefinitions || !appSrc) {\n return [];\n }\n customFieldDefinitions.forEach(customFieldDefinition => {\n if (isCustomFieldTranslationArray(customFieldDefinition.translations)) {\n const foundEn = customFieldDefinition.translations.find(translation => translation.language === \"en\");\n if (!foundEn) {\n logError(\n ` ✨ Translation not found for language \"en\" you must supply the english translation for custom field: ${customFieldDefinition.key}`\n );\n exit(1);\n }\n } else {\n const titles = convertTranslationKeyIfNeeded(customFieldDefinition.translations.title, appSrc);\n const descriptions = convertTranslationKeyIfNeeded(customFieldDefinition.translations.description, appSrc);\n\n if (!titles || !descriptions) {\n logError(\n ` ✨ Translation not found for language \"en\" you must supply the english translation for custom field: ${customFieldDefinition.key}`\n );\n exit(1);\n }\n const titleKeys = isTranslationsObject(titles)\n ? Object.keys(titles).filter((key): key is TranslationLanguageKeys => key in titles)\n : null;\n\n if (titleKeys !== null && titleKeys.indexOf(\"en\") === -1) {\n logError(\n ` ✨ Translation not found 'title' for language \"en\" you must supply the english translation for custom field: ${customFieldDefinition.key}`\n );\n exit(1);\n }\n\n const descriptionKeys = isTranslationsObject(descriptions)\n ? Object.keys(descriptions).filter((key): key is TranslationLanguageKeys => key in descriptions)\n : null;\n\n if (descriptionKeys !== null && descriptionKeys.indexOf(\"en\") === -1) {\n logError(\n ` ✨ Translation not found 'description' for language \"en\" you must supply the english translation for custom field: ${customFieldDefinition.key}`\n );\n exit(1);\n }\n\n const keys = new Set([...(titleKeys || []), ...(descriptionKeys || [])]);\n const translations: CustomFieldTranslationArray = [\n {\n language: \"en\",\n title: isTranslationsObject(titles) ? titles.en : titles,\n description: isTranslationsObject(descriptions) ? descriptions.en : descriptions,\n },\n ];\n\n keys.forEach(language => {\n if (language !== \"en\") {\n translations.push({\n language,\n\n title: isTranslationsObject(titles) ? titles[language]! : titles,\n description: isTranslationsObject(descriptions) ? descriptions[language] : descriptions,\n });\n }\n });\n customFieldDefinition.translations = translations;\n }\n });\n return customFieldDefinitions;\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensionUtil.js","sourceRoot":"","sources":["../../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/plugin-shared/extensionUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AssetHomeExtensionManifest,\n FleetExtensionManifest,\n IconByName,\n IconByPath,\n ImageByPath,\n IrisAppExtension,\n isFooterWithLink,\n isIconByPath,\n isImageByPath,\n SvgImagePath,\n} from \"@trackunit/iris-app-api\";\nimport { convertTranslationKeyIfNeeded, isTranslationKey } from \"./irisAppTranslationUtils\";\n\nconst fixUrl = (image: IconByName | IconByPath | ImageByPath | string, extensionId: string) => {\n if (isIconByPath(image) || isImageByPath(image)) {\n if (image.path.toString().startsWith(\"/\")) {\n image.path = (extensionId + image.path.toString()) as SvgImagePath;\n } else {\n image.path = (extensionId + \"/\" + image.path.toString()) as SvgImagePath;\n }\n }\n};\n\n/**\n * Updates the extensions with the correct translation keys and paths\n *\n * @param extensions - The extensions to update\n * @returns { IrisAppExtension[]} The updated extensions\n */\nexport const updateExtensions = (extensions: Array<IrisAppExtension>): Array<IrisAppExtension> => {\n extensions.forEach(extension => {\n if (\n extension.type !== \"IRIS_APP_SETTINGS_EXTENSION\" &&\n extension.type !== \"WIDGET_EXTENSION\" &&\n extension.type !== \"LIFECYCLE_EXTENSION\" &&\n extension.type !== \"SERVERLESS_FUNCTION_EXTENSION\" &&\n extension.menuItem.name\n ) {\n extension.menuItem.name =\n convertTranslationKeyIfNeeded(extension.menuItem.name, extension.sourceRoot) || \"Unknown\";\n }\n\n if (extension.type === \"WIDGET_EXTENSION\" && extension.header.name) {\n if (isIconByPath(extension.header.image) && !extension.header.image.path.startsWith(extension.id)) {\n fixUrl(extension.header.image, extension.id);\n }\n\n if (\n extension.footer &&\n (isIconByPath(extension.footer.poweredByImage) || isImageByPath(extension.footer.poweredByImage)) &&\n !extension.footer.poweredByImage.path.startsWith(extension.id)\n ) {\n fixUrl(extension.footer.poweredByImage, extension.id);\n }\n if (\n extension.footer &&\n isFooterWithLink(extension.footer) &&\n isTranslationKey(extension.footer.linkDescription)\n ) {\n extension.footer.linkDescription = convertTranslationKeyIfNeeded(\n extension.footer.linkDescription,\n extension.sourceRoot\n );\n }\n extension.header.name = convertTranslationKeyIfNeeded(extension.header.name, extension.sourceRoot) || \"Unknown\";\n }\n\n if (extension.type === \"REPORT_EXTENSION\" && isTranslationKey(extension.menuItem.description)) {\n extension.menuItem.description =\n convertTranslationKeyIfNeeded(extension.menuItem.description, extension.sourceRoot) || \"Unknown\";\n }\n if (extension.type === \"ASSET_HOME_EXTENSION\" || extension.type === \"FLEET_EXTENSION\") {\n updateConditions(extension);\n }\n if (extension.type === \"FLEET_EXTENSION\") {\n if (isIconByPath(extension.menuItem.image) && !extension.menuItem.image.path.startsWith(extension.id)) {\n fixUrl(extension.menuItem.image, extension.id);\n }\n if (extension.menuItem.description) {\n extension.menuItem.description = convertTranslationKeyIfNeeded(\n extension.menuItem.description,\n extension.sourceRoot\n );\n }\n }\n });\n return extensions;\n};\n\n/**\n * Updates the conditions of the extension\n *\n * @param extension - The extension to update\n */\nexport const updateConditions = (extension: AssetHomeExtensionManifest | FleetExtensionManifest) => {\n if (extension.conditions?.brand) {\n if (Array.isArray(extension.conditions.brand)) {\n extension.conditions.brand.forEach(brand => {\n if (typeof brand !== \"string\") {\n brand.pattern = brand.pattern.toString();\n }\n });\n } else if (typeof extension.conditions.brand !== \"string\") {\n extension.conditions.brand.pattern = extension.conditions.brand.pattern.toString();\n }\n }\n if (extension.conditions?.model) {\n if (Array.isArray(extension.conditions.model)) {\n extension.conditions.model.forEach(model => {\n if (typeof model !== \"string\") {\n model.pattern = model.pattern.toString();\n }\n });\n } else if (typeof extension.conditions.model !== \"string\") {\n extension.conditions.model.pattern = extension.conditions.model.pattern.toString();\n }\n }\n if (extension.type === \"ASSET_HOME_EXTENSION\") {\n const dtCondition = extension.conditions?.telematicsDeviceType;\n if (dtCondition) {\n if (Array.isArray(dtCondition)) {\n dtCondition.forEach(dt => {\n if (typeof dt !== \"string\") {\n dt.pattern = dt.pattern.toString();\n }\n });\n } else if (typeof dtCondition !== \"string\") {\n dtCondition.pattern = dtCondition.pattern.toString();\n }\n }\n }\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexHtmlUtil.js","sourceRoot":"","sources":["../../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/plugin-shared/indexHtmlUtil.ts"],"names":[],"mappings":";;;AAAA,0DAA8F;AAC9F,mCAAqC;AACrC,2CAAoC;AACpC,2BAAkC;AAClC,+BAA4B;AAE5B;;GAEG;AACI,MAAM,eAAe,GAAG,CAAC,EAC9B,QAAQ,EACR,WAAW,EACX,QAAQ,GAKT,EAAE,EAAE;IACH,kDAAkD;IAClD,MAAM,aAAa,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,IAAA,iBAAY,EAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,mBAAmB,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE/D,MAAM,GAAG,GAAG,IAAA,mBAAM,EAAC;QACjB,8DAA8D;QAC9D,UAAU,EAAE,IAAA,8BAAe,EACzB,QAAQ,CAAC,YAAY,EACrB,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CACzC;QACvC,OAAO,EAAE;YACP,iBAAiB,EAAjB,gCAAiB;YACjB,QAAQ,EAAE,EAAE,aAAa,EAAE,CAAC,sBAAsB,CAAC,EAAE,YAAY,EAAE,CAAC,UAAU,mBAAmB,GAAG,CAAC,EAAE;SACxG;KACF,CAAC,CAAC;IAEH,IAAI,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAExD,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjE,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,6BAA6B,EAAE,QAAQ,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC;IACtF,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAChF,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC;IACD,mDAAmD;IACnD,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAvCW,QAAA,eAAe,mBAuC1B","sourcesContent":["import { irisAppCspInput, irisAppDefaultCsp, IrisAppManifest } from \"@trackunit/iris-app-api\";\nimport { randomBytes } from \"crypto\";\nimport { getCSP } from \"csp-header\";\nimport { readFileSync } from \"fs\";\nimport { join } from \"path\";\n\n/**\n * Updates the index.html file with the given manifest and package.json file.\n */\nexport const updateIndexHtml = ({\n manifest,\n packageJson,\n devtools,\n}: {\n manifest: IrisAppManifest;\n packageJson: string;\n devtools?: string;\n}) => {\n // Try to use the existing updateIndexHtml utility\n const indexHtmlPath = join(__dirname, \"index.html\");\n const indexContents = readFileSync(indexHtmlPath, \"utf8\");\n const scopeAndModuleNonce = randomBytes(16).toString(\"base64\");\n\n const csp = getCSP({\n // eslint-disable-next-line @trackunit/no-typescript-assertion\n directives: irisAppCspInput(\n manifest.validDomains,\n manifest.cspHeader ? { ...manifest.cspHeader, sandbox: undefined } : undefined\n ) as import(\"csp-header\").CSPDirectives,\n presets: {\n irisAppDefaultCsp,\n localDev: { \"connect-src\": [\"ws://localhost:8097/\"], \"script-src\": [`'nonce-${scopeAndModuleNonce}'`] },\n },\n });\n\n let html = indexContents.replace(\"{{cspContent}}\", csp);\n\n html = html.replaceAll(\"{{devTools}}\", devtools ? devtools : \"\");\n html = html.replaceAll(\"{{scope}}\", JSON.parse(packageJson).name);\n html = html.replaceAll(\"{{remoteEntryModuleFormat}}\", manifest.moduleFormat ?? \"cjs\");\n if (manifest.scopes) {\n html = html.replaceAll(\"{{manifestScopes}}\", JSON.stringify(manifest.scopes));\n } else {\n html = html.replaceAll(\"{{manifestScopes}}\", \"undefined\");\n }\n // nonce last if anything above injects script tags\n html = html.replaceAll(\"{{nonce}}\", scopeAndModuleNonce);\n return html;\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"irisAppTranslationUtils.js","sourceRoot":"","sources":["../../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/plugin-shared/irisAppTranslationUtils.ts"],"names":[],"mappings":";;;;AAAA,0DAAqF;AACrF,+CAAyB;AACzB,mDAA6B;AAC7B,qCAA+B;AAC/B,iDAAsD;AAEtD;;;;;GAKG;AACI,MAAM,6BAA6B,GAAG,CAC3C,cAAyE,EACzE,MAAc,EACqB,EAAE;IACrC,MAAM,MAAM,GAAG,cAAc,CAAC;IAE9B,IAAI,IAAA,wBAAgB,EAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC;QAElC,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;QACrF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;YAC1C,IAAA,uBAAQ,EAAC,uCAAuC,MAAM,CAAC,GAAG,kBAAkB,qBAAqB,EAAE,CAAC,CAAC;YACrG,IAAA,cAAI,EAAC,CAAC,CAAC,CAAC;QACV,CAAC;QACD,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC,CAAC;QAClF,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,CAAC;YACpC,IAAA,uBAAQ,EAAC,kCAAkC,MAAM,CAAC,GAAG,kBAAkB,qBAAqB,EAAE,CAAC,CAAC;YAChG,IAAA,cAAI,EAAC,CAAC,CAAC,CAAC;QACV,CAAC;QAED,MAAM,YAAY,GAAiB;YACjC,EAAE,EAAE,cAAc,CAAC,cAAc,CAAC;SACnC,CAAC;QAEF,2BAAY,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;YAClC,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;YAC3F,IAAI,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBACvC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC;gBACjF,YAAY,CAAC,YAAY,CAAC,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,IAAA,yBAAU,EAAC,+CAA+C,MAAM,CAAC,GAAG,kBAAkB,mBAAmB,EAAE,CAAC,CAAC;YAC/G,CAAC;QACH,CAAC,CAAC,CAAC;QACH,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,IAAI,SAAS,CAAC;AAC7B,CAAC,CAAC;AApCW,QAAA,6BAA6B,iCAoCxC;AAEF;;;;;;;;;;GAUG;AACI,MAAM,gBAAgB,GAAG,CAC9B,MAAiE,EACvC,EAAE;IAC5B,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,IAAI,MAAM,CAAC;AAC1E,CAAC,CAAC;AAJW,QAAA,gBAAgB,oBAI3B;AAEF;;;;;;;;;;;;GAYG;AACI,MAAM,oBAAoB,GAAG,CAClC,MAAiE,EACzC,EAAE;IAC1B,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,IAAI,MAAM,CAAC;AACzE,CAAC,CAAC;AAJW,QAAA,oBAAoB,wBAI/B","sourcesContent":["import { languageKeys, TranslationKey, Translations } from \"@trackunit/iris-app-api\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { exit } from \"process\";\nimport { logError, logWarning } from \"./consoleUtils\";\n\n/**\n * Convert translation key if needed\n *\n * @param translationObj - The translation object to convert\n * @param srcDir - The source directory\n */\nexport const convertTranslationKeyIfNeeded = (\n translationObj: string | Translations | TranslationKey | null | undefined,\n srcDir: string\n): Translations | string | undefined => {\n const result = translationObj;\n\n if (isTranslationKey(result)) {\n const translationKey = result.key;\n\n const enTranslationFilePath = path.join(srcDir, \"locales\", \"en\", \"translation.json\");\n if (!fs.existsSync(enTranslationFilePath)) {\n logError(` ✨ Translation file not found for: \"${result.key}\" looked here: ${enTranslationFilePath}`);\n exit(1);\n }\n const enTranslations = JSON.parse(fs.readFileSync(enTranslationFilePath, \"utf8\"));\n if (!enTranslations[translationKey]) {\n logError(` ✨ Translation not found for: \"${result.key}\" looked here: ${enTranslationFilePath}`);\n exit(1);\n }\n\n const translations: Translations = {\n en: enTranslations[translationKey],\n };\n\n languageKeys.forEach(languageCode => {\n const translationFilePath = path.join(srcDir, \"locales\", languageCode, \"translation.json\");\n if (fs.existsSync(translationFilePath)) {\n const lngTranslations = JSON.parse(fs.readFileSync(translationFilePath, \"utf8\"));\n translations[languageCode] = lngTranslations[translationKey];\n } else {\n logWarning(` ✨ Warning translation file not found for: \"${result.key}\" looked here: ${translationFilePath}`);\n }\n });\n return translations;\n }\n return result || undefined;\n};\n\n/**\n * Check if the object is a translation key\n *\n * @param object - The object to check\n * @returns {boolean} if the object is a translation key, false otherwise\n * @example\n * const translationKey: TranslationKey = {\n * key: \"hello\",\n * };\n * console.log(isTranslationKey(translationKey)); // true\n */\nexport const isTranslationKey = (\n object: string | Translations | TranslationKey | undefined | null\n): object is TranslationKey => {\n return typeof object === \"object\" && object !== null && \"key\" in object;\n};\n\n/**\n * Check if the object is a translations object\n *\n * @param object - The object to check\n * @returns {boolean} if the object is a translations object, false otherwise\n * @example\n * const translations: Translations = {\n * en: \"Hello\",\n * da: \"Hej\",\n * };\n * console.log(isTranslationsObject(translations)); // true\n * console.log(isTranslationsObject({ edn: \"Hello\" })); // false\n */\nexport const isTranslationsObject = (\n object: string | Translations | TranslationKey | undefined | null\n): object is Translations => {\n return typeof object === \"object\" && object !== null && \"en\" in object;\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverlessUtils.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/serverlessUtils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,sDAAsD;AACzC,QAAA,mBAAmB,GAAG,KAAK,CAAC;AAC5B,QAAA,mBAAmB,GAAG,KAAK,CAAC;AAEzC,yCAAyC;AAC5B,QAAA,yBAAyB,GAAG,+BAAwC,CAAC;AAElF;;;;;GAKG;AACI,MAAM,kBAAkB,GAAG,CAChC,WAAmB,EAInB,EAAE,CAAC,CAAC;IACJ,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,WAAW,QAAQ,CAAC;CAC5C,CAAC,CAAC;AARU,QAAA,kBAAkB,sBAQ5B;AAEH;;;;;;;GAOG;AACI,MAAM,kBAAkB,GAAG,CAChC,aAAqB,EACrB,IAAY,EACZ,UAA6B,EAM7B,EAAE,CAAC,CAAC;IACJ,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE;QACH,GAAG,UAAU;QACb,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;KACnB;IACD,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;IACjC,KAAK,EAAE,IAAI;CACZ,CAAC,CAAC;AAjBU,QAAA,kBAAkB,sBAiB5B;AAEH;;;;;;GAMG;AACI,MAAM,aAAa,GAAG,CAAC,WAAmB,EAAE,IAAY,EAAU,EAAE,CAAC,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;AAA1F,QAAA,aAAa,iBAA6E;AAEvG;;;;;GAKG;AACI,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAiB,EAAE,CAChE,IAAI;KACD,QAAQ,EAAE;KACV,IAAI,EAAE;KACN,KAAK,CAAC,IAAI,CAAC;KACX,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AALxB,QAAA,kBAAkB,sBAKM;AAErC;;;;;;;GAOG;AACI,MAAM,kBAAkB,GAAG,CAChC,WAAmB,EACnB,IAAmB,EACnB,MAA6B,EACiB,EAAE;IAChD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,WAAW,qBAAqB,IAAI,EAAE,EAAE,CAAC;IAC5F,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,WAAW,yBAAyB,MAAM,EAAE,EAAE,CAAC;IACnG,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3C,CAAC,CAAC;AAZW,QAAA,kBAAkB,sBAY7B","sourcesContent":["/**\n * Pure utility functions for serverless extension spawning.\n * These functions are side-effect free and easily testable.\n */\n\n/** Port range for serverless extension dev servers */\nexport const SERVERLESS_PORT_MIN = 22230;\nexport const SERVERLESS_PORT_MAX = 22239;\n\n/** Serverless extension type constant */\nexport const SERVERLESS_EXTENSION_TYPE = \"SERVERLESS_FUNCTION_EXTENSION\" as const;\n\n/**\n * Creates the spawn command arguments for an extension.\n *\n * @param extensionId - The extension ID to serve\n * @returns {{ command: string, args: Array<string> }} Object with command and args array\n */\nexport const createSpawnCommand = (\n extensionId: string\n): {\n command: string;\n args: Array<string>;\n} => ({\n command: \"npx\",\n args: [\"nx\", \"run\", `${extensionId}:serve`],\n});\n\n/**\n * Creates spawn options for a serverless extension process.\n *\n * @param workspaceRoot - The NX workspace root directory\n * @param port - The port to run the extension on\n * @param processEnv - The current process environment\n * @returns {{ cwd: string, env: object, stdio: Array, shell: boolean }} SpawnOptions compatible object\n */\nexport const createSpawnOptions = (\n workspaceRoot: string,\n port: number,\n processEnv: NodeJS.ProcessEnv\n): {\n cwd: string;\n env: NodeJS.ProcessEnv;\n stdio: [\"ignore\", \"pipe\", \"pipe\"];\n shell: boolean;\n} => ({\n cwd: workspaceRoot,\n env: {\n ...processEnv,\n PORT: String(port),\n },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n shell: true,\n});\n\n/**\n * Formats a log line with extension prefix.\n *\n * @param extensionId - The extension ID for prefixing\n * @param line - The log line content\n * @returns {string} Formatted log line\n */\nexport const formatLogLine = (extensionId: string, line: string): string => `[${extensionId}] ${line}`;\n\n/**\n * Splits buffer data into trimmed lines.\n *\n * @param data - Buffer data from stdout/stderr\n * @returns {Array<string>} Array of non-empty trimmed lines\n */\nexport const splitBufferToLines = (data: Buffer): Array<string> =>\n data\n .toString()\n .trim()\n .split(\"\\n\")\n .filter(line => line.length > 0);\n\n/**\n * Determines if a process exit should be logged as an error.\n *\n * @param extensionId - The extension ID\n * @param code - The exit code (null if terminated by signal)\n * @param signal - The signal that terminated the process (null if exited normally)\n * @returns {{ isError: boolean, message: string | null }} Object indicating if it's an error and the appropriate message\n */\nexport const analyzeProcessExit = (\n extensionId: string,\n code: number | null,\n signal: NodeJS.Signals | null\n): { isError: boolean; message: string | null } => {\n if (code !== null && code !== 0) {\n return { isError: true, message: `[Serverless] ${extensionId} exited with code ${code}` };\n }\n if (signal) {\n return { isError: false, message: `[Serverless] ${extensionId} terminated by signal ${signal}` };\n }\n return { isError: false, message: null };\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawnServerlessExtensions.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/spawnServerlessExtensions.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IrisAppManifest } from \"@trackunit/iris-app-api\";\nimport { ChildProcess, spawn } from \"child_process\";\nimport { getAvailablePort } from \"./getAvailablePort\";\nimport {\n analyzeProcessExit,\n createSpawnCommand,\n createSpawnOptions,\n formatLogLine,\n SERVERLESS_EXTENSION_TYPE,\n SERVERLESS_PORT_MAX,\n SERVERLESS_PORT_MIN,\n splitBufferToLines,\n} from \"./serverlessUtils\";\n\nexport type ServerlessPortMap = Map<string, number>;\n\nexport interface SpawnedServerlessExtensions {\n portMap: ServerlessPortMap;\n processes: Array<ChildProcess>;\n cleanup: () => void;\n}\n\n/**\n * Spawns serve processes for all serverless function extensions in the manifest.\n *\n * @param manifest The Iris App manifest containing extensions\n * @param workspaceRoot The root directory of the NX workspace\n * @returns {Promise<SpawnedServerlessExtensions>} Object containing port map, spawned processes, and cleanup function\n */\nexport const spawnServerlessExtensions = async (\n manifest: IrisAppManifest,\n workspaceRoot: string\n): Promise<SpawnedServerlessExtensions> => {\n const portMap: ServerlessPortMap = new Map();\n const processes: Array<ChildProcess> = [];\n\n const serverlessExtensions = manifest.extensions.filter(ext => ext.type === SERVERLESS_EXTENSION_TYPE);\n\n if (serverlessExtensions.length === 0) {\n return {\n portMap,\n processes,\n cleanup: () => {},\n };\n }\n\n // eslint-disable-next-line no-console\n console.log(`\\n[Serverless] Found ${serverlessExtensions.length} serverless extension(s)`);\n\n let nextPort = SERVERLESS_PORT_MIN;\n\n for (const extension of serverlessExtensions) {\n const extensionId = extension.id;\n\n // Find available port\n let port: number;\n try {\n port = await getAvailablePort(nextPort, SERVERLESS_PORT_MAX);\n nextPort = port + 1;\n } catch {\n // eslint-disable-next-line no-console\n console.error(`[Serverless] No available ports for ${extensionId}, skipping`);\n continue;\n }\n\n // eslint-disable-next-line no-console\n console.log(`[Serverless] Starting ${extensionId} on port ${port}`);\n\n const { command, args } = createSpawnCommand(extensionId);\n const spawnOptions = createSpawnOptions(workspaceRoot, port, process.env);\n const child = spawn(command, args, spawnOptions);\n\n // Prefix output with extension name\n child.stdout.on(\"data\", (data: Buffer) => {\n const lines = splitBufferToLines(data);\n for (const line of lines) {\n // eslint-disable-next-line no-console\n console.log(formatLogLine(extensionId, line));\n }\n });\n\n child.stderr.on(\"data\", (data: Buffer) => {\n const lines = splitBufferToLines(data);\n for (const line of lines) {\n // eslint-disable-next-line no-console\n console.error(formatLogLine(extensionId, line));\n }\n });\n\n child.on(\"error\", err => {\n // eslint-disable-next-line no-console\n console.error(`[Serverless] Failed to start ${extensionId}: ${err.message}`);\n });\n\n child.on(\"exit\", (code, signal) => {\n const { isError, message } = analyzeProcessExit(extensionId, code, signal);\n if (message !== null) {\n if (isError) {\n // eslint-disable-next-line no-console\n console.error(message);\n } else {\n // eslint-disable-next-line no-console\n console.log(message);\n }\n }\n });\n\n portMap.set(extensionId, port);\n processes.push(child);\n }\n\n const cleanup = () => {\n // Remove process event handlers to prevent listener accumulation\n process.off(\"exit\", cleanup);\n process.off(\"SIGINT\", cleanup);\n process.off(\"SIGTERM\", cleanup);\n\n for (const child of processes) {\n if (!child.killed) {\n child.kill(\"SIGTERM\");\n }\n }\n };\n\n // Handle parent process exit\n process.on(\"exit\", cleanup);\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n return { portMap, processes, cleanup };\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/version.ts"],"names":[],"mappings":";;;AAAA,+GAA+G;AAClG,QAAA,OAAO,GAAG;IACrB,gBAAgB,EAAE,SAAS;IAC3B,kBAAkB,EAAE,UAAU;CAC/B,CAAC","sourcesContent":["// The major version of NX and Node specified here will be matched with corresponding versions in the iris app.\nexport const version = {\n managerNxVersion: \"^19.8.3\",\n managerNodeVersion: \"^22.14.0\",\n};\n\n"]}
|