@trackunit/iris-app-build-utilities 1.12.45 → 1.12.47
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 +11 -0
- package/package.json +3 -3
- package/src/getCopyPatterns.js +1 -1
- package/src/getCopyPatterns.js.map +1 -1
- package/src/plugin-shared/extensionUtil.js +0 -1
- package/src/plugin-shared/extensionUtil.js.map +1 -1
- package/src/plugin-shared/indexHtmlUtil.js +2 -6
- package/src/plugin-shared/indexHtmlUtil.js.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
## 1.12.47 (2026-02-23)
|
|
2
|
+
|
|
3
|
+
### 🧱 Updated Dependencies
|
|
4
|
+
|
|
5
|
+
- Updated iris-app-api to 1.14.42
|
|
6
|
+
- Updated shared-utils to 1.13.43
|
|
7
|
+
|
|
8
|
+
## 1.12.46 (2026-02-19)
|
|
9
|
+
|
|
10
|
+
This was a version bump only for iris-app-build-utilities to align it with other projects, there were no code changes.
|
|
11
|
+
|
|
1
12
|
## 1.12.45 (2026-02-19)
|
|
2
13
|
|
|
3
14
|
### 🧱 Updated Dependencies
|
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.47",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
5
5
|
"repository": "https://github.com/Trackunit/manager",
|
|
6
6
|
"engines": {
|
|
@@ -15,9 +15,9 @@
|
|
|
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.42",
|
|
19
19
|
"@nx/devkit": "22.4.4",
|
|
20
|
-
"@trackunit/shared-utils": "1.13.
|
|
20
|
+
"@trackunit/shared-utils": "1.13.43",
|
|
21
21
|
"http-proxy-middleware": "3.0.5",
|
|
22
22
|
"pacote": "^21.0.4",
|
|
23
23
|
"semver": "7.5.4"
|
package/src/getCopyPatterns.js
CHANGED
|
@@ -53,7 +53,7 @@ const getWidgetExtensionIconPaths = (manifest) => {
|
|
|
53
53
|
});
|
|
54
54
|
};
|
|
55
55
|
/**
|
|
56
|
-
* Generates copy patterns for serverside extensions (LIFECYCLE_EXTENSION, SERVERLESS_FUNCTION_EXTENSION
|
|
56
|
+
* Generates copy patterns for serverside extensions (LIFECYCLE_EXTENSION, SERVERLESS_FUNCTION_EXTENSION).
|
|
57
57
|
* These are only copied in production mode.
|
|
58
58
|
*/
|
|
59
59
|
const getServersideExtensionPatterns = (options) => {
|
|
@@ -1 +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, AI_AGENT_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"]}
|
|
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"]}
|
|
@@ -25,7 +25,6 @@ const updateExtensions = (extensions) => {
|
|
|
25
25
|
extension.type !== "WIDGET_EXTENSION" &&
|
|
26
26
|
extension.type !== "LIFECYCLE_EXTENSION" &&
|
|
27
27
|
extension.type !== "SERVERLESS_FUNCTION_EXTENSION" &&
|
|
28
|
-
extension.type !== "AI_AGENT_EXTENSION" &&
|
|
29
28
|
extension.menuItem.name) {
|
|
30
29
|
extension.menuItem.name =
|
|
31
30
|
(0, irisAppTranslationUtils_1.convertTranslationKeyIfNeeded)(extension.menuItem.name, extension.sourceRoot) || "Unknown";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensionUtil.js","sourceRoot":"","sources":["../../../../../../libs/iris-app-sdk/iris-app-build-utilities/src/plugin-shared/extensionUtil.ts"],"names":[],"mappings":";;;AAAA,0DAWiC;AACjC,uEAA4F;AAE5F,MAAM,MAAM,GAAG,CAAC,KAAqD,EAAE,WAAmB,EAAE,EAAE;IAC5F,IAAI,IAAA,2BAAY,EAAC,KAAK,CAAC,IAAI,IAAA,4BAAa,EAAC,KAAK,CAAC,EAAE,CAAC;QAChD,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAiB,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,GAAG,CAAC,WAAW,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAiB,CAAC;QAC3E,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAAC,UAAmC,EAA2B,EAAE;IAC/F,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;QAC7B,IACE,SAAS,CAAC,IAAI,KAAK,6BAA6B;YAChD,SAAS,CAAC,IAAI,KAAK,kBAAkB;YACrC,SAAS,CAAC,IAAI,KAAK,qBAAqB;YACxC,SAAS,CAAC,IAAI,KAAK,+BAA+B;YAClD,SAAS,CAAC,
|
|
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"]}
|
|
@@ -16,17 +16,13 @@ const updateIndexHtml = ({ manifest, packageJson, devtools, }) => {
|
|
|
16
16
|
const scopeAndModuleNonce = (0, crypto_1.randomBytes)(16).toString("base64");
|
|
17
17
|
const csp = (0, csp_header_1.getCSP)({
|
|
18
18
|
// eslint-disable-next-line local-rules/no-typescript-assertion
|
|
19
|
-
directives: (0, iris_app_api_1.irisAppCspInput)(manifest.validDomains, manifest.cspHeader),
|
|
19
|
+
directives: (0, iris_app_api_1.irisAppCspInput)(manifest.validDomains, manifest.cspHeader ? { ...manifest.cspHeader, sandbox: undefined } : undefined),
|
|
20
20
|
presets: {
|
|
21
21
|
irisAppDefaultCsp: iris_app_api_1.irisAppDefaultCsp,
|
|
22
22
|
localDev: { "connect-src": ["ws://localhost:8097/"], "script-src": [`'nonce-${scopeAndModuleNonce}'`] },
|
|
23
23
|
},
|
|
24
24
|
});
|
|
25
|
-
|
|
26
|
-
.split(";")
|
|
27
|
-
.filter(substring => !substring.trim().startsWith("sandbox"))
|
|
28
|
-
.join(";");
|
|
29
|
-
let html = indexContents.replace("{{cspContent}}", cspWithoutSandbox);
|
|
25
|
+
let html = indexContents.replace("{{cspContent}}", csp);
|
|
30
26
|
html = html.replaceAll("{{devTools}}", devtools ? devtools : "");
|
|
31
27
|
html = html.replaceAll("{{scope}}", JSON.parse(packageJson).name);
|
|
32
28
|
html = html.replaceAll("{{remoteEntryModuleFormat}}", manifest.moduleFormat ?? "cjs");
|
|
@@ -1 +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,+DAA+D;QAC/D,UAAU,EAAE,IAAA,8BAAe,EAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAuC;
|
|
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,+DAA+D;QAC/D,UAAU,EAAE,IAAA,8BAAe,EAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAC,GAAG,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAC,CAAC,CAAC,CAAC,SAAS,CAAuC;QACtK,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;AApCW,QAAA,eAAe,mBAoC1B","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 local-rules/no-typescript-assertion\n directives: irisAppCspInput(manifest.validDomains, manifest.cspHeader ? {...manifest.cspHeader, sandbox: undefined} : undefined) 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"]}
|