@warlock.js/core 5.13.0 → 5.14.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 (34) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/esm/cli/commands/build.command.mjs.map +1 -1
  3. package/esm/cli/commands/dev-server.command.mjs +2 -0
  4. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  5. package/esm/dev-server/files-watcher.mjs +6 -3
  6. package/esm/dev-server/files-watcher.mjs.map +1 -1
  7. package/esm/errors/esbuild-binary-missing-error.mjs +20 -0
  8. package/esm/errors/esbuild-binary-missing-error.mjs.map +1 -0
  9. package/esm/generations/features/bull-board.feature.mjs +65 -0
  10. package/esm/generations/features/bull-board.feature.mjs.map +1 -0
  11. package/esm/generations/features/index.mjs +2 -0
  12. package/esm/generations/features/index.mjs.map +1 -1
  13. package/esm/generations/features/queue.feature.mjs +4 -1
  14. package/esm/generations/features/queue.feature.mjs.map +1 -1
  15. package/esm/generations/features/shared/insert-connector-entry.mjs +68 -0
  16. package/esm/generations/features/shared/insert-connector-entry.mjs.map +1 -0
  17. package/esm/generations/features/shared/insert-queue-dashboard-block.mjs +55 -0
  18. package/esm/generations/features/shared/insert-queue-dashboard-block.mjs.map +1 -0
  19. package/esm/generations/features/web.feature.mjs +4 -1
  20. package/esm/generations/features/web.feature.mjs.map +1 -1
  21. package/esm/generations/stubs.mjs +4 -4
  22. package/esm/generations/stubs.mjs.map +1 -1
  23. package/esm/http/middleware/cache-response-middleware.d.mts +12 -0
  24. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  25. package/esm/http/middleware/cache-response-middleware.mjs +15 -3
  26. package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
  27. package/esm/production/esbuild-preflight.mjs +23 -13
  28. package/esm/production/esbuild-preflight.mjs.map +1 -1
  29. package/llms-full.txt +32 -3
  30. package/llms.txt +2 -2
  31. package/package.json +11 -11
  32. package/skills/run-app/SKILL.md +6 -2
  33. package/skills/use-middleware/SKILL.md +24 -0
  34. package/skills/write-cli-command/SKILL.md +2 -1
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: run-app
3
- description: 'Three operational commands — `warlock dev` (HMR + type-gen + health checks), `warlock build` (esbuild bundle), `warlock start` (spawn the production bundle). All flags, all `warlock.config.ts` knobs that shape them. Triggers: `warlock dev`, `warlock build`, `warlock start`, `devServer`, `--fresh`, `--skip-typings`, `--skip-health`, `outdir`, `outFile`, `sourcemap`, `PortInUseError`, `assertPortIsAvailable`, `EADDRINUSE`; "start the dev server", "build for production", "run the bundle", "skip type generation", "tune watch globs", "dev server keyboard shortcuts", "press r to restart", "press q to quit", "restart the dev server", "port already in use"; typical config `warlock.config.ts > devServer / build`. Skip: writing a custom CLI — `@warlock.js/core/write-cli-command/SKILL.md`; config shape — `@warlock.js/core/configure-app/SKILL.md`; competing tooling `nodemon`, `tsx`, `ts-node-dev`, `esbuild` direct.'
3
+ description: 'Three operational commands — `warlock dev` (HMR + type-gen + health checks), `warlock build` (esbuild bundle), `warlock start` (spawn the production bundle). All flags, all `warlock.config.ts` knobs that shape them. Triggers: `warlock dev`, `warlock build`, `warlock start`, `devServer`, `--fresh`, `--skip-typings`, `--skip-health`, `outdir`, `outFile`, `sourcemap`, `PortInUseError`, `assertPortIsAvailable`, `EADDRINUSE`, `EsbuildBinaryMissingError`; "start the dev server", "build for production", "run the bundle", "skip type generation", "tune watch globs", "dev server keyboard shortcuts", "press r to restart", "press q to quit", "restart the dev server", "port already in use"; typical config `warlock.config.ts > devServer / build`. Skip: writing a custom CLI — `@warlock.js/core/write-cli-command/SKILL.md`; config shape — `@warlock.js/core/configure-app/SKILL.md`; competing tooling `nodemon`, `tsx`, `ts-node-dev`, `esbuild` direct.'
4
4
  ---
