@atproto/oauth-scopes 0.0.2 → 0.2.0

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.
Files changed (169) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/atproto-oauth-scope.d.ts +17 -0
  3. package/dist/atproto-oauth-scope.d.ts.map +1 -0
  4. package/dist/atproto-oauth-scope.js +67 -0
  5. package/dist/atproto-oauth-scope.js.map +1 -0
  6. package/dist/index.d.ts +9 -13
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +9 -13
  9. package/dist/index.js.map +1 -1
  10. package/dist/lib/lexicon.d.ts +2 -0
  11. package/dist/lib/lexicon.d.ts.map +1 -0
  12. package/dist/lib/lexicon.js +3 -0
  13. package/dist/lib/lexicon.js.map +1 -0
  14. package/dist/lib/mime.d.ts +1 -1
  15. package/dist/lib/mime.d.ts.map +1 -1
  16. package/dist/lib/mime.js +2 -0
  17. package/dist/lib/mime.js.map +1 -1
  18. package/dist/lib/nsid.d.ts +2 -2
  19. package/dist/lib/nsid.d.ts.map +1 -1
  20. package/dist/lib/nsid.js +4 -6
  21. package/dist/lib/nsid.js.map +1 -1
  22. package/dist/lib/parser.d.ts +29 -0
  23. package/dist/lib/parser.d.ts.map +1 -0
  24. package/dist/lib/parser.js +152 -0
  25. package/dist/lib/parser.js.map +1 -0
  26. package/dist/lib/resource-permission.d.ts +10 -0
  27. package/dist/lib/resource-permission.d.ts.map +1 -0
  28. package/dist/lib/resource-permission.js +3 -0
  29. package/dist/lib/resource-permission.js.map +1 -0
  30. package/dist/lib/syntax-lexicon.d.ts +26 -0
  31. package/dist/lib/syntax-lexicon.d.ts.map +1 -0
  32. package/dist/lib/syntax-lexicon.js +58 -0
  33. package/dist/lib/syntax-lexicon.js.map +1 -0
  34. package/dist/lib/syntax-string.d.ts +16 -0
  35. package/dist/lib/syntax-string.d.ts.map +1 -0
  36. package/dist/lib/syntax-string.js +121 -0
  37. package/dist/lib/syntax-string.js.map +1 -0
  38. package/dist/lib/syntax.d.ts +23 -0
  39. package/dist/lib/syntax.d.ts.map +1 -0
  40. package/dist/lib/syntax.js +22 -0
  41. package/dist/lib/syntax.js.map +1 -0
  42. package/dist/lib/util.d.ts +5 -1
  43. package/dist/lib/util.d.ts.map +1 -1
  44. package/dist/lib/util.js +8 -12
  45. package/dist/lib/util.js.map +1 -1
  46. package/dist/scope-permissions-transition.d.ts +15 -0
  47. package/dist/scope-permissions-transition.d.ts.map +1 -0
  48. package/dist/{permission-set-transition.js → scope-permissions-transition.js} +5 -5
  49. package/dist/scope-permissions-transition.js.map +1 -0
  50. package/dist/scope-permissions.d.ts +22 -0
  51. package/dist/scope-permissions.d.ts.map +1 -0
  52. package/dist/{permission-set.js → scope-permissions.js} +20 -16
  53. package/dist/scope-permissions.js.map +1 -0
  54. package/dist/scopes/account-permission.d.ts +35 -0
  55. package/dist/scopes/account-permission.d.ts.map +1 -0
  56. package/dist/scopes/account-permission.js +71 -0
  57. package/dist/scopes/account-permission.js.map +1 -0
  58. package/dist/scopes/blob-permission.d.ts +27 -0
  59. package/dist/scopes/blob-permission.d.ts.map +1 -0
  60. package/dist/scopes/blob-permission.js +86 -0
  61. package/dist/scopes/blob-permission.js.map +1 -0
  62. package/dist/scopes/identity-permission.d.ts +25 -0
  63. package/dist/scopes/identity-permission.d.ts.map +1 -0
  64. package/dist/scopes/identity-permission.js +53 -0
  65. package/dist/scopes/identity-permission.js.map +1 -0
  66. package/dist/scopes/include-scope.d.ts +54 -0
  67. package/dist/scopes/include-scope.d.ts.map +1 -0
  68. package/dist/scopes/include-scope.js +156 -0
  69. package/dist/scopes/include-scope.js.map +1 -0
  70. package/dist/scopes/repo-permission.d.ts +40 -0
  71. package/dist/scopes/repo-permission.d.ts.map +1 -0
  72. package/dist/scopes/repo-permission.js +101 -0
  73. package/dist/scopes/repo-permission.js.map +1 -0
  74. package/dist/scopes/rpc-permission.d.ts +38 -0
  75. package/dist/scopes/rpc-permission.d.ts.map +1 -0
  76. package/dist/scopes/rpc-permission.js +81 -0
  77. package/dist/scopes/rpc-permission.js.map +1 -0
  78. package/dist/scopes-set.d.ts +12 -1
  79. package/dist/scopes-set.d.ts.map +1 -1
  80. package/dist/scopes-set.js +49 -3
  81. package/dist/scopes-set.js.map +1 -1
  82. package/package.json +7 -3
  83. package/src/atproto-oauth-scope.ts +79 -0
  84. package/src/index.ts +10 -14
  85. package/src/lib/lexicon.ts +1 -0
  86. package/src/lib/mime.ts +2 -1
  87. package/src/lib/nsid.ts +5 -6
  88. package/src/lib/parser.ts +176 -0
  89. package/src/lib/resource-permission.ts +10 -0
  90. package/src/lib/syntax-lexicon.ts +55 -0
  91. package/src/lib/syntax-string.test.ts +130 -0
  92. package/src/lib/syntax-string.ts +132 -0
  93. package/src/lib/syntax.test.ts +43 -0
  94. package/src/lib/syntax.ts +47 -0
  95. package/src/lib/util.ts +11 -12
  96. package/src/{permission-set-transition.test.ts → scope-permissions-transition.test.ts} +33 -20
  97. package/src/{permission-set-transition.ts → scope-permissions-transition.ts} +11 -11
  98. package/src/{permission-set.test.ts → scope-permissions.test.ts} +77 -35
  99. package/src/scope-permissions.ts +91 -0
  100. package/src/{resources/account-scope.test.ts → scopes/account-permission.test.ts} +45 -33
  101. package/src/scopes/account-permission.ts +75 -0
  102. package/src/{resources/blob-scope.test.ts → scopes/blob-permission.test.ts} +31 -23
  103. package/src/scopes/blob-permission.ts +105 -0
  104. package/src/{resources/identity-scope.test.ts → scopes/identity-permission.test.ts} +13 -13
  105. package/src/scopes/identity-permission.ts +54 -0
  106. package/src/scopes/include-scope.test.ts +626 -0
  107. package/src/scopes/include-scope.ts +168 -0
  108. package/src/{resources/repo-scope.test.ts → scopes/repo-permission.test.ts} +77 -65
  109. package/src/scopes/repo-permission.ts +111 -0
  110. package/src/scopes/rpc-permission.test.ts +323 -0
  111. package/src/scopes/rpc-permission.ts +85 -0
  112. package/src/scopes-set.test.ts +5 -5
  113. package/src/scopes-set.ts +79 -5
  114. package/tsconfig.build.tsbuildinfo +1 -1
  115. package/tsconfig.tests.tsbuildinfo +1 -1
  116. package/dist/lib/did.d.ts +0 -3
  117. package/dist/lib/did.d.ts.map +0 -1
  118. package/dist/lib/did.js +0 -6
  119. package/dist/lib/did.js.map +0 -1
  120. package/dist/parser.d.ts +0 -31
  121. package/dist/parser.d.ts.map +0 -1
  122. package/dist/parser.js +0 -118
  123. package/dist/parser.js.map +0 -1
  124. package/dist/permission-set-transition.d.ts +0 -15
  125. package/dist/permission-set-transition.d.ts.map +0 -1
  126. package/dist/permission-set-transition.js.map +0 -1
  127. package/dist/permission-set.d.ts +0 -22
  128. package/dist/permission-set.d.ts.map +0 -1
  129. package/dist/permission-set.js.map +0 -1
  130. package/dist/resources/account-scope.d.ts +0 -35
  131. package/dist/resources/account-scope.d.ts.map +0 -1
  132. package/dist/resources/account-scope.js +0 -60
  133. package/dist/resources/account-scope.js.map +0 -1
  134. package/dist/resources/blob-scope.d.ts +0 -25
  135. package/dist/resources/blob-scope.d.ts.map +0 -1
  136. package/dist/resources/blob-scope.js +0 -74
  137. package/dist/resources/blob-scope.js.map +0 -1
  138. package/dist/resources/identity-scope.d.ts +0 -25
  139. package/dist/resources/identity-scope.d.ts.map +0 -1
  140. package/dist/resources/identity-scope.js +0 -46
  141. package/dist/resources/identity-scope.js.map +0 -1
  142. package/dist/resources/repo-scope.d.ts +0 -37
  143. package/dist/resources/repo-scope.d.ts.map +0 -1
  144. package/dist/resources/repo-scope.js +0 -92
  145. package/dist/resources/repo-scope.js.map +0 -1
  146. package/dist/resources/rpc-scope.d.ts +0 -31
  147. package/dist/resources/rpc-scope.d.ts.map +0 -1
  148. package/dist/resources/rpc-scope.js +0 -74
  149. package/dist/resources/rpc-scope.js.map +0 -1
  150. package/dist/syntax.d.ts +0 -76
  151. package/dist/syntax.d.ts.map +0 -1
  152. package/dist/syntax.js +0 -249
  153. package/dist/syntax.js.map +0 -1
  154. package/dist/utilities.d.ts +0 -17
  155. package/dist/utilities.d.ts.map +0 -1
  156. package/dist/utilities.js +0 -108
  157. package/dist/utilities.js.map +0 -1
  158. package/src/lib/did.ts +0 -3
  159. package/src/parser.ts +0 -150
  160. package/src/permission-set.ts +0 -78
  161. package/src/resources/account-scope.ts +0 -66
  162. package/src/resources/blob-scope.ts +0 -86
  163. package/src/resources/identity-scope.ts +0 -49
  164. package/src/resources/repo-scope.ts +0 -101
  165. package/src/resources/rpc-scope.test.ts +0 -280
  166. package/src/resources/rpc-scope.ts +0 -77
  167. package/src/syntax.test.ts +0 -203
  168. package/src/syntax.ts +0 -325
  169. package/src/utilities.ts +0 -109
