@forge/api 6.1.1-experimental-78c5fee → 6.1.1-experimental-3ed5db1
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 +3 -5
- package/out/api/errors.d.ts +0 -4
- package/out/api/errors.d.ts.map +1 -1
- package/out/api/errors.js +2 -16
- package/out/api/runtime.d.ts +0 -31
- package/out/api/runtime.d.ts.map +1 -1
- package/out/api/runtime.js +3 -111
- package/out/index.d.ts +0 -1
- package/out/index.d.ts.map +1 -1
- package/out/index.js +1 -3
- package/package.json +3 -5
- package/out/api/permissions.d.ts +0 -23
- package/out/api/permissions.d.ts.map +0 -1
- package/out/api/permissions.js +0 -168
package/CHANGELOG.md
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
# @forge/api
|
|
2
2
|
|
|
3
|
-
## 6.1.1-experimental-
|
|
3
|
+
## 6.1.1-experimental-3ed5db1
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
- Updated dependencies [2d37370]
|
|
10
|
-
- @forge/manifest@10.5.0-next.0-experimental-78c5fee
|
|
7
|
+
- Updated dependencies [c76782c]
|
|
8
|
+
- @forge/storage@2.0.2-experimental-3ed5db1
|
|
11
9
|
|
|
12
10
|
## 6.1.1
|
|
13
11
|
|
package/out/api/errors.d.ts
CHANGED
|
@@ -5,7 +5,6 @@ export declare const NEEDS_AUTHENTICATION_ERR = "NEEDS_AUTHENTICATION_ERR";
|
|
|
5
5
|
export declare const INVALID_REMOTE_ERR = "INVALID_REMOTE_ERR";
|
|
6
6
|
export declare const INVALID_CONTAINER_SERVICE_ERR = "INVALID_CONTAINER_SERVICE_ERR";
|
|
7
7
|
export declare const PROXY_ERR = "PROXY_ERR";
|
|
8
|
-
export declare const API_NOT_READY_ERR = "API_NOT_READY_ERR";
|
|
9
8
|
export declare function isForgePlatformError(err: Error): boolean;
|
|
10
9
|
export declare function isHostedCodeError(err: Error | string): boolean;
|
|
11
10
|
export declare function isExpectedError(err: Error): boolean;
|
|
@@ -53,7 +52,4 @@ export declare class ProxyRequestError extends HttpError {
|
|
|
53
52
|
errorCode: string;
|
|
54
53
|
constructor(status: number, errorCode: string);
|
|
55
54
|
}
|
|
56
|
-
export declare class ApiNotReadyError extends Error {
|
|
57
|
-
constructor(message?: string);
|
|
58
|
-
}
|
|
59
55
|
//# sourceMappingURL=errors.d.ts.map
|
package/out/api/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAC3C,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAC3E,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AACnE,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,6BAA6B,kCAAkC,CAAC;AAC7E,eAAO,MAAM,SAAS,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAC3C,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAC3E,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AACnE,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,6BAA6B,kCAAkC,CAAC;AAC7E,eAAO,MAAM,SAAS,cAAc,CAAC;AAErC,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,KAAK,WAE9C;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,KAAK,GAAG,MAAM,WAIpD;AAKD,wBAAgB,eAAe,CAAC,GAAG,EAAE,KAAK,GAAG,OAAO,CAEnD;AAED,qBAAa,SAAU,SAAQ,KAAK;IAClC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;gBACf,OAAO,EAAE,MAAM;CAG5B;AAED,qBAAa,UAAW,SAAQ,KAAK;gBACvB,KAAK,EAAE,MAAM;CAK1B;AAED,qBAAa,eAAgB,SAAQ,SAAS;gBAChC,OAAO,EAAE,MAAM;CAM5B;AAED,qBAAa,+BAAgC,SAAQ,eAAe;gBACtD,SAAS,EAAE,MAAM;CAK9B;AAED,qBAAa,8BAA+B,SAAQ,eAAe;gBACrD,SAAS,EAAE,MAAM;CAG9B;AAED,qBAAa,6BAA8B,SAAQ,eAAe;gBACpD,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM;CAGhE;AAED,qBAAa,8BAA+B,SAAQ,eAAe;gBACrD,SAAS,EAAE,MAAM;CAG9B;AAED,MAAM,WAAW,+BAA+B;IAI9C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAKlB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,wBAAyB,SAAQ,SAAS;aAGnC,UAAU,EAAE,MAAM;aAClB,OAAO,CAAC;gBAFxB,KAAK,EAAE,MAAM,EACG,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,6CAAiC;CAO5D;AAED,qBAAa,kBAAmB,SAAQ,SAAS;aAG7B,SAAS,EAAE,MAAM;gBADjC,KAAK,EAAE,MAAM,EACG,SAAS,EAAE,MAAM;CAMpC;AAED,qBAAa,4BAA6B,SAAQ,SAAS;aAGvC,UAAU,EAAE,MAAM;gBADlC,KAAK,EAAE,MAAM,EACG,UAAU,EAAE,MAAM;CAMrC;AAED,qBAAa,iBAAkB,SAAQ,SAAS;IAErC,MAAM,EAAE,MAAM;IACd,SAAS,EAAE,MAAM;gBADjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM;CAK3B"}
|
package/out/api/errors.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.ProxyRequestError = exports.InvalidContainerServiceError = exports.InvalidRemoteError = exports.NeedsAuthenticationError = exports.InvalidWorkspaceRequestedError = exports.RequestProductNotAllowedError = exports.ProductEndpointNotAllowedError = exports.ExternalEndpointNotAllowedError = exports.NotAllowedError = exports.FetchError = exports.HttpError = exports.isExpectedError = exports.isHostedCodeError = exports.isForgePlatformError = exports.PROXY_ERR = exports.INVALID_CONTAINER_SERVICE_ERR = exports.INVALID_REMOTE_ERR = exports.NEEDS_AUTHENTICATION_ERR = exports.FUNCTION_FETCH_ERR = exports.REQUEST_EGRESS_ALLOWLIST_ERR = exports.FUNCTION_ERR = void 0;
|
|
4
4
|
exports.FUNCTION_ERR = 'FUNCTION_ERR';
|
|
5
5
|
exports.REQUEST_EGRESS_ALLOWLIST_ERR = 'REQUEST_EGRESS_ALLOWLIST_ERR';
|
|
6
6
|
exports.FUNCTION_FETCH_ERR = 'FUNCTION_FETCH_ERR';
|
|
@@ -8,15 +8,8 @@ exports.NEEDS_AUTHENTICATION_ERR = 'NEEDS_AUTHENTICATION_ERR';
|
|
|
8
8
|
exports.INVALID_REMOTE_ERR = 'INVALID_REMOTE_ERR';
|
|
9
9
|
exports.INVALID_CONTAINER_SERVICE_ERR = 'INVALID_CONTAINER_SERVICE_ERR';
|
|
10
10
|
exports.PROXY_ERR = 'PROXY_ERR';
|
|
11
|
-
exports.API_NOT_READY_ERR = 'API_NOT_READY_ERR';
|
|
12
11
|
function isForgePlatformError(err) {
|
|
13
|
-
return [
|
|
14
|
-
exports.REQUEST_EGRESS_ALLOWLIST_ERR,
|
|
15
|
-
exports.FUNCTION_FETCH_ERR,
|
|
16
|
-
exports.NEEDS_AUTHENTICATION_ERR,
|
|
17
|
-
exports.PROXY_ERR,
|
|
18
|
-
exports.API_NOT_READY_ERR
|
|
19
|
-
].includes(err.name);
|
|
12
|
+
return [exports.REQUEST_EGRESS_ALLOWLIST_ERR, exports.FUNCTION_FETCH_ERR, exports.NEEDS_AUTHENTICATION_ERR, exports.PROXY_ERR].includes(err.name);
|
|
20
13
|
}
|
|
21
14
|
exports.isForgePlatformError = isForgePlatformError;
|
|
22
15
|
function isHostedCodeError(err) {
|
|
@@ -119,10 +112,3 @@ class ProxyRequestError extends HttpError {
|
|
|
119
112
|
}
|
|
120
113
|
}
|
|
121
114
|
exports.ProxyRequestError = ProxyRequestError;
|
|
122
|
-
class ApiNotReadyError extends Error {
|
|
123
|
-
constructor(message = 'Forge API currently not available') {
|
|
124
|
-
super(message);
|
|
125
|
-
this.name = exports.API_NOT_READY_ERR;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
exports.ApiNotReadyError = ApiNotReadyError;
|
package/out/api/runtime.d.ts
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
import { AppAri, EnvironmentAri, InstallationAri } from './ari';
|
|
2
|
-
import { Permissions as ManifestPermissions, External as ManifestExternal, Scopes as ManifestScopes, Content1 as ManifestContent } from '@forge/manifest';
|
|
3
|
-
export declare const EXTERNAL_RESOURCE_TYPES: readonly ["fonts", "styles", "frames", "images", "media", "scripts"];
|
|
4
|
-
export declare type ExternalResourceType = (typeof EXTERNAL_RESOURCE_TYPES)[number];
|
|
5
2
|
interface Timer {
|
|
6
3
|
stop(tags?: Record<string, string>): void;
|
|
7
4
|
}
|
|
@@ -67,31 +64,6 @@ export interface Installation {
|
|
|
67
64
|
export interface Realtime {
|
|
68
65
|
contextToken?: string;
|
|
69
66
|
}
|
|
70
|
-
export declare type External = ManifestExternal;
|
|
71
|
-
export declare abstract class Permissions implements ManifestPermissions {
|
|
72
|
-
abstract scopes?: ManifestScopes;
|
|
73
|
-
abstract content?: ManifestContent;
|
|
74
|
-
abstract external?: ManifestExternal;
|
|
75
|
-
format(): string;
|
|
76
|
-
}
|
|
77
|
-
export declare class RuntimePermissions extends Permissions {
|
|
78
|
-
scopes: ManifestScopes;
|
|
79
|
-
external: ManifestExternal;
|
|
80
|
-
content?: ManifestContent | undefined;
|
|
81
|
-
constructor(scopes: ManifestScopes, external: ManifestExternal, content?: ManifestContent | undefined);
|
|
82
|
-
}
|
|
83
|
-
export declare class PermissionRequirements extends Permissions {
|
|
84
|
-
scopes?: ManifestScopes | undefined;
|
|
85
|
-
external?: ManifestExternal | undefined;
|
|
86
|
-
content?: ManifestContent | undefined;
|
|
87
|
-
constructor(scopes?: ManifestScopes | undefined, external?: ManifestExternal | undefined, content?: ManifestContent | undefined);
|
|
88
|
-
}
|
|
89
|
-
export declare class MissingPermissions extends Permissions {
|
|
90
|
-
scopes?: ManifestScopes | undefined;
|
|
91
|
-
external?: ManifestExternal | undefined;
|
|
92
|
-
content?: ManifestContent | undefined;
|
|
93
|
-
constructor(scopes?: ManifestScopes | undefined, external?: ManifestExternal | undefined, content?: ManifestContent | undefined);
|
|
94
|
-
}
|
|
95
67
|
export declare type ForgeRuntime = {
|
|
96
68
|
proxy: ProxyInfo;
|
|
97
69
|
contextAri: string;
|
|
@@ -113,7 +85,6 @@ export declare type ForgeRuntime = {
|
|
|
113
85
|
moduleKey: string;
|
|
114
86
|
license?: License;
|
|
115
87
|
installation?: Installation;
|
|
116
|
-
permissions: Permissions;
|
|
117
88
|
};
|
|
118
89
|
aaid?: string;
|
|
119
90
|
lambdaContext: {
|
|
@@ -148,12 +119,10 @@ export declare type AppContext = {
|
|
|
148
119
|
moduleKey: string;
|
|
149
120
|
license?: License;
|
|
150
121
|
installation?: Installation;
|
|
151
|
-
permissions: Permissions;
|
|
152
122
|
};
|
|
153
123
|
export declare function __getRuntime(): ForgeRuntime;
|
|
154
124
|
export declare function getAppContext(): AppContext;
|
|
155
125
|
export declare function wrapInMetrics<Args extends unknown[], Ret>(name: string, fn: (...args: Args) => Promise<Ret>): (...args: Args) => Promise<Ret>;
|
|
156
126
|
export declare function bindInvocationContext<Func extends (...args: never[]) => unknown>(fn: Func): Func;
|
|
157
|
-
export declare function arePermsAvailableInRuntime(): boolean;
|
|
158
127
|
export {};
|
|
159
128
|
//# sourceMappingURL=runtime.d.ts.map
|
package/out/api/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/api/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAoD,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/api/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAoD,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAIlH,UAAU,KAAK;IACb,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;CAC3C;AAED,UAAU,OAAO;IACf,IAAI,IAAI,IAAI,CAAC;IACb,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,IAAI,IAAI,CAAC;IACb,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,UAAU,MAAM;IACd,OAAO,IAAI,KAAK,CAAC;CAClB;AAED,UAAU,KAAK;IACb,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IAC5D,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;IAC9D,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;CAC5B;AAQD,oBAAY,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,oBAAY,2BAA2B,GAAG;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,oBAAY,oBAAoB,GAAG;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,EAAE,MAAM,CAAC;KACb,EAAE,CAAC;IACJ,QAAQ,EAAE,2BAA2B,EAAE,CAAC;CACzC,CAAC;AACF,oBAAY,aAAa,GAAG,oBAAoB,GAAG,oBAAoB,CAAC;AAExE,oBAAY,OAAO,GAAG;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,eAAe,CAAC;IACrB,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,oBAAY,YAAY,GAAG;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE;QACT,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,YAAY,CAAC,EAAE,YAAY,CAAC;KAC7B,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,wBAAwB,IAAI,MAAM,CAAC;KACpC,CAAC;IACF,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE;QACJ,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,GAAG,CAAC,EAAE;QACJ,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,YAAY,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACtC,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CACzC,CAAC;AAKF,oBAAY,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,+BAA+B,IAAI,MAAM,CAAC;IAC1C,eAAe,EAAE,eAAe,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF,wBAAgB,YAAY,IAAI,YAAY,CAO3C;AAED,wBAAgB,aAAa,IAAI,UAAU,CA+B1C;AAED,wBAAgB,aAAa,CAAC,IAAI,SAAS,OAAO,EAAE,EAAE,GAAG,EACvD,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,GAAG,CAAC,GAClC,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,GAAG,CAAC,CAqBjC;AAED,wBAAgB,qBAAqB,CAAC,IAAI,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,EAAE,EAAE,IAAI,GAAG,IAAI,CAShG"}
|
package/out/api/runtime.js
CHANGED
|
@@ -1,109 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.bindInvocationContext = exports.wrapInMetrics = exports.getAppContext = exports.__getRuntime = void 0;
|
|
4
4
|
const errors_1 = require("./errors");
|
|
5
5
|
const ari_1 = require("./ari");
|
|
6
|
-
exports.EXTERNAL_RESOURCE_TYPES = ['fonts', 'styles', 'frames', 'images', 'media', 'scripts'];
|
|
7
|
-
function extractUrlString(item) {
|
|
8
|
-
if (typeof item === 'string') {
|
|
9
|
-
return item;
|
|
10
|
-
}
|
|
11
|
-
else if ('address' in item) {
|
|
12
|
-
return item.address;
|
|
13
|
-
}
|
|
14
|
-
else {
|
|
15
|
-
return item.remote;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
function formatScopesSection(scopes) {
|
|
19
|
-
if (scopes && Array.isArray(scopes) && scopes.length > 0) {
|
|
20
|
-
return `Scopes: ${scopes.join(', ')}`;
|
|
21
|
-
}
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
function formatExternalSection(external) {
|
|
25
|
-
if (!external) {
|
|
26
|
-
return null;
|
|
27
|
-
}
|
|
28
|
-
const externalParts = [];
|
|
29
|
-
addFetchPermissions(external, externalParts);
|
|
30
|
-
addResourcePermissions(external, externalParts);
|
|
31
|
-
return externalParts.length > 0 ? `External: ${externalParts.join('; ')}` : null;
|
|
32
|
-
}
|
|
33
|
-
function addFetchPermissions(external, externalParts) {
|
|
34
|
-
if (!external.fetch) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
if (external.fetch.backend && external.fetch.backend.length > 0) {
|
|
38
|
-
const backendUrls = external.fetch.backend.map(extractUrlString).join(', ');
|
|
39
|
-
externalParts.push(`Fetch Backend: ${backendUrls}`);
|
|
40
|
-
}
|
|
41
|
-
if (external.fetch.client && external.fetch.client.length > 0) {
|
|
42
|
-
const clientUrls = external.fetch.client.map(extractUrlString).join(', ');
|
|
43
|
-
externalParts.push(`Fetch Client: ${clientUrls}`);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
function addResourcePermissions(external, externalParts) {
|
|
47
|
-
for (const type of exports.EXTERNAL_RESOURCE_TYPES) {
|
|
48
|
-
const externalUrls = external[type];
|
|
49
|
-
if (externalUrls && externalUrls.length > 0) {
|
|
50
|
-
const capitalizedType = type.charAt(0).toUpperCase() + type.slice(1);
|
|
51
|
-
const urlList = externalUrls.map(extractUrlString).join(', ');
|
|
52
|
-
externalParts.push(`${capitalizedType}: ${urlList}`);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
class Permissions {
|
|
57
|
-
format() {
|
|
58
|
-
const parts = [];
|
|
59
|
-
const scopesSection = formatScopesSection(this.scopes);
|
|
60
|
-
if (scopesSection) {
|
|
61
|
-
parts.push(scopesSection);
|
|
62
|
-
}
|
|
63
|
-
const externalSection = formatExternalSection(this.external);
|
|
64
|
-
if (externalSection) {
|
|
65
|
-
parts.push(externalSection);
|
|
66
|
-
}
|
|
67
|
-
return parts.length > 0 ? parts.join('; ') : 'No permissions specified';
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
exports.Permissions = Permissions;
|
|
71
|
-
class RuntimePermissions extends Permissions {
|
|
72
|
-
scopes;
|
|
73
|
-
external;
|
|
74
|
-
content;
|
|
75
|
-
constructor(scopes, external, content) {
|
|
76
|
-
super();
|
|
77
|
-
this.scopes = scopes;
|
|
78
|
-
this.external = external;
|
|
79
|
-
this.content = content;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
exports.RuntimePermissions = RuntimePermissions;
|
|
83
|
-
class PermissionRequirements extends Permissions {
|
|
84
|
-
scopes;
|
|
85
|
-
external;
|
|
86
|
-
content;
|
|
87
|
-
constructor(scopes, external, content) {
|
|
88
|
-
super();
|
|
89
|
-
this.scopes = scopes;
|
|
90
|
-
this.external = external;
|
|
91
|
-
this.content = content;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
exports.PermissionRequirements = PermissionRequirements;
|
|
95
|
-
class MissingPermissions extends Permissions {
|
|
96
|
-
scopes;
|
|
97
|
-
external;
|
|
98
|
-
content;
|
|
99
|
-
constructor(scopes, external, content) {
|
|
100
|
-
super();
|
|
101
|
-
this.scopes = scopes;
|
|
102
|
-
this.external = external;
|
|
103
|
-
this.content = content;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
exports.MissingPermissions = MissingPermissions;
|
|
107
6
|
function __getRuntime() {
|
|
108
7
|
const runtime = global.__forge_runtime__;
|
|
109
8
|
if (!runtime) {
|
|
@@ -114,7 +13,7 @@ function __getRuntime() {
|
|
|
114
13
|
exports.__getRuntime = __getRuntime;
|
|
115
14
|
function getAppContext() {
|
|
116
15
|
const runtime = __getRuntime();
|
|
117
|
-
const { appId, appVersion, environmentId, environmentType, invocationId, installationId, moduleKey, license, installation
|
|
16
|
+
const { appId, appVersion, environmentId, environmentType, invocationId, installationId, moduleKey, license, installation } = runtime.appContext;
|
|
118
17
|
const invocationRemainingTimeInMillis = runtime.lambdaContext.getRemainingTimeInMillis ??
|
|
119
18
|
(() => {
|
|
120
19
|
throw new Error('Lambda remaining time is not available. If tunnelling, update Forge CLI to the latest version.');
|
|
@@ -129,8 +28,7 @@ function getAppContext() {
|
|
|
129
28
|
invocationRemainingTimeInMillis,
|
|
130
29
|
moduleKey,
|
|
131
30
|
license,
|
|
132
|
-
installation
|
|
133
|
-
permissions: new RuntimePermissions(permissions?.scopes || [], permissions?.external || {})
|
|
31
|
+
installation
|
|
134
32
|
};
|
|
135
33
|
}
|
|
136
34
|
exports.getAppContext = getAppContext;
|
|
@@ -162,9 +60,3 @@ function bindInvocationContext(fn) {
|
|
|
162
60
|
return AsyncLocalStorage.bind(fn);
|
|
163
61
|
}
|
|
164
62
|
exports.bindInvocationContext = bindInvocationContext;
|
|
165
|
-
function arePermsAvailableInRuntime() {
|
|
166
|
-
const runtime = __getRuntime();
|
|
167
|
-
const permissions = runtime.appContext.permissions;
|
|
168
|
-
return !!(permissions && typeof permissions === 'object');
|
|
169
|
-
}
|
|
170
|
-
exports.arePermsAvailableInRuntime = arePermsAvailableInRuntime;
|
package/out/index.d.ts
CHANGED
|
@@ -106,5 +106,4 @@ export { route, assumeTrustedRoute, routeFromAbsolute, Route } from './safeUrl';
|
|
|
106
106
|
export { ForgeRuntime, AppContext, getAppContext, __getRuntime, bindInvocationContext } from './api/runtime';
|
|
107
107
|
export { NeedsAuthenticationError, NeedsAuthenticationErrorOptions, ProxyRequestError, FetchError, ExternalEndpointNotAllowedError, ProductEndpointNotAllowedError, RequestProductNotAllowedError, NotAllowedError, InvalidWorkspaceRequestedError, HttpError, FUNCTION_ERR, isForgePlatformError, isHostedCodeError, isExpectedError } from './api/errors';
|
|
108
108
|
export { i18n, type TranslationFunction } from './api/i18n';
|
|
109
|
-
export { permissions } from './api/permissions';
|
|
110
109
|
//# sourceMappingURL=index.d.ts.map
|
package/out/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/out/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.i18n = exports.isExpectedError = exports.isHostedCodeError = exports.isForgePlatformError = exports.FUNCTION_ERR = exports.HttpError = exports.InvalidWorkspaceRequestedError = exports.NotAllowedError = exports.RequestProductNotAllowedError = exports.ProductEndpointNotAllowedError = exports.ExternalEndpointNotAllowedError = exports.FetchError = exports.ProxyRequestError = exports.NeedsAuthenticationError = exports.bindInvocationContext = exports.__getRuntime = exports.getAppContext = exports.routeFromAbsolute = exports.assumeTrustedRoute = exports.route = exports.SortOrder = exports.FilterConditions = exports.WhereConditions = exports.startsWith = exports.createRequestStargateAsApp = exports.__fetchProduct = exports.__requestAtlassianAsUser = exports.__requestAtlassianAsApp = exports.webTrigger = exports.storage = exports.invokeService = exports.invokeRemote = exports.requestBitbucket = exports.requestConfluence = exports.requestJira = exports.fetch = exports.authorize = exports.asApp = exports.asUser = exports.privacy = void 0;
|
|
4
4
|
const storage_1 = require("@forge/storage");
|
|
5
5
|
const authorization_1 = require("./authorization");
|
|
6
6
|
Object.defineProperty(exports, "authorize", { enumerable: true, get: function () { return authorization_1.authorize; } });
|
|
@@ -70,5 +70,3 @@ Object.defineProperty(exports, "isHostedCodeError", { enumerable: true, get: fun
|
|
|
70
70
|
Object.defineProperty(exports, "isExpectedError", { enumerable: true, get: function () { return errors_1.isExpectedError; } });
|
|
71
71
|
var i18n_1 = require("./api/i18n");
|
|
72
72
|
Object.defineProperty(exports, "i18n", { enumerable: true, get: function () { return i18n_1.i18n; } });
|
|
73
|
-
var permissions_1 = require("./api/permissions");
|
|
74
|
-
Object.defineProperty(exports, "permissions", { enumerable: true, get: function () { return permissions_1.permissions; } });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@forge/api",
|
|
3
|
-
"version": "6.1.1-experimental-
|
|
3
|
+
"version": "6.1.1-experimental-3ed5db1",
|
|
4
4
|
"description": "Forge API methods",
|
|
5
5
|
"author": "Atlassian",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE.txt",
|
|
@@ -28,10 +28,8 @@
|
|
|
28
28
|
"@forge/auth": "0.0.8",
|
|
29
29
|
"@forge/egress": "2.0.3",
|
|
30
30
|
"@forge/i18n": "0.0.7",
|
|
31
|
-
"@forge/
|
|
32
|
-
"
|
|
33
|
-
"headers-utils": "^3.0.2",
|
|
34
|
-
"minimatch": "^9.0.5"
|
|
31
|
+
"@forge/storage": "2.0.2-experimental-3ed5db1",
|
|
32
|
+
"headers-utils": "^3.0.2"
|
|
35
33
|
},
|
|
36
34
|
"publishConfig": {
|
|
37
35
|
"registry": "https://packages.atlassian.com/api/npm/npm-public/"
|
package/out/api/permissions.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { PermissionRequirements, MissingPermissions, ExternalResourceType } from './runtime';
|
|
2
|
-
export declare function extractUrlString(url: string | {
|
|
3
|
-
address: string;
|
|
4
|
-
} | {
|
|
5
|
-
remote: string;
|
|
6
|
-
}): string;
|
|
7
|
-
export type { PermissionRequirements };
|
|
8
|
-
export type { MissingPermissions };
|
|
9
|
-
export interface PermissionResult {
|
|
10
|
-
granted: boolean;
|
|
11
|
-
missing?: MissingPermissions;
|
|
12
|
-
}
|
|
13
|
-
export declare const hasPermission: (requirements: Partial<PermissionRequirements>) => PermissionResult;
|
|
14
|
-
export declare const hasScope: (scope: string) => boolean;
|
|
15
|
-
export declare const canFetchFrom: (type: 'backend' | 'client', url: string) => boolean;
|
|
16
|
-
export declare const canLoadResource: (type: ExternalResourceType, url: string) => boolean;
|
|
17
|
-
export declare const permissions: {
|
|
18
|
-
hasPermission: (requirements: Partial<PermissionRequirements>) => PermissionResult;
|
|
19
|
-
hasScope: (scope: string) => boolean;
|
|
20
|
-
canFetchFrom: (type: 'backend' | 'client', url: string) => boolean;
|
|
21
|
-
canLoadResource: (type: ExternalResourceType, url: string) => boolean;
|
|
22
|
-
};
|
|
23
|
-
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/api/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EACtB,kBAAkB,EAGlB,oBAAoB,EAErB,MAAM,WAAW,CAAC;AAQnB,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;AAKnC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,kBAAkB,CAAC;CAC9B;AA6HD,eAAO,MAAM,aAAa,iBAAkB,QAAQ,sBAAsB,CAAC,KAAG,gBA2C7E,CAAC;AAmBF,eAAO,MAAM,QAAQ,UAAW,MAAM,KAAG,OAaxC,CAAC;AAyBF,eAAO,MAAM,YAAY,SAAU,SAAS,GAAG,QAAQ,OAAO,MAAM,KAAG,OAiBtE,CAAC;AAyBF,eAAO,MAAM,eAAe,SAAU,oBAAoB,OAAO,MAAM,KAAG,OAiBzE,CAAC;AAKF,eAAO,MAAM,WAAW;kCApKoB,QAAQ,sBAAsB,CAAC,KAAG,gBAAgB;sBA8D9D,MAAM,KAAG,OAAO;yBAsCb,SAAS,GAAG,QAAQ,OAAO,MAAM,KAAG,OAAO;4BA0CxC,oBAAoB,OAAO,MAAM,KAAG,OAAO;CA2BhF,CAAC"}
|
package/out/api/permissions.js
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.permissions = exports.canLoadResource = exports.canFetchFrom = exports.hasScope = exports.hasPermission = exports.extractUrlString = void 0;
|
|
4
|
-
const runtime_1 = require("./runtime");
|
|
5
|
-
const errors_1 = require("./errors");
|
|
6
|
-
const minimatch_1 = require("minimatch");
|
|
7
|
-
function extractUrlString(url) {
|
|
8
|
-
if (typeof url === 'string') {
|
|
9
|
-
return url;
|
|
10
|
-
}
|
|
11
|
-
if ('address' in url) {
|
|
12
|
-
return url.address;
|
|
13
|
-
}
|
|
14
|
-
return url.remote;
|
|
15
|
-
}
|
|
16
|
-
exports.extractUrlString = extractUrlString;
|
|
17
|
-
function wrapInSyncMetrics(options, cb) {
|
|
18
|
-
const metrics = (0, runtime_1.__getRuntime)().metrics;
|
|
19
|
-
metrics.counter(options.name, options.tags).incr();
|
|
20
|
-
return cb();
|
|
21
|
-
}
|
|
22
|
-
function hasMissingScopes(requiredScopes, currentlyGrantedScopes, missingPermissions) {
|
|
23
|
-
if (requiredScopes && Array.isArray(requiredScopes) && requiredScopes.length > 0) {
|
|
24
|
-
const currentGrantedScopes = Array.isArray(currentlyGrantedScopes) ? currentlyGrantedScopes : [];
|
|
25
|
-
const missingScopes = requiredScopes.filter((scope) => !currentGrantedScopes.includes(scope));
|
|
26
|
-
if (missingScopes.length > 0) {
|
|
27
|
-
missingPermissions.scopes = missingScopes;
|
|
28
|
-
return true;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
function hasMissingFetchPermissions(requiredFetch, currentlyGrantedFetch, missingPermissions) {
|
|
34
|
-
if (!requiredFetch) {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
let hasMissing = false;
|
|
38
|
-
const fetchTypes = ['backend', 'client'];
|
|
39
|
-
for (const fetchType of fetchTypes) {
|
|
40
|
-
const requiredUrls = requiredFetch[fetchType];
|
|
41
|
-
if (requiredUrls && requiredUrls.length > 0) {
|
|
42
|
-
const missingUrls = requiredUrls.filter((requiredUrl) => {
|
|
43
|
-
const currentlyGrantedUrls = currentlyGrantedFetch?.[fetchType] ?? [];
|
|
44
|
-
const isUrlAlreadyGranted = currentlyGrantedUrls.some((currentGrantedUrl) => {
|
|
45
|
-
return (0, minimatch_1.minimatch)(extractUrlString(requiredUrl), extractUrlString(currentGrantedUrl));
|
|
46
|
-
});
|
|
47
|
-
return !isUrlAlreadyGranted;
|
|
48
|
-
});
|
|
49
|
-
if (missingUrls.length > 0) {
|
|
50
|
-
if (!missingPermissions.external) {
|
|
51
|
-
missingPermissions.external = {};
|
|
52
|
-
}
|
|
53
|
-
if (!missingPermissions.external.fetch) {
|
|
54
|
-
missingPermissions.external.fetch = {};
|
|
55
|
-
}
|
|
56
|
-
missingPermissions.external.fetch[fetchType] = missingUrls.map(extractUrlString);
|
|
57
|
-
hasMissing = true;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return hasMissing;
|
|
62
|
-
}
|
|
63
|
-
function hasMissingExternalResourceTypes(requiredExternal, currentGrantedExternal, missingPermissions) {
|
|
64
|
-
let hasMissing = false;
|
|
65
|
-
for (const type of runtime_1.EXTERNAL_RESOURCE_TYPES) {
|
|
66
|
-
const externalUrls = requiredExternal[type];
|
|
67
|
-
if (externalUrls && externalUrls.length > 0) {
|
|
68
|
-
const missingUrls = externalUrls.filter((requiredUrl) => {
|
|
69
|
-
const currentGrantedUrls = currentGrantedExternal[type] || [];
|
|
70
|
-
const isUrlAlreadyGranted = currentGrantedUrls.some((currentGrantedUrl) => {
|
|
71
|
-
return (0, minimatch_1.minimatch)(extractUrlString(requiredUrl), extractUrlString(currentGrantedUrl));
|
|
72
|
-
});
|
|
73
|
-
return !isUrlAlreadyGranted;
|
|
74
|
-
});
|
|
75
|
-
if (missingUrls.length > 0) {
|
|
76
|
-
if (!missingPermissions.external) {
|
|
77
|
-
missingPermissions.external = {};
|
|
78
|
-
}
|
|
79
|
-
missingPermissions.external[type] = missingUrls.map(extractUrlString);
|
|
80
|
-
hasMissing = true;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return hasMissing;
|
|
85
|
-
}
|
|
86
|
-
const hasPermission = (requirements) => {
|
|
87
|
-
return wrapInSyncMetrics({ name: 'api.permissions.hasPermission' }, () => {
|
|
88
|
-
if (!(0, runtime_1.arePermsAvailableInRuntime)()) {
|
|
89
|
-
throw new errors_1.ApiNotReadyError('API not ready: this feature is not available yet');
|
|
90
|
-
}
|
|
91
|
-
const appContext = (0, runtime_1.getAppContext)();
|
|
92
|
-
const currentlyGrantedPermissions = appContext.permissions;
|
|
93
|
-
const missingPermissions = {};
|
|
94
|
-
let hasMissingPermissions = false;
|
|
95
|
-
if (hasMissingScopes(requirements.scopes, currentlyGrantedPermissions.scopes, missingPermissions)) {
|
|
96
|
-
hasMissingPermissions = true;
|
|
97
|
-
}
|
|
98
|
-
if (requirements.external) {
|
|
99
|
-
const { external: requiredExternal } = requirements;
|
|
100
|
-
const currentlyGrantedExternal = currentlyGrantedPermissions.external || {};
|
|
101
|
-
if (hasMissingFetchPermissions(requiredExternal.fetch, currentlyGrantedExternal.fetch, missingPermissions)) {
|
|
102
|
-
hasMissingPermissions = true;
|
|
103
|
-
}
|
|
104
|
-
if (hasMissingExternalResourceTypes(requiredExternal, currentlyGrantedExternal, missingPermissions)) {
|
|
105
|
-
hasMissingPermissions = true;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return {
|
|
109
|
-
granted: !hasMissingPermissions,
|
|
110
|
-
...(hasMissingPermissions && {
|
|
111
|
-
missing: new runtime_1.MissingPermissions(missingPermissions.scopes, missingPermissions.external, missingPermissions.content)
|
|
112
|
-
})
|
|
113
|
-
};
|
|
114
|
-
});
|
|
115
|
-
};
|
|
116
|
-
exports.hasPermission = hasPermission;
|
|
117
|
-
const hasScope = (scope) => {
|
|
118
|
-
return wrapInSyncMetrics({ name: 'api.permissions.hasScope' }, () => {
|
|
119
|
-
if (!(0, runtime_1.arePermsAvailableInRuntime)()) {
|
|
120
|
-
throw new errors_1.ApiNotReadyError('API not ready: this feature is not available yet');
|
|
121
|
-
}
|
|
122
|
-
const appContext = (0, runtime_1.getAppContext)();
|
|
123
|
-
const currentScopes = appContext.permissions.scopes;
|
|
124
|
-
if (Array.isArray(currentScopes)) {
|
|
125
|
-
return currentScopes.includes(scope);
|
|
126
|
-
}
|
|
127
|
-
return false;
|
|
128
|
-
});
|
|
129
|
-
};
|
|
130
|
-
exports.hasScope = hasScope;
|
|
131
|
-
const canFetchFrom = (type, url) => {
|
|
132
|
-
return wrapInSyncMetrics({ name: 'api.permissions.canFetchFrom' }, () => {
|
|
133
|
-
if (!(0, runtime_1.arePermsAvailableInRuntime)()) {
|
|
134
|
-
throw new errors_1.ApiNotReadyError('API not ready: this feature is not available yet');
|
|
135
|
-
}
|
|
136
|
-
const appContext = (0, runtime_1.getAppContext)();
|
|
137
|
-
const grantedUrls = appContext.permissions.external?.fetch?.[type];
|
|
138
|
-
if (!grantedUrls || grantedUrls.length === 0) {
|
|
139
|
-
return false;
|
|
140
|
-
}
|
|
141
|
-
return grantedUrls.some((grantedUrl) => {
|
|
142
|
-
return (0, minimatch_1.minimatch)(url, extractUrlString(grantedUrl));
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
};
|
|
146
|
-
exports.canFetchFrom = canFetchFrom;
|
|
147
|
-
const canLoadResource = (type, url) => {
|
|
148
|
-
return wrapInSyncMetrics({ name: 'api.permissions.canLoadResource' }, () => {
|
|
149
|
-
if (!(0, runtime_1.arePermsAvailableInRuntime)()) {
|
|
150
|
-
throw new errors_1.ApiNotReadyError('API not ready: this feature is not available yet');
|
|
151
|
-
}
|
|
152
|
-
const appContext = (0, runtime_1.getAppContext)();
|
|
153
|
-
const grantedUrls = appContext.permissions.external?.[type];
|
|
154
|
-
if (!grantedUrls || grantedUrls.length === 0) {
|
|
155
|
-
return false;
|
|
156
|
-
}
|
|
157
|
-
return grantedUrls.some((grantedUrl) => {
|
|
158
|
-
return (0, minimatch_1.minimatch)(url, extractUrlString(grantedUrl));
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
};
|
|
162
|
-
exports.canLoadResource = canLoadResource;
|
|
163
|
-
exports.permissions = {
|
|
164
|
-
hasPermission: exports.hasPermission,
|
|
165
|
-
hasScope: exports.hasScope,
|
|
166
|
-
canFetchFrom: exports.canFetchFrom,
|
|
167
|
-
canLoadResource: exports.canLoadResource
|
|
168
|
-
};
|