@appweaver/create-weaver-app 1.0.22 → 1.0.24

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: mariadb:11.4
289
+ container_name: ${name}-mysql
290
+ restart: unless-stopped
291
+ healthcheck:
292
+ test: [ "CMD", "healthcheck.sh", "--connect", "--innodb_initialized" ]
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
+ MARIADB_DATABASE: "\${DB_NAME}"
302
+ MARIADB_USER: "\${DB_USER}"
303
+ MARIADB_PASSWORD: "\${DB_PASSWORD}"
304
+ MARIADB_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.22",
3
+ "version": "1.0.24",
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
 
package/skill/SKILL.md CHANGED
@@ -553,7 +553,8 @@ weaver openapi --format yaml # generate schema in yaml
553
553
  weaver update # update all @appweaver/* packages to latest
554
554
  weaver update @appweaver/core @appweaver/cli # update specific packages
555
555
  weaver update --targetVersion 1.2.3 # update to a specific version
556
- weaver update --noSkill # skip updating AI agent skill files
556
+ weaver update --noSkill # skip updating AI agent skill files (.claude, .agents, …)
557
+ weaver update --noGuidelines # skip updating AI agent guideline files (AGENTS.md, CLAUDE.md)
557
558
  weaver update --force # force update despite peerDependency mismatches
558
559
  ```
559
560
 
@@ -205,9 +205,10 @@ Update the Appweaver packages.
205
205
 
206
206
  **Options:**
207
207
 
208
- | Option | Description | Default |
209
- |-----------------------------------|------------------------------------------------------------|------------|
210
- | `--targetVersion [targetVersion]` | The version to update the packages to | `"latest"` |
211
- | `--noSkill` | Skip updating AI agents skill files in the current project | `false` |
212
- | `-f, --force` | Force update despite peerDependency version mismatches | `false` |
213
- | `--verbose` | Print verbose output | `false` |
208
+ | Option | Description | Default |
209
+ |-----------------------------------|-------------------------------------------------------------------------|------------|
210
+ | `--targetVersion [targetVersion]` | The version to update the packages to | `"latest"` |
211
+ | `--noSkill` | Skip updating AI agents skill files in agent dirs (`.claude`, `.agents`, …) | `false` |
212
+ | `--noGuidelines` | Skip updating AI agents guideline files (`AGENTS.md`, `CLAUDE.md`) | `false` |
213
+ | `-f, --force` | Force update despite peerDependency version mismatches | `false` |
214
+ | `--verbose` | Print verbose output | `false` |
@@ -8,6 +8,23 @@ distinct parts:
8
8
 
9
9
  ---
10
10
 
11
+ ## Module formats (ESM & CommonJS)
12
+
13
+ The package ships **both** an ESM and a CommonJS build, selected automatically via the `exports` map — no configuration
14
+ needed. Both import styles work for the main entry and the `/angular` subpath:
15
+
16
+ ```ts
17
+ // ESM (tree-shakable — preferred for bundlers like Angular/Vite/webpack prod builds)
18
+ import { FetchClient, ClientError } from '@appweaver/client';
19
+ import { AngularClient } from '@appweaver/client/angular';
20
+
21
+ // CommonJS (e.g. plain Node scripts without a build step)
22
+ const { FetchClient, ClientError } = require('@appweaver/client');
23
+ const { AngularClient } = require('@appweaver/client/angular');
24
+ ```
25
+
26
+ ---
27
+
11
28
  ## `weaver-client` CLI
12
29
 
13
30
  ```
@@ -44,6 +61,7 @@ Reads an OpenAPI v3 schema and generates TypeScript types and a typed client cla
44
61
  | `--typesPath [path]` | Output path for generated TypeScript types only | same as `outputPath` |
45
62
  | `--clientPath [path]` | Output path for generated client class only | same as `outputPath` |
46
63
  | `--clientName [name]` | Custom name for the generated client class | derived from schema title |
64
+ | `--framework [name]` | Framework for the generated client class (`fetch` or `angular`) | `fetch` |
47
65
  | `--typesOnly` | Generate TypeScript types only, skip client class generation | `false` |
48
66
  | `--clientOnly` | Generate client class only, skip TypeScript types generation | `false` |
49
67
  | `--noTypes` | Generate client class without TypeScript type support | `false` |
@@ -51,8 +69,8 @@ Reads an OpenAPI v3 schema and generates TypeScript types and a typed client cla
51
69
  **Generation process:**
52
70
 
53
71
  1. Reads and parses the schema (JSON or YAML, local or remote).
54
- 2. Generates TypeScript interfaces via `openapi-typescript`, enriching them with JSDoc validation tags
55
- (`@minLength`, `@maxLength`, `@minimum`, `@maximum`, `@pattern`, `@format`).
72
+ 2. Generates TypeScript interfaces via `openapi-typescript`, enriching them with JSDoc validation tags (`@minLength`,
73
+ `@maxLength`, `@minimum`, `@maximum`, `@pattern`, `@format`).
56
74
  3. Deduplicates union types and extracts inline schemas to named exported types.
57
75
  4. Classifies all API paths into route groups: resources, auth, account, health, files, and custom.
58
76
  5. Emits a typed client class extending `FetchClient<Paths>` with a getter for each route group. Resources with
@@ -158,6 +176,28 @@ The generated second type argument to `resourceClient` (e.g., `['aggregate', 'ex
158
176
  removes those methods from the returned `ResourceClient` at the TypeScript level, preventing accidental calls to
159
177
  operations not exposed by the API.
160
178
 
179
+ ### Angular client (`--framework angular`)
180
+
181
+ Passing `--framework angular` generates a client class extending `AngularClient` instead of `FetchClient`. The generated
182
+ class is constructed with Angular's `HttpClient` and all its methods return RxJS `Observable`s instead of
183
+ `Promise`s:
184
+
185
+ ```ts
186
+ import { ClientConfig, ClientError } from '@appweaver/client';
187
+ import { AngularClient } from '@appweaver/client/angular';
188
+ import { HttpClient } from '@angular/common/http';
189
+
190
+ // In an Angular service or provider:
191
+ const client = new CMSAPIClient(httpClient, { baseUrl: 'http://localhost:3000' });
192
+ client.user.query({ filter: { enabled: true } }).subscribe((users) => {
193
+ });
194
+ ```
195
+
196
+ **Important:** `AngularClient` is only available from the `@appweaver/client/angular` subpath — it is not exported from
197
+ the main `@appweaver/client` entry point. This keeps `rxjs` completely out of the module graph (runtime and types) for
198
+ `FetchClient` users. `rxjs` is an **optional peer dependency**: Angular projects already have it installed, while
199
+ fetch-only projects do not need it at all.
200
+
161
201
  ---
162
202
 
163
203
  ## Runtime library
@@ -438,8 +478,8 @@ const data = await client.sendRequest('get', '/api/custom-endpoint');
438
478
 
439
479
  ### `sendRequestRaw`
440
480
 
441
- Returns the raw `{ data, error, response }` tuple from `openapi-fetch` without throwing. Useful when the caller
442
- needs to inspect error details or branch on status codes.
481
+ Returns the raw `{ data, error, response }` tuple from `openapi-fetch` without throwing. Useful when the caller needs to
482
+ inspect error details or branch on status codes.
443
483
 
444
484
  ```ts
445
485
  const { data, error, response } = await client.sendRequestRaw('post', '/api/custom-endpoint', {
@@ -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
+ }