@@ -0,0 +1,16 @@
1
+ import { ScopeStringFor, ScopeSyntax } from './syntax.js';
2
+ /**
3
+ * Translates a scope string into a {@link ScopeSyntax}.
4
+ */
5
+ export declare class ScopeStringSyntax<P extends string> implements ScopeSyntax<P> {
6
+ readonly prefix: P;
7
+ readonly positional?: string | undefined;
8
+ readonly params?: Readonly<URLSearchParams> | undefined;
9
+ constructor(prefix: P, positional?: string | undefined, params?: Readonly<URLSearchParams> | undefined);
10
+ keys(): Generator<string, void, unknown>;
11
+ getSingle(key: string): string | null | undefined;
12
+ getMulti(key: string): string[] | undefined;
13
+ toString(): ScopeStringFor<P>;
14
+ static fromString<P extends string>(scopeValue: ScopeStringFor<P>): ScopeStringSyntax<P>;
15
+ }
16
+ //# sourceMappingURL=syntax-string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax-string.d.ts","sourceRoot":"","sources":["../../src/lib/syntax-string.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGzD;;GAEG;AACH,qBAAa,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAE,YAAW,WAAW,CAAC,CAAC,CAAC;IAEtE,QAAQ,CAAC,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;gBAFlC,MAAM,EAAE,CAAC,EACT,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,MAAM,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC,YAAA;IAG5C,IAAI;IAIL,SAAS,CAAC,GAAG,EAAE,MAAM;IAOrB,QAAQ,CAAC,GAAG,EAAE,MAAM;IAKpB,QAAQ,IAWU,cAAc,CAAC,CAAC,CAAC;IAGnC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,MAAM,EAChC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,GAC5B,iBAAiB,CAAC,CAAC,CAAC;CA8BxB"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScopeStringSyntax = void 0;
4
+ const util_js_1 = require("./util.js");
5
+ /**
6
+ * Translates a scope string into a {@link ScopeSyntax}.
7
+ */
8
+ class ScopeStringSyntax {
9
+ constructor(prefix, positional, params) {
10
+ Object.defineProperty(this, "prefix", {
11
+ enumerable: true,
12
+ configurable: true,
13
+ writable: true,
14
+ value: prefix
15
+ });
16
+ Object.defineProperty(this, "positional", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: positional
21
+ });
22
+ Object.defineProperty(this, "params", {
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true,
26
+ value: params
27
+ });
28
+ }
29
+ *keys() {
30
+ if (this.params)
31
+ yield* this.params.keys();
32
+ }
33
+ getSingle(key) {
34
+ if (!this.params?.has(key))
35
+ return undefined;
36
+ const value = this.params.getAll(key);
37
+ if (value.length > 1)
38
+ return null;
39
+ return value[0];
40
+ }
41
+ getMulti(key) {
42
+ if (!this.params?.has(key))
43
+ return undefined;
44
+ return this.params.getAll(key);
45
+ }
46
+ toString() {
47
+ let scope = this.prefix;
48
+ if (this.positional !== undefined) {
49
+ scope += `:${normalizeURIComponent(encodeURIComponent(this.positional))}`;
50
+ }
51
+ if (this.params?.size) {
52
+ scope += `?${normalizeURIComponent(this.params.toString())}`;
53
+ }
54
+ return scope;
55
+ }
56
+ static fromString(scopeValue) {
57
+ const paramIdx = scopeValue.indexOf('?');
58
+ const colonIdx = scopeValue.indexOf(':');
59
+ const prefixEnd = (0, util_js_1.minIdx)(paramIdx, colonIdx);
60
+ // No param or positional
61
+ if (prefixEnd === -1) {
62
+ return new ScopeStringSyntax(scopeValue);
63
+ }
64
+ const prefix = scopeValue.slice(0, prefixEnd);
65
+ // Parse the positional parameter if present
66
+ const positional = colonIdx !== -1
67
+ ? paramIdx === -1
68
+ ? decodeURIComponent(scopeValue.slice(colonIdx + 1))
69
+ : colonIdx < paramIdx
70
+ ? decodeURIComponent(scopeValue.slice(colonIdx + 1, paramIdx))
71
+ : undefined
72
+ : undefined;
73
+ // Parse the query string if present and non empty
74
+ const params = paramIdx !== -1 && paramIdx < scopeValue.length - 1
75
+ ? new URLSearchParams(scopeValue.slice(paramIdx + 1))
76
+ : undefined;
77
+ return new ScopeStringSyntax(prefix, positional, params);
78
+ }
79
+ }
80
+ exports.ScopeStringSyntax = ScopeStringSyntax;
81
+ /**
82
+ * Set of characters that are allowed in scope components without encoding. This
83
+ * is used to normalize scope components.
84
+ */
85
+ const ALLOWED_SCOPE_CHARS = new Set(
86
+ // @NOTE This list must not contain "?" or "&" as it would interfere with
87
+ // query string parsing.
88
+ [':', '/', '+', ',', '@', '%']);
89
+ const NORMALIZABLE_CHARS_MAP = new Map(Array.from(ALLOWED_SCOPE_CHARS, (c) => [encodeURIComponent(c), c]).filter(([encoded, c]) =>
90
+ // Make sure that any char added to ALLOWED_SCOPE_CHARS that is a char
91
+ // that indeed needs encoding. Also, the normalizeURIComponent only
92
+ // supports three-character percent-encoded sequences.
93
+ encoded !== c && encoded.length === 3 && encoded.startsWith('%')));
94
+ /**
95
+ * Assumes a properly url-encoded string.
96
+ */
97
+ function normalizeURIComponent(value) {
98
+ // No need to read the last two characters since percent encoded characters
99
+ // are always three characters long.
100
+ let end = value.length - 2;
101
+ for (let i = 0; i < end; i++) {
102
+ // Check if the character is a percent-encoded character
103
+ if (value.charCodeAt(i) === 0x25 /* % */) {
104
+ // Read the next encoded char. Current version only supports
105
+ // three-character percent-encoded sequences.
106
+ const encodedChar = value.slice(i, i + 3);
107
+ // Check if the encoded character is in the normalization map
108
+ const normalizedChar = NORMALIZABLE_CHARS_MAP.get(encodedChar);
109
+ if (normalizedChar) {
110
+ // Replace the encoded character with its normalized version
111
+ value = `${value.slice(0, i)}${normalizedChar}${value.slice(i + encodedChar.length)}`;
112
+ // Adjust index to account for the length change
113
+ i += normalizedChar.length - 1;
114
+ // Adjust end index since we replaced encoded char with normalized char
115
+ end -= encodedChar.length - normalizedChar.length;
116
+ }
117
+ }
118
+ }
119
+ return value;
120
+ }
121
+ //# sourceMappingURL=syntax-string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax-string.js","sourceRoot":"","sources":["../../src/lib/syntax-string.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export type ParamValue = string | number | boolean;
2
+ export type NeArray<T> = [T, ...T[]];
3
+ /**
4
+ * Non-empty readonly array
5
+ */
6
+ export type NeRoArray<T> = readonly [T, ...T[]];
7
+ export type ScopeStringFor<P extends string> = P | `${P}:${string}` | `${P}?${string}`;
8
+ /**
9
+ * Allows to quickly check if a scope is for a specific resource.
10
+ */
11
+ export declare function isScopeStringFor<P extends string>(value: string, prefix: P): value is ScopeStringFor<P>;
12
+ /**
13
+ * Abstract interface that allows parsing various syntaxes into permission
14
+ * representations.
15
+ */
16
+ export interface ScopeSyntax<P extends string> {
17
+ readonly prefix: P;
18
+ readonly positional?: ParamValue;
19
+ keys(): Iterable<string, void, unknown>;
20
+ getSingle(key: string): ParamValue | null | undefined;
21
+ getMulti(key: string): ParamValue[] | null | undefined;
22
+ }
23
+ //# sourceMappingURL=syntax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syntax.d.ts","sourceRoot":"","sources":["../../src/lib/syntax.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAElD,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;AAEpC;;GAEG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;AAE/C,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,IACvC,CAAC,GACD,GAAG,CAAC,IAAI,MAAM,EAAE,GAChB,GAAG,CAAC,IAAI,MAAM,EAAE,CAAA;AAEpB;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAC/C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,GACR,KAAK,IAAI,cAAc,CAAC,CAAC,CAAC,CAc5B;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM;IAC3C,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IAClB,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAA;IAChC,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACvC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,GAAG,SAAS,CAAA;IACrD,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,EAAE,GAAG,IAAI,GAAG,SAAS,CAAA;CACvD"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isScopeStringFor = isScopeStringFor;
4
+ /**
5
+ * Allows to quickly check if a scope is for a specific resource.
6
+ */
7
+ function isScopeStringFor(value, prefix) {
8
+ if (value.length > prefix.length) {
9
+ // First, check the next char is either : or ?
10
+ const nextChar = value.charCodeAt(prefix.length);
11
+ if (nextChar !== 0x3a /* : */ && nextChar !== 0x3f /* ? */) {
12
+ return false;
13
+ }
14
+ // Then check the full prefix
15
+ return value.startsWith(prefix);
16
+ }
17
+ else {
18
+ // value and prefix must be equal
19
+ return value === prefix;
20
+ }
21
+ }
22
+ //# sourceMappingURL=syntax.js.map
@@ -0,0 +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,3 +1,7 @@
1
+ export interface Matchable<T> {
2
+ matches(options: T): boolean;
3
+ }
1
4
  export declare function minIdx(a: number, b: number): number;
