npm package diff

Package: @forge/manifest

Versions: 7.7.0-next.5 - 7.7.0-next.6

Added:package/out/interpolator/environment-variable-interpolator.js

Added:package/out/interpolator/manifest-interpolator-manager.js

Added:package/out/interpolator/manifest-interpolator.js

Added:package/out/utils/manifest-parser-builder.js

Added:package/out/interpolator/string-resource-interpolator.js

Added:package/out/interpolator/environment-variable-interpolator.d.ts.map

Added:package/out/interpolator/manifest-interpolator-manager.d.ts.map

Added:package/out/interpolator/manifest-interpolator.d.ts.map

Added:package/out/utils/manifest-parser-builder.d.ts.map

Added:package/out/interpolator/string-resource-interpolator.d.ts.map

Added:package/out/interpolator/environment-variable-interpolator.d.ts

Added:package/out/interpolator/manifest-interpolator-manager.d.ts

Added:package/out/interpolator/manifest-interpolator.d.ts

Added:package/out/utils/manifest-parser-builder.d.ts

Added:package/out/interpolator/string-resource-interpolator.d.ts

Modified:package/out/text/errors.js

Index: package/out/text/errors.js
===================================================================
--- package/out/text/errors.js
+++ package/out/text/errors.js
@@ -21,9 +21,13 @@
         additionalProperties: (additionalProperty) => `should NOT have additional property '${additionalProperty}'`,
         notAllowed: (props) => props
             ? `does not support the following Forge properties - ${props.map((v) => "'" + v + "'").join(', ')}`
             : 'provided properties do not match schema. Learn more about modules at https://go.atlassian.com/forge-modules',
-        missingEnvironmentVariable: (variable) => `could not find environment variable '${variable}'`
+        missingEnvironmentVariable: (variable) => `could not find environment variable '${variable}'`,
+        errorReadingResourceFile: (variable, errorMessage) => `error while reading resource file: '${variable}'. Error: ${errorMessage}`,
+        resourceNotFound: (variable) => `could not find resource: '${variable}'`,
+        resourcePathNotDefined: (variable) => `resource path not defined for resource: '${variable}'`,
+        resourceFileNotSupported: (variable) => `resource file type not supported: '${variable}'`
     },
     permissions: {
         invalidPermission: (element, value) => `Invalid '${element}' permission in the manifest.yml file - '${value}'. Learn more about permissions at: https://go.atlassian.com/forge-permissions.`,
         missingPermissionFromScope: (scope, event) => `Trigger event: '${event}' requires '${scope}' scope`,

Modified:package/out/utils/index.js

Index: package/out/utils/index.js
===================================================================
--- package/out/utils/index.js
+++ package/out/utils/index.js
@@ -4,7 +4,7 @@
 tslib_1.__exportStar(require("./get-all-modules"), exports);
 tslib_1.__exportStar(require("./line-finder"), exports);
 tslib_1.__exportStar(require("./module-key-cleaner"), exports);
 tslib_1.__exportStar(require("./module-references"), exports);
-tslib_1.__exportStar(require("./manifest-parser"), exports);
+tslib_1.__exportStar(require("./manifest-parser-builder"), exports);
 tslib_1.__exportStar(require("./module-i18n-helper"), exports);
 tslib_1.__exportStar(require("./translation-value-getter"), exports);

Modified:package/out/utils/manifest-parser.js

Index: package/out/utils/manifest-parser.js
===================================================================
--- package/out/utils/manifest-parser.js
+++ package/out/utils/manifest-parser.js
@@ -1,11 +1,9 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.ManifestParser = exports.ManifestParserError = void 0;
-const tslib_1 = require("tslib");
 const yaml_1 = require("yaml");
-const errors_1 = require("../text/errors");
-const Sentry = tslib_1.__importStar(require("@sentry/node"));
+const manifest_interpolator_1 = require("../interpolator/manifest-interpolator");
 const yamlConfigOptions = { indent: 2, skipInvalid: true };
 class ManifestParserError extends Error {
     constructor(message) {
         super(message);
@@ -16,37 +14,23 @@
         };
     }
 }
 exports.ManifestParserError = ManifestParserError;