5
5
 
6
6
  # Warlock — run the app
@@ -143,6 +143,7 @@ export default defineConfig({
143
143
  restartOnConfigChange: true, // restart when warlock.config.ts / .env* changes
144
144
  healthCheckers: [...] /* or false */,
145
145
  transpileCacheDebug: false, // name cache files <slug>.<hash>.js w/ // @source markers
146
+ timings: false, // print a per-phase reload timing breakdown
146
147
  },
147
148
  });
148
149
  ```
@@ -153,6 +154,7 @@ export default defineConfig({
153
154
  - **`transpileCacheDebug`** — diagnostic only. Names `.warlock/transpile/*.js` files `<slug>.<hash>.js` and appends `// @source <path>` markers so you can eyeball which cache entry came from which source. Leave off in normal use.
154
155
  - **`checkForUpdates`** — on `warlock dev` start, check npm for a newer `@warlock.js/core` and print a one-line notice if one exists. Best-effort and non-blocking; auto-skipped in CI and non-TTY shells. In an interactive terminal the notice arms a **`u` shortcut** that updates every `@warlock.js/*` package, installs, and restarts the server; elsewhere it prints `npx warlock update` instead. The registry answer is cached for 24h in `.warlock/update-check.json`, so a day of restarts costs one lookup. See [`update-packages/SKILL.md`](../update-packages/SKILL.md).
155
156
  - **`restartOnConfigChange`** — restart the dev server when `warlock.config.ts` or any `.env*` changes (default `true`). Set `false` to get a warning instead and restart by hand. Neither file can be hot-reloaded, so without a restart the running services keep the old values.
157
+ - **`timings`** — print a one-line, per-phase breakdown next to the `hmr update` line on every hot reload: `watcher`, `debounce`, `graph`, `reimport`, `connectors`. `watcher` is the raw-fs-notification-to-stabilised-event gap (chokidar's `awaitWriteFinish` window); `debounce` is the handler's own adaptive wait; the rest are self-explanatory. Opt-in, off by default — a disabled flag costs one boolean check per reload, since the watcher-settle bookkeeping only runs when this is on. Use it to see which phase a slow reload is actually spending time in.
156
158
 
157
159
  ## `warlock build` — production bundle
158
160
 
@@ -258,7 +260,7 @@ Means `docker stop` / `kubectl delete pod` works as expected: SIGTERM reaches th
258
260
 
259
261
  ### pnpm needs esbuild's install script allowed
260
262
 
261
- pnpm 10+ will not run a dependency's install script unless the app names it. esbuild's script links its platform-native binary, and `warlock build` shells out to that binary — so the app installs cleanly and then cannot build:
263
+ pnpm 10+ will not run a dependency's install script unless the app names it. esbuild's script links its platform-native binary, and both `warlock build` and `warlock dev` shell out to that binary — so the app installs cleanly and then cannot build or start dev:
262
264
 
263
265
  ```
264
266
  [ERR_PNPM_IGNORED_BUILDS] Ignored build scripts: esbuild@0.27.7
@@ -273,6 +275,8 @@ allowBuilds:
273
275
 
274
276
  Note pnpm reads this from `pnpm-workspace.yaml`, **not** from `package.json`'s `pnpm` field — pnpm 11 warns that the field is ignored and then carries on, so settings left there fail silently.
275
277
 
278
+ `warlock dev` checks for esbuild's native binary before starting (as `warlock build` already did) and fails fast with `EsbuildBinaryMissingError`, naming the same fix, instead of surfacing an opaque low-level error later from inside the bundler.
279
+
276
280
  Nothing else is needed for pnpm. Warlock never requires an app to declare a package it does not import: generated code is checked at build time against the app's own `dependencies`, so `warlock build` failing over an unfamiliar package name is a framework bug, not a missing dependency.
277
281
 
278
282
  ### Output streams — what a supervisor may trust
@@ -174,6 +174,30 @@ router.get("/analytics/summary", summaryController, {
174
174
 
175
175
  `cacheKey` can be a string OR a function `(request) => string | Promise<string>` for per-request keys. Excludes failures and omits `["user", "settings"]` from the cached body by default.
176
176
 
177
+ ### Tag-based invalidation
178
+
179
+ Give it `tags` — a static list, or a function of the request — to evict the entry early with `cache.tags([...]).invalidate()` (`@warlock.js/cache`), instead of waiting out `ttl`. Mirrors `route.cache.tags` on `@warlock.js/web`'s page cache, so an API response and a page can share the same tag and be invalidated together:
180
+
181
+ ```ts
182
+ import { middleware } from "@warlock.js/core";
183
+ import { cache } from "@warlock.js/cache";
184
+
185
+ router.get("/orders/:id", getOrderController, {
186
+ middleware: [
187
+ middleware.cache({
188
+ cacheKey: (request) => `orders.${request.params.id}`,
189
+ ttl: 300,
190
+ tags: (request) => [`order.${request.params.id}`],
191
+ }),
192
+ ],
193
+ });
194
+
195
+ // Elsewhere, after the order changes:
196
+ await cache.tags([`order.${orderId}`]).invalidate();
197
+ ```
198
+
199
+ Untagged entries (no `tags` given) behave exactly as before — they only expire via `ttl`.
200
+
177
201
  ## Composed example
178
202
 
179
203
  Tight cap on logins, concurrency + idempotency on AI calls:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: write-cli-command
3
- description: 'Author a custom `warlock <my-cmd>` command via the `command()` factory — name, description, action, options, preload, then register in `warlock.config.ts > cli.commands` or drop in `src/app/<module>/commands/`. Also covers built-in `warlock add` feature scaffolding, including the Web starter and `index.register.ts`. Triggers: `command`, `CLICommand`, `CLICommandPreload`, `CLICommandOption`, `preload`, `preAction`, `persistent`, `colors`, `warlock add`, `index.register.ts`; "write a custom warlock command", "one-off maintenance task", "ship a CLI from a package", "framework built-in commands"; typical import `import { command } from "@warlock.js/core"`. Skip: framework dev/build/start — `@warlock.js/core/run-app/SKILL.md`; warlock.config.ts wiring — `@warlock.js/core/configure-app/SKILL.md`; competing libs `commander`, `yargs`, `oclif`.'
3
+ description: 'Author a custom `warlock <my-cmd>` command via the `command()` factory — name, description, action, options, preload, then register in `warlock.config.ts > cli.commands` or drop in `src/app/<module>/commands/`. Also covers built-in `warlock add` feature scaffolding, including the Web starter and `index.register.ts`. Triggers: `command`, `CLICommand`, `CLICommandPreload`, `CLICommandOption`, `preload`, `preAction`, `persistent`, `colors`, `warlock add`, `warlock add bull-board`, `index.register.ts`; "write a custom warlock command", "one-off maintenance task", "ship a CLI from a package", "framework built-in commands"; typical import `import { command } from "@warlock.js/core"`. Skip: framework dev/build/start — `@warlock.js/core/run-app/SKILL.md`; warlock.config.ts wiring — `@warlock.js/core/configure-app/SKILL.md`; competing libs `commander`, `yargs`, `oclif`.'
4
4
  ---
5
5
 
6
6
  # Warlock — write a CLI command
@@ -207,6 +207,7 @@ warlock generate (alias: g) — interactive picker
207
207
  | `react-email` | `react-email` + `@react-email/components` + `@react-email/render` + `@react-email/tailwind`; drops a `welcome-email.tsx` sample; patches `tsconfig.json` |
208
208
  | `web` | Warlock Web + React stack; scaffolds the application page, localization, contact endpoint, and Web configuration |
209
209
  | `react` | `react` + `react-dom` + types |
210
+ | `bull-board` | `@bull-board/api` + `@bull-board/fastify`; writes a `dashboard` block to `src/config/queue.ts`. `requires: ["queue"]` — adds the `queue` feature first automatically when it's missing |
210
211
  | `image` | `sharp` (for the `Image` class) |
211
212
  | `mail` | `nodemailer` + types |
212
213
  | `ses` | `@aws-sdk/client-sesv2` |