@appweaver/create-weaver-app 1.0.21 → 1.0.23

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.
@@ -89,6 +89,8 @@ program
89
89
  await promises_1.default.rm(node_path_1.default.join(destDir, dockerFile), { force: true });
90
90
  }
91
91
  }
92
+ // Build database-specific docker-compose service blocks
93
+ const dockerDb = getDatabaseDockerConfig(command, sanitizedName);
92
94
  // Define all variables used in template files with .tpl extension
93
95
  const variables = {
94
96
  NAME: name.charAt(0).toUpperCase() + name.slice(1),
@@ -99,6 +101,11 @@ program
99
101
  DEPENDENCIES: getNodeDependencies(command, runtime).join(',\n'),
100
102
  DATABASE_URL: getDatabaseUrl(command, sanitizedName, 'dev'),
101
103
  DATABASE_TEST_URL: getDatabaseUrl(command, sanitizedName, 'test'),
104
+ DATABASE_DOCKER_SERVICE: dockerDb.service,
105
+ DATABASE_DOCKER_MIGRATE_DEPENDS: dockerDb.migrateDepends,
106
+ DATABASE_DOCKER_SQLITE_VOLUMES: dockerDb.sqliteVolumes,
107
+ DATABASE_DOCKER_APP_VOLUME: dockerDb.appVolume,
108
+ DATABASE_DOCKER_NAMED_VOLUME: dockerDb.namedVolume,
102
109
  VERSION: pkg.version
103
110
  };
104
111
  // Process .tpl files: replace variables and remove .tpl extension
@@ -133,6 +140,10 @@ program
133
140
  }
134
141
  // Create test reports directory
135
142
  await promises_1.default.mkdir(node_path_1.default.join(destDir, 'reports'));
143
+ // Create the SQLite database data directory (matches the "data/" DATABASE_URL)
144
+ if (command.getOptionValue('database') === 'sqlite') {
145
+ await promises_1.default.mkdir(node_path_1.default.join(destDir, 'data'), { recursive: true });
146
+ }
136
147
  // Add instructions for AI Agents and skill files
137
148
  const agent = command.getOptionValue('agent');
