@voyant-travel/db 0.108.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/LICENSE +201 -0
- package/README.md +60 -0
- package/dist/aggregate-snapshots.d.ts +66 -0
- package/dist/aggregate-snapshots.d.ts.map +1 -0
- package/dist/aggregate-snapshots.js +110 -0
- package/dist/aggregate-snapshots.js.map +1 -0
- package/dist/columns/collection.d.ts +37 -0
- package/dist/columns/collection.d.ts.map +1 -0
- package/dist/columns/collection.js +44 -0
- package/dist/columns/collection.js.map +1 -0
- package/dist/columns/cruise.d.ts +26 -0
- package/dist/columns/cruise.d.ts.map +1 -0
- package/dist/columns/cruise.js +31 -0
- package/dist/columns/cruise.js.map +1 -0
- package/dist/columns/departure-sub-tables.d.ts +179 -0
- package/dist/columns/departure-sub-tables.d.ts.map +1 -0
- package/dist/columns/departure-sub-tables.js +214 -0
- package/dist/columns/departure-sub-tables.js.map +1 -0
- package/dist/columns/departure.d.ts +20 -0
- package/dist/columns/departure.d.ts.map +1 -0
- package/dist/columns/departure.js +23 -0
- package/dist/columns/departure.js.map +1 -0
- package/dist/columns/destinations.d.ts +21 -0
- package/dist/columns/destinations.d.ts.map +1 -0
- package/dist/columns/destinations.js +24 -0
- package/dist/columns/destinations.js.map +1 -0
- package/dist/columns/index.d.ts +31 -0
- package/dist/columns/index.d.ts.map +1 -0
- package/dist/columns/index.js +57 -0
- package/dist/columns/index.js.map +1 -0
- package/dist/columns/itinerary-sub-tables.d.ts +177 -0
- package/dist/columns/itinerary-sub-tables.d.ts.map +1 -0
- package/dist/columns/itinerary-sub-tables.js +122 -0
- package/dist/columns/itinerary-sub-tables.js.map +1 -0
- package/dist/columns/itinerary.d.ts +17 -0
- package/dist/columns/itinerary.d.ts.map +1 -0
- package/dist/columns/itinerary.js +20 -0
- package/dist/columns/itinerary.js.map +1 -0
- package/dist/columns/lodging.d.ts +143 -0
- package/dist/columns/lodging.d.ts.map +1 -0
- package/dist/columns/lodging.js +164 -0
- package/dist/columns/lodging.js.map +1 -0
- package/dist/columns/offers.d.ts +31 -0
- package/dist/columns/offers.d.ts.map +1 -0
- package/dist/columns/offers.js +43 -0
- package/dist/columns/offers.js.map +1 -0
- package/dist/columns/pricing.d.ts +60 -0
- package/dist/columns/pricing.d.ts.map +1 -0
- package/dist/columns/pricing.js +71 -0
- package/dist/columns/pricing.js.map +1 -0
- package/dist/columns/product-accommodation.d.ts +99 -0
- package/dist/columns/product-accommodation.d.ts.map +1 -0
- package/dist/columns/product-accommodation.js +65 -0
- package/dist/columns/product-accommodation.js.map +1 -0
- package/dist/columns/product-addons.d.ts +18 -0
- package/dist/columns/product-addons.d.ts.map +1 -0
- package/dist/columns/product-addons.js +21 -0
- package/dist/columns/product-addons.js.map +1 -0
- package/dist/columns/product-availability-states.d.ts +65 -0
- package/dist/columns/product-availability-states.d.ts.map +1 -0
- package/dist/columns/product-availability-states.js +81 -0
- package/dist/columns/product-availability-states.js.map +1 -0
- package/dist/columns/product-availability.d.ts +21 -0
- package/dist/columns/product-availability.d.ts.map +1 -0
- package/dist/columns/product-availability.js +24 -0
- package/dist/columns/product-availability.js.map +1 -0
- package/dist/columns/product-booking-rules.d.ts +45 -0
- package/dist/columns/product-booking-rules.d.ts.map +1 -0
- package/dist/columns/product-booking-rules.js +55 -0
- package/dist/columns/product-booking-rules.js.map +1 -0
- package/dist/columns/product-category-assignments.d.ts +17 -0
- package/dist/columns/product-category-assignments.d.ts.map +1 -0
- package/dist/columns/product-category-assignments.js +20 -0
- package/dist/columns/product-category-assignments.js.map +1 -0
- package/dist/columns/product-extensions.d.ts +24 -0
- package/dist/columns/product-extensions.d.ts.map +1 -0
- package/dist/columns/product-extensions.js +27 -0
- package/dist/columns/product-extensions.js.map +1 -0
- package/dist/columns/product-media.d.ts +19 -0
- package/dist/columns/product-media.d.ts.map +1 -0
- package/dist/columns/product-media.js +22 -0
- package/dist/columns/product-media.js.map +1 -0
- package/dist/columns/product-overrides.d.ts +19 -0
- package/dist/columns/product-overrides.d.ts.map +1 -0
- package/dist/columns/product-overrides.js +22 -0
- package/dist/columns/product-overrides.js.map +1 -0
- package/dist/columns/product-preferences.d.ts +51 -0
- package/dist/columns/product-preferences.d.ts.map +1 -0
- package/dist/columns/product-preferences.js +59 -0
- package/dist/columns/product-preferences.js.map +1 -0
- package/dist/columns/product-publish-settings.d.ts +18 -0
- package/dist/columns/product-publish-settings.d.ts.map +1 -0
- package/dist/columns/product-publish-settings.js +21 -0
- package/dist/columns/product-publish-settings.js.map +1 -0
- package/dist/columns/product-rate-plans.d.ts +28 -0
- package/dist/columns/product-rate-plans.d.ts.map +1 -0
- package/dist/columns/product-rate-plans.js +33 -0
- package/dist/columns/product-rate-plans.js.map +1 -0
- package/dist/columns/product-translations.d.ts +24 -0
- package/dist/columns/product-translations.d.ts.map +1 -0
- package/dist/columns/product-translations.js +27 -0
- package/dist/columns/product-translations.js.map +1 -0
- package/dist/columns/product-versions.d.ts +19 -0
- package/dist/columns/product-versions.d.ts.map +1 -0
- package/dist/columns/product-versions.js +22 -0
- package/dist/columns/product-versions.js.map +1 -0
- package/dist/columns/product-visibility.d.ts +16 -0
- package/dist/columns/product-visibility.d.ts.map +1 -0
- package/dist/columns/product-visibility.js +19 -0
- package/dist/columns/product-visibility.js.map +1 -0
- package/dist/columns/product.d.ts +56 -0
- package/dist/columns/product.d.ts.map +1 -0
- package/dist/columns/product.js +44 -0
- package/dist/columns/product.js.map +1 -0
- package/dist/columns/room.d.ts +117 -0
- package/dist/columns/room.d.ts.map +1 -0
- package/dist/columns/room.js +86 -0
- package/dist/columns/room.js.map +1 -0
- package/dist/columns/ship.d.ts +22 -0
- package/dist/columns/ship.d.ts.map +1 -0
- package/dist/columns/ship.js +25 -0
- package/dist/columns/ship.js.map +1 -0
- package/dist/columns/tags.d.ts +33 -0
- package/dist/columns/tags.d.ts.map +1 -0
- package/dist/columns/tags.js +38 -0
- package/dist/columns/tags.js.map +1 -0
- package/dist/columns/transport.d.ts +53 -0
- package/dist/columns/transport.d.ts.map +1 -0
- package/dist/columns/transport.js +62 -0
- package/dist/columns/transport.js.map +1 -0
- package/dist/connection-config.d.ts +101 -0
- package/dist/connection-config.d.ts.map +1 -0
- package/dist/connection-config.js +106 -0
- package/dist/connection-config.js.map +1 -0
- package/dist/crud.d.ts +87 -0
- package/dist/crud.d.ts.map +1 -0
- package/dist/crud.js +190 -0
- package/dist/crud.js.map +1 -0
- package/dist/helpers.d.ts +33 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +49 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +109 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +155 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/index.d.ts +3 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +5 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/typeid-column.d.ts +75 -0
- package/dist/lib/typeid-column.d.ts.map +1 -0
- package/dist/lib/typeid-column.js +92 -0
- package/dist/lib/typeid-column.js.map +1 -0
- package/dist/lib/typeid-core.d.ts +36 -0
- package/dist/lib/typeid-core.d.ts.map +1 -0
- package/dist/lib/typeid-core.js +67 -0
- package/dist/lib/typeid-core.js.map +1 -0
- package/dist/lib/typeid-prefixes.d.ts +342 -0
- package/dist/lib/typeid-prefixes.d.ts.map +1 -0
- package/dist/lib/typeid-prefixes.js +379 -0
- package/dist/lib/typeid-prefixes.js.map +1 -0
- package/dist/lib/typeid-schemas.d.ts +206 -0
- package/dist/lib/typeid-schemas.d.ts.map +1 -0
- package/dist/lib/typeid-schemas.js +207 -0
- package/dist/lib/typeid-schemas.js.map +1 -0
- package/dist/lib/typeid-zod.d.ts +16 -0
- package/dist/lib/typeid-zod.d.ts.map +1 -0
- package/dist/lib/typeid-zod.js +29 -0
- package/dist/lib/typeid-zod.js.map +1 -0
- package/dist/lib/typeid.d.ts +2 -0
- package/dist/lib/typeid.d.ts.map +1 -0
- package/dist/lib/typeid.js +6 -0
- package/dist/lib/typeid.js.map +1 -0
- package/dist/lifecycle.d.ts +24 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +30 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/links.d.ts +22 -0
- package/dist/links.d.ts.map +1 -0
- package/dist/links.js +281 -0
- package/dist/links.js.map +1 -0
- package/dist/operators.d.ts +9 -0
- package/dist/operators.d.ts.map +1 -0
- package/dist/operators.js +9 -0
- package/dist/operators.js.map +1 -0
- package/dist/outbox.d.ts +87 -0
- package/dist/outbox.d.ts.map +1 -0
- package/dist/outbox.js +245 -0
- package/dist/outbox.js.map +1 -0
- package/dist/primitives/catalog-schemas.d.ts +101 -0
- package/dist/primitives/catalog-schemas.d.ts.map +1 -0
- package/dist/primitives/catalog-schemas.js +69 -0
- package/dist/primitives/catalog-schemas.js.map +1 -0
- package/dist/primitives/catalog.d.ts +47 -0
- package/dist/primitives/catalog.d.ts.map +1 -0
- package/dist/primitives/catalog.js +94 -0
- package/dist/primitives/catalog.js.map +1 -0
- package/dist/primitives/index.d.ts +4 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +4 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/offers.d.ts +224 -0
- package/dist/primitives/offers.d.ts.map +1 -0
- package/dist/primitives/offers.js +132 -0
- package/dist/primitives/offers.js.map +1 -0
- package/dist/queries/index.d.ts +18 -0
- package/dist/queries/index.d.ts.map +1 -0
- package/dist/queries/index.js +30 -0
- package/dist/queries/index.js.map +1 -0
- package/dist/runtime/index.d.ts +4 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +5 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/locks.d.ts +5 -0
- package/dist/runtime/locks.d.ts.map +1 -0
- package/dist/runtime/locks.js +36 -0
- package/dist/runtime/locks.js.map +1 -0
- package/dist/schema/00_ensure_schemas.d.ts +5 -0
- package/dist/schema/00_ensure_schemas.d.ts.map +1 -0
- package/dist/schema/00_ensure_schemas.js +6 -0
- package/dist/schema/00_ensure_schemas.js.map +1 -0
- package/dist/schema/aggregate-snapshots.d.ts +97 -0
- package/dist/schema/aggregate-snapshots.d.ts.map +1 -0
- package/dist/schema/aggregate-snapshots.js +27 -0
- package/dist/schema/aggregate-snapshots.js.map +1 -0
- package/dist/schema/iam/apikey.d.ts +396 -0
- package/dist/schema/iam/apikey.d.ts.map +1 -0
- package/dist/schema/iam/apikey.js +41 -0
- package/dist/schema/iam/apikey.js.map +1 -0
- package/dist/schema/iam/auth.d.ts +1026 -0
- package/dist/schema/iam/auth.d.ts.map +1 -0
- package/dist/schema/iam/auth.js +138 -0
- package/dist/schema/iam/auth.js.map +1 -0
- package/dist/schema/iam/cloud_auth.d.ts +446 -0
- package/dist/schema/iam/cloud_auth.d.ts.map +1 -0
- package/dist/schema/iam/cloud_auth.js +46 -0
- package/dist/schema/iam/cloud_auth.js.map +1 -0
- package/dist/schema/iam/index.d.ts +8 -0
- package/dist/schema/iam/index.d.ts.map +1 -0
- package/dist/schema/iam/index.js +8 -0
- package/dist/schema/iam/index.js.map +1 -0
- package/dist/schema/iam/invitations.d.ts +173 -0
- package/dist/schema/iam/invitations.d.ts.map +1 -0
- package/dist/schema/iam/invitations.js +27 -0
- package/dist/schema/iam/invitations.js.map +1 -0
- package/dist/schema/iam/kms.d.ts +53 -0
- package/dist/schema/iam/kms.d.ts.map +1 -0
- package/dist/schema/iam/kms.js +40 -0
- package/dist/schema/iam/kms.js.map +1 -0
- package/dist/schema/iam/roles.d.ts +12 -0
- package/dist/schema/iam/roles.d.ts.map +1 -0
- package/dist/schema/iam/roles.js +12 -0
- package/dist/schema/iam/roles.js.map +1 -0
- package/dist/schema/iam/user_profiles.d.ts +442 -0
- package/dist/schema/iam/user_profiles.d.ts.map +1 -0
- package/dist/schema/iam/user_profiles.js +125 -0
- package/dist/schema/iam/user_profiles.js.map +1 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +5 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/infra/domains.d.ts +609 -0
- package/dist/schema/infra/domains.d.ts.map +1 -0
- package/dist/schema/infra/domains.js +108 -0
- package/dist/schema/infra/domains.js.map +1 -0
- package/dist/schema/infra/email_domain_records.d.ts +255 -0
- package/dist/schema/infra/email_domain_records.d.ts.map +1 -0
- package/dist/schema/infra/email_domain_records.js +65 -0
- package/dist/schema/infra/email_domain_records.js.map +1 -0
- package/dist/schema/infra/event_outbox.d.ts +232 -0
- package/dist/schema/infra/event_outbox.d.ts.map +1 -0
- package/dist/schema/infra/event_outbox.js +59 -0
- package/dist/schema/infra/event_outbox.js.map +1 -0
- package/dist/schema/infra/idempotency_keys.d.ts +186 -0
- package/dist/schema/infra/idempotency_keys.d.ts.map +1 -0
- package/dist/schema/infra/idempotency_keys.js +40 -0
- package/dist/schema/infra/idempotency_keys.js.map +1 -0
- package/dist/schema/infra/index.d.ts +9 -0
- package/dist/schema/infra/index.d.ts.map +1 -0
- package/dist/schema/infra/index.js +10 -0
- package/dist/schema/infra/index.js.map +1 -0
- package/dist/schema/infra/public_document_delivery_grants.d.ts +356 -0
- package/dist/schema/infra/public_document_delivery_grants.d.ts.map +1 -0
- package/dist/schema/infra/public_document_delivery_grants.js +36 -0
- package/dist/schema/infra/public_document_delivery_grants.js.map +1 -0
- package/dist/schema/infra/rate_limit_buckets.d.ts +138 -0
- package/dist/schema/infra/rate_limit_buckets.d.ts.map +1 -0
- package/dist/schema/infra/rate_limit_buckets.js +52 -0
- package/dist/schema/infra/rate_limit_buckets.js.map +1 -0
- package/dist/schema/infra/webhook_deliveries.d.ts +572 -0
- package/dist/schema/infra/webhook_deliveries.d.ts.map +1 -0
- package/dist/schema/infra/webhook_deliveries.js +136 -0
- package/dist/schema/infra/webhook_deliveries.js.map +1 -0
- package/dist/schema/infra/webhook_subscriptions.d.ts +284 -0
- package/dist/schema/infra/webhook_subscriptions.d.ts.map +1 -0
- package/dist/schema/infra/webhook_subscriptions.js +64 -0
- package/dist/schema/infra/webhook_subscriptions.js.map +1 -0
- package/dist/schema/infra/write_intents.d.ts +185 -0
- package/dist/schema/infra/write_intents.d.ts.map +1 -0
- package/dist/schema/infra/write_intents.js +50 -0
- package/dist/schema/infra/write_intents.js.map +1 -0
- package/dist/schema/voyant/bookings.d.ts +2 -0
- package/dist/schema/voyant/bookings.d.ts.map +1 -0
- package/dist/schema/voyant/bookings.js +2 -0
- package/dist/schema/voyant/bookings.js.map +1 -0
- package/dist/schema/voyant/finance.d.ts +2 -0
- package/dist/schema/voyant/finance.d.ts.map +1 -0
- package/dist/schema/voyant/finance.js +2 -0
- package/dist/schema/voyant/finance.js.map +1 -0
- package/dist/test-utils.d.ts +17 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +56 -0
- package/dist/test-utils.js.map +1 -0
- package/dist/transaction-capability.d.ts +11 -0
- package/dist/transaction-capability.d.ts.map +1 -0
- package/dist/transaction-capability.js +17 -0
- package/dist/transaction-capability.js.map +1 -0
- package/dist/transaction.d.ts +31 -0
- package/dist/transaction.d.ts.map +1 -0
- package/dist/transaction.js +72 -0
- package/dist/transaction.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +2 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +19 -0
- package/dist/utils.js.map +1 -0
- package/dist/write-intents.d.ts +51 -0
- package/dist/write-intents.d.ts.map +1 -0
- package/dist/write-intents.js +95 -0
- package/dist/write-intents.js.map +1 -0
- package/package.json +306 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { neon, Pool } from "@neondatabase/serverless";
|
|
2
|
+
import { drizzle as drizzleNeon } from "drizzle-orm/neon-http";
|
|
3
|
+
import { drizzle as drizzleNeonServerless } from "drizzle-orm/neon-serverless";
|
|
4
|
+
import { withReplicas } from "drizzle-orm/pg-core";
|
|
5
|
+
import { drizzle as drizzlePostgres } from "drizzle-orm/postgres-js";
|
|
6
|
+
import postgres from "postgres";
|
|
7
|
+
import { resolveNodePostgresOptions, resolveServerlessPoolConfig, warnIfDirectNeonEndpoint, } from "./connection-config.js";
|
|
8
|
+
import { VOYANT_DB_DISPOSE, VOYANT_DB_SUPPORTS_TRANSACTIONS } from "./transaction-capability.js";
|
|
9
|
+
function tagTransactionCapability(db, supportsTransactions, dispose) {
|
|
10
|
+
Object.defineProperty(db, VOYANT_DB_SUPPORTS_TRANSACTIONS, {
|
|
11
|
+
value: supportsTransactions,
|
|
12
|
+
enumerable: false,
|
|
13
|
+
configurable: false,
|
|
14
|
+
});
|
|
15
|
+
if (dispose) {
|
|
16
|
+
Object.defineProperty(db, VOYANT_DB_DISPOSE, {
|
|
17
|
+
value: dispose,
|
|
18
|
+
enumerable: false,
|
|
19
|
+
configurable: false,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
return db;
|
|
23
|
+
}
|
|
24
|
+
export function createDbClient(connectionString, options) {
|
|
25
|
+
const { adapter = process.env.DB_ADAPTER || "edge", schema, replicas = [], nodeMaxConnections, timeouts, } = options || {};
|
|
26
|
+
if (adapter === "node") {
|
|
27
|
+
const nodeOptions = resolveNodePostgresOptions({ max: nodeMaxConnections, timeouts });
|
|
28
|
+
const client = postgres(connectionString, nodeOptions);
|
|
29
|
+
const primary = tagTransactionCapability(schema ? drizzlePostgres(client, { schema }) : drizzlePostgres(client), true);
|
|
30
|
+
if (replicas.length === 0) {
|
|
31
|
+
return primary;
|
|
32
|
+
}
|
|
33
|
+
const replicaInstances = replicas.map((replicaUrl) => {
|
|
34
|
+
const replicaClient = postgres(replicaUrl, nodeOptions);
|
|
35
|
+
return schema ? drizzlePostgres(replicaClient, { schema }) : drizzlePostgres(replicaClient);
|
|
36
|
+
});
|
|
37
|
+
const [firstReplica, ...otherReplicas] = replicaInstances;
|
|
38
|
+
if (firstReplica) {
|
|
39
|
+
return tagTransactionCapability(withReplicas(primary, [firstReplica, ...otherReplicas]), true);
|
|
40
|
+
}
|
|
41
|
+
return primary;
|
|
42
|
+
}
|
|
43
|
+
if (adapter === "serverless") {
|
|
44
|
+
if (replicas.length > 0) {
|
|
45
|
+
throw new Error("DB_ADAPTER=serverless does not support read replicas");
|
|
46
|
+
}
|
|
47
|
+
return createServerlessDbClient(connectionString, {
|
|
48
|
+
schema,
|
|
49
|
+
pool: options?.serverlessPool,
|
|
50
|
+
timeouts,
|
|
51
|
+
}).db;
|
|
52
|
+
}
|
|
53
|
+
// edge (neon-http): the Neon HTTP client has no client-side query/statement
|
|
54
|
+
// timeout config — queries rely on the server-side default statement_timeout
|
|
55
|
+
// and the Workers runtime's own request limits. A follow-up handles request
|
|
56
|
+
// deadlines at a different layer; do NOT try to bolt timeouts on here.
|
|
57
|
+
const sql = neon(connectionString);
|
|
58
|
+
const primary = tagTransactionCapability(schema ? drizzleNeon(sql, { schema }) : drizzleNeon(sql), false);
|
|
59
|
+
if (replicas.length === 0) {
|
|
60
|
+
return primary;
|
|
61
|
+
}
|
|
62
|
+
const replicaInstances = replicas.map((replicaUrl) => {
|
|
63
|
+
const replicaSql = neon(replicaUrl);
|
|
64
|
+
return schema ? drizzleNeon(replicaSql, { schema }) : drizzleNeon(replicaSql);
|
|
65
|
+
});
|
|
66
|
+
const [firstReplica, ...otherReplicas] = replicaInstances;
|
|
67
|
+
if (firstReplica) {
|
|
68
|
+
return tagTransactionCapability(withReplicas(primary, [firstReplica, ...otherReplicas]), false);
|
|
69
|
+
}
|
|
70
|
+
return primary;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a per-request Neon WebSocket pool + drizzle client.
|
|
74
|
+
*
|
|
75
|
+
* Timeout defaults (overridable via `timeouts`, or per-field via `pool`):
|
|
76
|
+
* `statement_timeout: 10_000`, `query_timeout: 15_000`,
|
|
77
|
+
* `connectionTimeoutMillis: 10_000`. Both `statement_timeout` (server-side)
|
|
78
|
+
* and `query_timeout` (client-side) are set because transaction-mode poolers
|
|
79
|
+
* (PgBouncer) may ignore `statement_timeout` as a startup parameter — see
|
|
80
|
+
* {@link resolveServerlessPoolConfig}.
|
|
81
|
+
*
|
|
82
|
+
* Warns (once per connection string) when pointed at a Neon direct endpoint
|
|
83
|
+
* instead of the `-pooler` host.
|
|
84
|
+
*/
|
|
85
|
+
export function createServerlessDbClient(connectionString, options) {
|
|
86
|
+
warnIfDirectNeonEndpoint(connectionString);
|
|
87
|
+
const pool = new Pool(resolveServerlessPoolConfig(connectionString, options));
|
|
88
|
+
const dispose = () => pool.end().catch(() => { });
|
|
89
|
+
const db = tagTransactionCapability(options?.schema
|
|
90
|
+
? drizzleNeonServerless(pool, { schema: options.schema })
|
|
91
|
+
: drizzleNeonServerless(pool), true, dispose);
|
|
92
|
+
return {
|
|
93
|
+
db,
|
|
94
|
+
dispose,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Run `fn` with a scoped transaction-capable client (Neon WebSocket
|
|
99
|
+
* Pool), disposing it on settle. For code paths that need
|
|
100
|
+
* `db.transaction(...)` but run outside the request middleware that
|
|
101
|
+
* normally provides the transactional client — event handlers, workflow
|
|
102
|
+
* steps, scheduled jobs, scripts.
|
|
103
|
+
*
|
|
104
|
+
* const result = await withServerlessDb(env.DATABASE_URL, (db) =>
|
|
105
|
+
* db.transaction(async (tx) => { ... }),
|
|
106
|
+
* )
|
|
107
|
+
*/
|
|
108
|
+
export async function withServerlessDb(connectionString, fn, options) {
|
|
109
|
+
const { db, dispose } = createServerlessDbClient(connectionString, options);
|
|
110
|
+
try {
|
|
111
|
+
return await fn(db);
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
await dispose();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Get the main database instance for the configured `DATABASE_URL`.
|
|
119
|
+
* (Single-database deployments; region is chosen per deployment.)
|
|
120
|
+
*/
|
|
121
|
+
export function getDb(adapter) {
|
|
122
|
+
const url = process.env.DATABASE_URL;
|
|
123
|
+
return createDbClient(url, { adapter });
|
|
124
|
+
}
|
|
125
|
+
// Lazy default database instance
|
|
126
|
+
let _defaultDb = null;
|
|
127
|
+
function getDefaultDbInstance() {
|
|
128
|
+
if (!_defaultDb) {
|
|
129
|
+
const defaultAdapter = process.env.DB_ADAPTER || "edge";
|
|
130
|
+
if (defaultAdapter === "serverless") {
|
|
131
|
+
throw new Error("The global @voyant-travel/db proxy cannot use DB_ADAPTER=serverless. Use createServerlessDbClient() per request and dispose it after use.");
|
|
132
|
+
}
|
|
133
|
+
_defaultDb = getDb(defaultAdapter);
|
|
134
|
+
}
|
|
135
|
+
return _defaultDb;
|
|
136
|
+
}
|
|
137
|
+
// Export a default, ready-to-use instance with lazy initialization
|
|
138
|
+
export const db = new Proxy({}, {
|
|
139
|
+
get(target, prop) {
|
|
140
|
+
void target;
|
|
141
|
+
return getDefaultDbInstance()[prop];
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
// Re-export lib utilities
|
|
145
|
+
export * from "./connection-config.js";
|
|
146
|
+
export * from "./helpers.js";
|
|
147
|
+
export * from "./lib/index.js";
|
|
148
|
+
export * from "./lifecycle.js";
|
|
149
|
+
// Re-export queries
|
|
150
|
+
export * from "./queries/index.js";
|
|
151
|
+
export { withOptionalTransaction } from "./transaction.js";
|
|
152
|
+
export * from "./transaction-capability.js";
|
|
153
|
+
export * from "./types.js";
|
|
154
|
+
export * from "./utils.js";
|
|
155
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { anyTypeIdSchema, compareIds, decodeId, getPrefix, getTimestamp, isValidId, newId, newIdFromPrefix, PREFIXES, type PrefixKey, type PrefixValue, typeIdSchema, typeIdSchemaOptional, typeIdSchemas, } from "./typeid.js";
|
|
2
|
+
export { TYPEID_MAX_LENGTH, typeId, typeIdManual, typeIdOptimized, typeIdRef, typeIdRefOptimized, } from "./typeid-column.js";
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,eAAe,EACf,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,SAAS,EACT,KAAK,EACL,eAAe,EACf,QAAQ,EACR,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,YAAY,EACZ,oBAAoB,EACpB,aAAa,GACd,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,eAAe,EACf,SAAS,EACT,kBAAkB,GACnB,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// /packages/db/src/lib/index.ts
|
|
2
|
+
// Re-export all TypeID utilities
|
|
3
|
+
export { anyTypeIdSchema, compareIds, decodeId, getPrefix, getTimestamp, isValidId, newId, newIdFromPrefix, PREFIXES, typeIdSchema, typeIdSchemaOptional, typeIdSchemas, } from "./typeid.js";
|
|
4
|
+
export { TYPEID_MAX_LENGTH, typeId, typeIdManual, typeIdOptimized, typeIdRef, typeIdRefOptimized, } from "./typeid-column.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,iCAAiC;AAEjC,OAAO,EACL,eAAe,EACf,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,SAAS,EACT,KAAK,EACL,eAAe,EACf,QAAQ,EAGR,YAAY,EACZ,oBAAoB,EACpB,aAAa,GACd,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,iBAAiB,EACjB,MAAM,EACN,YAAY,EACZ,eAAe,EACf,SAAS,EACT,kBAAkB,GACnB,MAAM,oBAAoB,CAAA"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { type PrefixKey } from "./typeid.js";
|
|
2
|
+
/**
|
|
3
|
+
* Maximum length of a TypeID string.
|
|
4
|
+
* Format: prefix (2-4 chars) + "_" + suffix (26 chars) = up to 31 chars
|
|
5
|
+
* Using 32 for safety margin.
|
|
6
|
+
*/
|
|
7
|
+
export declare const TYPEID_MAX_LENGTH = 32;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a TypeID primary key column with automatic generation.
|
|
10
|
+
* Use this for root/parent tables where IDs are generated automatically.
|
|
11
|
+
*
|
|
12
|
+
* The column uses `text` type and generates TypeIDs via `$defaultFn`.
|
|
13
|
+
*
|
|
14
|
+
* @param prefix - The entity type key from PREFIXES
|
|
15
|
+
* @param columnName - The database column name (defaults to "id")
|
|
16
|
+
* @returns A Drizzle column definition
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* // In a schema file:
|
|
20
|
+
* export const productsTable = pgTable("products", {
|
|
21
|
+
* id: typeId("products"),
|
|
22
|
+
* name: text("name").notNull(),
|
|
23
|
+
* });
|
|
24
|
+
*/
|
|
25
|
+
export declare function typeId(prefix: PrefixKey, columnName?: string): import("drizzle-orm").HasRuntimeDefault<import("drizzle-orm").HasDefault<import("drizzle-orm").IsPrimaryKey<import("drizzle-orm").NotNull<import("drizzle-orm/pg-core").PgTextBuilderInitial<string, [string, ...string[]]>>>>>;
|
|
26
|
+
/**
|
|
27
|
+
* Creates a TypeID primary key column WITHOUT automatic generation.
|
|
28
|
+
* Use this for child/linked tables where the ID must be provided explicitly
|
|
29
|
+
* to match a parent record (e.g., a 1:1 table whose PK must match the parent PK).
|
|
30
|
+
*
|
|
31
|
+
* @param columnName - The database column name (defaults to "id")
|
|
32
|
+
* @returns A Drizzle column definition without default
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* // For 1:1 relationships where ID must match parent:
|
|
36
|
+
* export const profileTable = pgTable("profiles", {
|
|
37
|
+
* id: typeIdManual(), // Must be passed explicitly
|
|
38
|
+
* firstName: text("first_name"),
|
|
39
|
+
* });
|
|
40
|
+
*/
|
|
41
|
+
export declare function typeIdManual(columnName?: string): import("drizzle-orm").IsPrimaryKey<import("drizzle-orm").NotNull<import("drizzle-orm/pg-core").PgTextBuilderInitial<string, [string, ...string[]]>>>;
|
|
42
|
+
/**
|
|
43
|
+
* Creates a TypeID foreign key column.
|
|
44
|
+
* Use this for columns that reference another table's TypeID.
|
|
45
|
+
*
|
|
46
|
+
* @param columnName - The database column name
|
|
47
|
+
* @returns A Drizzle column definition for foreign keys
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* export const ordersTable = pgTable("orders", {
|
|
51
|
+
* id: typeId("orders"),
|
|
52
|
+
* productId: typeIdRef("product_id").notNull().references(() => productsTable.id),
|
|
53
|
+
* });
|
|
54
|
+
*/
|
|
55
|
+
export declare function typeIdRef(columnName: string): import("drizzle-orm/pg-core").PgTextBuilderInitial<string, [string, ...string[]]>;
|
|
56
|
+
/**
|
|
57
|
+
* Creates an optimized TypeID column using varchar with fixed length.
|
|
58
|
+
* Use this when you want to optimize storage (varchar vs text).
|
|
59
|
+
*
|
|
60
|
+
* Note: Most use cases should prefer `typeId()` with text for simplicity.
|
|
61
|
+
* Only use this for high-volume tables where storage optimization matters.
|
|
62
|
+
*
|
|
63
|
+
* @param prefix - The entity type key from PREFIXES
|
|
64
|
+
* @param columnName - The database column name (defaults to "id")
|
|
65
|
+
* @returns A Drizzle column definition with varchar type
|
|
66
|
+
*/
|
|
67
|
+
export declare function typeIdOptimized(prefix: PrefixKey, columnName?: string): import("drizzle-orm").HasRuntimeDefault<import("drizzle-orm").HasDefault<import("drizzle-orm").IsPrimaryKey<import("drizzle-orm").NotNull<import("drizzle-orm/pg-core").PgVarcharBuilderInitial<string, [string, ...string[]], 32>>>>>;
|
|
68
|
+
/**
|
|
69
|
+
* Creates an optimized TypeID foreign key column using varchar.
|
|
70
|
+
*
|
|
71
|
+
* @param columnName - The database column name
|
|
72
|
+
* @returns A Drizzle column definition for foreign keys with varchar type
|
|
73
|
+
*/
|
|
74
|
+
export declare function typeIdRefOptimized(columnName: string): import("drizzle-orm/pg-core").PgVarcharBuilderInitial<string, [string, ...string[]], 32>;
|
|
75
|
+
//# sourceMappingURL=typeid-column.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeid-column.d.ts","sourceRoot":"","sources":["../../src/lib/typeid-column.ts"],"names":[],"mappings":"AAKA,OAAO,EAAS,KAAK,SAAS,EAAE,MAAM,aAAa,CAAA;AAEnD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,KAAK,CAAA;AAEnC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,SAAO,mOAI1D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,UAAU,SAAO,wJAE7C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,qFAE3C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,SAAO,0OAInE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,4FAEpD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// /packages/db/src/lib/typeid-column.ts
|
|
2
|
+
// Drizzle column helpers for TypeID primary keys and foreign keys
|
|
3
|
+
import { text, varchar } from "drizzle-orm/pg-core";
|
|
4
|
+
import { newId } from "./typeid.js";
|
|
5
|
+
/**
|
|
6
|
+
* Maximum length of a TypeID string.
|
|
7
|
+
* Format: prefix (2-4 chars) + "_" + suffix (26 chars) = up to 31 chars
|
|
8
|
+
* Using 32 for safety margin.
|
|
9
|
+
*/
|
|
10
|
+
export const TYPEID_MAX_LENGTH = 32;
|
|
11
|
+
/**
|
|
12
|
+
* Creates a TypeID primary key column with automatic generation.
|
|
13
|
+
* Use this for root/parent tables where IDs are generated automatically.
|
|
14
|
+
*
|
|
15
|
+
* The column uses `text` type and generates TypeIDs via `$defaultFn`.
|
|
16
|
+
*
|
|
17
|
+
* @param prefix - The entity type key from PREFIXES
|
|
18
|
+
* @param columnName - The database column name (defaults to "id")
|
|
19
|
+
* @returns A Drizzle column definition
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* // In a schema file:
|
|
23
|
+
* export const productsTable = pgTable("products", {
|
|
24
|
+
* id: typeId("products"),
|
|
25
|
+
* name: text("name").notNull(),
|
|
26
|
+
* });
|
|
27
|
+
*/
|
|
28
|
+
export function typeId(prefix, columnName = "id") {
|
|
29
|
+
return text(columnName)
|
|
30
|
+
.primaryKey()
|
|
31
|
+
.$defaultFn(() => newId(prefix));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Creates a TypeID primary key column WITHOUT automatic generation.
|
|
35
|
+
* Use this for child/linked tables where the ID must be provided explicitly
|
|
36
|
+
* to match a parent record (e.g., a 1:1 table whose PK must match the parent PK).
|
|
37
|
+
*
|
|
38
|
+
* @param columnName - The database column name (defaults to "id")
|
|
39
|
+
* @returns A Drizzle column definition without default
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* // For 1:1 relationships where ID must match parent:
|
|
43
|
+
* export const profileTable = pgTable("profiles", {
|
|
44
|
+
* id: typeIdManual(), // Must be passed explicitly
|
|
45
|
+
* firstName: text("first_name"),
|
|
46
|
+
* });
|
|
47
|
+
*/
|
|
48
|
+
export function typeIdManual(columnName = "id") {
|
|
49
|
+
return text(columnName).primaryKey();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Creates a TypeID foreign key column.
|
|
53
|
+
* Use this for columns that reference another table's TypeID.
|
|
54
|
+
*
|
|
55
|
+
* @param columnName - The database column name
|
|
56
|
+
* @returns A Drizzle column definition for foreign keys
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* export const ordersTable = pgTable("orders", {
|
|
60
|
+
* id: typeId("orders"),
|
|
61
|
+
* productId: typeIdRef("product_id").notNull().references(() => productsTable.id),
|
|
62
|
+
* });
|
|
63
|
+
*/
|
|
64
|
+
export function typeIdRef(columnName) {
|
|
65
|
+
return text(columnName);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Creates an optimized TypeID column using varchar with fixed length.
|
|
69
|
+
* Use this when you want to optimize storage (varchar vs text).
|
|
70
|
+
*
|
|
71
|
+
* Note: Most use cases should prefer `typeId()` with text for simplicity.
|
|
72
|
+
* Only use this for high-volume tables where storage optimization matters.
|
|
73
|
+
*
|
|
74
|
+
* @param prefix - The entity type key from PREFIXES
|
|
75
|
+
* @param columnName - The database column name (defaults to "id")
|
|
76
|
+
* @returns A Drizzle column definition with varchar type
|
|
77
|
+
*/
|
|
78
|
+
export function typeIdOptimized(prefix, columnName = "id") {
|
|
79
|
+
return varchar(columnName, { length: TYPEID_MAX_LENGTH })
|
|
80
|
+
.primaryKey()
|
|
81
|
+
.$defaultFn(() => newId(prefix));
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Creates an optimized TypeID foreign key column using varchar.
|
|
85
|
+
*
|
|
86
|
+
* @param columnName - The database column name
|
|
87
|
+
* @returns A Drizzle column definition for foreign keys with varchar type
|
|
88
|
+
*/
|
|
89
|
+
export function typeIdRefOptimized(columnName) {
|
|
90
|
+
return varchar(columnName, { length: TYPEID_MAX_LENGTH });
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=typeid-column.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeid-column.js","sourceRoot":"","sources":["../../src/lib/typeid-column.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,kEAAkE;AAElE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAEnD,OAAO,EAAE,KAAK,EAAkB,MAAM,aAAa,CAAA;AAEnD;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAA;AAEnC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,MAAM,CAAC,MAAiB,EAAE,UAAU,GAAG,IAAI;IACzD,OAAO,IAAI,CAAC,UAAU,CAAC;SACpB,UAAU,EAAE;SACZ,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;AACpC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,UAAU,GAAG,IAAI;IAC5C,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,CAAA;AACtC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,SAAS,CAAC,UAAkB;IAC1C,OAAO,IAAI,CAAC,UAAU,CAAC,CAAA;AACzB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,UAAU,GAAG,IAAI;IAClE,OAAO,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;SACtD,UAAU,EAAE;SACZ,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;AACpC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,OAAO,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAA;AAC3D,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { TypeID } from "typeid-js";
|
|
2
|
+
import { type PrefixKey, type PrefixValue } from "./typeid-prefixes.js";
|
|
3
|
+
/**
|
|
4
|
+
* Register a custom TypeID prefix for extension tables.
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerPrefix(tableName: string, prefix: string): void;
|
|
7
|
+
/**
|
|
8
|
+
* Generates a new TypeID with the correct prefix.
|
|
9
|
+
*/
|
|
10
|
+
export declare function newId(prefix: PrefixKey): string;
|
|
11
|
+
/**
|
|
12
|
+
* Generates a new TypeID using a raw prefix string.
|
|
13
|
+
*/
|
|
14
|
+
export declare function newIdFromPrefix(prefix: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Decodes a TypeID string to extract its components.
|
|
17
|
+
*/
|
|
18
|
+
export declare function decodeId<T extends string>(id: string, expectedPrefix: T): TypeID<T>;
|
|
19
|
+
export declare function decodeId(id: string): TypeID<string>;
|
|
20
|
+
/**
|
|
21
|
+
* Validates that a string is a valid TypeID with the expected prefix.
|
|
22
|
+
*/
|
|
23
|
+
export declare function isValidId(id: string, expectedPrefix: PrefixKey | PrefixValue): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Extracts the prefix from a TypeID string.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getPrefix(id: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* Extracts the timestamp from a TypeID.
|
|
30
|
+
*/
|
|
31
|
+
export declare function getTimestamp(id: string): Date;
|
|
32
|
+
/**
|
|
33
|
+
* Compares two TypeIDs chronologically.
|
|
34
|
+
*/
|
|
35
|
+
export declare function compareIds(a: string, b: string): number;
|
|
36
|
+
//# sourceMappingURL=typeid-core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeid-core.d.ts","sourceRoot":"","sources":["../../src/lib/typeid-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,WAAW,CAAA;AAE1C,OAAO,EAAY,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEjF;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAUtE;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAE/C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;AACpF,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;AAYpD;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAStF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAI7C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { TypeID, typeid } from "typeid-js";
|
|
2
|
+
import { PREFIXES } from "./typeid-prefixes.js";
|
|
3
|
+
/**
|
|
4
|
+
* Register a custom TypeID prefix for extension tables.
|
|
5
|
+
*/
|
|
6
|
+
export function registerPrefix(tableName, prefix) {
|
|
7
|
+
if (PREFIXES[tableName]) {
|
|
8
|
+
throw new Error(`Prefix already registered for table "${tableName}"`);
|
|
9
|
+
}
|
|
10
|
+
if (Object.values(PREFIXES).includes(prefix)) {
|
|
11
|
+
throw new Error(`Prefix "${prefix}" is already in use`);
|
|
12
|
+
}
|
|
13
|
+
;
|
|
14
|
+
PREFIXES[tableName] = prefix;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Generates a new TypeID with the correct prefix.
|
|
18
|
+
*/
|
|
19
|
+
export function newId(prefix) {
|
|
20
|
+
return typeid(PREFIXES[prefix]).toString();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Generates a new TypeID using a raw prefix string.
|
|
24
|
+
*/
|
|
25
|
+
export function newIdFromPrefix(prefix) {
|
|
26
|
+
return typeid(prefix).toString();
|
|
27
|
+
}
|
|
28
|
+
export function decodeId(id, expectedPrefix) {
|
|
29
|
+
if (expectedPrefix) {
|
|
30
|
+
return TypeID.fromString(id, expectedPrefix);
|
|
31
|
+
}
|
|
32
|
+
return TypeID.fromString(id);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Validates that a string is a valid TypeID with the expected prefix.
|
|
36
|
+
*/
|
|
37
|
+
export function isValidId(id, expectedPrefix) {
|
|
38
|
+
try {
|
|
39
|
+
const decoded = decodeId(id);
|
|
40
|
+
const prefix = expectedPrefix in PREFIXES ? PREFIXES[expectedPrefix] : expectedPrefix;
|
|
41
|
+
return decoded.getType() === prefix;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Extracts the prefix from a TypeID string.
|
|
49
|
+
*/
|
|
50
|
+
export function getPrefix(id) {
|
|
51
|
+
return decodeId(id).getType();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Extracts the timestamp from a TypeID.
|
|
55
|
+
*/
|
|
56
|
+
export function getTimestamp(id) {
|
|
57
|
+
const uuid = decodeId(id).toUUID();
|
|
58
|
+
const hex = uuid.replace(/-/g, "").slice(0, 12);
|
|
59
|
+
return new Date(parseInt(hex, 16));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Compares two TypeIDs chronologically.
|
|
63
|
+
*/
|
|
64
|
+
export function compareIds(a, b) {
|
|
65
|
+
return a.localeCompare(b);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=typeid-core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeid-core.js","sourceRoot":"","sources":["../../src/lib/typeid-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAE1C,OAAO,EAAE,QAAQ,EAAoC,MAAM,sBAAsB,CAAA;AAEjF;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,MAAc;IAC9D,IAAK,QAAmC,CAAC,SAAS,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,wCAAwC,SAAS,GAAG,CAAC,CAAA;IACvE,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAqB,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,qBAAqB,CAAC,CAAA;IACzD,CAAC;IAED,CAAC;IAAC,QAAmC,CAAC,SAAS,CAAC,GAAG,MAAM,CAAA;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CAAC,MAAiB;IACrC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;AAClC,CAAC;AAOD,MAAM,UAAU,QAAQ,CACtB,EAAU,EACV,cAAkB;IAElB,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;IAC9C,CAAC;IAED,OAAO,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,EAAU,EAAE,cAAuC;IAC3E,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;QAC5B,MAAM,MAAM,GACV,cAAc,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,cAA2B,CAAC,CAAC,CAAC,CAAC,cAAc,CAAA;QACrF,OAAO,OAAO,CAAC,OAAO,EAAE,KAAK,MAAM,CAAA;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,EAAU;IAClC,OAAO,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAA;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,EAAU;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC/C,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,CAAS,EAAE,CAAS;IAC7C,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAA;AAC3B,CAAC"}
|