@awsless/awsless 0.0.164 → 0.0.166

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 (35) hide show
  1. package/README.MD +77 -101
  2. package/dist/bin.js +4136 -8340
  3. package/dist/client.js +2 -2
  4. package/dist/server.d.ts +121 -0
  5. package/dist/{index.js → server.js} +48 -55
  6. package/package.json +23 -11
  7. package/dist/app.json +0 -1
  8. package/dist/chunk-PFTL6L4F.js +0 -6
  9. package/dist/features/cognito-client-secret/HASH +0 -1
  10. package/dist/features/cognito-client-secret/bundle.zip +0 -0
  11. package/dist/features/cognito-client-secret/index.js +0 -60
  12. package/dist/features/cognito-client-secret/index.mjs +0 -58
  13. package/dist/features/delete-bucket/HASH +0 -1
  14. package/dist/features/delete-bucket/bundle.zip +0 -0
  15. package/dist/features/delete-bucket/index.js +0 -88
  16. package/dist/features/delete-bucket/index.mjs +0 -86
  17. package/dist/features/delete-hosted-zone/HASH +0 -1
  18. package/dist/features/delete-hosted-zone/bundle.zip +0 -0
  19. package/dist/features/delete-hosted-zone/index.js +0 -130
  20. package/dist/features/delete-hosted-zone/index.mjs +0 -128
  21. package/dist/features/global-exports/HASH +0 -1
  22. package/dist/features/global-exports/bundle.zip +0 -0
  23. package/dist/features/global-exports/index.js +0 -63
  24. package/dist/features/global-exports/index.mjs +0 -61
  25. package/dist/features/invalidate-cache/HASH +0 -1
  26. package/dist/features/invalidate-cache/bundle.zip +0 -0
  27. package/dist/features/invalidate-cache/index.js +0 -63
  28. package/dist/features/invalidate-cache/index.mjs +0 -61
  29. package/dist/features/upload-bucket-asset/HASH +0 -1
  30. package/dist/features/upload-bucket-asset/bundle.zip +0 -0
  31. package/dist/features/upload-bucket-asset/index.js +0 -22015
  32. package/dist/features/upload-bucket-asset/index.mjs +0 -22013
  33. package/dist/index.d.ts +0 -11536
  34. package/dist/json.js +0 -961
  35. package/dist/stack.json +0 -1
