@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
package/dist/lib/ui.js DELETED
@@ -1,75 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.stopActiveSpinner = stopActiveSpinner;
4
- exports.createSpinner = createSpinner;
5
- exports.printBox = printBox;
6
- const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
7
- let activeSpinner = null;
8
- /**
9
- * Stop the currently active spinner (if any).
10
- * Used by the re-auth handler to clear the spinner before prompting.
11
- */
12
- function stopActiveSpinner() {
13
- if (activeSpinner) {
14
- activeSpinner.stop();
15
- activeSpinner = null;
16
- }
17
- }
18
- function createSpinner(text, options) {
19
- stopActiveSpinner();
20
- const isTTY = process.stdout.isTTY === true;
21
- if (options?.silent || !isTTY) {
22
- if (!options?.silent) {
23
- process.stderr.write(` ${text}\n`);
24
- }
25
- return {
26
- update(t) {
27
- if (!options?.silent)
28
- process.stderr.write(` ${t}\n`);
29
- },
30
- stop(t) {
31
- if (t && !options?.silent)
32
- process.stderr.write(` ${t}\n`);
33
- },
34
- };
35
- }
36
- let frame = 0;
37
- let currentText = text;
38
- const interval = setInterval(() => {
39
- const spinner = SPINNER_FRAMES[frame % SPINNER_FRAMES.length];
40
- process.stdout.write(`\r \x1b[36m${spinner}\x1b[0m ${currentText}`);
41
- frame++;
42
- }, 80);
43
- const spinner = {
44
- update(t) {
45
- currentText = t;
46
- },
47
- stop(finalText) {
48
- clearInterval(interval);
49
- process.stdout.write('\r\x1b[K');
50
- if (finalText)
51
- process.stdout.write(` ${finalText}\n`);
52
- if (activeSpinner === spinner)
53
- activeSpinner = null;
54
- },
55
- };
56
- activeSpinner = spinner;
57
- return spinner;
58
- }
59
- function printBox(title, lines) {
60
- const maxLen = Math.max(title.length, ...lines.map((l) => stripAnsi(l).length));
61
- const border = '─'.repeat(maxLen + 2);
62
- process.stdout.write(`\n ┌${border}┐\n`);
63
- process.stdout.write(` │ \x1b[1m${title.padEnd(maxLen)}\x1b[0m │\n`);
64
- process.stdout.write(` ├${border}┤\n`);
65
- for (const line of lines) {
66
- const pad = maxLen - stripAnsi(line).length;
67
- process.stdout.write(` │ ${line}${' '.repeat(pad)} │\n`);
68
- }
69
- process.stdout.write(` └${border}┘\n\n`);
70
- }
71
- function stripAnsi(str) {
72
- // eslint-disable-next-line no-control-regex
73
- return str.replace(/\x1b\[[0-9;]*m/g, '');
74
- }
75
- //# sourceMappingURL=ui.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/lib/ui.ts"],"names":[],"mappings":"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"}
@@ -1,37 +0,0 @@
1
- export interface PkgInfo {
2
- name: string;
3
- version: string;
4
- }
5
- export interface UpdateCheckCache {
6
- latest: string;
7
- lastChecked: number;
8
- }
9
- export interface UpdateNotifierOptions {
10
- pkg: PkgInfo;
11
- argv?: readonly string[];
12
- env?: NodeJS.ProcessEnv;
13
- isTTY?: boolean;
14
- cachePath?: string;
15
- fetchImpl?: typeof fetch;
16
- now?: () => number;
17
- ttlMs?: number;
18
- fetchTimeoutMs?: number;
19
- }
20
- export declare function shouldShowBannerBefore(argv: readonly string[]): boolean;
21
- export declare function shouldSkipCheck(opts: UpdateNotifierOptions): boolean;
22
- export declare function compareVersions(current: string, latest: string): number;
23
- export declare function isNewer(current: string, latest: string): boolean;
24
- export declare function isMajorBehind(current: string, latest: string): boolean;
25
- export declare function readCache(cachePath: string): UpdateCheckCache | undefined;
26
- export declare function writeCache(cachePath: string, cache: UpdateCheckCache): void;
27
- export declare function fetchLatestVersion(name: string, opts?: UpdateNotifierOptions): Promise<string | undefined>;
28
- export declare function formatBanner(current: string, latest: string, name: string): string;
29
- export declare function formatForceUpdateBanner(current: string, latest: string, name: string): string;
30
- export interface UpdateCheckHandle {
31
- cachedLatest?: string;
32
- pending: Promise<void>;
33
- }
34
- export declare function startUpdateCheck(opts: UpdateNotifierOptions): UpdateCheckHandle;
35
- export declare function notifyUpdate(handle: UpdateCheckHandle, pkg: PkgInfo, output?: NodeJS.WriteStream, waitMs?: number): Promise<void>;
36
- export declare function enforceMinVersion(handle: UpdateCheckHandle, pkg: PkgInfo, output?: NodeJS.WriteStream, waitMs?: number): Promise<boolean>;
37
- //# sourceMappingURL=update-notifier.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-notifier.d.ts","sourceRoot":"","sources":["../../src/lib/update-notifier.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAYD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAMvE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAYpE;AAmDD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAUvE;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhE;AAKD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAKtE;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAgBzE;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAO3E;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,qBAAqB,GAC3B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAkB7B;AAWD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOlF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ7F;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,qBAAqB,GAAG,iBAAiB,CA8B/E;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,iBAAiB,EACzB,GAAG,EAAE,OAAO,EACZ,MAAM,GAAE,MAAM,CAAC,WAA4B,EAC3C,MAAM,GAAE,MAAuB,GAC9B,OAAO,CAAC,IAAI,CAAC,CASf;AAUD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,iBAAiB,EACzB,GAAG,EAAE,OAAO,EACZ,MAAM,GAAE,MAAM,CAAC,WAA4B,EAC3C,MAAM,GAAE,MAAuB,GAC9B,OAAO,CAAC,OAAO,CAAC,CAWlB"}
@@ -1,298 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.shouldShowBannerBefore = shouldShowBannerBefore;
37
- exports.shouldSkipCheck = shouldSkipCheck;
38
- exports.compareVersions = compareVersions;
39
- exports.isNewer = isNewer;
40
- exports.isMajorBehind = isMajorBehind;
41
- exports.readCache = readCache;
42
- exports.writeCache = writeCache;
43
- exports.fetchLatestVersion = fetchLatestVersion;
44
- exports.formatBanner = formatBanner;
45
- exports.formatForceUpdateBanner = formatForceUpdateBanner;
46
- exports.startUpdateCheck = startUpdateCheck;
47
- exports.notifyUpdate = notifyUpdate;
48
- exports.enforceMinVersion = enforceMinVersion;
49
- const fs = __importStar(require("node:fs"));
50
- const os = __importStar(require("node:os"));
51
- const path = __importStar(require("node:path"));
52
- const en_1 = require("../lang/en");
53
- const REGISTRY_URL = (name) => `https://registry.npmjs.org/${encodeURIComponent(name).replace('%40', '@')}/latest`;
54
- const TTL_MS = 24 * 60 * 60 * 1000;
55
- const FETCH_TIMEOUT_MS = 2000;
56
- const NOTIFY_WAIT_MS = 1500;
57
- const CACHE_FILE = 'update-check.json';
58
- function getCachePath(override, env = process.env) {
59
- if (override)
60
- return override;
61
- const dir = env.BREVO_CONFIG_HOME || path.join(os.homedir(), '.brevo');
62
- return path.join(dir, CACHE_FILE);
63
- }
64
- // True when the banner must print before parseAsync runs, either because
65
- // Commander exits synchronously (bare `brevo`, --help, --version) and would
66
- // bypass the post-run notify, or because the command starts a long interactive
67
- // flow where users should see the upgrade up front.
68
- function shouldShowBannerBefore(argv) {
69
- const args = argv.slice(2);
70
- if (args.length === 0)
71
- return true;
72
- if (args.includes('--help') || args.includes('-h'))
73
- return true;
74
- if (args.includes('--version') || args.includes('-V'))
75
- return true;
76
- return args[0] === 'app' && (args[1] === 'init' || args[1] === 'create');
77
- }
78
- function shouldSkipCheck(opts) {
79
- const env = opts.env ?? process.env;
80
- const argv = opts.argv ?? process.argv;
81
- const isTTY = opts.isTTY ?? Boolean(process.stdout.isTTY);
82
- if (env.CI === 'true' || env.CI === '1')
83
- return true;
84
- if (!isTTY)
85
- return true;
86
- if (env.NO_UPDATE_NOTIFIER === '1' || env.NO_UPDATE_NOTIFIER === 'true')
87
- return true;
88
- if (env.BREVO_NO_UPDATE_NOTIFIER === '1' || env.BREVO_NO_UPDATE_NOTIFIER === 'true')
89
- return true;
90
- if (argv.includes('--no-update-notifier'))
91
- return true;
92
- return false;
93
- }
94
- function parseVersion(v) {
95
- const match = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?/.exec(v.trim());
96
- if (!match?.[1] || !match?.[2] || !match?.[3])
97
- return undefined;
98
- return {
99
- major: Number.parseInt(match[1], 10),
100
- minor: Number.parseInt(match[2], 10),
101
- patch: Number.parseInt(match[3], 10),
102
- prerelease: match[4] ?? '',
103
- };
104
- }
105
- // Numeric identifiers are compared numerically and always rank below
106
- // non-numeric ones (semver §11.4).
107
- function comparePrereleaseIdentifiers(ai, bi) {
108
- if (ai === bi)
109
- return 0;
110
- const aNum = /^\d+$/.test(ai);
111
- const bNum = /^\d+$/.test(bi);
112
- if (aNum && bNum) {
113
- const diff = Number.parseInt(ai, 10) - Number.parseInt(bi, 10);
114
- if (diff === 0)
115
- return 0;
116
- return diff > 0 ? 1 : -1;
117
- }
118
- if (aNum)
119
- return -1;
120
- if (bNum)
121
- return 1;
122
- return ai > bi ? 1 : -1;
123
- }
124
- // Per semver §11.4: split on '.', compare identifiers; a longer prerelease
125
- // set outranks a shorter one when the leading identifiers match.
126
- function comparePrerelease(a, b) {
127
- if (a === b)
128
- return 0;
129
- const aParts = a.split('.');
130
- const bParts = b.split('.');
131
- const len = Math.min(aParts.length, bParts.length);
132
- for (let i = 0; i < len; i++) {
133
- const cmp = comparePrereleaseIdentifiers(aParts[i] ?? '', bParts[i] ?? '');
134
- if (cmp !== 0)
135
- return cmp;
136
- }
137
- if (aParts.length === bParts.length)
138
- return 0;
139
- return aParts.length > bParts.length ? 1 : -1;
140
- }
141
- function compareVersions(current, latest) {
142
- const c = parseVersion(current);
143
- const l = parseVersion(latest);
144
- if (!c || !l)
145
- return 0;
146
- if (l.major !== c.major)
147
- return l.major - c.major;
148
- if (l.minor !== c.minor)
149
- return l.minor - c.minor;
150
- if (l.patch !== c.patch)
151
- return l.patch - c.patch;
152
- if (c.prerelease && !l.prerelease)
153
- return 1;
154
- if (!c.prerelease && l.prerelease)
155
- return -1;
156
- return comparePrerelease(l.prerelease, c.prerelease);
157
- }
158
- function isNewer(current, latest) {
159
- return compareVersions(current, latest) > 0;
160
- }
161
- // True when `latest` is at least one full major version ahead of `current`.
162
- // Used to gate the blocking force-update banner — a new major release is the
163
- // signal that the installed CLI may no longer be supported by the backend.
164
- function isMajorBehind(current, latest) {
165
- const c = parseVersion(current);
166
- const l = parseVersion(latest);
167
- if (!c || !l)
168
- return false;
169
- return l.major > c.major;
170
- }
171
- function readCache(cachePath) {
172
- try {
173
- const raw = JSON.parse(fs.readFileSync(cachePath, 'utf-8'));
174
- if (raw &&
175
- typeof raw === 'object' &&
176
- typeof raw.latest === 'string' &&
177
- typeof raw.lastChecked === 'number' &&
178
- Number.isFinite(raw.lastChecked)) {
179
- return { latest: raw.latest, lastChecked: raw.lastChecked };
180
- }
181
- }
182
- catch {
183
- // missing or corrupt — caller treats as no cache
184
- }
185
- return undefined;
186
- }
187
- function writeCache(cachePath, cache) {
188
- try {
189
- fs.mkdirSync(path.dirname(cachePath), { recursive: true, mode: 0o700 });
190
- fs.writeFileSync(cachePath, JSON.stringify(cache, null, 2), 'utf-8');
191
- }
192
- catch {
193
- // non-fatal — banner still works from in-memory value
194
- }
195
- }
196
- async function fetchLatestVersion(name, opts) {
197
- const fetchImpl = opts?.fetchImpl ?? fetch;
198
- const timeoutMs = opts?.fetchTimeoutMs ?? FETCH_TIMEOUT_MS;
199
- const controller = new AbortController();
200
- const timer = setTimeout(() => controller.abort(), timeoutMs);
201
- try {
202
- const res = await fetchImpl(REGISTRY_URL(name), {
203
- signal: controller.signal,
204
- headers: { Accept: 'application/json' },
205
- });
206
- if (!res.ok)
207
- return undefined;
208
- const json = (await res.json());
209
- return typeof json.version === 'string' ? json.version : undefined;
210
- }
211
- catch {
212
- return undefined;
213
- }
214
- finally {
215
- clearTimeout(timer);
216
- }
217
- }
218
- // Renders the lines into a bordered box, auto-sized to the longest line.
219
- function renderBox(lines) {
220
- const inner = Math.max(...lines.map((l) => l.length)) + 4;
221
- const top = '╭' + '─'.repeat(inner) + '╮';
222
- const bot = '╰' + '─'.repeat(inner) + '╯';
223
- const pad = (s) => ' ' + s + ' '.repeat(inner - s.length - 2);
224
- return ['', ` ${top}`, ...lines.map((l) => ` │${pad(l)}│`), ` ${bot}`, ''].join('\n');
225
- }
226
- function formatBanner(current, latest, name) {
227
- return renderBox([
228
- en_1.messages.UPDATE_AVAILABLE(current, latest),
229
- en_1.messages.UPDATE_RUN(name),
230
- en_1.messages.UPDATE_RUN_YARN(name),
231
- en_1.messages.UPDATE_RUN_BREW,
232
- ]);
233
- }
234
- function formatForceUpdateBanner(current, latest, name) {
235
- return renderBox([
236
- en_1.messages.FORCE_UPDATE_REQUIRED(current, latest),
237
- en_1.messages.FORCE_UPDATE_HINT,
238
- en_1.messages.UPDATE_RUN(name),
239
- en_1.messages.UPDATE_RUN_YARN(name),
240
- en_1.messages.UPDATE_RUN_BREW,
241
- ]);
242
- }
243
- function startUpdateCheck(opts) {
244
- if (shouldSkipCheck(opts)) {
245
- return { pending: Promise.resolve() };
246
- }
247
- const cachePath = getCachePath(opts.cachePath, opts.env);
248
- const now = opts.now ? opts.now() : Date.now();
249
- const ttl = opts.ttlMs ?? TTL_MS;
250
- const cache = readCache(cachePath);
251
- const stale = !cache || now - cache.lastChecked > ttl;
252
- if (!stale) {
253
- return { cachedLatest: cache?.latest, pending: Promise.resolve() };
254
- }
255
- const handle = {
256
- cachedLatest: cache?.latest,
257
- pending: Promise.resolve(),
258
- };
259
- handle.pending = (async () => {
260
- const latest = await fetchLatestVersion(opts.pkg.name, opts);
261
- if (latest) {
262
- // Prefer the freshly fetched version so first-run users (no cache)
263
- // and stale-cache users see the banner without waiting another run.
264
- handle.cachedLatest = latest;
265
- writeCache(cachePath, { latest, lastChecked: now });
266
- }
267
- })();
268
- return handle;
269
- }
270
- async function notifyUpdate(handle, pkg, output = process.stderr, waitMs = NOTIFY_WAIT_MS) {
271
- await Promise.race([
272
- handle.pending,
273
- new Promise((resolve) => setTimeout(resolve, waitMs).unref?.()),
274
- ]);
275
- if (handle.cachedLatest && isNewer(pkg.version, handle.cachedLatest)) {
276
- output.write(formatBanner(pkg.version, handle.cachedLatest, pkg.name) + '\n');
277
- }
278
- }
279
- // Blocking force-update gate. When the latest npm version is a full major
280
- // version ahead of the installed one, writes the force-update banner and
281
- // returns true so the caller can stop before running the command.
282
- //
283
- // Fails open: if the version check was skipped (CI / non-TTY / opt-out, in
284
- // which case the handle has no cachedLatest) or the fetch hasn't resolved
285
- // within waitMs, returns false so a slow or unreachable npm registry never
286
- // blocks the user.
287
- async function enforceMinVersion(handle, pkg, output = process.stderr, waitMs = NOTIFY_WAIT_MS) {
288
- await Promise.race([
289
- handle.pending,
290
- new Promise((resolve) => setTimeout(resolve, waitMs).unref?.()),
291
- ]);
292
- if (handle.cachedLatest && isMajorBehind(pkg.version, handle.cachedLatest)) {
293
- output.write(formatForceUpdateBanner(pkg.version, handle.cachedLatest, pkg.name) + '\n');
294
- return true;
295
- }
296
- return false;
297
- }
298
- //# sourceMappingURL=update-notifier.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update-notifier.js","sourceRoot":"","sources":["../../src/lib/update-notifier.ts"],"names":[],"mappings":"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"}
@@ -1,55 +0,0 @@
1
- /**
2
- * Validate an app name: alphanumeric, spaces, hyphens, dots, underscores,
3
- * and accented/extended Latin characters only. Max 48 characters.
4
- * Returns true if valid, or an error string for inquirer prompts.
5
- */
6
- export declare function validateAppName(name: string): true | string;
7
- /**
8
- * Validate that a value is one of the allowed options.
9
- * Throws CliError with a user-friendly message if invalid.
10
- */
11
- export declare function validateEnum(value: string | undefined, allowed: readonly string[], flagName: string): void;
12
- /**
13
- * Validate that a string is a valid HTTP/HTTPS URL.
14
- * Throws CliError if the format is invalid.
15
- */
16
- export declare function validateUrl(value: string | undefined, fieldName: string): void;
17
- /**
18
- * Commander.js collect function for repeatable --redirect-uri flags.
19
- * Validates each URL and accumulates into an array.
20
- */
21
- export declare function collectUrls(value: string, previous?: string[]): string[];
22
- /**
23
- * Split a scope string or array of strings into individual scope tokens.
24
- * Handles embedded commas/whitespace, trims, drops empties, dedupes.
25
- * Does NOT validate token format — use `validateScopes` for that.
26
- */
27
- export declare function splitScopes(input: string | string[] | undefined | null): string[];
28
- /**
29
- * Validate that each scope is a well-formed token.
30
- * Throws CliError with a user-facing message if any scope is invalid.
31
- */
32
- export declare function validateScopes(scopes: string[]): void;
33
- /**
34
- * Commander.js collect function for repeatable --scope flags.
35
- * Splits each value on commas/whitespace, validates the resulting tokens,
36
- * and accumulates into an array (deduplicated against previous values).
37
- */
38
- export declare function collectScopes(value: string, previous?: string[]): string[];
39
- /**
40
- * Returns true iff the scope list contains the deprecated legacy 'all' scope.
41
- * Every code path that warns or blocks on the legacy scope calls this helper —
42
- * no scattered string literals (BEX-214).
43
- */
44
- export declare function containsLegacyAllScope(scopes: string[] | undefined): boolean;
45
- /**
46
- * Validate that a value is a positive integer.
47
- * Throws CliError if the value is not a valid positive integer.
48
- */
49
- export declare function parsePositiveInt(value: string, flagName: string): number;
50
- /**
51
- * Parse and validate a `--app-id` flag value.
52
- * Accepts any non-empty trimmed string (numeric or UUID).
53
- */
54
- export declare function parseAppId(value: string): string;
55
- //# sourceMappingURL=validators.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/lib/validators.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAU3D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,QAAQ,EAAE,MAAM,GACf,IAAI,CAIN;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAkB9E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAG5E;AAWD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,EAAE,CAejF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAQrD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAW9E;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAE5E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMxE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhD"}
@@ -1,166 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateAppName = validateAppName;
4
- exports.validateEnum = validateEnum;
5
- exports.validateUrl = validateUrl;
6
- exports.collectUrls = collectUrls;
7
- exports.splitScopes = splitScopes;
8
- exports.validateScopes = validateScopes;
9
- exports.collectScopes = collectScopes;
10
- exports.containsLegacyAllScope = containsLegacyAllScope;
11
- exports.parsePositiveInt = parsePositiveInt;
12
- exports.parseAppId = parseAppId;
13
- const errors_1 = require("./errors");
14
- const constants_1 = require("./constants");
15
- const APP_NAME_MAX_LENGTH = 48;
16
- const APP_NAME_REGEX = /^[a-zA-Z0-9 ._\-\u00C0-\u024F]+$/;
17
- /**
18
- * Validate an app name: alphanumeric, spaces, hyphens, dots, underscores,
19
- * and accented/extended Latin characters only. Max 48 characters.
20
- * Returns true if valid, or an error string for inquirer prompts.
21
- */
22
- function validateAppName(name) {
23
- const trimmed = name.trim();
24
- if (trimmed.length === 0)
25
- return 'App name cannot be empty.';
26
- if (trimmed.length > APP_NAME_MAX_LENGTH) {
27
- return `App name must be at most ${APP_NAME_MAX_LENGTH} characters (got ${trimmed.length}).`;
28
- }
29
- if (!APP_NAME_REGEX.test(trimmed)) {
30
- return 'App name can only contain letters, numbers, spaces, hyphens, dots, underscores, and accented characters.';
31
- }
32
- return true;
33
- }
34
- /**
35
- * Validate that a value is one of the allowed options.
36
- * Throws CliError with a user-friendly message if invalid.
37
- */
38
- function validateEnum(value, allowed, flagName) {
39
- if (value && !allowed.includes(value)) {
40
- throw new errors_1.CliError(`Invalid ${flagName} "${value}". Must be one of: ${allowed.join(', ')}.`);
41
- }
42
- }
43
- /**
44
- * Validate that a string is a valid HTTP/HTTPS URL.
45
- * Throws CliError if the format is invalid.
46
- */
47
- function validateUrl(value, fieldName) {
48
- if (!value)
49
- return;
50
- // Reject whitespace and commas early — Node's URL parser silently percent-encodes
51
- // spaces, so "http://a/cb, http://b/cb" parses as a single valid URL. That has let
52
- // comma-separated values sneak into redirect_uris as one corrupted entry.
53
- if (/[\s,]/.test(value)) {
54
- throw new errors_1.CliError(`Invalid ${fieldName}: "${value}" contains whitespace or a comma. Pass each URL with a separate --redirect-uri flag.`);
55
- }
56
- try {
57
- const parsed = new URL(value);
58
- if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
59
- throw new Error('bad protocol');
60
- }
61
- }
62
- catch {
63
- throw new errors_1.CliError(`Invalid ${fieldName}: "${value}" is not a valid HTTP/HTTPS URL.`);
64
- }
65
- }
66
- /**
67
- * Commander.js collect function for repeatable --redirect-uri flags.
68
- * Validates each URL and accumulates into an array.
69
- */
70
- function collectUrls(value, previous = []) {
71
- validateUrl(value, 'redirect URL');
72
- return [...previous, value];
73
- }
74
- // OAuth scope tokens are split on commas and whitespace at every boundary
75
- // (app-config.json reads and --scope flag values) so a user can write either
76
- // "crm:read crm:write" or "crm:read, crm:write" or one --scope per token and
77
- // the CLI behaves the same. RFC 6749 §3.3 already mandates space-separation in
78
- // authorization requests, so the split is consistent with the protocol; the
79
- // comma is a convenience for users editing JSON arrays.
80
- const SCOPE_TOKEN_REGEX = /^[A-Za-z0-9][A-Za-z0-9:_.-]*$/;
81
- const SCOPE_SPLIT_REGEX = /[\s,]+/;
82
- /**
83
- * Split a scope string or array of strings into individual scope tokens.
84
- * Handles embedded commas/whitespace, trims, drops empties, dedupes.
85
- * Does NOT validate token format — use `validateScopes` for that.
86
- */
87
- function splitScopes(input) {
88
- if (input == null)
89
- return [];
90
- const values = Array.isArray(input) ? input : [input];
91
- const out = [];
92
- const seen = new Set();
93
- for (const v of values) {
94
- if (typeof v !== 'string')
95
- continue;
96
- for (const token of v.split(SCOPE_SPLIT_REGEX)) {
97
- if (!token)
98
- continue;
99
- if (seen.has(token))
100
- continue;
101
- seen.add(token);
102
- out.push(token);
103
- }
104
- }
105
- return out;
106
- }
107
- /**
108
- * Validate that each scope is a well-formed token.
109
- * Throws CliError with a user-facing message if any scope is invalid.
110
- */
111
- function validateScopes(scopes) {
112
- for (const scope of scopes) {
113
- if (!SCOPE_TOKEN_REGEX.test(scope)) {
114
- throw new errors_1.CliError(`Invalid scope: "${scope}" — scopes can only contain letters, numbers, ':', '_', '.', '-'.`);
115
- }
116
- }
117
- }
118
- /**
119
- * Commander.js collect function for repeatable --scope flags.
120
- * Splits each value on commas/whitespace, validates the resulting tokens,
121
- * and accumulates into an array (deduplicated against previous values).
122
- */
123
- function collectScopes(value, previous = []) {
124
- const tokens = splitScopes(value);
125
- if (tokens.length === 0) {
126
- throw new errors_1.CliError('Invalid scope: value cannot be empty.');
127
- }
128
- validateScopes(tokens);
129
- const out = [...previous];
130
- for (const t of tokens) {
131
- if (!out.includes(t))
132
- out.push(t);
133
- }
134
- return out;
135
- }
136
- /**
137
- * Returns true iff the scope list contains the deprecated legacy 'all' scope.
138
- * Every code path that warns or blocks on the legacy scope calls this helper —
139
- * no scattered string literals (BEX-214).
140
- */
141
- function containsLegacyAllScope(scopes) {
142
- return scopes?.includes(constants_1.LEGACY_ALL_SCOPE) ?? false;
143
- }
144
- /**
145
- * Validate that a value is a positive integer.
146
- * Throws CliError if the value is not a valid positive integer.
147
- */
148
- function parsePositiveInt(value, flagName) {
149
- const n = Number.parseInt(value, 10);
150
- if (!Number.isFinite(n) || n <= 0) {
151
- throw new errors_1.CliError(`Invalid ${flagName}: "${value}" is not a positive integer.`);
152
- }
153
- return n;
154
- }
155
- /**
156
- * Parse and validate a `--app-id` flag value.
157
- * Accepts any non-empty trimmed string (numeric or UUID).
158
- */
159
- function parseAppId(value) {
160
- const trimmed = value.trim();
161
- if (trimmed.length === 0) {
162
- throw new errors_1.CliError('Invalid --app-id: value cannot be empty.');
163
- }
164
- return trimmed;
165
- }
166
- //# sourceMappingURL=validators.js.map