@forge/api
7.0.3-next.17.1.0-next.2
~
Modified (5 files)
Index: package/out/api/permissions.js
===================================================================
--- package/out/api/permissions.js
+++ package/out/api/permissions.js
@@ -3,8 +3,10 @@
exports.permissions = exports.canLoadResource = exports.canFetchFrom = exports.hasScope = exports.hasPermission = exports.extractUrlString = void 0;
const runtime_1 = require("./runtime");
const errors_1 = require("./errors");
const egress_1 = require("@forge/egress");
+const RESOURCE_TYPES = ['fonts', 'styles', 'frames', 'images', 'media', 'scripts'];
+const FETCH_TYPES = ['backend', 'client'];
function extractUrlString(url) {
if (typeof url === 'string') {
return url;
}
@@ -64,14 +66,37 @@
throw new Error(`Invalid permission key(s): ${invalidKeys.join(', ')}. ` +
`Visit https://go.atlassian.com/forge-permissions for more information.`);
}
};
+const validateObjectField = (value, fieldPath) => {
+ if (value !== undefined) {
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
+ throw new TypeError(`${fieldPath} should be an object, not ${Array.isArray(value) ? 'an array' : `a ${typeof value}`}`);
+ }
+ }
+};
+const validateArrayField = (value, fieldPath) => {
+ if (value !== undefined && !Array.isArray(value)) {
+ throw new TypeError(`${fieldPath} should be an array, not a ${typeof value}`);
+ }
+};
const validatePermissionRequirements = (requirements) => {
validateKeys(requirements, VALID_REQUIREMENT_KEYS);
- if (requirements.external) {
+ validateArrayField(requirements.scopes, 'scopes');
+ if (requirements.external !== undefined) {
+ validateObjectField(requirements.external, 'external');
validateKeys(requirements.external, VALID_EXTERNAL_TYPES);
- if (requirements.external.fetch) {
+ for (const type of VALID_EXTERNAL_TYPES) {
+ if (type !== 'fetch' && type !== 'configurable') {
+ validateArrayField(requirements.external[type], `external.${type}`);
+ }
+ }
+ if (requirements.external.fetch !== undefined) {
+ validateObjectField(requirements.external.fetch, 'external.fetch');
validateKeys(requirements.external.fetch, VALID_FETCH_TYPES);
+ for (const type of VALID_FETCH_TYPES) {
+ validateArrayField(requirements.external.fetch[type], `external.fetch.${type}`);
+ }
}
}
};
const getMissingFetchPermissions = (requiredFetch, currentlyGrantedFetch) => { Index: package/package.json
===================================================================
--- package/package.json
+++ package/package.json
@@ -1,7 +1,7 @@
{
"name": "@forge/api",
- "version": "7.0.3-next.1",
+ "version": "7.1.0-next.2",
"description": "Forge API methods",
"author": "Atlassian",
"license": "SEE LICENSE IN LICENSE.txt",
"main": "out/index.js", Index: package/out/api/permissions.d.ts.map
===================================================================
--- package/out/api/permissions.d.ts.map
+++ package/out/api/permissions.d.ts.map
@@ -1,1 +1,1 @@
-{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/api/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,sBAAsB,EAAE,kBAAkB,EAAgB,MAAM,WAAW,CAAC;AAEpG,OAAO,EAAU,QAAQ,EAAS,MAAM,iBAAiB,CAAC;AAM1D,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAQ/F;AAeD,YAAY,EAAE,sBAAsB,EAAE,CAAC;AAKvC,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAOnC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AAwND,eAAO,MAAM,aAAa,iBAAkB,QAAQ,sBAAsB,CAAC,KAAG,gBAE7E,CAAC;AAiEF,eAAO,MAAM,QAAQ,UAAW,MAAM,KAAG,OAKxC,CAAC;AAyBF,eAAO,MAAM,YAAY,SAAU,SAAS,GAAG,QAAQ,OAAO,MAAM,KAAG,OAKtE,CAAC;AAyBF,eAAO,MAAM,eAAe,SAAU,QAAQ,MAAM,QAAQ,EAAE,OAAO,CAAC,OAAO,MAAM,KAAG,OAKrF,CAAC;AAKF,eAAO,MAAM,WAAW;kCAzIoB,QAAQ,sBAAsB,CAAC,KAAG,gBAAgB;sBAmE9D,MAAM,KAAG,OAAO;yBA8Bb,SAAS,GAAG,QAAQ,OAAO,MAAM,KAAG,OAAO;4BA8BxC,QAAQ,MAAM,QAAQ,EAAE,OAAO,CAAC,OAAO,MAAM,KAAG,OAAO;CAe5F,CAAC"}
\ No newline at end of file
+{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/api/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,sBAAsB,EAAE,kBAAkB,EAAgB,MAAM,WAAW,CAAC;AAEpG,OAAO,EAAU,QAAQ,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAM1D,QAAA,MAAM,cAAc,sEAAuE,CAAC;AAC5F,oBAAY,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAK3D,QAAA,MAAM,WAAW,gCAAiC,CAAC;AACnD,oBAAY,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAKrD,oBAAY,mBAAmB,GAAG,MAAM,EAAE,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;AAKvF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAQ/F;AAeD,YAAY,EAAE,sBAAsB,EAAE,CAAC;AAKvC,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAOnC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AA4PD,eAAO,MAAM,aAAa,iBAAkB,QAAQ,sBAAsB,CAAC,KAAG,gBAE7E,CAAC;AAiEF,eAAO,MAAM,QAAQ,UAAW,MAAM,KAAG,OAKxC,CAAC;AAyBF,eAAO,MAAM,YAAY,SAAU,SAAS,OAAO,MAAM,KAAG,OAK3D,CAAC;AAyBF,eAAO,MAAM,eAAe,SAAU,QAAQ,MAAM,QAAQ,EAAE,OAAO,CAAC,OAAO,MAAM,KAAG,OAKrF,CAAC;AAKF,eAAO,MAAM,WAAW;kCAzIoB,QAAQ,sBAAsB,CAAC,KAAG,gBAAgB;sBAmE9D,MAAM,KAAG,OAAO;yBA8Bb,SAAS,OAAO,MAAM,KAAG,OAAO;4BA8B7B,QAAQ,MAAM,QAAQ,EAAE,OAAO,CAAC,OAAO,MAAM,KAAG,OAAO;CAe5F,CAAC"}
\ No newline at end of file Index: package/CHANGELOG.md
===================================================================
--- package/CHANGELOG.md
+++ package/CHANGELOG.md
@@ -1,6 +1,12 @@
# @forge/api
+## 7.1.0-next.2
+
+### Minor Changes
+
+- 16a4b01: Updated SDK to throw type error
+
## 7.0.3-next.1
### Patch Changes Index: package/out/api/permissions.d.ts
===================================================================
--- package/out/api/permissions.d.ts
+++ package/out/api/permissions.d.ts
@@ -1,6 +1,11 @@
import { PermissionRequirements, MissingPermissions } from './runtime';
-import { External } from '@forge/manifest';
+import { External, Fetch } from '@forge/manifest';
+declare const RESOURCE_TYPES: readonly ["fonts", "styles", "frames", "images", "media", "scripts"];
+export declare type ResourceType = (typeof RESOURCE_TYPES)[number];
+declare const FETCH_TYPES: readonly ["backend", "client"];
+export declare type FetchType = (typeof FETCH_TYPES)[number];
+export declare type ValidatedArrayField = string[] | External[ResourceType] | Fetch[FetchType];
export declare function extractUrlString(url: string | {
address: string;
} | {
remote: string;
@@ -12,13 +17,13 @@
missing?: MissingPermissions;
}
export declare const hasPermission: (requirements: Partial<PermissionRequirements>) => PermissionResult;
export declare const hasScope: (scope: string) => boolean;
-export declare const canFetchFrom: (type: 'backend' | 'client', url: string) => boolean;
+export declare const canFetchFrom: (type: FetchType, url: string) => boolean;
export declare const canLoadResource: (type: Exclude<keyof External, 'fetch'>, url: string) => boolean;
export declare const permissions: {
hasPermission: (requirements: Partial<PermissionRequirements>) => PermissionResult;
hasScope: (scope: string) => boolean;
- canFetchFrom: (type: 'backend' | 'client', url: string) => boolean;
+ canFetchFrom: (type: FetchType, url: string) => boolean;
canLoadResource: (type: Exclude<keyof External, 'fetch'>, url: string) => boolean;
};
//# sourceMappingURL=permissions.d.ts.map
\ No newline at end of file