@getbrevo/cli 2.0.1 → 2.1.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 (213) hide show
  1. package/CHANGELOG.md +221 -0
  2. package/README.md +8 -5
  3. package/agent-context/AGENTS.md +59 -15
  4. package/agent-context/SKILL.md +70 -14
  5. package/dist/{templates → bin}/files/AGENTS.md.tmpl +11 -1
  6. package/dist/{templates → bin}/files/CLAUDE.md.tmpl +8 -0
  7. package/dist/{templates → bin}/files/README.md.tmpl +11 -14
  8. package/dist/bin/files/app-config.json.tmpl +16 -0
  9. package/dist/{templates → bin}/files/src/oauth/.env.example.tmpl +8 -0
  10. package/dist/{templates → bin}/files/src/oauth/.env.local.tmpl +2 -0
  11. package/dist/{templates → bin}/files/src/oauth/handler.js.tmpl +49 -7
  12. package/dist/{templates → bin}/files/src/oauth/server.js.tmpl +20 -14
  13. package/dist/{templates → bin}/files/src/oauth/token-store.js.tmpl +19 -0
  14. package/dist/bin/index.js +660 -221
  15. package/dist/bin/index.js.map +7 -1
  16. package/package.json +6 -4
  17. package/dist/api/client.d.ts +0 -25
  18. package/dist/api/client.d.ts.map +0 -1
  19. package/dist/api/client.js +0 -205
  20. package/dist/api/client.js.map +0 -1
  21. package/dist/bin/index.d.ts +0 -3
  22. package/dist/bin/index.d.ts.map +0 -1
  23. package/dist/commands/app/create.d.ts +0 -8
  24. package/dist/commands/app/create.d.ts.map +0 -1
  25. package/dist/commands/app/create.js +0 -325
  26. package/dist/commands/app/create.js.map +0 -1
  27. package/dist/commands/app/credentials.d.ts +0 -6
  28. package/dist/commands/app/credentials.d.ts.map +0 -1
  29. package/dist/commands/app/credentials.js +0 -114
  30. package/dist/commands/app/credentials.js.map +0 -1
  31. package/dist/commands/app/delete.d.ts +0 -6
  32. package/dist/commands/app/delete.d.ts.map +0 -1
  33. package/dist/commands/app/delete.js +0 -167
  34. package/dist/commands/app/delete.js.map +0 -1
  35. package/dist/commands/app/list.d.ts +0 -4
  36. package/dist/commands/app/list.d.ts.map +0 -1
  37. package/dist/commands/app/list.js +0 -71
  38. package/dist/commands/app/list.js.map +0 -1
  39. package/dist/commands/app/scaffold.d.ts +0 -5
  40. package/dist/commands/app/scaffold.d.ts.map +0 -1
  41. package/dist/commands/app/scaffold.js +0 -213
  42. package/dist/commands/app/scaffold.js.map +0 -1
  43. package/dist/commands/app/scopes.d.ts +0 -2
  44. package/dist/commands/app/scopes.d.ts.map +0 -1
  45. package/dist/commands/app/scopes.js +0 -81
  46. package/dist/commands/app/scopes.js.map +0 -1
  47. package/dist/commands/app/start.d.ts +0 -5
  48. package/dist/commands/app/start.d.ts.map +0 -1
  49. package/dist/commands/app/start.js +0 -220
  50. package/dist/commands/app/start.js.map +0 -1
  51. package/dist/commands/app/update.d.ts +0 -2
  52. package/dist/commands/app/update.d.ts.map +0 -1
  53. package/dist/commands/app/update.js +0 -444
  54. package/dist/commands/app/update.js.map +0 -1
  55. package/dist/commands/definitions.d.ts +0 -5
  56. package/dist/commands/definitions.d.ts.map +0 -1
  57. package/dist/commands/definitions.js +0 -262
  58. package/dist/commands/definitions.js.map +0 -1
  59. package/dist/commands/init.d.ts +0 -2
  60. package/dist/commands/init.d.ts.map +0 -1
  61. package/dist/commands/init.js +0 -106
  62. package/dist/commands/init.js.map +0 -1
  63. package/dist/commands/login.d.ts +0 -6
  64. package/dist/commands/login.d.ts.map +0 -1
  65. package/dist/commands/login.js +0 -251
  66. package/dist/commands/login.js.map +0 -1
  67. package/dist/commands/logout.d.ts +0 -5
  68. package/dist/commands/logout.d.ts.map +0 -1
  69. package/dist/commands/logout.js +0 -54
  70. package/dist/commands/logout.js.map +0 -1
  71. package/dist/commands/skill/install.d.ts +0 -4
  72. package/dist/commands/skill/install.d.ts.map +0 -1
  73. package/dist/commands/skill/install.js +0 -29
  74. package/dist/commands/skill/install.js.map +0 -1
  75. package/dist/commands/skill/uninstall.d.ts +0 -4
  76. package/dist/commands/skill/uninstall.d.ts.map +0 -1
  77. package/dist/commands/skill/uninstall.js +0 -23
  78. package/dist/commands/skill/uninstall.js.map +0 -1
  79. package/dist/commands/whoami.d.ts +0 -4
  80. package/dist/commands/whoami.d.ts.map +0 -1
  81. package/dist/commands/whoami.js +0 -85
  82. package/dist/commands/whoami.js.map +0 -1
  83. package/dist/container.d.ts +0 -7
  84. package/dist/container.d.ts.map +0 -1
  85. package/dist/container.js +0 -28
  86. package/dist/container.js.map +0 -1
  87. package/dist/lang/en.d.ts +0 -161
  88. package/dist/lang/en.d.ts.map +0 -1
  89. package/dist/lang/en.js +0 -188
  90. package/dist/lang/en.js.map +0 -1
  91. package/dist/lib/abort.d.ts +0 -3
  92. package/dist/lib/abort.d.ts.map +0 -1
  93. package/dist/lib/abort.js +0 -30
  94. package/dist/lib/abort.js.map +0 -1
  95. package/dist/lib/auth-guard.d.ts +0 -3
  96. package/dist/lib/auth-guard.d.ts.map +0 -1
  97. package/dist/lib/auth-guard.js +0 -47
  98. package/dist/lib/auth-guard.js.map +0 -1
  99. package/dist/lib/browser.d.ts +0 -2
  100. package/dist/lib/browser.d.ts.map +0 -1
  101. package/dist/lib/browser.js +0 -16
  102. package/dist/lib/browser.js.map +0 -1
  103. package/dist/lib/cli-version.d.ts +0 -2
  104. package/dist/lib/cli-version.d.ts.map +0 -1
  105. package/dist/lib/cli-version.js +0 -59
  106. package/dist/lib/cli-version.js.map +0 -1
  107. package/dist/lib/command-handler.d.ts +0 -10
  108. package/dist/lib/command-handler.d.ts.map +0 -1
  109. package/dist/lib/command-handler.js +0 -16
  110. package/dist/lib/command-handler.js.map +0 -1
  111. package/dist/lib/command-registry.d.ts +0 -28
  112. package/dist/lib/command-registry.d.ts.map +0 -1
  113. package/dist/lib/command-registry.js +0 -54
  114. package/dist/lib/command-registry.js.map +0 -1
  115. package/dist/lib/config.d.ts +0 -83
  116. package/dist/lib/config.d.ts.map +0 -1
  117. package/dist/lib/config.js +0 -430
  118. package/dist/lib/config.js.map +0 -1
  119. package/dist/lib/constants.d.ts +0 -48
  120. package/dist/lib/constants.d.ts.map +0 -1
  121. package/dist/lib/constants.js +0 -121
  122. package/dist/lib/constants.js.map +0 -1
  123. package/dist/lib/errors.d.ts +0 -30
  124. package/dist/lib/errors.d.ts.map +0 -1
  125. package/dist/lib/errors.js +0 -66
  126. package/dist/lib/errors.js.map +0 -1
  127. package/dist/lib/exit-codes.d.ts +0 -9
  128. package/dist/lib/exit-codes.d.ts.map +0 -1
  129. package/dist/lib/exit-codes.js +0 -12
  130. package/dist/lib/exit-codes.js.map +0 -1
  131. package/dist/lib/hidden-input.d.ts +0 -2
  132. package/dist/lib/hidden-input.d.ts.map +0 -1
  133. package/dist/lib/hidden-input.js +0 -78
  134. package/dist/lib/hidden-input.js.map +0 -1
  135. package/dist/lib/json-output.d.ts +0 -6
  136. package/dist/lib/json-output.d.ts.map +0 -1
  137. package/dist/lib/json-output.js +0 -11
  138. package/dist/lib/json-output.js.map +0 -1
  139. package/dist/lib/logger.d.ts +0 -11
  140. package/dist/lib/logger.d.ts.map +0 -1
  141. package/dist/lib/logger.js +0 -110
  142. package/dist/lib/logger.js.map +0 -1
  143. package/dist/lib/port.d.ts +0 -25
  144. package/dist/lib/port.d.ts.map +0 -1
  145. package/dist/lib/port.js +0 -103
  146. package/dist/lib/port.js.map +0 -1
  147. package/dist/lib/telemetry.d.ts +0 -9
  148. package/dist/lib/telemetry.d.ts.map +0 -1
  149. package/dist/lib/telemetry.js +0 -57
  150. package/dist/lib/telemetry.js.map +0 -1
  151. package/dist/lib/ui.d.ts +0 -14
  152. package/dist/lib/ui.d.ts.map +0 -1
  153. package/dist/lib/ui.js +0 -75
  154. package/dist/lib/ui.js.map +0 -1
  155. package/dist/lib/update-notifier.d.ts +0 -37
  156. package/dist/lib/update-notifier.d.ts.map +0 -1
  157. package/dist/lib/update-notifier.js +0 -298
  158. package/dist/lib/update-notifier.js.map +0 -1
  159. package/dist/lib/validators.d.ts +0 -55
  160. package/dist/lib/validators.d.ts.map +0 -1
  161. package/dist/lib/validators.js +0 -166
  162. package/dist/lib/validators.js.map +0 -1
  163. package/dist/services/account.d.ts +0 -8
  164. package/dist/services/account.d.ts.map +0 -1
  165. package/dist/services/account.js +0 -15
  166. package/dist/services/account.js.map +0 -1
  167. package/dist/services/app.d.ts +0 -38
  168. package/dist/services/app.d.ts.map +0 -1
  169. package/dist/services/app.js +0 -145
  170. package/dist/services/app.js.map +0 -1
  171. package/dist/services/browser-auth.d.ts +0 -15
  172. package/dist/services/browser-auth.d.ts.map +0 -1
  173. package/dist/services/browser-auth.js +0 -188
  174. package/dist/services/browser-auth.js.map +0 -1
  175. package/dist/services/normalize-app-id.d.ts +0 -12
  176. package/dist/services/normalize-app-id.d.ts.map +0 -1
  177. package/dist/services/normalize-app-id.js +0 -38
  178. package/dist/services/normalize-app-id.js.map +0 -1
  179. package/dist/services/oauth-metadata.d.ts +0 -7
  180. package/dist/services/oauth-metadata.d.ts.map +0 -1
  181. package/dist/services/oauth-metadata.js +0 -43
  182. package/dist/services/oauth-metadata.js.map +0 -1
  183. package/dist/services/oauth-refresh.d.ts +0 -14
  184. package/dist/services/oauth-refresh.d.ts.map +0 -1
  185. package/dist/services/oauth-refresh.js +0 -70
  186. package/dist/services/oauth-refresh.js.map +0 -1
  187. package/dist/services/scopes-html.d.ts +0 -3
  188. package/dist/services/scopes-html.d.ts.map +0 -1
  189. package/dist/services/scopes-html.js +0 -516
  190. package/dist/services/scopes-html.js.map +0 -1
  191. package/dist/services/scopes-web.d.ts +0 -12
  192. package/dist/services/scopes-web.d.ts.map +0 -1
  193. package/dist/services/scopes-web.js +0 -95
  194. package/dist/services/scopes-web.js.map +0 -1
  195. package/dist/services/skill.d.ts +0 -48
  196. package/dist/services/skill.d.ts.map +0 -1
  197. package/dist/services/skill.js +0 -223
  198. package/dist/services/skill.js.map +0 -1
  199. package/dist/skills/index.d.ts +0 -47
  200. package/dist/skills/index.d.ts.map +0 -1
  201. package/dist/skills/index.js +0 -61
  202. package/dist/skills/index.js.map +0 -1
  203. package/dist/templates/files/app-config.json.tmpl +0 -25
  204. package/dist/templates/index.d.ts +0 -36
  205. package/dist/templates/index.d.ts.map +0 -1
  206. package/dist/templates/index.js +0 -105
  207. package/dist/templates/index.js.map +0 -1
  208. package/dist/types.d.ts +0 -32
  209. package/dist/types.d.ts.map +0 -1
  210. package/dist/types.js +0 -3
  211. package/dist/types.js.map +0 -1
  212. /package/dist/{templates → bin}/files/gitignore.tmpl +0 -0
  213. /package/dist/{templates → bin}/files/src/oauth/package.json.tmpl +0 -0
