@hanzo/commerce 7.9.0 → 7.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,7 +21,7 @@
21
21
  * rather than re-implementing the HTTP layer.
22
22
  *
23
23
  * Auth is the commerce service token (admin-scoped S2S), sent as
24
- * `Authorization: Bearer <token>` plus the tenant org as `X-IAM-Org-Id`. The
24
+ * `Authorization: Bearer <token>` plus the tenant org as `X-Org-Id`. The
25
25
  * token is a secret and MUST come from KMS (the operator wires it into
26
26
  * COMMERCE_SERVICE_TOKEN); this module never reads it from disk.
27
27
  *
@@ -54,7 +54,7 @@ export type MeteringConfig = {
54
54
  baseUrl?: string;
55
55
  /** Commerce service token (admin-scoped S2S). MUST be KMS-sourced. */
56
56
  token?: string;
57
- /** Default tenant org slug sent as X-IAM-Org-Id (default "hanzo"). */
57
+ /** Default tenant org slug sent as X-Org-Id (default "hanzo"). */
58
58
  org?: string;
59
59
  /**
60
60
  * Gate on the tier-aware effective balance (prepaid + included plan
@@ -68,6 +68,12 @@ export type MeteringConfig = {
68
68
  failOpen?: boolean;
69
69
  /** Request timeout in ms. Default 5000 (the gateway's value). */
70
70
  timeoutMs?: number;
71
+ /**
72
+ * Send every call to commerce's TEST ledger (org.Live=false), so balances and
73
+ * debits hit the sandbox books rather than real money. The Go meter spells
74
+ * this the same way; a product opts in with METERING_TEST.
75
+ */
76
+ test?: boolean;
71
77
  };
72
78
  /** Who to authorize / charge. user is the IAM "org/sub" identity. */
