@palbase/backend 9.0.1 → 10.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-SO6YV35D.js → chunk-4WOQWFUP.js} +38 -6
- package/dist/chunk-4WOQWFUP.js.map +1 -0
- package/dist/db/env.cjs.map +1 -1
- package/dist/db/env.d.cts +18 -4
- package/dist/db/env.d.ts +18 -4
- package/dist/db/index.cjs +37 -5
- package/dist/db/index.cjs.map +1 -1
- package/dist/db/index.d.cts +2 -2
- package/dist/db/index.d.ts +2 -2
- package/dist/db/index.js +1 -1
- package/dist/{endpoint-CGI5cZMg.d.cts → endpoint-Cn3ICGTf.d.cts} +26 -4
- package/dist/{endpoint-CGI5cZMg.d.ts → endpoint-Cn3ICGTf.d.ts} +26 -4
- package/dist/{index-osv2jMmZ.d.cts → index-Bt7UHkAM.d.cts} +40 -5
- package/dist/{index--dH5i4Nu.d.ts → index-V0ealeY-.d.ts} +40 -5
- package/dist/index.cjs +262 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +279 -14
- package/dist/index.d.ts +279 -14
- package/dist/index.js +220 -3
- package/dist/index.js.map +1 -1
- package/dist/test/index.d.cts +1 -1
- package/dist/test/index.d.ts +1 -1
- package/docs/README.md +12 -10
- package/docs/background.md +4 -4
- package/docs/events.md +4 -4
- package/docs/getting-started.md +6 -5
- package/docs/llms-full.txt +39 -36
- package/docs/migrations.md +10 -10
- package/docs/resources.md +3 -3
- package/package.json +1 -1
- package/dist/chunk-SO6YV35D.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -29,6 +29,7 @@ __export(src_exports, {
|
|
|
29
29
|
Database: () => Database,
|
|
30
30
|
Delete: () => Delete,
|
|
31
31
|
Documents: () => Documents,
|
|
32
|
+
EGRESS_CONFIG_KIND: () => EGRESS_CONFIG_KIND,
|
|
32
33
|
EXTENSION_DEPENDENCIES: () => EXTENSION_DEPENDENCIES,
|
|
33
34
|
FLAGS_CONFIG_KIND: () => FLAGS_CONFIG_KIND,
|
|
34
35
|
Flags: () => Flags,
|
|
@@ -59,6 +60,7 @@ __export(src_exports, {
|
|
|
59
60
|
Resource: () => Resource,
|
|
60
61
|
STORAGE_CONFIG_KIND: () => STORAGE_CONFIG_KIND,
|
|
61
62
|
Storage: () => Storage,
|
|
63
|
+
TEST_USERS_CONFIG_KIND: () => TEST_USERS_CONFIG_KIND,
|
|
62
64
|
TooManyRequests: () => TooManyRequests,
|
|
63
65
|
TraceId: () => TraceId,
|
|
64
66
|
Unauthorized: () => Unauthorized,
|
|
@@ -77,6 +79,7 @@ __export(src_exports, {
|
|
|
77
79
|
boolean: () => boolean,
|
|
78
80
|
bucket: () => bucket,
|
|
79
81
|
buildProvider: () => buildProvider,
|
|
82
|
+
defineEgress: () => defineEgress,
|
|
80
83
|
defineError: () => defineError,
|
|
81
84
|
defineFlags: () => defineFlags,
|
|
82
85
|
defineJob: () => defineJob,
|
|
@@ -84,12 +87,14 @@ __export(src_exports, {
|
|
|
84
87
|
defineNotifications: () => defineNotifications,
|
|
85
88
|
defineSchema: () => defineSchema,
|
|
86
89
|
defineStorage: () => defineStorage,
|
|
90
|
+
defineTestUsers: () => defineTestUsers,
|
|
87
91
|
defineWebhook: () => defineWebhook,
|
|
88
92
|
defineWorker: () => defineWorker,
|
|
89
93
|
documents: () => documents,
|
|
90
94
|
enumType: () => enumType,
|
|
91
95
|
flag: () => flag,
|
|
92
96
|
getErrorRegistry: () => getErrorRegistry,
|
|
97
|
+
getRoutes: () => getRoutes,
|
|
93
98
|
integer: () => integer,
|
|
94
99
|
isPalbaseExtension: () => isPalbaseExtension,
|
|
95
100
|
jsonb: () => jsonb,
|
|
@@ -102,6 +107,7 @@ __export(src_exports, {
|
|
|
102
107
|
recordThrows: () => recordThrows,
|
|
103
108
|
reservedSecretKey: () => reservedSecretKey,
|
|
104
109
|
storage: () => storage,
|
|
110
|
+
testUser: () => testUser,
|
|
105
111
|
text: () => text,
|
|
106
112
|
timestamp: () => timestamp,
|
|
107
113
|
uuid: () => uuid,
|
|
@@ -402,12 +408,44 @@ var ColumnBuilder = class _ColumnBuilder {
|
|
|
402
408
|
* `auth.users` lives in the SAME tenant database (palauth-owned), so this is
|
|
403
409
|
* a genuine cross-schema integrity constraint scoped to THIS tenant's users.
|
|
404
410
|
* The referenced `auth.users.id` is `text` (palauth ids are `usr_<uuid>`), so
|
|
405
|
-
* the referencing column must be `text()` too.
|
|
406
|
-
*
|
|
407
|
-
* `
|
|
411
|
+
* the referencing column must be `text()` too.
|
|
412
|
+
*
|
|
413
|
+
* ON DELETE is REQUIRED here and may only be `cascade` or `set null`: an
|
|
414
|
+
* account-erasure request must never be blocked by a lingering FK, so
|
|
415
|
+
* `restrict` / `no action` are not accepted (they don't type-check). Example:
|
|
416
|
+
* `text().notNull().referencesAuthUser("cascade")`, or
|
|
417
|
+
* `text().nullable().referencesAuthUser("set null")`. The server
|
|
418
|
+
* (validateAuthUserFK) enforces this — and the remaining rules the type can't
|
|
419
|
+
* express (referencing column is text, `set null` needs a nullable column) —
|
|
420
|
+
* as the real boundary; this signature is the compile-time DX mirror.
|
|
421
|
+
*/
|
|
422
|
+
referencesAuthUser(onDelete) {
|
|
423
|
+
this._def.references = { table: "auth.users", column: "id" };
|
|
424
|
+
this._def.onDeleteAction = onDelete;
|
|
425
|
+
return new _ColumnBuilder(this._def.type, this._def);
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Add a real DB-level foreign key to the canonical, server-minted installation
|
|
429
|
+
* anchor (`REFERENCES auth.installations(id)`) — the app-scoped verified-device
|
|
430
|
+
* root (`ins_...`). Sugar for `.references("auth.installations", "id")`.
|
|
431
|
+
*
|
|
432
|
+
* An installation is an APP INSTALL, not a user: this FK is NOT user ownership.
|
|
433
|
+
* A user-owned row STILL needs its own `.referencesAuthUser(...)` FK so account
|
|
434
|
+
* erasure removes it — an installation reference alone does not tie a row to a
|
|
435
|
+
* user's deletion. Use this only for install-scoped state (device prefs, push
|
|
436
|
+
* routing, …), alongside a separate auth-user FK where the row is user-owned.
|
|
437
|
+
*
|
|
438
|
+
* `auth.installations` lives in the SAME tenant DB (palauth-owned); its `id` is
|
|
439
|
+
* `text` (`ins_<uuid>`), so the referencing column must be `text()` too. ON
|
|
440
|
+
* DELETE is REQUIRED and may only be `cascade` or `set null` (same allowed set
|
|
441
|
+
* as an auth-user FK): an installation revoke / orphan cleanup must never be
|
|
442
|
+
* blocked by a lingering FK. The server (validateAuthAnchorFK) is the real
|
|
443
|
+
* boundary; this signature is the compile-time DX mirror.
|
|
408
444
|
*/
|
|
409
|
-
|
|
410
|
-
|
|
445
|
+
referencesInstallation(onDelete) {
|
|
446
|
+
this._def.references = { table: "auth.installations", column: "id" };
|
|
447
|
+
this._def.onDeleteAction = onDelete;
|
|
448
|
+
return new _ColumnBuilder(this._def.type, this._def);
|
|
411
449
|
}
|
|
412
450
|
/** Set the ON DELETE action for a foreign key reference. */
|
|
413
451
|
onDelete(action) {
|
|
@@ -515,7 +553,50 @@ function rowType(def) {
|
|
|
515
553
|
function optionalOnInsert(def) {
|
|
516
554
|
return def.nullable === true || def.defaultRandom === true || def.defaultNow === true || def.defaultValue !== void 0;
|
|
517
555
|
}
|
|
518
|
-
|
|
556
|
+
var AUTH_USERS_TABLE = "auth.users";
|
|
557
|
+
function ownerColumnOf(table) {
|
|
558
|
+
for (const [col, builder] of Object.entries(table.columns)) {
|
|
559
|
+
if (builder._def.references?.table === AUTH_USERS_TABLE) return col;
|
|
560
|
+
}
|
|
561
|
+
return null;
|
|
562
|
+
}
|
|
563
|
+
function buildChildEdges(schema) {
|
|
564
|
+
const edges = /* @__PURE__ */ new Map();
|
|
565
|
+
for (const name of Object.keys(schema.tables)) edges.set(name, []);
|
|
566
|
+
for (const childName of Object.keys(schema.tables)) {
|
|
567
|
+
const table = schema.tables[childName];
|
|
568
|
+
if (table === void 0) continue;
|
|
569
|
+
for (const [col, builder] of Object.entries(table.columns)) {
|
|
570
|
+
const ref = builder._def.references;
|
|
571
|
+
if (ref === void 0) continue;
|
|
572
|
+
if (ref.table === childName) continue;
|
|
573
|
+
const bucket2 = edges.get(ref.table);
|
|
574
|
+
if (bucket2 === void 0) continue;
|
|
575
|
+
if (bucket2.some((e) => e.child === childName)) continue;
|
|
576
|
+
bucket2.push({ child: childName, column: col });
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
return edges;
|
|
580
|
+
}
|
|
581
|
+
function pruneCycles(raw2) {
|
|
582
|
+
const pruned = /* @__PURE__ */ new Map();
|
|
583
|
+
for (const table of raw2.keys()) pruned.set(table, []);
|
|
584
|
+
const state = /* @__PURE__ */ new Map();
|
|
585
|
+
function visit(table) {
|
|
586
|
+
state.set(table, "visiting");
|
|
587
|
+
for (const edge of raw2.get(table) ?? []) {
|
|
588
|
+
if (state.get(edge.child) === "visiting") continue;
|
|
589
|
+
pruned.get(table)?.push(edge);
|
|
590
|
+
if (state.get(edge.child) === void 0) visit(edge.child);
|
|
591
|
+
}
|
|
592
|
+
state.set(table, "done");
|
|
593
|
+
}
|
|
594
|
+
for (const table of raw2.keys()) {
|
|
595
|
+
if (state.get(table) === void 0) visit(table);
|
|
596
|
+
}
|
|
597
|
+
return pruned;
|
|
598
|
+
}
|
|
599
|
+
function tableBlock(table, children, indent) {
|
|
519
600
|
const cols = Object.entries(table.columns);
|
|
520
601
|
const rowLines = cols.map(([col, builder]) => {
|
|
521
602
|
return `${indent} ${col}: ${rowType(builder._def)};`;
|
|
@@ -525,6 +606,8 @@ function tableBlock(table, indent) {
|
|
|
525
606
|
const opt = optionalOnInsert(def) ? "?" : "";
|
|
526
607
|
return `${indent} ${col}${opt}: ${rowType(def)};`;
|
|
527
608
|
});
|
|
609
|
+
const owner = ownerColumnOf(table);
|
|
610
|
+
const childEntries = children.map((e) => `${JSON.stringify(e.child)}: ${JSON.stringify(e.column)}`).join("; ");
|
|
528
611
|
return [
|
|
529
612
|
`${indent}${table.name}: {`,
|
|
530
613
|
`${indent} row: {`,
|
|
@@ -533,12 +616,17 @@ function tableBlock(table, indent) {
|
|
|
533
616
|
`${indent} insert: {`,
|
|
534
617
|
...insertLines,
|
|
535
618
|
`${indent} };`,
|
|
619
|
+
`${indent} owner: ${owner === null ? "null" : JSON.stringify(owner)};`,
|
|
620
|
+
`${indent} children: {${childEntries === "" ? "" : ` ${childEntries} `}};`,
|
|
536
621
|
`${indent}};`
|
|
537
622
|
].join("\n");
|
|
538
623
|
}
|
|
539
624
|
function makeEnvDts(schema) {
|
|
540
625
|
const tableNames = Object.keys(schema.tables);
|
|
541
|
-
const
|
|
626
|
+
const children = pruneCycles(buildChildEdges(schema));
|
|
627
|
+
const blocks = tableNames.map(
|
|
628
|
+
(name) => tableBlock(schema.tables[name], children.get(name) ?? [], " ")
|
|
629
|
+
);
|
|
542
630
|
const body = blocks.length > 0 ? `
|
|
543
631
|
${blocks.join("\n")}
|
|
544
632
|
` : "";
|
|
@@ -633,6 +721,22 @@ function defineStorage(input) {
|
|
|
633
721
|
return { __config: STORAGE_CONFIG_KIND, buckets };
|
|
634
722
|
}
|
|
635
723
|
|
|
724
|
+
// src/config/egress.ts
|
|
725
|
+
var EGRESS_CONFIG_KIND = "egress";
|
|
726
|
+
function defineEgress(input) {
|
|
727
|
+
if (input === null || typeof input !== "object" || !Array.isArray(input.hosts)) {
|
|
728
|
+
throw new Error("defineEgress expects { hosts: string[] }");
|
|
729
|
+
}
|
|
730
|
+
const hosts = [];
|
|
731
|
+
for (const h of input.hosts) {
|
|
732
|
+
if (typeof h !== "string" || h.trim().length === 0) {
|
|
733
|
+
throw new Error("defineEgress: every host must be a non-empty string");
|
|
734
|
+
}
|
|
735
|
+
hosts.push(h.trim().toLowerCase());
|
|
736
|
+
}
|
|
737
|
+
return { __config: EGRESS_CONFIG_KIND, hosts };
|
|
738
|
+
}
|
|
739
|
+
|
|
636
740
|
// src/config/notifications.ts
|
|
637
741
|
var NOTIFICATIONS_CONFIG_KIND = "notifications";
|
|
638
742
|
var RESERVED_SECRET_PREFIX = "PB_NOTIFICATIONS";
|
|
@@ -744,6 +848,124 @@ function camelToUpperSnake(s) {
|
|
|
744
848
|
return s.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toUpperCase();
|
|
745
849
|
}
|
|
746
850
|
|
|
851
|
+
// src/config/test-users.ts
|
|
852
|
+
var TEST_USERS_CONFIG_KIND = "test-users";
|
|
853
|
+
var TEST_USER_NAME_RE = /^[a-zA-Z][a-zA-Z0-9_]*$/;
|
|
854
|
+
var EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
855
|
+
var E164_RE = /^\+[1-9]\d{1,14}$/;
|
|
856
|
+
var OTP_LENGTH = 6;
|
|
857
|
+
var OTP_RE = /^\d{6}$/;
|
|
858
|
+
var MIN_PASSWORD_LENGTH = 8;
|
|
859
|
+
function isPlainObject(value) {
|
|
860
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
861
|
+
}
|
|
862
|
+
function normalizeSeed(seed, userName) {
|
|
863
|
+
if (seed === void 0) return {};
|
|
864
|
+
if (!isPlainObject(seed)) {
|
|
865
|
+
throw new Error(`testUser ${JSON.stringify(userName)}: seed must be { <table>: [ {...} ] }`);
|
|
866
|
+
}
|
|
867
|
+
const out = {};
|
|
868
|
+
for (const [table, rows] of Object.entries(seed)) {
|
|
869
|
+
if (!Array.isArray(rows)) {
|
|
870
|
+
throw new Error(
|
|
871
|
+
`testUser ${JSON.stringify(userName)}: seed.${table} must be an array of rows`
|
|
872
|
+
);
|
|
873
|
+
}
|
|
874
|
+
if (rows.length === 0) {
|
|
875
|
+
throw new Error(
|
|
876
|
+
`testUser ${JSON.stringify(userName)}: seed.${table} is empty \u2014 remove it or add a row`
|
|
877
|
+
);
|
|
878
|
+
}
|
|
879
|
+
for (const row of rows) {
|
|
880
|
+
if (!isPlainObject(row)) {
|
|
881
|
+
throw new Error(
|
|
882
|
+
`testUser ${JSON.stringify(userName)}: every row in seed.${table} must be an object`
|
|
883
|
+
);
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
out[table] = rows;
|
|
887
|
+
}
|
|
888
|
+
return out;
|
|
889
|
+
}
|
|
890
|
+
function testUser(opts = {}) {
|
|
891
|
+
if (!isPlainObject(opts)) {
|
|
892
|
+
throw new Error("testUser() expects { email?, password?, phone?, otp?, seed? }");
|
|
893
|
+
}
|
|
894
|
+
const hasEmail = opts.email !== void 0;
|
|
895
|
+
const hasPassword = opts.password !== void 0;
|
|
896
|
+
if (hasEmail !== hasPassword) {
|
|
897
|
+
throw new Error(
|
|
898
|
+
"testUser() needs email AND password together (a fixture with stable credentials) or neither (a template the server generates credentials for)"
|
|
899
|
+
);
|
|
900
|
+
}
|
|
901
|
+
let email = null;
|
|
902
|
+
let password = null;
|
|
903
|
+
if (hasEmail) {
|
|
904
|
+
if (typeof opts.email !== "string" || !EMAIL_RE.test(opts.email)) {
|
|
905
|
+
throw new Error(`testUser email ${JSON.stringify(opts.email)} is not a valid address`);
|
|
906
|
+
}
|
|
907
|
+
if (typeof opts.password !== "string" || opts.password.length < MIN_PASSWORD_LENGTH) {
|
|
908
|
+
throw new Error(
|
|
909
|
+
`testUser password must be at least ${MIN_PASSWORD_LENGTH} characters (got ${typeof opts.password === "string" ? opts.password.length : 0})`
|
|
910
|
+
);
|
|
911
|
+
}
|
|
912
|
+
email = opts.email;
|
|
913
|
+
password = opts.password;
|
|
914
|
+
}
|
|
915
|
+
const hasPhone = opts.phone !== void 0;
|
|
916
|
+
const hasOTP = opts.otp !== void 0;
|
|
917
|
+
if (hasPhone !== hasOTP) {
|
|
918
|
+
throw new Error(
|
|
919
|
+
"testUser() needs phone AND otp together \u2014 nothing can receive an SMS at a fabricated number, so a phone fixture without its fixed code can never be signed in as"
|
|
920
|
+
);
|
|
921
|
+
}
|
|
922
|
+
let phone = null;
|
|
923
|
+
let otp = null;
|
|
924
|
+
if (hasPhone) {
|
|
925
|
+
if (typeof opts.phone !== "string" || !E164_RE.test(opts.phone)) {
|
|
926
|
+
throw new Error(
|
|
927
|
+
`testUser phone ${JSON.stringify(opts.phone)} must be E.164, e.g. "+905551112233"`
|
|
928
|
+
);
|
|
929
|
+
}
|
|
930
|
+
if (typeof opts.otp !== "string" || !OTP_RE.test(opts.otp)) {
|
|
931
|
+
throw new Error(
|
|
932
|
+
`testUser otp ${JSON.stringify(opts.otp)} must be ${OTP_LENGTH} digits`
|
|
933
|
+
);
|
|
934
|
+
}
|
|
935
|
+
phone = opts.phone;
|
|
936
|
+
otp = opts.otp;
|
|
937
|
+
}
|
|
938
|
+
return { email, password, phone, otp, seed: normalizeSeed(opts.seed, email ?? "<template>") };
|
|
939
|
+
}
|
|
940
|
+
function defineTestUsers(input) {
|
|
941
|
+
if (!isPlainObject(input) || !isPlainObject(input.users)) {
|
|
942
|
+
throw new Error("defineTestUsers expects { users: { <name>: testUser({...}) } }");
|
|
943
|
+
}
|
|
944
|
+
const users = {};
|
|
945
|
+
const emails = /* @__PURE__ */ new Map();
|
|
946
|
+
for (const name of Object.keys(input.users)) {
|
|
947
|
+
if (!TEST_USER_NAME_RE.test(name)) {
|
|
948
|
+
throw new Error(
|
|
949
|
+
`test user name ${JSON.stringify(name)} is invalid \u2014 must start with a letter and contain only letters, digits, and underscores`
|
|
950
|
+
);
|
|
951
|
+
}
|
|
952
|
+
const def = input.users[name];
|
|
953
|
+
if (def === void 0) continue;
|
|
954
|
+
if (def.email !== null) {
|
|
955
|
+
const lower = def.email.toLowerCase();
|
|
956
|
+
const already = emails.get(lower);
|
|
957
|
+
if (already !== void 0) {
|
|
958
|
+
throw new Error(
|
|
959
|
+
`test users ${JSON.stringify(already)} and ${JSON.stringify(name)} declare the same e-mail ${JSON.stringify(def.email)}`
|
|
960
|
+
);
|
|
961
|
+
}
|
|
962
|
+
emails.set(lower, name);
|
|
963
|
+
}
|
|
964
|
+
users[name] = def;
|
|
965
|
+
}
|
|
966
|
+
return { __config: TEST_USERS_CONFIG_KIND, users };
|
|
967
|
+
}
|
|
968
|
+
|
|
747
969
|
// src/config/flags.ts
|
|
748
970
|
var FLAGS_CONFIG_KIND = "flags";
|
|
749
971
|
var FLAG_KEY_RE = /^[a-zA-Z][a-zA-Z0-9_]*$/;
|
|
@@ -916,6 +1138,33 @@ function recordThrows(target, fnName, throws) {
|
|
|
916
1138
|
const throwsBuffer = carrier[THROWS_BUFFER];
|
|
917
1139
|
if (throwsBuffer) throwsBuffer[fnName] = throws;
|
|
918
1140
|
}
|
|
1141
|
+
function getRoutes(ctor) {
|
|
1142
|
+
const carrier = carrierOf(ctor);
|
|
1143
|
+
const routes = carrier[ROUTES] ?? [];
|
|
1144
|
+
const returnBuffer = carrier[RETURN_BUFFER];
|
|
1145
|
+
if (returnBuffer) {
|
|
1146
|
+
for (const route of routes) {
|
|
1147
|
+
const buffered = returnBuffer[route.fnName];
|
|
1148
|
+
if (buffered && route.returnSchema === void 0) {
|
|
1149
|
+
route.returnSchema = buffered;
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
const throwsBuffer = carrier[THROWS_BUFFER];
|
|
1154
|
+
if (throwsBuffer) {
|
|
1155
|
+
for (const route of routes) {
|
|
1156
|
+
const buffered = throwsBuffer[route.fnName];
|
|
1157
|
+
if (buffered && route.throws === void 0) {
|
|
1158
|
+
route.throws = buffered;
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
return routes.map((r) => ({
|
|
1163
|
+
...r,
|
|
1164
|
+
params: r.params.slice(),
|
|
1165
|
+
...r.throws !== void 0 ? { throws: r.throws.slice() } : {}
|
|
1166
|
+
}));
|
|
1167
|
+
}
|
|
919
1168
|
|
|
920
1169
|
// src/decorators/methods.ts
|
|
921
1170
|
function makeMethodDecorator(method) {
|
|
@@ -1524,6 +1773,7 @@ var import_zod2 = require("zod");
|
|
|
1524
1773
|
Database,
|
|
1525
1774
|
Delete,
|
|
1526
1775
|
Documents,
|
|
1776
|
+
EGRESS_CONFIG_KIND,
|
|
1527
1777
|
EXTENSION_DEPENDENCIES,
|
|
1528
1778
|
FLAGS_CONFIG_KIND,
|
|
1529
1779
|
Flags,
|
|
@@ -1554,6 +1804,7 @@ var import_zod2 = require("zod");
|
|
|
1554
1804
|
Resource,
|
|
1555
1805
|
STORAGE_CONFIG_KIND,
|
|
1556
1806
|
Storage,
|
|
1807
|
+
TEST_USERS_CONFIG_KIND,
|
|
1557
1808
|
TooManyRequests,
|
|
1558
1809
|
TraceId,
|
|
1559
1810
|
Unauthorized,
|
|
@@ -1572,6 +1823,7 @@ var import_zod2 = require("zod");
|
|
|
1572
1823
|
boolean,
|
|
1573
1824
|
bucket,
|
|
1574
1825
|
buildProvider,
|
|
1826
|
+
defineEgress,
|
|
1575
1827
|
defineError,
|
|
1576
1828
|
defineFlags,
|
|
1577
1829
|
defineJob,
|
|
@@ -1579,12 +1831,14 @@ var import_zod2 = require("zod");
|
|
|
1579
1831
|
defineNotifications,
|
|
1580
1832
|
defineSchema,
|
|
1581
1833
|
defineStorage,
|
|
1834
|
+
defineTestUsers,
|
|
1582
1835
|
defineWebhook,
|
|
1583
1836
|
defineWorker,
|
|
1584
1837
|
documents,
|
|
1585
1838
|
enumType,
|
|
1586
1839
|
flag,
|
|
1587
1840
|
getErrorRegistry,
|
|
1841
|
+
getRoutes,
|
|
1588
1842
|
integer,
|
|
1589
1843
|
isPalbaseExtension,
|
|
1590
1844
|
jsonb,
|
|
@@ -1597,6 +1851,7 @@ var import_zod2 = require("zod");
|
|
|
1597
1851
|
recordThrows,
|
|
1598
1852
|
reservedSecretKey,
|
|
1599
1853
|
storage,
|
|
1854
|
+
testUser,
|
|
1600
1855
|
text,
|
|
1601
1856
|
timestamp,
|
|
1602
1857
|
uuid,
|