@logto/cloud 0.2.5-ab8a489 → 0.2.5-c14ed4e

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 (2) hide show
  1. package/lib/routes/index.d.ts +229 -52
  2. package/package.json +7 -7
@@ -37,6 +37,16 @@ declare enum OrganizationInvitationStatus {
37
37
  Expired = "Expired",
38
38
  Revoked = "Revoked"
39
39
  }
40
+ /** The scopes (permissions) defined by the organization template. */
41
+ export type OrganizationScope = {
42
+ tenantId: string;
43
+ /** The globally unique identifier of the organization scope. */
44
+ id: string;
45
+ /** The organization scope's name, unique within the organization template. */
46
+ name: string;
47
+ /** A brief description of the organization scope. */
48
+ description: string | null;
49
+ };
40
50
  declare enum LogtoJwtTokenKeyType {
41
51
  AccessToken = "access-token",
42
52
  ClientCredentials = "client-credentials"
@@ -59,6 +69,10 @@ declare enum TenantRole {
59
69
  /** Collaborator of the tenant, who has permissions to operate the tenant data, but not the tenant settings. */
60
70
  Collaborator = "collaborator"
61
71
  }
72
+ declare enum LogtoSkuType {
73
+ Basic = "Basic",
74
+ AddOn = "AddOn"
75
+ }
62
76
  declare const AffiliateProperties: import("@withtyped/server/lib/model/index.js").default<"affiliate_properties", {
63
77
  createdAt: Date;
64
78
  affiliateId: string;
@@ -72,11 +86,16 @@ declare const Affiliates: import("@withtyped/server/lib/model/index.js").default
72
86
  id: string;
73
87
  }, "id" | "createdAt", "id" | "createdAt">;
74
88
  export type Affiliate = InferModelType<typeof Affiliates>;
89
+ declare enum RegionName {
90
+ EU = "EU",
91
+ US = "US"
92
+ }
75
93
  export type AffiliateData = Affiliate & {
76
94
  properties: Array<Pick<AffiliateProperty, "type" | "value">>;
77
95
  };
78
96
  declare const router: import("@withtyped/server").Router<RequestContext, WithAuthContext<Omit<import("@withtyped/server").BaseContext & {
79
97
  request: {
98
+ id?: string | undefined;
80
99
  method?: import("@withtyped/server").RequestMethod | undefined;
81
100
  headers: import("http").IncomingHttpHeaders;
82
101
  url: URL;
@@ -84,6 +103,7 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
84
103
  };
85
104
  }, "request"> & {
86
105
  request: Record<string, unknown> & {
106
+ id?: string | undefined;
87
107
  method?: import("@withtyped/server").RequestMethod | undefined;
88
108
  headers: import("http").IncomingHttpHeaders;
89
109
  url: URL;
@@ -92,13 +112,14 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
92
112
  body?: Json | undefined;
93
113
  bodyRaw?: Buffer | undefined;
94
114
  };
95
- }>, import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").BaseRoutes, import("@withtyped/server").RoutesWithPrefix<{
115
+ }>, import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").MergeRoutes<import("@withtyped/server").BaseRoutes, import("@withtyped/server").RoutesWithPrefix<{
96
116
  patch: {
97
117
  "/tenants/:tenantId": import("@withtyped/server").PathGuard<"/:tenantId", unknown, {
98
118
  name?: string | undefined;
99
119
  }, {
100
120
  id: string;
101
121
  name: string;
122
+ createdAt: Date;
102
123
  usage: {
103
124
  activeUsers: number;
104
125
  cost: number;
@@ -112,7 +133,10 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
112
133
  planId: string;
113
134
  currentPeriodStart: Date;
114
135
  currentPeriodEnd: Date;
136
+ id?: string | undefined;
115
137
  };
138
+ regionName: RegionName;
139
+ tag: TenantTag;
116
140
  openInvoices: {
117
141
  status: "void" | "open" | "draft" | "paid" | "uncollectible" | null;
118
142
  id: string;
@@ -128,7 +152,6 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
128
152
  hostedInvoiceUrl: string | null;
129
153
  invoicePdf: string | null;
130
154
  }[];
131
- tag: TenantTag;
132
155
  }>;
133
156
  };
