@jilimb0/tgwrapper 0.4.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 (102) hide show
  1. package/README.md +38 -0
  2. package/dist/adapters/aws-lambda-handler.d.ts +29 -0
  3. package/dist/adapters/aws-lambda-handler.d.ts.map +1 -0
  4. package/dist/adapters/aws-lambda-handler.js +39 -0
  5. package/dist/adapters/aws-lambda-handler.js.map +1 -0
  6. package/dist/adapters/cloudflare-worker-handler.d.ts +7 -0
  7. package/dist/adapters/cloudflare-worker-handler.d.ts.map +1 -0
  8. package/dist/adapters/cloudflare-worker-handler.js +24 -0
  9. package/dist/adapters/cloudflare-worker-handler.js.map +1 -0
  10. package/dist/adapters/node-http-handler.d.ts +20 -0
  11. package/dist/adapters/node-http-handler.d.ts.map +1 -0
  12. package/dist/adapters/node-http-handler.js +41 -0
  13. package/dist/adapters/node-http-handler.js.map +1 -0
  14. package/dist/adapters/webhook-handler.d.ts +14 -0
  15. package/dist/adapters/webhook-handler.d.ts.map +1 -0
  16. package/dist/adapters/webhook-handler.js +54 -0
  17. package/dist/adapters/webhook-handler.js.map +1 -0
  18. package/dist/core/api-client.d.ts +18 -0
  19. package/dist/core/api-client.d.ts.map +1 -0
  20. package/dist/core/api-client.js +139 -0
  21. package/dist/core/api-client.js.map +1 -0
  22. package/dist/core/bot-kernel.d.ts +29 -0
  23. package/dist/core/bot-kernel.d.ts.map +1 -0
  24. package/dist/core/bot-kernel.js +99 -0
  25. package/dist/core/bot-kernel.js.map +1 -0
  26. package/dist/core/circuit-breaker.d.ts +19 -0
  27. package/dist/core/circuit-breaker.d.ts.map +1 -0
  28. package/dist/core/circuit-breaker.js +59 -0
  29. package/dist/core/circuit-breaker.js.map +1 -0
  30. package/dist/core/context.d.ts +29 -0
  31. package/dist/core/context.d.ts.map +1 -0
  32. package/dist/core/context.js +67 -0
  33. package/dist/core/context.js.map +1 -0
  34. package/dist/core/errors.d.ts +21 -0
  35. package/dist/core/errors.d.ts.map +1 -0
  36. package/dist/core/errors.js +45 -0
  37. package/dist/core/errors.js.map +1 -0
  38. package/dist/fsm/session-manager.d.ts +22 -0
  39. package/dist/fsm/session-manager.d.ts.map +1 -0
  40. package/dist/fsm/session-manager.js +79 -0
  41. package/dist/fsm/session-manager.js.map +1 -0
  42. package/dist/guards/bounded-concurrency.d.ts +14 -0
  43. package/dist/guards/bounded-concurrency.d.ts.map +1 -0
  44. package/dist/guards/bounded-concurrency.js +48 -0
  45. package/dist/guards/bounded-concurrency.js.map +1 -0
  46. package/dist/guards/token-bucket-rate-limiter.d.ts +11 -0
  47. package/dist/guards/token-bucket-rate-limiter.d.ts.map +1 -0
  48. package/dist/guards/token-bucket-rate-limiter.js +27 -0
  49. package/dist/guards/token-bucket-rate-limiter.js.map +1 -0
  50. package/dist/index.d.ts +27 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +23 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/observability/ecs-logger.d.ts +18 -0
  55. package/dist/observability/ecs-logger.d.ts.map +1 -0
  56. package/dist/observability/ecs-logger.js +42 -0
  57. package/dist/observability/ecs-logger.js.map +1 -0
  58. package/dist/observability/metrics.d.ts +12 -0
  59. package/dist/observability/metrics.d.ts.map +1 -0
  60. package/dist/observability/metrics.js +31 -0
  61. package/dist/observability/metrics.js.map +1 -0
  62. package/dist/router/router.d.ts +30 -0
  63. package/dist/router/router.d.ts.map +1 -0
  64. package/dist/router/router.js +62 -0
  65. package/dist/router/router.js.map +1 -0
  66. package/dist/runtime/bot-runtime.d.ts +25 -0
  67. package/dist/runtime/bot-runtime.d.ts.map +1 -0
  68. package/dist/runtime/bot-runtime.js +59 -0
  69. package/dist/runtime/bot-runtime.js.map +1 -0
  70. package/dist/storage/memory-session-storage.d.ts +12 -0
  71. package/dist/storage/memory-session-storage.d.ts.map +1 -0
  72. package/dist/storage/memory-session-storage.js +53 -0
  73. package/dist/storage/memory-session-storage.js.map +1 -0
  74. package/dist/storage/redis-session-storage.d.ts +45 -0
  75. package/dist/storage/redis-session-storage.d.ts.map +1 -0
  76. package/dist/storage/redis-session-storage.js +101 -0
  77. package/dist/storage/redis-session-storage.js.map +1 -0
  78. package/dist/tenant/key-namespace.d.ts +7 -0
  79. package/dist/tenant/key-namespace.d.ts.map +1 -0
  80. package/dist/tenant/key-namespace.js +7 -0
  81. package/dist/tenant/key-namespace.js.map +1 -0
  82. package/dist/types/core.d.ts +106 -0
  83. package/dist/types/core.d.ts.map +1 -0
  84. package/dist/types/core.js +2 -0
  85. package/dist/types/core.js.map +1 -0
  86. package/dist/types/telegram.d.ts +2 -0
  87. package/dist/types/telegram.d.ts.map +1 -0
  88. package/dist/types/telegram.js +2 -0
  89. package/dist/types/telegram.js.map +1 -0
  90. package/dist/update-loop/polling.d.ts +13 -0
  91. package/dist/update-loop/polling.d.ts.map +1 -0
  92. package/dist/update-loop/polling.js +40 -0
  93. package/dist/update-loop/polling.js.map +1 -0
  94. package/dist/update-loop/update-validator.d.ts +4 -0
  95. package/dist/update-loop/update-validator.d.ts.map +1 -0
  96. package/dist/update-loop/update-validator.js +17 -0
  97. package/dist/update-loop/update-validator.js.map +1 -0
  98. package/dist/update-loop/webhook.d.ts +15 -0
  99. package/dist/update-loop/webhook.d.ts.map +1 -0
  100. package/dist/update-loop/webhook.js +30 -0
  101. package/dist/update-loop/webhook.js.map +1 -0
  102. package/package.json +55 -0