-const POSSIBLE_ENVIRONMENT_VARIABLE = /\$\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;
 class ManifestParser {
-    envVarsRecord;
-    envVarsToReplace;
-    constructor(envVarsRecord = {}) {
-        this.envVarsRecord = envVarsRecord;
-        this.envVarsToReplace = [];
+    manifestInterpolator;
+    constructor(manifestInterpolator) {
+        this.manifestInterpolator = manifestInterpolator;
     }
     parseManifest(manifest) {
-        const rawManifest = (0, yaml_1.parse)(manifest);
-        this.envVarsToReplace = rawManifest.environment?.variables ?? [];
-        return (0, yaml_1.parse)(manifest, this.environmentVariableReviver);
+        try {
+            return this.manifestInterpolator.interpolate(manifest);
+        }
+        catch (error) {
+            if (error instanceof manifest_interpolator_1.ManifestInterpolatorError) {
+                throw new ManifestParserError(error.message);
+            }
+            throw error;
+        }
     }
     parseManifestAsString = (manifest) => (0, yaml_1.stringify)(this.parseManifest(manifest), yamlConfigOptions);
-    environmentVariableReviver = (_, value) => {
-        if (!(typeof value == 'string')) {
-            return value;
-        }
-        value = value.replace(POSSIBLE_ENVIRONMENT_VARIABLE, (original, envVarName) => {
-            if (!this.envVarsToReplace.includes(envVarName)) {
-                return original;
-            }
-            const envVar = this.envVarsRecord[envVarName];
-            if (envVar === undefined) {
-                throw new ManifestParserError(errors_1.errors.schema.missingEnvironmentVariable(envVarName));
-            }
-            Sentry.captureMessage('replaced environment variable');
-            return envVar;
-        });
-        return value;
-    };
 }
 exports.ManifestParser = ManifestParser;

Modified:package/out/validators/yaml-validator.js

Index: package/out/validators/yaml-validator.js
===================================================================
--- package/out/validators/yaml-validator.js
+++ package/out/validators/yaml-validator.js
@@ -4,14 +4,10 @@
 const tslib_1 = require("tslib");
 const yaml_1 = require("yaml");
 const fs_1 = tslib_1.__importDefault(require("fs"));
 const text_1 = require("../text");
-const __1 = require("..");
+const utils_1 = require("../utils");
 class YamlValidator {
-    manifestParser;
-    constructor() {
-        this.manifestParser = new __1.ManifestParser(process.env);
-    }
     async validate(manifest) {
         if (!manifest || !manifest.filePath) {
             return {
                 success: false,
@@ -19,9 +15,9 @@
             };
         }
         try {
             const content = fs_1.default.readFileSync(manifest.filePath, 'utf8');
-            const manifestContent = this.manifestParser.parseManifest(content);
+            const manifestContent = new utils_1.ManifestParserBuilder().withInterpolators().build().parseManifest(content);
             return {
                 success: true,
                 manifestObject: {
                     filePath: manifest.filePath,

Modified:package/package.json

Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@forge/manifest",
-  "version": "7.7.0-next.5",
+  "version": "7.7.0-next.6",
   "description": "Definitions and validations of the Forge manifest",
   "main": "out/index.js",
   "scripts": {
     "build": "yarn run compile",
@@ -29,7 +29,8 @@
     "ajv-formats": "2.1.1",
     "cheerio": "^0.22.0",
     "glob": "^10.3.10",
     "lodash": "^4.17.21",
+    "mime-types": "^2.1.35",
     "yaml": "^2.3.4"
   }
 }

Modified:package/out/text/errors.d.ts.map

Index: package/out/text/errors.d.ts.map
===================================================================
--- package/out/text/errors.d.ts.map
+++ package/out/text/errors.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/text/errors.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/text/errors.ts"],"names":[],"mappings":"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"}
\ No newline at end of file

Modified:package/out/utils/index.d.ts.map

Index: package/out/utils/index.d.ts.map
===================================================================
--- package/out/utils/index.d.ts.map
+++ package/out/utils/index.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC"}
\ No newline at end of file
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,cAAc,sBAAsB,CAAC;AACrC,cAAc,4BAA4B,CAAC"}
\ No newline at end of file

Modified:package/out/utils/manifest-parser.d.ts.map

Index: package/out/utils/manifest-parser.d.ts.map
===================================================================
--- package/out/utils/manifest-parser.d.ts.map
+++ package/out/utils/manifest-parser.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"manifest-parser.d.ts","sourceRoot":"","sources":["../../src/utils/manifest-parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKpD,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;IAMpB,aAAa;;;CAKrB;AAMD,qBAAa,cAAc;IAGb,OAAO,CAAC,QAAQ,CAAC,aAAa;IAF1C,OAAO,CAAC,gBAAgB,CAAW;gBAEN,aAAa,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAM;IAI5E,aAAa,CAAC,QAAQ,EAAE,MAAM;IAMrC,qBAAqB,aAAc,MAAM,YAAgE;IAEzG,OAAO,CAAC,0BAA0B,CAkBhC;CACH"}
\ No newline at end of file
+{"version":3,"file":"manifest-parser.d.ts","sourceRoot":"","sources":["../../src/utils/manifest-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAK5F,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM;IAMpB,aAAa;;;CAKrB;AAKD,qBAAa,cAAc;IACb,OAAO,CAAC,oBAAoB;gBAApB,oBAAoB,EAAE,2BAA2B;IAQrE,aAAa,CAAC,QAAQ,EAAE,MAAM;IAgB9B,qBAAqB,aAAc,MAAM,YAAgE;CAC1G"}
\ No newline at end of file

Modified:package/out/validators/yaml-validator.d.ts.map

Index: package/out/validators/yaml-validator.d.ts.map
===================================================================
--- package/out/validators/yaml-validator.d.ts.map
+++ package/out/validators/yaml-validator.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"yaml-validator.d.ts","sourceRoot":"","sources":["../../src/validators/yaml-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAIpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,qBAAa,aAAa,CAAC,CAAC,CAAE,YAAW,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC;IAC3F,OAAO,CAAC,cAAc,CAAiB;;IAIjC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;CAiD9F"}
\ No newline at end of file
+{"version":3,"file":"yaml-validator.d.ts","sourceRoot":"","sources":["../../src/validators/yaml-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAIpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,qBAAa,aAAa,CAAC,CAAC,CAAE,YAAW,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC;IACrF,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;CAiD9F"}
\ No newline at end of file

Modified:package/CHANGELOG.md

Index: package/CHANGELOG.md
===================================================================
--- package/CHANGELOG.md
+++ package/CHANGELOG.md
@@ -1,6 +1,12 @@
 # @forge/manifest
 
+## 7.7.0-next.6
+
+### Minor Changes
+
+- be67acb: Interpolate string resources in modules
+
 ## 7.7.0-next.5
 
 ### Patch Changes

Modified:package/out/text/errors.d.ts

Index: package/out/text/errors.d.ts
===================================================================
--- package/out/text/errors.d.ts
+++ package/out/text/errors.d.ts
@@ -9,8 +9,12 @@
         deprecatedValue: (section: string, field: string, additionalInfo?: string) => string;
         additionalProperties: (additionalProperty: string) => string;
         notAllowed: (props: string[] | undefined) => string;
         missingEnvironmentVariable: (variable: string) => string;
+        errorReadingResourceFile: (variable: string, errorMessage: string) => string;
+        resourceNotFound: (variable: string) => string;
+        resourcePathNotDefined: (variable: string) => string;
+        resourceFileNotSupported: (variable: string) => string;
     };
     permissions: {
         invalidPermission: (element: string, value: string) => string;
         missingPermissionFromScope: (scope: string, event: string) => string;

Modified:package/out/utils/index.d.ts

Index: package/out/utils/index.d.ts
===================================================================
--- package/out/utils/index.d.ts
+++ package/out/utils/index.d.ts
@@ -1,8 +1,9 @@
 export * from './get-all-modules';
 export * from './line-finder';
 export * from './module-key-cleaner';
 export * from './module-references';
-export * from './manifest-parser';
+export * from './manifest-parser-builder';
+export type { ManifestParser } from './manifest-parser';
 export * from './module-i18n-helper';
 export * from './translation-value-getter';
 //# sourceMappingURL=index.d.ts.map
\ No newline at end of file

Modified:package/out/utils/manifest-parser.d.ts

Index: package/out/utils/manifest-parser.d.ts
===================================================================
--- package/out/utils/manifest-parser.d.ts
+++ package/out/utils/manifest-parser.d.ts
@@ -1,16 +1,14 @@
-import { ManifestSchema } from '../schema/manifest';
+import { ManifestInterpolatorManager } from '../interpolator/manifest-interpolator-manager';
 export declare class ManifestParserError extends Error {
     constructor(message: string);
     getAttributes(): {
         isUserError: boolean;
     };
 }
 export declare class ManifestParser {
-    private readonly envVarsRecord;
-    private envVarsToReplace;
-    constructor(envVarsRecord?: Record<string, string | undefined>);
-    parseManifest(manifest: string): ManifestSchema;
+    private manifestInterpolator;
+    constructor(manifestInterpolator: ManifestInterpolatorManager);
+    parseManifest(manifest: string): import("../index").ManifestSchema;
     parseManifestAsString: (manifest: string) => string;
-    private environmentVariableReviver;
 }
 //# sourceMappingURL=manifest-parser.d.ts.map
\ No newline at end of file

Modified:package/out/validators/yaml-validator.d.ts

Index: package/out/validators/yaml-validator.d.ts
===================================================================
--- package/out/validators/yaml-validator.d.ts
+++ package/out/validators/yaml-validator.d.ts
@@ -1,8 +1,6 @@
 import { ManifestObject, ManifestValidationResult } from '../types';
 import { ValidatorInterface } from './validator-interface';
 export declare class YamlValidator<T> implements ValidatorInterface<ManifestObject<T> | undefined, T> {
-    private manifestParser;
-    constructor();
     validate(manifest: ManifestObject<T> | undefined): Promise<ManifestValidationResult<T>>;
 }
 //# sourceMappingURL=yaml-validator.d.ts.map
\ No newline at end of file