134
157
  options: {};
@@ -136,6 +159,7 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
136
159
  "/tenants": import("@withtyped/server").PathGuard<"/", unknown, unknown, {
137
160
  id: string;
138
161
  name: string;
162
+ createdAt: Date;
139
163
  usage: {
140
164
  activeUsers: number;
141
165
  cost: number;
@@ -149,7 +173,10 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
149
173
  planId: string;
150
174
  currentPeriodStart: Date;
151
175
  currentPeriodEnd: Date;
176
+ id?: string | undefined;
152
177
  };
178
+ regionName: RegionName;
179
+ tag: TenantTag;
153
180
  openInvoices: {
154
181
  status: "void" | "open" | "draft" | "paid" | "uncollectible" | null;
155
182
  id: string;
@@ -165,16 +192,17 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
165
192
  hostedInvoiceUrl: string | null;
166
193
  invoicePdf: string | null;
167
194
  }[];
168
- tag: TenantTag;
169
195
  }[]>;
170
196
  };
171
197
  post: {
172
198
  "/tenants": import("@withtyped/server").PathGuard<"/", unknown, {
173
199
  name?: string | undefined;
174
200
  tag?: TenantTag | undefined;
201
+ regionName?: RegionName | undefined;
175
202
  }, {
176
203
  id: string;
177
204
  name: string;
205
+ createdAt: Date;
178
206
  usage: {
179
207
  activeUsers: number;
180
208
  cost: number;
@@ -188,7 +216,10 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
188
216
  planId: string;
189
217
  currentPeriodStart: Date;
190
218
  currentPeriodEnd: Date;
219
+ id?: string | undefined;
191
220
  };
221
+ regionName: RegionName;
222
+ tag: TenantTag;
192
223
  openInvoices: {
193
224
  status: "void" | "open" | "draft" | "paid" | "uncollectible" | null;
194
225
  id: string;
@@ -204,7 +235,6 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
204
235
  hostedInvoiceUrl: string | null;
205
236
  invoicePdf: string | null;
206
237
  }[];
207
- tag: TenantTag;
208
238
  }>;
209
239
  };
210
240
  put: {};
@@ -222,14 +252,114 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
222
252
  planId: string;
223
253
  currentPeriodStart: Date;
224
254
  currentPeriodEnd: Date;
