@stacksjs/defaults 0.75.423 → 0.75.432
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/ai/skills/stacks-alias/SKILL.md +8 -0
- package/ai/skills/stacks-build/SKILL.md +3 -0
- package/ai/skills/stacks-database/SKILL.md +10 -0
- package/ai/skills/stacks-events/SKILL.md +6 -2
- package/ai/skills/stacks-forms/SKILL.md +4 -0
- package/ai/skills/stacks-native/CATALOG.md +56 -48
- package/ai/skills/stacks-notifications/SKILL.md +5 -0
- package/ai/skills/stacks-payments/SKILL.md +1 -1
- package/ai/skills/stacks-queue/SKILL.md +7 -0
- package/ai/skills/stacks-slug/SKILL.md +7 -1
- package/ai/skills/stacks-strings/SKILL.md +4 -1
- package/ai/skills/stacks-testing/SKILL.md +5 -1
- package/app/Actions/InstallAction.ts +3 -3
- package/ide/vscode/package.json +1 -1
- package/package.json +2 -2
- package/resources/views/cms/blocks/form.stx +31 -36
- package/routes/forms.ts +14 -5
|
@@ -41,6 +41,14 @@ into another package's unpublished types is the problem. Avoid the former rule
|
|
|
41
41
|
that all relative imports are forbidden, since framework code itself uses them
|
|
42
42
|
to keep internal modules and cycle boundaries explicit.
|
|
43
43
|
|
|
44
|
+
The five source tsconfigs use manifest-derived package names and public exports,
|
|
45
|
+
not namespace-to-directory wildcards. Run
|
|
46
|
+
`bun .github/scripts/generate-workspace-aliases.ts` after changing a workspace
|
|
47
|
+
manifest and use `--check` to verify freshness. The owning helpers and source
|
|
48
|
+
exceptions are documented in `core/alias/README.md`. External packages such as
|
|
49
|
+
STX's `@stacksjs/desktop` keep normal package resolution; `core/desktop` owns
|
|
50
|
+
`@stacksjs/desktop-build`.
|
|
51
|
+
|
|
44
52
|
## Verification
|
|
45
53
|
|
|
46
54
|
Source: `core/alias/src/index.ts`, active tsconfig.json and the build/runtime
|
|
@@ -86,6 +86,9 @@ buddy build --server --verbose --project [name]
|
|
|
86
86
|
|
|
87
87
|
## Standard Build Pattern
|
|
88
88
|
|
|
89
|
+
For workspace dependency ordering, failure propagation and umbrella builds, read
|
|
90
|
+
[the build package's workspace contract](../../../../core/build/README.md#workspace-builds).
|
|
91
|
+
|
|
89
92
|
For a library barrel or a package with public subpaths, preserve the module
|
|
90
93
|
graph with the shared transpiler. Identifier-minifying bundles have produced
|
|
91
94
|
invalid re-export bindings on supported Bun versions. Separate bundles also
|
|
@@ -384,3 +384,13 @@ canonical numeric string value, so padded numeric inputs cannot reverse lock ord
|
|
|
384
384
|
transaction handle and choose ownership filters; reads, writes and validation
|
|
385
385
|
remain on that handle. This prevents opposite input order from creating a
|
|
386
386
|
lock-order cycle during a transfer, merge or multi-item stock reservation.
|
|
387
|
+
|
|
388
|
+
## Row leases for external operations
|
|
389
|
+
|
|
390
|
+
`claimRowLease(table, ownerScope, { token, heartbeat }, ttlMs)` from
|
|
391
|
+
`@stacksjs/database/runtime` claims model-owned nullable token and heartbeat
|
|
392
|
+
columns atomically. It returns null when busy, or a lease with `renew()`,
|
|
393
|
+
`release()`, `assertOwned()` and `commit(work)`. Renew periodically during I/O.
|
|
394
|
+
Keep network work outside `commit`; commit locks and revalidates the token before
|
|
395
|
+
writing one bounded batch. An expired worker cannot commit or release a successor.
|
|
396
|
+
A lease's unique owner scope must include the resource binding where applicable.
|
|
@@ -26,10 +26,14 @@ Use the native event bus for process-local application and model events. Use
|
|
|
26
26
|
downstream work determines the response.
|
|
27
27
|
|
|
28
28
|
Payloadless events are supported by the emitter. Exact handlers receive the
|
|
29
|
-
payload; wildcard and glob handlers receive `(eventName, payload)`.
|
|
29
|
+
payload; wildcard and glob handlers receive `(eventName, payload)`. In a glob,
|
|
30
|
+
`*` is any run of characters and `.` any one character (`*.created` matches
|
|
31
|
+
`user:created`); every other character is literal.
|
|
30
32
|
|
|
31
33
|
`emitter.on(name, handler, { priority })` sorts higher priorities first
|
|
32
|
-
within each handler bucket.
|
|
34
|
+
within each handler bucket. A priority belongs to that one registration, so
|
|
35
|
+
one handler can run first for one event and last for another. Equal priority
|
|
36
|
+
preserves registration order.
|
|
33
37
|
Exact handlers run before glob buckets, then `*` handlers. Snapshotting keeps
|
|
34
38
|
subscription changes during a dispatch from corrupting iteration.
|
|
35
39
|
|
|
@@ -16,6 +16,10 @@ from browser useForm state and validation; read stacks-composables for that.
|
|
|
16
16
|
createForm(siteId, input) creates or updates a form by its site-scoped handle.
|
|
17
17
|
Re-provisioning replaces its field document; it does not merge removed fields.
|
|
18
18
|
Fields declare name, label, type, required status, options, conditions and width.
|
|
19
|
+
PostgreSQL provisioning holds a transaction-owned site lock through the complete
|
|
20
|
+
field-document update. Enclosing transactions keep their isolation and own
|
|
21
|
+
retries of their snapshots. MySQL provisioning must run outside an enclosing
|
|
22
|
+
transaction because its site mutex belongs to the reserved connection.
|
|
19
23
|
loadFormByHandle and loadFormByUuid read definitions; publicDefinition removes
|
|
20
24
|
private settings from the public projection.
|
|
21
25
|
|
|
@@ -13,16 +13,16 @@ Browser runtime bindings are documented separately in `stacks-auto-imports`.
|
|
|
13
13
|
| `@stacksjs/action-runner` | [`stacks-actions`](../stacks-actions/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/action-runner/src/index.ts) | 1 |
|
|
14
14
|
| `@stacksjs/actions` | [`stacks-actions`](../stacks-actions/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/actions/src/index.ts) | 96 |
|
|
15
15
|
| `@stacksjs/ai` | [`stacks-ai`](../stacks-ai/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/ai/src/index.ts) | 21 |
|
|
16
|
-
| `@stacksjs/alias` | [`stacks-alias`](../stacks-alias/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/alias/src/index.ts) |
|
|
16
|
+
| `@stacksjs/alias` | [`stacks-alias`](../stacks-alias/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/alias/src/index.ts) | 3 |
|
|
17
17
|
| `@stacksjs/analytics` | [`stacks-analytics`](../stacks-analytics/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/analytics/src/index.ts) | 6 |
|
|
18
18
|
| `@stacksjs/api` | [`stacks-api`](../stacks-api/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/api/src/index.ts) | 9 |
|
|
19
|
-
| `@stacksjs/arrays` | [`stacks-arrays`](../stacks-arrays/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/arrays/src/index.ts) |
|
|
19
|
+
| `@stacksjs/arrays` | [`stacks-arrays`](../stacks-arrays/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/arrays/src/index.ts) | 9 |
|
|
20
20
|
| `@stacksjs/audio` | [`stacks-audio`](../stacks-audio/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/audio/src/index.ts) | 3 |
|
|
21
|
-
| `@stacksjs/auth` | [`stacks-auth`](../stacks-auth/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/index.ts) |
|
|
21
|
+
| `@stacksjs/auth` | [`stacks-auth`](../stacks-auth/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/index.ts) | 126 |
|
|
22
22
|
| `@stacksjs/browser` | [`stacks-browser`](../stacks-browser/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/browser/src/index.ts) | 8 |
|
|
23
23
|
| `@stacksjs/browser-extension` | [`stacks-browser-extension`](../stacks-browser-extension/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/browser-extension/src/index.ts) | 9 |
|
|
24
|
-
| `@stacksjs/buddy` | [`stacks-buddy`](../stacks-buddy/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/buddy/src/index.ts) |
|
|
25
|
-
| `@stacksjs/build` | [`stacks-build`](../stacks-build/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/build/src/index.ts) |
|
|
24
|
+
| `@stacksjs/buddy` | [`stacks-buddy`](../stacks-buddy/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/buddy/src/index.ts) | 179 |
|
|
25
|
+
| `@stacksjs/build` | [`stacks-build`](../stacks-build/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/build/src/index.ts) | 6 |
|
|
26
26
|
| `@stacksjs/cache` | [`stacks-cache`](../stacks-cache/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cache/src/index.ts) | 23 |
|
|
27
27
|
| `@stacksjs/calendar-api` | [`stacks-calendar`](../stacks-calendar/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/calendar-api/src/index.ts) | 5 |
|
|
28
28
|
| `@stacksjs/charts` | [`stacks-charts`](../stacks-charts/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/charts/src/index.ts) | 3 |
|
|
@@ -35,8 +35,8 @@ Browser runtime bindings are documented separately in `stacks-auto-imports`.
|
|
|
35
35
|
| `@stacksjs/composables` | [`stacks-composables`](../stacks-composables/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/composables/src/index.ts) | 18 |
|
|
36
36
|
| `@stacksjs/config` | [`stacks-config`](../stacks-config/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/config/src/index.ts) | 16 |
|
|
37
37
|
| `@stacksjs/cron` | [`stacks-cron`](../stacks-cron/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/cron/src/index.ts) | 6 |
|
|
38
|
-
| `@stacksjs/database` | [`stacks-database`](../stacks-database/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/index.ts) |
|
|
39
|
-
| `@stacksjs/datetime` | [`stacks-datetime`](../stacks-datetime/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/datetime/src/index.ts) |
|
|
38
|
+
| `@stacksjs/database` | [`stacks-database`](../stacks-database/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/index.ts) | 138 |
|
|
39
|
+
| `@stacksjs/datetime` | [`stacks-datetime`](../stacks-datetime/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/datetime/src/index.ts) | 21 |
|
|
40
40
|
| `@stacksjs/defaults` | [`stacks-build`](../stacks-build/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/defaults/package.json) | 2 |
|
|
41
41
|
| `@stacksjs/deploy` | [`stacks-deploy`](../stacks-deploy/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/deploy/package.json) | 1 |
|
|
42
42
|
| `@stacksjs/desktop-build` | [`stacks-desktop`](../stacks-desktop/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/desktop/src/index.ts) | 15 |
|
|
@@ -47,15 +47,15 @@ Browser runtime bindings are documented separately in `stacks-auto-imports`.
|
|
|
47
47
|
| `@stacksjs/enums` | [`stacks-enums`](../stacks-enums/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/enums/src/index.ts) | 3 |
|
|
48
48
|
| `@stacksjs/env` | [`stacks-env`](../stacks-env/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/env/src/index.ts) | 31 |
|
|
49
49
|
| `@stacksjs/error-handling` | [`stacks-error-handling`](../stacks-error-handling/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/error-handling/src/index.ts) | 10 |
|
|
50
|
-
| `@stacksjs/events` | [`stacks-events`](../stacks-events/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/events/src/index.ts) |
|
|
50
|
+
| `@stacksjs/events` | [`stacks-events`](../stacks-events/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/events/src/index.ts) | 13 |
|
|
51
51
|
| `@stacksjs/faker` | [`stacks-faker`](../stacks-faker/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/faker/src/index.ts) | 1 |
|
|
52
|
-
| `@stacksjs/feature-flags` | [`stacks-feature-flags`](../stacks-feature-flags/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/feature-flags/src/index.ts) |
|
|
52
|
+
| `@stacksjs/feature-flags` | [`stacks-feature-flags`](../stacks-feature-flags/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/feature-flags/src/index.ts) | 8 |
|
|
53
53
|
| `@stacksjs/features` | [`stacks-features`](../stacks-features/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/features/src/index.ts) | 1 |
|
|
54
|
-
| `@stacksjs/forms` | [`stacks-forms`](../stacks-forms/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/forms/src/index.ts) |
|
|
54
|
+
| `@stacksjs/forms` | [`stacks-forms`](../stacks-forms/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/forms/src/index.ts) | 7 |
|
|
55
55
|
| `@stacksjs/git` | [`stacks-git`](../stacks-git/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/git/src/index.ts) | 2 |
|
|
56
56
|
| `@stacksjs/github` | [`stacks-git`](../stacks-git/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/github/src/index.ts) | 8 |
|
|
57
57
|
| `@stacksjs/health` | [`stacks-health`](../stacks-health/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/health/src/index.ts) | 2 |
|
|
58
|
-
| `@stacksjs/http` | [`stacks-http`](../stacks-http/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/http/src/index.ts) |
|
|
58
|
+
| `@stacksjs/http` | [`stacks-http`](../stacks-http/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/http/src/index.ts) | 3 |
|
|
59
59
|
| `@stacksjs/i18n` | [`stacks-i18n`](../stacks-i18n/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/i18n/src/index.ts) | 5 |
|
|
60
60
|
| `@stacksjs/image` | [`stacks-image`](../stacks-image/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/image/src/index.ts) | 3 |
|
|
61
61
|
| `@stacksjs/lint` | [`stacks-lint`](../stacks-lint/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/lint/src/index.ts) | 3 |
|
|
@@ -63,20 +63,20 @@ Browser runtime bindings are documented separately in `stacks-auto-imports`.
|
|
|
63
63
|
| `@stacksjs/mobile` | [`stacks-mobile`](../stacks-mobile/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/mobile/src/index.ts) | 23 |
|
|
64
64
|
| `@stacksjs/model-meta` | [`stacks-models`](../stacks-models/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/model-meta/src/index.ts) | 1 |
|
|
65
65
|
| `@stacksjs/newsletter` | [`stacks-newsletter`](../stacks-newsletter/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/newsletter/src/index.ts) | 7 |
|
|
66
|
-
| `@stacksjs/notifications` | [`stacks-notifications`](../stacks-notifications/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/notifications/src/index.ts) |
|
|
67
|
-
| `@stacksjs/objects` | [`stacks-objects`](../stacks-objects/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/objects/src/index.ts) |
|
|
68
|
-
| `@stacksjs/orm` | [`stacks-orm`](../stacks-orm/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/index.ts) |
|
|
66
|
+
| `@stacksjs/notifications` | [`stacks-notifications`](../stacks-notifications/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/notifications/src/index.ts) | 18 |
|
|
67
|
+
| `@stacksjs/objects` | [`stacks-objects`](../stacks-objects/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/objects/src/index.ts) | 6 |
|
|
68
|
+
| `@stacksjs/orm` | [`stacks-orm`](../stacks-orm/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/index.ts) | 76 |
|
|
69
69
|
| `@stacksjs/pagination` | [`stacks-pagination`](../stacks-pagination/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/pagination/src/index.ts) | 0 |
|
|
70
70
|
| `@stacksjs/path` | [`stacks-path`](../stacks-path/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/path/src/index.ts) | 13 |
|
|
71
|
-
| `@stacksjs/payments` | [`stacks-payments`](../stacks-payments/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/payments/src/index.ts) |
|
|
71
|
+
| `@stacksjs/payments` | [`stacks-payments`](../stacks-payments/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/payments/src/index.ts) | 39 |
|
|
72
72
|
| `@stacksjs/push` | [`stacks-push`](../stacks-push/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/push/src/index.ts) | 8 |
|
|
73
|
-
| `@stacksjs/query-builder` | [`stacks-query-builder`](../stacks-query-builder/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/query-builder/src/index.ts) |
|
|
74
|
-
| `@stacksjs/queue` | [`stacks-queue`](../stacks-queue/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/index.ts) |
|
|
73
|
+
| `@stacksjs/query-builder` | [`stacks-query-builder`](../stacks-query-builder/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/query-builder/src/index.ts) | 7 |
|
|
74
|
+
| `@stacksjs/queue` | [`stacks-queue`](../stacks-queue/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/index.ts) | 52 |
|
|
75
75
|
| `@stacksjs/realtime` | [`stacks-realtime`](../stacks-realtime/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/realtime/src/index.ts) | 12 |
|
|
76
76
|
| `@stacksjs/registry` | [`stacks-registry`](../stacks-registry/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/registry/src/index.ts) | 1 |
|
|
77
77
|
| `@stacksjs/repl` | [`stacks-repl`](../stacks-repl/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/repl/src/index.ts) | 2 |
|
|
78
78
|
| `@stacksjs/router` | [`stacks-router`](../stacks-router/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/router/src/index.ts) | 99 |
|
|
79
|
-
| `@stacksjs/scheduler` | [`stacks-scheduler`](../stacks-scheduler/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/scheduler/src/index.ts) |
|
|
79
|
+
| `@stacksjs/scheduler` | [`stacks-scheduler`](../stacks-scheduler/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/scheduler/src/index.ts) | 17 |
|
|
80
80
|
| `@stacksjs/search-engine` | [`stacks-search-engine`](../stacks-search-engine/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/search-engine/src/index.ts) | 11 |
|
|
81
81
|
| `@stacksjs/security` | [`stacks-security`](../stacks-security/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/security/src/index.ts) | 12 |
|
|
82
82
|
| `@stacksjs/server` | [`stacks-server`](../stacks-server/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/server/src/index.ts) | 28 |
|
|
@@ -84,7 +84,7 @@ Browser runtime bindings are documented separately in `stacks-auto-imports`.
|
|
|
84
84
|
| `@stacksjs/sites` | [`stacks-sites`](../stacks-sites/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/sites/src/index.ts) | 3 |
|
|
85
85
|
| `@stacksjs/skills` | [`stacks-skills`](../stacks-skills/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/skills/src/index.ts) | 1 |
|
|
86
86
|
| `@stacksjs/slug` | [`stacks-slug`](../stacks-slug/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/slug/src/index.ts) | 5 |
|
|
87
|
-
| `@stacksjs/sms` | [`stacks-sms`](../stacks-sms/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/sms/src/index.ts) |
|
|
87
|
+
| `@stacksjs/sms` | [`stacks-sms`](../stacks-sms/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/sms/src/index.ts) | 6 |
|
|
88
88
|
| `@stacksjs/socials` | [`stacks-socials`](../stacks-socials/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/socials/src/index.ts) | 17 |
|
|
89
89
|
| `@stacksjs/storage` | [`stacks-storage`](../stacks-storage/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/storage/src/index.ts) | 47 |
|
|
90
90
|
| `@stacksjs/strings` | [`stacks-strings`](../stacks-strings/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/strings/src/index.ts) | 10 |
|
|
@@ -94,7 +94,7 @@ Browser runtime bindings are documented separately in `stacks-auto-imports`.
|
|
|
94
94
|
| `@stacksjs/types` | [`stacks-types`](../stacks-types/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/types/src/index.ts) | 2 |
|
|
95
95
|
| `@stacksjs/ui` | [`stacks-ui`](../stacks-ui/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/ui/src/index.ts) | 6 |
|
|
96
96
|
| `@stacksjs/utils` | [`stacks-utils`](../stacks-utils/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/utils/src/index.ts) | 15 |
|
|
97
|
-
| `@stacksjs/validation` | [`stacks-validation`](../stacks-validation/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/validation/src/index.ts) |
|
|
97
|
+
| `@stacksjs/validation` | [`stacks-validation`](../stacks-validation/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/validation/src/index.ts) | 21 |
|
|
98
98
|
| `@stacksjs/video` | [`stacks-video`](../stacks-video/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/video/src/index.ts) | 3 |
|
|
99
99
|
| `@stacksjs/whois` | [`stacks-whois`](../stacks-whois/SKILL.md) | [entrypoint](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/whois/src/index.ts) | 5 |
|
|
100
100
|
|
|
@@ -135,9 +135,11 @@ Evidence directory: [21 retained tests](https://github.com/stacksjs/stacks/blob/
|
|
|
135
135
|
|
|
136
136
|
Guidance: [`stacks-alias`](../stacks-alias/SKILL.md). Source: [storage/framework/core/alias/src/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/alias/src/index.ts).
|
|
137
137
|
|
|
138
|
-
Declared runtime exports: `alias`.
|
|
138
|
+
Declared runtime exports: `alias`, `workspacePackages`, `workspaceSourceAliases`, `workspaceSourcePaths`.
|
|
139
139
|
|
|
140
|
-
|
|
140
|
+
Local source modules: [src/workspace.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/alias/src/workspace.ts).
|
|
141
|
+
|
|
142
|
+
Evidence directory: [3 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/alias/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
141
143
|
|
|
142
144
|
### @stacksjs/analytics
|
|
143
145
|
|
|
@@ -167,7 +169,7 @@ Declared runtime exports: `arr`.
|
|
|
167
169
|
|
|
168
170
|
Local source modules: [src/arr.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/arrays/src/arr.ts), [src/macro.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/arrays/src/macro.ts).
|
|
169
171
|
|
|
170
|
-
Evidence directory: [
|
|
172
|
+
Evidence directory: [9 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/arrays/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
171
173
|
|
|
172
174
|
### @stacksjs/audio
|
|
173
175
|
|
|
@@ -187,7 +189,7 @@ Declared runtime exports: `DEFAULT_ROLE_PACKS`, `createBqbRbacStore`, `generateT
|
|
|
187
189
|
|
|
188
190
|
Local source modules: [src/authentication.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/authentication.ts), [src/authenticator.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/authenticator.ts), [src/authorizable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/authorizable.ts), [src/browser-session.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/browser-session.ts), [src/client.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/client.ts), [src/cookie-auth.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/cookie-auth.ts), [src/credential-user.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/credential-user.ts), [src/email-verification.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/email-verification.ts), [src/gate.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/gate.ts), [src/impersonation-auth.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/impersonation-auth.ts), [src/impersonation-store.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/impersonation-store.ts), [src/impersonation.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/impersonation.ts), [src/magic-link.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/magic-link.ts), [src/middleware.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/middleware.ts), [src/oauth-authorization-codes.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-authorization-codes.ts), [src/oauth-authorization-endpoint.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-authorization-endpoint.ts), [src/oauth-authorization-requests.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-authorization-requests.ts), [src/oauth-authorization-response.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-authorization-response.ts), [src/oauth-authorization.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-authorization.ts), [src/oauth-browser-session.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-browser-session.ts), [src/oauth-client-registration.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-client-registration.ts), [src/oauth-consent.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-consent.ts), [src/oauth-delegated-access.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-delegated-access.ts), [src/oauth-dynamic-registration.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-dynamic-registration.ts), [src/oauth-grants.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-grants.ts), [src/oauth-introspection.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-introspection.ts), [src/oauth-metadata.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-metadata.ts), [src/oauth-pkce.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-pkce.ts), [src/oauth-protected-resource.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-protected-resource.ts), [src/oauth-provider.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-provider.ts), [src/oauth-pruning.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-pruning.ts), [src/oauth-revocation.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-revocation.ts), [src/oauth-server.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-server.ts), [src/oauth-token-endpoint.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-token-endpoint.ts), [src/oauth-token-exchange.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-token-exchange.ts), [src/oauth-token-request.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-token-request.ts), [src/oauth-token-response.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/oauth-token-response.ts), [src/page-gate.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/page-gate.ts), [src/passkey.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/passkey.ts), [src/passkeys.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/passkeys.ts), [src/password/reset-token.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/password/reset-token.ts), [src/password/reset.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/password/reset.ts), [src/permissions.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/permissions.ts), [src/policy.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/policy.ts), [src/rate-limiter.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/rate-limiter.ts), [src/rbac-seed.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/rbac-seed.ts), [src/rbac-store-bqb.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/rbac-store-bqb.ts), [src/rbac.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/rbac.ts), [src/referrals.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/referrals.ts), [src/register.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/register.ts), [src/request-token.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/request-token.ts), [src/session-auth.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/session-auth.ts), [src/session-handoff.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/session-handoff.ts), [src/socials.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/socials.ts), [src/team.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/team.ts), [src/tokens.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/tokens.ts), [src/two-factor.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/two-factor.ts), [src/user.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/src/user.ts).
|
|
189
191
|
|
|
190
|
-
Evidence directory: [
|
|
192
|
+
Evidence directory: [126 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/auth/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
191
193
|
|
|
192
194
|
### @stacksjs/browser
|
|
193
195
|
|
|
@@ -217,15 +219,17 @@ Read the entrypoint and package export map for re-exported or type-only surfaces
|
|
|
217
219
|
|
|
218
220
|
Local source modules: [src/commands/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/buddy/src/commands/index.ts).
|
|
219
221
|
|
|
220
|
-
Evidence directory: [
|
|
222
|
+
Evidence directory: [179 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/buddy/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
221
223
|
|
|
222
224
|
### @stacksjs/build
|
|
223
225
|
|
|
224
226
|
Guidance: [`stacks-build`](../stacks-build/SKILL.md). Source: [storage/framework/core/build/src/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/build/src/index.ts).
|
|
225
227
|
|
|
226
|
-
Declared runtime exports: `frameworkExternal`, `intro`, `outro`, `rewriteRelativeTsSpecifiers`, `transpilePackage`, `validateDeclarations`, `validateRuntimeExports`.
|
|
228
|
+
Declared runtime exports: `buildWorkspacePackages`, `dependencyLayers`, `frameworkExternal`, `intro`, `outro`, `rewriteRelativeTsSpecifiers`, `transpilePackage`, `validateDeclarations`, `validateRuntimeExports`, `workspaceBuildTargets`.
|
|
229
|
+
|
|
230
|
+
Local source modules: [src/dependency-layers.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/build/src/dependency-layers.ts), [src/workspace.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/build/src/workspace.ts).
|
|
227
231
|
|
|
228
|
-
Evidence directory: [
|
|
232
|
+
Evidence directory: [6 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/build/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
229
233
|
|
|
230
234
|
### @stacksjs/cache
|
|
231
235
|
|
|
@@ -349,11 +353,11 @@ Evidence directory: [6 retained tests](https://github.com/stacksjs/stacks/blob/m
|
|
|
349
353
|
|
|
350
354
|
Guidance: [`stacks-database`](../stacks-database/SKILL.md). Source: [storage/framework/core/database/src/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/index.ts).
|
|
351
355
|
|
|
352
|
-
Declared runtime exports: `Database`, `EntityQueryBuilder`, `__flushAfterCommitNow`, `__pendingAfterCommitCount`, `addColumnSafely`, `auditForeignKeys`, `auditSchemaDrift`, `auditUniqueIndexes`, `backfillInBatches`, `buildKey`, `classifyDeclaredFKs`, `comparableIndexKey`, `createDatabase`, `createDynamo`, `createMysqlDatabase`, `createPostgresDatabase`, `createQueryBuilder`, `createSqliteDatabase`, `createTursoDatabase`, `describeIgnoreRule`, `detectDriver`, `driverDefaults`, `dynamo`, `enqueueAfterCommit`, `ensureNotificationForeignKeys`, `findFkOrphans`, `findIgnoredMigrations`, `fkKey`, `formatIgnoredMigrations`, `formatSchemaDrift`, `frameworkRouteAdmission`, `generateKeyPattern`, `getConfigFromEnv`, `getConnectionString`, `getDeclaredFKs`, `getDeclaredUniques`, `getLiveFKs`, `getLiveTables`, `getLiveUniqueIndexes`, `isInTransaction`, `logQuery`, `marshall`, `matchedRows`, `mergeWithDefaults`, `migrateNotificationTables`, `migrateRbacTables`, `mutationCount`, `parseKeyPattern`, `postgresIndexStatement`, `renameColumnSafely`, `runInTransactionScope`, `setConfig`, `setQueryTracker`, `trackIgnoredGeneratedMigrations`, `unmarshall`, `validateDriverConfig`.
|
|
356
|
+
Declared runtime exports: `Database`, `EntityQueryBuilder`, `__flushAfterCommitNow`, `__pendingAfterCommitCount`, `addColumnSafely`, `auditForeignKeys`, `auditSchemaDrift`, `auditUniqueIndexes`, `backfillInBatches`, `buildKey`, `classifyDeclaredFKs`, `comparableIndexKey`, `createDatabase`, `createDynamo`, `createMysqlDatabase`, `createPostgresDatabase`, `createQueryBuilder`, `createSqliteDatabase`, `createTursoDatabase`, `describeIgnoreRule`, `detectDriver`, `driverDefaults`, `dynamo`, `enqueueAfterCommit`, `ensureNotificationForeignKeys`, `findFkOrphans`, `findIgnoredMigrations`, `fkKey`, `formatIgnoredMigrations`, `formatSchemaDrift`, `frameworkRouteAdmission`, `generateKeyPattern`, `getConfigFromEnv`, `getConnectionString`, `getDeclaredFKs`, `getDeclaredUniques`, `getLiveFKs`, `getLiveTables`, `getLiveUniqueIndexes`, `isInTransaction`, `logQuery`, `marshall`, `matchedRows`, `mergeWithDefaults`, `migrateNotificationTables`, `migrateRbacTables`, `mutationCount`, `parseKeyPattern`, `postgresIndexStatement`, `readCommittedTransactionOptions`, `renameColumnSafely`, `runInTransactionScope`, `setConfig`, `setQueryTracker`, `sqliteWriteOptions`, `trackIgnoredGeneratedMigrations`, `unmarshall`, `validateDriverConfig`.
|
|
353
357
|
|
|
354
|
-
Local source modules: [src/affected-rows.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/affected-rows.ts), [src/auth-tables.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/auth-tables.ts), [src/custom/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/custom/index.ts), [src/database.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/database.ts), [src/datetime-columns.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/datetime-columns.ts), [src/ddl-constraints.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/ddl-constraints.ts), [src/defaults.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/defaults.ts), [src/dialect.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/dialect.ts), [src/driver-config.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/driver-config.ts), [src/drivers/dynamodb.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/drivers/dynamodb.ts), [src/drivers/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/drivers/index.ts), [src/ensure-database.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/ensure-database.ts), [src/erd.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/erd.ts), [src/fk-audit.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/fk-audit.ts), [src/framework-renames.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/framework-renames.ts), [src/framework-route-admission.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/framework-route-admission.ts), [src/hand-written-migrations.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/hand-written-migrations.ts), [src/ignored-migrations.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/ignored-migrations.ts), [src/index-shape.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/index-shape.ts), [src/managed-columns.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/managed-columns.ts), [src/migration-dialect.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/migration-dialect.ts), [src/migration-ledger.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/migration-ledger.ts), [src/migration-names.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/migration-names.ts), [src/migration-path.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/migration-path.ts), [src/migrations.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/migrations.ts), [src/model-sources.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/model-sources.ts), [src/notification-tables.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/notification-tables.ts), [src/package-migrations.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/package-migrations.ts), [src/package-models.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/package-models.ts), [src/query-logger.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/query-logger.ts), [src/rbac-tables.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/rbac-tables.ts), [src/relation-columns.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/relation-columns.ts), [src/replicas.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/replicas.ts), [src/row-lock.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/row-lock.ts), [src/safe-migrations.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/safe-migrations.ts), [src/schema-align.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/schema-align.ts), [src/schema-drift.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/schema-drift.ts), [src/seeder.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/seeder.ts), [src/shadowed-models.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/shadowed-models.ts), [src/sql-helpers.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/sql-helpers.ts), [src/trait-tables.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/trait-tables.ts), [src/transaction-context.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/transaction-context.ts), [src/types.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/types.ts), [src/unique-audit.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/unique-audit.ts), [src/utc-defaults.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/utc-defaults.ts), [src/utils.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/utils.ts), [src/uuid-columns.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/uuid-columns.ts), [src/vschema.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/vschema.ts).
|
|
358
|
+
Local source modules: [src/affected-rows.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/affected-rows.ts), [src/auth-tables.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/auth-tables.ts), [src/custom/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/custom/index.ts), [src/database.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/database.ts), [src/datetime-columns.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/datetime-columns.ts), [src/ddl-constraints.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/ddl-constraints.ts), [src/defaults.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/defaults.ts), [src/dialect.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/dialect.ts), [src/driver-config.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/driver-config.ts), [src/drivers/dynamodb.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/drivers/dynamodb.ts), [src/drivers/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/drivers/index.ts), [src/ensure-database.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/ensure-database.ts), [src/erd.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/erd.ts), [src/fk-audit.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/fk-audit.ts), [src/framework-renames.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/framework-renames.ts), [src/framework-route-admission.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/framework-route-admission.ts), [src/hand-written-migrations.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/hand-written-migrations.ts), [src/ignored-migrations.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/ignored-migrations.ts), [src/index-shape.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/index-shape.ts), [src/managed-columns.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/managed-columns.ts), [src/migration-dialect.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/migration-dialect.ts), [src/migration-ledger.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/migration-ledger.ts), [src/migration-names.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/migration-names.ts), [src/migration-path.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/migration-path.ts), [src/migrations.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/migrations.ts), [src/model-sources.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/model-sources.ts), [src/notification-tables.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/notification-tables.ts), [src/package-migrations.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/package-migrations.ts), [src/package-models.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/package-models.ts), [src/query-logger.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/query-logger.ts), [src/rbac-tables.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/rbac-tables.ts), [src/relation-columns.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/relation-columns.ts), [src/replicas.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/replicas.ts), [src/row-lease.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/row-lease.ts), [src/row-lock.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/row-lock.ts), [src/safe-migrations.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/safe-migrations.ts), [src/schema-align.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/schema-align.ts), [src/schema-drift.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/schema-drift.ts), [src/seeder.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/seeder.ts), [src/shadowed-models.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/shadowed-models.ts), [src/sql-helpers.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/sql-helpers.ts), [src/trait-tables.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/trait-tables.ts), [src/transaction-context.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/transaction-context.ts), [src/transaction-options.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/transaction-options.ts), [src/types.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/types.ts), [src/unique-audit.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/unique-audit.ts), [src/utc-defaults.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/utc-defaults.ts), [src/utils.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/utils.ts), [src/uuid-columns.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/uuid-columns.ts), [src/vschema.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/src/vschema.ts).
|
|
355
359
|
|
|
356
|
-
Evidence directory: [
|
|
360
|
+
Evidence directory: [138 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/database/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
357
361
|
|
|
358
362
|
### @stacksjs/datetime
|
|
359
363
|
|
|
@@ -363,7 +367,7 @@ Declared runtime exports: `DateTime`, `addCalendarMonths`, `addDays`, `dateForma
|
|
|
363
367
|
|
|
364
368
|
Local source modules: [src/calendar.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/datetime/src/calendar.ts), [src/format.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/datetime/src/format.ts), [src/local.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/datetime/src/local.ts), [src/now.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/datetime/src/now.ts), [src/parse.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/datetime/src/parse.ts), [src/schedule.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/datetime/src/schedule.ts), [src/zone.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/datetime/src/zone.ts).
|
|
365
369
|
|
|
366
|
-
Evidence directory: [
|
|
370
|
+
Evidence directory: [21 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/datetime/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
367
371
|
|
|
368
372
|
### @stacksjs/defaults
|
|
369
373
|
|
|
@@ -465,7 +469,7 @@ Declared runtime exports: `all`, `appListenersBooted`, `bootAppListeners`, `crea
|
|
|
465
469
|
|
|
466
470
|
Local source modules: [src/discover.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/events/src/discover.ts).
|
|
467
471
|
|
|
468
|
-
Evidence directory: [
|
|
472
|
+
Evidence directory: [13 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/events/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
469
473
|
|
|
470
474
|
### @stacksjs/faker
|
|
471
475
|
|
|
@@ -483,7 +487,7 @@ Declared runtime exports: `Feature`, `featureFlags`.
|
|
|
483
487
|
|
|
484
488
|
Local source modules: [src/drivers/database.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/feature-flags/src/drivers/database.ts), [src/drivers/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/feature-flags/src/drivers/index.ts), [src/drivers/memory.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/feature-flags/src/drivers/memory.ts), [src/errors.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/feature-flags/src/errors.ts), [src/manager.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/feature-flags/src/manager.ts), [src/schema.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/feature-flags/src/schema.ts), [src/scope.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/feature-flags/src/scope.ts), [src/strategies.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/feature-flags/src/strategies.ts), [src/types.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/feature-flags/src/types.ts), [src/value.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/feature-flags/src/value.ts).
|
|
485
489
|
|
|
486
|
-
Evidence directory: [
|
|
490
|
+
Evidence directory: [8 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/feature-flags/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
487
491
|
|
|
488
492
|
### @stacksjs/features
|
|
489
493
|
|
|
@@ -503,7 +507,7 @@ Declared runtime exports: `checkSubmissionSpam`, `checkUpload`, `completeSubmiss
|
|
|
503
507
|
|
|
504
508
|
Local source modules: [src/conditions.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/forms/src/conditions.ts), [src/create.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/forms/src/create.ts), [src/definition.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/forms/src/definition.ts), [src/notifications.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/forms/src/notifications.ts), [src/spam.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/forms/src/spam.ts), [src/submissions.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/forms/src/submissions.ts), [src/uploads.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/forms/src/uploads.ts), [src/validate.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/forms/src/validate.ts).
|
|
505
509
|
|
|
506
|
-
Evidence directory: [
|
|
510
|
+
Evidence directory: [7 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/forms/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
507
511
|
|
|
508
512
|
### @stacksjs/git
|
|
509
513
|
|
|
@@ -539,9 +543,11 @@ Evidence directory: [2 retained tests](https://github.com/stacksjs/stacks/blob/m
|
|
|
539
543
|
|
|
540
544
|
Guidance: [`stacks-http`](../stacks-http/SKILL.md). Source: [storage/framework/core/http/src/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/http/src/index.ts).
|
|
541
545
|
|
|
542
|
-
Declared runtime exports: `Response`, `fetchWithBudget`.
|
|
546
|
+
Declared runtime exports: `Response`, `fetchWithBudget`, `retryAfterMilliseconds`.
|
|
543
547
|
|
|
544
|
-
|
|
548
|
+
Local source modules: [src/retry-after.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/http/src/retry-after.ts).
|
|
549
|
+
|
|
550
|
+
Evidence directory: [3 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/http/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
545
551
|
|
|
546
552
|
### @stacksjs/i18n
|
|
547
553
|
|
|
@@ -615,7 +621,7 @@ Declared runtime exports: `BroadcastNotificationDriver`, `DEFAULT_SMS_OPT_OUT`,
|
|
|
615
621
|
|
|
616
622
|
Local source modules: [src/delivery.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/notifications/src/delivery.ts), [src/drivers/broadcast.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/notifications/src/drivers/broadcast.ts), [src/drivers/database.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/notifications/src/drivers/database.ts), [src/drivers/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/notifications/src/drivers/index.ts), [src/email-body.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/notifications/src/email-body.ts), [src/frame-strings.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/notifications/src/frame-strings.ts), [src/preferences.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/notifications/src/preferences.ts), [src/sequences.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/notifications/src/sequences.ts), [src/templates.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/notifications/src/templates.ts), [src/unsubscribe.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/notifications/src/unsubscribe.ts).
|
|
617
623
|
|
|
618
|
-
Evidence directory: [
|
|
624
|
+
Evidence directory: [18 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/notifications/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
619
625
|
|
|
620
626
|
### @stacksjs/objects
|
|
621
627
|
|
|
@@ -625,7 +631,7 @@ Declared runtime exports: `clearUndefined`, `deepMerge`, `hasOwnProperty`, `isKe
|
|
|
625
631
|
|
|
626
632
|
Local source modules: [src/transform.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/objects/src/transform.ts).
|
|
627
633
|
|
|
628
|
-
Evidence directory: [
|
|
634
|
+
Evidence directory: [6 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/objects/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
629
635
|
|
|
630
636
|
### @stacksjs/orm
|
|
631
637
|
|
|
@@ -635,7 +641,7 @@ Declared runtime exports: `Activity`, `AnalyticsEvent`, `Auction`, `AuctionItem`
|
|
|
635
641
|
|
|
636
642
|
Local source modules: [src/auto-crud.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/auto-crud.ts), [src/batch-loader.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/batch-loader.ts), [src/db.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/db.ts), [src/define-model.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/define-model.ts), [src/extend-model.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/extend-model.ts), [src/gdpr/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/gdpr/index.ts), [src/generate-database-schema.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/generate-database-schema.ts), [src/locked-row.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/locked-row.ts), [src/messaging.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/messaging.ts), [src/model-types.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/model-types.ts), [src/ownership.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/ownership.ts), [src/paginator-request.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/paginator-request.ts), [src/row-token.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/row-token.ts), [src/subquery.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/subquery.ts), [src/traits/audit.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/audit.ts), [src/traits/billable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/billable.ts), [src/traits/categorizable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/categorizable.ts), [src/traits/commentable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/commentable.ts), [src/traits/likeable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/likeable.ts), [src/traits/taggable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/traits/taggable.ts), [src/transaction.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/transaction.ts), [src/types.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/types.ts), [src/utils/encrypted.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/utils/encrypted.ts), [src/utils/prunable.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/src/utils/prunable.ts).
|
|
637
643
|
|
|
638
|
-
Evidence directory: [
|
|
644
|
+
Evidence directory: [76 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/orm/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
639
645
|
|
|
640
646
|
### @stacksjs/pagination
|
|
641
647
|
|
|
@@ -661,7 +667,7 @@ Declared runtime exports: `Payment`, `freshIdempotencyKey`, `stacksIdempotencyKe
|
|
|
661
667
|
|
|
662
668
|
Local source modules: [src/billable/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/payments/src/billable/index.ts), [src/checkout-outcome.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/payments/src/checkout-outcome.ts), [src/connect/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/payments/src/connect/index.ts), [src/direct-debit.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/payments/src/direct-debit.ts), [src/driver/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/payments/src/driver/index.ts), [src/drivers/stripe.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/payments/src/drivers/stripe.ts), [src/idempotency.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/payments/src/idempotency.ts), [src/payment.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/payments/src/payment.ts), [src/subscription-state.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/payments/src/subscription-state.ts), [src/terminal.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/payments/src/terminal.ts).
|
|
663
669
|
|
|
664
|
-
Evidence directory: [
|
|
670
|
+
Evidence directory: [39 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/payments/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
665
671
|
|
|
666
672
|
### @stacksjs/push
|
|
667
673
|
|
|
@@ -677,19 +683,21 @@ Evidence directory: [8 retained tests](https://github.com/stacksjs/stacks/blob/m
|
|
|
677
683
|
|
|
678
684
|
Guidance: [`stacks-query-builder`](../stacks-query-builder/SKILL.md). Source: [storage/framework/core/query-builder/src/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/query-builder/src/index.ts).
|
|
679
685
|
|
|
680
|
-
Declared runtime exports: `QueryBuilder`, `SQLITE_BOOTSTRAP_PRAGMAS`, `applySqlitePragmas`, `assertSafeIdentifier`, `assertSafeOperator`, `bootstrapModelExecutorPragmas`, `configureOrm`, `createQueryBuilder`, `isSafeOperator`, `registerModel`, `registerPersistentQueryHooks`, `saveMigrationSnapshot`, `setConfig`, `validateIdentifier`.
|
|
686
|
+
Declared runtime exports: `InvalidCursorError`, `QueryBuilder`, `SQLITE_BOOTSTRAP_PRAGMAS`, `applySqlitePragmas`, `assertSafeIdentifier`, `assertSafeOperator`, `bootstrapModelExecutorPragmas`, `configureOrm`, `createQueryBuilder`, `isSafeOperator`, `keysetPage`, `registerModel`, `registerPersistentQueryHooks`, `saveMigrationSnapshot`, `setConfig`, `validateIdentifier`.
|
|
687
|
+
|
|
688
|
+
Local source modules: [src/keyset-pagination.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/query-builder/src/keyset-pagination.ts).
|
|
681
689
|
|
|
682
|
-
Evidence directory: [
|
|
690
|
+
Evidence directory: [7 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/query-builder/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
683
691
|
|
|
684
692
|
### @stacksjs/queue
|
|
685
693
|
|
|
686
694
|
Guidance: [`stacks-queue`](../stacks-queue/SKILL.md). Source: [storage/framework/core/queue/src/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/index.ts).
|
|
687
695
|
|
|
688
|
-
Declared runtime exports: `Batch`, `DispatchedBatch`, `FailedJobNotifier`, `JOB_ENVELOPE_VERSION`, `Job`, `Jobs`, `OnQueueEvent`, `PendingBatch`, `QueueEvents`, `QueueMetrics`, `QueueTester`, `assertEnvelopeSerializable`, `cancelJob`, `checkQueueHealth`, `claimDispatchKey`, `clearEnvelopeWarnings`, `clearJobState`, `configureFailedJobNotifications`, `createEnvelope`, `createHealthCheckHandler`, `createQueueTester`, `discoverJobs`, `emitQueueEvent`, `executeFailedJobs`, `executeJob`, `expectJobToFail`, `fake`, `getActionRunner`, `getActiveJobCount`, `getAllJobs`, `getBatchCallbacks`, `getFailedJobNotifier`, `getFakeQueue`, `getGlobalMetrics`, `getJob`, `getJobProgress`, `getQueueEvents`, `getRedisQueue`, `getRegisteredJobs`, `getScheduledJobs`, `getSchedulerStatus`, `getWorkerTracker`, `hasDispatchedKey`, `hashPayload`, `isBatchCancelled`, `isCircuitOpen`, `isFaked`, `isJobCancelled`, `isQuarantined`, `isQueueHealthy`, `isSchedulerRunning`, `isWorkerRunning`, `job`, `jobBatch`, `jobRegistry`, `listCircuitState`, `listDeadLetterJobs`, `listQuarantined`, `moveToDeadLetter`, `notifyJobFailed`, `onQueueEvent`, `parseEnvelope`, `pauseQueue`, `purgeDeadLetterJobs`, `quarantineJob`, `queuedJobState`, `recordBatchJobCompletion`, `recordBatchJobFailure`, `recordCircuitFailure`, `recordCircuitSuccess`, `recordDispatchedKey`, `recordFailureForPoison`, `releaseDispatchKey`, `restore`, `resumeQueue`, `retryDeadLetterJob`, `retryFailedJob`, `runJob`, `runTestJob`, `serializeEnvelope`, `setActionRunner`, `setJobProgress`, `startProcessor`, `startScheduler`, `stopProcessor`, `stopScheduler`, `toJobOptions`, `triggerJob`, `unquarantineJob`, `withEvents`.
|
|
696
|
+
Declared runtime exports: `Batch`, `DispatchedBatch`, `FailedJobNotifier`, `JOB_ENVELOPE_VERSION`, `Job`, `Jobs`, `OnQueueEvent`, `PendingBatch`, `QueueEvents`, `QueueMetrics`, `QueueTester`, `assertEnvelopeSerializable`, `cancelJob`, `checkQueueHealth`, `claimDispatchKey`, `clearEnvelopeWarnings`, `clearJobState`, `configureFailedJobNotifications`, `createEnvelope`, `createHealthCheckHandler`, `createQueueTester`, `discoverJobs`, `emitQueueEvent`, `executeFailedJobs`, `executeJob`, `expectJobToFail`, `fake`, `getActionRunner`, `getActiveJobCount`, `getAllJobs`, `getBatchCallbacks`, `getFailedJobNotifier`, `getFakeQueue`, `getGlobalMetrics`, `getJob`, `getJobProgress`, `getQueueEvents`, `getRedisQueue`, `getRegisteredJobs`, `getScheduledJobs`, `getSchedulerStatus`, `getWorkerTracker`, `hasDispatchedKey`, `hashPayload`, `isBatchCancelled`, `isCircuitOpen`, `isFaked`, `isJobCancelled`, `isQuarantined`, `isQueueHealthy`, `isSchedulerRunning`, `isWorkerRunning`, `job`, `jobBatch`, `jobRegistry`, `listCircuitState`, `listDeadLetterJobs`, `listQuarantined`, `moveToDeadLetter`, `notifyJobFailed`, `onQueueEvent`, `parseEnvelope`, `pauseQueue`, `purgeDeadLetterJobs`, `quarantineJob`, `queuedJobState`, `recordBatchJobCompletion`, `recordBatchJobFailure`, `recordCircuitFailure`, `recordCircuitSuccess`, `recordDispatchedKey`, `recordFailureForPoison`, `releaseDispatchKey`, `resolveQueueDriver`, `restore`, `resumeQueue`, `retryDeadLetterJob`, `retryFailedJob`, `runJob`, `runTestJob`, `serializeEnvelope`, `setActionRunner`, `setJobProgress`, `startProcessor`, `startScheduler`, `stopProcessor`, `stopScheduler`, `toJobOptions`, `triggerJob`, `unquarantineJob`, `withEvents`.
|
|
689
697
|
|
|
690
|
-
Local source modules: [src/action-runner.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/action-runner.ts), [src/action.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/action.ts), [src/batch.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/batch.ts), [src/bun-queue.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/bun-queue.ts), [src/circuit-breaker.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/circuit-breaker.ts), [src/dead-letter.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/dead-letter.ts), [src/discovery.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/discovery.ts), [src/drivers/redis.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/drivers/redis.ts), [src/envelope.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/envelope.ts), [src/events.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/events.ts), [src/health.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/health.ts), [src/idempotency.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/idempotency.ts), [src/job-progress.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/job-progress.ts), [src/job.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/job.ts), [src/notifications.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/notifications.ts), [src/poison.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/poison.ts), [src/scheduler.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/scheduler.ts), [src/testing.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/testing.ts), [src/worker.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/worker.ts).
|
|
698
|
+
Local source modules: [src/action-runner.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/action-runner.ts), [src/action.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/action.ts), [src/batch.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/batch.ts), [src/bun-queue.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/bun-queue.ts), [src/circuit-breaker.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/circuit-breaker.ts), [src/dead-letter.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/dead-letter.ts), [src/discovery.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/discovery.ts), [src/driver.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/driver.ts), [src/drivers/redis.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/drivers/redis.ts), [src/envelope.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/envelope.ts), [src/events.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/events.ts), [src/health.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/health.ts), [src/idempotency.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/idempotency.ts), [src/job-progress.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/job-progress.ts), [src/job.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/job.ts), [src/notifications.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/notifications.ts), [src/poison.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/poison.ts), [src/scheduler.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/scheduler.ts), [src/testing.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/testing.ts), [src/worker.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/src/worker.ts).
|
|
691
699
|
|
|
692
|
-
Evidence directory: [
|
|
700
|
+
Evidence directory: [52 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/queue/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
693
701
|
|
|
694
702
|
### @stacksjs/realtime
|
|
695
703
|
|
|
@@ -735,7 +743,7 @@ Read the entrypoint and package export map for re-exported or type-only surfaces
|
|
|
735
743
|
|
|
736
744
|
Local source modules: [src/run.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/scheduler/src/run.ts), [src/schedule.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/scheduler/src/schedule.ts), [src/types.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/scheduler/src/types.ts).
|
|
737
745
|
|
|
738
|
-
Evidence directory: [
|
|
746
|
+
Evidence directory: [17 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/scheduler/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
739
747
|
|
|
740
748
|
### @stacksjs/search-engine
|
|
741
749
|
|
|
@@ -813,7 +821,7 @@ Declared runtime exports: `SMS`, `TwilioDriver`, `VonageDriver`, `createTwilioDr
|
|
|
813
821
|
|
|
814
822
|
Local source modules: [src/compliance.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/sms/src/compliance.ts), [src/drivers/index.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/sms/src/drivers/index.ts), [src/drivers/twilio.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/sms/src/drivers/twilio.ts), [src/drivers/vonage.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/sms/src/drivers/vonage.ts), [src/inbound.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/sms/src/inbound.ts), [src/keywords.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/sms/src/keywords.ts), [src/opt-out.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/sms/src/opt-out.ts), [src/sms.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/sms/src/sms.ts).
|
|
815
823
|
|
|
816
|
-
Evidence directory: [
|
|
824
|
+
Evidence directory: [6 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/sms/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
817
825
|
|
|
818
826
|
### @stacksjs/socials
|
|
819
827
|
|
|
@@ -911,7 +919,7 @@ Declared runtime exports: `applyConditionals`, `isArray`, `isBoolean`, `isFuncti
|
|
|
911
919
|
|
|
912
920
|
Local source modules: [src/input.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/validation/src/input.ts), [src/messages.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/validation/src/messages.ts), [src/reporter.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/validation/src/reporter.ts), [src/schema.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/validation/src/schema.ts), [src/validator.ts](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/validation/src/validator.ts).
|
|
913
921
|
|
|
914
|
-
Evidence directory: [
|
|
922
|
+
Evidence directory: [21 retained tests](https://github.com/stacksjs/stacks/blob/main/storage/framework/core/validation/tests). These files are evidence pointers, not a claim that all tests were run for this catalog.
|
|
915
923
|
|
|
916
924
|
### @stacksjs/video
|
|
917
925
|
|
|
@@ -88,6 +88,11 @@ otherwise let it fail.
|
|
|
88
88
|
Use `getNotificationPreferences`, `setNotificationPreference` and
|
|
89
89
|
`bulkSetPreferences` with their exported types. Writes use a transaction and
|
|
90
90
|
lock the user row; a bulk save is atomic across its whole preference matrix.
|
|
91
|
+
When the preferences cannot be read, `notify()` fails every channel of a send
|
|
92
|
+
that names a `category` (the thing people unsubscribe from) instead of sending
|
|
93
|
+
it, and sends an uncategorized one anyway; `filterChannelsByPreferences` throws
|
|
94
|
+
then, and `getNotificationPreferences` returns an empty map. Pass
|
|
95
|
+
`ignorePreferences: true` for a categorized send that must go out regardless.
|
|
91
96
|
SMS also consults persistent
|
|
92
97
|
phone opt-outs unless `ignoreOptOut` is true. Ordinary direct SMS sends have
|
|
93
98
|
their own contract; see `stacks-sms`.
|
|
@@ -920,7 +920,7 @@ The instance methods are exactly the keys of `createBillableMethods` in
|
|
|
920
920
|
its original raw payload before applying domain events.
|
|
921
921
|
- Stripe API keys MUST be in `.env` as `STRIPE_SECRET_KEY` and `STRIPE_PUBLISHABLE_KEY` -- never hardcode them in config files
|
|
922
922
|
- The Stripe client is created lazily, on first use: importing `@stacksjs/payments` without `STRIPE_SECRET_KEY` (or without the opt-in `stripe` package) is fine, and the first Stripe call throws naming what is missing
|
|
923
|
-
- All amounts are in the currency's minor unit
|
|
923
|
+
- All amounts are in the currency's minor unit, and which minor unit depends on the API. A provider-neutral `Money` (the driver, the billable trait's `createPayment()`/`charge()`/`refund()`, webhook `PaymentEvent.amount`) is in ISO 4217 minor units, as commerce stores them: whole krónur for ISK, hundredths for MGA. The Stripe driver converts to Stripe's units, which differ for ISK, UGX (two decimals) and MGA (none), with `toStripeAmount()` and `fromStripeAmount()`, and refuses a fraction of an ariary. The Stripe-shaped APIs (`manageCharge`, Connect, direct debit, product setup) and `formatAmount()` take Stripe's units: cents for USD, whole yen for JPY, hundredths for ISK and UGX. `toCents()` and `toDollars()` are for two-decimal currencies; `minorUnitExponent(currency)` says how many decimals a Stripe amount has
|
|
924
924
|
- `Payment.charge()` (Stripe driver) creates AND confirms the PaymentIntent in one step
|
|
925
925
|
- `subscribe()` resolves the price via `lookup_key`, not a direct Stripe price ID
|
|
926
926
|
- `Payment.removePaymentMethod()` and the billable instance method `removePaymentMethod()` both take the provider's id (string); `managePaymentMethod.deletePaymentMethod()` takes the local row id (number)
|
|
@@ -59,6 +59,13 @@ export class Job {
|
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
### Dispatch Routing
|
|
62
|
+
|
|
63
|
+
Production defaults to the database driver. An explicit `sync` driver in production
|
|
64
|
+
throws; reserved/unknown drivers also throw. `resolveQueueDriver()` shares this
|
|
65
|
+
policy across both dispatch APIs and workers. For a transactional database job
|
|
66
|
+
intent, `storeJob` from `@stacksjs/queue/utils` inserts immediately on the active
|
|
67
|
+
transaction; its consumer is the normal database queue worker, including retries.
|
|
68
|
+
|
|
62
69
|
1. Checks `isFaked()` -- if testing, dispatches to FakeQueue
|
|
63
70
|
2. `sync` driver: calls `dispatchNow()` (immediate execution)
|
|
64
71
|
3. `redis` driver: creates `RedisQueue`, calls `queue.add()` with bun-queue options
|
|
@@ -76,6 +76,8 @@ interface SlugifyOptions {
|
|
|
76
76
|
|
|
77
77
|
## Gotchas
|
|
78
78
|
- Omitting either table or column returns the base slug with no query.
|
|
79
|
+
- A title with no letters or digits at all (`!!!`, an emoji) gets a random
|
|
80
|
+
eight-character slug from `uniqueSlug()`, never `""`; `slugify()` still returns `""`.
|
|
79
81
|
- The check and insert are separate: keep a UNIQUE index and handle/retry an
|
|
80
82
|
insert conflict. A helper cannot reserve the returned slug against a race.
|
|
81
83
|
- Collision attempts are bounded; after repeated conflicts the helper returns
|
|
@@ -84,7 +86,11 @@ interface SlugifyOptions {
|
|
|
84
86
|
- `uniqueSlug()` is async - it queries the database
|
|
85
87
|
- `slugify()` is sync - no database interaction
|
|
86
88
|
- Collision detection appends `-2`, `-3`, etc. (not random suffixes)
|
|
87
|
-
- Unicode characters are transliterated (u → u, e → e, etc.)
|
|
89
|
+
- Unicode characters are transliterated (u → u, e → e, etc.) where ts-slug's charmap
|
|
90
|
+
romanizes the script (Latin, Greek, Cyrillic, Hebrew, Arabic, Devanagari, Georgian);
|
|
91
|
+
any other script, such as Japanese, Chinese, Korean or Thai, keeps its letters
|
|
92
|
+
(`日本語のタイトル` stays as it is; percent-encoded in a URL)
|
|
93
|
+
- Any dash separates words: an em or en dash becomes a hyphen
|
|
88
94
|
- For string-only slugification without DB, use `slug()` from `@stacksjs/strings` instead
|
|
89
95
|
- Tags and Categories both use unique slugs by default
|
|
90
96
|
- Slug columns should have a unique index in the database
|
|
@@ -196,7 +196,10 @@ Extensive built-in character map covering:
|
|
|
196
196
|
- Vietnamese diacritics
|
|
197
197
|
- Currency symbols ($, EUR, GBP, YEN, etc.)
|
|
198
198
|
- Special characters (trademark, copyright, etc.)
|
|
199
|
-
-
|
|
199
|
+
- Any dash (hyphen, en dash, em dash, figure dash) separates words, as in ts-slug
|
|
200
|
+
- `slug()` keeps ASCII only, which suits identifiers such as a cloud resource name. For a
|
|
201
|
+
content URL use `slugify` or `uniqueSlug` from `@stacksjs/slug` (ts-slug), which keeps
|
|
202
|
+
the letters of a script it cannot romanize: `日本茶` stays `日本茶` there and is `""` here
|
|
200
203
|
|
|
201
204
|
### Locale Support
|
|
202
205
|
Locale-specific character mappings for: `bg`, `de`, `es`, `fr`, `pt`, `uk`, `vi`, `da`, `nb`, `it`, `nl`, `sv`.
|
|
@@ -182,7 +182,11 @@ module for the rest of that run, so a mock in one file leaks into the next. A
|
|
|
182
182
|
framework booted against one database also stays booted. When a test needs a
|
|
183
183
|
clean process, run it in a child (`src/isolated.ts`); when it needs real rows,
|
|
184
184
|
give it a database nobody else uses (`src/disposable-database.ts`). Both are on
|
|
185
|
-
the root, with no framework import.
|
|
185
|
+
the root, with no framework import. For direct PostgreSQL queries, use
|
|
186
|
+
`new SQL(database.sqlOptions!)`: Bun can let an inherited `PGDATABASE` override
|
|
187
|
+
a URL's database name. The helper's explicit SQL options select its owned
|
|
188
|
+
database. Pass `database.env` last to isolated children; it supplies matching
|
|
189
|
+
`DB_*`, `PG_*`, `POSTGRES_URL` and `DATABASE_URL` values.
|
|
186
190
|
|
|
187
191
|
```ts
|
|
188
192
|
import { assertIsolatedOk, disposablePostgresUrl, runIsolated, test, withDisposableDatabase } from '@stacksjs/testing'
|
|
@@ -33,7 +33,7 @@ export default new Action({
|
|
|
33
33
|
git clone https://github.com/stacksjs/stacks.git $1
|
|
34
34
|
cd $1
|
|
35
35
|
# Run the pantry-install script
|
|
36
|
-
"./storage/framework/scripts/pantry-install"
|
|
36
|
+
"./storage/framework/scripts/pantry-install" || exit $?
|
|
37
37
|
|
|
38
38
|
echo "Project $1 has been created. Please open a new terminal, run 'bun run dev' to start the server."
|
|
39
39
|
|
|
@@ -58,10 +58,10 @@ fi
|
|
|
58
58
|
cd $PROJECT_ROOT
|
|
59
59
|
# Run the pantry-install script
|
|
60
60
|
if [[ $* == *--verbose* ]]; then
|
|
61
|
-
"$SCRIPT_PATH"
|
|
61
|
+
"$SCRIPT_PATH" || exit $?
|
|
62
62
|
# bun ./storage/framework/core/buddy/src/cli.ts setup --verbose
|
|
63
63
|
else
|
|
64
|
-
"$SCRIPT_PATH" > /dev/null
|
|
64
|
+
"$SCRIPT_PATH" > /dev/null || exit $?
|
|
65
65
|
# bun ./storage/framework/core/buddy/src/cli.ts setup
|
|
66
66
|
fi
|
|
67
67
|
|
package/ide/vscode/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"publisher": "Stacks",
|
|
3
3
|
"name": "vscode-stacks",
|
|
4
4
|
"displayName": "Stacks",
|
|
5
|
-
"version": "0.75.
|
|
5
|
+
"version": "0.75.432",
|
|
6
6
|
"description": "Stacks, built into VS Code: stx templates, pickier linting and formatting, encrypted env files, the dev server preview and every buddy command. No other extensions required.",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"funding": "https://github.com/sponsors/chrisbbreuer",
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@stacksjs/defaults",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "0.75.
|
|
5
|
+
"version": "0.75.432",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
8
|
"url": "git+https://github.com/stacksjs/stacks.git",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"@iconify-json/f7": "^1.2.2",
|
|
47
47
|
"@iconify-json/hugeicons": "^1.2.35",
|
|
48
|
-
"@stacksjs/mobile": "0.75.
|
|
48
|
+
"@stacksjs/mobile": "0.75.432",
|
|
49
49
|
"@stacksjs/sanitizer": "0.2.784",
|
|
50
50
|
"@stacksjs/stx": "0.2.784",
|
|
51
51
|
"@xterm/addon-fit": "^0.11.0",
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
<div class="mx-auto px-6 py-8 max-w-xl cms-form" data-form-uuid="{{ props.formUuid }}">
|
|
9
9
|
<script client>
|
|
10
10
|
import type { PublicFormDefinition, PublicFormField, SubmissionErrors } from '@stacksjs/forms'
|
|
11
|
+
import { visibleFields } from '@stacksjs/forms/conditions'
|
|
11
12
|
import { moneyInputError, moneyInputStep, parseMoneyInput } from '@stacksjs/commerce/money'
|
|
12
13
|
|
|
13
14
|
// `_form` carries a whole-form failure; the rest are keyed by field name.
|
|
@@ -15,7 +16,7 @@
|
|
|
15
16
|
|
|
16
17
|
const host = useRef<HTMLElement>('host')
|
|
17
18
|
const definition = state<PublicFormDefinition | null>(null)
|
|
18
|
-
const values =
|
|
19
|
+
const values = state<Record<string, string | number | boolean>>({})
|
|
19
20
|
const errors = state<FormErrors>({})
|
|
20
21
|
const sending = state(false)
|
|
21
22
|
const done = state('')
|
|
@@ -27,7 +28,7 @@
|
|
|
27
28
|
// rather than only the storage path the server answered with.
|
|
28
29
|
const attached = reactive<Record<string, string>>({})
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
onMount(() => {
|
|
31
32
|
if (!host() || definition())
|
|
32
33
|
return
|
|
33
34
|
const uuid = host()?.dataset.formUuid
|
|
@@ -39,25 +40,19 @@
|
|
|
39
40
|
.catch(() => {})
|
|
40
41
|
})
|
|
41
42
|
|
|
43
|
+
function setFieldValue(name: string, value: string | number | boolean): void {
|
|
44
|
+
values.set({ ...values(), [name]: value })
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function clearFieldValue(name: string): void {
|
|
48
|
+
const next = { ...values() }
|
|
49
|
+
delete next[name]
|
|
50
|
+
values.set(next)
|
|
51
|
+
}
|
|
52
|
+
|
|
42
53
|
function fieldVisible(field: PublicFormField): boolean {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return true
|
|
46
|
-
const results = conditions.rules.map((rule) => {
|
|
47
|
-
const actual = values[rule.field]
|
|
48
|
-
switch (rule.op) {
|
|
49
|
-
case 'eq': return String(actual ?? '') === String(rule.value ?? '')
|
|
50
|
-
case 'neq': return String(actual ?? '') !== String(rule.value ?? '')
|
|
51
|
-
case 'contains': return String(actual ?? '').includes(String(rule.value ?? ''))
|
|
52
|
-
case 'gt': return Number(actual) > Number(rule.value)
|
|
53
|
-
case 'lt': return Number(actual) < Number(rule.value)
|
|
54
|
-
case 'empty': return actual === undefined || actual === null || String(actual) === ''
|
|
55
|
-
case 'not_empty': return actual !== undefined && actual !== null && String(actual) !== ''
|
|
56
|
-
default: return false
|
|
57
|
-
}
|
|
58
|
-
})
|
|
59
|
-
const matched = conditions.logic === 'all' ? results.every(Boolean) : results.some(Boolean)
|
|
60
|
-
return conditions.action === 'show' ? matched : !matched
|
|
54
|
+
try { return visibleFields(definition()?.fields ?? [], values()).includes(field) }
|
|
55
|
+
catch { return false }
|
|
61
56
|
}
|
|
62
57
|
|
|
63
58
|
/**
|
|
@@ -97,13 +92,13 @@
|
|
|
97
92
|
// Clear the input as well as the value: leaving a rejected file
|
|
98
93
|
// showing next to its own error message reads as though it was taken.
|
|
99
94
|
input.value = ''
|
|
100
|
-
|
|
95
|
+
clearFieldValue(field.name)
|
|
101
96
|
delete attached[field.name]
|
|
102
97
|
errors.set({ ...errors(), [field.name]: (failure as { data?: { message?: string } }).data?.message ?? 'That file could not be uploaded.' })
|
|
103
98
|
return
|
|
104
99
|
}
|
|
105
100
|
|
|
106
|
-
|
|
101
|
+
setFieldValue(field.name, body.path ?? '')
|
|
107
102
|
attached[field.name] = file.name
|
|
108
103
|
}
|
|
109
104
|
catch {
|
|
@@ -128,7 +123,7 @@
|
|
|
128
123
|
if (field.type === 'currency')
|
|
129
124
|
setAmount(field, raw)
|
|
130
125
|
else
|
|
131
|
-
|
|
126
|
+
setFieldValue(field.name, raw)
|
|
132
127
|
}
|
|
133
128
|
|
|
134
129
|
/**
|
|
@@ -149,16 +144,16 @@
|
|
|
149
144
|
const currency = formCurrency()
|
|
150
145
|
const error = moneyInputError(raw, currency, { required: false })
|
|
151
146
|
if (error) {
|
|
152
|
-
|
|
147
|
+
setFieldValue(field.name, raw)
|
|
153
148
|
errors.set({ ...errors(), [field.name]: error })
|
|
154
149
|
return
|
|
155
150
|
}
|
|
156
151
|
|
|
157
152
|
const minor = parseMoneyInput(raw, currency, { required: false })
|
|
158
153
|
if (minor === null)
|
|
159
|
-
|
|
154
|
+
clearFieldValue(field.name)
|
|
160
155
|
else
|
|
161
|
-
|
|
156
|
+
setFieldValue(field.name, minor)
|
|
162
157
|
if (errors()[field.name])
|
|
163
158
|
errors.set({ ...errors(), [field.name]: '' })
|
|
164
159
|
}
|
|
@@ -199,7 +194,7 @@
|
|
|
199
194
|
// 403 "CSRF token mismatch" on every submission.
|
|
200
195
|
let body: { message?: string, redirect?: string }
|
|
201
196
|
try {
|
|
202
|
-
body = await useMutation(`/api/forms/${uuid}/submissions`).mutate({ ...values, _renderedMs: Date.now() - openedAt })
|
|
197
|
+
body = await useMutation(`/api/forms/${uuid}/submissions`).mutate({ ...values(), _renderedMs: Date.now() - openedAt })
|
|
203
198
|
}
|
|
204
199
|
catch (failure) {
|
|
205
200
|
const { status, data } = failure as { status?: number, data?: { errors?: FormErrors, message?: string } }
|
|
@@ -232,41 +227,41 @@
|
|
|
232
227
|
|
|
233
228
|
<div class="grid gap-5 grid-cols-1 sm:grid-cols-2 mt-6">
|
|
234
229
|
<template :for="field in definition()?.fields ?? []">
|
|
235
|
-
<div :if="fieldVisible(field)" class="
|
|
230
|
+
<div :if="fieldVisible(field)" :class="field.width === 'half' ? '' : 'sm:col-span-2'">
|
|
236
231
|
<h3 :if="field.type === 'section_break'" class="mt-2 pt-4 font-medium text-lg border-gray-200 border-t">{{ field.label }}</h3>
|
|
237
232
|
<template :else>
|
|
238
233
|
<label class="block font-medium text-[14px] text-gray-800">{{ field.label }}<span :if="field.required" aria-hidden="true" class="text-red-500"> *</span></label>
|
|
239
|
-
<textarea :if="field.type === 'textarea'" rows="4" :required="field.required" placeholder="
|
|
240
|
-
<select :else-if="field.type === 'select'" :required="field.required" @change="
|
|
234
|
+
<textarea :if="field.type === 'textarea'" rows="4" :required="field.required" :placeholder="field.options.placeholder ?? ''" @input="setFieldValue(field.name, $event.target.value)" class="mt-1.5 px-3.5 py-2.5 w-full text-[15px] border border-gray-300 rounded-lg"></textarea>
|
|
235
|
+
<select :else-if="field.type === 'select'" :required="field.required" @change="setFieldValue(field.name, $event.target.value)" class="mt-1.5 px-3.5 py-2.5 w-full text-[15px] bg-white border border-gray-300 rounded-lg">
|
|
241
236
|
<option value="">Choose...</option>
|
|
242
|
-
<option :for="choice in field.options.choices ?? []" value="
|
|
237
|
+
<option :for="choice in field.options.choices ?? []" :value="choice.value">{{ choice.label }}</option>
|
|
243
238
|
</select>
|
|
244
239
|
<div :else-if="field.type === 'radio'" class="mt-2 space-y-2">
|
|
245
240
|
<label :for="choice in field.options.choices ?? []" class="flex gap-2.5 items-center text-[15px]">
|
|
246
|
-
<input type="radio" name="
|
|
241
|
+
<input type="radio" :name="field.name" :value="choice.value" @change="setFieldValue(field.name, $event.target.value)" class="h-4 w-4">
|
|
247
242
|
{{ choice.label }}
|
|
248
243
|
</label>
|
|
249
244
|
</div>
|
|
250
245
|
<label :else-if="field.type === 'checkbox'" class="flex gap-2.5 items-center mt-2 text-[15px]">
|
|
251
|
-
<input type="checkbox" @change="
|
|
246
|
+
<input type="checkbox" @change="setFieldValue(field.name, $event.target.checked)" class="h-4 w-4 rounded">
|
|
252
247
|
{{ field.options.placeholder ?? 'Yes' }}
|
|
253
248
|
</label>
|
|
254
249
|
{{-- A file field used to fall through to the text input below, so
|
|
255
250
|
a person typed prose into what should have been a picker and
|
|
256
251
|
the submission could never satisfy it. --}}
|
|
257
252
|
<div :else-if="field.type === 'file'" class="mt-1.5">
|
|
258
|
-
<input type="file" :required="field.required && !values[field.name]" :disabled="uploading[field.name]" accept="
|
|
253
|
+
<input type="file" :required="field.required && !values()[field.name]" :disabled="uploading[field.name]" :accept="acceptAttr(field)" @change="uploadFile(field, $event)" class="block file:mr-3 file:px-3.5 file:py-2 w-full text-[15px] file:font-medium file:text-[14px] file:bg-gray-100 file:border-0 file:rounded-lg">
|
|
259
254
|
<p :if="uploading[field.name]" class="mt-1.5 text-[13px] text-gray-500">Uploading...</p>
|
|
260
255
|
<p :else-if="attached[field.name]" class="mt-1.5 text-[13px] text-green-700">Attached {{ attached[field.name] }}</p>
|
|
261
256
|
</div>
|
|
262
|
-
<input :else type="
|
|
257
|
+
<input :else :type="field.type === 'email' ? 'email' : (field.type === 'phone' ? 'tel' : (field.type === 'date' ? 'date' : (field.type === 'currency' ? 'number' : 'text')))" :required="field.required" :placeholder="field.options.placeholder ?? ''" :step="field.type === 'currency' ? moneyInputStep(formCurrency()) : null" @input="setInput(field, $event.target.value)" class="mt-1.5 px-3.5 py-2.5 w-full text-[15px] border border-gray-300 rounded-lg">
|
|
263
258
|
<p :if="errors()[field.name]" class="mt-1.5 text-[13px] text-red-600">{{ errors()[field.name] }}</p>
|
|
264
259
|
</template>
|
|
265
260
|
</div>
|
|
266
261
|
</template>
|
|
267
262
|
</div>
|
|
268
263
|
|
|
269
|
-
<input type="text" name="website" tabindex="-1" autocomplete="off" aria-hidden="true" class="hidden" @input="
|
|
264
|
+
<input type="text" name="website" tabindex="-1" autocomplete="off" aria-hidden="true" class="hidden" @input="setFieldValue('_hp', $event.target.value)">
|
|
270
265
|
|
|
271
266
|
<button type="submit" :disabled="sending() || anyUploading()" class="mt-7 px-6 py-3 font-medium text-white bg-gray-900 rounded-lg disabled:opacity-60 transition-transform active:scale-[0.98]">
|
|
272
267
|
{{ sending() ? 'Sending...' : (definition()?.submitLabel ?? 'Submit') }}
|
package/routes/forms.ts
CHANGED
|
@@ -13,7 +13,7 @@ import { response, route } from '@stacksjs/router'
|
|
|
13
13
|
* allowlist - deliberately not shipped until something needs it.)
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
async function siteIdForRequest(request: any): Promise<number | null> {
|
|
16
|
+
async function siteIdForRequest(request: any): Promise<number | null | undefined> {
|
|
17
17
|
const options = sitesOptions()
|
|
18
18
|
if (!options.enabled)
|
|
19
19
|
return null
|
|
@@ -22,13 +22,16 @@ async function siteIdForRequest(request: any): Promise<number | null> {
|
|
|
22
22
|
? request.headers
|
|
23
23
|
: new Headers(request.headers ?? {})
|
|
24
24
|
const site = await resolveSiteByHost(requestHost(headers, options), undefined, options)
|
|
25
|
-
return site?.id
|
|
25
|
+
return site?.id
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
route.get('/api/forms/{uuid}', async (request: any) => {
|
|
29
29
|
const { loadFormByUuid, publicDefinition } = await import('@stacksjs/forms')
|
|
30
30
|
|
|
31
|
-
const
|
|
31
|
+
const siteId = await siteIdForRequest(request)
|
|
32
|
+
if (siteId === undefined)
|
|
33
|
+
return response.notFound('Form not found')
|
|
34
|
+
const form = await loadFormByUuid(String(request.params?.uuid ?? request.param?.('uuid') ?? ''), siteId)
|
|
32
35
|
if (!form || form.status === 'draft')
|
|
33
36
|
return response.notFound('Form not found')
|
|
34
37
|
|
|
@@ -50,7 +53,10 @@ route.get('/api/forms/{uuid}', async (request: any) => {
|
|
|
50
53
|
route.post('/api/forms/{uuid}/uploads', async (request: any) => {
|
|
51
54
|
const { checkUpload, fileFieldNamed, formUploadPrefix, loadFormByUuid, resolveUploadLimits } = await import('@stacksjs/forms')
|
|
52
55
|
|
|
53
|
-
const
|
|
56
|
+
const siteId = await siteIdForRequest(request)
|
|
57
|
+
if (siteId === undefined)
|
|
58
|
+
return response.notFound('Form not found')
|
|
59
|
+
const form = await loadFormByUuid(String(request.params?.uuid ?? request.param?.('uuid') ?? ''), siteId)
|
|
54
60
|
if (!form || form.status === 'draft')
|
|
55
61
|
return response.notFound('Form not found')
|
|
56
62
|
|
|
@@ -84,7 +90,10 @@ route.post('/api/forms/{uuid}/uploads', async (request: any) => {
|
|
|
84
90
|
route.post('/api/forms/{uuid}/submissions', async (request: any) => {
|
|
85
91
|
const { dispatchSubmissionNotifications, loadFormByUuid, submissionIdentity, submitForm } = await import('@stacksjs/forms')
|
|
86
92
|
|
|
87
|
-
const
|
|
93
|
+
const siteId = await siteIdForRequest(request)
|
|
94
|
+
if (siteId === undefined)
|
|
95
|
+
return response.notFound('Form not found')
|
|
96
|
+
const form = await loadFormByUuid(String(request.params?.uuid ?? request.param?.('uuid') ?? ''), siteId)
|
|
88
97
|
if (!form)
|
|
89
98
|
return response.notFound('Form not found')
|
|
90
99
|
|