@@ -1,70 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RefreshError = void 0;
4
- exports.refreshAccessToken = refreshAccessToken;
5
- class RefreshError extends Error {
6
- unauthorized;
7
- cause;
8
- constructor(message, unauthorized, cause) {
9
- super(message);
10
- this.unauthorized = unauthorized;
11
- this.cause = cause;
12
- this.name = 'RefreshError';
13
- }
14
- }
15
- exports.RefreshError = RefreshError;
16
- async function refreshAccessToken(refreshToken, proxyUrl) {
17
- let res;
18
- try {
19
- res = await fetch(`${proxyUrl}/refresh`, {
20
- method: 'POST',
21
- headers: {
22
- 'Content-Type': 'application/json',
23
- Accept: 'application/json',
24
- },
25
- body: JSON.stringify({ refresh_token: refreshToken }),
26
- signal: AbortSignal.timeout(15_000),
27
- });
28
- }
29
- catch (err) {
30
- throw new RefreshError('Could not reach the Brevo login service.', false, err);
31
- }
32
- if (!res.ok) {
33
- throw new RefreshError(`Token refresh failed (${res.status}).`, res.status === 401);
34
- }
35
- let body;
36
- try {
37
- body = (await res.json());
38
- }
39
- catch (err) {
40
- throw new RefreshError('Malformed refresh response from login service.', false, err);
41
- }
42
- if (!body.access_token ||
43
- typeof body.access_token !== 'string' ||
44
- typeof body.expires_in !== 'number' ||
45
- !Number.isFinite(body.expires_in) ||
46
- body.expires_in <= 0 ||
47
- !body.token_type ||
48
- typeof body.token_type !== 'string') {
49
- throw new RefreshError('Malformed refresh response from login service.', false);
50
- }
51
- // refresh_token rotation is optional (proxies often only mint a new one
52
- // when the old one is close to expiry). When the field is present it must
53
- // be a non-empty string — `??` would let an empty string slip through and
54
- // get persisted as a permanently-broken refresh token.
55
- let resolvedRefreshToken = refreshToken;
56
- if (body.refresh_token !== undefined) {
57
- if (typeof body.refresh_token !== 'string' || body.refresh_token.length === 0) {
58
- throw new RefreshError('Malformed refresh response from login service.', false);
59
- }
60
- resolvedRefreshToken = body.refresh_token;
61
- }
62
- return {
63
- accessToken: body.access_token,
64
- refreshToken: resolvedRefreshToken,
65
- expiresIn: body.expires_in,
66
- tokenType: body.token_type,
67
- scope: body.scope,
68
- };
69
- }
70
- //# sourceMappingURL=oauth-refresh.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"oauth-refresh.js","sourceRoot":"","sources":["../../src/services/oauth-refresh.ts"],"names":[],"mappings":";;;AAmBA,gDAmEC;AA9ED,MAAa,YAAa,SAAQ,KAAK;IAGnB;IACA;IAHlB,YACE,OAAe,EACC,YAAqB,EACrB,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,iBAAY,GAAZ,YAAY,CAAS;QACrB,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AATD,oCASC;AAEM,KAAK,UAAU,kBAAkB,CACtC,YAAoB,EACpB,QAAgB;IAEhB,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,UAAU,EAAE;YACvC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;YACrD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;SACpC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CAAC,0CAA0C,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,YAAY,CAAC,yBAAyB,GAAG,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC;IACtF,CAAC;IAED,IAAI,IAMH,CAAC;IACF,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAgB,CAAC;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,YAAY,CAAC,gDAAgD,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACvF,CAAC;IAED,IACE,CAAC,IAAI,CAAC,YAAY;QAClB,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ;QACrC,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;QACnC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;QACjC,IAAI,CAAC,UAAU,IAAI,CAAC;QACpB,CAAC,IAAI,CAAC,UAAU;QAChB,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,EACnC,CAAC;QACD,MAAM,IAAI,YAAY,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;IAClF,CAAC;IAED,wEAAwE;IACxE,0EAA0E;IAC1E,0EAA0E;IAC1E,uDAAuD;IACvD,IAAI,oBAAoB,GAAG,YAAY,CAAC;IACxC,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9E,MAAM,IAAI,YAAY,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;QAClF,CAAC;QACD,oBAAoB,GAAG,IAAI,CAAC,aAAa,CAAC;IAC5C,CAAC;IAED,OAAO;QACL,WAAW,EAAE,IAAI,CAAC,YAAY;QAC9B,YAAY,EAAE,oBAAoB;QAClC,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC;AACJ,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { ScopeEntry } from './oauth-metadata';
2
- export declare function renderScopesHtml(entries: ScopeEntry[]): string;
3
- //# sourceMappingURL=scopes-html.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scopes-html.d.ts","sourceRoot":"","sources":["../../src/services/scopes-html.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAmcnD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAqE9D"}
@@ -1,516 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.renderScopesHtml = renderScopesHtml;
4
- const constants_1 = require("../lib/constants");
5
- const en_1 = require("../lang/en");
6
- function escapeHtml(value) {
7
- return value
8
- .replaceAll('&', '&amp;')
9
- .replaceAll('<', '&lt;')
10
- .replaceAll('>', '&gt;')
11
- .replaceAll('"', '&quot;')
12
- .replaceAll("'", '&#39;');
13
- }
14
- function safeJson(value) {
15
- // Safe for embedding inside <script type="application/json">: only
16
- // </script> can end the block, so we just neutralise '<'.
17
- return JSON.stringify(value).replaceAll('<', String.raw `\u003c`);
18
- }
19
- // Styling matches the Brevo developers docs (developers.brevo.com) — Brevo
20
- // green accent, pale-green hero, and charcoal-grey neutrals. Fonts use a
21
- // system stack (no CDN fetch or web-font download) so the page renders the
22
- // same with or without network.
23
- const STYLES = `
24
- :root {
25
- color-scheme: light dark;
26
- --bg: #ffffff;
27
- --hero-bg: #e6f6ec;
28
- --fg: #1b1b1b;
29
- --muted: #696969;
30
- --border: #e3e3e3;
31
- --accent: #0b996e;
32
- --card: #ffffff;
33
- --card-shadow: 0 1px 2px rgba(28, 28, 28, .08);
34
- --chip-bg: #e1f3e8;
35
- --chip-fg: #00734a;
36
- --section-header-bg: #f6fbf8;
37
- --error: #cf1a3b;
38
- --radius-card: 16px;
39
- --radius-input: 16px;
40
- --radius-chip: 20px;
41
- }
42
- @media (prefers-color-scheme: dark) {
43
- :root {
44
- --bg: #0e1613;
45
- --hero-bg: #142119;
46
- --fg: #f1f5f2;
47
- --muted: #94a89c;
48
- --border: #25382d;
49
- --accent: #3ddc97;
50
- --card: #16241c;
51
- --card-shadow: 0 1px 2px rgba(0, 0, 0, .4);
52
- --chip-bg: #1d3327;
53
- --chip-fg: #a7e3c5;
54
- --section-header-bg: #121f18;
55
- --error: #ff8d9a;
56
- }
57
- }
58
- * { box-sizing: border-box; }
59
- body {
60
- margin: 0;
61
- padding: 0;
62
- font: 15px/1.55 system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
63
- background: var(--bg);
64
- color: var(--fg);
65
- -webkit-font-smoothing: antialiased;
66
- -moz-osx-font-smoothing: grayscale;
67
- }
68
- .hero {
69
- background: var(--hero-bg);
70
- padding: 2.5rem 1.5rem 2rem;
71
- }
72
- .hero-inner {
73
- max-width: 880px;
74
- margin: 0 auto;
75
- display: flex;
76
- align-items: center;
77
- justify-content: space-between;
78
- gap: 1.5rem;
79
- flex-wrap: wrap;
80
- }
81
- .hero-copy { flex: 1 1 24rem; min-width: 0; }
82
- h1 {
83
- font-size: 2rem;
84
- line-height: 2.5rem;
85
- font-weight: 600;
86
- margin: 0 0 .5rem;
87
- }
88
- .intro { color: var(--muted); margin: 0; word-break: break-word; }
89
- a.docs-cta {
90
- display: inline-block;
91
- flex: none;
92
- white-space: nowrap;
93
- padding: .5rem 1.1rem;
94
- font-weight: 600;
95
- font-size: .9rem;
96
- color: #ffffff;
97
- background: var(--accent);
98
- border-radius: var(--radius-input);
99
- text-decoration: none;
100
- box-shadow: var(--card-shadow);
101
- }
102
- a.docs-cta:hover { opacity: .9; }
103
- @media (prefers-color-scheme: dark) {
104
- a.docs-cta { color: #0e1613; }
105
- }
106
- main {
107
- max-width: 880px;
108
- margin: 0 auto;
109
- padding: 1.5rem 1.5rem 4rem;
110
- }
111
- .toolbar {
112
- display: flex;
113
- gap: .75rem;
114
- align-items: center;
115
- margin-bottom: 1.5rem;
116
- }
117
- input[type="search"] {
118
- flex: 1;
119
- padding: .55rem .9rem;
120
- font: inherit;
121
- font-size: 1rem;
122
- border: 1px solid var(--border);
123
- border-radius: var(--radius-input);
124
- background: var(--card);
125
- color: var(--fg);
126
- }
127
- input[type="search"]:focus {
128
- outline: none;
129
- border-color: var(--accent);
130
- box-shadow: inset 0 0 0 1px var(--accent);
131
- }
132
- button.refresh {
133
- padding: .5rem 1rem;
134
- font: inherit;
135
- font-weight: 600;
136
- font-size: .9rem;
137
- border: 1px solid var(--border);
138
- border-radius: var(--radius-input);
139
- background: var(--card);
140
- color: var(--fg);
141
- cursor: pointer;
142
- box-shadow: var(--card-shadow);
143
- }
144
- button.refresh:hover { background: var(--chip-bg); border-color: var(--chip-bg); }
145
- button.refresh:disabled { opacity: .55; cursor: progress; }
146
- .refresh-error {
147
- margin: -.75rem 0 1rem;
148
- color: var(--error);
149
- font-size: .85rem;
150
- }
151
- section {
152
- border: 1px solid var(--border);
153
- border-radius: var(--radius-card);
154
- margin-bottom: 1rem;
155
- background: var(--card);
156
- box-shadow: var(--card-shadow);
157
- overflow: hidden;
158
- }
159
- section[hidden] { display: none; }
160
- .section-head {
161
- display: flex;
162
- align-items: center;
163
- justify-content: space-between;
164
- gap: .75rem;
165
- padding: .55rem 1rem;
166
- background: var(--section-header-bg);
167
- border-bottom: 1px solid var(--border);
168
- }
169
- .section-head h2 {
170
- font-size: .75rem;
171
- font-weight: 600;
172
- text-transform: uppercase;
173
- letter-spacing: .06em;
174
- color: var(--muted);
175
- margin: 0;
176
- }
177
- button.copy {
178
- font: inherit;
179
- font-size: .75rem;
180
- font-weight: 600;
181
- padding: .2rem .7rem;
182
- border: 1px solid var(--border);
183
- border-radius: var(--radius-chip);
184
- background: var(--card);
185
- color: var(--accent);
186
- cursor: pointer;
187
- white-space: nowrap;
188
- }
189
- button.copy:hover { background: var(--chip-bg); border-color: var(--chip-bg); }
190
- button.copy:disabled { opacity: .55; cursor: default; }
191
- .selection-bar {
192
- display: flex;
193
- gap: .75rem;
194
- align-items: center;
195
- margin-bottom: 1.5rem;
196
- }
197
- .selection-bar input[type="text"] {
198
- flex: 1;
199
- padding: .55rem .9rem;
200
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
201
- font-size: .85rem;
202
- border: 1px solid var(--border);
203
- border-radius: var(--radius-input);
204
- background: var(--card);
205
- color: var(--fg);
206
- }
207
- .selection-bar button.copy { padding: .5rem 1rem; font-size: .9rem; }
208
- ul { list-style: none; margin: 0; padding: .5rem 0; }
209
- li { padding: .4rem 1rem; }
210
- li[hidden] { display: none; }
211
- .scope-row { display: flex; align-items: flex-start; gap: .55rem; }
212
- .scope-row input[type="checkbox"] {
213
- accent-color: var(--accent);
214
- margin-top: .25rem;
215
- flex: none;
216
- cursor: pointer;
217
- }
218
- .scope-row details { flex: 1; min-width: 0; }
219
- .badge {
220
- font-size: .68rem;
221
- font-weight: 600;
222
- text-transform: uppercase;
223
- letter-spacing: .04em;
224
- color: var(--error);
225
- border: 1px solid currentColor;
226
- border-radius: var(--radius-chip);
227
- padding: 0 .45rem;
228
- margin-left: .5rem;
229
- vertical-align: middle;
230
- }
231
- details > summary {
232
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
233
- font-size: .9rem;
234
- cursor: pointer;
235
- list-style: revert;
236
- }
237
- details[open] > summary { margin-bottom: .35rem; }
238
- .endpoints {
239
- margin: .25rem 0 .25rem 1.1rem;
240
- padding: 0;
241
- display: flex;
242
- flex-wrap: wrap;
243
- gap: .35rem;
244
- }
245
- .endpoints .ep {
246
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
247
- font-size: .78rem;
248
- background: var(--chip-bg);
249
- color: var(--chip-fg);
250
- padding: .15rem .55rem;
251
- border-radius: var(--radius-chip);
252
- }
253
- .endpoints .none {
254
- font-size: .8rem;
255
- color: var(--muted);
256
- font-style: italic;
257
- }
258
- .empty { color: var(--muted); padding: 2rem 0; text-align: center; }
259
- footer {
260
- margin-top: 3rem;
261
- padding-top: 1.5rem;
262
- border-top: 1px solid var(--border);
263
- font-size: .8rem;
264
- color: var(--muted);
265
- }
266
- footer a { color: var(--accent); }
267
- `.trim();
268
- const SCRIPT = `
269
- (function () {
270
- var dataNode = document.getElementById('scopes-data');
271
- var state = dataNode ? JSON.parse(dataNode.textContent || '[]') : [];
272
-
273
- var listEl = document.getElementById('scopes-list');
274
- var searchEl = document.querySelector('input[type="search"]');
275
- var refreshBtn = document.getElementById('refresh-btn');
276
- var errorEl = document.getElementById('refresh-error');
277
- var introCountEl = document.getElementById('scopes-count');
278
- var selectedEl = document.getElementById('selected-scopes');
279
- var copySelectedBtn = document.getElementById('copy-selected');
280
- var labels = JSON.parse(document.getElementById('labels').textContent);
281
-
282
- // Selected scope names, in click order. Rendered as '"a","b"' — pastes
283
- // straight into app-config.json's auth.scopes array, and shells strip the
284
- // quotes so "brevo app update --scope" accepts the same paste.
285
- var selected = [];
286
-
287
- function quoted(names) {
288
- return names.map(function (n) { return '"' + n + '"'; }).join(',');
289
- }
290
-
291
- function escapeHtml(s) {
292
- return String(s).replace(/[&<>"']/g, function (c) {
293
- return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c];
294
- });
295
- }
296
-
297
- function render(entries) {
298
- if (!entries.length) {
299
- listEl.innerHTML = '<p class="empty">' + escapeHtml(labels.empty) + '</p>';
300
- return;
301
- }
302
- var byCategory = new Map();
303
- entries.forEach(function (e) {
304
- var list = byCategory.get(e.category);
305
- if (list) list.push(e);
306
- else byCategory.set(e.category, [e]);
307
- });
308
- var html = '';
309
- byCategory.forEach(function (items, cat) {
310
- var copyAria = labels.copyCategoryAria.replace('{category}', cat);
311
- html += '<section><div class="section-head"><h2>' + escapeHtml(cat) + '</h2>';
312
- html +=
313
- '<button type="button" class="copy copy-category" data-category="' + escapeHtml(cat) +
314
- '" aria-label="' + escapeHtml(copyAria) + '">' + escapeHtml(labels.copy) + '</button></div><ul>';
315
- items.forEach(function (e) {
316
- var endpoints = Array.isArray(e.apiEndpoints) ? e.apiEndpoints : [];
317
- var isLegacy = e.name === labels.legacyScope;
318
- html += '<li><div class="scope-row">';
319
- if (isLegacy) {
320
- // The legacy catch-all scope is deprecated: badge it, no checkbox,
321
- // and copy CTAs skip it so pasted lists never reintroduce it.
322
- html += '<details><summary>' + escapeHtml(e.name) +
323
- '<span class="badge" title="' + escapeHtml(labels.legacyTitle) + '">' +
324
- escapeHtml(labels.legacyBadge) + '</span></summary>';
325
- } else {
326
- var selectAria = labels.selectScopeAria.replace('{scope}', e.name);
327
- html += '<input type="checkbox" class="scope-check" data-scope="' + escapeHtml(e.name) +
328
- '" aria-label="' + escapeHtml(selectAria) + '"' +
329
- (selected.indexOf(e.name) !== -1 ? ' checked' : '') + '>';
330
- html += '<details><summary>' + escapeHtml(e.name) + '</summary>';
331
- }
332
- if (endpoints.length) {
333
- html += '<div class="endpoints" aria-label="' + escapeHtml(labels.endpointsLabel) + '">';
334
- endpoints.forEach(function (ep) {
335
- html += '<span class="ep">' + escapeHtml(ep) + '</span>';
336
- });
337
- html += '</div>';
338
- } else {
339
- html += '<div class="endpoints"><span class="none">' + escapeHtml(labels.noEndpoints) + '</span></div>';
340
- }
341
- html += '</details></div></li>';
342
- });
343
- html += '</ul></section>';
344
- });
345
- listEl.innerHTML = html;
346
- applyFilter();
347
- }
348
-
349
- function copyText(text, btn) {
350
- if (!navigator.clipboard || !navigator.clipboard.writeText) return;
351
- navigator.clipboard.writeText(text).then(function () {
352
- var original = btn.textContent;
353
- btn.textContent = labels.copied;
354
- setTimeout(function () {
355
- btn.textContent = original;
356
- }, 1200);
357
- }).catch(function () { /* clipboard denied — leave the button as-is */ });
358
- }
359
-
360
- function updateSelection() {
361
- selectedEl.value = quoted(selected);
362
- copySelectedBtn.disabled = selected.length === 0;
363
- }
364
-
365
- function applyFilter() {
366
- var q = searchEl ? searchEl.value.toLowerCase().trim() : '';
367
- var sections = listEl.querySelectorAll('section');
368
- sections.forEach(function (section) {
369
- var items = section.querySelectorAll('li');
370
- var anyVisible = false;
371
- items.forEach(function (li) {
372
- var text = li.textContent.toLowerCase();
373
- var match = q === '' || text.indexOf(q) !== -1;
374
- li.hidden = !match;
375
- if (match) anyVisible = true;
376
- });
377
- section.hidden = !anyVisible;
378
- });
379
- }
380
-
381
- function setCount(n) {
382
- if (introCountEl) introCountEl.textContent = String(n);
383
- }
384
-
385
- render(state);
386
- setCount(state.length);
387
- updateSelection();
388
-
389
- if (searchEl) {
390
- searchEl.addEventListener('input', applyFilter);
391
- }
392
-
393
- // Delegated handlers survive re-renders (refresh replaces listEl's HTML).
394
- listEl.addEventListener('click', function (ev) {
395
- var btn = ev.target.closest ? ev.target.closest('button.copy-category') : null;
396
- if (!btn) return;
397
- var cat = btn.getAttribute('data-category');
398
- var names = state
399
- .filter(function (e) { return e.category === cat && e.name !== labels.legacyScope; })
400
- .map(function (e) { return e.name; });
401
- copyText(quoted(names), btn);
402
- });
403
-
404
- listEl.addEventListener('change', function (ev) {
405
- var box = ev.target.closest ? ev.target.closest('input.scope-check') : null;
406
- if (!box) return;
407
- var name = box.getAttribute('data-scope');
408
- var idx = selected.indexOf(name);
409
- if (box.checked && idx === -1) selected.push(name);
410
- if (!box.checked && idx !== -1) selected.splice(idx, 1);
411
- updateSelection();
412
- });
413
-
414
- copySelectedBtn.addEventListener('click', function () {
415
- if (selected.length) copyText(quoted(selected), copySelectedBtn);
416
- });
417
-
418
- if (refreshBtn) {
419
- var defaultLabel = refreshBtn.textContent;
420
- refreshBtn.addEventListener('click', function () {
421
- refreshBtn.disabled = true;
422
- refreshBtn.textContent = labels.refreshing;
423
- if (errorEl) errorEl.hidden = true;
424
- fetch('/scopes.json', { headers: { Accept: 'application/json' } })
425
- .then(function (res) {
426
- if (!res.ok) throw new Error('HTTP ' + res.status);
427
- return res.json();
428
- })
429
- .then(function (body) {
430
- var entries = Array.isArray(body && body.scopes) ? body.scopes : [];
431
- state = entries;
432
- // Drop selections for scopes the IdP no longer returns.
433
- selected = selected.filter(function (name) {
434
- return state.some(function (e) { return e.name === name; });
435
- });
436
- render(state);
437
- setCount(state.length);
438
- updateSelection();
439
- })
440
- .catch(function () {
441
- if (errorEl) errorEl.hidden = false;
442
- })
443
- .then(function () {
444
- refreshBtn.disabled = false;
445
- refreshBtn.textContent = defaultLabel;
446
- });
447
- });
448
- }
449
- })();
450
- `.trim();
451
- function renderScopesHtml(entries) {
452
- const title = escapeHtml(en_1.messages.APP_SCOPES_WEB_TITLE);
453
- const intro = en_1.messages.APP_SCOPES_WEB_INTRO(entries.length, constants_1.OAUTH_SCOPES_URL);
454
- // The intro is rendered with a dynamic count span so refresh can update it
455
- // in place without re-rendering the source URL.
456
- const introWithSpan = escapeHtml(intro).replace(String(entries.length), `<span id="scopes-count">${entries.length}</span>`);
457
- const searchPlaceholder = escapeHtml(en_1.messages.APP_SCOPES_WEB_SEARCH_PLACEHOLDER);
458
- const refreshLabel = escapeHtml(en_1.messages.APP_SCOPES_WEB_REFRESH);
459
- const refreshError = escapeHtml(en_1.messages.APP_SCOPES_WEB_REFRESH_FAILED);
460
- const footer = escapeHtml(en_1.messages.APP_SCOPES_WEB_FOOTER);
461
- const docsLink = escapeHtml(en_1.messages.APP_SCOPES_WEB_DOCS_LINK);
462
- const catalogDocsCta = escapeHtml(en_1.messages.APP_SCOPES_WEB_CATALOG_DOCS_CTA);
463
- const selectedPlaceholder = escapeHtml(en_1.messages.APP_SCOPES_WEB_SELECTED_PLACEHOLDER);
464
- const copySelected = escapeHtml(en_1.messages.APP_SCOPES_WEB_COPY_SELECTED);
465
- const labels = {
466
- empty: en_1.messages.APP_SCOPES_WEB_EMPTY,
467
- refreshing: en_1.messages.APP_SCOPES_WEB_REFRESHING,
468
- endpointsLabel: en_1.messages.APP_SCOPES_WEB_ENDPOINTS_LABEL,
469
- noEndpoints: en_1.messages.APP_SCOPES_WEB_NO_ENDPOINTS,
470
- copy: en_1.messages.APP_SCOPES_WEB_COPY,
471
- copied: en_1.messages.APP_SCOPES_WEB_COPIED,
472
- copyCategoryAria: en_1.messages.APP_SCOPES_WEB_COPY_CATEGORY_ARIA,
473
- selectScopeAria: en_1.messages.APP_SCOPES_WEB_SELECT_SCOPE_ARIA,
474
- legacyScope: constants_1.LEGACY_ALL_SCOPE,
475
- legacyBadge: en_1.messages.APP_SCOPES_WEB_LEGACY_BADGE,
476
- legacyTitle: en_1.messages.APP_SCOPES_WEB_LEGACY_TITLE,
477
- };
478
- return `<!doctype html>
479
- <html lang="en">
480
- <head>
481
- <meta charset="utf-8">
482
- <meta name="viewport" content="width=device-width, initial-scale=1">
483
- <title>${title}</title>
484
- <style>${STYLES}</style>
485
- </head>
486
- <body>
487
- <header class="hero">
488
- <div class="hero-inner">
489
- <div class="hero-copy">
490
- <h1>${title}</h1>
491
- <p class="intro">${introWithSpan}</p>
492
- </div>
493
- <a class="docs-cta" href="${constants_1.BREVO_OAUTH_SCOPES_DOCS_URL}" target="_blank" rel="noopener noreferrer">${catalogDocsCta} ↗</a>
494
- </div>
495
- </header>
496
- <main>
497
- <div class="toolbar">
498
- <input type="search" placeholder="${searchPlaceholder}" autofocus>
499
- <button id="refresh-btn" class="refresh" type="button">${refreshLabel}</button>
500
- </div>
501
- <p id="refresh-error" class="refresh-error" hidden>${refreshError}</p>
502
- <div class="selection-bar">
503
- <input id="selected-scopes" type="text" readonly placeholder="${selectedPlaceholder}" aria-label="${selectedPlaceholder}">
504
- <button id="copy-selected" class="copy" type="button" disabled>${copySelected}</button>
505
- </div>
506
- <div id="scopes-list"></div>
507
- <footer>${footer} <a href="${constants_1.BREVO_CLI_REFERENCE_URL}">${docsLink}</a></footer>
508
- </main>
509
- <script type="application/json" id="scopes-data">${safeJson(entries)}</script>
510
- <script type="application/json" id="labels">${safeJson(labels)}</script>
511
- <script>${SCRIPT}</script>
512
- </body>
513
- </html>
514
- `;
515
- }
516
- //# sourceMappingURL=scopes-html.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scopes-html.js","sourceRoot":"","sources":["../../src/services/scopes-html.ts"],"names":[],"mappings":";;AA0cA,4CAqEC;AA/gBD,gDAK0B;AAC1B,mCAAsC;AAGtC,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,KAAK;SACT,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC;SACxB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC;SACvB,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC;SACzB,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,mEAAmE;IACnE,0DAA0D;IAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAA,QAAQ,CAAC,CAAC;AACnE,CAAC;AAED,2EAA2E;AAC3E,yEAAyE;AACzE,2EAA2E;AAC3E,gCAAgC;AAChC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoPd,CAAC,IAAI,EAAE,CAAC;AAET,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsLd,CAAC,IAAI,EAAE,CAAC;AAET,SAAgB,gBAAgB,CAAC,OAAqB;IACpD,MAAM,KAAK,GAAG,UAAU,CAAC,aAAQ,CAAC,oBAAoB,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,aAAQ,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,EAAE,4BAAgB,CAAC,CAAC;IAC9E,2EAA2E;IAC3E,gDAAgD;IAChD,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAC7C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EACtB,2BAA2B,OAAO,CAAC,MAAM,SAAS,CACnD,CAAC;IACF,MAAM,iBAAiB,GAAG,UAAU,CAAC,aAAQ,CAAC,iCAAiC,CAAC,CAAC;IACjF,MAAM,YAAY,GAAG,UAAU,CAAC,aAAQ,CAAC,sBAAsB,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,UAAU,CAAC,aAAQ,CAAC,6BAA6B,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,UAAU,CAAC,aAAQ,CAAC,qBAAqB,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,UAAU,CAAC,aAAQ,CAAC,wBAAwB,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,UAAU,CAAC,aAAQ,CAAC,+BAA+B,CAAC,CAAC;IAC5E,MAAM,mBAAmB,GAAG,UAAU,CAAC,aAAQ,CAAC,mCAAmC,CAAC,CAAC;IACrF,MAAM,YAAY,GAAG,UAAU,CAAC,aAAQ,CAAC,4BAA4B,CAAC,CAAC;IAEvE,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,aAAQ,CAAC,oBAAoB;QACpC,UAAU,EAAE,aAAQ,CAAC,yBAAyB;QAC9C,cAAc,EAAE,aAAQ,CAAC,8BAA8B;QACvD,WAAW,EAAE,aAAQ,CAAC,2BAA2B;QACjD,IAAI,EAAE,aAAQ,CAAC,mBAAmB;QAClC,MAAM,EAAE,aAAQ,CAAC,qBAAqB;QACtC,gBAAgB,EAAE,aAAQ,CAAC,iCAAiC;QAC5D,eAAe,EAAE,aAAQ,CAAC,gCAAgC;QAC1D,WAAW,EAAE,4BAAgB;QAC7B,WAAW,EAAE,aAAQ,CAAC,2BAA2B;QACjD,WAAW,EAAE,aAAQ,CAAC,2BAA2B;KAClD,CAAC;IAEF,OAAO;;;;;SAKA,KAAK;SACL,MAAM;;;;;;YAMH,KAAK;yBACQ,aAAa;;gCAEN,uCAA2B,+CAA+C,cAAc;;;;;wCAKhF,iBAAiB;6DACI,YAAY;;uDAElB,YAAY;;oEAEC,mBAAmB,iBAAiB,mBAAmB;qEACtD,YAAY;;;YAGrE,MAAM,aAAa,mCAAuB,KAAK,QAAQ;;mDAEhB,QAAQ,CAAC,OAAO,CAAC;8CACtB,QAAQ,CAAC,MAAM,CAAC;UACpD,MAAM;;;CAGf,CAAC;AACF,CAAC"}
@@ -1,12 +0,0 @@
1
- import type { ScopeEntry } from './oauth-metadata';
2
- export interface ScopesWebServer {
3
- url: string;
4
- close: () => Promise<void>;
5
- }
6
- export interface ScopesWebOptions {
7
- /** Called by GET /scopes.json to re-fetch scopes on demand. Optional —
8
- * when omitted, the refresh button returns the initial entries unchanged. */
9
- refetch?: () => Promise<ScopeEntry[]>;
10
- }
11
- export declare function startScopesWebServer(initialEntries: ScopeEntry[], options?: ScopesWebOptions): Promise<ScopesWebServer>;
12
- //# sourceMappingURL=scopes-web.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scopes-web.d.ts","sourceRoot":"","sources":["../../src/services/scopes-web.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B;kFAC8E;IAC9E,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;CACvC;AAQD,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,UAAU,EAAE,EAC5B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAyD1B"}