@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.
- package/create-weaver-app.js +122 -1
- package/package.json +1 -1
- package/skill/GUIDELINES.md +1 -1
- package/skill/references/client.md +22 -0
- package/templates/default/Dockerfile +3 -3
- package/templates/default/Dockerfile.bun +2 -2
- package/templates/default/docker-compose.yml.tpl +81 -107
- package/templates/default/package.json.bun.tpl +39 -39
- package/templates/default/package.json.tpl +44 -44
package/create-weaver-app.js
CHANGED
|
@@ -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
package/skill/GUIDELINES.md
CHANGED
|
@@ -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`
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
3
|
-
image:
|
|
4
|
-
container_name: {{LOWER_NAME}}-
|
|
5
|
-
restart: unless-stopped
|
|
6
|
-
healthcheck:
|
|
7
|
-
test: "
|
|
8
|
-
interval: 30s
|
|
9
|
-
timeout: 10s
|
|
10
|
-
retries: 10
|
|
11
|
-
start_period: 5s
|
|
12
|
-
start_interval: 5s
|
|
13
|
-
ports:
|
|
14
|
-
- "127.0.0.1:
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
+
}
|