@@ -0,0 +1,2 @@
1
+ export type { ApiMethods, CallbackQuery, Chat, Message, Update, User } from '@grammyjs/types';
2
+ //# sourceMappingURL=telegram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../../src/types/telegram.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,aAAa,EACb,IAAI,EACJ,OAAO,EACP,MAAM,EACN,IAAI,EACL,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/types/telegram.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import type { ApiClient } from '../core/api-client.js';
2
+ import type { PollingOptions, UpdateSource } from '../types/core.js';
3
+ import type { Update } from '../types/telegram.js';
4
+ export declare class PollingSource implements UpdateSource {
5
+ private readonly apiClient;
6
+ private readonly options;
7
+ private running;
8
+ private offset;
9
+ constructor(apiClient: ApiClient, options?: PollingOptions);
10
+ run(onUpdate: (update: Update) => Promise<void>): Promise<void>;
11
+ stop(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=polling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polling.d.ts","sourceRoot":"","sources":["../../src/update-loop/polling.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAUnD,qBAAa,aAAc,YAAW,YAAY;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAK;gBAEA,SAAS,EAAE,SAAS,EAAE,OAAO,GAAE,cAAmB;IAUxD,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B/D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAGnC"}
@@ -0,0 +1,40 @@
1
+ import { isFreshUpdate, isValidTelegramUpdate } from './update-validator.js';
2
+ export class PollingSource {
3
+ apiClient;
4
+ options;
5
+ running = false;
6
+ offset = 0;
7
+ constructor(apiClient, options = {}) {
8
+ this.apiClient = apiClient;
9
+ this.options = {
10
+ limit: options.limit ?? 100,
11
+ timeoutSeconds: options.timeoutSeconds ?? 30,
12
+ dropPendingUpdates: options.dropPendingUpdates ?? true,
13
+ signal: options.signal
14
+ };
15
+ }
16
+ async run(onUpdate) {
17
+ this.running = true;
18
+ while (this.running && !this.options.signal?.aborted) {
19
+ const response = await this.apiClient.callApi('getUpdates', {
20
+ offset: this.offset,
21
+ timeout: this.options.timeoutSeconds,
22
+ limit: this.options.limit
23
+ });
24
+ for (const update of response) {
25
+ this.offset = update.update_id + 1;
26
+ if (!isValidTelegramUpdate(update)) {
27
+ continue;
28
+ }
29
+ if (this.options.dropPendingUpdates && !isFreshUpdate(update)) {
30
+ continue;
31
+ }
32
+ await onUpdate(update);
33
+ }
34
+ }
35
+ }
36
+ async stop() {
37
+ this.running = false;
38
+ }
39
+ }
40
+ //# sourceMappingURL=polling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"polling.js","sourceRoot":"","sources":["../../src/update-loop/polling.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAS7E,MAAM,OAAO,aAAa;IACP,SAAS,CAAY;IACrB,OAAO,CAAyB;IACzC,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,GAAG,CAAC,CAAC;IAEnB,YAAmB,SAAoB,EAAE,UAA0B,EAAE;QACnE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG;YACb,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG;YAC3B,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;YAC5C,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,IAAI,IAAI;YACtD,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,QAA2C;QAC1D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAW,YAAY,EAAE;gBACpE,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;gBACpC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK;aAC1B,CAAC,CAAC;YAEH,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;gBAEnC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;oBACnC,SAAS;gBACX,CAAC;gBAED,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC9D,SAAS;gBACX,CAAC;gBAED,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { Update } from '../types/telegram.js';
2
+ export declare function isValidTelegramUpdate(value: unknown): value is Update;
3
+ export declare function isFreshUpdate(update: Update, nowMs?: number): boolean;
4
+ //# sourceMappingURL=update-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-validator.d.ts","sourceRoot":"","sources":["../../src/update-loop/update-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAInD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAOrE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAa,GAAG,OAAO,CAQzE"}
@@ -0,0 +1,17 @@
1
+ const FIVE_MINUTES_MS = 5 * 60 * 1000;
2
+ export function isValidTelegramUpdate(value) {
3
+ if (typeof value !== 'object' || value === null) {
4
+ return false;
5
+ }
6
+ const candidate = value;
7
+ return typeof candidate.update_id === 'number';
8
+ }
9
+ export function isFreshUpdate(update, nowMs = Date.now()) {
10
+ const messageDate = update.message?.date ?? update.callback_query?.message?.date;
11
+ if (!messageDate) {
12
+ return true;
13
+ }
14
+ const ageMs = nowMs - messageDate * 1000;
15
+ return ageMs <= FIVE_MINUTES_MS;
16
+ }
17
+ //# sourceMappingURL=update-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-validator.js","sourceRoot":"","sources":["../../src/update-loop/update-validator.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEtC,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,KAAgC,CAAC;IACnD,OAAO,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE;IAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,MAAM,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC;IACjF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,GAAG,WAAW,GAAG,IAAI,CAAC;IACzC,OAAO,KAAK,IAAI,eAAe,CAAC;AAClC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Update } from '../types/telegram.js';
2
+ import type { UpdateSource } from '../types/core.js';
3
+ export interface WebhookValidationOptions {
4
+ headerName: string;
5
+ secretToken: string;
6
+ }
7
+ export declare class WebhookSource implements UpdateSource {
8
+ private readonly updates;
9
+ private running;
10
+ run(onUpdate: (update: Update) => Promise<void>): Promise<void>;
11
+ stop(): Promise<void>;
12
+ ingest(update: unknown): void;
13
+ validateSignature(headers: Record<string, string | undefined>, options: WebhookValidationOptions): boolean;
14
+ }
15
+ //# sourceMappingURL=webhook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/update-loop/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,aAAc,YAAW,YAAY;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,OAAO,CAAS;IAEX,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAO7B,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,OAAO,EAAE,wBAAwB,GAAG,OAAO;CAIlH"}
@@ -0,0 +1,30 @@
1
+ import { isValidTelegramUpdate } from './update-validator.js';
2
+ export class WebhookSource {
3
+ updates = [];
4
+ running = false;
5
+ async run(onUpdate) {
6
+ this.running = true;
7
+ while (this.running) {
8
+ const next = this.updates.shift();
9
+ if (!next) {
10
+ await new Promise((resolve) => setTimeout(resolve, 10));
11
+ continue;
12
+ }
13
+ await onUpdate(next);
14
+ }
15
+ }
16
+ async stop() {
17
+ this.running = false;
18
+ }
19
+ ingest(update) {
20
+ if (!isValidTelegramUpdate(update)) {
21
+ return;
22
+ }
23
+ this.updates.push(update);
24
+ }
25
+ validateSignature(headers, options) {
26
+ const current = headers[options.headerName.toLowerCase()] ?? headers[options.headerName];
27
+ return current === options.secretToken;
28
+ }
29
+ }
30
+ //# sourceMappingURL=webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/update-loop/webhook.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAO9D,MAAM,OAAO,aAAa;IACP,OAAO,GAAa,EAAE,CAAC;IAChC,OAAO,GAAG,KAAK,CAAC;IAEjB,KAAK,CAAC,GAAG,CAAC,QAA2C;QAC1D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;gBACxD,SAAS;YACX,CAAC;YACD,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAEM,MAAM,CAAC,MAAe;QAC3B,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAEM,iBAAiB,CAAC,OAA2C,EAAE,OAAiC;QACrG,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACzF,OAAO,OAAO,KAAK,OAAO,CAAC,WAAW,CAAC;IACzC,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@jilimb0/tgwrapper",
3
+ "version": "0.4.0",
4
+ "description": "Serverless-first Telegram bot framework without external bot libraries",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "keywords": [
15
+ "telegram",
16
+ "bot",
17
+ "framework",
18
+ "fsm",
19
+ "serverless"
20
+ ],
21
+ "engines": {
22
+ "node": ">=18"
23
+ },
24
+ "dependencies": {
25
+ "@grammyjs/types": "^3.8.0"
26
+ },
27
+ "devDependencies": {
28
+ "@changesets/cli": "^2.29.6",
29
+ "typedoc": "^0.27.9",
30
+ "typescript": "5.8.2",
31
+ "vitest": "^4.0.18"
32
+ },
33
+ "files": [
34
+ "dist",
35
+ "README.md"
36
+ ],
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "scripts": {
41
+ "build": "tsc -p tsconfig.json",
42
+ "typecheck": "tsc -p tsconfig.json --noEmit",
43
+ "test": "vitest run",
44
+ "test:watch": "vitest",
45
+ "test:integration": "pnpm --filter @jilimb0/tgwrapper-adapter-redis test:integration",
46
+ "test:load": "vitest run test/load/throughput.load.test.ts",
47
+ "test:chaos": "vitest run test/chaos/multi-tenant.chaos.test.ts",
48
+ "test:phase4": "pnpm test:load && pnpm test:chaos && pnpm test:integration",
49
+ "benchmark": "pnpm build && node benchmark/run-benchmark.mjs",
50
+ "docs": "typedoc src/index.ts --out docs/api",
51
+ "release:status": "changeset status",
52
+ "release:version": "changeset version",
53
+ "release:publish": "changeset publish"
54
+ }
55
+ }