JSPM

@zingage/postgres-multi-tenant-ids

3.0.1
    • ESM via JSPM
    • ES Module Entrypoint
    • Export Map
    • Keywords
    • License
    • Repository URL
    • TypeScript Types
    • README
    • Created
    • Published
    • Downloads 442
    • Score
      100M100P100Q104748F

    PostgreSQL IDs for secure multi-tenant applications

    Package Exports

    • @zingage/postgres-multi-tenant-ids
    • @zingage/postgres-multi-tenant-ids/fast-check.js
    • @zingage/postgres-multi-tenant-ids/zod.js

    Readme

    Example Usage

    // src/my-app/ids.ts
    
    import {
      initialize,
      type Satisfies,
      type Duplicates,
      type TypesFromConfig,
      type ScopedId as _ScopedId,
      type UnscopedId as _UnscopedId,
      type Id as _Id,
    } from "@zingage/postgres-multi-tenant-ids";
    
    // Configure your entity types!
    const config = {
      tenantScoped: {
        ACCOUNT: {
          insertRate: "VERY_LOW",
          entityTypeHint: "0000000001",
        },
        HOLDING: {
          insertRate: "VERY_LOW",
          entityTypeHint: "0000000010",
        },
      },
      crossTenant: {
        ASSET: {
          insertRate: "VERY_LOW",
          entityTypeHint: "0000000010",
        },
        ASSET_CLASS: {
          insertRate: "VERY_LOW",
          entityTypeHint: "0000000001",
        },
      },
    } as const;
    
    // Validate that your config has no duplicate entity type hints
    type _ValidateConfig = Satisfies<Duplicates<typeof config>, never>;
    
    // Generate exports specific to your config
    export const {
      makeTenantId,
      uuidV4ToTenantId,
      isTenantId,
      stringIsTenantId,
      getTenantShortIdFromFullId,
    
      makeScopedId,
      isScopedId,
      stringIsScopedId,
      scopedIdsBelongToSameTenant,
    
      makeUnscopedId,
      isUnscopedId,
      stringIsUnscopedId,
    } = initialize(config);
    
    // Generate and export some types based on your specific config.
    export type TenantScopedEntityType = keyof (typeof config)["tenantScoped"];
    export type CrossTenantEntityType = keyof (typeof config)["crossTenant"];
    export type NonTenantEntityType =
      | TenantScopedEntityType
      | CrossTenantEntityType;
    
    export type Id<T extends NonTenantEntityType> = _Id<typeof config, T>;
    export type ScopedId<T extends TenantScopedEntityType> = _ScopedId<
      (typeof config)["tenantScoped"],
      T
    >;
    export type UnscopedId<T extends CrossTenantEntityType> = _UnscopedId<
      (typeof config)["crossTenant"],
      T
    >;
    
    //
    
    // Optional: make zod schemas helpers
    import { makeZodSchemas } from "@zingage/postgres-multi-tenant-ids/zod.js";
    export const { tenantIdSchema, unscopedIdSchemaOfType, scopedIdSchemaOfType } =
      makeZodSchemas(config);
    
    //
    
    // Optional: make fast-check arbitraries for generating valid ids in tests
    import { makeFastCheckArbitraries } from "@zingage/postgres-multi-tenant-ids/fast-check.js";
    export const {
      TenantScopedEntityTypeArbitrary,
      CrossTenantEntityTypeArbitrary,
      IdDateArbitrary,
      TenantIdArbitrary,
      TenantScopedIdArbitrary,
      CrossTenantIdArbitrary,
    } = makeFastCheckArbitraries(config);

    Running PostgreSQL Locally for Integration Tests

    You can run a local PostgreSQL 17 server using Docker Compose for integration testing:

    # Start the PostgreSQL container
    docker compose up -d --wait

    This will start a PostgreSQL 17 server accessible at localhost:9000 with:

    • user: postgres
    • password: postgres
    • database: pg_ids_test

    The database will be automatically initialized with the required functions and extensions from install.sql.

    To stop the server:

    docker compose down

    To stop the server and remove all data:

    docker compose down -v