package/dist/client.js CHANGED
@@ -1,4 +1,4 @@
1
- // src/node/http.ts
1
+ // src/lib/resource/http.ts
2
2
  var createHttpFetcher = (host) => {
3
3
  return async ({ method, path, headers, body, query }) => {
4
4
  const url = new URL(host, path);
@@ -20,7 +20,7 @@ var createHttpFetcher = (host) => {
20
20
  var createHttpClient = (fetcher) => {
21
21
  const fetch2 = (method, routeKey, props) => {
22
22
  const path = routeKey.replaceAll(/{([a-z0-1-]+)}/, (key) => {
23
- return props?.params?.[key.substring(1, key.length - 1)].toString() ?? "";
23
+ return props?.params?.[key.substring(1, key.length - 1)]?.toString() ?? "";
24
24
  });
25
25
  return fetcher({
26
26
  headers: new Headers(props?.headers),
@@ -0,0 +1,121 @@
1
+ import * as _awsless_lambda from '@awsless/lambda';
2
+ import { Handler, Loggers } from '@awsless/lambda';
3
+ import { BaseSchema, SnsTopicSchema, SqsQueueSchema } from '@awsless/validate';
4
+ import * as valibot from 'valibot';
5
+
6
+ declare const APP: "app";
7
+ declare const STACK: "stack";
8
+
9
+ declare const getFunctionName: <N extends string, S extends string = "stack">(name: N, stack?: S) => `app--${S}--function--${N}`;
10
+ interface FunctionResources {
11
+ }
12
+ declare const Function: FunctionResources;
13
+ declare const Fn: FunctionResources;
14
+
15
+ declare const getAuthName: <N extends string>(name: N) => `app--auth--${N}`;
16
+ interface AuthResources {
17
+ }
18
+ declare const Auth: AuthResources;
19
+ declare const getAuthProps: (name: string) => {
20
+ readonly name: `app--auth--${string}`;
21
+ readonly userPoolId: string;
22
+ readonly clientId: string;
23
+ readonly clientSecret: string;
24
+ };
25
+
26
+ declare const getTableName: <N extends string, S extends string = "stack">(name: N, stack?: S) => `app--${S}--table--${N}`;
27
+ interface TableResources {
28
+ }
29
+ declare const Table: TableResources;
30
+
31
+ declare const getTopicName: <N extends string>(name: N) => `app--topic--${N}`;
32
+ interface TopicResources {
33
+ }
34
+ declare const Topic: TopicResources;
35
+
36
+ declare const getQueueName: <N extends string, S extends string = "stack">(name: N, stack?: S) => `app--${S}--queue--${N}`;
37
+ interface QueueResources {
38
+ }
39
+ declare const Queue: QueueResources;
40
+
41
+ declare const getCacheProps: (name: string, stack?: string) => {
42
+ readonly host: string;
43
+ readonly port: number;
44
+ };
45
+ interface CacheResources {
46
+ }
47
+ declare const Cache: CacheResources;
48
+
49
+ declare const getStoreName: <N extends string, S extends string = "stack">(name: N, stack?: S) => `app--${S}--store--${N}`;
50
+ interface StoreResources {
51
+ }
52
+ declare const Store: StoreResources;
53
+
54
+ declare const getConfigName: (name: string) => string;
55
+ interface ConfigResources {
56
+ }
57
+ declare const Config: ConfigResources;
58
+
59
+ declare const getSearchName: <N extends string, S extends string = "stack">(name: N, stack?: S) => `app--${S}--search--${N}`;
60
+ interface SearchResources {
61
+ }
62
+ declare const Search: SearchResources;
63
+
64
+ type FunctionProps<H extends Handler<S>, S extends BaseSchema> = {
65
+ handle: H;
66
+ schema?: S;
67
+ logger?: Loggers;
68
+ logViewableErrors?: boolean;
69
+ };
70
+ declare const func: <H extends Handler<S, unknown>, S extends BaseSchema<any, any>>(props: FunctionProps<H, S>) => (event: _awsless_lambda.Input<S>, context?: _awsless_lambda.LambdaContext | undefined) => Promise<ReturnType<H>>;
71
+
72
+ type TopicProps<H extends Handler<S>, S extends BaseSchema> = {
73
+ handle: H;
74
+ schema?: S;
75
+ logger?: Loggers;
76
+ };
77
+ declare const topic: <H extends Handler<SnsTopicSchema<S>, unknown>, S extends BaseSchema<any, any>>(props: TopicProps<H, S>) => (event: valibot.Input<S> | valibot.Input<S>[] | {
78
+ Records: {
79
+ Sns: {
80
+ Message: string | valibot.Input<S>;
81
+ };
82
+ }[];
83
+ }, context?: _awsless_lambda.LambdaContext | undefined) => Promise<ReturnType<H>>;
84
+
85
+ type QueueProps<H extends Handler<S>, S extends BaseSchema> = {
86
+ handle: H;
87
+ schema?: S;
88
+ logger?: Loggers;
89
+ };
90
+ declare const queue: <H extends Handler<SqsQueueSchema<S>, unknown>, S extends BaseSchema<any, any>>(props: QueueProps<H, S>) => (event: valibot.Input<S> | valibot.Input<S>[] | {
91
+ Records: {
92
+ body: string | valibot.Input<S>;
93
+ }[];
94
+ }, context?: _awsless_lambda.LambdaContext | undefined) => Promise<ReturnType<H>>;
95
+
96
+ type CronProps<H extends Handler<S>, S extends BaseSchema> = {
97
+ handle: H;
98
+ schema?: S;
99
+ logger?: Loggers;
100
+ };
101
+ declare const cron: <H extends Handler<S, unknown>, S extends BaseSchema<any, any>>(props: CronProps<H, S>) => (event: _awsless_lambda.Input<S>, context?: _awsless_lambda.LambdaContext | undefined) => Promise<ReturnType<H>>;
102
+
103
+ interface FunctionMock {
104
+ }
105
+ interface FunctionMockResponse {
106
+ }
107
+ declare const mockFunction: (cb: (mock: FunctionMock) => void) => FunctionMockResponse;
108
+
109
+ interface TopicMock {
110
+ }
111
+ interface TopicMockResponse {
112
+ }
113
+ declare const mockTopic: (cb: (mock: TopicMock) => void) => TopicMockResponse;
114
+
115
+ interface QueueMock {
116
+ }
117
+ interface QueueMockResponse {
118
+ }
119
+ declare const mockQueue: (cb: (mock: QueueMock) => void) => QueueMockResponse;
120
+
121
+ export { APP, Auth, AuthResources, Cache, CacheResources, Config, ConfigResources, CronProps, Fn, Function, FunctionMock, FunctionMockResponse, FunctionProps, FunctionResources, Queue, QueueMock, QueueMockResponse, QueueProps, QueueResources, STACK, Search, SearchResources, Store, StoreResources, Table, TableResources, Topic, TopicMock, TopicMockResponse, TopicProps, TopicResources, cron, func, getAuthName, getAuthProps, getCacheProps, getConfigName, getFunctionName, getQueueName, getSearchName, getStoreName, getTableName, getTopicName, mockFunction, mockQueue, mockTopic, queue, topic };
@@ -1,41 +1,39 @@
1
- import {
2
- definePlugin
3
- } from "./chunk-PFTL6L4F.js";
4
-
5
- // src/node/resource.ts
1
+ // src/lib/resource/util.ts
6
2
  import { paramCase } from "change-case";
7
- var APP = process.env.APP || "app";
8
- var STACK = process.env.STACK || "stack";
9
- var STAGE = process.env.STAGE || "stage";
10
- function getLocalResourceName(name, stack = STACK, resource) {
11
- return `${resource ? paramCase(resource) + "-" : ""}${APP}-${paramCase(stack)}-${paramCase(name)}`;
12
- }
13
- function getGlobalResourceName(name, resource) {
14
- return `${resource ? paramCase(resource) + "-" : ""}${APP}-${paramCase(name)}`;
15
- }
16
-
17
- // src/node/function.ts
18
- import { invoke } from "@awsless/lambda";
19
-
20
- // src/node/util.ts
3
+ var APP = process.env.APP ?? "app";
4
+ var STACK = process.env.STACK ?? "stack";
5
+ var bindLocalResourceName = (type) => {
6
+ return (name, stack = STACK) => {
7
+ return [APP, paramCase(stack), paramCase(type), paramCase(name)].join(
8
+ "--"
9
+ );
10
+ };
11
+ };
12
+ var bindGlobalResourceName = (type) => {
13
+ return (name) => {
14
+ return [APP, paramCase(type), paramCase(name)].join("--");
15
+ };
16
+ };
21
17
  var createProxy = /* @__NO_SIDE_EFFECTS__ */ (cb) => {
22
18
  const cache2 = /* @__PURE__ */ new Map();
23
- return new Proxy({}, {
24
- get(_, name) {
25
- if (!cache2.has(name)) {
26
- cache2.set(name, cb(name));
19
+ return new Proxy(
20
+ {},
21
+ {
22
+ get(_, name) {
23
+ if (!cache2.has(name)) {
24
+ cache2.set(name, cb(name));
25
+ }
26
+ return cache2.get(name);
27
27
  }
28
- return cache2.get(name);
29
28
  }
30
- });
29
+ );
31
30
  };
32
31
 
33
- // src/node/function.ts
32
+ // src/lib/resource/function.ts
33
+ import { invoke } from "@awsless/lambda";
34
34
  import { WeakCache } from "@awsless/weak-cache";
35
35
  var cache = new WeakCache();
36
- var getFunctionName = (stack, name) => {
37
- return getLocalResourceName(name, stack);
38
- };
36
+ var getFunctionName = bindLocalResourceName("function");
39
37
  var Function = /* @__PURE__ */ createProxy((stackName) => {
40
38
  return createProxy((funcName) => {
41
39
  const name = getFunctionName(stackName, funcName);
@@ -74,9 +72,9 @@ var Function = /* @__PURE__ */ createProxy((stackName) => {
74
72
  });
75
73
  var Fn = Function;
76
74
 
77
- // src/node/auth.ts
75
+ // src/lib/resource/auth.ts
78
76
  import { constantCase } from "change-case";
79
- var getAuthName = getGlobalResourceName;
77
+ var getAuthName = bindGlobalResourceName("auth");
80
78
  var Auth = /* @__PURE__ */ createProxy((name) => {
81
79
  return getAuthProps(name);
82
80
  });
@@ -94,17 +92,17 @@ var getAuthProps = (name) => {
94
92
  };
95
93
  };
96
94
 
97
- // src/node/table.ts
98
- var getTableName = getLocalResourceName;
95
+ // src/lib/resource/table.ts
96
+ var getTableName = bindLocalResourceName("table");
99
97
  var Table = /* @__PURE__ */ createProxy((stack) => {
100
98
  return createProxy((name) => {
101
99
  return getTableName(name, stack);
102
100
  });
103
101
  });
104
102
 
105
- // src/node/topic.ts
103
+ // src/lib/resource/topic.ts
106
104
  import { publish } from "@awsless/sns";
107
- var getTopicName = getGlobalResourceName;
105
+ var getTopicName = bindGlobalResourceName("topic");
108
106
  var Topic = /* @__PURE__ */ createProxy((name) => {
109
107
  const topic2 = getTopicName(name);
110
108
  const ctx = {
@@ -120,13 +118,13 @@ var Topic = /* @__PURE__ */ createProxy((name) => {
120
118
  return call;
121
119
  });
122
120
 
123
- // src/node/queue.ts
121
+ // src/lib/resource/queue.ts
124
122
  import {
125
123
  sendMessage,
126
124
  sendMessageBatch
127
125
  } from "@awsless/sqs";
128
126
  import { constantCase as constantCase2 } from "change-case";
129
- var getQueueName = getLocalResourceName;
127
+ var getQueueName = bindLocalResourceName("queue");
130
128
  var getQueueUrl = (name, stack = STACK) => {
131
129
  return process.env[`QUEUE_${constantCase2(stack)}_${constantCase2(name)}_URL`];
132
130
  };
@@ -156,7 +154,7 @@ var Queue = /* @__PURE__ */ createProxy((stack) => {
156
154
  });
157
155
  });
158
156
 
159
- // src/node/cache.ts
157
+ // src/lib/resource/cache.ts
160
158
  import { constantCase as constantCase3 } from "change-case";
161
159
  import { command } from "@awsless/redis";
162
160
  var getCacheProps = (name, stack = STACK) => {
@@ -190,11 +188,9 @@ var Cache = /* @__PURE__ */ createProxy((stack) => {
190
188
  });
191
189
  });
192
190
 
193
- // src/node/store.ts
191
+ // src/lib/resource/store.ts
194
192
  import { putObject, getObject, deleteObject } from "@awsless/s3";
195
- var getStoreName = (name, stack) => {
196
- return getLocalResourceName(name, stack, "store");
197
- };
193
+ var getStoreName = bindLocalResourceName("store");
198
194
  var Store = /* @__PURE__ */ createProxy((stack) => {
199
195
  return createProxy((name) => {
200
196
  const bucket = getStoreName(name, stack);
@@ -222,7 +218,7 @@ var Store = /* @__PURE__ */ createProxy((stack) => {
222
218
  });
223
219
  });
224
220
 
225
- // src/node/config.ts
221
+ // src/lib/resource/config.ts
226
222
  import { ssm } from "@awsless/ssm";
227
223
  import { paramCase as paramCase2 } from "change-case";
228
224
  var getConfigName = (name) => {
@@ -265,8 +261,8 @@ var Config = /* @__PURE__ */ new Proxy(
265
261
  }
266
262
  );
267
263
 
268
- // src/node/search.ts
269
- var getSearchName = getLocalResourceName;
264
+ // src/lib/resource/search.ts
265
+ var getSearchName = bindLocalResourceName("search");
270
266
  var Search = /* @__PURE__ */ createProxy((stack) => {
271
267
  return createProxy((name) => {
272
268
  return {
@@ -275,13 +271,13 @@ var Search = /* @__PURE__ */ createProxy((stack) => {
275
271
  });
276
272
  });
277
273
 
278
- // src/node/handle/function.ts
274
+ // src/lib/handle/function.ts
279
275
  import { lambda } from "@awsless/lambda";
280
276
  var func = (props) => {
281
277
  return lambda(props);
282
278
  };
283
279
 
284
- // src/node/handle/topic.ts
280
+ // src/lib/handle/topic.ts
285
281
  import { snsTopic } from "@awsless/validate";
286
282
  import { lambda as lambda2 } from "@awsless/lambda";
287
283
  var topic = (props) => {
@@ -293,7 +289,7 @@ var topic = (props) => {
293
289
  });
294
290
  };
295
291
 
296
- // src/node/handle/queue.ts
292
+ // src/lib/handle/queue.ts
297
293
  import { lambda as lambda3 } from "@awsless/lambda";
298
294
  import { sqsQueue } from "@awsless/validate";
299
295
  var queue = (props) => {
@@ -305,7 +301,7 @@ var queue = (props) => {
305
301
  });
306
302
  };
307
303
 
308
- // src/node/handle/cron.ts
304
+ // src/lib/handle/cron.ts
309
305
  import { lambda as lambda4 } from "@awsless/lambda";
310
306
  var cron = (props) => {
311
307
  return lambda4({
@@ -314,7 +310,7 @@ var cron = (props) => {
314
310
  });
315
311
  };
316
312
 
317
- // src/node/mock/function.ts
313
+ // src/lib/mock/function.ts
318
314
  import { mockLambda } from "@awsless/lambda";
319
315
  var mockFunction = (cb) => {
320
316
  const list = {};
@@ -335,7 +331,7 @@ var mockFunction = (cb) => {
335
331
  });
336
332
  };
337
333
 
338
- // src/node/mock/topic.ts
334
+ // src/lib/mock/topic.ts
339
335
  import { mockSNS } from "@awsless/sns";
340
336
  var mockTopic = (cb) => {
341
337
  const list = {};
@@ -352,7 +348,7 @@ var mockTopic = (cb) => {
352
348
  });
353
349
  };
354
350
 
355
- // src/node/mock/queue.ts
351
+ // src/lib/mock/queue.ts
356
352
  import { mockSQS } from "@awsless/sqs";
357
353
  var mockQueue = (cb) => {
358
354
  const list = {};
@@ -386,15 +382,12 @@ export {
386
382
  Table,
387
383
  Topic,
388
384
  cron,
389
- definePlugin,
390
385
  func,
391
386
  getAuthName,
392
387
  getAuthProps,
393
388
  getCacheProps,
394
389
  getConfigName,
395
390
  getFunctionName,
396
- getGlobalResourceName,
397
- getLocalResourceName,
398
391
  getQueueName,
399
392
  getSearchName,
400
393
  getStoreName,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@awsless/awsless",
3
- "version": "0.0.164",
3
+ "version": "0.0.166",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -15,12 +15,12 @@
15
15
  "dist"
16
16
  ],
17
17
  "bin": "./dist/bin.js",
18
- "module": "./dist/index.js",
19
- "types": "./dist/index.d.ts",
18
+ "module": "./dist/server.js",
19
+ "types": "./dist/server.d.ts",
20
20
  "exports": {
21
21
  ".": {
22
- "import": "./dist/index.js",
23
- "types": "./dist/index.d.ts"
22
+ "import": "./dist/server.js",
23
+ "types": "./dist/server.d.ts"
24
24
  },
25
25
  "./client": {
26
26
  "import": "./dist/client.js",
@@ -29,10 +29,10 @@
29
29
  },
30
30
  "peerDependencies": {
31
31
  "@awsless/lambda": "^0.0.18",
32
- "@awsless/redis": "^0.0.11",
32
+ "@awsless/sqs": "^0.0.7",
33
33
  "@awsless/s3": "^0.0.10",
34
+ "@awsless/redis": "^0.0.12",
34
35
  "@awsless/sns": "^0.0.7",
35
- "@awsless/sqs": "^0.0.7",
36
36
  "@awsless/validate": "^0.0.13",
37
37
  "@awsless/ssm": "^0.0.7",
38
38
  "@awsless/weak-cache": "^0.0.1"
@@ -42,6 +42,7 @@
42
42
  "@aws-sdk/client-cloudformation": "^3.369.0",
43
43
  "@aws-sdk/client-cloudfront": "^3.425.0",
44
44
  "@aws-sdk/client-cognito-identity-provider": "^3.441.0",
45
+ "@aws-sdk/client-dynamodb": "3.363.0",
45
46
  "@aws-sdk/client-lambda": "3.329.0",
46
47
  "@aws-sdk/client-route-53": "^3.369.0",
47
48
  "@aws-sdk/client-s3": "^3.369.0",
@@ -49,6 +50,7 @@
49
50
  "@aws-sdk/client-sts": "^3.369.0",
50
51
  "@aws-sdk/credential-providers": "^3.369.0",
51
52
  "@aws-sdk/lib-storage": "^3.423.0",
53
+ "@clack/prompts": "^0.7.0",
52
54
  "@graphql-tools/merge": "^9.0.0",
53
55
  "@rollup/plugin-commonjs": "^25.0.5",
54
56
  "@rollup/plugin-json": "^6.0.1",
@@ -59,6 +61,8 @@
59
61
  "@types/decompress": "^4.2.4",
60
62
  "@types/mime-types": "^2.1.2",
61
63
  "@types/pretty-hrtime": "^1.0.1",
64
+ "@types/promise-dag": "^1.0.4",
65
+ "@types/uuid": "^9.0.0",
62
66
  "@vitest/runner": "^0.34.6",
63
67
  "aws-cron-expression-validator": "^1.0.5",
64
68
  "aws-lambda": "^1.0.7",
@@ -66,6 +70,7 @@
66
70
  "change-case": "^4.1.2",
67
71
  "chokidar": "^3.5.3",
68
72
  "chunk": "^0.0.3",
73
+ "cli-table3": "^0.6.4",
69
74
  "commander": "^9.4.1",
70
75
  "decompress": "^4.2.1",
71
76
  "deepmerge": "^4.3.1",
@@ -80,25 +85,32 @@
80
85
  "parse-imports": "^1.1.2",
81
86
  "parse-static-imports": "^1.1.0",
82
87
  "pretty-hrtime": "^1.0.3",
88
+ "promise-dag": "^1.0.0",
83
89
  "rollup": "^4.0.2",
84
90
  "rollup-plugin-replace": "^2.2.0",
85
91
  "rollup-plugin-swc3": "^0.10.2",
86
92
  "type-fest": "^3.6.0",
93
+ "uuid": "^9.0.0",
87
94
  "vite": "^5.0.0",
88
95
  "vitest": "^0.34.6",
89
96
  "wrap-ansi": "^8.1.0",
90
97
  "zod": "^3.21.4",
91
98
  "zod-to-json-schema": "^3.22.3",
99
+ "@awsless/duration": "^0.0.1",
100
+ "@awsless/formation": "^0.0.1",
92
101
  "@awsless/graphql": "^0.0.9",
102
+ "@awsless/validate": "^0.0.13",
103
+ "@awsless/size": "^0.0.1",
93
104
  "@awsless/code": "^0.0.10"
94
105
  },
95
106
  "scripts": {
96
107
  "test": "pnpm code test",
97
108
  "term": "zsh -c 'node dist/bin.js ${*} --config-file=./test/_data/app.jsonc' --",
98
109
  "berm": "zsh -c 'pnpm build; pnpm build-features; pnpm build-json-schema; node dist/bin.js ${*} --config-file=./test/_data/app.jsonc' --",
99
- "build": "pnpm tsup src/index.ts src/bin.ts src/client.ts --format esm --dts --clean",
100
- "build-json-schema": "pnpm tsup src/config/json.ts --format esm; node ./dist/json.js",
101
- "build-features": "node ./features/build.js",
102
- "prepublish": "if pnpm test schema; then pnpm build; pnpm build-features; pnpm build-json-schema; else exit; fi"
110
+ "build": "pnpm tsup src/server.ts src/client.ts src/bin.ts --format esm --dts --clean",
111
+ "build-json-schema": "pnpm tsup cli/build-json-schema.ts --format esm; node ./dist/build-json-schema.js",
112
+ "jack": "pnpm tsup ./example/jack/jack.ts --format esm; node ./dist/jack.js",
113
+ "kennedy": "pnpm tsup ./example/kennedy/kennedy.ts --format esm; node ./dist/kennedy.js",
114
+ "prepublish": "if pnpm test; then pnpm build-json-schema; pnpm build; else exit; fi"
103
115
  }
104
116
  }