@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.
- package/create-weaver-app.js +122 -1
- package/package.json +1 -1
- package/skill/GUIDELINES.md +1 -1
- package/skill/SKILL.md +2 -1
- package/skill/references/cli.md +7 -6
- package/skill/references/client.md +44 -4
- package/templates/default/Dockerfile +2 -2
- 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: 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
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
|
|
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
|
|
package/skill/references/cli.md
CHANGED
|
@@ -205,9 +205,10 @@ Update the Appweaver packages.
|
|
|
205
205
|
|
|
206
206
|
**Options:**
|
|
207
207
|
|
|
208
|
-
| Option | Description
|
|
209
|
-
|
|
210
|
-
| `--targetVersion [targetVersion]` | The version to update the packages to
|
|
211
|
-
| `--noSkill` | Skip updating AI agents skill files in
|
|
212
|
-
|
|
|
213
|
-
|
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
+
}
|