255
+ id?: string | undefined;
256
+ }>;
257
+ } & {
258
+ "/tenants/my/subscription/quota": import("@withtyped/server").PathGuard<"/my/subscription/quota", unknown, unknown, {
259
+ mauLimit: number | null;
260
+ tokenLimit: number | null;
261
+ applicationsLimit: number | null;
262
+ machineToMachineLimit: number | null;
263
+ resourcesLimit: number | null;
264
+ scopesPerResourceLimit: number | null;
265
+ socialConnectorsLimit: number | null;
266
+ machineToMachineRolesLimit: number | null;
267
+ scopesPerRoleLimit: number | null;
268
+ hooksLimit: number | null;
269
+ auditLogsRetentionDays: number | null;
270
+ mfaEnabled: boolean;
271
+ organizationsEnabled: boolean;
272
+ thirdPartyApplicationsLimit: number | null;
273
+ tenantMembersLimit: number | null;
274
+ customJwtEnabled: boolean;
275
+ subjectTokenEnabled: boolean;
276
+ bringYourUiEnabled: boolean;
277
+ userRolesLimit: number | null;
278
+ enterpriseSsoLimit: number | null;
279
+ }>;
280
+ } & {
281
+ "/tenants/my/subscription/usage": import("@withtyped/server").PathGuard<"/my/subscription/usage", unknown, unknown, {
282
+ mauLimit: number;
283
+ tokenLimit: number;
284
+ applicationsLimit: number;
285
+ machineToMachineLimit: number;
286
+ resourcesLimit: number;
287
+ scopesPerResourceLimit: number;
288
+ socialConnectorsLimit: number;
289
+ machineToMachineRolesLimit: number;
290
+ scopesPerRoleLimit: number;
291
+ hooksLimit: number;
292
+ mfaEnabled: boolean;
293
+ organizationsEnabled: boolean;
294
+ thirdPartyApplicationsLimit: number;
295
+ tenantMembersLimit: number;
296
+ customJwtEnabled: boolean;
297
+ subjectTokenEnabled: boolean;
298
+ bringYourUiEnabled: boolean;
299
+ userRolesLimit: number;
300
+ enterpriseSsoLimit: number;
225
301
  }>;
302
+ } & {
303
+ "/tenants/my/subscription/usage/:entityName/scopes": import("@withtyped/server").PathGuard<"/my/subscription/usage/:entityName/scopes", {
304
+ entityId?: string | undefined;
305
+ }, unknown, Record<string, number>>;
226
306
  } & {
227
307
  "/tenants/:tenantId/subscription": import("@withtyped/server").PathGuard<"/:tenantId/subscription", unknown, unknown, {
228
308
  status: "incomplete" | "incomplete_expired" | "trialing" | "active" | "past_due" | "canceled" | "unpaid" | "paused";
229
309
  planId: string;
230
310
  currentPeriodStart: Date;
231
311
  currentPeriodEnd: Date;
312
+ id?: string | undefined;
313
+ }>;
314
+ } & {
315
+ "/tenants/:tenantId/subscription/quota": import("@withtyped/server").PathGuard<"/:tenantId/subscription/quota", unknown, unknown, {
316
+ mauLimit: number | null;
317
+ tokenLimit: number | null;
318
+ applicationsLimit: number | null;
319
+ machineToMachineLimit: number | null;
320
+ resourcesLimit: number | null;
321
+ scopesPerResourceLimit: number | null;
322
+ socialConnectorsLimit: number | null;
323
+ machineToMachineRolesLimit: number | null;
324
+ scopesPerRoleLimit: number | null;
325
+ hooksLimit: number | null;
326
+ auditLogsRetentionDays: number | null;
327
+ mfaEnabled: boolean;
328
+ organizationsEnabled: boolean;
329
+ thirdPartyApplicationsLimit: number | null;
330
+ tenantMembersLimit: number | null;
331
+ customJwtEnabled: boolean;
332
+ subjectTokenEnabled: boolean;
333
+ bringYourUiEnabled: boolean;
334
+ userRolesLimit: number | null;
335
+ enterpriseSsoLimit: number | null;
336
+ }>;
337
+ } & {
338
+ "/tenants/:tenantId/subscription/usage": import("@withtyped/server").PathGuard<"/:tenantId/subscription/usage", unknown, unknown, {
339
+ mauLimit: number;
340
+ tokenLimit: number;
341
+ applicationsLimit: number;
342
+ machineToMachineLimit: number;
343
+ resourcesLimit: number;
344
+ scopesPerResourceLimit: number;
345
+ socialConnectorsLimit: number;
346
+ machineToMachineRolesLimit: number;
347
+ scopesPerRoleLimit: number;
348
+ hooksLimit: number;
349
+ mfaEnabled: boolean;
350
+ organizationsEnabled: boolean;
351
+ thirdPartyApplicationsLimit: number;
352
+ tenantMembersLimit: number;
353
+ customJwtEnabled: boolean;
354
+ subjectTokenEnabled: boolean;
355
+ bringYourUiEnabled: boolean;
356
+ userRolesLimit: number;
357
+ enterpriseSsoLimit: number;
232
358
  }>;
359
+ } & {
360
+ "/tenants/:tenantId/subscription/usage/:entityName/scopes": import("@withtyped/server").PathGuard<"/:tenantId/subscription/usage/:entityName/scopes", {
361
+ entityId?: string | undefined;
362
+ }, unknown, Record<string, number>>;
233
363
  } & {
234
364
  "/tenants/:tenantId/invoices": import("@withtyped/server").PathGuard<"/:tenantId/invoices", unknown, unknown, {
235
365
  invoices: {
@@ -310,11 +440,13 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
310
440
  };
311
441
  }, unknown>;
312
442
  } & {
313
- "/services/custom-jwt": import("@withtyped/server").PathGuard<"/custom-jwt", unknown, {
443
+ "/services/custom-jwt": import("@withtyped/server").PathGuard<"/custom-jwt", {
444
+ isTest?: string | undefined;
445
+ }, {
446
+ context: Record<string, Json>;
314
447
  script: string;
315
448
  tokenType: LogtoJwtTokenKeyType.AccessToken;
316
449
  token: Record<string, Json>;
317
- context: Record<string, Json>;
318
450
  environmentVariables?: Record<string, string> | undefined;
319
451
  } | {
320
452
  script: string;
@@ -323,8 +455,21 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
323
455
  environmentVariables?: Record<string, string> | undefined;
324
456
  }, Record<string, unknown>>;
325
457
  };
326
- put: {};
327
- delete: {};
458
+ put: {
459
+ "/services/custom-jwt/worker": import("@withtyped/server").PathGuard<"/custom-jwt/worker", unknown, {
460
+ "jwt.accessToken"?: {
461
+ production?: string | undefined;
462
+ test?: string | undefined;
463
+ } | undefined;
464
+ "jwt.clientCredentials"?: {
465
+ production?: string | undefined;
466
+ test?: string | undefined;
467
+ } | undefined;
468
+ }, unknown>;
469
+ };
470
+ delete: {
471
+ "/services/custom-jwt/worker": import("@withtyped/server").PathGuard<"/custom-jwt/worker", unknown, unknown, unknown>;
472
+ };
328
473
  copy: {};
329
474
  head: {};
330
475
  }, "/api">>, import("@withtyped/server").RoutesWithPrefix<{
@@ -336,18 +481,6 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
336
481
  createdAt: Date;
337
482
  name: string;
338
483
  updatedAt: Date;
339
- stripeProducts: {
340
- type: "flat" | "tier1" | "tier2" | "tier3";
341
- id: string;
342
- name: string;
343
- price: {
344
- id: string;
345
- unitAmountDecimal: string;
346
- quantity?: 1 | undefined;
347
- unitAmount?: number | null | undefined;
348
- };
349
- description?: string | undefined;
350
- }[];
351
484
  quota: {
352
485
  mauLimit: number | null;
353
486
  tokenLimit: number | null;
@@ -370,7 +503,64 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
370
503
  ssoEnabled: boolean;
371
504
  thirdPartyApplicationsLimit: number | null;
372
505
  tenantMembersLimit: number | null;
506
+ customJwtEnabled: boolean;
507
+ subjectTokenEnabled: boolean;
508
+ bringYourUiEnabled: boolean;
373
509
  };
510
+ stripeProducts: {
511
+ type: "flat" | "tier1" | "tier2" | "tier3";
512
+ id: string;
513
+ name: string;
514
+ price: {
515
+ id: string;
516
+ unitAmountDecimal: string;
517
+ quantity?: 1 | undefined;
518
+ unitAmount?: number | null | undefined;
519
+ };
520
+ description?: string | undefined;
521
+ }[];
522
+ }[]>;
523
+ };
524
+ post: {};
525
+ put: {};
526
+ delete: {};
527
+ copy: {};
528
+ head: {};
529
+ }, "/api">>, import("@withtyped/server").RoutesWithPrefix<{
530
+ patch: {};
531
+ options: {};
532
+ get: {
533
+ "/skus": import("@withtyped/server").PathGuard<"/", {
534
+ type?: LogtoSkuType | undefined;
535
+ }, unknown, {
536
+ type: LogtoSkuType;
537
+ id: string;
538
+ name: string | null;
539
+ quota: {
540
+ mauLimit?: number | null | undefined;
541
+ tokenLimit?: number | null | undefined;
542
+ applicationsLimit?: number | null | undefined;
543
+ machineToMachineLimit?: number | null | undefined;
544
+ resourcesLimit?: number | null | undefined;
545
+ scopesPerResourceLimit?: number | null | undefined;
546
+ socialConnectorsLimit?: number | null | undefined;
547
+ machineToMachineRolesLimit?: number | null | undefined;
548
+ scopesPerRoleLimit?: number | null | undefined;
549
+ hooksLimit?: number | null | undefined;
550
+ auditLogsRetentionDays?: number | null | undefined;
551
+ mfaEnabled?: boolean | undefined;
552
+ organizationsEnabled?: boolean | undefined;
553
+ thirdPartyApplicationsLimit?: number | null | undefined;
554
+ tenantMembersLimit?: number | null | undefined;
555
+ customJwtEnabled?: boolean | undefined;
556
+ subjectTokenEnabled?: boolean | undefined;
557
+ bringYourUiEnabled?: boolean | undefined;
558
+ userRolesLimit?: number | null | undefined;
559
+ enterpriseSsoLimit?: number | null | undefined;
560
+ };
561
+ createdAt: Date;
562
+ updatedAt: Date;
563
+ unitPrice: number | null;
374
564
  }[]>;
375
565
  };
376
566
  post: {};
@@ -397,9 +587,11 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
397
587
  planId: string;
398
588
  successCallbackUrl: string;
399
589
  tenantId?: string | undefined;
400
- cancelCallbackUrl?: string | undefined;
401
- tenantTag?: TenantTag | undefined;
402
590
  tenantName?: string | undefined;
591
+ tenantTag?: TenantTag | undefined;
592
+ tenantRegionName?: RegionName | undefined;
593
+ skuId?: string | undefined;
594
+ cancelCallbackUrl?: string | undefined;
403
595
  }, {
404
596
  sessionId: string;
405
597
  redirectUri?: string | null | undefined;
@@ -490,8 +682,8 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
490
682
  expiresAt: number;
491
683
  organizationRoles: OrganizationRoleEntity[];
492
684
  } & {
493
- tenantTag: TenantTag;
494
685
  tenantName: string;
686
+ tenantTag: TenantTag;
495
687
  })[]>;
