@rebasepro/server 0.24.0 → 0.24.1-canary.g56af4a4
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/dist/GCSStorageController-DivE9bAx.js +402 -0
- package/dist/GCSStorageController-DivE9bAx.js.map +1 -0
- package/dist/S3StorageController-D_vKs4kP.js +480 -0
- package/dist/S3StorageController-D_vKs4kP.js.map +1 -0
- package/dist/api/rest/api-generator.d.ts +53 -1
- package/dist/api/rest/auth-collection-writes.d.ts +28 -21
- package/dist/api/rest/field-access-query.d.ts +28 -8
- package/dist/api/rest/field-ops.d.ts +19 -7
- package/dist/api/rest/query-body.d.ts +10 -0
- package/dist/api/rest/write-validation.d.ts +7 -5
- package/dist/api/schema-editor-routes.d.ts +10 -1
- package/dist/api/sql-export-routes.d.ts +8 -0
- package/dist/api/types.d.ts +11 -0
- package/dist/{ast-schema-editor-CWqS_sLJ.js → ast-schema-editor-CSdL0iCk.js} +2 -2
- package/dist/{ast-schema-editor-CWqS_sLJ.js.map → ast-schema-editor-CSdL0iCk.js.map} +1 -1
- package/dist/auth/access.d.ts +16 -0
- package/dist/auth/admin-user-ops.d.ts +24 -2
- package/dist/auth/admin-users-route.d.ts +1 -0
- package/dist/auth/expired-token-sweep.d.ts +5 -1
- package/dist/auth/interfaces.d.ts +10 -0
- package/dist/auth/jwt-crypto.d.ts +7 -0
- package/dist/auth/jwt-keys.d.ts +4 -0
- package/dist/auth/jwt.d.ts +6 -1
- package/dist/auth/rate-limiter.d.ts +13 -1
- package/dist/auth/registration-policy.d.ts +17 -0
- package/dist/auth/user-picking.d.ts +35 -0
- package/dist/{auth-DMLngxn_.js → auth-OPq_FeMs.js} +972 -85
- package/dist/auth-OPq_FeMs.js.map +1 -0
- package/dist/auth_adapter-CIItCTc8.js +21 -0
- package/dist/auth_adapter-CIItCTc8.js.map +1 -0
- package/dist/backend-DTAOsLQc.js.map +1 -1
- package/dist/backup/backup-common.d.ts +14 -3
- package/dist/backup/backup-routes.d.ts +23 -2
- package/dist/backup/backup-storage.d.ts +3 -1
- package/dist/backup/index.d.ts +3 -1
- package/dist/{backup-CN0s50D2.js → backup-5d7XhLX3.js} +170 -33
- package/dist/backup-5d7XhLX3.js.map +1 -0
- package/dist/boot/driver.d.ts +3 -0
- package/dist/boot/env.d.ts +7 -0
- package/dist/boot/http-server.d.ts +22 -0
- package/dist/boot/options.d.ts +16 -1
- package/dist/boot/runtime-cors.d.ts +17 -0
- package/dist/boot/static-routing.d.ts +9 -0
- package/dist/{contract-routes-fz8i4pxs.js → contract-routes-02lASyJI.js} +3 -19
- package/dist/contract-routes-02lASyJI.js.map +1 -0
- package/dist/cron/cron-routes.d.ts +1 -1
- package/dist/cron/cron-scheduler.d.ts +69 -3
- package/dist/cron/cron-store.d.ts +27 -4
- package/dist/cron/define-cron.d.ts +6 -2
- package/dist/cron/index.d.ts +1 -1
- package/dist/{cron-loader-CwaANlOG.js → cron-loader-D7OmleAb.js} +8 -4
- package/dist/cron-loader-D7OmleAb.js.map +1 -0
- package/dist/{cron-routes-Bc-SB0Se.js → cron-routes-CBfiaqEL.js} +27 -4
- package/dist/cron-routes-CBfiaqEL.js.map +1 -0
- package/dist/{cron-scheduler-CYQgco86.js → cron-scheduler-C2vbETMo.js} +298 -32
- package/dist/cron-scheduler-C2vbETMo.js.map +1 -0
- package/dist/cron-store-B2Ih0gCN.js +540 -0
- package/dist/cron-store-B2Ih0gCN.js.map +1 -0
- package/dist/email/smtp-email-service.d.ts +23 -0
- package/dist/email/types.d.ts +18 -0
- package/dist/env.d.ts +0 -37
- package/dist/filter-dialect-REl-TjZr.js +1628 -0
- package/dist/filter-dialect-REl-TjZr.js.map +1 -0
- package/dist/{function-loader-D7o5Epjj.js → function-loader-BDKKiBmy.js} +4 -3
- package/dist/function-loader-BDKKiBmy.js.map +1 -0
- package/dist/{function-routes-CaNG4waN.js → function-routes-DWB7BBsi.js} +2 -2
- package/dist/function-routes-DWB7BBsi.js.map +1 -0
- package/dist/functions/context.d.ts +9 -0
- package/dist/functions/define-function.d.ts +7 -4
- package/dist/functions/index.d.ts +1 -1
- package/dist/functions/index.js +25 -2
- package/dist/functions/index.js.map +1 -1
- package/dist/functions/request-timeout.d.ts +7 -5
- package/dist/history/history-routes.d.ts +9 -0
- package/dist/history/retention-sweep.d.ts +81 -0
- package/dist/{history-recorder-Nr8zLvoU.js → history-recorder-DHenr3lm.js} +2 -2
- package/dist/{history-recorder-Nr8zLvoU.js.map → history-recorder-DHenr3lm.js.map} +1 -1
- package/dist/{history-store-rcAm_xFR.js → history-store-DPofGVDp.js} +2 -2
- package/dist/{history-store-rcAm_xFR.js.map → history-store-DPofGVDp.js.map} +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.es.js +22671 -19191
- package/dist/index.es.js.map +1 -1
- package/dist/init/shutdown.d.ts +12 -2
- package/dist/init.d.ts +16 -6
- package/dist/internal-tables-L2t39RdT.js +136 -0
- package/dist/internal-tables-L2t39RdT.js.map +1 -0
- package/dist/jobs/job-queue.d.ts +8 -0
- package/dist/jobs/job-store.d.ts +24 -0
- package/dist/jobs/types.d.ts +25 -4
- package/dist/{jobs-DqYNfquG.js → jobs-BpD4Q0qR.js} +232 -22
- package/dist/jobs-BpD4Q0qR.js.map +1 -0
- package/dist/{jwt-R6bSPMjk.js → jwt-Bqcu7cGt.js} +171 -65
- package/dist/jwt-Bqcu7cGt.js.map +1 -0
- package/dist/load-failure-UvzZgGXT.js +48 -0
- package/dist/load-failure-UvzZgGXT.js.map +1 -0
- package/dist/mcp/mcp-tools.d.ts +8 -0
- package/dist/metrics/index.d.ts +18 -0
- package/dist/metrics/pool-wait.d.ts +50 -0
- package/dist/offline-8Ks3yp9n-CadBKm2D.js +3305 -0
- package/dist/offline-8Ks3yp9n-CadBKm2D.js.map +1 -0
- package/dist/offline-store-D9ytNNaa-BCr2vsFB.js +1903 -0
- package/dist/offline-store-D9ytNNaa-BCr2vsFB.js.map +1 -0
- package/dist/{openapi-generator-DAq_XVDu.js → openapi-generator-BqoUh4Ij.js} +365 -81
- package/dist/openapi-generator-BqoUh4Ij.js.map +1 -0
- package/dist/policy-PdzX-Opd.js +121 -0
- package/dist/policy-PdzX-Opd.js.map +1 -0
- package/dist/project_manifest-R6y_KHms.js +59 -0
- package/dist/project_manifest-R6y_KHms.js.map +1 -0
- package/dist/{query-parser-BgiKJKvc.js → query-parser-DK9eMkb9.js} +510 -15
- package/dist/query-parser-DK9eMkb9.js.map +1 -0
- package/dist/{request-timeout-DgH7j8qO.js → request-timeout-Dnl2_OBc.js} +15 -8
- package/dist/request-timeout-Dnl2_OBc.js.map +1 -0
- package/dist/resumable-upload-threshold-CKv-Ry0l.js +24 -0
- package/dist/resumable-upload-threshold-CKv-Ry0l.js.map +1 -0
- package/dist/schema-edit/apply-schema-change.d.ts +10 -0
- package/dist/schema-edit/local-source.d.ts +29 -0
- package/dist/schema-edit/remote-source.d.ts +13 -3
- package/dist/schema-edit/source-editor.d.ts +28 -0
- package/dist/{schema-editor-routes-oIyuWl3L.js → schema-editor-routes-BFf3i8jm.js} +53 -9
- package/dist/schema-editor-routes-BFf3i8jm.js.map +1 -0
- package/dist/services/outbound-post.d.ts +50 -0
- package/dist/services/outbound-url-guard.d.ts +34 -5
- package/dist/services/routed-realtime-service.d.ts +5 -0
- package/dist/services/webhook-service.d.ts +66 -14
- package/dist/soft-delete-params-47yBGs3_.js +668 -0
- package/dist/soft-delete-params-47yBGs3_.js.map +1 -0
- package/dist/sql-export-routes-BNNuGGLP.js +240 -0
- package/dist/sql-export-routes-BNNuGGLP.js.map +1 -0
- package/dist/src-CatHFUym.js.map +1 -1
- package/dist/storage/GCSStorageController.d.ts +46 -2
- package/dist/storage/LocalStorageController.d.ts +67 -2
- package/dist/storage/S3StorageController.d.ts +37 -3
- package/dist/storage/image-transform.d.ts +5 -0
- package/dist/storage/maintenance-routes.d.ts +23 -0
- package/dist/storage/maintenance.d.ts +126 -0
- package/dist/storage/rendition-cache.d.ts +9 -11
- package/dist/storage/request-principals.d.ts +30 -0
- package/dist/storage/routes.d.ts +20 -0
- package/dist/storage/source-variables.d.ts +10 -0
- package/dist/storage/streams.d.ts +42 -0
- package/dist/storage/tus-handler.d.ts +46 -2
- package/dist/storage/types.d.ts +82 -7
- package/dist/storage/upload-validation.d.ts +13 -0
- package/dist/storage-resumable-VO-cMpse-C_YX71pO.js +125 -0
- package/dist/storage-resumable-VO-cMpse-C_YX71pO.js.map +1 -0
- package/dist/strings.es-BeZWAodn.js +256 -0
- package/dist/strings.es-BeZWAodn.js.map +1 -0
- package/dist/upload-validation-Dd-fnsbA.js +172 -0
- package/dist/upload-validation-Dd-fnsbA.js.map +1 -0
- package/dist/utils/byte-size.d.ts +10 -0
- package/dist/utils/compression.d.ts +6 -0
- package/dist/utils/load-failure.d.ts +14 -0
- package/package.json +5 -5
- package/dist/GCSStorageController-BSiP1c-f.js +0 -256
- package/dist/GCSStorageController-BSiP1c-f.js.map +0 -1
- package/dist/S3StorageController-CAwFRgjV.js +0 -276
- package/dist/S3StorageController-CAwFRgjV.js.map +0 -1
- package/dist/auth-DMLngxn_.js.map +0 -1
- package/dist/backup-CN0s50D2.js.map +0 -1
- package/dist/contract-routes-fz8i4pxs.js.map +0 -1
- package/dist/cron-loader-CwaANlOG.js.map +0 -1
- package/dist/cron-routes-Bc-SB0Se.js.map +0 -1
- package/dist/cron-scheduler-CYQgco86.js.map +0 -1
- package/dist/cron-store-D2Q9-Aco.js +0 -300
- package/dist/cron-store-D2Q9-Aco.js.map +0 -1
- package/dist/dynamic-import-X40pTZUQ.js +0 -23
- package/dist/dynamic-import-X40pTZUQ.js.map +0 -1
- package/dist/function-loader-D7o5Epjj.js.map +0 -1
- package/dist/function-routes-CaNG4waN.js.map +0 -1
- package/dist/jobs-DqYNfquG.js.map +0 -1
- package/dist/jwt-R6bSPMjk.js.map +0 -1
- package/dist/openapi-generator-DAq_XVDu.js.map +0 -1
- package/dist/query-parser-BgiKJKvc.js.map +0 -1
- package/dist/request-timeout-DgH7j8qO.js.map +0 -1
- package/dist/schema-editor-routes-oIyuWl3L.js.map +0 -1
- package/dist/soft-delete-params-BWPilMPF.js +0 -59
- package/dist/soft-delete-params-BWPilMPF.js.map +0 -1
- package/dist/src-I3aG1PcY.js +0 -6870
- package/dist/src-I3aG1PcY.js.map +0 -1
- package/dist/types-BfKcm9do.js +0 -39
- package/dist/types-BfKcm9do.js.map +0 -1
|
@@ -1,19 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A write to the auth collection is user administration.
|
|
3
|
-
*
|
|
4
|
-
* The auth collection's rows are the users. `/admin/users` holds a change to
|
|
5
|
-
* one to the auth adapter's rules: a create goes through the adapter's user
|
|
6
|
-
* creation (the password hashed, the email normalized, the collection's
|
|
7
|
-
* `onCreateUser`, the invitation), an update may not leave the project without
|
|
8
|
-
* an administrator and stores an email the way sign-in looks it up, and a
|
|
9
|
-
* deletion runs `beforeUserDelete` (a veto), ends the sessions and runs
|
|
10
|
-
* `afterUserDelete`. The data doors that write the same rows — the REST routes
|
|
11
|
-
* and MCP's write tools — call these, so that no door writes a user by rules
|
|
12
|
-
* of its own. (The Postgres socket calls the adapter's methods directly.)
|
|
13
|
-
*
|
|
14
|
-
* Every function here leaves any other collection, and an adapter without the
|
|
15
|
-
* step, exactly as it was: the rows are then written as any table's.
|
|
16
|
-
*/
|
|
17
1
|
import type { AuthAdapter, CollectionConfig, UserCreationFinalizeResult, UserCreationPrepareResult } from "@rebasepro/types";
|
|
18
2
|
import type { FieldViewer } from "@rebasepro/common";
|
|
19
3
|
/** Whether `collection` is the auth collection — its rows are the users. */
|
|
@@ -26,6 +10,21 @@ export type UserCreatingAdapter = AuthAdapter & Required<Pick<AuthAdapter, "prep
|
|
|
26
10
|
* the door writes the row as any other.
|
|
27
11
|
*/
|
|
28
12
|
export declare function createsUsers(adapter: AuthAdapter | undefined, collection: CollectionConfig): adapter is UserCreatingAdapter;
|
|
13
|
+
/**
|
|
14
|
+
* Refuse an upsert on the auth collection.
|
|
15
|
+
*
|
|
16
|
+
* An upsert is a create or an update, decided inside the write by whether the
|
|
17
|
+
* row is already there, and on the auth collection the two follow different
|
|
18
|
+
* rules: a create sets the password and sends the invitation
|
|
19
|
+
* ({@link createUserThroughAuthCollection}), an update may not demote the last
|
|
20
|
+
* administrator and normalizes the email ({@link prepareAuthCollectionUpdates}).
|
|
21
|
+
* Neither can be applied before the branch is known, so an upsert took
|
|
22
|
+
* neither — `{ id: <the last admin>, roles: ["viewer"] }` demoted them.
|
|
23
|
+
*
|
|
24
|
+
* Only where the adapter administers users; with no such step there is no
|
|
25
|
+
* rule for an upsert to miss. `where` prefixes the message (`Operation 3`).
|
|
26
|
+
*/
|
|
27
|
+
export declare function assertNoUserUpsert(adapter: AuthAdapter | undefined, collection: CollectionConfig, where?: string): void;
|
|
29
28
|
/**
|
|
30
29
|
* Check a create body for the auth collection against what the adapter says a
|
|
31
30
|
* create consumes (`describeUserCreationContract`).
|
|
@@ -43,8 +42,16 @@ export declare function assertUserCreationBodyValid(adapter: AuthAdapter | undef
|
|
|
43
42
|
* through the adapter's `prepareUserCreation` (the password hashed or
|
|
44
43
|
* generated, the email normalized, the collection's `onCreateUser`), in order.
|
|
45
44
|
* The `values` of each result are what the door writes.
|
|
45
|
+
*
|
|
46
|
+
* `caller` is who the door is writing for: an administrator may waive the
|
|
47
|
+
* password policy for an import (`skipPasswordPolicy: true`), anyone else may
|
|
48
|
+
* not.
|
|
49
|
+
*
|
|
50
|
+
* `nameRows` is set by a bulk door: a refusal of one body (a `WEAK_PASSWORD`,
|
|
51
|
+
* a hook's 4xx) is then prefixed `Row <index>: `, as the bulk's other row
|
|
52
|
+
* errors are, so an import can say which line of its file failed.
|
|
46
53
|
*/
|
|
47
|
-
export declare function prepareUserCreations(adapter: UserCreatingAdapter, collection: CollectionConfig, bodies: readonly Record<string, unknown>[]): Promise<UserCreationPrepareResult[]>;
|
|
54
|
+
export declare function prepareUserCreations(adapter: UserCreatingAdapter, collection: CollectionConfig, bodies: readonly Record<string, unknown>[], caller: FieldViewer, nameRows?: boolean): Promise<UserCreationPrepareResult[]>;
|
|
48
55
|
/**
|
|
49
56
|
* The second half, once the rows are written — and only then, so a write that
|
|
50
57
|
* fails invites nobody: the credentials' delivery through
|
|
@@ -55,14 +62,14 @@ export declare function prepareUserCreations(adapter: UserCreatingAdapter, colle
|
|
|
55
62
|
*/
|
|
56
63
|
export declare function completeUserCreations(adapter: UserCreatingAdapter, prepared: readonly UserCreationPrepareResult[], rows: readonly Record<string, unknown>[]): Promise<UserCreationFinalizeResult[]>;
|
|
57
64
|
/**
|
|
58
|
-
* Create one user through the auth collection
|
|
59
|
-
* then `save` (the door's own driver write),
|
|
60
|
-
* {@link completeUserCreations}.
|
|
65
|
+
* Create one user through the auth collection, for `caller`:
|
|
66
|
+
* {@link prepareUserCreations}, then `save` (the door's own driver write),
|
|
67
|
+
* then {@link completeUserCreations}.
|
|
61
68
|
*
|
|
62
69
|
* `undefined` when the create is not a user creation ({@link createsUsers}) —
|
|
63
70
|
* the door then writes the row as any other.
|
|
64
71
|
*/
|
|
65
|
-
export declare function createUserThroughAuthCollection(adapter: AuthAdapter | undefined, collection: CollectionConfig, body: Record<string, unknown>, save: (values: Record<string, unknown>) => Promise<Record<string, unknown>>): Promise<{
|
|
72
|
+
export declare function createUserThroughAuthCollection(adapter: AuthAdapter | undefined, collection: CollectionConfig, body: Record<string, unknown>, caller: FieldViewer, save: (values: Record<string, unknown>) => Promise<Record<string, unknown>>): Promise<{
|
|
66
73
|
row: Record<string, unknown>;
|
|
67
74
|
delivery: UserCreationFinalizeResult;
|
|
68
75
|
} | undefined>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CollectionConfig, IncludeSpec } from "@rebasepro/types";
|
|
2
|
-
import type
|
|
2
|
+
import { type LogicalCondition } from "@rebasepro/types";
|
|
3
3
|
import { type FieldViewer } from "@rebasepro/common";
|
|
4
4
|
/**
|
|
5
5
|
* A read may not name a field the caller cannot read.
|
|
@@ -10,13 +10,22 @@ import { type FieldViewer } from "@rebasepro/common";
|
|
|
10
10
|
* `?orderBy=salary` returns them in order of it. A column no response can carry
|
|
11
11
|
* has to be a column no query can interrogate, or the read rule is decoration.
|
|
12
12
|
*
|
|
13
|
-
* The refusal names
|
|
14
|
-
* published OpenAPI lists every property of every collection,
|
|
15
|
-
* a given caller cannot read, because the document is one
|
|
16
|
-
* off the app rather than off the authenticated data
|
|
17
|
-
* here would protect nothing and would answer a
|
|
18
|
-
* "unknown field", sending them to look for a
|
|
19
|
-
* there.
|
|
13
|
+
* The refusal names a field restricted by role. That is deliberate and it is
|
|
14
|
+
* not a leak: the published OpenAPI lists every property of every collection,
|
|
15
|
+
* including the ones a given caller cannot read, because the document is one
|
|
16
|
+
* document and is served off the app rather than off the authenticated data
|
|
17
|
+
* router. Hiding the name here would protect nothing and would answer a
|
|
18
|
+
* caller's genuine typo with "unknown field", sending them to look for a
|
|
19
|
+
* spelling mistake that is not there. Those field *names* are public; their
|
|
20
|
+
* *values* are not.
|
|
21
|
+
*
|
|
22
|
+
* An `excludeFromApi` field is the exception, because its name is *not*
|
|
23
|
+
* public: OpenAPI, `list_collections` and the generated SDK all leave it out.
|
|
24
|
+
* "`email` is not readable on `authors`" would confirm the one thing those hide,
|
|
25
|
+
* so a filter, sort, projection, include, aggregate or vector search naming one
|
|
26
|
+
* is answered as one naming a field that does not exist — built by the functions the driver answers a
|
|
27
|
+
* typo with (`@rebasepro/common`'s `unknown-field`), so the two answers are the
|
|
28
|
+
* same bytes. See {@link assertNoHiddenNames}.
|
|
20
29
|
*
|
|
21
30
|
* @module
|
|
22
31
|
*/
|
|
@@ -67,4 +76,15 @@ export declare function assertQueryFieldsReadable(options: {
|
|
|
67
76
|
property: string;
|
|
68
77
|
};
|
|
69
78
|
}, collection: CollectionConfig, viewer: FieldViewer | undefined): void;
|
|
79
|
+
/**
|
|
80
|
+
* The aggregate route's `select` and `groupBy`, which it parses itself: an
|
|
81
|
+
* `excludeFromApi` name there is answered exactly as the driver answers a
|
|
82
|
+
* column that does not exist. Walked in the driver's order — each aggregate's
|
|
83
|
+
* field, then each group key — and the first hidden *or* unknown name gets the
|
|
84
|
+
* answer, so a typo before a hidden name is still the one named.
|
|
85
|
+
*/
|
|
86
|
+
export declare function assertNoHiddenAggregateNames(aggregates: readonly {
|
|
87
|
+
fn: string;
|
|
88
|
+
field?: string;
|
|
89
|
+
}[], groupBy: readonly string[], collection: CollectionConfig): void;
|
|
70
90
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CollectionConfig, FieldOperation, FIELD_OPERATORS, isFieldOperation } from "@rebasepro/types";
|
|
1
|
+
import { CollectionConfig, FieldOperation, FIELD_OPERATORS, isFieldOperation, Properties, Property } from "@rebasepro/types";
|
|
2
2
|
/**
|
|
3
3
|
* Writes expressed as a change to the column's current value.
|
|
4
4
|
*
|
|
@@ -38,23 +38,32 @@ export interface ParsedFieldOp {
|
|
|
38
38
|
* this package.
|
|
39
39
|
*/
|
|
40
40
|
export declare const looksLikeFieldOp: typeof isFieldOperation;
|
|
41
|
-
/**
|
|
42
|
-
|
|
41
|
+
/**
|
|
42
|
+
* True when any value in the payload is (or is attempting to be) an operation.
|
|
43
|
+
* With `properties`, a `map` value is one only when it is `{ <operator>: … }`;
|
|
44
|
+
* see `isFieldOperation`.
|
|
45
|
+
*/
|
|
46
|
+
export declare function hasFieldOps(values: Record<string, unknown> | undefined, properties?: Properties): boolean;
|
|
43
47
|
/**
|
|
44
48
|
* Parse one value as an operation, or report why it is not a legal one.
|
|
45
49
|
*
|
|
46
50
|
* Returns `undefined` for an ordinary value. Throws for a value that reads as
|
|
47
|
-
* an operation and is malformed, so a typo cannot be written as data.
|
|
51
|
+
* an operation and is malformed, so a typo cannot be written as data. Given
|
|
52
|
+
* the field's `property`, a `map` value with `$` keys is data unless it is a
|
|
53
|
+
* single real operator.
|
|
48
54
|
*/
|
|
49
|
-
export declare function parseFieldOp(key: string, value: unknown): ParsedFieldOp | undefined;
|
|
55
|
+
export declare function parseFieldOp(key: string, value: unknown, property?: Property): ParsedFieldOp | undefined;
|
|
50
56
|
/**
|
|
51
57
|
* Split a write payload into ordinary values and field operations.
|
|
52
58
|
*
|
|
53
59
|
* The two travel together in one body — `{ title: "x", views: { $inc: 1 } }` is
|
|
54
60
|
* a single `PATCH` — and are applied in one statement, so a caller never has to
|
|
55
61
|
* choose between setting a column and incrementing another.
|
|
62
|
+
*
|
|
63
|
+
* Pass the collection's `properties`: without them a `map` value carrying `$`
|
|
64
|
+
* keys reads as a (malformed) operation rather than as the document it is.
|
|
56
65
|
*/
|
|
57
|
-
export declare function splitFieldOps(values: Record<string, unknown
|
|
66
|
+
export declare function splitFieldOps(values: Record<string, unknown>, properties?: Properties): {
|
|
58
67
|
values: Record<string, unknown>;
|
|
59
68
|
fieldOps: Record<string, ParsedFieldOp>;
|
|
60
69
|
};
|
|
@@ -79,8 +88,11 @@ export declare function assertFieldOpsValid(values: Record<string, unknown>, col
|
|
|
79
88
|
* are meaningless on an insert — `views + 1` over a row that does not exist yet
|
|
80
89
|
* is just `1`, and accepting it would make `$inc` mean two different things
|
|
81
90
|
* depending on a race the caller cannot observe.
|
|
91
|
+
*
|
|
92
|
+
* `collection` decides how a `map` value is read (see {@link splitFieldOps});
|
|
93
|
+
* every request boundary has it and passes it.
|
|
82
94
|
*/
|
|
83
|
-
export declare function assertNoFieldOpsOnCreate(values: Record<string, unknown>, context: string): void;
|
|
95
|
+
export declare function assertNoFieldOpsOnCreate(values: Record<string, unknown>, context: string, collection?: CollectionConfig): void;
|
|
84
96
|
/** Re-exported so callers type against one definition of the wire shape. */
|
|
85
97
|
export type { FieldOperation };
|
|
86
98
|
export { FIELD_OPERATORS };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The body of a `POST /<collection>/query`, as the dictionary the `GET`
|
|
3
|
+
* listing reads off its URL.
|
|
4
|
+
*
|
|
5
|
+
* @param body the parsed JSON body — already known to be an object
|
|
6
|
+
* @param urlParams the names of any parameters on the request's own URL, which
|
|
7
|
+
* are refused: two places to put one parameter is two answers to "which one
|
|
8
|
+
* applied", and the listing would silently answer one of them
|
|
9
|
+
*/
|
|
10
|
+
export declare function queryDictFromBody(body: Record<string, unknown>, urlParams?: readonly string[]): Record<string, string[]>;
|
|
@@ -91,11 +91,13 @@ export interface WriteViolation {
|
|
|
91
91
|
* from that spec believed the server was checking. Enum membership, `email` and
|
|
92
92
|
* `url` were published the same way and enforced the same amount.
|
|
93
93
|
*
|
|
94
|
-
* `required` is checked only when `options.status` says this
|
|
95
|
-
* row. A `PATCH` legitimately omits keys — this function sees
|
|
96
|
-
* values, not the row they land on — so demanding them there
|
|
97
|
-
* partial update. Callers that do not pass a status get the
|
|
98
|
-
* leave
|
|
94
|
+
* A missing `required` key is checked only when `options.status` says this
|
|
95
|
+
* write creates a row. A `PATCH` legitimately omits keys — this function sees
|
|
96
|
+
* one request's values, not the row they land on — so demanding them there
|
|
97
|
+
* would refuse every partial update. Callers that do not pass a status get the
|
|
98
|
+
* old behaviour and leave a missing key to the database's NOT NULL. A required
|
|
99
|
+
* string sent as `""` is refused on every write, whatever the status: NOT NULL
|
|
100
|
+
* would store it.
|
|
99
101
|
*
|
|
100
102
|
* A value of the wrong *type* is not this function's business — that reaches
|
|
101
103
|
* Postgres, which types every column and gives a 400 through the driver's
|
|
@@ -1,3 +1,12 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
|
+
import { SchemaSourceEditor } from "../schema-edit/source-editor.js";
|
|
2
3
|
import { HonoEnv } from "./types.js";
|
|
3
|
-
|
|
4
|
+
/**
|
|
5
|
+
* The editor for `collectionsDir`: one per process, shared by these routes
|
|
6
|
+
* and live schema editing's `/apply`. See {@link SchemaSourceEditor}.
|
|
7
|
+
*
|
|
8
|
+
* Here rather than beside the class because building it loads `ts-morph`, an
|
|
9
|
+
* optional peer dependency this module is imported to probe for.
|
|
10
|
+
*/
|
|
11
|
+
export declare function createSchemaSourceEditor(collectionsDir: string): SchemaSourceEditor;
|
|
12
|
+
export declare function createSchemaEditorRoutes(source: SchemaSourceEditor): Hono<HonoEnv>;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Hono } from "hono";
|
|
2
|
+
import { type DatabaseAdmin } from "@rebasepro/types";
|
|
3
|
+
import type { HonoEnv } from "./types.js";
|
|
4
|
+
export interface SqlExportRoutesOptions {
|
|
5
|
+
/** The default data source's admin capabilities, read per request. */
|
|
6
|
+
getAdmin: () => DatabaseAdmin | undefined;
|
|
7
|
+
}
|
|
8
|
+
export declare function createSqlExportRoutes(options: SqlExportRoutesOptions): Hono<HonoEnv>;
|
package/dist/api/types.d.ts
CHANGED
|
@@ -51,6 +51,12 @@ export type HonoEnv = {
|
|
|
51
51
|
};
|
|
52
52
|
/** Unique request correlation ID (generated or propagated from X-Request-ID header). */
|
|
53
53
|
requestId?: string;
|
|
54
|
+
/**
|
|
55
|
+
* Aborted when a custom function's request outlasts its timeout and is
|
|
56
|
+
* answered 504. Read it with `getSignal(c)` from
|
|
57
|
+
* `@rebasepro/server/functions`. See `functions/request-timeout.ts`.
|
|
58
|
+
*/
|
|
59
|
+
functionSignal?: AbortSignal;
|
|
54
60
|
/**
|
|
55
61
|
* The collection this request is about, when it is about one.
|
|
56
62
|
*
|
|
@@ -157,4 +163,9 @@ export interface QueryOptions {
|
|
|
157
163
|
* the point of the feature.
|
|
158
164
|
*/
|
|
159
165
|
withDeleted?: boolean | "only";
|
|
166
|
+
/**
|
|
167
|
+
* From `?count=exact|none` — whether a listing counts `meta.total`. See
|
|
168
|
+
* `FindParams.count`. Unset is `"exact"`.
|
|
169
|
+
*/
|
|
170
|
+
count?: "exact" | "none";
|
|
160
171
|
}
|
|
@@ -858,6 +858,6 @@ var AstSchemaEditor = class AstSchemaEditor {
|
|
|
858
858
|
}
|
|
859
859
|
};
|
|
860
860
|
//#endregion
|
|
861
|
-
export { AstSchemaEditor };
|
|
861
|
+
export { AstSchemaEditor, nestAdminKeys, nestAdminKeysDeep };
|
|
862
862
|
|
|
863
|
-
//# sourceMappingURL=ast-schema-editor-
|
|
863
|
+
//# sourceMappingURL=ast-schema-editor-CSdL0iCk.js.map
|