@appweaver/create-weaver-app 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +7 -0
  3. package/create-weaver-app.d.ts +2 -0
  4. package/create-weaver-app.js +266 -0
  5. package/package.json +37 -0
  6. package/skill/GUIDELINES.md +298 -0
  7. package/skill/SKILL.md +593 -0
  8. package/skill/references/cache.md +207 -0
  9. package/skill/references/cli.md +213 -0
  10. package/skill/references/client.md +507 -0
  11. package/skill/references/configuration.md +402 -0
  12. package/skill/references/database.md +134 -0
  13. package/skill/references/dependency-injection.md +214 -0
  14. package/skill/references/events.md +152 -0
  15. package/skill/references/mailer.md +235 -0
  16. package/skill/references/queue.md +196 -0
  17. package/skill/references/resources.md +961 -0
  18. package/skill/references/scheduler.md +184 -0
  19. package/skill/references/security.md +694 -0
  20. package/skill/references/storage.md +251 -0
  21. package/templates/default/.dockerignore +5 -0
  22. package/templates/default/.env.tpl +1 -0
  23. package/templates/default/.prettierignore +3 -0
  24. package/templates/default/.prettierrc +7 -0
  25. package/templates/default/Dockerfile +56 -0
  26. package/templates/default/Dockerfile.bun +56 -0
  27. package/templates/default/README.md.tpl +7 -0
  28. package/templates/default/appweaver.dev.json.tpl +9 -0
  29. package/templates/default/appweaver.json.bun.tpl +17 -0
  30. package/templates/default/appweaver.json.tpl +16 -0
  31. package/templates/default/appweaver.test.json.tpl +30 -0
  32. package/templates/default/bunfig.toml.bun +8 -0
  33. package/templates/default/database/client.ts.tpl +7 -0
  34. package/templates/default/database/schema.prisma +13 -0
  35. package/templates/default/database/seeders/001-create-admin-user.ts.tpl +39 -0
  36. package/templates/default/eslint.config.mjs +55 -0
  37. package/templates/default/eslint.config.mjs.bun +53 -0
  38. package/templates/default/jest.config.json.node +23 -0
  39. package/templates/default/package.json.bun.tpl +39 -0
  40. package/templates/default/package.json.tpl +44 -0
  41. package/templates/default/prisma.config.ts.tpl +14 -0
  42. package/templates/default/public/favicon.ico +0 -0
  43. package/templates/default/public/robots.txt +2 -0
  44. package/templates/default/src/features/index.ts.tpl +0 -0
  45. package/templates/default/src/main.ts.tpl +7 -0
  46. package/templates/default/src/resources/user/model.ts.tpl +28 -0
  47. package/templates/default/src/resources/user/policy.ts.tpl +3 -0
  48. package/templates/default/src/resources/user/routes.ts.tpl +3 -0
  49. package/templates/default/src/resources/user/service.ts.tpl +16 -0
  50. package/templates/default/src/types/generated.ts.tpl +1 -0
  51. package/templates/default/src/types/index.ts.tpl +1 -0
  52. package/templates/default/start.sh +26 -0
  53. package/templates/default/start.sh.bun +26 -0
  54. package/templates/default/swc.config.json.node +13 -0
  55. package/templates/default/test/e2e/jest.e2e-config.json.node +22 -0
  56. package/templates/default/test/e2e/main.test.ts.tpl +24 -0
  57. package/templates/default/test/e2e/support/each.ts.tpl +13 -0
  58. package/templates/default/test/e2e/support/preload.ts.bun +13 -0
  59. package/templates/default/test/e2e/support/setup.ts.tpl +13 -0
  60. package/templates/default/test/e2e/support/teardown.ts.tpl +13 -0
  61. package/templates/default/test/unit/sample.test.ts.tpl +5 -0
  62. package/templates/default/tsconfig.build.json +10 -0
  63. package/templates/default/tsconfig.json +27 -0
  64. package/templates/default/tsconfig.json.bun +28 -0