496
688
  } & {
497
689
  "/invitations/:invitationId": import("@withtyped/server").PathGuard<"/:invitationId", unknown, unknown, {
@@ -513,9 +705,21 @@ declare const router: import("@withtyped/server").Router<RequestContext, WithAut
513
705
  delete: {};
514
706
  copy: {};
515
707
  head: {};
708
+ }, "/api">>, import("@withtyped/server").RoutesWithPrefix<{
709
+ patch: {};
710
+ options: {};
711
+ get: {};
712
+ post: {};
713
+ put: {};
714
+ delete: {
715
+ "/me": import("@withtyped/server").PathGuard<"/", unknown, unknown, unknown>;
716
+ };
717
+ copy: {};
718
+ head: {};
516
719
  }, "/api">>, "/api">;
517
720
  export declare const tenantAuthRouter: import("@withtyped/server").Router<RequestContext, import("@withtyped/server").WithBodyContext<import("@withtyped/server").BaseContext & {
518
721
  request: {
722
+ id?: string | undefined;
519
723
  method?: import("@withtyped/server").RequestMethod | undefined;
520
724
  headers: import("http").IncomingHttpHeaders;
521
725
  url: URL;
@@ -550,6 +754,8 @@ export declare const tenantAuthRouter: import("@withtyped/server").Router<Reques
550
754
  avatar: string | null;
551
755
  organizationRoles: OrganizationRoleEntity[];
552
756
  }[]>;
757
+ } & {
758
+ "/:tenantId/members/:userId/scopes": import("@withtyped/server").PathGuard<"/:tenantId/members/:userId/scopes", unknown, unknown, OrganizationScope[]>;
553
759
  } & {
554
760
  "/:tenantId/invitations": import("@withtyped/server").PathGuard<"/:tenantId/invitations", unknown, unknown, ({
555
761
  id: string;
@@ -601,35 +807,6 @@ export declare const tenantAuthRouter: import("@withtyped/server").Router<Reques
601
807
  copy: {};
602
808
  head: {};
603
809
  }, "/api/tenants">>, "/api/tenants">;
604
- export declare const functionsRouter: import("@withtyped/server").Router<RequestContext, WithAuthContext<Omit<import("@withtyped/server").BaseContext & {
605
- request: {
606
- method?: import("@withtyped/server").RequestMethod | undefined;
607
- headers: import("http").IncomingHttpHeaders;
608
- url: URL;
609
- body?: unknown;
610
- };
611
- }, "request"> & {
612
- request: Record<string, unknown> & {
613
- method?: import("@withtyped/server").RequestMethod | undefined;
614
- headers: import("http").IncomingHttpHeaders;
615
- url: URL;
616
- body?: unknown;
617
- } & {
618
- body?: Json | undefined;
619
- bodyRaw?: Buffer | undefined;
620
- };
621
- }>, import("@withtyped/server").MergeRoutes<import("@withtyped/server").BaseRoutes, import("@withtyped/server").RoutesWithPrefix<{
622
- patch: {};
623
- options: {};
624
- get: {};
625
- post: {
626
- "/database-alteration": import("@withtyped/server").PathGuard<"/database-alteration", unknown, Json, unknown>;
627
- };
628
- put: {};
629
- delete: {};
630
- copy: {};
631
- head: {};
632
- }, "/functions">>, "/functions">;
633
810
 
634
811
  export {
635
812
  router as default,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@logto/cloud",
3
- "version": "0.2.5-ab8a489",
3
+ "version": "0.2.5-c14ed4e",
4
4
  "description": "Logto Cloud service.",
5
5
  "main": "build/index.js",
6
6
  "author": "Silverhand Inc. <contact@silverhand.io>",
@@ -16,21 +16,21 @@
16
16
  "#src/*": "./build/*"
17
17
  },
18
18
  "devDependencies": {
19
- "@silverhand/eslint-config": "5.0.0",
20
- "@silverhand/ts-config": "5.0.0",
19
+ "@silverhand/eslint-config": "6.0.1",
20
+ "@silverhand/ts-config": "6.0.0",
21
21
  "@types/accepts": "^1.3.5",
22
22
  "@types/http-proxy": "^1.17.9",
23
23
  "@types/mime-types": "^2.1.1",
24
24
  "@types/node": "^20.0.0",
25
25
  "@types/yargs": "^17.0.24",
26
26
  "dts-bundle-generator": "^9.3.1",
27
- "eslint": "^8.44.0",
27
+ "eslint": "^8.57.0",
28
28
  "lint-staged": "^15.0.0",
29
29
  "nodemon": "^3.0.0",
30
30
  "prettier": "^3.0.0",
31
31
  "typescript": "^5.3.3",
32
32
  "vite-tsconfig-paths": "^4.3.1",
33
- "vitest": "^1.0.0"
33
+ "vitest": "^2.0.0"
34
34
  },
35
35
  "engines": {
36
36
  "node": "^20.9.0"
@@ -49,8 +49,8 @@
49
49
  "access": "public"
50
50
  },
51
51
  "dependencies": {
52
- "@silverhand/essentials": "^2.9.0",
53
- "@withtyped/server": "^0.13.3"
52
+ "@silverhand/essentials": "^2.9.1",
53
+ "@withtyped/server": "^0.13.6"
54
54
  },
55
55
  "scripts": {
56
56
  "precommit": "lint-staged",