73
79
  export type MeteringIdentity = {
@@ -118,6 +124,7 @@ export declare class Metering {
118
124
  private readonly org;
119
125
  private readonly tierAware;
120
126
  private readonly failOpen;
127
+ private readonly test;
121
128
  constructor(config?: MeteringConfig);
122
129
  /**
123
130
  * Build a Metering instance from the canonical environment variables. This
@@ -127,6 +134,8 @@ export declare class Metering {
127
134
  static fromEnv(env?: Record<string, string | undefined>): Metering;
128
135
  /** Whether a commerce base URL is configured. */
129
136
  get enabled(): boolean;
137
+ /** The headers every call carries: which org, and which ledger. */
138
+ private wire;
130
139
  /**
131
140
  * Pre-request balance gate. Never throws — returns a decision so callers map
132
141
  * it to a status code. When not configured it always allows.
package/dist/metering.js CHANGED
@@ -21,7 +21,7 @@
21
21
  * rather than re-implementing the HTTP layer.
22
22
  *
23
23
  * Auth is the commerce service token (admin-scoped S2S), sent as
24
- * `Authorization: Bearer <token>` plus the tenant org as `X-IAM-Org-Id`. The
24
+ * `Authorization: Bearer <token>` plus the tenant org as `X-Org-Id`. The
25
25
  * token is a secret and MUST come from KMS (the operator wires it into
26
26
  * COMMERCE_SERVICE_TOKEN); this module never reads it from disk.
27
27
  *
@@ -60,6 +60,7 @@ export class Metering {
60
60
  this.org = (config.org ?? '').trim();
61
61
  this.tierAware = config.tierAware ?? false;
62
62
  this.failOpen = config.failOpen ?? false;
63
+ this.test = config.test ?? false;
63
64
  }
64
65
  /**
65
66
  * Build a Metering instance from the canonical environment variables. This
@@ -75,12 +76,18 @@ export class Metering {
75
76
  org: (env.COMMERCE_SERVICE_ORG ?? '').trim() || 'hanzo',
76
77
  tierAware: truthy(env.METERING_TIER_AWARE),
77
78
  failOpen: truthy(env.METERING_FAIL_OPEN),
79
+ test: truthy(env.METERING_TEST),
78
80
  });
79
81
  }
80
82
  /** Whether a commerce base URL is configured. */
81
83
  get enabled() {
82
84
  return this.commerce !== null;
83
85
  }
86
+ /** The headers every call carries: which org, and which ledger. */
87
+ wire(org) {
88
+ const h = { ...orgHeader(org ?? this.org), ...(this.test ? { 'X-Hanzo-Test': 'true' } : {}) };
89
+ return Object.keys(h).length ? h : undefined;
90
+ }
84
91
  /**
85
92
  * Pre-request balance gate. Never throws — returns a decision so callers map
86
93
  * it to a status code. When not configured it always allows.
@@ -97,7 +104,7 @@ export class Metering {
97
104
  if (!user) {
98
105
  return this.failOpen ? { allowed: true } : { allowed: false, reason: 'balance_unavailable' };
99
106
  }
100
- const headers = orgHeader(id.org ?? this.org);
107
+ const headers = this.wire(id.org);
101
108
  try {
102
109
  const available = this.tierAware
103
110
  ? (await this.commerce.getBillingTier({ headers })).balance.effectiveAvailable
@@ -124,7 +131,7 @@ export class Metering {
124
131
  return null;
125
132
  if (!usage.user?.trim())
126
133
  throw new Error('metering: record requires a user');
127
- const headers = orgHeader(usage.org ?? this.org);
134
+ const headers = this.wire(usage.org);
128
135
  // Commerce's usageRequest field names map one-for-one; org travels via the
129
136
  // header, never the body.
130
137
  const body = {
@@ -188,9 +195,21 @@ export function identityFromHeaders(headers) {
188
195
  // ---------------------------------------------------------------------------
189
196
  // internals
190
197
  // ---------------------------------------------------------------------------
198
+ /**
199
+ * The org this usage belongs to, under the one name commerce reads.
200
+ *
201
+ * `X-Org-Id`, and getting it wrong is SILENT. Commerce selects the org as
202
+ * stashed-org -> `X-Org-Id` -> `COMMERCE_SERVICE_ORG` -> `"hanzo"` and never
203
+ * refuses (middleware/accesstoken.go:110,167-173), so a name it does not know
204
+ * is not an error — it debits the house org for every tenant. This sent
205
+ * `X-IAM-Org-Id`, which commerce reads nowhere.
206
+ *
207
+ * `X-Hanzo-Org` is a real header but travels the other way: cloud stamps it on
208
+ * responses as the acting org. Request header in, guardrail out.
209
+ */
191
210
  function orgHeader(org) {
192
211
  const o = (org ?? '').trim();
193
- return o ? { 'X-IAM-Org-Id': o } : undefined;
212
+ return o ? { 'X-Org-Id': o } : undefined;
194
213
  }
195
214
  function truthy(v) {
196
215
  const s = (v ?? '').trim().toLowerCase();
@@ -1 +1 @@
1
- {"version":3,"file":"metering.js","sourceRoot":"","sources":["../metering.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metering.js","sourceRoot":"","sources":["../metering.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1 @@
1
- /**
2
- * Contract tests for @hanzo/commerce/metering.
3
- *
4
- * Self-contained: mocks global fetch and asserts the exact commerce wire
5
- * contract, mirroring github.com/hanzoai/go-sdk/metering's tests so the two
6
- * clients gate on the identical balance source. Runnable standalone with:
7
- *
8
- * npx -y -p typescript@5.9.3 -p tsx tsx pkgs/commerce/metering.test.ts
9
- *
10
- * It uses no test-runner dependency (the package ships none); a tiny harness
11
- * below prints PASS/FAIL and exits non-zero on failure.
12
- */
13
1
  export {};
@@ -1,181 +1,119 @@
1
1
  /**
2
- * Contract tests for @hanzo/commerce/metering.
2
+ * What goes on the wire, asserted from the wire.
3
3
  *
4
- * Self-contained: mocks global fetch and asserts the exact commerce wire
5
- * contract, mirroring github.com/hanzoai/go-sdk/metering's tests so the two
6
- * clients gate on the identical balance source. Runnable standalone with:
7
- *
8
- * npx -y -p typescript@5.9.3 -p tsx tsx pkgs/commerce/metering.test.ts
9
- *
10
- * It uses no test-runner dependency (the package ships none); a tiny harness
11
- * below prints PASS/FAIL and exits non-zero on failure.
4
+ * Every check here reads the request commerce would actually receive, because
5
+ * the failure this pins is invisible from the inside: commerce selects the org
6
+ * as stashed-org -> `X-Org-Id` -> `COMMERCE_SERVICE_ORG` -> `"hanzo"` and never
7
+ * refuses (middleware/accesstoken.go:110,167-173). A name it does not know is
8
+ * not an error it bills the house org for every tenant, quietly, until someone
9
+ * reads the ledger. Asserting the header the meter MEANT to send would have
10
+ * passed the whole time it was sending one commerce ignores.
12
11
  */
13
- import { Metering, identityFromHeaders } from './metering';
14
- // ---- tiny assert harness ----
15
- let failures = 0;
16
- let count = 0;
17
- function test(name, fn) {
18
- count++;
19
- Promise.resolve()
20
- .then(fn)
21
- .then(() => console.log(`ok - ${name}`))
22
- .catch((err) => {
23
- failures++;
24
- console.error(`FAIL - ${name}\n ${err?.message ?? err}`);
25
- });
26
- }
27
- function eq(actual, expected, msg = '') {
28
- if (actual !== expected)
29
- throw new Error(`${msg} expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);
30
- }
31
- function ok(cond, msg = '') {
32
- if (!cond)
33
- throw new Error(msg || 'expected true');
34
- }
35
- function mockFetch(status, json) {
36
- const original = globalThis.fetch;
37
- let last = null;
38
- globalThis.fetch = (async (input, init) => {
39
- const hdrs = {};
40
- const h = init?.headers;
41
- if (h)
42
- for (const [k, v] of Object.entries(h))
43
- hdrs[k.toLowerCase()] = v;
44
- last = {
45
- url: input.toString(),
12
+ import { afterEach, describe, expect, it, vi } from 'vitest';
13
+ import { Metering } from './metering';
14
+ /** Stand in for commerce, and keep what it was asked. */
15
+ function listen(reply = { status: 'ok', data: { available: 500 } }, status = 200) {
16
+ const seen = [];
17
+ vi.stubGlobal('fetch', async (input, init) => {
18
+ const headers = {};
19
+ for (const [k, v] of Object.entries((init?.headers ?? {}))) {
20
+ headers[k.toLowerCase()] = v;
21
+ }
22
+ seen.push({
23
+ url: String(input),
46
24
  method: init?.method ?? 'GET',
47
- headers: hdrs,
48
- body: init?.body ? JSON.parse(init.body) : undefined,
49
- };
50
- return {
51
- ok: status >= 200 && status < 300,
25
+ headers,
26
+ body: init?.body ? JSON.parse(String(init.body)) : undefined,
27
+ });
28
+ return new Response(JSON.stringify(reply), {
52
29
  status,
53
- statusText: `HTTP ${status}`,
54
- json: async () => json,
55
- text: async () => JSON.stringify(json),
56
- };
30
+ headers: { 'content-type': 'application/json' },
31
+ });
57
32
  });
58
- return { restore: () => { globalThis.fetch = original; }, last: () => last };
33
+ return seen;
59
34
  }
60
- const BASE = 'http://commerce.test';
61
- test('authorize allows when available > 0 and hits the canonical contract', async () => {
62
- const fx = mockFetch(200, { user: 'hanzo/alice', currency: 'usd', balance: 5000, holds: 0, available: 5000 });
63
- const meter = new Metering({ baseUrl: BASE, token: 'svc-token', org: 'hanzo' });
64
- const d = await meter.authorize({ user: 'hanzo/alice' });
65
- fx.restore();
66
- ok(d.allowed, 'should allow');
67
- eq(d.available, 5000, 'available');
68
- const c = fx.last();
69
- eq(c.method, 'GET', 'method');
70
- ok(c.url.startsWith(`${BASE}/v1/billing/balance?`), `url=${c.url}`);
71
- ok(c.url.includes('user=hanzo%2Falice'), `url must url-encode user: ${c.url}`);
72
- ok(c.url.includes('currency=usd'), `url must carry currency: ${c.url}`);
73
- eq(c.headers['authorization'], 'Bearer svc-token', 'bearer');
74
- eq(c.headers['x-iam-org-id'], 'hanzo', 'org header');
75
- });
76
- test('authorize denies (insufficient) when available == 0', async () => {
77
- const fx = mockFetch(200, { available: 0 });
78
- const meter = new Metering({ baseUrl: BASE, token: 't', org: 'hanzo' });
79
- const d = await meter.authorize({ user: 'hanzo/alice' });
80
- fx.restore();
81
- ok(!d.allowed, 'should deny');
82
- eq(d.reason, 'insufficient_balance', 'reason');
83
- });
84
- test('authorize fail-closed on commerce error (503/unavailable)', async () => {
85
- const fx = mockFetch(500, { error: 'boom' });
86
- const meter = new Metering({ baseUrl: BASE, token: 't', org: 'hanzo' });
87
- const d = await meter.authorize({ user: 'hanzo/alice' });
88
- fx.restore();
89
- ok(!d.allowed, 'fail-closed must deny on 500');
90
- eq(d.reason, 'balance_unavailable', 'reason');
91
- });
92
- test('authorize fail-open allows on commerce error when configured', async () => {
93
- const fx = mockFetch(503, { error: 'down' });
94
- const meter = new Metering({ baseUrl: BASE, token: 't', org: 'hanzo', failOpen: true });
95
- const d = await meter.authorize({ user: 'hanzo/alice' });
96
- fx.restore();
97
- ok(d.allowed, 'fail-open must allow');
98
- });
99
- test('authorize not-configured allows', async () => {
100
- const meter = new Metering({}); // no baseUrl
101
- ok(!meter.enabled, 'enabled should be false');
102
- const d = await meter.authorize({ user: 'hanzo/alice' });
103
- ok(d.allowed, 'not-configured must allow');
104
- });
105
- test('tier-aware authorize uses effectiveAvailable and hits /v1/billing/tier', async () => {
106
- const fx = mockFetch(200, { user: 'hanzo/alice', tier: { name: 'free' }, balance: { currency: 'usd', prepaidAvailable: 0, dailyRemaining: 100, effectiveAvailable: 100 } });
107
- const meter = new Metering({ baseUrl: BASE, token: 't', org: 'hanzo', tierAware: true });
108
- const d = await meter.authorize({ user: 'hanzo/alice' });
109
- fx.restore();
110
- ok(d.allowed, 'included allotment should allow');
111
- eq(d.available, 100, 'effective available');
112
- ok(fx.last().url.startsWith(`${BASE}/v1/billing/tier?`), `tier url=${fx.last().url}`);
113
- });
114
- test('tier-aware authorize denies when effectiveAvailable == 0', async () => {
115
- const fx = mockFetch(200, { balance: { effectiveAvailable: 0, prepaidAvailable: 0, dailyRemaining: 0, currency: 'usd' } });
116
- const meter = new Metering({ baseUrl: BASE, token: 't', org: 'hanzo', tierAware: true });
117
- const d = await meter.authorize({ user: 'hanzo/alice' });
118
- fx.restore();
119
- ok(!d.allowed && d.reason === 'insufficient_balance', 'exhausted must deny insufficient');
120
- });
121
- test('per-call org overrides default', async () => {
122
- const fx = mockFetch(200, { available: 1 });
123
- const meter = new Metering({ baseUrl: BASE, token: 't', org: 'hanzo' });
124
- await meter.authorize({ user: 'zoo/bob', org: 'zoo' });
125
- fx.restore();
126
- eq(fx.last().headers['x-iam-org-id'], 'zoo', 'per-call org override');
127
- });
128
- test('record posts canonical payload', async () => {
129
- const fx = mockFetch(201, { transactionId: 'tx_123', user: 'hanzo/alice', amount: 250, currency: 'usd', type: 'withdraw' });
130
- const meter = new Metering({ baseUrl: BASE, token: 'svc-token', org: 'hanzo' });
131
- const res = await meter.record({ user: 'hanzo/alice', amount: 250, provider: 'search', requestId: 'req-9', status: 'success' });
132
- fx.restore();
133
- ok(res !== null && res.transactionId === 'tx_123' && res.amount === 250, 'record result');
134
- const c = fx.last();
135
- eq(c.method, 'POST', 'method');
136
- eq(c.url, `${BASE}/v1/billing/usage`, 'usage url');
137
- eq(c.headers['authorization'], 'Bearer svc-token', 'bearer');
138
- eq(c.headers['x-iam-org-id'], 'hanzo', 'org header');
139
- const b = c.body;
140
- eq(b.user, 'hanzo/alice', 'body.user');
141
- eq(b.amount, 250, 'body.amount');
142
- eq(b.currency, 'usd', 'body.currency defaulted');
143
- eq(b.provider, 'search', 'body.provider');
144
- eq(b.requestId, 'req-9', 'body.requestId');
145
- ok(!('org' in b), 'org must not leak into the body');
146
- });
147
- test('record zero-amount is a no-op (no fetch)', async () => {
148
- const fx = mockFetch(200, {});
149
- const meter = new Metering({ baseUrl: BASE, token: 't', org: 'hanzo' });
150
- const res = await meter.record({ user: 'hanzo/alice', amount: 0 });
151
- fx.restore();
152
- ok(res === null, 'zero-amount returns null');
153
- ok(fx.last() === null, 'zero-amount must not call commerce');
154
- });
155
- test('record not-configured is a no-op', async () => {
156
- const meter = new Metering({});
157
- const res = await meter.record({ user: 'hanzo/alice', amount: 100 });
158
- ok(res === null, 'not-configured returns null');
35
+ const meter = (over = {}) => new Metering({ baseUrl: 'http://commerce.test', token: 'svc', org: 'acme', ...over });
36
+ afterEach(() => vi.unstubAllGlobals());
37
+ describe('the org travels under the name commerce reads', () => {
38
+ it('names the org X-Org-Id', async () => {
39
+ const seen = listen();
40
+ await meter().authorize({ user: 'acme/alice' });
41
+ expect(seen[0].headers['x-org-id']).toBe('acme');
42
+ });
43
+ it('does not send X-IAM-Org-Id, which commerce reads nowhere', async () => {
44
+ const seen = listen();
45
+ await meter().authorize({ user: 'acme/alice' });
46
+ expect(seen[0].headers).not.toHaveProperty('x-iam-org-id');
47
+ });
48
+ it('lets a per-call org outrank the default, so one meter serves many tenants', async () => {
49
+ const seen = listen();
50
+ await meter().authorize({ user: 'other/bob', org: 'other' });
51
+ expect(seen[0].headers['x-org-id']).toBe('other');
52
+ });
53
+ it('carries the org on the debit too, not only the gate', async () => {
54
+ const seen = listen({ status: 'ok', data: { transactionId: 't1' } });
55
+ await meter().record({ user: 'acme/alice', org: 'other', amount: 5 });
56
+ expect(seen[0].headers['x-org-id']).toBe('other');
57
+ });
159
58
  });
160
- test('fromEnv applies defaults and reads KMS-sourced token', () => {
161
- const meter = Metering.fromEnv({ COMMERCE_SERVICE_TOKEN: 'kms-token', METERING_TIER_AWARE: 'true' });
162
- ok(meter.enabled, 'fromEnv default base URL enables the meter');
59
+ describe('the ledger is chosen deliberately', () => {
60
+ it('stays on the live books unless asked otherwise', async () => {
61
+ const seen = listen();
62
+ await meter().authorize({ user: 'acme/alice' });
63
+ expect(seen[0].headers).not.toHaveProperty('x-hanzo-test');
64
+ });
65
+ it('opts into the sandbox books when told to', async () => {
66
+ const seen = listen();
67
+ await meter({ test: true }).authorize({ user: 'acme/alice' });
68
+ expect(seen[0].headers['x-hanzo-test']).toBe('true');
69
+ });
163
70
  });
164
- test('fromEnv honors METERING_DISABLED', () => {
165
- const meter = Metering.fromEnv({ METERING_DISABLED: 'true', COMMERCE_URL: BASE });
166
- ok(!meter.enabled, 'disabled must not be enabled');
71
+ describe('the gate is closed when the answer is unknown', () => {
72
+ it('denies with 503-shaped reason when commerce cannot answer', async () => {
73
+ listen({ detail: 'nope' }, 500);
74
+ expect(await meter().authorize({ user: 'acme/alice' })).toEqual({
75
+ allowed: false,
76
+ reason: 'balance_unavailable',
77
+ });
78
+ });
79
+ it('denies with 402-shaped reason when the balance is spent', async () => {
80
+ listen({ status: 'ok', data: { available: 0 } });
81
+ const d = await meter().authorize({ user: 'acme/alice' });
82
+ expect(d.allowed).toBe(false);
83
+ expect(d.reason).toBe('insufficient_balance');
84
+ });
85
+ it('opens only where a product said availability outranks revenue', async () => {
86
+ listen({ detail: 'nope' }, 500);
87
+ expect((await meter({ failOpen: true }).authorize({ user: 'acme/alice' })).allowed).toBe(true);
88
+ });
89
+ it('allows everything when no commerce is configured, so local dev needs no token', async () => {
90
+ const seen = listen();
91
+ expect((await new Metering({}).authorize({ user: 'acme/alice' })).allowed).toBe(true);
92
+ expect(seen).toHaveLength(0);
93
+ });
167
94
  });
168
- test('identityFromHeaders builds org/sub from gateway headers', () => {
169
- const id = identityFromHeaders({ 'x-org-id': 'zoo', 'x-user-id': 'bob' });
170
- eq(id.user, 'zoo/bob', 'user');
171
- eq(id.org, 'zoo', 'org');
95
+ describe('the addresses are the ones the API serves', () => {
96
+ it('gates on the balance, and on the tier when asked', async () => {
97
+ const bare = listen();
98
+ await meter().authorize({ user: 'acme/alice' });
99
+ expect(bare[0].url).toContain('/v1/billing/balance');
100
+ vi.unstubAllGlobals();
101
+ const tiered = listen({ status: 'ok', data: { balance: { effectiveAvailable: 10 } } });
102
+ await meter({ tierAware: true }).authorize({ user: 'acme/alice' });
103
+ expect(tiered[0].url).toContain('/v1/billing/tier');
104
+ });
105
+ it('debits by POST, with the org outside the body', async () => {
106
+ const seen = listen({ status: 'ok', data: { transactionId: 't1' } });
107
+ await meter().record({ user: 'acme/alice', amount: 5, model: 'zen' });
108
+ expect(seen[0].method).toBe('POST');
109
+ expect(seen[0].url).toContain('/v1/billing/usage');
110
+ expect(seen[0].body).toMatchObject({ user: 'acme/alice', amount: 5 });
111
+ expect(seen[0].body).not.toHaveProperty('org');
112
+ });
113
+ it('writes nothing for usage that costs nothing', async () => {
114
+ const seen = listen();
115
+ expect(await meter().record({ user: 'acme/alice', amount: 0 })).toBeNull();
116
+ expect(seen).toHaveLength(0);
117
+ });
172
118
  });
173
- // summary
174
- setTimeout(() => {
175
- if (failures > 0) {
176
- console.error(`\n${failures}/${count} tests FAILED`);
177
- process.exit(1);
178
- }
179
- console.log(`\nall ${count} tests passed`);
180
- }, 200);
181
119
  //# sourceMappingURL=metering.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"metering.test.js","sourceRoot":"","sources":["../metering.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metering.test.js","sourceRoot":"","sources":["../metering.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hanzo/commerce",
3
- "version": "7.9.0",
3
+ "version": "7.9.1",
4
4
  "description": "e-commerce framework.",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/",
@@ -93,6 +93,7 @@
93
93
  "pub": "npm publish",
94
94
  "tc": "tsc --noEmit",
95
95
  "build": "pnpm clean && tsc --outDir dist --declaration --emitDeclarationOnly false --module ESNext --esModuleInterop true --skipLibCheck true --sourceMap true",
96
- "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\""
96
+ "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
97
+ "client": "python3 scripts/generate-client.py"
97
98
  }
98
99
  }