@@ -0,0 +1,184 @@
1
+ # Scheduler
2
+
3
+ The scheduler module runs recurring tasks using cron expressions. The default implementation (`CronScheduler`) wraps
4
+ the [`cron`](https://github.com/kelektiv/node-cron) library. Jobs auto-start on `addJob` (controlled by
5
+ `SCHEDULER_AUTO_START_JOB`) and are stopped gracefully on application shutdown.
6
+
7
+ ## Injecting Scheduler
8
+
9
+ ```ts
10
+ import { inject } from '@appweaver/core';
11
+ import { Scheduler } from '@appweaver/common';
12
+
13
+ const scheduler = inject(Scheduler);
14
+ ```
15
+
16
+ ---
17
+
18
+ #### `scheduler.addJob(jobParams)`
19
+
20
+ Registers a new cron job and returns a unique job ID. Jobs start immediately by default (see
21
+ `SCHEDULER_AUTO_START_JOB`).
22
+
23
+ **`CronJobParams` fields** (from the `cron` library):
24
+
25
+ | Field | Type | Default | Description |
26
+ |---------------------|-------------------------------|----------------|--------------------------------------------------|
27
+ | `cronTime` | `string \| Date` | — | Cron expression or exact `Date` |
28
+ | `onTick` | `() => void \| Promise<void>` | — | Function to execute on each tick |
29
+ | `start` | `boolean` | config default | Override `SCHEDULER_AUTO_START_JOB` for this job |
30
+ | `waitForCompletion` | `boolean` | `true` | Wait for the current tick to finish before next |
31
+ | `errorHandler` | `(e: unknown) => void` | logs error | Custom error handler for tick failures |
32
+ | `timeZone` | `string` | system TZ | IANA timezone (e.g. `'America/New_York'`) |
33
+ | `runOnInit` | `boolean` | `false` | Execute immediately when the job is registered |
34
+
35
+ ```ts
36
+ const jobId = scheduler.addJob({
37
+ cronTime: '0 9 * * *', // every day at 9 AM
38
+ onTick: async () => {
39
+ await sendDailyDigest();
40
+ }
41
+ });
42
+ ```
43
+
44
+ **Cron expression cheat sheet:**
45
+
46
+ ```
47
+ ┌──────────── minute (0–59)
48
+ │ ┌────────── hour (0–23)
49
+ │ │ ┌──────── day of month (1–31)
50
+ │ │ │ ┌────── month (1–12)
51
+ │ │ │ │ ┌──── day of week (0–7, 0 and 7 = Sunday)
52
+ │ │ │ │ │
53
+ * * * * *
54
+ ```
55
+
56
+ | Expression | Meaning |
57
+ |----------------|--------------------------|
58
+ | `* * * * *` | Every minute |
59
+ | `*/15 * * * *` | Every 15 minutes |
60
+ | `0 * * * *` | Every hour (on the hour) |
61
+ | `0 9 * * *` | Every day at 9:00 AM |
62
+ | `0 9 * * 1-5` | Weekdays at 9:00 AM |
63
+ | `0 0 1 * *` | First day of every month |
64
+
65
+ ---
66
+
67
+ #### `scheduler.getJob(jobId)`
68
+
69
+ Returns the underlying `CronJob` instance, or `undefined` if not found.
70
+
71
+ ```ts
72
+ const job = scheduler.getJob(jobId);
73
+ logger.info(`Is running: ${job?.isActive}`);
74
+ ```
75
+
76
+ ---
77
+
78
+ #### `scheduler.startJob(jobId)`
79
+
80
+ Starts a stopped job. Returns `true` if started, `false` if the job does not exist.
81
+
82
+ ```ts
83
+ scheduler.startJob(jobId);
84
+ ```
85
+
86
+ ---
87
+
88
+ #### `scheduler.stopJob(jobId)`
89
+
90
+ Stops a running job without removing it. Returns `true` if stopped.
91
+
92
+ ```ts
93
+ await scheduler.stopJob(jobId);
94
+ ```
95
+
96
+ ---
97
+
98
+ #### `scheduler.startAll()`
99
+
100
+ Starts all registered jobs that are not yet active.
101
+
102
+ ```ts
103
+ scheduler.startAll();
104
+ ```
105
+
106
+ ---
107
+
108
+ #### `scheduler.stopAll()`
109
+
110
+ Stops all running jobs. Called automatically during application shutdown.
111
+
112
+ ```ts
113
+ await scheduler.stopAll();
114
+ ```
115
+
116
+ ---
117
+
118
+ #### `scheduler.removeJob(jobId)`
119
+
120
+ Stops and permanently removes a job. Returns `true` if removed.
121
+
122
+ ```ts
123
+ await scheduler.removeJob(jobId);
124
+ ```
125
+
126
+ ---
127
+
128
+ ## Configuration
129
+
130
+ | Key | Type | Default | Description |
131
+ |----------------------------|----------|----------------------------------------------|--------------------------------------------------|
132
+ | `SCHEDULER_AUTO_START_JOB` | `bool` | `true` | Automatically start jobs when `addJob` is called |
133
+ | `SCHEDULER_PROVIDER` | `string` | `'@appweaver/core/scheduler/cron-scheduler'` | Path to the Scheduler implementation |
134
+
135
+ ---
136
+
137
+ ## Real-world example
138
+
139
+ Register all jobs at startup in a dedicated module:
140
+
141
+ ```ts
142
+ // src/jobs/index.ts
143
+ import { inject } from '@appweaver/core';
144
+ import { Scheduler } from '@appweaver/common';
145
+
146
+ export function registerJobs() {
147
+ const scheduler = inject(Scheduler);
148
+
149
+ // Send a daily digest every morning at 8 AM
150
+ scheduler.addJob({
151
+ cronTime: '0 8 * * *',
152
+ onTick: async () => {
153
+ await sendDailyDigest();
154
+ }
155
+ });
156
+
157
+ // Clean up expired sessions every 30 minutes
158
+ scheduler.addJob({
159
+ cronTime: '*/30 * * * *',
160
+ onTick: async () => {
161
+ await deleteExpiredSessions();
162
+ }
163
+ });
164
+
165
+ // Run a heavy report only on weekdays; don't auto-start, trigger manually
166
+ const reportJobId = scheduler.addJob({
167
+ cronTime: '0 2 * * 1-5',
168
+ start: false,
169
+ onTick: async () => {
170
+ await generateWeeklyReport();
171
+ }
172
+ });
173
+
174
+ return { reportJobId };
175
+ }
176
+ ```
177
+
178
+ ```ts
179
+ // src/main.ts
180
+ const { reportJobId } = registerJobs();
181
+
182
+ // Start the report job manually when needed
183
+ scheduler.startJob(reportJobId);
184
+ ```