@forge/lint

5.16.3-next.05.16.3-next.1
~

Modified (12 files)

Index: package/out/lint/linters/permission-linter/verifiers/external-fetch-verifier.js
===================================================================
--- package/out/lint/linters/permission-linter/verifiers/external-fetch-verifier.js
+++ package/out/lint/linters/permission-linter/verifiers/external-fetch-verifier.js
@@ -25,16 +25,19 @@
             .filter((x) => typeof x === 'string');
         this.egressFilteringService = new egress_1.EgressFilteringService(collectedUrls.concat(collectedRemotes));
     }
     getLintClass() {
-        return linter_interface_1.LintClass.Error;
+        return this.isConfigurableEgressEnabled() ? linter_interface_1.LintClass.Warning : linter_interface_1.LintClass.Error;
     }
     async process(fetchCalls) {
+        const isConfigurable = this.isConfigurableEgressEnabled();
         return fetchCalls
             .filter(({ url }) => !this.egressFilteringService.isValidUrl(url))
             .map((fetchCall) => ({
             class: this.getLintClass(),
-            message: text_1.messages.verifiers.externalFetch.message(fetchCall.url),
+            message: isConfigurable
+                ? text_1.messages.verifiers.externalFetch.warning(fetchCall.url)
+                : text_1.messages.verifiers.externalFetch.message(fetchCall.url),
             reference: text_1.messages.verifiers.externalFetch.reference,
             column: fetchCall.column,
             line: fetchCall.line,
             metadata: {
Index: package/out/lint/linters/permission-linter/verifiers/image-url-verifier.js
===================================================================
--- package/out/lint/linters/permission-linter/verifiers/image-url-verifier.js
+++ package/out/lint/linters/permission-linter/verifiers/image-url-verifier.js
@@ -39,16 +39,19 @@
         ].filter((item) => typeof item === 'string');
         this.egressFilteringService = new egress_1.EgressFilteringService(collectedUrls);
     }
     getLintClass() {
-        return linter_interface_1.LintClass.Error;
+        return this.isConfigurableEgressEnabled() ? linter_interface_1.LintClass.Warning : linter_interface_1.LintClass.Error;
     }
     async process(imageUrls) {
+        const isConfigurable = this.isConfigurableEgressEnabled();
         return imageUrls
             .filter(({ url }) => !this.egressFilteringService.isValidUrl(url))
             .map((imageUrl) => ({
             class: this.getLintClass(),
-            message: text_1.messages.verifiers.imageUrl.message(imageUrl.url),
+            message: isConfigurable
+                ? text_1.messages.verifiers.imageUrl.warning(imageUrl.url)
+                : text_1.messages.verifiers.imageUrl.message(imageUrl.url),
             reference: text_1.messages.verifiers.imageUrl.reference,
             column: imageUrl.column,
             line: imageUrl.line,
             metadata: {
Index: package/out/lint/text/messages.js
===================================================================
--- package/out/lint/text/messages.js
+++ package/out/lint/text/messages.js
@@ -4,8 +4,9 @@
 exports.messages = {
     verifiers: {
         externalFetch: {
             message: (url) => `The domain ${url} is not included in the "permissions.external.fetch" section of your app's manifest.yml file`,
+            warning: (url) => `The domain ${url} is not included in the "permissions.external.fetch" section of your app's manifest.yml file. Customer-managed egress is enabled, make sure the URL is configured using the \`@forge/bridge\` methods.`,
             reference: 'egress-permission-required'
         },
         dynamicPropertiesIcon: {
             message: (url) => `The domain ${url} is not included in the "permissions.external.images" section of your app's manifest.yml file`,
@@ -13,8 +14,9 @@
             reference: 'egress-permission-required'
         },
         imageUrl: {
             message: (url) => `The domain ${url} is not included in the "permissions.external.images" section of your app's manifest.yml file`,
+            warning: (url) => `The domain ${url} is not included in the "permissions.external.images" section of your app's manifest.yml file. Customer-managed egress is enabled, make sure the URL is configured using the \`@forge/bridge\` methods`,
             reference: 'egress-permission-required'
         },
         invokeRemoteKey: {
             message: (remoteKey) => `The remote key "${remoteKey}" does not exist in the "remotes" section of your app's manifest.yml file`,
Index: package/out/lint/linters/verifier-interface.js
===================================================================
--- package/out/lint/linters/verifier-interface.js
+++ package/out/lint/linters/verifier-interface.js
@@ -12,6 +12,9 @@
     }
     getLintClass() {
         return this.environment === cli_shared_1.DEFAULT_ENVIRONMENT_OPTION ? linter_interface_1.LintClass.Warning : linter_interface_1.LintClass.Error;
     }
+    isConfigurableEgressEnabled() {
+        return this.manifest?.permissions?.external?.configurable?.enabled === true;
+    }
 }
 exports.BaseLintIssueVerifier = BaseLintIssueVerifier;
Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@forge/lint",
-  "version": "5.16.3-next.0",
+  "version": "5.16.3-next.1",
   "description": "Linting for forge apps",
   "main": "out/index.js",
   "license": "SEE LICENSE IN LICENSE.txt",
   "scripts": {
@@ -10,20 +10,20 @@
     "clean": "rm -rf ./out && rm -f tsconfig.tsbuildinfo"
   },
   "devDependencies": {
     "@atlassian/xen-test-util": "^4.2.0",
-    "@forge/api": "^7.1.2",
+    "@forge/api": "^7.1.3-next.0",
     "@types/array.prototype.flatmap": "^1.2.6",
     "@types/cross-spawn": "^6.0.6",
     "@types/eslint": "8.56.12",
     "@types/node-fetch": "^2.6.12",
     "eslint-plugin-import": "^2.29.1"
   },
   "dependencies": {
-    "@forge/cli-shared": "8.18.1-next.0",
+    "@forge/cli-shared": "8.18.1-next.1",
     "@forge/csp": "5.6.1",
     "@forge/egress": "2.3.2",
-    "@forge/manifest": "12.4.0",
+    "@forge/manifest": "12.4.1-next.0",
     "@typescript-eslint/typescript-estree": "^5.62.0",
     "array.prototype.flatmap": "^1.3.3",
     "@atlassian/atlassian-openapi": "^1.0.6",
     "cross-spawn": "^7.0.6",
Index: package/out/lint/linters/permission-linter/verifiers/external-fetch-verifier.d.ts.map
===================================================================
--- package/out/lint/linters/permission-linter/verifiers/external-fetch-verifier.d.ts.map
+++ package/out/lint/linters/permission-linter/verifiers/external-fetch-verifier.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"external-fetch-verifier.d.ts","sourceRoot":"","sources":["../../../../../src/lint/linters/permission-linter/verifiers/external-fetch-verifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGlE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAIxD,qBAAa,qBAAsB,SAAQ,qBAAsB,YAAW,iBAAiB,CAAC,eAAe,EAAE,CAAC;IAC9G,OAAO,CAAC,sBAAsB,CAAyB;gBAE3C,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ;IAuBnD,SAAS,CAAC,YAAY,IAAI,SAAS;IAItB,OAAO,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAc/E"}
\ No newline at end of file
+{"version":3,"file":"external-fetch-verifier.d.ts","sourceRoot":"","sources":["../../../../../src/lint/linters/permission-linter/verifiers/external-fetch-verifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGlE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAIxD,qBAAa,qBAAsB,SAAQ,qBAAsB,YAAW,iBAAiB,CAAC,eAAe,EAAE,CAAC;IAC9G,OAAO,CAAC,sBAAsB,CAAyB;gBAE3C,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ;IAuBnD,SAAS,CAAC,YAAY,IAAI,SAAS;IAItB,OAAO,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAiB/E"}
\ No newline at end of file
Index: package/out/lint/linters/permission-linter/verifiers/image-url-verifier.d.ts.map
===================================================================
--- package/out/lint/linters/permission-linter/verifiers/image-url-verifier.d.ts.map
+++ package/out/lint/linters/permission-linter/verifiers/image-url-verifier.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"image-url-verifier.d.ts","sourceRoot":"","sources":["../../../../../src/lint/linters/permission-linter/verifiers/image-url-verifier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGlE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAiBjD,qBAAa,gBAAiB,SAAQ,qBAAsB,YAAW,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IAClG,OAAO,CAAC,sBAAsB,CAAyB;gBAE3C,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ;IAoBnD,SAAS,CAAC,YAAY,IAAI,SAAS;IAItB,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAcvE"}
\ No newline at end of file
+{"version":3,"file":"image-url-verifier.d.ts","sourceRoot":"","sources":["../../../../../src/lint/linters/permission-linter/verifiers/image-url-verifier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGlE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAiBjD,qBAAa,gBAAiB,SAAQ,qBAAsB,YAAW,iBAAiB,CAAC,QAAQ,EAAE,CAAC;IAClG,OAAO,CAAC,sBAAsB,CAAyB;gBAE3C,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ;IAoBnD,SAAS,CAAC,YAAY,IAAI,SAAS;IAItB,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAiBvE"}
\ No newline at end of file
Index: package/out/lint/text/messages.d.ts.map
===================================================================
--- package/out/lint/text/messages.d.ts.map
+++ package/out/lint/text/messages.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/lint/text/messages.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;2BAGA,MAAM;;;;2BAKN,MAAM;2BAER,MAAM;;;;2BAKJ,MAAM;;;;iCAKA,MAAM;;;;iCAKN,MAAM;;;;8BAKT,MAAM,OAAO,MAAM;;;;+BAKlB,MAAM,UAAU,MAAM,QAAQ,MAAM,GAAG,SAAS,SAAS,MAAM;;;;6BAKjE,MAAM;;;;+BAIJ,MAAM,QAAQ,MAAM,SAAS,MAAM;;;;8BAKpC,MAAM;;;;8BAIN,MAAM;;;;8BAIN,MAAM;;;;;;;;;oCASF,MAAM;;;;;6BAOX,MAAM,WAAW,MAAM;;;;;;;;CAU7C,CAAC"}
\ No newline at end of file
+{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/lint/text/messages.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;2BAGA,MAAM;2BAEN,MAAM,KAAG,MAAM;;;;2BAKf,MAAM;2BAER,MAAM;;;;2BAKJ,MAAM;2BAEN,MAAM,KAAG,MAAM;;;;iCAKT,MAAM;;;;iCAKN,MAAM;;;;8BAKT,MAAM,OAAO,MAAM;;;;+BAKlB,MAAM,UAAU,MAAM,QAAQ,MAAM,GAAG,SAAS,SAAS,MAAM;;;;6BAKjE,MAAM;;;;+BAIJ,MAAM,QAAQ,MAAM,SAAS,MAAM;;;;8BAKpC,MAAM;;;;8BAIN,MAAM;;;;8BAIN,MAAM;;;;;;;;;oCASF,MAAM;;;;;6BAOX,MAAM,WAAW,MAAM;;;;;;;;CAU7C,CAAC"}
\ No newline at end of file
Index: package/out/lint/linters/verifier-interface.d.ts.map
===================================================================
--- package/out/lint/linters/verifier-interface.d.ts.map
+++ package/out/lint/linters/verifier-interface.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"verifier-interface.d.ts","sourceRoot":"","sources":["../../../src/lint/linters/verifier-interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE7D,qBAAa,qBAAqB;IAE9B,SAAS,CAAC,WAAW,EAAE,MAAM;IAC7B,SAAS,CAAC,QAAQ,EAAE,QAAQ;gBADlB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,QAAQ;IAO9B,SAAS,CAAC,YAAY,IAAI,SAAS;CAGpC;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAC9C"}
\ No newline at end of file
+{"version":3,"file":"verifier-interface.d.ts","sourceRoot":"","sources":["../../../src/lint/linters/verifier-interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhE,OAAO,EAAE,cAAc,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE7D,qBAAa,qBAAqB;IAE9B,SAAS,CAAC,WAAW,EAAE,MAAM;IAC7B,SAAS,CAAC,QAAQ,EAAE,QAAQ;gBADlB,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,QAAQ;IAO9B,SAAS,CAAC,YAAY,IAAI,SAAS;IAInC,SAAS,CAAC,2BAA2B,IAAI,OAAO;CAGjD;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAC9C"}
\ No newline at end of file
File too large for inline diff
Index: package/out/lint/text/messages.d.ts
===================================================================
--- package/out/lint/text/messages.d.ts
+++ package/out/lint/text/messages.d.ts
@@ -1,8 +1,9 @@
 export declare const messages: {
     verifiers: {
         externalFetch: {
             message: (url: string) => string;
+            warning: (url: string) => string;
             reference: string;
         };
         dynamicPropertiesIcon: {
             message: (url: string) => string;
@@ -10,8 +11,9 @@
             reference: string;
         };
         imageUrl: {
             message: (url: string) => string;
+            warning: (url: string) => string;
             reference: string;
         };
         invokeRemoteKey: {
             message: (remoteKey: string) => string;
Index: package/out/lint/linters/verifier-interface.d.ts
===================================================================
--- package/out/lint/linters/verifier-interface.d.ts
+++ package/out/lint/linters/verifier-interface.d.ts
@@ -4,8 +4,9 @@
     protected environment: string;
     protected manifest: Manifest;
     constructor(environment: string, manifest: Manifest);
     protected getLintClass(): LintClass;
+    protected isConfigurableEgressEnabled(): boolean;
 }
 export interface LintIssueVerifier<T> {
     process(input: T): Promise<LintResultRule[]>;
 }