@atproto/oauth-scopes 0.1.0 → 0.2.1
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 +20 -0
- package/dist/atproto-oauth-scope.d.ts +6 -1
- package/dist/atproto-oauth-scope.d.ts.map +1 -1
- package/dist/atproto-oauth-scope.js +40 -5
- package/dist/atproto-oauth-scope.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/lexicon.js.map +1 -1
- package/dist/lib/mime.js.map +1 -1
- package/dist/lib/nsid.js.map +1 -1
- package/dist/lib/parser.js.map +1 -1
- package/dist/lib/resource-permission.js.map +1 -1
- package/dist/lib/syntax-lexicon.js.map +1 -1
- package/dist/lib/syntax-string.js.map +1 -1
- package/dist/lib/syntax.js.map +1 -1
- package/dist/lib/util.d.ts +1 -0
- package/dist/lib/util.d.ts.map +1 -1
- package/dist/lib/util.js +4 -0
- package/dist/lib/util.js.map +1 -1
- package/dist/scope-missing-error.js.map +1 -1
- package/dist/scope-permissions-transition.js.map +1 -1
- package/dist/scope-permissions.js.map +1 -1
- package/dist/scopes/account-permission.js.map +1 -1
- package/dist/scopes/blob-permission.js.map +1 -1
- package/dist/scopes/identity-permission.js.map +1 -1
- package/dist/scopes/include-scope.js.map +1 -1
- package/dist/scopes/repo-permission.js.map +1 -1
- package/dist/scopes/rpc-permission.js.map +1 -1
- package/dist/scopes-set.js.map +1 -1
- package/package.json +3 -3
- package/src/atproto-oauth-scope.ts +44 -8
- package/src/lib/util.ts +4 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# @atproto/oauth-scopes
|
|
2
2
|
|
|
3
|
+
## 0.2.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [[`09439d7d6`](https://github.com/bluesky-social/atproto/commit/09439d7d688294ad1a0c78a74b901ba2f7c5f4c3)]:
|
|
8
|
+
- @atproto/did@0.2.1
|
|
9
|
+
|
|
10
|
+
## 0.2.0
|
|
11
|
+
|
|
12
|
+
### Minor Changes
|
|
13
|
+
|
|
14
|
+
- [#4149](https://github.com/bluesky-social/atproto/pull/4149) [`8914f9abd`](https://github.com/bluesky-social/atproto/commit/8914f9abde2059c551d7e4c8d104227986098b82) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Method `authenticateRequest` now returns `SignedTokenPayload`
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- [#4149](https://github.com/bluesky-social/atproto/pull/4149) [`8914f9abd`](https://github.com/bluesky-social/atproto/commit/8914f9abde2059c551d7e4c8d104227986098b82) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Add scope normalization utility
|
|
19
|
+
|
|
20
|
+
- Updated dependencies []:
|
|
21
|
+
- @atproto/lexicon@0.5.1
|
|
22
|
+
|
|
3
23
|
## 0.1.0
|
|
4
24
|
|
|
5
25
|
### Minor Changes
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { ScopeStringFor, isScopeStringFor } from './lib/syntax.js';
|
|
2
2
|
export { type ScopeStringFor, isScopeStringFor };
|
|
3
|
-
export
|
|
3
|
+
export declare const STATIC_SCOPE_VALUES: readonly ["atproto", "transition:email", "transition:generic", "transition:chat.bsky"];
|
|
4
|
+
export type StaticScopeValue = (typeof STATIC_SCOPE_VALUES)[number];
|
|
5
|
+
export declare function isStaticScopeValue(value: string): value is StaticScopeValue;
|
|
6
|
+
export type AtprotoOauthScope = StaticScopeValue | ScopeStringFor<'account'> | ScopeStringFor<'blob'> | ScopeStringFor<'identity'> | ScopeStringFor<'include'> | ScopeStringFor<'repo'> | ScopeStringFor<'rpc'>;
|
|
4
7
|
/**
|
|
5
8
|
* @note This function does not only verify the scope string format (with
|
|
6
9
|
* {@link isScopeStringFor}), but also checks if the provided parameters are
|
|
@@ -9,4 +12,6 @@ export type AtprotoOauthScope = 'atproto' | 'transition:email' | 'transition:gen
|
|
|
9
12
|
* the code.
|
|
10
13
|
*/
|
|
11
14
|
export declare function isAtprotoOauthScope(value: string): value is AtprotoOauthScope;
|
|
15
|
+
export declare function normalizeAtprotoOauthScope(scope: string): string;
|
|
16
|
+
export declare function normalizeAtprotoOauthScopeValue(value: string): AtprotoOauthScope | null;
|
|
12
17
|
//# sourceMappingURL=atproto-oauth-scope.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atproto-oauth-scope.d.ts","sourceRoot":"","sources":["../src/atproto-oauth-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"atproto-oauth-scope.d.ts","sourceRoot":"","sources":["../src/atproto-oauth-scope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AASlE,OAAO,EAAE,KAAK,cAAc,EAAE,gBAAgB,EAAE,CAAA;AAEhD,eAAO,MAAM,mBAAmB,wFAKrB,CAAA;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;AACnE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,gBAAgB,CAE3E;AAED,MAAM,MAAM,iBAAiB,GACzB,gBAAgB,GAChB,cAAc,CAAC,SAAS,CAAC,GACzB,cAAc,CAAC,MAAM,CAAC,GACtB,cAAc,CAAC,UAAU,CAAC,GAC1B,cAAc,CAAC,SAAS,CAAC,GACzB,cAAc,CAAC,MAAM,CAAC,GACtB,cAAc,CAAC,KAAK,CAAC,CAAA;AAEzB;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,iBAAiB,CAU7E;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,UAOvD;AAED,wBAAgB,+BAA+B,CAC7C,KAAK,EAAE,MAAM,GACZ,iBAAiB,GAAG,IAAI,CAgB1B"}
|
|
@@ -1,15 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isScopeStringFor = void 0;
|
|
3
|
+
exports.STATIC_SCOPE_VALUES = exports.isScopeStringFor = void 0;
|
|
4
|
+
exports.isStaticScopeValue = isStaticScopeValue;
|
|
4
5
|
exports.isAtprotoOauthScope = isAtprotoOauthScope;
|
|
6
|
+
exports.normalizeAtprotoOauthScope = normalizeAtprotoOauthScope;
|
|
7
|
+
exports.normalizeAtprotoOauthScopeValue = normalizeAtprotoOauthScopeValue;
|
|
5
8
|
const syntax_js_1 = require("./lib/syntax.js");
|
|
6
9
|
Object.defineProperty(exports, "isScopeStringFor", { enumerable: true, get: function () { return syntax_js_1.isScopeStringFor; } });
|
|
10
|
+
const util_js_1 = require("./lib/util.js");
|
|
7
11
|
const account_permission_js_1 = require("./scopes/account-permission.js");
|
|
8
12
|
const blob_permission_js_1 = require("./scopes/blob-permission.js");
|
|
9
13
|
const identity_permission_js_1 = require("./scopes/identity-permission.js");
|
|
10
14
|
const include_scope_js_1 = require("./scopes/include-scope.js");
|
|
11
15
|
const repo_permission_js_1 = require("./scopes/repo-permission.js");
|
|
12
16
|
const rpc_permission_js_1 = require("./scopes/rpc-permission.js");
|
|
17
|
+
exports.STATIC_SCOPE_VALUES = Object.freeze([
|
|
18
|
+
'atproto',
|
|
19
|
+
'transition:email',
|
|
20
|
+
'transition:generic',
|
|
21
|
+
'transition:chat.bsky',
|
|
22
|
+
]);
|
|
23
|
+
function isStaticScopeValue(value) {
|
|
24
|
+
return exports.STATIC_SCOPE_VALUES.includes(value);
|
|
25
|
+
}
|
|
13
26
|
/**
|
|
14
27
|
* @note This function does not only verify the scope string format (with
|
|
15
28
|
* {@link isScopeStringFor}), but also checks if the provided parameters are
|
|
@@ -18,10 +31,7 @@ const rpc_permission_js_1 = require("./scopes/rpc-permission.js");
|
|
|
18
31
|
* the code.
|
|
19
32
|
*/
|
|
20
33
|
function isAtprotoOauthScope(value) {
|
|
21
|
-
return (value
|
|
22
|
-
value === 'transition:email' ||
|
|
23
|
-
value === 'transition:generic' ||
|
|
24
|
-
value === 'transition:chat.bsky' ||
|
|
34
|
+
return (isStaticScopeValue(value) ||
|
|
25
35
|
account_permission_js_1.AccountPermission.fromString(value) != null ||
|
|
26
36
|
blob_permission_js_1.BlobPermission.fromString(value) != null ||
|
|
27
37
|
identity_permission_js_1.IdentityPermission.fromString(value) != null ||
|
|
@@ -29,4 +39,29 @@ function isAtprotoOauthScope(value) {
|
|
|
29
39
|
repo_permission_js_1.RepoPermission.fromString(value) != null ||
|
|
30
40
|
rpc_permission_js_1.RpcPermission.fromString(value) != null);
|
|
31
41
|
}
|
|
42
|
+
function normalizeAtprotoOauthScope(scope) {
|
|
43
|
+
return scope
|
|
44
|
+
.split(' ')
|
|
45
|
+
.map(normalizeAtprotoOauthScopeValue)
|
|
46
|
+
.filter(util_js_1.isNonNullable)
|
|
47
|
+
.sort()
|
|
48
|
+
.join(' ');
|
|
49
|
+
}
|
|
50
|
+
function normalizeAtprotoOauthScopeValue(value) {
|
|
51
|
+
if (isStaticScopeValue(value))
|
|
52
|
+
return value;
|
|
53
|
+
for (const Scope of [
|
|
54
|
+
account_permission_js_1.AccountPermission,
|
|
55
|
+
blob_permission_js_1.BlobPermission,
|
|
56
|
+
identity_permission_js_1.IdentityPermission,
|
|
57
|
+
include_scope_js_1.IncludeScope,
|
|
58
|
+
repo_permission_js_1.RepoPermission,
|
|
59
|
+
rpc_permission_js_1.RpcPermission,
|
|
60
|
+
]) {
|
|
61
|
+
const parsed = Scope.fromString(value);
|
|
62
|
+
if (parsed)
|
|
63
|
+
return parsed.toString();
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
32
67
|
//# sourceMappingURL=atproto-oauth-scope.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atproto-oauth-scope.js","sourceRoot":"","sources":["../src/atproto-oauth-scope.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"atproto-oauth-scope.js","sourceRoot":"","sources":["../src/atproto-oauth-scope.ts"],"names":[],"mappings":";;;AAmBA,gDAEC;AAkBD,kDAUC;AAED,gEAOC;AAED,0EAkBC;AA9ED,+CAAkE;AASpC,iGATL,4BAAgB,OASK;AAR9C,2CAA6C;AAC7C,0EAAkE;AAClE,oEAA4D;AAC5D,4EAAoE;AACpE,gEAAwD;AACxD,oEAA4D;AAC5D,kEAA0D;AAI7C,QAAA,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/C,SAAS;IACT,kBAAkB;IAClB,oBAAoB;IACpB,sBAAsB;CACd,CAAC,CAAA;AAGX,SAAgB,kBAAkB,CAAC,KAAa;IAC9C,OAAQ,2BAAyC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AACnE,CAAC;AAWD;;;;;;GAMG;AACH,SAAgB,mBAAmB,CAAC,KAAa;IAC/C,OAAO,CACL,kBAAkB,CAAC,KAAK,CAAC;QACzB,yCAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI;QAC3C,mCAAc,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI;QACxC,2CAAkB,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI;QAC5C,+BAAY,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI;QACtC,mCAAc,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI;QACxC,iCAAa,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CACxC,CAAA;AACH,CAAC;AAED,SAAgB,0BAA0B,CAAC,KAAa;IACtD,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,+BAA+B,CAAC;SACpC,MAAM,CAAC,uBAAa,CAAC;SACrB,IAAI,EAAE;SACN,IAAI,CAAC,GAAG,CAAC,CAAA;AACd,CAAC;AAED,SAAgB,+BAA+B,CAC7C,KAAa;IAEb,IAAI,kBAAkB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAE3C,KAAK,MAAM,KAAK,IAAI;QAClB,yCAAiB;QACjB,mCAAc;QACd,2CAAkB;QAClB,+BAAY;QACZ,mCAAc;QACd,iCAAa;KACd,EAAE,CAAC;QACF,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACtC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAA;IACtC,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC","sourcesContent":["import { ScopeStringFor, isScopeStringFor } from './lib/syntax.js'\nimport { isNonNullable } from './lib/util.js'\nimport { AccountPermission } from './scopes/account-permission.js'\nimport { BlobPermission } from './scopes/blob-permission.js'\nimport { IdentityPermission } from './scopes/identity-permission.js'\nimport { IncludeScope } from './scopes/include-scope.js'\nimport { RepoPermission } from './scopes/repo-permission.js'\nimport { RpcPermission } from './scopes/rpc-permission.js'\n\nexport { type ScopeStringFor, isScopeStringFor }\n\nexport const STATIC_SCOPE_VALUES = Object.freeze([\n 'atproto',\n 'transition:email',\n 'transition:generic',\n 'transition:chat.bsky',\n] as const)\n\nexport type StaticScopeValue = (typeof STATIC_SCOPE_VALUES)[number]\nexport function isStaticScopeValue(value: string): value is StaticScopeValue {\n return (STATIC_SCOPE_VALUES as readonly string[]).includes(value)\n}\n\nexport type AtprotoOauthScope =\n | StaticScopeValue\n | ScopeStringFor<'account'>\n | ScopeStringFor<'blob'>\n | ScopeStringFor<'identity'>\n | ScopeStringFor<'include'>\n | ScopeStringFor<'repo'>\n | ScopeStringFor<'rpc'>\n\n/**\n * @note This function does not only verify the scope string format (with\n * {@link isScopeStringFor}), but also checks if the provided parameters are\n * valid according to the respective scope syntax definition. This allows\n * excluding scopes that cannot be fully interpreted by the current version of\n * the code.\n */\nexport function isAtprotoOauthScope(value: string): value is AtprotoOauthScope {\n return (\n isStaticScopeValue(value) ||\n AccountPermission.fromString(value) != null ||\n BlobPermission.fromString(value) != null ||\n IdentityPermission.fromString(value) != null ||\n IncludeScope.fromString(value) != null ||\n RepoPermission.fromString(value) != null ||\n RpcPermission.fromString(value) != null\n )\n}\n\nexport function normalizeAtprotoOauthScope(scope: string) {\n return scope\n .split(' ')\n .map(normalizeAtprotoOauthScopeValue)\n .filter(isNonNullable)\n .sort()\n .join(' ')\n}\n\nexport function normalizeAtprotoOauthScopeValue(\n value: string,\n): AtprotoOauthScope | null {\n if (isStaticScopeValue(value)) return value\n\n for (const Scope of [\n AccountPermission,\n BlobPermission,\n IdentityPermission,\n IncludeScope,\n RepoPermission,\n RpcPermission,\n ]) {\n const parsed = Scope.fromString(value)\n if (parsed) return parsed.toString()\n }\n\n return null\n}\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAwC;AAExC,2DAAwC;AACxC,oEAAiD;AACjD,yDAAsC;AACtC,kDAA+B;AAE/B,iEAA8C;AAC9C,8DAA2C;AAC3C,kEAA+C;AAC/C,4DAAyC;AACzC,8DAA2C;AAC3C,6DAA0C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAwC;AAExC,2DAAwC;AACxC,oEAAiD;AACjD,yDAAsC;AACtC,kDAA+B;AAE/B,iEAA8C;AAC9C,8DAA2C;AAC3C,kEAA+C;AAC/C,4DAAyC;AACzC,8DAA2C;AAC3C,6DAA0C","sourcesContent":["export * from './atproto-oauth-scope.js'\n\nexport * from './scope-missing-error.js'\nexport * from './scope-permissions-transition.js'\nexport * from './scope-permissions.js'\nexport * from './scopes-set.js'\n\nexport * from './scopes/account-permission.js'\nexport * from './scopes/blob-permission.js'\nexport * from './scopes/identity-permission.js'\nexport * from './scopes/include-scope.js'\nexport * from './scopes/repo-permission.js'\nexport * from './scopes/rpc-permission.js'\n"]}
|
package/dist/lib/lexicon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lexicon.js","sourceRoot":"","sources":["../../src/lib/lexicon.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"lexicon.js","sourceRoot":"","sources":["../../src/lib/lexicon.ts"],"names":[],"mappings":"","sourcesContent":["export type { LexPermission, LexPermissionSet } from '@atproto/lexicon'\n"]}
|
package/dist/lib/mime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mime.js","sourceRoot":"","sources":["../../src/lib/mime.ts"],"names":[],"mappings":";AAAA,yEAAyE;;AAgBzE,wBAEC;AAID,4BAKC;AAiBD,sCAEC;AAmBD,4CAKC;AApED,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAErC,IAAI,UAAU,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA,CAAC,gBAAgB;IACpD,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA,CAAC,mCAAmC;IACtE,IAAI,UAAU,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA,CAAC,mCAAmC;IACrF,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA,CAAC,sBAAsB;IAC5E,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA,CAAC,yBAAyB;IAE/D,OAAO,IAAI,CAAA;AACb,CAAC;AAID,SAAgB,MAAM,CAAC,KAAa;IAClC,OAAO,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC3D,CAAC;AAID,SAAgB,QAAQ,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,IAAI,CAAA,CAAC,qCAAqC;IACtE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAC7C,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AACrD,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,MAAc,EAAE,IAAU;IACrD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,MAAM,KAAK,IAAI,CAAA;AACxB,CAAC;AAED,SAAgB,aAAa,CAAC,MAAc,EAAE,IAAY;IACxD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AAC1D,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB,CAC7B,UAA4B,EAC5B,IAAU;IAEV,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,gBAAgB,CAC9B,UAA4B,EAC5B,IAAY;IAEZ,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AACjE,CAAC"}
|
|
1
|
+
{"version":3,"file":"mime.js","sourceRoot":"","sources":["../../src/lib/mime.ts"],"names":[],"mappings":";AAAA,yEAAyE;;AAgBzE,wBAEC;AAID,4BAKC;AAiBD,sCAEC;AAmBD,4CAKC;AApED,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAErC,IAAI,UAAU,KAAK,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA,CAAC,gBAAgB;IACpD,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA,CAAC,mCAAmC;IACtE,IAAI,UAAU,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA,CAAC,mCAAmC;IACrF,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA,CAAC,sBAAsB;IAC5E,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA,CAAC,yBAAyB;IAE/D,OAAO,IAAI,CAAA;AACb,CAAC;AAID,SAAgB,MAAM,CAAC,KAAa;IAClC,OAAO,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC3D,CAAC;AAID,SAAgB,QAAQ,CAAC,KAAc;IACrC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,IAAI,CAAA,CAAC,qCAAqC;IACtE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAA;IAC7C,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AACrD,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,MAAc,EAAE,IAAU;IACrD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7C,CAAC;IACD,OAAO,MAAM,KAAK,IAAI,CAAA;AACxB,CAAC;AAED,SAAgB,aAAa,CAAC,MAAc,EAAE,IAAY;IACxD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AAC1D,CAAC;AAED;;;;GAIG;AACH,SAAS,sBAAsB,CAC7B,UAA4B,EAC5B,IAAU;IAEV,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YACtC,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,gBAAgB,CAC9B,UAA4B,EAC5B,IAAY;IAEZ,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AACjE,CAAC","sourcesContent":["// @TODO Refactor in shared location for use with other @atproto packages\n\nfunction isStringSlashString(value: string): value is `${string}/${string}` {\n const slashIndex = value.indexOf('/')\n\n if (slashIndex === -1) return false // Missing slash\n if (slashIndex === 0) return false // No leading part before the slash\n if (slashIndex === value.length - 1) return false // No trailing part after the slash\n if (value.includes('/', slashIndex + 1)) return false // More than one slash\n if (value.includes(' ')) return false // Spaces are not allowed\n\n return true\n}\n\nexport type Mime = `${string}/${string}`\n\nexport function isMime(value: string): value is Mime {\n return isStringSlashString(value) && !value.includes('*')\n}\n\nexport type Accept = '*/*' | `${string}/*` | Mime\n\nexport function isAccept(value: unknown): value is Accept {\n if (typeof value !== 'string') return false\n if (value === '*/*') return true // Fast path for the most common case\n if (!isStringSlashString(value)) return false\n return !value.includes('*') || value.endsWith('/*')\n}\n\n/**\n * @note \"unsafe\" in that it does not check if either {@link accept} or\n * {@link mime} are actually valid values (and could, therefore, lead to false\n * positives if forged values are used).\n */\nfunction matchesAcceptUnsafe(accept: Accept, mime: Mime): boolean {\n if (accept === '*/*') {\n return true\n }\n if (accept.endsWith('/*')) {\n return mime.startsWith(accept.slice(0, -1))\n }\n return accept === mime\n}\n\nexport function matchesAccept(accept: Accept, mime: string): boolean {\n return isMime(mime) && matchesAcceptUnsafe(accept, mime)\n}\n\n/**\n * @note \"unsafe\" in that it does not check if either {@link accept} or\n * {@link mime} are actually valid values (and could, therefore, lead to false\n * positives if forged values are used).\n */\nfunction matchesAnyAcceptUnsafe(\n acceptable: Iterable<Accept>,\n mime: Mime,\n): boolean {\n for (const accept of acceptable) {\n if (matchesAcceptUnsafe(accept, mime)) {\n return true\n }\n }\n return false\n}\n\nexport function matchesAnyAccept(\n acceptable: Iterable<Accept>,\n mime: string,\n): boolean {\n return isMime(mime) && matchesAnyAcceptUnsafe(acceptable, mime)\n}\n"]}
|
package/dist/lib/nsid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nsid.js","sourceRoot":"","sources":["../../src/lib/nsid.ts"],"names":[],"mappings":";;;AAAA,4CAA6C;AAGtC,MAAM,MAAM,GAAG,CAAC,CAAU,EAAa,EAAE,CAC9C,OAAO,CAAC,KAAK,QAAQ,IAAI,IAAA,oBAAW,EAAC,CAAC,CAAC,CAAA;AAD5B,QAAA,MAAM,UACsB"}
|
|
1
|
+
{"version":3,"file":"nsid.js","sourceRoot":"","sources":["../../src/lib/nsid.ts"],"names":[],"mappings":";;;AAAA,4CAA6C;AAGtC,MAAM,MAAM,GAAG,CAAC,CAAU,EAAa,EAAE,CAC9C,OAAO,CAAC,KAAK,QAAQ,IAAI,IAAA,oBAAW,EAAC,CAAC,CAAC,CAAA;AAD5B,QAAA,MAAM,UACsB","sourcesContent":["import { isValidNsid } from '@atproto/syntax'\n\nexport type Nsid = `${string}.${string}.${string}`\nexport const isNsid = (v: unknown): v is Nsid =>\n typeof v === 'string' && isValidNsid(v)\n"]}
|
package/dist/lib/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/lib/parser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/lib/parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { ScopeStringSyntax } from './syntax-string.js'\nimport { NeRoArray, ParamValue, ScopeSyntax } from './syntax.js'\n\ntype InferParamPredicate<T extends (value: ParamValue) => boolean> =\n T extends ((value: ParamValue) => value is infer U extends ParamValue)\n ? U\n : ParamValue\n\ntype ParamsSchema = Record<\n string,\n | {\n multiple: false\n required: boolean\n default?: ParamValue\n normalize?: (value: ParamValue) => ParamValue\n validate: (value: ParamValue) => boolean\n }\n | {\n multiple: true\n required: boolean\n default?: NeRoArray<ParamValue>\n normalize?: (value: NeRoArray<ParamValue>) => NeRoArray<ParamValue>\n validate: (value: ParamValue) => boolean\n }\n>\n\ntype InferParams<S extends ParamsSchema> = {\n [K in keyof S]:\n | (S[K]['required'] extends true\n ? never\n : 'default' extends keyof S[K]\n ? S[K]['default']\n : undefined)\n | (S[K]['multiple'] extends true\n ? NeRoArray<InferParamPredicate<S[K]['validate']>>\n : InferParamPredicate<S[K]['validate']>)\n} & NonNullable<unknown>\n\nexport class Parser<P extends string, S extends ParamsSchema> {\n public readonly schemaKeys: ReadonlySet<keyof S & string>\n\n constructor(\n public readonly prefix: P,\n public readonly schema: S,\n public readonly positionalName?: keyof S & string,\n ) {\n this.schemaKeys = new Set(Object.keys(schema))\n }\n\n format(values: InferParams<S>) {\n const params = new URLSearchParams()\n let positional: string | undefined = undefined\n\n for (const key of this.schemaKeys) {\n const value = values[key]\n // Ignore undefined values\n if (value === undefined) continue\n\n const schema = this.schema[key]\n\n // Normalize the value if a normalization function is provided\n const normalized = schema.normalize\n ? schema.normalize(value as any)\n : value\n\n // Ignore values that are equal to the default value\n if (!schema.required) {\n if (schema.default === normalized) continue\n if (\n schema.multiple &&\n schema.default &&\n arrayParamEquals(schema.default, normalized as NeRoArray<string>)\n ) {\n continue\n }\n }\n\n if (Array.isArray(normalized)) {\n if (key === this.positionalName && normalized.length === 1) {\n positional = String(normalized[0]!)\n } else {\n // remove duplicates\n const unique = new Set(normalized.map(String))\n for (const v of unique) params.append(key, v)\n }\n } else {\n if (key === this.positionalName) {\n positional = String(normalized)\n } else {\n params.set(key, String(normalized))\n }\n }\n }\n\n return new ScopeStringSyntax(this.prefix, positional, params).toString()\n }\n\n // @NOTE If we needed to ever have more detailed reason as to why parsing\n // fails, this function could easily be updated to return a\n // ValidationResult<T> type that explains the reason for failure.\n parse(syntax: ScopeSyntax<P>) {\n // @NOTE no need to check prefix, since the typing (P generic) already\n // ensures it matches\n\n for (const key of syntax.keys()) {\n if (!this.schemaKeys.has(key)) return null\n }\n\n const result: Record<\n string,\n undefined | ParamValue | NeRoArray<ParamValue>\n > = Object.create(null)\n\n for (const key of this.schemaKeys) {\n const definition = this.schema[key]\n\n const param = definition.multiple\n ? syntax.getMulti(key)\n : syntax.getSingle(key)\n\n if (param === null) {\n return null // Value is not valid\n } else if (param !== undefined) {\n if (key === this.positionalName && syntax.positional !== undefined) {\n // Positional parameter cannot be used with named parameters\n return null\n }\n\n if (definition.multiple) {\n // Empty array is not valid\n if (!(param as ParamValue[]).length) return null\n if (!(param as ParamValue[]).every(definition.validate)) {\n return null\n }\n } else {\n if (!definition.validate(param as ParamValue)) {\n return null\n }\n }\n\n result[key] = param as ParamValue | NeRoArray<ParamValue>\n } else if (\n key === this.positionalName &&\n syntax.positional !== undefined\n ) {\n // No named parameters found, but there is a positional parameter\n const { positional } = syntax\n if (!definition.validate(positional)) {\n return null\n }\n result[key] = definition.multiple ? [positional] : positional\n } else if (definition.required) {\n return null\n } else {\n result[key] = definition.default\n }\n }\n\n return result as InferParams<S>\n }\n}\n\n/**\n * Two param arrays are considered equal if they contain the same values,\n * regardless of the order and duplicates.\n * @param a - The first array to compare.\n * @param b - The second array to compare.\n */\nfunction arrayParamEquals(\n a: readonly unknown[],\n b: readonly unknown[],\n): boolean {\n for (const item of a) if (!b.includes(item)) return false\n for (const item of b) if (!a.includes(item)) return false\n return true\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource-permission.js","sourceRoot":"","sources":["../../src/lib/resource-permission.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"resource-permission.js","sourceRoot":"","sources":["../../src/lib/resource-permission.ts"],"names":[],"mappings":"","sourcesContent":["import { ScopeStringFor } from './syntax.js'\nimport { Matchable } from './util.js'\n\n/**\n * Interface destined to provide consistency across parsed permission scopes for\n * resources (blob, repo, etc.).\n */\nexport interface ResourcePermission<R extends string, T> extends Matchable<T> {\n toString(): ScopeStringFor<R>\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syntax-lexicon.js","sourceRoot":"","sources":["../../src/lib/syntax-lexicon.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,MAAa,mBAAmB;IAG9B,YACW,aAAwD;QAAjE;;;;mBAAS,aAAa;WAA2C;IAChE,CAAC;IAEJ,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAA;IACpC,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,GAAG,CAAC,GAAW;QACb,2BAA2B;QAC3B,IAAI,GAAG,KAAK,MAAM;YAAE,OAAO,SAAS,CAAA;QACpC,IAAI,GAAG,KAAK,UAAU;YAAE,OAAO,SAAS,CAAA;QAExC,iDAAiD;QACjD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC;YAAE,OAAO,SAAS,CAAA;QAE7D,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;IAED,CAAC,IAAI;QACH,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAClD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS;gBAAE,MAAM,GAAG,CAAA;QAC5C,CAAC;IACH,CAAC;IAED,SAAS,CAAC,GAAW;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACrC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,QAAQ,CAAC,GAAW;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAA;QACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACtC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;CACF;AAhDD,kDAgDC"}
|
|
1
|
+
{"version":3,"file":"syntax-lexicon.js","sourceRoot":"","sources":["../../src/lib/syntax-lexicon.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,MAAa,mBAAmB;IAG9B,YACW,aAAwD;QAAjE;;;;mBAAS,aAAa;WAA2C;IAChE,CAAC;IAEJ,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAA;IACpC,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,GAAG,CAAC,GAAW;QACb,2BAA2B;QAC3B,IAAI,GAAG,KAAK,MAAM;YAAE,OAAO,SAAS,CAAA;QACpC,IAAI,GAAG,KAAK,UAAU;YAAE,OAAO,SAAS,CAAA;QAExC,iDAAiD;QACjD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC;YAAE,OAAO,SAAS,CAAA;QAE7D,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;IAED,CAAC,IAAI;QACH,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;YAClD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS;gBAAE,MAAM,GAAG,CAAA;QAC5C,CAAC;IACH,CAAC;IAED,SAAS,CAAC,GAAW;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACrC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,QAAQ,CAAC,GAAW;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAA;QACzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACtC,OAAO,KAAK,CAAA;IACd,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,aAAa,CAAA;IAC3B,CAAC;CACF;AAhDD,kDAgDC","sourcesContent":["import { LexPermission } from './lexicon.js'\nimport { ScopeSyntax } from './syntax.js'\n\n/**\n * Translates a {@link LexPermission} into a {@link ScopeSyntax}.\n */\nexport class LexPermissionSyntax<P extends string = string>\n implements ScopeSyntax<P>\n{\n constructor(\n readonly lexPermission: Readonly<LexPermission & { resource: P }>,\n ) {}\n\n get prefix() {\n return this.lexPermission.resource\n }\n\n get positional() {\n return undefined\n }\n\n get(key: string) {\n // Ignore reserved keywords\n if (key === 'type') return undefined\n if (key === 'resource') return undefined\n\n // Ignore inherited properties (toString(), etc.)\n if (!Object.hasOwn(this.lexPermission, key)) return undefined\n\n return this.lexPermission[key]\n }\n\n *keys() {\n for (const key of Object.keys(this.lexPermission)) {\n if (this.get(key) !== undefined) yield key\n }\n }\n\n getSingle(key: string) {\n const value = this.get(key)\n if (Array.isArray(value)) return null\n return value\n }\n\n getMulti(key: string) {\n const value = this.get(key)\n if (value === undefined) return undefined\n if (!Array.isArray(value)) return null\n return value\n }\n\n toJSON() {\n return this.lexPermission\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syntax-string.js","sourceRoot":"","sources":["../../src/lib/syntax-string.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"syntax-string.js","sourceRoot":"","sources":["../../src/lib/syntax-string.ts"],"names":[],"mappings":"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","sourcesContent":["import { ScopeStringFor, ScopeSyntax } from './syntax.js'\nimport { minIdx } from './util.js'\n\n/**\n * Translates a scope string into a {@link ScopeSyntax}.\n */\nexport class ScopeStringSyntax<P extends string> implements ScopeSyntax<P> {\n constructor(\n readonly prefix: P,\n readonly positional?: string,\n readonly params?: Readonly<URLSearchParams>,\n ) {}\n\n *keys() {\n if (this.params) yield* this.params.keys()\n }\n\n getSingle(key: string) {\n if (!this.params?.has(key)) return undefined\n const value = this.params.getAll(key)\n if (value.length > 1) return null\n return value[0]!\n }\n\n getMulti(key: string) {\n if (!this.params?.has(key)) return undefined\n return this.params.getAll(key)\n }\n\n toString() {\n let scope: string = this.prefix\n\n if (this.positional !== undefined) {\n scope += `:${normalizeURIComponent(encodeURIComponent(this.positional))}`\n }\n\n if (this.params?.size) {\n scope += `?${normalizeURIComponent(this.params.toString())}`\n }\n\n return scope as ScopeStringFor<P>\n }\n\n static fromString<P extends string>(\n scopeValue: ScopeStringFor<P>,\n ): ScopeStringSyntax<P> {\n const paramIdx = scopeValue.indexOf('?')\n const colonIdx = scopeValue.indexOf(':')\n const prefixEnd = minIdx(paramIdx, colonIdx)\n\n // No param or positional\n if (prefixEnd === -1) {\n return new ScopeStringSyntax(scopeValue as P)\n }\n\n const prefix = scopeValue.slice(0, prefixEnd) as P\n\n // Parse the positional parameter if present\n const positional =\n colonIdx !== -1\n ? paramIdx === -1\n ? decodeURIComponent(scopeValue.slice(colonIdx + 1))\n : colonIdx < paramIdx\n ? decodeURIComponent(scopeValue.slice(colonIdx + 1, paramIdx))\n : undefined\n : undefined\n\n // Parse the query string if present and non empty\n const params =\n paramIdx !== -1 && paramIdx < scopeValue.length - 1\n ? new URLSearchParams(scopeValue.slice(paramIdx + 1))\n : undefined\n\n return new ScopeStringSyntax(prefix, positional, params)\n }\n}\n\n/**\n * Set of characters that are allowed in scope components without encoding. This\n * is used to normalize scope components.\n */\nconst ALLOWED_SCOPE_CHARS = new Set(\n // @NOTE This list must not contain \"?\" or \"&\" as it would interfere with\n // query string parsing.\n [':', '/', '+', ',', '@', '%'],\n)\n\nconst NORMALIZABLE_CHARS_MAP = new Map(\n Array.from(\n ALLOWED_SCOPE_CHARS,\n (c) => [encodeURIComponent(c), c] as const,\n ).filter(\n ([encoded, c]) =>\n // Make sure that any char added to ALLOWED_SCOPE_CHARS that is a char\n // that indeed needs encoding. Also, the normalizeURIComponent only\n // supports three-character percent-encoded sequences.\n encoded !== c && encoded.length === 3 && encoded.startsWith('%'),\n ),\n)\n\n/**\n * Assumes a properly url-encoded string.\n */\nfunction normalizeURIComponent(value: string): string {\n // No need to read the last two characters since percent encoded characters\n // are always three characters long.\n let end = value.length - 2\n\n for (let i = 0; i < end; i++) {\n // Check if the character is a percent-encoded character\n if (value.charCodeAt(i) === 0x25 /* % */) {\n // Read the next encoded char. Current version only supports\n // three-character percent-encoded sequences.\n const encodedChar = value.slice(i, i + 3)\n\n // Check if the encoded character is in the normalization map\n const normalizedChar = NORMALIZABLE_CHARS_MAP.get(encodedChar)\n if (normalizedChar) {\n // Replace the encoded character with its normalized version\n value = `${value.slice(0, i)}${normalizedChar}${value.slice(i + encodedChar.length)}`\n\n // Adjust index to account for the length change\n i += normalizedChar.length - 1\n\n // Adjust end index since we replaced encoded char with normalized char\n end -= encodedChar.length - normalizedChar.length\n }\n }\n }\n\n return value\n}\n"]}
|
package/dist/lib/syntax.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syntax.js","sourceRoot":"","sources":["../../src/lib/syntax.ts"],"names":[],"mappings":";;AAiBA,4CAiBC;AApBD;;GAEG;AACH,SAAgB,gBAAgB,CAC9B,KAAa,EACb,MAAS;IAET,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACjC,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAChD,IAAI,QAAQ,KAAK,IAAI,CAAC,OAAO,IAAI,QAAQ,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAA;QACd,CAAC;QAED,6BAA6B;QAC7B,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC;SAAM,CAAC;QACN,iCAAiC;QACjC,OAAO,KAAK,KAAK,MAAM,CAAA;IACzB,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"syntax.js","sourceRoot":"","sources":["../../src/lib/syntax.ts"],"names":[],"mappings":";;AAiBA,4CAiBC;AApBD;;GAEG;AACH,SAAgB,gBAAgB,CAC9B,KAAa,EACb,MAAS;IAET,IAAI,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACjC,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAChD,IAAI,QAAQ,KAAK,IAAI,CAAC,OAAO,IAAI,QAAQ,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAA;QACd,CAAC;QAED,6BAA6B;QAC7B,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC;SAAM,CAAC;QACN,iCAAiC;QACjC,OAAO,KAAK,KAAK,MAAM,CAAA;IACzB,CAAC;AACH,CAAC","sourcesContent":["export type ParamValue = string | number | boolean\n\nexport type NeArray<T> = [T, ...T[]]\n\n/**\n * Non-empty readonly array\n */\nexport type NeRoArray<T> = readonly [T, ...T[]]\n\nexport type ScopeStringFor<P extends string> =\n | P\n | `${P}:${string}`\n | `${P}?${string}`\n\n/**\n * Allows to quickly check if a scope is for a specific resource.\n */\nexport function isScopeStringFor<P extends string>(\n value: string,\n prefix: P,\n): value is ScopeStringFor<P> {\n if (value.length > prefix.length) {\n // First, check the next char is either : or ?\n const nextChar = value.charCodeAt(prefix.length)\n if (nextChar !== 0x3a /* : */ && nextChar !== 0x3f /* ? */) {\n return false\n }\n\n // Then check the full prefix\n return value.startsWith(prefix)\n } else {\n // value and prefix must be equal\n return value === prefix\n }\n}\n\n/**\n * Abstract interface that allows parsing various syntaxes into permission\n * representations.\n */\nexport interface ScopeSyntax<P extends string> {\n readonly prefix: P\n readonly positional?: ParamValue\n keys(): Iterable<string, void, unknown>\n getSingle(key: string): ParamValue | null | undefined\n getMulti(key: string): ParamValue[] | null | undefined\n}\n"]}
|
package/dist/lib/util.d.ts
CHANGED
|
@@ -3,4 +3,5 @@ export interface Matchable<T> {
|
|
|
3
3
|
}
|
|
4
4
|
export declare function minIdx(a: number, b: number): number;
|
|
5
5
|
export declare function knownValuesValidator<T>(values: Iterable<T>): (value: unknown) => value is T;
|
|
6
|
+
export declare function isNonNullable<T>(value: T): value is NonNullable<T>;
|
|
6
7
|
//# sourceMappingURL=util.d.ts.map
|
package/dist/lib/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/lib/util.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAA;CAC7B;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAInD;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,IAEjD,OAAO,OAAO,KAAG,KAAK,IAAI,CAAC,CACpC"}
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/lib/util.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,OAAO,CAAA;CAC7B;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAInD;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,IAEjD,OAAO,OAAO,KAAG,KAAK,IAAI,CAAC,CACpC;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAElE"}
|
package/dist/lib/util.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.minIdx = minIdx;
|
|
4
4
|
exports.knownValuesValidator = knownValuesValidator;
|
|
5
|
+
exports.isNonNullable = isNonNullable;
|
|
5
6
|
function minIdx(a, b) {
|
|
6
7
|
if (a === -1)
|
|
7
8
|
return b;
|
|
@@ -13,4 +14,7 @@ function knownValuesValidator(values) {
|
|
|
13
14
|
const set = new Set(values);
|
|
14
15
|
return (value) => set.has(value);
|
|
15
16
|
}
|
|
17
|
+
function isNonNullable(value) {
|
|
18
|
+
return value != null;
|
|
19
|
+
}
|
|
16
20
|
//# sourceMappingURL=util.js.map
|
package/dist/lib/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/lib/util.ts"],"names":[],"mappings":";;AAIA,wBAIC;AAED,oDAGC;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/lib/util.ts"],"names":[],"mappings":";;AAIA,wBAIC;AAED,oDAGC;AAED,sCAEC;AAbD,SAAgB,MAAM,CAAC,CAAS,EAAE,CAAS;IACzC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IACtB,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO,CAAC,CAAA;IACtB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACvB,CAAC;AAED,SAAgB,oBAAoB,CAAI,MAAmB;IACzD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAU,MAAM,CAAC,CAAA;IACpC,OAAO,CAAC,KAAc,EAAc,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AACvD,CAAC;AAED,SAAgB,aAAa,CAAI,KAAQ;IACvC,OAAO,KAAK,IAAI,IAAI,CAAA;AACtB,CAAC","sourcesContent":["export interface Matchable<T> {\n matches(options: T): boolean\n}\n\nexport function minIdx(a: number, b: number): number {\n if (a === -1) return b\n if (b === -1) return a\n return Math.min(a, b)\n}\n\nexport function knownValuesValidator<T>(values: Iterable<T>) {\n const set = new Set<unknown>(values)\n return (value: unknown): value is T => set.has(value)\n}\n\nexport function isNonNullable<T>(value: T): value is NonNullable<T> {\n return value != null\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope-missing-error.js","sourceRoot":"","sources":["../src/scope-missing-error.ts"],"names":[],"mappings":";;;AAAA,MAAa,iBAAkB,SAAQ,KAAK;IAO1C,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,YAA4B,KAAa;QACvC,KAAK,CAAC,2BAA2B,KAAK,GAAG,CAAC,CAAA;QADhC;;;;mBAAgB,KAAK;WAAQ;QAVzC;;;;mBAAO,mBAAmB;WAAA;QAE1B,oEAAoE;QACpE,kDAAkD;QAClD;;;;mBAAS,GAAG;WAAA;QACZ;;;;mBAAS,IAAI;WAAA;IAOb,CAAC;CACF;AAdD,8CAcC"}
|
|
1
|
+
{"version":3,"file":"scope-missing-error.js","sourceRoot":"","sources":["../src/scope-missing-error.ts"],"names":[],"mappings":";;;AAAA,MAAa,iBAAkB,SAAQ,KAAK;IAO1C,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,YAA4B,KAAa;QACvC,KAAK,CAAC,2BAA2B,KAAK,GAAG,CAAC,CAAA;QADhC;;;;mBAAgB,KAAK;WAAQ;QAVzC;;;;mBAAO,mBAAmB;WAAA;QAE1B,oEAAoE;QACpE,kDAAkD;QAClD;;;;mBAAS,GAAG;WAAA;QACZ;;;;mBAAS,IAAI;WAAA;IAOb,CAAC;CACF;AAdD,8CAcC","sourcesContent":["export class ScopeMissingError extends Error {\n name = 'ScopeMissingError'\n\n // compatibility layer with http-errors package. The goal if to make\n // isHttpError(new ScopeMissingError) return true.\n status = 403\n expose = true\n get statusCode() {\n return this.status\n }\n\n constructor(public readonly scope: string) {\n super(`Missing required scope \"${scope}\"`)\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope-permissions-transition.js","sourceRoot":"","sources":["../src/scope-permissions-transition.ts"],"names":[],"mappings":";;;AAAA,iEAM+B;AAE/B;;;GAGG;AACH,MAAa,0BAA2B,SAAQ,uCAAgB;IAC9D,IAAI,oBAAoB;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IAC9C,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAC5C,CAAC;IAED,IAAI,qBAAqB;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;IAChD,CAAC;IAEQ,aAAa,CAAC,OAA+B;QACpD,IACE,OAAO,CAAC,IAAI,KAAK,OAAO;YACxB,OAAO,CAAC,MAAM,KAAK,MAAM;YACzB,IAAI,CAAC,kBAAkB,EACvB,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IACrC,CAAC;IAEQ,UAAU,CAAC,OAA4B;QAC9C,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IAEQ,UAAU,CAAC,OAA4B;QAC9C,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IAEQ,SAAS,CAAC,OAA2B;QAC5C,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;QAEvB,IAAI,IAAI,CAAC,oBAAoB,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,IAAI,CAAC,oBAAoB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,IAAI,CAAC,qBAAqB,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;CACF;AA1DD,gEA0DC"}
|
|
1
|
+
{"version":3,"file":"scope-permissions-transition.js","sourceRoot":"","sources":["../src/scope-permissions-transition.ts"],"names":[],"mappings":";;;AAAA,iEAM+B;AAE/B;;;GAGG;AACH,MAAa,0BAA2B,SAAQ,uCAAgB;IAC9D,IAAI,oBAAoB;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IAC9C,CAAC;IAED,IAAI,kBAAkB;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IAC5C,CAAC;IAED,IAAI,qBAAqB;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;IAChD,CAAC;IAEQ,aAAa,CAAC,OAA+B;QACpD,IACE,OAAO,CAAC,IAAI,KAAK,OAAO;YACxB,OAAO,CAAC,MAAM,KAAK,MAAM;YACzB,IAAI,CAAC,kBAAkB,EACvB,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IACrC,CAAC;IAEQ,UAAU,CAAC,OAA4B;QAC9C,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IAEQ,UAAU,CAAC,OAA4B;QAC9C,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IAEQ,SAAS,CAAC,OAA2B;QAC5C,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;QAEvB,IAAI,IAAI,CAAC,oBAAoB,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;YAC7C,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,IAAI,CAAC,oBAAoB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAA;QACb,CAAC;QAED,IAAI,IAAI,CAAC,qBAAqB,IAAI,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;CACF;AA1DD,gEA0DC","sourcesContent":["import {\n AccountPermissionMatch,\n BlobPermissionMatch,\n RepoPermissionMatch,\n RpcPermissionMatch,\n ScopePermissions,\n} from './scope-permissions.js'\n\n/**\n * Overrides the default permission set to allow transitional scopes to be used\n * in place of the generic scopes.\n */\nexport class ScopePermissionsTransition extends ScopePermissions {\n get hasTransitionGeneric(): boolean {\n return this.scopes.has('transition:generic')\n }\n\n get hasTransitionEmail(): boolean {\n return this.scopes.has('transition:email')\n }\n\n get hasTransitionChatBsky(): boolean {\n return this.scopes.has('transition:chat.bsky')\n }\n\n override allowsAccount(options: AccountPermissionMatch): boolean {\n if (\n options.attr === 'email' &&\n options.action === 'read' &&\n this.hasTransitionEmail\n ) {\n return true\n }\n\n return super.allowsAccount(options)\n }\n\n override allowsBlob(options: BlobPermissionMatch): boolean {\n if (this.hasTransitionGeneric) {\n return true\n }\n\n return super.allowsBlob(options)\n }\n\n override allowsRepo(options: RepoPermissionMatch): boolean {\n if (this.hasTransitionGeneric) {\n return true\n }\n\n return super.allowsRepo(options)\n }\n\n override allowsRpc(options: RpcPermissionMatch) {\n const { lxm } = options\n\n if (this.hasTransitionGeneric && lxm === '*') {\n return true\n }\n\n if (this.hasTransitionGeneric && !lxm.startsWith('chat.bsky.')) {\n return true\n }\n\n if (this.hasTransitionChatBsky && lxm.startsWith('chat.bsky.')) {\n return true\n }\n\n return super.allowsRpc(options)\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scope-permissions.js","sourceRoot":"","sources":["../src/scope-permissions.ts"],"names":[],"mappings":";;;AAAA,qEAA4D;AAC5D,0EAGuC;AACvC,oEAGoC;AACpC,4EAGwC;AACxC,oEAGoC;AACpC,kEAA8E;AAC9E,mDAA2C;AAU3C,MAAa,gBAAgB;IAG3B,YAAY,KAAwC;QAFpC;;;;;WAAiB;QAG/B,IAAI,CAAC,MAAM,GAAG,IAAI,yBAAS,CACzB,CAAC,KAAK,CAAC,wBAAwB;YAC7B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;gBACzB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;gBAClB,CAAC,CAAC,KAAK,CACZ,CAAA;IACH,CAAC;IAEM,aAAa,CAAC,OAA+B;QAClD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAChD,CAAC;IACM,aAAa,CAAC,OAA+B;QAClD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,yCAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YACvD,MAAM,IAAI,0CAAiB,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAEM,cAAc,CAAC,OAAgC;QACpD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IACjD,CAAC;IACM,cAAc,CAAC,OAAgC;QACpD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,2CAAkB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YACxD,MAAM,IAAI,0CAAiB,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAEM,UAAU,CAAC,OAA4B;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7C,CAAC;IACM,UAAU,CAAC,OAA4B;QAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,mCAAc,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YACpD,MAAM,IAAI,0CAAiB,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAEM,UAAU,CAAC,OAA4B;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7C,CAAC;IACM,UAAU,CAAC,OAA4B;QAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,mCAAc,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YACpD,MAAM,IAAI,0CAAiB,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAEM,SAAS,CAAC,OAA2B;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC5C,CAAC;IACM,SAAS,CAAC,OAA2B;QAC1C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,iCAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YACnD,MAAM,IAAI,0CAAiB,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;CACF;AA9DD,4CA8DC"}
|
|
1
|
+
{"version":3,"file":"scope-permissions.js","sourceRoot":"","sources":["../src/scope-permissions.ts"],"names":[],"mappings":";;;AAAA,qEAA4D;AAC5D,0EAGuC;AACvC,oEAGoC;AACpC,4EAGwC;AACxC,oEAGoC;AACpC,kEAA8E;AAC9E,mDAA2C;AAU3C,MAAa,gBAAgB;IAG3B,YAAY,KAAwC;QAFpC;;;;;WAAiB;QAG/B,IAAI,CAAC,MAAM,GAAG,IAAI,yBAAS,CACzB,CAAC,KAAK,CAAC,wBAAwB;YAC7B,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;gBACzB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;gBAClB,CAAC,CAAC,KAAK,CACZ,CAAA;IACH,CAAC;IAEM,aAAa,CAAC,OAA+B;QAClD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAChD,CAAC;IACM,aAAa,CAAC,OAA+B;QAClD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,yCAAiB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YACvD,MAAM,IAAI,0CAAiB,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAEM,cAAc,CAAC,OAAgC;QACpD,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IACjD,CAAC;IACM,cAAc,CAAC,OAAgC;QACpD,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,2CAAkB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YACxD,MAAM,IAAI,0CAAiB,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAEM,UAAU,CAAC,OAA4B;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7C,CAAC;IACM,UAAU,CAAC,OAA4B;QAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,mCAAc,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YACpD,MAAM,IAAI,0CAAiB,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAEM,UAAU,CAAC,OAA4B;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7C,CAAC;IACM,UAAU,CAAC,OAA4B;QAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,mCAAc,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YACpD,MAAM,IAAI,0CAAiB,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAEM,SAAS,CAAC,OAA2B;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC5C,CAAC;IACM,SAAS,CAAC,OAA2B;QAC1C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,iCAAa,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YACnD,MAAM,IAAI,0CAAiB,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;CACF;AA9DD,4CA8DC","sourcesContent":["import { ScopeMissingError } from './scope-missing-error.js'\nimport {\n AccountPermission,\n AccountPermissionMatch,\n} from './scopes/account-permission.js'\nimport {\n BlobPermission,\n BlobPermissionMatch,\n} from './scopes/blob-permission.js'\nimport {\n IdentityPermission,\n IdentityPermissionMatch,\n} from './scopes/identity-permission.js'\nimport {\n RepoPermission,\n RepoPermissionMatch,\n} from './scopes/repo-permission.js'\nimport { RpcPermission, RpcPermissionMatch } from './scopes/rpc-permission.js'\nimport { ScopesSet } from './scopes-set.js'\n\nexport type {\n AccountPermissionMatch,\n BlobPermissionMatch,\n IdentityPermissionMatch,\n RepoPermissionMatch,\n RpcPermissionMatch,\n}\n\nexport class ScopePermissions {\n public readonly scopes: ScopesSet\n\n constructor(scope?: null | string | Iterable<string>) {\n this.scopes = new ScopesSet(\n !scope // \"\" | null | undefined\n ? undefined\n : typeof scope === 'string'\n ? scope.split(' ')\n : scope,\n )\n }\n\n public allowsAccount(options: AccountPermissionMatch): boolean {\n return this.scopes.matches('account', options)\n }\n public assertAccount(options: AccountPermissionMatch): void {\n if (!this.allowsAccount(options)) {\n const scope = AccountPermission.scopeNeededFor(options)\n throw new ScopeMissingError(scope)\n }\n }\n\n public allowsIdentity(options: IdentityPermissionMatch): boolean {\n return this.scopes.matches('identity', options)\n }\n public assertIdentity(options: IdentityPermissionMatch): void {\n if (!this.allowsIdentity(options)) {\n const scope = IdentityPermission.scopeNeededFor(options)\n throw new ScopeMissingError(scope)\n }\n }\n\n public allowsBlob(options: BlobPermissionMatch): boolean {\n return this.scopes.matches('blob', options)\n }\n public assertBlob(options: BlobPermissionMatch): void {\n if (!this.allowsBlob(options)) {\n const scope = BlobPermission.scopeNeededFor(options)\n throw new ScopeMissingError(scope)\n }\n }\n\n public allowsRepo(options: RepoPermissionMatch): boolean {\n return this.scopes.matches('repo', options)\n }\n public assertRepo(options: RepoPermissionMatch): void {\n if (!this.allowsRepo(options)) {\n const scope = RepoPermission.scopeNeededFor(options)\n throw new ScopeMissingError(scope)\n }\n }\n\n public allowsRpc(options: RpcPermissionMatch): boolean {\n return this.scopes.matches('rpc', options)\n }\n public assertRpc(options: RpcPermissionMatch): void {\n if (!this.allowsRpc(options)) {\n const scope = RpcPermission.scopeNeededFor(options)\n throw new ScopeMissingError(scope)\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account-permission.js","sourceRoot":"","sources":["../../src/scopes/account-permission.ts"],"names":[],"mappings":";;;AAAA,gDAAyC;AAEzC,8DAA2D;AAC3D,gDAAgE;AAChE,4CAAqD;AAExC,QAAA,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9C,OAAO;IACP,MAAM;IACN,QAAQ;CACA,CAAC,CAAA;AAGE,QAAA,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAU,CAAC,CAAA;AAQzE,MAAa,iBAAiB;IAG5B,YACkB,IAAsB,EACtB,MAAqB;QADrC;;;;mBAAgB,IAAI;WAAkB;QACtC;;;;mBAAgB,MAAM;WAAe;IACpC,CAAC;IAEJ,OAAO,CAAC,OAA+B;QACrC,OAAO,CACL,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;YAC1B,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAC7D,CAAA;IACH,CAAC;IAED,QAAQ;QACN,OAAO,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;IAoBD,MAAM,CAAC,UAAU,CAAC,KAAa;QAC7B,IAAI,CAAC,IAAA,4BAAgB,EAAC,KAAK,EAAE,SAAS,CAAC;YAAE,OAAO,IAAI,CAAA;QACpD,MAAM,MAAM,GAAG,oCAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7C,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAA8B;QAC9C,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAExB,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAC1D,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,OAA+B;QACnD,OAAO,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACjD,CAAC;;AApDH,8CAqDC;AAlC2B;;;;WAAS,IAAI,kBAAM,CAC3C,SAAS,EACT;QACE,IAAI,EAAE;YACJ,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAA,8BAAoB,EAAC,0BAAkB,CAAC;SACnD;QACD,MAAM,EAAE;YACN,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAA,8BAAoB,EAAC,uBAAe,CAAC;YAC/C,OAAO,EAAE,MAAe;SACzB;KACF,EACD,MAAM,CACP;EAhB+B,CAgB/B"}
|
|
1
|
+
{"version":3,"file":"account-permission.js","sourceRoot":"","sources":["../../src/scopes/account-permission.ts"],"names":[],"mappings":";;;AAAA,gDAAyC;AAEzC,8DAA2D;AAC3D,gDAAgE;AAChE,4CAAqD;AAExC,QAAA,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9C,OAAO;IACP,MAAM;IACN,QAAQ;CACA,CAAC,CAAA;AAGE,QAAA,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAU,CAAC,CAAA;AAQzE,MAAa,iBAAiB;IAG5B,YACkB,IAAsB,EACtB,MAAqB;QADrC;;;;mBAAgB,IAAI;WAAkB;QACtC;;;;mBAAgB,MAAM;WAAe;IACpC,CAAC;IAEJ,OAAO,CAAC,OAA+B;QACrC,OAAO,CACL,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;YAC1B,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAC7D,CAAA;IACH,CAAC;IAED,QAAQ;QACN,OAAO,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;IAoBD,MAAM,CAAC,UAAU,CAAC,KAAa;QAC7B,IAAI,CAAC,IAAA,4BAAgB,EAAC,KAAK,EAAE,SAAS,CAAC;YAAE,OAAO,IAAI,CAAA;QACpD,MAAM,MAAM,GAAG,oCAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,iBAAiB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC7C,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAA8B;QAC9C,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAExB,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAC1D,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,OAA+B;QACnD,OAAO,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACjD,CAAC;;AApDH,8CAqDC;AAlC2B;;;;WAAS,IAAI,kBAAM,CAC3C,SAAS,EACT;QACE,IAAI,EAAE;YACJ,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAA,8BAAoB,EAAC,0BAAkB,CAAC;SACnD;QACD,MAAM,EAAE;YACN,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAA,8BAAoB,EAAC,uBAAe,CAAC;YAC/C,OAAO,EAAE,MAAe;SACzB;KACF,EACD,MAAM,CACP;EAhB+B,CAgB/B","sourcesContent":["import { Parser } from '../lib/parser.js'\nimport { ResourcePermission } from '../lib/resource-permission.js'\nimport { ScopeStringSyntax } from '../lib/syntax-string.js'\nimport { ScopeSyntax, isScopeStringFor } from '../lib/syntax.js'\nimport { knownValuesValidator } from '../lib/util.js'\n\nexport const ACCOUNT_ATTRIBUTES = Object.freeze([\n 'email',\n 'repo',\n 'status',\n] as const)\nexport type AccountAttribute = (typeof ACCOUNT_ATTRIBUTES)[number]\n\nexport const ACCOUNT_ACTIONS = Object.freeze(['read', 'manage'] as const)\nexport type AccountAction = (typeof ACCOUNT_ACTIONS)[number]\n\nexport type AccountPermissionMatch = {\n attr: AccountAttribute\n action: AccountAction\n}\n\nexport class AccountPermission\n implements ResourcePermission<'account', AccountPermissionMatch>\n{\n constructor(\n public readonly attr: AccountAttribute,\n public readonly action: AccountAction,\n ) {}\n\n matches(options: AccountPermissionMatch) {\n return (\n this.attr === options.attr &&\n (this.action === 'manage' || this.action === options.action)\n )\n }\n\n toString() {\n return AccountPermission.parser.format(this)\n }\n\n protected static readonly parser = new Parser(\n 'account',\n {\n attr: {\n multiple: false,\n required: true,\n validate: knownValuesValidator(ACCOUNT_ATTRIBUTES),\n },\n action: {\n multiple: false,\n required: false,\n validate: knownValuesValidator(ACCOUNT_ACTIONS),\n default: 'read' as const,\n },\n },\n 'attr',\n )\n\n static fromString(scope: string) {\n if (!isScopeStringFor(scope, 'account')) return null\n const syntax = ScopeStringSyntax.fromString(scope)\n return AccountPermission.fromSyntax(syntax)\n }\n\n static fromSyntax(syntax: ScopeSyntax<'account'>) {\n const result = AccountPermission.parser.parse(syntax)\n if (!result) return null\n\n return new AccountPermission(result.attr, result.action)\n }\n\n static scopeNeededFor(options: AccountPermissionMatch) {\n return AccountPermission.parser.format(options)\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blob-permission.js","sourceRoot":"","sources":["../../src/scopes/blob-permission.ts"],"names":[],"mappings":";;;AAAA,4CAAmE;AACnE,gDAAyC;AAEzC,8DAA2D;AAC3D,gDAMyB;AAIZ,QAAA,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAU,CAAC,CAAA;AAM7D,MAAa,cAAc;IAGzB,YAA4B,MAAyB;QAAzC;;;;mBAAgB,MAAM;WAAmB;IAAG,CAAC;IAEzD,OAAO,CAAC,OAA4B;QAClC,OAAO,IAAA,0BAAgB,EAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,CAAC;IAED,QAAQ;QACN,OAAO,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC3C,CAAC;IAuBD,MAAM,CAAC,UAAU,CAAC,KAAa;QAC7B,IAAI,CAAC,IAAA,4BAAgB,EAAC,KAAK,EAAE,MAAM,CAAC;YAAE,OAAO,IAAI,CAAA;QACjD,MAAM,MAAM,GAAG,oCAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAA2B;QAC3C,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAClD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAExB,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,OAA4B;QAChD,OAAO,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;YAClC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAc,CAAC;SACjC,CAAC,CAAA;IACJ,CAAC;;AAnDH,wCAoDC;AAvC2B;;;;WAAS,IAAI,kBAAM,CAC3C,MAAM,EACN;QACE,MAAM,EAAE;YACN,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,kBAAQ;YAClB,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnB,8DAA8D;gBAC9D,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,OAAO,sBAAc,CAAA;gBAEhD,OAAO,KAAK;qBACT,GAAG,CAAC,WAAW,CAAC;qBAChB,MAAM,CAAC,cAAc,CAAC;qBACtB,IAAI,EAAqB,CAAA;YAC9B,CAAC;SACF;KACF,EACD,QAAQ,CACT;EAnB+B,CAmB/B;AAsBH,SAAS,WAAW,CAClB,KAAQ;IAER,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CACvB,CAAA;AACpC,CAAC;AAED,SAAS,cAAc,CACrB,KAAiB,EACjB,KAAa,EACb,GAA0B;IAE1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,4EAA4E;QAC5E,8DAA8D;QAC9D,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;QAC9B,wEAAwE;QACxE,2EAA2E;QAC3E,0EAA0E;QAC1E,MAAM;QACN,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
1
|
+
{"version":3,"file":"blob-permission.js","sourceRoot":"","sources":["../../src/scopes/blob-permission.ts"],"names":[],"mappings":";;;AAAA,4CAAmE;AACnE,gDAAyC;AAEzC,8DAA2D;AAC3D,gDAMyB;AAIZ,QAAA,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,CAAU,CAAC,CAAA;AAM7D,MAAa,cAAc;IAGzB,YAA4B,MAAyB;QAAzC;;;;mBAAgB,MAAM;WAAmB;IAAG,CAAC;IAEzD,OAAO,CAAC,OAA4B;QAClC,OAAO,IAAA,0BAAgB,EAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACpD,CAAC;IAED,QAAQ;QACN,OAAO,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC3C,CAAC;IAuBD,MAAM,CAAC,UAAU,CAAC,KAAa;QAC7B,IAAI,CAAC,IAAA,4BAAgB,EAAC,KAAK,EAAE,MAAM,CAAC;YAAE,OAAO,IAAI,CAAA;QACjD,MAAM,MAAM,GAAG,oCAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAA2B;QAC3C,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAClD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAExB,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,OAA4B;QAChD,OAAO,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;YAClC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAc,CAAC;SACjC,CAAC,CAAA;IACJ,CAAC;;AAnDH,wCAoDC;AAvC2B;;;;WAAS,IAAI,kBAAM,CAC3C,MAAM,EACN;QACE,MAAM,EAAE;YACN,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,kBAAQ;YAClB,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;gBACnB,8DAA8D;gBAC9D,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;oBAAE,OAAO,sBAAc,CAAA;gBAEhD,OAAO,KAAK;qBACT,GAAG,CAAC,WAAW,CAAC;qBAChB,MAAM,CAAC,cAAc,CAAC;qBACtB,IAAI,EAAqB,CAAA;YAC9B,CAAC;SACF;KACF,EACD,QAAQ,CACT;EAnB+B,CAmB/B;AAsBH,SAAS,WAAW,CAClB,KAAQ;IAER,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,KAAK,CACvB,CAAA;AACpC,CAAC;AAED,SAAS,cAAc,CACrB,KAAiB,EACjB,KAAa,EACb,GAA0B;IAE1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,4EAA4E;QAC5E,8DAA8D;QAC9D,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC;QAC9B,wEAAwE;QACxE,2EAA2E;QAC3E,0EAA0E;QAC1E,MAAM;QACN,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC","sourcesContent":["import { Accept, isAccept, matchesAnyAccept } from '../lib/mime.js'\nimport { Parser } from '../lib/parser.js'\nimport { ResourcePermission } from '../lib/resource-permission.js'\nimport { ScopeStringSyntax } from '../lib/syntax-string.js'\nimport {\n NeArray,\n NeRoArray,\n ParamValue,\n ScopeSyntax,\n isScopeStringFor,\n} from '../lib/syntax.js'\n\nexport { type Accept }\n\nexport const DEFAULT_ACCEPT = Object.freeze(['*/*'] as const)\n\nexport type BlobPermissionMatch = {\n mime: string\n}\n\nexport class BlobPermission\n implements ResourcePermission<'blob', BlobPermissionMatch>\n{\n constructor(public readonly accept: NeRoArray<Accept>) {}\n\n matches(options: BlobPermissionMatch) {\n return matchesAnyAccept(this.accept, options.mime)\n }\n\n toString() {\n return BlobPermission.parser.format(this)\n }\n\n protected static readonly parser = new Parser(\n 'blob',\n {\n accept: {\n multiple: true,\n required: true,\n validate: isAccept,\n normalize: (value) => {\n // Returns a more concise representation of the accept values.\n if (value.includes('*/*')) return DEFAULT_ACCEPT\n\n return value\n .map(toLowerCase)\n .filter(isNonRedundant)\n .sort() as NeArray<Accept>\n },\n },\n },\n 'accept',\n )\n\n static fromString(scope: string) {\n if (!isScopeStringFor(scope, 'blob')) return null\n const syntax = ScopeStringSyntax.fromString(scope)\n return BlobPermission.fromSyntax(syntax)\n }\n\n static fromSyntax(syntax: ScopeSyntax<'blob'>) {\n const result = BlobPermission.parser.parse(syntax)\n if (!result) return null\n\n return new BlobPermission(result.accept)\n }\n\n static scopeNeededFor(options: BlobPermissionMatch) {\n return BlobPermission.parser.format({\n accept: [options.mime as Accept],\n })\n }\n}\n\nfunction toLowerCase<T extends ParamValue>(\n value: T,\n): T extends string ? string : T {\n return (\n typeof value === 'string' ? value.toLowerCase() : value\n ) as T extends string ? string : T\n}\n\nfunction isNonRedundant(\n value: ParamValue,\n index: number,\n arr: readonly ParamValue[],\n): boolean {\n if (typeof value !== 'string') {\n return true\n }\n if (value.endsWith('/*')) {\n // assuming the array contains unique element, wildcards cannot be redundant\n // with one another ('image/*' is not redundant with 'text/*')\n return true\n }\n const base = value.split('/', 1)[0]\n if (arr.includes(`${base}/*`)) {\n // If another value in the array is a wildcard for the same base, we can\n // skip this one as it is redundant. e.g. if the array contains 'image/png'\n // and 'image/*', we can skip 'image/png' because 'image/*' already covers\n // it.\n return false\n }\n return true\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity-permission.js","sourceRoot":"","sources":["../../src/scopes/identity-permission.ts"],"names":[],"mappings":";;;AAAA,gDAAyC;AAEzC,8DAA2D;AAC3D,gDAAgE;AAChE,4CAAqD;AAExC,QAAA,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAU,CAAC,CAAA;AAO1E,MAAa,kBAAkB;IAG7B,YAA4B,IAAuB;QAAvC;;;;mBAAgB,IAAI;WAAmB;IAAG,CAAC;IAEvD,OAAO,CAAC,OAAgC;QACtC,OAAO,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAA;IACxD,CAAC;IAED,QAAQ;QACN,OAAO,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC/C,CAAC;IAcD,MAAM,CAAC,UAAU,CAAC,KAAa;QAC7B,IAAI,CAAC,IAAA,4BAAgB,EAAC,KAAK,EAAE,UAAU,CAAC;YAAE,OAAO,IAAI,CAAA;QACrD,MAAM,MAAM,GAAG,oCAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,kBAAkB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC9C,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAA+B;QAC/C,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACtD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC5C,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,OAAgC;QACpD,OAAO,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAClD,CAAC;;AAvCH,gDAwCC;AA3B2B;;;;WAAS,IAAI,kBAAM,CAC3C,UAAU,EACV;QACE,IAAI,EAAE;YACJ,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAA,8BAAoB,EAAC,2BAAmB,CAAC;SACpD;KACF,EACD,MAAM,CACP;EAV+B,CAU/B"}
|
|
1
|
+
{"version":3,"file":"identity-permission.js","sourceRoot":"","sources":["../../src/scopes/identity-permission.ts"],"names":[],"mappings":";;;AAAA,gDAAyC;AAEzC,8DAA2D;AAC3D,gDAAgE;AAChE,4CAAqD;AAExC,QAAA,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAU,CAAC,CAAA;AAO1E,MAAa,kBAAkB;IAG7B,YAA4B,IAAuB;QAAvC;;;;mBAAgB,IAAI;WAAmB;IAAG,CAAC;IAEvD,OAAO,CAAC,OAAgC;QACtC,OAAO,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAA;IACxD,CAAC;IAED,QAAQ;QACN,OAAO,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC/C,CAAC;IAcD,MAAM,CAAC,UAAU,CAAC,KAAa;QAC7B,IAAI,CAAC,IAAA,4BAAgB,EAAC,KAAK,EAAE,UAAU,CAAC;YAAE,OAAO,IAAI,CAAA;QACrD,MAAM,MAAM,GAAG,oCAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,kBAAkB,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IAC9C,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAA+B;QAC/C,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACtD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QACxB,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC5C,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,OAAgC;QACpD,OAAO,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAClD,CAAC;;AAvCH,gDAwCC;AA3B2B;;;;WAAS,IAAI,kBAAM,CAC3C,UAAU,EACV;QACE,IAAI,EAAE;YACJ,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAA,8BAAoB,EAAC,2BAAmB,CAAC;SACpD;KACF,EACD,MAAM,CACP;EAV+B,CAU/B","sourcesContent":["import { Parser } from '../lib/parser.js'\nimport { ResourcePermission } from '../lib/resource-permission.js'\nimport { ScopeStringSyntax } from '../lib/syntax-string.js'\nimport { ScopeSyntax, isScopeStringFor } from '../lib/syntax.js'\nimport { knownValuesValidator } from '../lib/util.js'\n\nexport const IDENTITY_ATTRIBUTES = Object.freeze(['handle', '*'] as const)\nexport type IdentityAttribute = (typeof IDENTITY_ATTRIBUTES)[number]\n\nexport type IdentityPermissionMatch = {\n attr: IdentityAttribute\n}\n\nexport class IdentityPermission\n implements ResourcePermission<'identity', IdentityPermissionMatch>\n{\n constructor(public readonly attr: IdentityAttribute) {}\n\n matches(options: IdentityPermissionMatch) {\n return this.attr === '*' || this.attr === options.attr\n }\n\n toString() {\n return IdentityPermission.parser.format(this)\n }\n\n protected static readonly parser = new Parser(\n 'identity',\n {\n attr: {\n multiple: false,\n required: true,\n validate: knownValuesValidator(IDENTITY_ATTRIBUTES),\n },\n },\n 'attr',\n )\n\n static fromString(scope: string) {\n if (!isScopeStringFor(scope, 'identity')) return null\n const syntax = ScopeStringSyntax.fromString(scope)\n return IdentityPermission.fromSyntax(syntax)\n }\n\n static fromSyntax(syntax: ScopeSyntax<'identity'>) {\n const result = IdentityPermission.parser.parse(syntax)\n if (!result) return null\n return new IdentityPermission(result.attr)\n }\n\n static scopeNeededFor(options: IdentityPermissionMatch): string {\n return IdentityPermission.parser.format(options)\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"include-scope.js","sourceRoot":"","sources":["../../src/scopes/include-scope.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"include-scope.js","sourceRoot":"","sources":["../../src/scopes/include-scope.ts"],"names":[],"mappings":"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","sourcesContent":["import { AtprotoAudience, isAtprotoAudience } from '@atproto/did'\nimport { LexPermission, LexPermissionSet } from '../lib/lexicon.js'\nimport { Nsid, isNsid } from '../lib/nsid.js'\nimport { Parser } from '../lib/parser.js'\nimport { LexPermissionSyntax } from '../lib/syntax-lexicon.js'\nimport { ScopeStringSyntax } from '../lib/syntax-string.js'\nimport { ScopeSyntax, isScopeStringFor } from '../lib/syntax.js'\nimport { BlobPermission } from './blob-permission.js'\nimport { RepoPermission } from './repo-permission.js'\nimport { RpcPermission } from './rpc-permission.js'\n\nexport { type LexPermission, type LexPermissionSet, type Nsid, isNsid }\n\n/**\n * This is used to handle \"include:\" oauth scope values, used to include\n * permissions from a lexicon defined permission set. Not being a resource\n * permission, it does not implement `Matchable`.\n */\nexport class IncludeScope {\n constructor(\n public readonly nsid: Nsid,\n public readonly aud: undefined | AtprotoAudience = undefined,\n ) {}\n\n toString() {\n return IncludeScope.parser.format(this)\n }\n\n /**\n * Converts an \"include:\" to the list of permissions it includes, based on the\n * lexicon defined permission set.\n */\n toPermissions(permissionSet: LexPermissionSet) {\n return permissionSet.permissions\n .map(this.parsePermission, this)\n .filter(this.isAllowedPermission, this)\n }\n\n protected parsePermission(permission: LexPermission) {\n if (\n permission.resource === 'rpc' &&\n permission.inheritAud === true &&\n permission.aud === undefined &&\n this.aud !== undefined\n ) {\n // \"rpc\" permissions can \"inherit\" their audience from \"aud\" param defined\n // in the \"include:<nsid>?aud=<audience>\" scope the permission set was\n // loaded from.\n return parsePermission({\n ...permission,\n inheritAud: undefined,\n aud: this.aud,\n })\n }\n\n return parsePermission(permission)\n }\n\n /**\n * Verifies that a permission included through a lexicon permission set is\n * allowed in the context of the `include:` scope. This basically checks that\n * the permission is \"under\" the namespace authority of the `include:` scope,\n * and that it only contains \"repo:\", \"rpc:\", or \"blob:\" permissions.\n */\n protected isAllowedPermission(\n permission: unknown,\n ): permission is RpcPermission | RepoPermission | BlobPermission {\n if (permission instanceof RpcPermission) {\n return permission.lxm.every(this.isParentAuthorityOf, this)\n }\n\n if (permission instanceof RepoPermission) {\n return permission.collection.every(this.isParentAuthorityOf, this)\n }\n\n if (permission instanceof BlobPermission) {\n return true\n }\n\n return false\n }\n\n /**\n * Verifies that a permission item's nsid is under the same authority as the\n * nsid of the lexicon itself (which is the same as the nsid of the `include:`\n * scope).\n */\n public isParentAuthorityOf(otherNsid: '*' | Nsid) {\n if (otherNsid === '*') {\n return false\n }\n\n const lexiconNsid = this.nsid\n\n const groupPrefixEnd = lexiconNsid.lastIndexOf('.')\n\n // There should always be a dot, but since this is a security feature, let's\n // be strict about it.\n if (groupPrefixEnd === -1) {\n throw new TypeError('Dot character (\".\") missing from lexicon NSID')\n }\n\n // Make sure that otherNsid is at least as long as the \"group prefix\"\n if (groupPrefixEnd >= otherNsid.length - 1) {\n return false\n }\n\n // Make sure that the \"otherNsid\" starts with the group of the lexiconNsid,\n // up to the dot itself. We check in reverse order as nsids tend to have\n // long common prefixes.\n for (let i = groupPrefixEnd; i >= 0; i--) {\n if (lexiconNsid.charCodeAt(i) !== otherNsid.charCodeAt(i)) {\n return false\n }\n }\n\n return true\n }\n\n protected static readonly parser = new Parser(\n 'include',\n {\n nsid: {\n multiple: false,\n required: true,\n validate: isNsid,\n },\n aud: {\n multiple: false,\n required: false,\n validate: isAtprotoAudience,\n },\n },\n 'nsid',\n )\n\n static fromString(scope: string) {\n if (!isScopeStringFor(scope, 'include')) return null\n const syntax = ScopeStringSyntax.fromString(scope)\n return IncludeScope.fromSyntax(syntax)\n }\n\n static fromSyntax(syntax: ScopeSyntax<'include'>) {\n const result = IncludeScope.parser.parse(syntax)\n if (!result) return null\n return new IncludeScope(result.nsid, result.aud)\n }\n}\n\nfunction parsePermission(permission: LexPermission) {\n if (isPermissionForResource(permission, 'repo')) {\n return RepoPermission.fromSyntax(new LexPermissionSyntax(permission))\n }\n if (isPermissionForResource(permission, 'rpc')) {\n return RpcPermission.fromSyntax(new LexPermissionSyntax(permission))\n }\n if (isPermissionForResource(permission, 'blob')) {\n return BlobPermission.fromSyntax(new LexPermissionSyntax(permission))\n }\n return null\n}\n\nfunction isPermissionForResource<P extends LexPermission, T extends string>(\n permission: P,\n type: T,\n): permission is P & { resource: T } {\n return permission.resource === type\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repo-permission.js","sourceRoot":"","sources":["../../src/scopes/repo-permission.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"repo-permission.js","sourceRoot":"","sources":["../../src/scopes/repo-permission.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nsid, isNsid } from '../lib/nsid.js'\nimport { Parser } from '../lib/parser.js'\nimport { ResourcePermission } from '../lib/resource-permission.js'\nimport { ScopeStringSyntax } from '../lib/syntax-string.js'\nimport {\n NeArray,\n NeRoArray,\n ScopeSyntax,\n isScopeStringFor,\n} from '../lib/syntax.js'\nimport { knownValuesValidator } from '../lib/util.js'\n\nexport { type Nsid, isNsid }\n\nexport const REPO_ACTIONS = Object.freeze([\n 'create',\n 'update',\n 'delete',\n] as const)\nexport type RepoAction = (typeof REPO_ACTIONS)[number]\nexport const isRepoAction = knownValuesValidator(REPO_ACTIONS)\n\nexport type CollectionParam = '*' | Nsid\nexport const isCollectionParam = (value: unknown): value is CollectionParam =>\n value === '*' || isNsid(value)\n\nexport type RepoPermissionMatch = {\n collection: string\n action: RepoAction\n}\n\nexport class RepoPermission\n implements ResourcePermission<'repo', RepoPermissionMatch>\n{\n constructor(\n public readonly collection: NeRoArray<'*' | Nsid>,\n public readonly action: NeRoArray<RepoAction>,\n ) {}\n\n matches({ action, collection }: RepoPermissionMatch) {\n return (\n this.action.includes(action) &&\n (this.collection.includes('*') ||\n (this.collection as readonly string[]).includes(collection))\n )\n }\n\n toString() {\n return RepoPermission.parser.format(this)\n }\n\n protected static readonly parser = new Parser(\n 'repo',\n {\n collection: {\n multiple: true,\n required: true,\n validate: isCollectionParam,\n normalize: (value) => {\n if (value.length > 1) {\n if (value.includes('*')) return ['*'] as const\n return [...new Set(value)].sort() as NeArray<Nsid>\n }\n return value as ['*' | Nsid]\n },\n },\n action: {\n multiple: true,\n required: false,\n validate: isRepoAction,\n default: REPO_ACTIONS,\n normalize: (value) => {\n return value === REPO_ACTIONS\n ? REPO_ACTIONS // No need to filter if the default was used\n : (REPO_ACTIONS.filter(includedIn, value) as NeArray<RepoAction>)\n },\n },\n },\n 'collection',\n )\n\n static fromString(scope: string): RepoPermission | null {\n if (!isScopeStringFor(scope, 'repo')) return null\n const syntax = ScopeStringSyntax.fromString(scope)\n return RepoPermission.fromSyntax(syntax)\n }\n\n static fromSyntax(syntax: ScopeSyntax<'repo'>): RepoPermission | null {\n const result = RepoPermission.parser.parse(syntax)\n if (!result) return null\n\n return new RepoPermission(result.collection, result.action)\n }\n\n static scopeNeededFor(options: RepoPermissionMatch): string {\n return RepoPermission.parser.format({\n collection: [options.collection as '*' | Nsid],\n action: [options.action],\n })\n }\n}\n\n/**\n * Special utility function to be used as predicate for array methods like\n * `Array.prototype.includes`, etc. When used as predicate, it expects that\n * the array method is called with a `thisArg` that is a readonly array of\n * the same type as the `value` parameter.\n */\nfunction includedIn<T>(this: readonly T[], value: T): boolean {\n return this.includes(value)\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-permission.js","sourceRoot":"","sources":["../../src/scopes/rpc-permission.ts"],"names":[],"mappings":";;;AAAA,sCAAiE;AAOvB,kGAPhB,uBAAiB,OAOgB;AAN3D,4CAA6C;AAMgB,uFAN9C,gBAAM,OAM8C;AALnE,gDAAyC;AAEzC,8DAA2D;AAC3D,gDAA2E;AAKpE,MAAM,UAAU,GAAG,CAAC,KAAc,EAAqB,EAAE,CAC9D,KAAK,KAAK,GAAG,IAAI,IAAA,gBAAM,EAAC,KAAK,CAAC,CAAA;AADnB,QAAA,UAAU,cACS;AAEzB,MAAM,UAAU,GAAG,CAAC,KAAc,EAAqB,EAAE,CAC9D,KAAK,KAAK,GAAG,IAAI,IAAA,uBAAiB,EAAC,KAAK,CAAC,CAAA;AAD9B,QAAA,UAAU,cACoB;AAO3C,MAAa,aAAa;IAGxB,YACkB,GAA0B,EAC1B,GAA0B;QAD1C;;;;mBAAgB,GAAG;WAAuB;QAC1C;;;;mBAAgB,GAAG;WAAuB;IACzC,CAAC;IAEJ,OAAO,CAAC,OAA2B;QACjC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;QACzB,OAAO,CACL,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC;YACpC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAK,GAAyB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CACxE,CAAA;IACH,CAAC;IAED,QAAQ;QACN,OAAO,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1C,CAAC;IAuBD,MAAM,CAAC,UAAU,CAAC,KAAa;QAC7B,IAAI,CAAC,IAAA,4BAAgB,EAAC,KAAK,EAAE,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAChD,MAAM,MAAM,GAAG,oCAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAA0B;QAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAExB,2BAA2B;QAC3B,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QAE/D,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,OAA2B;QAC/C,OAAO,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;YACjC,GAAG,EAAE,OAAO,CAAC,GAAsB;YACnC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAW,CAAC;SAC3B,CAAC,CAAA;IACJ,CAAC;;AA9DH,sCA+DC;AA3C2B;;;;WAAS,IAAI,kBAAM,CAC3C,KAAK,EACL;QACE,GAAG,EAAE;YACH,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,kBAAU;YACpB,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CACnB,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACrC,CAAC,CAAE,CAAC,GAAG,CAAW;gBAClB,CAAC,CAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAwB;SACxD;QACD,GAAG,EAAE;YACH,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,kBAAU;SACrB;KACF,EACD,KAAK,CACN;EAnB+B,CAmB/B"}
|
|
1
|
+
{"version":3,"file":"rpc-permission.js","sourceRoot":"","sources":["../../src/scopes/rpc-permission.ts"],"names":[],"mappings":";;;AAAA,sCAAiE;AAOvB,kGAPhB,uBAAiB,OAOgB;AAN3D,4CAA6C;AAMgB,uFAN9C,gBAAM,OAM8C;AALnE,gDAAyC;AAEzC,8DAA2D;AAC3D,gDAA2E;AAKpE,MAAM,UAAU,GAAG,CAAC,KAAc,EAAqB,EAAE,CAC9D,KAAK,KAAK,GAAG,IAAI,IAAA,gBAAM,EAAC,KAAK,CAAC,CAAA;AADnB,QAAA,UAAU,cACS;AAEzB,MAAM,UAAU,GAAG,CAAC,KAAc,EAAqB,EAAE,CAC9D,KAAK,KAAK,GAAG,IAAI,IAAA,uBAAiB,EAAC,KAAK,CAAC,CAAA;AAD9B,QAAA,UAAU,cACoB;AAO3C,MAAa,aAAa;IAGxB,YACkB,GAA0B,EAC1B,GAA0B;QAD1C;;;;mBAAgB,GAAG;WAAuB;QAC1C;;;;mBAAgB,GAAG;WAAuB;IACzC,CAAC;IAEJ,OAAO,CAAC,OAA2B;QACjC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;QACzB,OAAO,CACL,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC;YACpC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAK,GAAyB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CACxE,CAAA;IACH,CAAC;IAED,QAAQ;QACN,OAAO,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1C,CAAC;IAuBD,MAAM,CAAC,UAAU,CAAC,KAAa;QAC7B,IAAI,CAAC,IAAA,4BAAgB,EAAC,KAAK,EAAE,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAChD,MAAM,MAAM,GAAG,oCAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACzC,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAA0B;QAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QACjD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAExB,2BAA2B;QAC3B,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QAE/D,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAA;IAClD,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,OAA2B;QAC/C,OAAO,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;YACjC,GAAG,EAAE,OAAO,CAAC,GAAsB;YACnC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAW,CAAC;SAC3B,CAAC,CAAA;IACJ,CAAC;;AA9DH,sCA+DC;AA3C2B;;;;WAAS,IAAI,kBAAM,CAC3C,KAAK,EACL;QACE,GAAG,EAAE;YACH,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,kBAAU;YACpB,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CACnB,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACrC,CAAC,CAAE,CAAC,GAAG,CAAW;gBAClB,CAAC,CAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAwB;SACxD;QACD,GAAG,EAAE;YACH,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,kBAAU;SACrB;KACF,EACD,KAAK,CACN;EAnB+B,CAmB/B","sourcesContent":["import { AtprotoAudience, isAtprotoAudience } from '@atproto/did'\nimport { Nsid, isNsid } from '../lib/nsid.js'\nimport { Parser } from '../lib/parser.js'\nimport { ResourcePermission } from '../lib/resource-permission.js'\nimport { ScopeStringSyntax } from '../lib/syntax-string.js'\nimport { NeRoArray, ScopeSyntax, isScopeStringFor } from '../lib/syntax.js'\n\nexport { type AtprotoAudience, type Nsid, isAtprotoAudience, isNsid }\n\nexport type LxmParam = '*' | Nsid\nexport const isLxmParam = (value: unknown): value is LxmParam =>\n value === '*' || isNsid(value)\nexport type AudParam = '*' | AtprotoAudience\nexport const isAudParam = (value: unknown): value is AudParam =>\n value === '*' || isAtprotoAudience(value)\n\nexport type RpcPermissionMatch = {\n lxm: string\n aud: string\n}\n\nexport class RpcPermission\n implements ResourcePermission<'rpc', RpcPermissionMatch>\n{\n constructor(\n public readonly aud: '*' | AtprotoAudience,\n public readonly lxm: NeRoArray<'*' | Nsid>,\n ) {}\n\n matches(options: RpcPermissionMatch) {\n const { aud, lxm } = this\n return (\n (aud === '*' || aud === options.aud) &&\n (lxm.includes('*') || (lxm as readonly string[]).includes(options.lxm))\n )\n }\n\n toString() {\n return RpcPermission.parser.format(this)\n }\n\n protected static readonly parser = new Parser(\n 'rpc',\n {\n lxm: {\n multiple: true,\n required: true,\n validate: isLxmParam,\n normalize: (value) =>\n value.length > 1 && value.includes('*')\n ? (['*'] as const)\n : ([...new Set(value)].sort() as [Nsid, ...Nsid[]]),\n },\n aud: {\n multiple: false,\n required: true,\n validate: isAudParam,\n },\n },\n 'lxm',\n )\n\n static fromString(scope: string): RpcPermission | null {\n if (!isScopeStringFor(scope, 'rpc')) return null\n const syntax = ScopeStringSyntax.fromString(scope)\n return RpcPermission.fromSyntax(syntax)\n }\n\n static fromSyntax(syntax: ScopeSyntax<'rpc'>): RpcPermission | null {\n const result = RpcPermission.parser.parse(syntax)\n if (!result) return null\n\n // rpc:*?aud=* is forbidden\n if (result.aud === '*' && result.lxm.includes('*')) return null\n\n return new RpcPermission(result.aud, result.lxm)\n }\n\n static scopeNeededFor(options: RpcPermissionMatch): string {\n return RpcPermission.parser.format({\n aud: options.aud as AtprotoAudience,\n lxm: [options.lxm as Nsid],\n })\n }\n}\n"]}
|
package/dist/scopes-set.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scopes-set.js","sourceRoot":"","sources":["../src/scopes-set.ts"],"names":[],"mappings":";;;AAAA,qEAA4D;AAmBnD,kGAnBA,0CAAiB,OAmBA;AAlB1B,0EAGuC;AACvC,oEAGoC;AACpC,4EAGwC;AACxC,oEAGoC;AACpC,kEAA8E;AAY9E;;;GAGG;AACH,MAAa,SAAU,SAAQ,GAAW;IACxC;;;OAGG;IACI,OAAO,CACZ,QAAW,EACX,OAA0C;QAE1C,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,sBAAsB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAA;QACnE,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAEM,MAAM,CACX,QAAW,EACX,OAA0C;QAE1C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAC/C,MAAM,IAAI,0CAAiB,CAAC,KAAK,CAAC,CAAA;QACpC,CAAC;IACH,CAAC;IAEM,IAAI,CAAC,EAA8B;QACxC,KAAK,MAAM,KAAK,IAAI,IAAI;YAAE,IAAI,EAAE,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAA;QACpD,OAAO,KAAK,CAAA;IACd,CAAC;IAEM,KAAK,CAAC,EAA8B;QACzC,KAAK,MAAM,KAAK,IAAI,IAAI;YAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAA;QACtD,OAAO,IAAI,CAAA;IACb,CAAC;IAEM,CAAC,MAAM,CAAC,EAA8B;QAC3C,KAAK,MAAM,KAAK,IAAI,IAAI;YAAE,IAAI,EAAE,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAA;IACtD,CAAC;IAEM,CAAC,GAAG,CAAI,EAAwB;QACrC,KAAK,MAAM,KAAK,IAAI,IAAI;YAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAA;IAC3C,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAAe;QAC/B,OAAO,IAAI,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1C,CAAC;CACF;AA9CD,8BA8CC;AAED,SAAS,cAAc,CACrB,QAAW,EACX,OAA0C;IAE1C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,yCAAiB,CAAC,cAAc,CAAC,OAAiC,CAAC,CAAA;QAC5E,KAAK,UAAU;YACb,OAAO,2CAAkB,CAAC,cAAc,CACtC,OAAkC,CACnC,CAAA;QACH,KAAK,MAAM;YACT,OAAO,mCAAc,CAAC,cAAc,CAAC,OAA8B,CAAC,CAAA;QACtE,KAAK,KAAK;YACR,OAAO,iCAAa,CAAC,cAAc,CAAC,OAA6B,CAAC,CAAA;QACpE,KAAK,MAAM;YACT,OAAO,mCAAc,CAAC,cAAc,CAAC,OAA8B,CAAC,CAAA;IACxE,CAAC;IACD,mBAAmB;IACnB,MAAM,IAAI,SAAS,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAA;AACtD,CAAC;AAED,SAAS,sBAAsB,CAC7B,KAAa,EACb,QAAW,EACX,OAA0C;IAE1C,wEAAwE;IACxE,uEAAuE;IACvE,WAAW;IACX,MAAM,UAAU,GAAG,oBAAoB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IACxD,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAA;IAE7B,mBAAmB;IACnB,OAAO,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;AACpC,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAgB,EAAE,KAAa;IAC3D,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,yCAAiB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAC5C,KAAK,UAAU;YACb,OAAO,2CAAkB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QAC7C,KAAK,MAAM;YACT,OAAO,mCAAc,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACzC,KAAK,KAAK;YACR,OAAO,iCAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACxC,KAAK,MAAM;YACT,OAAO,mCAAc,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACzC;YACE,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"scopes-set.js","sourceRoot":"","sources":["../src/scopes-set.ts"],"names":[],"mappings":"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","sourcesContent":["import { ScopeMissingError } from './scope-missing-error.js'\nimport {\n AccountPermission,\n AccountPermissionMatch,\n} from './scopes/account-permission.js'\nimport {\n BlobPermission,\n BlobPermissionMatch,\n} from './scopes/blob-permission.js'\nimport {\n IdentityPermission,\n IdentityPermissionMatch,\n} from './scopes/identity-permission.js'\nimport {\n RepoPermission,\n RepoPermissionMatch,\n} from './scopes/repo-permission.js'\nimport { RpcPermission, RpcPermissionMatch } from './scopes/rpc-permission.js'\n\nexport { ScopeMissingError }\n\nexport type ScopeMatchingOptionsByResource = {\n account: AccountPermissionMatch\n identity: IdentityPermissionMatch\n repo: RepoPermissionMatch\n rpc: RpcPermissionMatch\n blob: BlobPermissionMatch\n}\n\n/**\n * Utility class to manage a set of scopes and check if they match specific\n * options for a given resource.\n */\nexport class ScopesSet extends Set<string> {\n /**\n * Check if the container has a scope that matches the given options for a\n * specific resource.\n */\n public matches<R extends keyof ScopeMatchingOptionsByResource>(\n resource: R,\n options: ScopeMatchingOptionsByResource[R],\n ): boolean {\n for (const scope of this) {\n if (permissionScopeMatches(scope, resource, options)) return true\n }\n return false\n }\n\n public assert<R extends keyof ScopeMatchingOptionsByResource>(\n resource: R,\n options: ScopeMatchingOptionsByResource[R],\n ) {\n if (!this.matches(resource, options)) {\n const scope = scopeNeededFor(resource, options)\n throw new ScopeMissingError(scope)\n }\n }\n\n public some(fn: (scope: string) => boolean): boolean {\n for (const scope of this) if (fn(scope)) return true\n return false\n }\n\n public every(fn: (scope: string) => boolean): boolean {\n for (const scope of this) if (!fn(scope)) return false\n return true\n }\n\n public *filter(fn: (scope: string) => boolean) {\n for (const scope of this) if (fn(scope)) yield scope\n }\n\n public *map<O>(fn: (scope: string) => O) {\n for (const scope of this) yield fn(scope)\n }\n\n static fromString(string?: string): ScopesSet {\n return new ScopesSet(string?.split(' '))\n }\n}\n\nfunction scopeNeededFor<R extends keyof ScopeMatchingOptionsByResource>(\n resource: R,\n options: ScopeMatchingOptionsByResource[R],\n): string {\n switch (resource) {\n case 'account':\n return AccountPermission.scopeNeededFor(options as AccountPermissionMatch)\n case 'identity':\n return IdentityPermission.scopeNeededFor(\n options as IdentityPermissionMatch,\n )\n case 'repo':\n return RepoPermission.scopeNeededFor(options as RepoPermissionMatch)\n case 'rpc':\n return RpcPermission.scopeNeededFor(options as RpcPermissionMatch)\n case 'blob':\n return BlobPermission.scopeNeededFor(options as BlobPermissionMatch)\n }\n // @ts-expect-error\n throw new TypeError(`Unknown resource: ${resource}`)\n}\n\nfunction permissionScopeMatches<R extends keyof ScopeMatchingOptionsByResource>(\n scope: string,\n resource: R,\n options: ScopeMatchingOptionsByResource[R],\n): boolean {\n // @NOTE we might want to cache the parsed scopes though, in practice, a\n // single scope is unlikely to be parsed multiple times during a single\n // request.\n const permission = parsePermissionScope(resource, scope)\n if (!permission) return false\n\n // @ts-expect-error\n return permission.matches(options)\n}\n\nfunction parsePermissionScope(resource: string, scope: string) {\n switch (resource) {\n case 'account':\n return AccountPermission.fromString(scope)\n case 'identity':\n return IdentityPermission.fromString(scope)\n case 'repo':\n return RepoPermission.fromString(scope)\n case 'rpc':\n return RpcPermission.fromString(scope)\n case 'blob':\n return BlobPermission.fromString(scope)\n default:\n return null\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/oauth-scopes",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "A library for manipulating and validating ATproto OAuth scopes in TypeScript.",
|
|
6
6
|
"keywords": [
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
}
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@atproto/did": "^0.2.
|
|
29
|
-
"@atproto/lexicon": "^0.5.
|
|
28
|
+
"@atproto/did": "^0.2.1",
|
|
29
|
+
"@atproto/lexicon": "^0.5.1",
|
|
30
30
|
"@atproto/syntax": "^0.4.1"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ScopeStringFor, isScopeStringFor } from './lib/syntax.js'
|
|
2
|
+
import { isNonNullable } from './lib/util.js'
|
|
2
3
|
import { AccountPermission } from './scopes/account-permission.js'
|
|
3
4
|
import { BlobPermission } from './scopes/blob-permission.js'
|
|
4
5
|
import { IdentityPermission } from './scopes/identity-permission.js'
|
|
@@ -8,11 +9,20 @@ import { RpcPermission } from './scopes/rpc-permission.js'
|
|
|
8
9
|
|
|
9
10
|
export { type ScopeStringFor, isScopeStringFor }
|
|
10
11
|
|
|
12
|
+
export const STATIC_SCOPE_VALUES = Object.freeze([
|
|
13
|
+
'atproto',
|
|
14
|
+
'transition:email',
|
|
15
|
+
'transition:generic',
|
|
16
|
+
'transition:chat.bsky',
|
|
17
|
+
] as const)
|
|
18
|
+
|
|
19
|
+
export type StaticScopeValue = (typeof STATIC_SCOPE_VALUES)[number]
|
|
20
|
+
export function isStaticScopeValue(value: string): value is StaticScopeValue {
|
|
21
|
+
return (STATIC_SCOPE_VALUES as readonly string[]).includes(value)
|
|
22
|
+
}
|
|
23
|
+
|
|
11
24
|
export type AtprotoOauthScope =
|
|
12
|
-
|
|
|
13
|
-
| 'transition:email'
|
|
14
|
-
| 'transition:generic'
|
|
15
|
-
| 'transition:chat.bsky'
|
|
25
|
+
| StaticScopeValue
|
|
16
26
|
| ScopeStringFor<'account'>
|
|
17
27
|
| ScopeStringFor<'blob'>
|
|
18
28
|
| ScopeStringFor<'identity'>
|
|
@@ -29,10 +39,7 @@ export type AtprotoOauthScope =
|
|
|
29
39
|
*/
|
|
30
40
|
export function isAtprotoOauthScope(value: string): value is AtprotoOauthScope {
|
|
31
41
|
return (
|
|
32
|
-
value
|
|
33
|
-
value === 'transition:email' ||
|
|
34
|
-
value === 'transition:generic' ||
|
|
35
|
-
value === 'transition:chat.bsky' ||
|
|
42
|
+
isStaticScopeValue(value) ||
|
|
36
43
|
AccountPermission.fromString(value) != null ||
|
|
37
44
|
BlobPermission.fromString(value) != null ||
|
|
38
45
|
IdentityPermission.fromString(value) != null ||
|
|
@@ -41,3 +48,32 @@ export function isAtprotoOauthScope(value: string): value is AtprotoOauthScope {
|
|
|
41
48
|
RpcPermission.fromString(value) != null
|
|
42
49
|
)
|
|
43
50
|
}
|
|
51
|
+
|
|
52
|
+
export function normalizeAtprotoOauthScope(scope: string) {
|
|
53
|
+
return scope
|
|
54
|
+
.split(' ')
|
|
55
|
+
.map(normalizeAtprotoOauthScopeValue)
|
|
56
|
+
.filter(isNonNullable)
|
|
57
|
+
.sort()
|
|
58
|
+
.join(' ')
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function normalizeAtprotoOauthScopeValue(
|
|
62
|
+
value: string,
|
|
63
|
+
): AtprotoOauthScope | null {
|
|
64
|
+
if (isStaticScopeValue(value)) return value
|
|
65
|
+
|
|
66
|
+
for (const Scope of [
|
|
67
|
+
AccountPermission,
|
|
68
|
+
BlobPermission,
|
|
69
|
+
IdentityPermission,
|
|
70
|
+
IncludeScope,
|
|
71
|
+
RepoPermission,
|
|
72
|
+
RpcPermission,
|
|
73
|
+
]) {
|
|
74
|
+
const parsed = Scope.fromString(value)
|
|
75
|
+
if (parsed) return parsed.toString()
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return null
|
|
79
|
+
}
|
package/src/lib/util.ts
CHANGED
|
@@ -12,3 +12,7 @@ export function knownValuesValidator<T>(values: Iterable<T>) {
|
|
|
12
12
|
const set = new Set<unknown>(values)
|
|
13
13
|
return (value: unknown): value is T => set.has(value)
|
|
14
14
|
}
|
|
15
|
+
|
|
16
|
+
export function isNonNullable<T>(value: T): value is NonNullable<T> {
|
|
17
|
+
return value != null
|
|
18
|
+
}
|