2
- export declare function toRecord(iterable: Iterable<[key: string, value: string]>): Record<string, [string, ...string[]]>;
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>;
3
7
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../src/lib/util.ts"],"names":[],"mappings":"AAAA,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAInD;AAED,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,QAAQ,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,GAC/C,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAUvC"}
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
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.minIdx = minIdx;
4
- exports.toRecord = toRecord;
4
+ exports.knownValuesValidator = knownValuesValidator;
5
+ exports.isNonNullable = isNonNullable;
5
6
  function minIdx(a, b) {
6
7
  if (a === -1)
7
8
  return b;
@@ -9,16 +10,11 @@ function minIdx(a, b) {
9
10
  return a;
10
11
  return Math.min(a, b);
11
12
  }
12
- function toRecord(iterable) {
13
- const record = Object.create(null);
14
- for (const [key, value] of iterable) {
15
- if (Object.hasOwn(record, key)) {
16
- record[key].push(value);
17
- }
18
- else {
19
- record[key] = [value];
20
- }
21
- }
22
- return record;
13
+ function knownValuesValidator(values) {
14
+ const set = new Set(values);
15
+ return (value) => set.has(value);
16
+ }
17
+ function isNonNullable(value) {
18
+ return value != null;
23
19
  }
24
20
  //# sourceMappingURL=util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/lib/util.ts"],"names":[],"mappings":";;AAAA,wBAIC;AAED,4BAYC;AAlBD,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,QAAQ,CACtB,QAAgD;IAEhD,MAAM,MAAM,GAA0C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACzE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;QACpC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC1B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
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"}
@@ -0,0 +1,15 @@
1
+ import { AccountPermissionMatch, BlobPermissionMatch, RepoPermissionMatch, RpcPermissionMatch, ScopePermissions } from './scope-permissions.js';
2
+ /**
3
+ * Overrides the default permission set to allow transitional scopes to be used
4
+ * in place of the generic scopes.
5
+ */
6
+ export declare class ScopePermissionsTransition extends ScopePermissions {
7
+ get hasTransitionGeneric(): boolean;
8
+ get hasTransitionEmail(): boolean;
9
+ get hasTransitionChatBsky(): boolean;
10
+ allowsAccount(options: AccountPermissionMatch): boolean;
11
+ allowsBlob(options: BlobPermissionMatch): boolean;
12
+ allowsRepo(options: RepoPermissionMatch): boolean;
13
+ allowsRpc(options: RpcPermissionMatch): boolean;
14
+ }
15
+ //# sourceMappingURL=scope-permissions-transition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-permissions-transition.d.ts","sourceRoot":"","sources":["../src/scope-permissions-transition.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,wBAAwB,CAAA;AAE/B;;;GAGG;AACH,qBAAa,0BAA2B,SAAQ,gBAAgB;IAC9D,IAAI,oBAAoB,IAAI,OAAO,CAElC;IAED,IAAI,kBAAkB,IAAI,OAAO,CAEhC;IAED,IAAI,qBAAqB,IAAI,OAAO,CAEnC;IAEQ,aAAa,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO;IAYvD,UAAU,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO;IAQjD,UAAU,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO;IAQjD,SAAS,CAAC,OAAO,EAAE,kBAAkB;CAiB/C"}
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PermissionSetTransition = void 0;
4
- const permission_set_js_1 = require("./permission-set.js");
3
+ exports.ScopePermissionsTransition = void 0;
4
+ const scope_permissions_js_1 = require("./scope-permissions.js");
5
5
  /**
6
6
  * Overrides the default permission set to allow transitional scopes to be used
7
7
  * in place of the generic scopes.
8
8
  */
9
- class PermissionSetTransition extends permission_set_js_1.PermissionSet {
9
+ class ScopePermissionsTransition extends scope_permissions_js_1.ScopePermissions {
10
10
  get hasTransitionGeneric() {
11
11
  return this.scopes.has('transition:generic');
12
12
  }
@@ -50,5 +50,5 @@ class PermissionSetTransition extends permission_set_js_1.PermissionSet {
50
50
  return super.allowsRpc(options);
51
51
  }
52
52
  }
53
- exports.PermissionSetTransition = PermissionSetTransition;
54
- //# sourceMappingURL=permission-set-transition.js.map
53
+ exports.ScopePermissionsTransition = ScopePermissionsTransition;
54
+ //# sourceMappingURL=scope-permissions-transition.js.map
@@ -0,0 +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"}
@@ -0,0 +1,22 @@
1
+ import { AccountPermissionMatch } from './scopes/account-permission.js';
2
+ import { BlobPermissionMatch } from './scopes/blob-permission.js';
3
+ import { IdentityPermissionMatch } from './scopes/identity-permission.js';
4
+ import { RepoPermissionMatch } from './scopes/repo-permission.js';
5
+ import { RpcPermissionMatch } from './scopes/rpc-permission.js';
6
+ import { ScopesSet } from './scopes-set.js';
7
+ export type { AccountPermissionMatch, BlobPermissionMatch, IdentityPermissionMatch, RepoPermissionMatch, RpcPermissionMatch, };
8
+ export declare class ScopePermissions {
9
+ readonly scopes: ScopesSet;
10
+ constructor(scope?: null | string | Iterable<string>);
11
+ allowsAccount(options: AccountPermissionMatch): boolean;
12
+ assertAccount(options: AccountPermissionMatch): void;
13
+ allowsIdentity(options: IdentityPermissionMatch): boolean;
14
+ assertIdentity(options: IdentityPermissionMatch): void;
15
+ allowsBlob(options: BlobPermissionMatch): boolean;
16
+ assertBlob(options: BlobPermissionMatch): void;
17
+ allowsRepo(options: RepoPermissionMatch): boolean;
18
+ assertRepo(options: RepoPermissionMatch): void;
19
+ allowsRpc(options: RpcPermissionMatch): boolean;
20
+ assertRpc(options: RpcPermissionMatch): void;
21
+ }
22
+ //# sourceMappingURL=scope-permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope-permissions.d.ts","sourceRoot":"","sources":["../src/scope-permissions.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,sBAAsB,EACvB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAEL,mBAAmB,EACpB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAEL,uBAAuB,EACxB,MAAM,iCAAiC,CAAA;AACxC,OAAO,EAEL,mBAAmB,EACpB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAiB,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,YAAY,EACV,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,GACnB,CAAA;AAED,qBAAa,gBAAgB;IAC3B,SAAgB,MAAM,EAAE,SAAS,CAAA;gBAErB,KAAK,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAU7C,aAAa,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO;IAGvD,aAAa,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI;IAOpD,cAAc,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO;IAGzD,cAAc,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAOtD,UAAU,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO;IAGjD,UAAU,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAO9C,UAAU,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO;IAGjD,UAAU,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAO9C,SAAS,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO;IAG/C,SAAS,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;CAMpD"}
@@ -1,29 +1,33 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PermissionSet = void 0;
4
- const account_scope_js_1 = require("./resources/account-scope.js");
5
- const blob_scope_js_1 = require("./resources/blob-scope.js");
6
- const identity_scope_js_1 = require("./resources/identity-scope.js");
7
- const repo_scope_js_1 = require("./resources/repo-scope.js");
8
- const rpc_scope_js_1 = require("./resources/rpc-scope.js");
3
+ exports.ScopePermissions = void 0;
9
4
  const scope_missing_error_js_1 = require("./scope-missing-error.js");
5
+ const account_permission_js_1 = require("./scopes/account-permission.js");
6
+ const blob_permission_js_1 = require("./scopes/blob-permission.js");
7
+ const identity_permission_js_1 = require("./scopes/identity-permission.js");
8
+ const repo_permission_js_1 = require("./scopes/repo-permission.js");
9
+ const rpc_permission_js_1 = require("./scopes/rpc-permission.js");
10
10
  const scopes_set_js_1 = require("./scopes-set.js");
11
- class PermissionSet {
12
- constructor(scopes) {
11
+ class ScopePermissions {
12
+ constructor(scope) {
13
13
  Object.defineProperty(this, "scopes", {
14
14
  enumerable: true,
15
15
  configurable: true,
16
16
  writable: true,
17
17
  value: void 0
18
18
  });
19
- this.scopes = new scopes_set_js_1.ScopesSet(typeof scopes === 'string' ? scopes.split(' ') : scopes);
19
+ this.scopes = new scopes_set_js_1.ScopesSet(!scope // "" | null | undefined
20
+ ? undefined
21
+ : typeof scope === 'string'
22
+ ? scope.split(' ')
23
+ : scope);
20
24
  }
21
25
  allowsAccount(options) {
22
26
  return this.scopes.matches('account', options);
23
27
  }
24
28
  assertAccount(options) {
25
29
  if (!this.allowsAccount(options)) {
26
- const scope = account_scope_js_1.AccountScope.scopeNeededFor(options);
30
+ const scope = account_permission_js_1.AccountPermission.scopeNeededFor(options);
27
31
  throw new scope_missing_error_js_1.ScopeMissingError(scope);
28
32
  }
29
33
  }
@@ -32,7 +36,7 @@ class PermissionSet {
32
36
  }
33
37
  assertIdentity(options) {
34
38
  if (!this.allowsIdentity(options)) {
35
- const scope = identity_scope_js_1.IdentityScope.scopeNeededFor(options);
39
+ const scope = identity_permission_js_1.IdentityPermission.scopeNeededFor(options);
36
40
  throw new scope_missing_error_js_1.ScopeMissingError(scope);
37
41
  }
38
42
  }
@@ -41,7 +45,7 @@ class PermissionSet {
41
45
  }
42
46
  assertBlob(options) {
43
47
  if (!this.allowsBlob(options)) {
44
- const scope = blob_scope_js_1.BlobScope.scopeNeededFor(options);
48
+ const scope = blob_permission_js_1.BlobPermission.scopeNeededFor(options);
45
49
  throw new scope_missing_error_js_1.ScopeMissingError(scope);
46
50
  }
47
51
  }
@@ -50,7 +54,7 @@ class PermissionSet {
50
54
  }
51
55
  assertRepo(options) {
52
56
  if (!this.allowsRepo(options)) {
53
- const scope = repo_scope_js_1.RepoScope.scopeNeededFor(options);
57
+ const scope = repo_permission_js_1.RepoPermission.scopeNeededFor(options);
54
58
  throw new scope_missing_error_js_1.ScopeMissingError(scope);
55
59
  }
56
60
  }
@@ -59,10 +63,10 @@ class PermissionSet {
59
63
  }
60
64
  assertRpc(options) {
61
65
  if (!this.allowsRpc(options)) {
62
- const scope = rpc_scope_js_1.RpcScope.scopeNeededFor(options);
66
+ const scope = rpc_permission_js_1.RpcPermission.scopeNeededFor(options);
63
67
  throw new scope_missing_error_js_1.ScopeMissingError(scope);
64
68
  }
65
69
  }
66
70
  }
67
- exports.PermissionSet = PermissionSet;
68
- //# sourceMappingURL=permission-set.js.map
71
+ exports.ScopePermissions = ScopePermissions;
72
+ //# sourceMappingURL=scope-permissions.js.map
@@ -0,0 +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"}
@@ -0,0 +1,35 @@
1
+ import { Parser } from '../lib/parser.js';
2
+ import { ResourcePermission } from '../lib/resource-permission.js';
3
+ import { ScopeSyntax } from '../lib/syntax.js';
4
+ export declare const ACCOUNT_ATTRIBUTES: readonly ["email", "repo", "status"];
5
+ export type AccountAttribute = (typeof ACCOUNT_ATTRIBUTES)[number];
6
+ export declare const ACCOUNT_ACTIONS: readonly ["read", "manage"];
7
+ export type AccountAction = (typeof ACCOUNT_ACTIONS)[number];
8
+ export type AccountPermissionMatch = {
9
+ attr: AccountAttribute;
10
+ action: AccountAction;
11
+ };
12
+ export declare class AccountPermission implements ResourcePermission<'account', AccountPermissionMatch> {
13
+ readonly attr: AccountAttribute;
14
+ readonly action: AccountAction;
15
+ constructor(attr: AccountAttribute, action: AccountAction);
16
+ matches(options: AccountPermissionMatch): boolean;
17
+ toString(): import("../lib/syntax.js").ScopeStringFor<"account">;
18
+ protected static readonly parser: Parser<"account", {
19
+ attr: {
20
+ multiple: false;
21
+ required: true;
22
+ validate: (value: unknown) => value is "email" | "repo" | "status";
23
+ };
24
+ action: {
25
+ multiple: false;
26
+ required: false;
27
+ validate: (value: unknown) => value is "read" | "manage";
28
+ default: "read";
29
+ };
30
+ }>;
31
+ static fromString(scope: string): AccountPermission | null;
32
+ static fromSyntax(syntax: ScopeSyntax<'account'>): AccountPermission | null;
33
+ static scopeNeededFor(options: AccountPermissionMatch): import("../lib/syntax.js").ScopeStringFor<"account">;
34
+ }
35
+ //# sourceMappingURL=account-permission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-permission.d.ts","sourceRoot":"","sources":["../../src/scopes/account-permission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAElE,OAAO,EAAE,WAAW,EAAoB,MAAM,kBAAkB,CAAA;AAGhE,eAAO,MAAM,kBAAkB,sCAIpB,CAAA;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAA;AAElE,eAAO,MAAM,eAAe,6BAA6C,CAAA;AACzE,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAE5D,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,gBAAgB,CAAA;IACtB,MAAM,EAAE,aAAa,CAAA;CACtB,CAAA;AAED,qBAAa,iBACX,YAAW,kBAAkB,CAAC,SAAS,EAAE,sBAAsB,CAAC;aAG9C,IAAI,EAAE,gBAAgB;aACtB,MAAM,EAAE,aAAa;gBADrB,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,aAAa;IAGvC,OAAO,CAAC,OAAO,EAAE,sBAAsB;IAOvC,QAAQ;IAIR,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM;;;;;;;;;;;;OAgB/B;IAED,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM;IAM/B,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,CAAC;IAOhD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,sBAAsB;CAGtD"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AccountPermission = exports.ACCOUNT_ACTIONS = exports.ACCOUNT_ATTRIBUTES = void 0;
4
+ const parser_js_1 = require("../lib/parser.js");
5
+ const syntax_string_js_1 = require("../lib/syntax-string.js");
6
+ const syntax_js_1 = require("../lib/syntax.js");
7
+ const util_js_1 = require("../lib/util.js");
8
+ exports.ACCOUNT_ATTRIBUTES = Object.freeze([
9
+ 'email',
10
+ 'repo',
11
+ 'status',
12
+ ]);
13
+ exports.ACCOUNT_ACTIONS = Object.freeze(['read', 'manage']);
14
+ class AccountPermission {
15
+ constructor(attr, action) {
16
+ Object.defineProperty(this, "attr", {
17
+ enumerable: true,
18
+ configurable: true,
19
+ writable: true,
20
+ value: attr
21
+ });
22
+ Object.defineProperty(this, "action", {
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true,
26
+ value: action
27
+ });
28
+ }
29
+ matches(options) {
30
+ return (this.attr === options.attr &&
31
+ (this.action === 'manage' || this.action === options.action));
32
+ }
33
+ toString() {
34
+ return AccountPermission.parser.format(this);
35
+ }
36
+ static fromString(scope) {
37
+ if (!(0, syntax_js_1.isScopeStringFor)(scope, 'account'))
38
+ return null;
39
+ const syntax = syntax_string_js_1.ScopeStringSyntax.fromString(scope);
40
+ return AccountPermission.fromSyntax(syntax);
41
+ }
42
+ static fromSyntax(syntax) {
43
+ const result = AccountPermission.parser.parse(syntax);
44
+ if (!result)
45
+ return null;
46
+ return new AccountPermission(result.attr, result.action);
47
+ }
48
+ static scopeNeededFor(options) {
49
+ return AccountPermission.parser.format(options);
50
+ }
51
+ }
52
+ exports.AccountPermission = AccountPermission;
53
+ Object.defineProperty(AccountPermission, "parser", {
54
+ enumerable: true,
55
+ configurable: true,
56
+ writable: true,
57
+ value: new parser_js_1.Parser('account', {
58
+ attr: {
59
+ multiple: false,
60
+ required: true,
61
+ validate: (0, util_js_1.knownValuesValidator)(exports.ACCOUNT_ATTRIBUTES),
62
+ },
63
+ action: {
64
+ multiple: false,
65
+ required: false,
66
+ validate: (0, util_js_1.knownValuesValidator)(exports.ACCOUNT_ACTIONS),
67
+ default: 'read',
68
+ },
69
+ }, 'attr')
70
+ });
71
+ //# sourceMappingURL=account-permission.js.map
@@ -0,0 +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"}
@@ -0,0 +1,27 @@
1
+ import { Accept, isAccept } from '../lib/mime.js';
2
+ import { Parser } from '../lib/parser.js';
3
+ import { ResourcePermission } from '../lib/resource-permission.js';
4
+ import { NeArray, NeRoArray, ParamValue, ScopeSyntax } from '../lib/syntax.js';
5
+ export { type Accept };
6
+ export declare const DEFAULT_ACCEPT: readonly ["*/*"];
7
+ export type BlobPermissionMatch = {
8
+ mime: string;
9
+ };
10
+ export declare class BlobPermission implements ResourcePermission<'blob', BlobPermissionMatch> {
11
+ readonly accept: NeRoArray<Accept>;
12
+ constructor(accept: NeRoArray<Accept>);
13
+ matches(options: BlobPermissionMatch): boolean;
14
+ toString(): import("../lib/syntax.js").ScopeStringFor<"blob">;
15
+ protected static readonly parser: Parser<"blob", {
16
+ accept: {
17
+ multiple: true;
18
+ required: true;
19
+ validate: typeof isAccept;
20
+ normalize: (value: NeRoArray<ParamValue>) => readonly ["*/*"] | NeArray<Accept>;
21
+ };
22
+ }>;
23
+ static fromString(scope: string): BlobPermission | null;
24
+ static fromSyntax(syntax: ScopeSyntax<'blob'>): BlobPermission | null;
25
+ static scopeNeededFor(options: BlobPermissionMatch): import("../lib/syntax.js").ScopeStringFor<"blob">;
26
+ }
27
+ //# sourceMappingURL=blob-permission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blob-permission.d.ts","sourceRoot":"","sources":["../../src/scopes/blob-permission.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAoB,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAElE,OAAO,EACL,OAAO,EACP,SAAS,EACT,UAAU,EACV,WAAW,EAEZ,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,KAAK,MAAM,EAAE,CAAA;AAEtB,eAAO,MAAM,cAAc,kBAAkC,CAAA;AAE7D,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,qBAAa,cACX,YAAW,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,CAAC;aAE9B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;gBAAzB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;IAErD,OAAO,CAAC,OAAO,EAAE,mBAAmB;IAIpC,QAAQ;IAIR,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM;;;;;;;OAmB/B;IAED,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM;IAM/B,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;IAO7C,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,mBAAmB;CAKnD"}