138
149
  if (agent !== 'none') {
@@ -218,7 +229,7 @@ function getNodeDependencies(command, runtime) {
218
229
  function getDatabaseUrl(command, name, mode) {
219
230
  const dbName = mode === 'test' ? `${name}-test` : name;
220
231
  const urls = {
221
- sqlite: `file:./${mode === 'test' ? 'temp/' : ''}${dbName}.db`,
232
+ sqlite: `file:./${mode === 'test' ? 'temp/' : 'data/'}${dbName}.db`,
222
233
  postgresql: `postgresql://${name}:${name}@localhost:5432/${dbName}?schema=public`,
223
234
  mysql: `mysql://${name}:${name}@localhost:3306/${dbName}`,
224
235
  sqlserver: `sqlserver://localhost:1433;database=${dbName};user=${name};password=${name};trustServerCertificate=true`
@@ -231,6 +242,116 @@ function getDatabaseUrl(command, name, mode) {
231
242
  }
232
243
  return databaseUrl;
233
244
  }
245
+ function getDatabaseDockerConfig(command, name) {
246
+ const database = command.getOptionValue('database').toLowerCase();
247
+ // SQLite runs embedded in the application, so there is no database service.
248
+ // The database file is persisted in a named volume shared by the migration,
249
+ // seed, and application containers (see the "data/" DATABASE_URL location).
250
+ if (database === 'sqlite') {
251
+ return {
252
+ service: '',
253
+ migrateDepends: '',
254
+ sqliteVolumes: ` volumes:\n - sqlite-data:/usr/app/data\n`,
255
+ appVolume: `\n - sqlite-data:/usr/app/data`,
256
+ namedVolume: ` sqlite-data:\n`
257
+ };
258
+ }
259
+ const services = {
260
+ postgresql: {
261
+ service: ` postgres:
262
+ image: postgres:18.4
263
+ container_name: ${name}-postgres
264
+ restart: unless-stopped
265
+ healthcheck:
266
+ test: "PGPASSWORD=$$POSTGRES_PASSWORD psql -U $$POSTGRES_USER -d $$POSTGRES_DB -c 'SELECT 1'"
267
+ interval: 30s
268
+ timeout: 10s
269
+ retries: 10
270
+ start_period: 5s
271
+ start_interval: 5s
272
+ ports:
273
+ - "127.0.0.1:5433:5432"
274
+ environment:
275
+ POSTGRES_DB: "\${DB_NAME}"
276
+ POSTGRES_USER: "\${DB_USER}"
277
+ POSTGRES_PASSWORD: "\${DB_PASSWORD}"
278
+ volumes:
279
+ - postgres-data:/var/lib/postgresql
280
+ networks:
281
+ - ${name}
282
+
283
+ `,
284
+ volume: ` postgres-data:\n`
285
+ },
286
+ mysql: {
287
+ service: ` mysql:
288
+ image: mysql:8.4
289
+ container_name: ${name}-mysql
290
+ restart: unless-stopped
291
+ healthcheck:
292
+ test: [ "CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD" ]
293
+ interval: 30s
294
+ timeout: 10s
295
+ retries: 10
296
+ start_period: 5s
297
+ start_interval: 5s
298
+ ports:
299
+ - "127.0.0.1:3307:3306"
300
+ environment:
301
+ MYSQL_DATABASE: "\${DB_NAME}"
302
+ MYSQL_USER: "\${DB_USER}"
303
+ MYSQL_PASSWORD: "\${DB_PASSWORD}"
304
+ MYSQL_ROOT_PASSWORD: "\${DB_PASSWORD}"
305
+ volumes:
306
+ - mysql-data:/var/lib/mysql
307
+ networks:
308
+ - ${name}
309
+
310
+ `,
311
+ volume: ` mysql-data:\n`
312
+ },
313
+ sqlserver: {
314
+ service: ` sqlserver:
315
+ image: mcr.microsoft.com/mssql/server:2022-latest
316
+ container_name: ${name}-sqlserver
317
+ restart: unless-stopped
318
+ healthcheck:
319
+ test: [ "CMD-SHELL", "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P \\"$$MSSQL_SA_PASSWORD\\" -C -Q 'SELECT 1' || exit 1" ]
320
+ interval: 30s
321
+ timeout: 10s
322
+ retries: 10
323
+ start_period: 10s
324
+ start_interval: 5s
325
+ ports:
326
+ - "127.0.0.1:1434:1433"
327
+ environment:
328
+ ACCEPT_EULA: "Y"
329
+ MSSQL_SA_PASSWORD: "\${DB_PASSWORD}"
330
+ volumes:
331
+ - sqlserver-data:/var/opt/mssql
332
+ networks:
333
+ - ${name}
334
+
335
+ `,
336
+ volume: ` sqlserver-data:\n`
337
+ }
338
+ };
339
+ const config = services[database];
340
+ if (!config) {
341
+ console.error(`Invalid database type: ${database}`);
342
+ process.exit(1);
343
+ }
344
+ return {
345
+ service: config.service,
346
+ migrateDepends: ` depends_on:
347
+ ${database === 'postgresql' ? 'postgres' : database}:
348
+ condition: service_healthy
349
+ `,
350
+ sqliteVolumes: '',
351
+ appVolume: '',
352
+ namedVolume: config.volume
353
+ };
354
+ }
234
355
  function runProcess(cmd, args = [], params = {}) {
235
356
  return new Promise((resolve, reject) => {
236
357
  const { destDir, quiet } = params;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@appweaver/create-weaver-app",
3
- "version": "1.0.21",
3
+ "version": "1.0.23",
4
4
  "description": "Appweaver - the backend framework for AI-first development (@create-weaver-app)",
5
5
  "author": "Luka Matosevic",
6
6
  "license": "MIT",
@@ -18,7 +18,7 @@ provides factory methods for creating resource models, services, policies, and r
18
18
  - `appweaver.json` / `appweaver.{env}.json` - central configuration
19
19
  - `Dockerfile` - Docker image definition
20
20
 
21
- **IMPORTANT:** `{env}` is controlled by `NODE_ENV` evironment variable.
21
+ **IMPORTANT:** `{env}` is controlled by `NODE_ENV` environment variable.
22
22
 
23
23
  ## Application entrypoint
24
24
 
@@ -44,6 +44,7 @@ Reads an OpenAPI v3 schema and generates TypeScript types and a typed client cla
44
44
  | `--typesPath [path]` | Output path for generated TypeScript types only | same as `outputPath` |
45
45
  | `--clientPath [path]` | Output path for generated client class only | same as `outputPath` |
46
46
  | `--clientName [name]` | Custom name for the generated client class | derived from schema title |
47
+ | `--framework [name]` | Framework for the generated client class (`fetch` or `angular`) | `fetch` |
47
48
  | `--typesOnly` | Generate TypeScript types only, skip client class generation | `false` |
48
49
  | `--clientOnly` | Generate client class only, skip TypeScript types generation | `false` |
49
50
  | `--noTypes` | Generate client class without TypeScript type support | `false` |
@@ -158,6 +159,27 @@ The generated second type argument to `resourceClient` (e.g., `['aggregate', 'ex
158
159
  removes those methods from the returned `ResourceClient` at the TypeScript level, preventing accidental calls to
159
160
  operations not exposed by the API.
160
161
 
162
+ ### Angular client (`--framework angular`)
163
+
164
+ Passing `--framework angular` generates a client class extending `AngularClient` instead of `FetchClient`. The
165
+ generated class is constructed with Angular's `HttpClient` and all its methods return RxJS `Observable`s instead of
166
+ `Promise`s:
167
+
168
+ ```ts
169
+ import { ClientConfig, ClientError } from '@appweaver/client';
170
+ import { AngularClient } from '@appweaver/client/angular';
171
+ import { HttpClient } from '@angular/common/http';
172
+
173
+ // In an Angular service or provider:
174
+ const client = new CMSAPIClient(httpClient, { baseUrl: 'http://localhost:3000' });
175
+ client.user.query({ filter: { enabled: true } }).subscribe((users) => {});
176
+ ```
177
+
178
+ **Important:** `AngularClient` is only available from the `@appweaver/client/angular` subpath — it is not exported from
179
+ the main `@appweaver/client` entry point. This keeps `rxjs` completely out of the module graph (runtime and types) for
180
+ `FetchClient` users. `rxjs` is an **optional peer dependency**: Angular projects already have it installed, while
181
+ fetch-only projects do not need it at all.
182
+
161
183
  ---
162
184
 
163
185
  ## Runtime library
@@ -29,7 +29,7 @@ WORKDIR /usr/app
29
29
  # Copy NPM package
30
30
  COPY --from=build /usr/app/package*.json /usr/app/
31
31
 
32
- # Install NPM dependencies for production
32
+ # Install production NPM dependencies
33
33
  RUN npm ci --omit=dev
34
34
 
35
35
  # Copy build files
@@ -52,8 +52,8 @@ COPY --from=build /usr/app/start.sh /usr/app/start.sh
52
52
  # Make start script executable
53
53
  RUN chmod +x /usr/app/start.sh
54
54
 
55
- # Create storage and logs directories
56
- RUN mkdir storage logs
55
+ # Create storage, logs, and data directories
56
+ RUN mkdir storage logs data
57
57
 
58
58
  # Start container
59
59
  ENTRYPOINT ["/usr/app/start.sh"]
@@ -52,8 +52,8 @@ COPY --from=build /usr/app/start.sh /usr/app/start.sh
52
52
  # Make start script executable
53
53
  RUN chmod +x /usr/app/start.sh
54
54
 
55
- # Create storage and logs directories
56
- RUN mkdir storage logs
55
+ # Create storage, logs, and data directories
56
+ RUN mkdir storage logs data
57
57
 
58
58
  # Start container
59
59
  ENTRYPOINT ["/usr/app/start.sh"]
@@ -1,107 +1,81 @@
1
- services:
2
- postgres:
3
- image: postgres:18.4
4
- container_name: {{LOWER_NAME}}-postgres
5
- restart: unless-stopped
6
- healthcheck:
7
- test: "PGPASSWORD=$$POSTGRES_PASSWORD psql -U $$POSTGRES_USER -d $$POSTGRES_DB -c 'SELECT 1'"
8
- interval: 30s
9
- timeout: 10s
10
- retries: 10
11
- start_period: 5s
12
- start_interval: 5s
13
- ports:
14
- - "127.0.0.1:5433:5432"
15
- environment:
16
- POSTGRES_DB: "${DB_NAME}"
17
- POSTGRES_USER: "${DB_USER}"
18
- POSTGRES_PASSWORD: "${DB_PASSWORD}"
19
- volumes:
20
- - postgres-data:/var/lib/postgresql
21
- networks:
22
- - {{LOWER_NAME}}
23
-
24
- redis:
25
- image: redis:7.4.9
26
- container_name: {{LOWER_NAME}}-redis
27
- restart: unless-stopped
28
- healthcheck:
29
- test: [ "CMD", "redis-cli", "ping" ]
30
- interval: 30s
31
- timeout: 10s
32
- retries: 10
33
- start_period: 5s
34
- start_interval: 5s
35
- ports:
36
- - "127.0.0.1:6378:6379"
37
- volumes:
38
- - redis-data:/data
39
- networks:
40
- - {{LOWER_NAME}}
41
-
42
- {{LOWER_NAME}}.migrations:
43
- image: {{LOWER_NAME}}:latest
44
- container_name: {{LOWER_NAME}}-migrations
45
- restart: no
46
- build:
47
- context: .
48
- depends_on:
49
- postgres:
50
- condition: service_healthy
51
- env_file:
52
- - .env
53
- command: [ "migrations" ]
54
- networks:
55
- - {{LOWER_NAME}}
56
-
57
- {{LOWER_NAME}}.seed:
58
- image: {{LOWER_NAME}}:latest
59
- container_name: {{LOWER_NAME}}-seed
60
- restart: no
61
- build:
62
- context: .
63
- depends_on:
64
- {{LOWER_NAME}}.migrations:
65
- condition: service_completed_successfully
66
- env_file:
67
- - .env
68
- command: [ "seed" ]
69
- networks:
70
- - {{LOWER_NAME}}
71
-
72
- {{LOWER_NAME}}:
73
- image: {{LOWER_NAME}}:latest
74
- container_name: {{LOWER_NAME}}
75
- restart: unless-stopped
76
- build:
77
- context: .
78
- healthcheck:
79
- test: "wget -qO - http://127.0.0.1:{{PORT}}/health/ready || exit 1"
80
- interval: 30s
81
- timeout: 10s
82
- retries: 5
83
- start_period: 5s
84
- start_interval: 5s
85
- depends_on:
86
- redis:
87
- condition: service_healthy
88
- {{LOWER_NAME}}.seed:
89
- condition: service_completed_successfully
90
- ports:
91
- - "127.0.0.1:{{PORT}}:{{PORT}}"
92
- volumes:
93
- - ./storage:/usr/app/storage
94
- - ./logs:/usr/app/logs
95
- env_file:
96
- - .env
97
- networks:
98
- - {{LOWER_NAME}}
99
-
100
- networks:
101
- {{LOWER_NAME}}:
102
- driver: bridge
103
- name: {{LOWER_NAME}}-network
104
-
105
- volumes:
106
- postgres-data:
107
- redis-data:
1
+ services:
2
+ {{DATABASE_DOCKER_SERVICE}} redis:
3
+ image: redis:7.4.9
4
+ container_name: {{LOWER_NAME}}-redis
5
+ restart: unless-stopped
6
+ healthcheck:
7
+ test: [ "CMD", "redis-cli", "ping" ]
8
+ interval: 30s
9
+ timeout: 10s
10
+ retries: 10
11
+ start_period: 5s
12
+ start_interval: 5s
13
+ ports:
14
+ - "127.0.0.1:6378:6379"
15
+ volumes:
16
+ - redis-data:/data
17
+ networks:
18
+ - {{LOWER_NAME}}
19
+
20
+ {{LOWER_NAME}}.migrations:
21
+ image: {{LOWER_NAME}}:latest
22
+ container_name: {{LOWER_NAME}}-migrations
23
+ restart: no
24
+ build:
25
+ context: .
26
+ {{DATABASE_DOCKER_MIGRATE_DEPENDS}} env_file:
27
+ - .env
28
+ command: [ "migrations" ]
29
+ {{DATABASE_DOCKER_SQLITE_VOLUMES}} networks:
30
+ - {{LOWER_NAME}}
31
+
32
+ {{LOWER_NAME}}.seed:
33
+ image: {{LOWER_NAME}}:latest
34
+ container_name: {{LOWER_NAME}}-seed
35
+ restart: no
36
+ build:
37
+ context: .
38
+ depends_on:
39
+ {{LOWER_NAME}}.migrations:
40
+ condition: service_completed_successfully
41
+ env_file:
42
+ - .env
43
+ command: [ "seed" ]
44
+ {{DATABASE_DOCKER_SQLITE_VOLUMES}} networks:
45
+ - {{LOWER_NAME}}
46
+
47
+ {{LOWER_NAME}}:
48
+ image: {{LOWER_NAME}}:latest
49
+ container_name: {{LOWER_NAME}}
50
+ restart: unless-stopped
51
+ build:
52
+ context: .
53
+ healthcheck:
54
+ test: "wget -qO - http://127.0.0.1:{{PORT}}/health/ready || exit 1"
55
+ interval: 30s
56
+ timeout: 10s
57
+ retries: 5
58
+ start_period: 5s
59
+ start_interval: 5s
60
+ depends_on:
61
+ redis:
62
+ condition: service_healthy
63
+ {{LOWER_NAME}}.seed:
64
+ condition: service_completed_successfully
65
+ ports:
66
+ - "127.0.0.1:{{PORT}}:{{PORT}}"
67
+ volumes:
68
+ - ./storage:/usr/app/storage
69
+ - ./logs:/usr/app/logs{{DATABASE_DOCKER_APP_VOLUME}}
70
+ env_file:
71
+ - .env
72
+ networks:
73
+ - {{LOWER_NAME}}
74
+
75
+ networks:
76
+ {{LOWER_NAME}}:
77
+ driver: bridge
78
+ name: {{LOWER_NAME}}-network
79
+
80
+ volumes:
81
+ {{DATABASE_DOCKER_NAMED_VOLUME}} redis-data:
@@ -1,39 +1,39 @@
1
- {
2
- "name": "{{LOWER_NAME}}",
3
- "version": "1.0.0",
4
- "description": "{{DESCRIPTION}}",
5
- "private": true,
6
- "license": "UNLICENSED",
7
- "scripts": {
8
- "build": "weaver build",
9
- "start": "weaver start",
10
- "dev": "weaver start --watch",
11
- "generate": "weaver generate",
12
- "migrate": "weaver migrate",
13
- "seed": "weaver seed",
14
- "test": "bun test ./test/unit --coverage ./src/**/*.ts --reporter=junit --reporter-outfile=./reports/junit.xml",
15
- "e2e": "bun test ./test/e2e --reporter=junit --reporter-outfile=./reports/e2e.xml --preload ./test/e2e/support/preload.ts",
16
- "format": "prettier --write \"./**/*.ts\"",
17
- "lint": "eslint \"./**/*.ts\""
18
- },
19
- "dependencies": {
20
- "@appweaver/cli": "{{VERSION}}",
21
- "@appweaver/common": "{{VERSION}}",
22
- "@appweaver/core": "{{VERSION}}",
23
- {{DEPENDENCIES}}
24
- },
25
- "devDependencies": {
26
- "@eslint/js": "9.39.2",
27
- "@types/bun": "1.3.14",
28
- "@types/node": "26.0.0",
29
- "@typescript-eslint/eslint-plugin": "8.61.1",
30
- "@typescript-eslint/parser": "8.61.1",
31
- "eslint": "9.39.2",
32
- "eslint-config-prettier": "10.1.8",
33
- "eslint-plugin-prettier": "5.5.6",
34
- "globals": "17.6.0",
35
- "prettier": "3.8.4",
36
- "typescript": "5.9.3",
37
- "typescript-eslint": "8.61.1"
38
- }
39
- }
1
+ {
2
+ "name": "{{LOWER_NAME}}",
3
+ "version": "1.0.0",
4
+ "description": "{{DESCRIPTION}}",
5
+ "private": true,
6
+ "license": "UNLICENSED",
7
+ "scripts": {
8
+ "build": "weaver build",
9
+ "start": "weaver start",
10
+ "dev": "weaver start --watch",
11
+ "generate": "weaver generate",
12
+ "migrate": "weaver migrate",
13
+ "seed": "weaver seed",
14
+ "test": "bun test ./test/unit --coverage ./src/**/*.ts --reporter=junit --reporter-outfile=./reports/junit.xml",
15
+ "e2e": "bun test ./test/e2e --reporter=junit --reporter-outfile=./reports/e2e.xml --preload ./test/e2e/support/preload.ts",
16
+ "format": "prettier --write \"./**/*.ts\"",
17
+ "lint": "eslint \"./**/*.ts\""
18
+ },
19
+ "dependencies": {
20
+ "@appweaver/cli": "{{VERSION}}",
21
+ "@appweaver/common": "{{VERSION}}",
22
+ "@appweaver/core": "{{VERSION}}",
23
+ {{DEPENDENCIES}}
24
+ },
25
+ "devDependencies": {
26
+ "@eslint/js": "9.39.2",
27
+ "@types/bun": "1.3.14",
28
+ "@types/node": "26.0.0",
29
+ "@typescript-eslint/eslint-plugin": "8.61.1",
30
+ "@typescript-eslint/parser": "8.61.1",
31
+ "eslint": "9.39.2",
32
+ "eslint-config-prettier": "10.1.8",
33
+ "eslint-plugin-prettier": "5.5.6",
34
+ "globals": "17.6.0",
35
+ "prettier": "3.8.4",
36
+ "typescript": "5.9.3",
37
+ "typescript-eslint": "8.61.1"
38
+ }
39
+ }
@@ -1,44 +1,44 @@
1
- {
2
- "name": "{{LOWER_NAME}}",
3
- "version": "1.0.0",
4
- "description": "{{DESCRIPTION}}",
5
- "private": true,
6
- "license": "UNLICENSED",
7
- "scripts": {
8
- "build": "weaver build",
9
- "start": "weaver start",
10
- "dev": "weaver start --watch",
11
- "generate": "weaver generate",
12
- "migrate": "weaver migrate",
13
- "seed": "weaver seed --buildProject",
14
- "test": "jest --forceExit --detectOpenHandles --coverage",
15
- "e2e": "jest --forceExit --detectOpenHandles --config ./test/e2e/jest.e2e-config.json",
16
- "format": "prettier --write \"./**/*.ts\"",
17
- "lint": "eslint \"./**/*.ts\""
18
- },
19
- "dependencies": {
20
- "@appweaver/cli": "{{VERSION}}",
21
- "@appweaver/common": "{{VERSION}}",
22
- "@appweaver/core": "{{VERSION}}",
23
- {{DEPENDENCIES}}
24
- },
25
- "devDependencies": {
26
- "@eslint/js": "9.39.2",
27
- "@swc/core": "1.15.41",
28
- "@swc/jest": "0.2.39",
29
- "@types/jest": "30.0.0",
30
- "@types/node": "26.0.0",
31
- "@typescript-eslint/eslint-plugin": "8.61.1",
32
- "@typescript-eslint/parser": "8.61.1",
33
- "eslint": "9.39.2",
34
- "eslint-config-prettier": "10.1.8",
35
- "eslint-plugin-jest": "29.15.2",
36
- "eslint-plugin-prettier": "5.5.6",
37
- "globals": "17.6.0",
38
- "jest": "30.4.2",
39
- "jest-junit": "17.0.0",
40
- "prettier": "3.8.4",
41
- "typescript": "5.9.3",
42
- "typescript-eslint": "8.61.1"
43
- }
44
- }
1
+ {
2
+ "name": "{{LOWER_NAME}}",
3
+ "version": "1.0.0",
4
+ "description": "{{DESCRIPTION}}",
5
+ "private": true,
6
+ "license": "UNLICENSED",
7
+ "scripts": {
8
+ "build": "weaver build",
9
+ "start": "weaver start",
10
+ "dev": "weaver start --watch",
11
+ "generate": "weaver generate",
12
+ "migrate": "weaver migrate",
13
+ "seed": "weaver seed --buildProject",
14
+ "test": "jest --forceExit --detectOpenHandles --coverage",
15
+ "e2e": "jest --forceExit --detectOpenHandles --config ./test/e2e/jest.e2e-config.json",
16
+ "format": "prettier --write \"./**/*.ts\"",
17
+ "lint": "eslint \"./**/*.ts\""
18
+ },
19
+ "dependencies": {
20
+ "@appweaver/cli": "{{VERSION}}",
21
+ "@appweaver/common": "{{VERSION}}",
22
+ "@appweaver/core": "{{VERSION}}",
23
+ {{DEPENDENCIES}}
24
+ },
25
+ "devDependencies": {
26
+ "@eslint/js": "9.39.2",
27
+ "@swc/core": "1.15.41",
28
+ "@swc/jest": "0.2.39",
29
+ "@types/jest": "30.0.0",
30
+ "@types/node": "26.0.0",
31
+ "@typescript-eslint/eslint-plugin": "8.61.1",
32
+ "@typescript-eslint/parser": "8.61.1",
33
+ "eslint": "9.39.2",
34
+ "eslint-config-prettier": "10.1.8",
35
+ "eslint-plugin-jest": "29.15.2",
36
+ "eslint-plugin-prettier": "5.5.6",
37
+ "globals": "17.6.0",
38
+ "jest": "30.4.2",
39
+ "jest-junit": "17.0.0",
40
+ "prettier": "3.8.4",
41
+ "typescript": "5.9.3",
42
+ "typescript-eslint": "8.61.1"
43
+ }
44
+ }