@rebasepro/server-postgresql 0.0.1-canary.4d4fb3e
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 +6 -0
- package/README.md +106 -0
- package/build-errors.txt +37 -0
- package/dist/common/src/collections/CollectionRegistry.d.ts +48 -0
- package/dist/common/src/collections/index.d.ts +1 -0
- package/dist/common/src/data/buildRebaseData.d.ts +14 -0
- package/dist/common/src/index.d.ts +3 -0
- package/dist/common/src/util/builders.d.ts +57 -0
- package/dist/common/src/util/callbacks.d.ts +6 -0
- package/dist/common/src/util/collections.d.ts +11 -0
- package/dist/common/src/util/common.d.ts +2 -0
- package/dist/common/src/util/conditions.d.ts +26 -0
- package/dist/common/src/util/entities.d.ts +36 -0
- package/dist/common/src/util/enums.d.ts +3 -0
- package/dist/common/src/util/index.d.ts +16 -0
- package/dist/common/src/util/navigation_from_path.d.ts +34 -0
- package/dist/common/src/util/navigation_utils.d.ts +20 -0
- package/dist/common/src/util/parent_references_from_path.d.ts +6 -0
- package/dist/common/src/util/paths.d.ts +14 -0
- package/dist/common/src/util/permissions.d.ts +5 -0
- package/dist/common/src/util/references.d.ts +2 -0
- package/dist/common/src/util/relations.d.ts +12 -0
- package/dist/common/src/util/resolutions.d.ts +72 -0
- package/dist/common/src/util/storage.d.ts +24 -0
- package/dist/index.es.js +10635 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +10643 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/server-postgresql/src/PostgresBackendDriver.d.ts +112 -0
- package/dist/server-postgresql/src/PostgresBootstrapper.d.ts +40 -0
- package/dist/server-postgresql/src/auth/ensure-tables.d.ts +6 -0
- package/dist/server-postgresql/src/auth/services.d.ts +188 -0
- package/dist/server-postgresql/src/cli.d.ts +1 -0
- package/dist/server-postgresql/src/collections/PostgresCollectionRegistry.d.ts +43 -0
- package/dist/server-postgresql/src/connection.d.ts +7 -0
- package/dist/server-postgresql/src/data-transformer.d.ts +36 -0
- package/dist/server-postgresql/src/databasePoolManager.d.ts +20 -0
- package/dist/server-postgresql/src/history/HistoryService.d.ts +71 -0
- package/dist/server-postgresql/src/history/ensure-history-table.d.ts +7 -0
- package/dist/server-postgresql/src/index.d.ts +13 -0
- package/dist/server-postgresql/src/interfaces.d.ts +18 -0
- package/dist/server-postgresql/src/schema/auth-schema.d.ts +767 -0
- package/dist/server-postgresql/src/schema/generate-drizzle-schema-logic.d.ts +2 -0
- package/dist/server-postgresql/src/schema/generate-drizzle-schema.d.ts +1 -0
- package/dist/server-postgresql/src/services/BranchService.d.ts +47 -0
- package/dist/server-postgresql/src/services/EntityFetchService.d.ts +195 -0
- package/dist/server-postgresql/src/services/EntityPersistService.d.ts +41 -0
- package/dist/server-postgresql/src/services/RelationService.d.ts +92 -0
- package/dist/server-postgresql/src/services/entity-helpers.d.ts +24 -0
- package/dist/server-postgresql/src/services/entityService.d.ts +102 -0
- package/dist/server-postgresql/src/services/index.d.ts +4 -0
- package/dist/server-postgresql/src/services/realtimeService.d.ts +186 -0
- package/dist/server-postgresql/src/utils/drizzle-conditions.d.ts +116 -0
- package/dist/server-postgresql/src/websocket.d.ts +5 -0
- package/dist/types/src/controllers/analytics_controller.d.ts +7 -0
- package/dist/types/src/controllers/auth.d.ts +117 -0
- package/dist/types/src/controllers/client.d.ts +58 -0
- package/dist/types/src/controllers/collection_registry.d.ts +44 -0
- package/dist/types/src/controllers/customization_controller.d.ts +54 -0
- package/dist/types/src/controllers/data.d.ts +141 -0
- package/dist/types/src/controllers/data_driver.d.ts +168 -0
- package/dist/types/src/controllers/database_admin.d.ts +11 -0
- package/dist/types/src/controllers/dialogs_controller.d.ts +36 -0
- package/dist/types/src/controllers/effective_role.d.ts +4 -0
- package/dist/types/src/controllers/index.d.ts +17 -0
- package/dist/types/src/controllers/local_config_persistence.d.ts +20 -0
- package/dist/types/src/controllers/navigation.d.ts +213 -0
- package/dist/types/src/controllers/registry.d.ts +51 -0
- package/dist/types/src/controllers/side_dialogs_controller.d.ts +67 -0
- package/dist/types/src/controllers/side_entity_controller.d.ts +89 -0
- package/dist/types/src/controllers/snackbar.d.ts +24 -0
- package/dist/types/src/controllers/storage.d.ts +173 -0
- package/dist/types/src/index.d.ts +4 -0
- package/dist/types/src/rebase_context.d.ts +101 -0
- package/dist/types/src/types/backend.d.ts +533 -0
- package/dist/types/src/types/builders.d.ts +14 -0
- package/dist/types/src/types/chips.d.ts +5 -0
- package/dist/types/src/types/collections.d.ts +812 -0
- package/dist/types/src/types/data_source.d.ts +64 -0
- package/dist/types/src/types/entities.d.ts +145 -0
- package/dist/types/src/types/entity_actions.d.ts +98 -0
- package/dist/types/src/types/entity_callbacks.d.ts +173 -0
- package/dist/types/src/types/entity_link_builder.d.ts +7 -0
- package/dist/types/src/types/entity_overrides.d.ts +9 -0
- package/dist/types/src/types/entity_views.d.ts +61 -0
- package/dist/types/src/types/export_import.d.ts +21 -0
- package/dist/types/src/types/index.d.ts +22 -0
- package/dist/types/src/types/locales.d.ts +4 -0
- package/dist/types/src/types/modify_collections.d.ts +5 -0
- package/dist/types/src/types/plugins.d.ts +225 -0
- package/dist/types/src/types/properties.d.ts +1091 -0
- package/dist/types/src/types/property_config.d.ts +70 -0
- package/dist/types/src/types/relations.d.ts +336 -0
- package/dist/types/src/types/slots.d.ts +228 -0
- package/dist/types/src/types/translations.d.ts +826 -0
- package/dist/types/src/types/user_management_delegate.d.ts +120 -0
- package/dist/types/src/types/websockets.d.ts +78 -0
- package/dist/types/src/users/index.d.ts +2 -0
- package/dist/types/src/users/roles.d.ts +22 -0
- package/dist/types/src/users/user.d.ts +46 -0
- package/jest-all.log +3128 -0
- package/jest.log +49 -0
- package/package.json +93 -0
- package/src/PostgresBackendDriver.ts +1024 -0
- package/src/PostgresBootstrapper.ts +232 -0
- package/src/auth/ensure-tables.ts +309 -0
- package/src/auth/services.ts +740 -0
- package/src/cli.ts +347 -0
- package/src/collections/PostgresCollectionRegistry.ts +96 -0
- package/src/connection.ts +62 -0
- package/src/data-transformer.ts +569 -0
- package/src/databasePoolManager.ts +84 -0
- package/src/history/HistoryService.ts +257 -0
- package/src/history/ensure-history-table.ts +45 -0
- package/src/index.ts +13 -0
- package/src/interfaces.ts +60 -0
- package/src/schema/auth-schema.ts +146 -0
- package/src/schema/generate-drizzle-schema-logic.ts +618 -0
- package/src/schema/generate-drizzle-schema.ts +151 -0
- package/src/services/BranchService.ts +237 -0
- package/src/services/EntityFetchService.ts +1447 -0
- package/src/services/EntityPersistService.ts +351 -0
- package/src/services/RelationService.ts +1012 -0
- package/src/services/entity-helpers.ts +121 -0
- package/src/services/entityService.ts +209 -0
- package/src/services/index.ts +13 -0
- package/src/services/realtimeService.ts +1005 -0
- package/src/utils/drizzle-conditions.ts +999 -0
- package/src/websocket.ts +487 -0
- package/test/auth-services.test.ts +569 -0
- package/test/branchService.test.ts +357 -0
- package/test/drizzle-conditions.test.ts +895 -0
- package/test/entityService.errors.test.ts +352 -0
- package/test/entityService.relations.test.ts +912 -0
- package/test/entityService.subcollection-search.test.ts +516 -0
- package/test/entityService.test.ts +977 -0
- package/test/generate-drizzle-schema.test.ts +795 -0
- package/test/historyService.test.ts +126 -0
- package/test/postgresDataDriver.test.ts +556 -0
- package/test/realtimeService.test.ts +276 -0
- package/test/relations.test.ts +662 -0
- package/test_drizzle_mock.js +3 -0
- package/test_find_changed.mjs +30 -0
- package/test_output.txt +3145 -0
- package/tsconfig.json +49 -0
- package/tsconfig.prod.json +20 -0
- package/vite.config.ts +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/connection.ts","../../types/src/types/collections.ts","../../utils/src/strings.ts","../../../node_modules/object-hash/dist/object_hash.js","../../utils/src/objects.ts","../../utils/src/names.ts","../../common/src/util/enums.ts","../../common/src/util/resolutions.ts","../../common/src/util/callbacks.ts","../../common/src/util/relations.ts","../../../node_modules/json-logic-js/logic.js","../../../node_modules/fast-equals/dist/esm/index.mjs","../../../node_modules/lodash/_listCacheClear.js","../../../node_modules/lodash/eq.js","../../../node_modules/lodash/_assocIndexOf.js","../../../node_modules/lodash/_listCacheDelete.js","../../../node_modules/lodash/_listCacheGet.js","../../../node_modules/lodash/_listCacheHas.js","../../../node_modules/lodash/_listCacheSet.js","../../../node_modules/lodash/_ListCache.js","../../../node_modules/lodash/_stackClear.js","../../../node_modules/lodash/_stackDelete.js","../../../node_modules/lodash/_stackGet.js","../../../node_modules/lodash/_stackHas.js","../../../node_modules/lodash/_freeGlobal.js","../../../node_modules/lodash/_root.js","../../../node_modules/lodash/_Symbol.js","../../../node_modules/lodash/_getRawTag.js","../../../node_modules/lodash/_objectToString.js","../../../node_modules/lodash/_baseGetTag.js","../../../node_modules/lodash/isObject.js","../../../node_modules/lodash/isFunction.js","../../../node_modules/lodash/_coreJsData.js","../../../node_modules/lodash/_isMasked.js","../../../node_modules/lodash/_toSource.js","../../../node_modules/lodash/_baseIsNative.js","../../../node_modules/lodash/_getValue.js","../../../node_modules/lodash/_getNative.js","../../../node_modules/lodash/_Map.js","../../../node_modules/lodash/_nativeCreate.js","../../../node_modules/lodash/_hashClear.js","../../../node_modules/lodash/_hashDelete.js","../../../node_modules/lodash/_hashGet.js","../../../node_modules/lodash/_hashHas.js","../../../node_modules/lodash/_hashSet.js","../../../node_modules/lodash/_Hash.js","../../../node_modules/lodash/_mapCacheClear.js","../../../node_modules/lodash/_isKeyable.js","../../../node_modules/lodash/_getMapData.js","../../../node_modules/lodash/_mapCacheDelete.js","../../../node_modules/lodash/_mapCacheGet.js","../../../node_modules/lodash/_mapCacheHas.js","../../../node_modules/lodash/_mapCacheSet.js","../../../node_modules/lodash/_MapCache.js","../../../node_modules/lodash/_stackSet.js","../../../node_modules/lodash/_Stack.js","../../../node_modules/lodash/_arrayEach.js","../../../node_modules/lodash/_defineProperty.js","../../../node_modules/lodash/_baseAssignValue.js","../../../node_modules/lodash/_assignValue.js","../../../node_modules/lodash/_copyObject.js","../../../node_modules/lodash/_baseTimes.js","../../../node_modules/lodash/isObjectLike.js","../../../node_modules/lodash/_baseIsArguments.js","../../../node_modules/lodash/isArguments.js","../../../node_modules/lodash/isArray.js","../../../node_modules/lodash/stubFalse.js","../../../node_modules/lodash/isBuffer.js","../../../node_modules/lodash/_isIndex.js","../../../node_modules/lodash/isLength.js","../../../node_modules/lodash/_baseIsTypedArray.js","../../../node_modules/lodash/_baseUnary.js","../../../node_modules/lodash/_nodeUtil.js","../../../node_modules/lodash/isTypedArray.js","../../../node_modules/lodash/_arrayLikeKeys.js","../../../node_modules/lodash/_isPrototype.js","../../../node_modules/lodash/_overArg.js","../../../node_modules/lodash/_nativeKeys.js","../../../node_modules/lodash/_baseKeys.js","../../../node_modules/lodash/isArrayLike.js","../../../node_modules/lodash/keys.js","../../../node_modules/lodash/_baseAssign.js","../../../node_modules/lodash/_nativeKeysIn.js","../../../node_modules/lodash/_baseKeysIn.js","../../../node_modules/lodash/keysIn.js","../../../node_modules/lodash/_baseAssignIn.js","../../../node_modules/lodash/_cloneBuffer.js","../../../node_modules/lodash/_copyArray.js","../../../node_modules/lodash/_arrayFilter.js","../../../node_modules/lodash/stubArray.js","../../../node_modules/lodash/_getSymbols.js","../../../node_modules/lodash/_copySymbols.js","../../../node_modules/lodash/_arrayPush.js","../../../node_modules/lodash/_getPrototype.js","../../../node_modules/lodash/_getSymbolsIn.js","../../../node_modules/lodash/_copySymbolsIn.js","../../../node_modules/lodash/_baseGetAllKeys.js","../../../node_modules/lodash/_getAllKeys.js","../../../node_modules/lodash/_getAllKeysIn.js","../../../node_modules/lodash/_DataView.js","../../../node_modules/lodash/_Promise.js","../../../node_modules/lodash/_Set.js","../../../node_modules/lodash/_WeakMap.js","../../../node_modules/lodash/_getTag.js","../../../node_modules/lodash/_initCloneArray.js","../../../node_modules/lodash/_Uint8Array.js","../../../node_modules/lodash/_cloneArrayBuffer.js","../../../node_modules/lodash/_cloneDataView.js","../../../node_modules/lodash/_cloneRegExp.js","../../../node_modules/lodash/_cloneSymbol.js","../../../node_modules/lodash/_cloneTypedArray.js","../../../node_modules/lodash/_initCloneByTag.js","../../../node_modules/lodash/_baseCreate.js","../../../node_modules/lodash/_initCloneObject.js","../../../node_modules/lodash/_baseIsMap.js","../../../node_modules/lodash/isMap.js","../../../node_modules/lodash/_baseIsSet.js","../../../node_modules/lodash/isSet.js","../../../node_modules/lodash/_baseClone.js","../../../node_modules/lodash/cloneDeep.js","../../common/src/collections/CollectionRegistry.ts","../../common/src/data/buildRebaseData.ts","../src/utils/drizzle-conditions.ts","../src/services/entity-helpers.ts","../src/data-transformer.ts","../src/services/RelationService.ts","../src/services/EntityFetchService.ts","../src/services/EntityPersistService.ts","../src/services/entityService.ts","../src/services/BranchService.ts","../src/PostgresBackendDriver.ts","../src/databasePoolManager.ts","../src/schema/auth-schema.ts","../src/schema/generate-drizzle-schema-logic.ts","../src/schema/generate-drizzle-schema.ts","../src/services/realtimeService.ts","../src/websocket.ts","../src/collections/PostgresCollectionRegistry.ts","../src/auth/ensure-tables.ts","../src/auth/services.ts","../src/history/HistoryService.ts","../src/history/ensure-history-table.ts","../src/PostgresBootstrapper.ts"],"sourcesContent":["import { Pool } from \"pg\";\nimport { drizzle } from \"drizzle-orm/node-postgres\";\n\nexport function createPostgresDatabaseConnection(connectionString: string, schema?: Record<string, unknown>) {\n const pool = new Pool({\n connectionString,\n // Connection pool settings for resilience\n max: 20, // Maximum number of connections in the pool\n idleTimeoutMillis: 30000, // Close idle connections after 30 seconds\n connectionTimeoutMillis: 10000, // Timeout for new connections\n // Retry configuration\n query_timeout: 30000, // Query timeout\n statement_timeout: 30000, // Statement timeout\n // Keep connections alive\n keepAlive: true,\n keepAliveInitialDelayMillis: 0\n });\n\n // Handle connection errors and implement reconnection logic\n pool.on(\"error\", (err) => {\n console.error(\"Database connection error:\", err);\n\n // Handle specific timeout errors\n if (err.message.includes(\"ETIMEDOUT\")) {\n console.warn(\"Connection timeout detected, pool will automatically retry...\");\n }\n });\n\n // Handle successful connections\n pool.on(\"connect\", (client) => {\n console.debug(\"Database client connected\");\n\n // Set up client-level error handling\n client.on(\"error\", (err) => {\n console.error(\"Database client error:\", err);\n });\n });\n\n // Handle client removal from pool\n pool.on(\"remove\", (client) => {\n console.debug(\"Database client removed from pool\");\n });\n\n // Create drizzle instance — pass schema when available to enable db.query relational API\n const db = schema ? drizzle(pool, { schema }) : drizzle(pool);\n\n // Graceful shutdown handler\n process.on(\"SIGINT\", async () => {\n console.log(\"SIGINT: Closing database pool...\");\n await pool.end();\n process.exit(0);\n });\n\n process.on(\"SIGTERM\", async () => {\n console.log(\"SIGTERM: Closing database pool...\");\n await pool.end();\n process.exit(0);\n });\n\n return { db, connectionString };\n}\n\n","import React, { Dispatch, SetStateAction } from \"react\";\nimport { Entity, EntityStatus, EntityValues } from \"./entities\";\nimport { EntityCallbacks } from \"./entity_callbacks\";\n\nimport { EnumValues, Properties } from \"./properties\";\nimport { ExportConfig } from \"./export_import\";\nimport { EntityOverrides } from \"./entity_overrides\";\nimport { User } from \"../users\";\nimport { RebaseContext } from \"../rebase_context\";\nimport { Relation } from \"./relations\";\nimport { EntityCustomView } from \"./entity_views\";\nimport { EntityAction } from \"./entity_actions\";\n\n/**\n * Base interface containing all driver-agnostic collection properties.\n * Use {@link PostgresCollection} or {@link FirebaseCollection} for\n * driver-specific type safety, or {@link EntityCollection} when you\n * need to handle any collection regardless of backend.\n *\n * @group Models\n */\nexport interface BaseEntityCollection<M extends Record<string, unknown> = Record<string, unknown>, USER extends User = User> {\n\n /**\n * You can set an alias that will be used internally instead of the `path`.\n * The `alias` value will be used to determine the URL of the collection,\n * while `path` will still be used in the driver.\n * Note that you can use this value in reference properties too.\n */\n slug: string;\n\n /**\n * Name of the collection, typically plural.\n * E.g. `Products`, `Blog`\n */\n name: string;\n\n /**\n * Singular name of an entry in this collection\n * E.g. `Product`, `Blog entry`\n */\n singularName?: string;\n\n /**\n * Optional description of this view. You can use Markdown.\n */\n description?: string;\n\n /**\n * Child collections nested under entities of this collection.\n * Populated automatically during normalization from driver-specific fields\n * (e.g. Firebase `subcollections`, Postgres `relations` with many-cardinality).\n *\n * Custom drivers can set this directly to expose child collections to the UI.\n */\n childCollections?: () => EntityCollection<Record<string, unknown>>[];\n\n\n\n /**\n * Which driver handles this collection.\n * Use this to route collections to different backends:\n * - `\"postgres\"` - Route to PostgreSQL backend\n * - `\"firestore\"` - Route to Firestore (client-side)\n * - `\"mongodb\"` - Route to MongoDB backend\n * - Custom IDs for your own driver implementations\n *\n * If not specified, the default driver `\"(default)\"` is used.\n *\n * @example\n * // Simple - no driver needed for default\n * { slug: \"products\" }\n *\n * // Firestore collection (client-side real-time)\n * { slug: \"analytics\", driver: \"firestore\" }\n *\n * // Multiple databases within a driver\n * { slug: \"orders\", driver: \"postgres\", databaseId: \"orders_db\" }\n */\n driver?: string;\n\n /**\n * Which database within the driver.\n * - For Firestore: The Firestore database ID (e.g., for multi-database projects)\n * - For PostgreSQL: Schema or database name\n * - For MongoDB: Database name\n *\n * If not specified, the default database of the driver is used.\n */\n databaseId?: string;\n\n /**\n * Set of properties that compose an entity\n */\n properties: Properties;\n\n /**\n * Icon for the navigation sidebar or cards.\n */\n icon?: string | React.ReactNode;\n\n /**\n * Navigation group for this collection.\n */\n group?: string;\n\n /**\n * Array of entity views that this collection has.\n * Can be an array of `EntityCustomView` or a string representing the key of a global `EntityCustomView`.\n */\n entityViews?: (string | EntityCustomView<Record<string, unknown>>)[];\n\n /**\n * Default preview properties displayed when this collection is referenced to.\n */\n previewProperties?: string[];\n\n /**\n * Title property of the entity. This is the property that will be used\n * as the title in entity related views and references.\n * If not specified, the first property simple text property will be used.\n */\n readonly titleProperty?: Extract<keyof M, string> | (string & {});\n\n /**\n * When editing an entity, you can choose to open the entity in a side dialog\n * or in a full screen dialog. Defaults to `full_screen`.\n */\n openEntityMode?: \"side_panel\" | \"full_screen\";\n\n /**\n * Order in which the properties are displayed.\n * If you are specifying your collection as code, the order is the same as the\n * one you define in `properties`. Additional columns are added at the\n * end of the list, if the order is not specified.\n * You can use this prop to hide some properties from the table view.\n * Note that if you set this prop, other ways to hide fields, like\n * `hidden` in the property definition, will be ignored.\n * `propertiesOrder` has precedence over `hidden`.\n * - For properties use the property key.\n * - For additional fields use the field key.\n * - If you have subcollections, you get a column for each subcollection,\n * with the path (or alias) as the subcollection, prefixed with\n * `subcollection:`. e.g. `subcollection:orders`.\n * You can use this prop to hide some properties from the table view.\n * Note that if you set this prop, other ways to hide fields, like\n * `hidden` in the property definition,will be ignored.\n * `propertiesOrder` has precedence over `hidden`.\n */\n propertiesOrder?: (Extract<keyof M, string> | (string & {}) | string | `subcollection:${string}`)[];\n\n /**\n * If enabled, content is loaded in batches. If `false` all entities in the\n * collection are loaded. This means that when reaching the end of the\n * collection, the CMS will load more entities.\n * You can specify a number to specify the pagination size (50 by default)\n * Defaults to `true`\n */\n pagination?: boolean | number;\n\n\n selectionEnabled?: boolean;\n\n /**\n * This interface defines all the callbacks that can be used when an entity\n * is being created, updated or deleted.\n * Useful for adding your own logic or blocking the execution of the operation.\n */\n readonly callbacks?: EntityCallbacks<M, USER>;\n\n /**\n * Pass your own selection controller if you want to control selected\n * entities externally.\n * @see useSelectionController\n */\n selectionController?: SelectionController<M>;\n\n /**\n * Force a filter in this view. If applied, the rest of the filters will\n * be disabled. Filters applied with this prop cannot be changed.\n * e.g. `forceFilter: { age: [\">\", 18] }`\n * e.g. `forceFilter: { related_user: [\"==\", new EntityReference(\"sdc43dsw2\", \"users\")] }`\n */\n readonly forceFilter?: FilterValues<Extract<keyof M, string> | (string & {})>;\n\n /**\n * Initial filters applied to the collection this collection is related to.\n * Defaults to none. Filters applied with this prop can be changed.\n * e.g. `filter: { age: [\">\", 18] }`\n * e.g. `filter: { related_user: [\"==\", new EntityReference(\"sdc43dsw2\", \"users\")] }`\n */\n readonly filter?: FilterValues<Extract<keyof M, string> | (string & {})>; // setting FilterValues<M> can break defining collections by code\n\n /**\n * Default sort applied to this collection.\n * When setting this prop, entities will have a default order\n * applied in the collection.\n * e.g. `sort: [\"order\", \"asc\"]`\n */\n readonly sort?: [Extract<keyof M, string> | (string & {}), \"asc\" | \"desc\"];\n\n /**\n * You can add additional fields to the collection view by implementing\n * an additional field delegate.\n */\n readonly additionalFields?: AdditionalFieldDelegate<M, USER>[];\n\n /**\n * Default size of the rendered collection\n */\n defaultSize?: CollectionSize;\n\n /**\n * Can the elements in this collection be edited inline in the collection\n * view. If this flag is set to false but `permissions.edit` is `true`, entities\n * can still be edited in the side panel\n */\n inlineEditing?: boolean;\n\n /**\n * Should this collection be hidden from the main navigation panel, if\n * it is at the root level, or in the entity side panel if it's a\n * subcollection.\n * It will still be accessible if you reach the specified path.\n * You can also use this collection as a reference target.\n */\n hideFromNavigation?: boolean;\n\n /**\n * If you want to open custom views or subcollections by default when opening the edit\n * view of an entity, you can specify the path to the view here.\n * The path is relative to the current collection. For example if you have a collection\n * that has a custom view as well as a subcollection that refers to another entity, you can\n * either specify the path to the custom view or the path to the subcollection.\n */\n defaultSelectedView?: string | DefaultSelectedViewBuilder;\n\n /**\n * Should the ID of this collection be hidden from the form view.\n */\n hideIdFromForm?: boolean;\n\n /**\n * Should the ID of this collection be hidden from the grid view.\n */\n hideIdFromCollection?: boolean;\n\n /**\n * If set to true, the form will be auto-saved when the user changes\n * the value of a field.\n * Defaults to false.\n * When a new entity is created, this property can be updated to generated a new ID\n */\n formAutoSave?: boolean;\n\n /**\n *\n */\n exportable?: boolean | ExportConfig<USER>;\n\n /**\n * User id of the owner of this collection. This is used only by plugins, or if you\n * are writing custom code\n */\n ownerId?: string;\n\n /**\n * Overrides for the entity view, like the data source or the storage source.\n */\n overrides?: EntityOverrides;\n\n /**\n * Width of the side dialog (in pixels) when opening an entity in this collection.\n */\n sideDialogWidth?: number | string;\n\n /**\n * If set to true, the default values of the properties will be applied\n * to the entity every time the entity is updated (not only when created).\n * Defaults to false.\n */\n alwaysApplyDefaultValues?: boolean;\n\n /**\n * If set to true, a tab including the JSON representation of the entity will be included.\n */\n includeJsonView?: boolean;\n\n /**\n * If set to true, changes to the entity will be saved in a subcollection.\n * This prop has no effect if the history plugin is not enabled\n */\n history?: boolean;\n\n /**\n * Should local changes be backed up in local storage, to prevent data loss on\n * accidental navigations.\n * - `manual_apply`: When the user navigates back to an entity with local changes,\n * they will be prompted to restore the changes.\n * - `auto_apply`: When the user navigates back to an entity with local changes,\n * the changes will be automatically applied.\n * - `false`: Local changes will not be backed up.\n * Defaults to `manual_apply`.\n */\n localChangesBackup?: \"manual_apply\" | \"auto_apply\" | false;\n\n /**\n * Default view mode for displaying this collection.\n * - \"table\": Display entities in a spreadsheet-like table (default)\n * - \"cards\": Display entities as a grid of cards with thumbnails\n * - \"kanban\": Display entities in a Kanban board grouped by a property\n * Defaults to \"table\".\n */\n defaultViewMode?: ViewMode;\n\n /**\n * Which view modes are available for this collection.\n * Possible values: \"table\", \"cards\", \"kanban\".\n * Defaults to all three: [\"table\", \"cards\", \"kanban\"].\n * Note: \"kanban\" will only be available if the collection has at least\n * one string property with enumValues defined, regardless of this setting.\n */\n enabledViews?: ViewMode[];\n\n /**\n * Configuration for Kanban board view mode.\n * When set, the Kanban view mode becomes available.\n */\n kanban?: KanbanConfig<M>;\n\n /**\n * Property key to use for ordering items.\n * Must reference a number property. When items are reordered,\n * this property will be updated to reflect the new order using\n * fractional indexing. Used by Kanban view for ordering within columns\n * and can be used for general ordering purposes.\n */\n readonly orderProperty?: Extract<keyof M, string> | (string & {});\n\n /**\n * Actions that can be performed on the entities in this collection.\n */\n entityActions?: EntityAction<M, USER>[];\n\n /**\n * Builder for the collection actions rendered in the toolbar\n */\n Actions?: React.ComponentType<any>[];\n\n}\n\n// ── Driver-specific collection types ──────────────────────────────────\n\n/**\n * A collection backed by PostgreSQL (or any SQL database).\n * Adds support for SQL-style relations (JOINs) and Row Level Security.\n *\n * Use this type instead of {@link EntityCollection} when you want\n * compile-time safety that only SQL-relevant fields appear.\n *\n * @group Models\n */\nexport interface PostgresCollection<M extends Record<string, unknown> = Record<string, unknown>, USER extends User = User>\n extends BaseEntityCollection<M, USER> {\n\n /**\n * The driver for this collection. For Postgres collections this\n * can be omitted (Postgres is the default) or set to `\"postgres\"`.\n */\n driver?: \"postgres\" | undefined;\n\n /**\n * The PostgreSQL table name for this collection.\n */\n table: string;\n\n /**\n * Set by the backend when the resolved table name doesn't match\n * an actual table in the database schema.\n */\n isTableMissing?: boolean;\n\n /**\n * For SQL databases, you can define the relations between collections here.\n * Relations describe JOINs, foreign keys, and junction tables.\n */\n relations?: Relation[];\n\n /**\n * Security rules for this collection (Supabase-style Row Level Security).\n * When defined, the schema generator will enable RLS on the table and\n * create the corresponding PostgreSQL policies.\n *\n * Supports three levels of expressiveness:\n * 1. **Convenience shortcuts** — `ownerField`, `access`, `roles`\n * 2. **Raw SQL** — `using` and `withCheck` for full PostgreSQL power\n * 3. **Combined** — mix shortcuts with `roles` for common patterns\n *\n * The authenticated user context is available in raw SQL via:\n * - `auth.uid()` — the current user's ID\n * - `auth.roles()` — comma-separated app role IDs\n * - `auth.jwt()` — full JWT claims as JSONB\n */\n securityRules?: SecurityRule[];\n}\n\n/**\n * A collection backed by Firebase / Firestore.\n * Adds support for subcollections (nested document collections).\n *\n * Use this type instead of {@link EntityCollection} when you want\n * compile-time safety that only Firestore-relevant fields appear.\n *\n * @group Models\n */\nexport interface FirebaseCollection<M extends Record<string, unknown> = Record<string, unknown>, USER extends User = User>\n extends BaseEntityCollection<M, USER> {\n\n /**\n * The driver for this collection. Must be set to `\"firestore\"`.\n */\n driver: \"firestore\";\n\n /**\n * You can add subcollections to your entity in the same way you define the root\n * collections. The collections added here will be displayed when opening\n * the side dialog of an entity.\n */\n subcollections?: () => EntityCollection<Record<string, unknown>>[];\n}\n\n/**\n * A collection backed by any data source.\n * This is a discriminated union — use {@link PostgresCollection} or\n * {@link FirebaseCollection} for driver-specific type safety.\n *\n * @group Models\n */\nexport type EntityCollection<M extends Record<string, unknown> = Record<string, unknown>, USER extends User = User> =\n | PostgresCollection<M, USER>\n | FirebaseCollection<M, USER>;\n\n// ── Type guards ───────────────────────────────────────────────────────\n\n/**\n * Type guard for PostgreSQL collections.\n * Returns true if the collection uses the Postgres driver (or the default driver).\n * @group Models\n */\nexport function isPostgresCollection<M extends Record<string, unknown> = Record<string, unknown>, USER extends User = User>(\n collection: EntityCollection<M, USER>\n): collection is PostgresCollection<M, USER> {\n return !collection.driver || collection.driver === \"postgres\";\n}\n\n/**\n * Type guard for Firebase / Firestore collections.\n * @group Models\n */\nexport function isFirebaseCollection<M extends Record<string, unknown> = Record<string, unknown>, USER extends User = User>(\n collection: EntityCollection<M, USER>\n): collection is FirebaseCollection<M, USER> {\n return collection.driver === \"firestore\";\n}\n\n\n/**\n * Configuration for Kanban board view mode.\n * @group Collections\n */\nexport interface KanbanConfig<M extends Record<string, unknown> = Record<string, unknown>> {\n /**\n * Property key to use for Kanban board columns.\n * Must reference a string property with enumValues defined.\n * Entities will be grouped into columns based on this property's value.\n * The column order is determined by the order of enumValues in the property.\n */\n columnProperty: Extract<keyof M, string> | (string & {});\n}\n\n/**\n * View mode for displaying a collection.\n * @group Collections\n */\nexport type ViewMode = \"table\" | \"cards\" | \"kanban\";\n\n/**\n * Parameter passed to the `Actions` prop in the collection configuration.\n * The component will receive this prop when it is rendered in the collection\n * toolbar.\n *\n * @group Models\n */\nexport interface CollectionActionsProps<M extends Record<string, unknown> = Record<string, unknown>, USER extends User = User, EC extends EntityCollection<M> = EntityCollection<M>> {\n /**\n * Full collection path of this entity. This is the full path, like\n * `users/1234/addresses`\n */\n path: string;\n\n /**\n * Path of the last collection, like `addresses`\n */\n relativePath: string;\n\n /**\n * Array of the parent path segments like `['users']`\n */\n parentCollectionIds: string[];\n\n /**\n * The collection configuration\n */\n collection: EC;\n\n /**\n * Use this controller to get the selected entities and to update the\n * selected entities state.\n */\n selectionController: SelectionController<M>;\n\n /**\n * Use this controller to get the table controller and to update the\n * table controller state.\n */\n tableController: EntityTableController<M>;\n\n /**\n * Context of the app status\n */\n context: RebaseContext<USER>;\n\n /**\n * Count of the entities in this collection.\n * undefined means the count is still loading.\n */\n collectionEntitiesCount?: number;\n\n}\n\n/**\n * Use this controller to retrieve the selected entities or modify them in\n * an {@link EntityCollection}\n * @group Models\n */\nexport interface SelectionController<M extends Record<string, unknown> = Record<string, unknown>> {\n selectedEntities: Entity<M>[];\n setSelectedEntities(entities: Entity<M>[]): void;\n setSelectedEntities(action: (prev: Entity<M>[]) => Entity<M>[]): void;\n isEntitySelected(entity: Entity<M>): boolean;\n toggleEntitySelection(entity: Entity<M>, newSelectedState?: boolean): void;\n}\n\n/**\n * Filter conditions in a `Query.where()` clause are specified using the\n * strings `<`, `<=`, `==`, `>=`, `>`, `array-contains`, `in`, and `array-contains-any`.\n * @group Models\n */\nexport type WhereFilterOp =\n | \"<\"\n | \"<=\"\n | \"==\"\n | \"!=\"\n | \">=\"\n | \">\"\n | \"array-contains\"\n | \"in\"\n | \"not-in\"\n | \"array-contains-any\";\n\n/**\n * Used to define filters applied in collections\n *\n * e.g. `{ age: [\">=\", 18] }`\n *\n * @group Models\n */\nexport type FilterValues<Key extends string> =\n Partial<Record<Key, [WhereFilterOp, unknown]>>;\n\n/**\n * Used to indicate valid filter combinations (e.g. created in Firestore)\n * If the user selects a specific filter/sort combination, the CMS checks if it's\n * valid, otherwise it reverts to the simpler valid case\n * @group Models\n */\nexport type FilterCombination<Key extends string> = Partial<Record<Key, \"asc\" | \"desc\">>;\n\n/**\n * Sizes in which a collection can be rendered\n * @group Models\n */\nexport type CollectionSize = \"xs\" | \"s\" | \"m\" | \"l\" | \"xl\";\n\nexport type AdditionalFieldDelegateProps<M extends Record<string, unknown> = Record<string, unknown>, USER extends User = User> = {\n entity: Entity<M>,\n context: RebaseContext<USER>\n};\n\n/**\n * Use this interface for adding additional fields to entity collection views and forms.\n * @group Models\n */\nexport interface AdditionalFieldDelegate<M extends Record<string, unknown> = Record<string, unknown>,\n USER extends User = User> {\n\n /**\n * ID of this column. You can use this id in the `properties` field of the\n * collection in any order you want\n */\n key: string;\n\n /**\n * Header of this column\n */\n name: string;\n\n /**\n * Width of the generated column in pixels\n */\n width?: number;\n\n /**\n * Builder for the custom field\n */\n Builder?(props: { entity: Entity<M>, context: RebaseContext<USER> }): React.ReactNode;\n\n\n\n /**\n * If this column needs to update dynamically based on other properties,\n * you can define an array of keys as strings with the\n * `dependencies` prop.\n * e.g. [\"name\", \"surname\"]\n * This is a performance optimization, if you don't define dependencies\n * it will be updated in every render.\n */\n dependencies?: NoInfer<Extract<keyof M, string>> | NoInfer<Extract<keyof M, string>>[] | (string & {}) | (string & {})[];\n\n /**\n * Use this prop to define the value of the column as a string or number.\n * This is the value that will be used for exporting the collection.\n * If `Builder` is defined, this prop will be ignored in the collection\n * view.\n * @param entity\n */\n value?(props: {\n entity: Entity<M>,\n context: RebaseContext\n }): string | number | Promise<string | number> | undefined;\n}\n\n\nexport type InferCollectionType<S extends EntityCollection> = S extends EntityCollection<infer M> ? M : never;\n\n/**\n * Used in the {@link EntityCollection#defaultSelectedView} to define the default\n * @group Models\n */\nexport type DefaultSelectedViewBuilder = (params: DefaultSelectedViewParams) => string | undefined;\n\n/**\n * Used in the {@link EntityCollection#defaultSelectedView} to define the default\n * @group Models\n */\nexport type DefaultSelectedViewParams = {\n status?: EntityStatus;\n entityId?: string | number;\n};\n/**\n * You can use this controller to control the table view of a collection.\n */\nexport type EntityTableController<M extends Record<string, unknown> = Record<string, unknown>> = {\n data: Entity<M>[];\n dataLoading: boolean;\n noMoreToLoad: boolean;\n dataLoadingError?: Error;\n filterValues?: FilterValues<Extract<keyof M, string> | (string & {})>;\n setFilterValues?: (filterValues: FilterValues<Extract<keyof M, string> | (string & {})>) => void;\n sortBy?: [Extract<keyof M, string> | (string & {}), \"asc\" | \"desc\"];\n setSortBy?: (sortBy?: [Extract<keyof M, string> | (string & {}), \"asc\" | \"desc\"]) => void;\n searchString?: string;\n setSearchString?: (searchString?: string) => void;\n clearFilter?: () => void;\n itemCount?: number;\n setItemCount?: (itemCount: number) => void;\n initialScroll?: number;\n onScroll?: (props: {\n scrollDirection: \"forward\" | \"backward\",\n scrollOffset: number,\n scrollUpdateWasRequested: boolean\n }) => void;\n paginationEnabled?: boolean;\n pageSize?: number;\n checkFilterCombination?: (filterValues: FilterValues<string>,\n sortBy?: [string, \"asc\" | \"desc\"]) => boolean;\n popupCell?: SelectedCellProps<M>;\n setPopupCell?: (popupCell?: SelectedCellProps<M>) => void;\n\n onAddColumn?: (column: string) => void;\n}\n\nexport type SelectedCellProps<M extends Record<string, unknown> = Record<string, unknown>> = {\n propertyKey: Extract<keyof M, string> | (string & {});\n cellRect: DOMRect;\n width: number;\n height: number;\n entityPath: string;\n entityId: string | number;\n};\n\n/**\n * SQL operation that a policy applies to.\n * @group Models\n */\nexport type SecurityOperation = \"select\" | \"insert\" | \"update\" | \"delete\" | \"all\";\n\n/**\n * Flexible Row Level Security rule for a collection.\n *\n * Inspired by Supabase's approach to PostgreSQL RLS. Rules can range from\n * simple convenience shortcuts to fully custom SQL expressions, giving you the\n * full power of PostgreSQL Row Level Security.\n *\n * The authenticated user's identity is available in raw SQL via:\n * - `auth.uid()` — the user's ID\n * - `auth.roles()` — comma-separated app role IDs\n * - `auth.jwt()` — full JWT claims as JSONB\n *\n * These are set automatically per-transaction by the backend.\n *\n * **How rules combine:** PostgreSQL evaluates all matching policies for an\n * operation. Permissive rules are OR'd together (any one passing is enough).\n * Restrictive rules are AND'd (all must pass). This mirrors Supabase behavior.\n *\n * @group Models\n */\nexport interface SecurityRule {\n /**\n * Optional human-readable name for the policy.\n * If not provided, one will be auto-generated from the table name and operation.\n * Must be unique per table.\n *\n * When using `operations` (array), each generated policy will have the\n * operation name appended, e.g. `\"owner_access_select\"`, `\"owner_access_update\"`.\n */\n name?: string;\n\n /**\n * Which SQL operation this policy applies to.\n * Use this when the policy targets a single operation or all operations.\n *\n * For multiple specific operations, use `operations` (array) instead.\n * If neither is specified, defaults to `\"all\"`.\n *\n * @default \"all\"\n */\n operation?: SecurityOperation;\n\n /**\n * Array of SQL operations this policy applies to.\n * The compiler will generate one PostgreSQL policy per operation, sharing\n * the same configuration.\n *\n * This reduces boilerplate when the same rule applies to multiple (but not all)\n * operations.\n *\n * Takes precedence over `operation` (singular) if both are specified.\n *\n * @example\n * // Same rule for select and update\n * { operations: [\"select\", \"update\"], ownerField: \"user_id\" }\n *\n * @example\n * // Equivalent to operation: \"all\"\n * { operations: [\"all\"], ownerField: \"user_id\" }\n */\n operations?: SecurityOperation[];\n\n /**\n * Whether this policy is `\"permissive\"` (default) or `\"restrictive\"`.\n *\n * - **permissive**: Multiple permissive policies for the same operation are\n * OR'd together — if *any* passes, access is granted.\n * - **restrictive**: Restrictive policies are AND'd with all permissive\n * policies — they act as additional gates that *must* also pass.\n *\n * This is the same model as PostgreSQL / Supabase.\n *\n * @default \"permissive\"\n */\n mode?: \"permissive\" | \"restrictive\";\n\n // ── Convenience shortcuts ───────────────────────────────────────────\n\n /**\n * **Shortcut.** The property (column) that stores the owner's user ID.\n * Generates a USING/WITH CHECK clause like:\n * `<column> = auth.uid()`\n *\n * Cannot be combined with `using` / `withCheck` / `access`.\n *\n * @example\n * { operation: \"all\", ownerField: \"user_id\" }\n */\n ownerField?: string;\n\n /**\n * **Shortcut.** Grant unrestricted row access (no row filtering) for this operation.\n * Generates `USING (true)`.\n *\n * This means \"no row-level filter\", NOT \"anonymous/unauthenticated access\".\n * Authentication is still enforced at the API layer — this only controls which\n * *rows* authenticated users can see.\n *\n * Typically used alone for genuinely public read endpoints, or combined with\n * `roles` to give certain roles an unfiltered view of the table.\n *\n * Cannot be combined with `using` / `withCheck` / `ownerField`.\n *\n * @example\n * // Public read (any authenticated user sees all rows)\n * { operation: \"select\", access: \"public\" }\n */\n access?: \"public\";\n\n /**\n * **Shortcut.** Restrict this rule to users that have one of these\n * application-level roles.\n *\n * **Important:** These are NOT native PostgreSQL database roles. They are\n * application roles managed by Rebase, stored in the `rebase.user_roles`\n * table, and injected into each transaction via `auth.roles()`.\n *\n * Generates a condition like:\n * `auth.roles() ~ '<role1>|<role2>'`\n *\n * Can be combined with `ownerField`, `access`, or raw `using`/`withCheck`.\n * When combined, the role check is AND'd with the other condition.\n *\n * @example\n * // Only admins can delete\n * { operation: \"delete\", roles: [\"admin\"] }\n *\n * @example\n * // Admins have unfiltered read access to all rows\n * { operation: \"select\", roles: [\"admin\"], using: \"true\" }\n */\n roles?: string[];\n\n // ── Raw SQL expressions (full power) ────────────────────────────────\n\n /**\n * Raw SQL expression for the `USING` clause.\n * This controls which *existing* rows are visible / can be modified / deleted.\n * Applied to SELECT, UPDATE, and DELETE.\n *\n * You can reference columns via `{column_name}` which will be resolved to\n * `table.column_name` in the generated Drizzle code. You can also use any\n * valid PostgreSQL expression.\n *\n * Cannot be combined with `ownerField` or `access`.\n *\n * @example\n * // Rows published in the last 30 days are visible\n * { operation: \"select\", using: \"{published_at} > now() - interval '30 days'\" }\n *\n * @example\n * // Only the owner, or users with 'moderator' role\n * {\n * operation: \"select\",\n * using: \"{user_id} = auth.uid() OR auth.roles() ~ 'moderator'\"\n * }\n *\n * @example\n * // Cross-table subquery: only if user belongs to the org\n * {\n * operation: \"select\",\n * using: \"EXISTS (SELECT 1 FROM org_members WHERE org_members.org_id = {org_id} AND org_members.user_id = auth.uid())\"\n * }\n */\n using?: string;\n\n /**\n * Raw SQL expression for the `WITH CHECK` clause.\n * This controls which *new/updated* row values are allowed.\n * Applied to INSERT and UPDATE.\n *\n * Same syntax as `using` — use `{column_name}` to reference columns.\n *\n * **Important for UPDATE:** PostgreSQL evaluates two row states — the\n * *existing* row (`USING`) and the *incoming new* row (`WITH CHECK`).\n * If you only specify `using`, the same expression is used for both.\n * For security-sensitive updates, always specify `withCheck` explicitly\n * to constrain what the new row values can be.\n *\n * If not provided on INSERT/UPDATE policies, falls back to `using`\n * (which matches PostgreSQL's own default behavior).\n *\n * Cannot be combined with `ownerField` or `access`.\n *\n * @example\n * // Users can only insert rows where they are the owner\n * { operation: \"insert\", withCheck: \"{user_id} = auth.uid()\" }\n *\n * @example\n * // Prevent changing the status to 'archived' unless admin\n * {\n * operation: \"update\",\n * using: \"{user_id} = auth.uid()\",\n * withCheck: \"{status} != 'archived' OR auth.roles() ~ 'admin'\"\n * }\n *\n * @example\n * // Restrictive gate: prevent locking AND unlocking unless admin.\n * // `using` checks the old row state, `withCheck` checks the new.\n * {\n * operation: \"update\",\n * mode: \"restrictive\",\n * using: \"{is_locked} = false\",\n * withCheck: \"{is_locked} = false\"\n * }\n */\n withCheck?: string;\n\n // ── Advanced: native PostgreSQL role targeting ───────────────────────\n\n /**\n * **Advanced.** Native PostgreSQL database roles the policy applies to.\n *\n * By default, all generated policies target the `public` role (i.e.\n * every database connection). This is correct for most setups where\n * a single database role is used for all connections.\n *\n * **Important:** These are NOT the same as the application-level `roles`\n * (admin, editor, viewer, etc.) — those are enforced in the USING/WITH\n * CHECK clauses via `auth.roles()`. This field controls the PostgreSQL\n * `TO` clause in `CREATE POLICY ... TO role_name`.\n *\n * Use this if you have dedicated PostgreSQL roles (e.g. `app_read`,\n * `app_write`) and want policies to target specific ones.\n *\n * @default [\"public\"]\n *\n * @example\n * // Only apply this policy when connected as `app_role`\n * { operation: \"select\", access: \"public\", pgRoles: [\"app_role\"] }\n */\n pgRoles?: string[];\n}\n","const kebabCaseRegex = /[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g;\n\nexport const toKebabCase = (str: string) => {\n const regExpMatchArray = str.match(kebabCaseRegex);\n if (!regExpMatchArray) return \"\";\n return regExpMatchArray\n .map(x => x.toLowerCase())\n .join(\"-\");\n};\n\nconst snakeCaseRegex = /[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g;\n\nexport const toSnakeCase = (str: string) => {\n const regExpMatchArray = str.match(snakeCaseRegex);\n if (!regExpMatchArray) return \"\";\n return regExpMatchArray\n .map(x => x.toLowerCase())\n .join(\"_\");\n};\n\nexport function randomString(strLength = 5) {\n return Math.random().toString(36).slice(2, 2 + strLength);\n}\n\nexport function randomColor() {\n return Math.floor(Math.random() * 16777215).toString(16);\n}\n\nexport function slugify(text?: string, separator = \"_\", lowercase = true) {\n if (!text) return \"\";\n const from = \"ãàáäâẽèéëêìíïîõòóöôùúüûñç·/_,:;-\"\n const to = `aaaaaeeeeeiiiiooooouuuunc${separator}${separator}${separator}${separator}${separator}${separator}${separator}`;\n\n for (let i = 0, l = from.length; i < l; i++) {\n text = text.replace(new RegExp(from.charAt(i), \"g\"), to.charAt(i));\n }\n\n text = text\n .toString() // Cast to string\n .trim() // Remove whitespace from both sides of a string\n .replace(/^\\s+|\\s+$/g, \"\")\n .replace(/\\s+/g, separator) // Replace spaces with separator\n .replace(/&/g, separator) // Replace & with separator\n .replace(/[^\\w\\\\-]+/g, \"\") // Remove all non-word chars\n .replace(new RegExp(\"\\\\\" + separator + \"\\\\\" + separator + \"+\", \"g\"),\n separator); // Replace multiple separators with single one\n\n return lowercase\n ? text.toLowerCase() // Convert the string to lowercase letters\n : text;\n}\n\nexport function unslugify(slug?: string): string {\n if (!slug) return \"\";\n if (slug.includes(\"-\") || slug.includes(\"_\") || !slug.includes(\" \")) {\n const result = slug.replace(/[-_]/g, \" \");\n return result.replace(/\\w\\S*/g, function (txt) {\n return txt.charAt(0).toUpperCase() + txt.substring(1);\n }).trim();\n } else {\n return slug.trim();\n }\n}\n\nexport function prettifyIdentifier(input: string) {\n if (!input) return \"\";\n\n let text = input;\n\n // 1. Handle camelCase and Acronyms\n // Group 1 ($1 $2): Lowercase followed by Uppercase (e.g., imageURL -> image URL)\n // Group 2 ($3 $4): Uppercase followed by Uppercase+lowercase (e.g., XMLParser -> XML Parser)\n text = text.replace(/([a-z])([A-Z])|([A-Z])([A-Z][a-z])/g, \"$1$3 $2$4\");\n\n // 2. Replace hyphens/underscores with spaces\n text = text.replace(/[_-]+/g, \" \");\n\n // 3. Capitalize first letter of each word (Title Case)\n const s = text\n .trim()\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n console.log(\"Prettified identifier:\", { input,s });\n return s;\n}\n","!function(e){var t;\"object\"==typeof exports?module.exports=e():\"function\"==typeof define&&define.amd?define(e):(\"undefined\"!=typeof window?t=window:\"undefined\"!=typeof global?t=global:\"undefined\"!=typeof self&&(t=self),t.objectHash=e())}(function(){return function r(o,i,u){function s(n,e){if(!i[n]){if(!o[n]){var t=\"function\"==typeof require&&require;if(!e&&t)return t(n,!0);if(a)return a(n,!0);throw new Error(\"Cannot find module '\"+n+\"'\")}e=i[n]={exports:{}};o[n][0].call(e.exports,function(e){var t=o[n][1][e];return s(t||e)},e,e.exports,r,o,i,u)}return i[n].exports}for(var a=\"function\"==typeof require&&require,e=0;e<u.length;e++)s(u[e]);return s}({1:[function(w,b,m){!function(e,n,s,c,d,h,p,g,y){\"use strict\";var r=w(\"crypto\");function t(e,t){t=u(e,t);var n;return void 0===(n=\"passthrough\"!==t.algorithm?r.createHash(t.algorithm):new l).write&&(n.write=n.update,n.end=n.update),f(t,n).dispatch(e),n.update||n.end(\"\"),n.digest?n.digest(\"buffer\"===t.encoding?void 0:t.encoding):(e=n.read(),\"buffer\"!==t.encoding?e.toString(t.encoding):e)}(m=b.exports=t).sha1=function(e){return t(e)},m.keys=function(e){return t(e,{excludeValues:!0,algorithm:\"sha1\",encoding:\"hex\"})},m.MD5=function(e){return t(e,{algorithm:\"md5\",encoding:\"hex\"})},m.keysMD5=function(e){return t(e,{algorithm:\"md5\",encoding:\"hex\",excludeValues:!0})};var o=r.getHashes?r.getHashes().slice():[\"sha1\",\"md5\"],i=(o.push(\"passthrough\"),[\"buffer\",\"hex\",\"binary\",\"base64\"]);function u(e,t){var n={};if(n.algorithm=(t=t||{}).algorithm||\"sha1\",n.encoding=t.encoding||\"hex\",n.excludeValues=!!t.excludeValues,n.algorithm=n.algorithm.toLowerCase(),n.encoding=n.encoding.toLowerCase(),n.ignoreUnknown=!0===t.ignoreUnknown,n.respectType=!1!==t.respectType,n.respectFunctionNames=!1!==t.respectFunctionNames,n.respectFunctionProperties=!1!==t.respectFunctionProperties,n.unorderedArrays=!0===t.unorderedArrays,n.unorderedSets=!1!==t.unorderedSets,n.unorderedObjects=!1!==t.unorderedObjects,n.replacer=t.replacer||void 0,n.excludeKeys=t.excludeKeys||void 0,void 0===e)throw new Error(\"Object argument required.\");for(var r=0;r<o.length;++r)o[r].toLowerCase()===n.algorithm.toLowerCase()&&(n.algorithm=o[r]);if(-1===o.indexOf(n.algorithm))throw new Error('Algorithm \"'+n.algorithm+'\" not supported. supported values: '+o.join(\", \"));if(-1===i.indexOf(n.encoding)&&\"passthrough\"!==n.algorithm)throw new Error('Encoding \"'+n.encoding+'\" not supported. supported values: '+i.join(\", \"));return n}function a(e){if(\"function\"==typeof e)return null!=/^function\\s+\\w*\\s*\\(\\s*\\)\\s*{\\s+\\[native code\\]\\s+}$/i.exec(Function.prototype.toString.call(e))}function f(o,t,i){i=i||[];function u(e){return t.update?t.update(e,\"utf8\"):t.write(e,\"utf8\")}return{dispatch:function(e){return this[\"_\"+(null===(e=o.replacer?o.replacer(e):e)?\"null\":typeof e)](e)},_object:function(t){var n,e=Object.prototype.toString.call(t),r=/\\[object (.*)\\]/i.exec(e);r=(r=r?r[1]:\"unknown:[\"+e+\"]\").toLowerCase();if(0<=(e=i.indexOf(t)))return this.dispatch(\"[CIRCULAR:\"+e+\"]\");if(i.push(t),void 0!==s&&s.isBuffer&&s.isBuffer(t))return u(\"buffer:\"),u(t);if(\"object\"===r||\"function\"===r||\"asyncfunction\"===r)return e=Object.keys(t),o.unorderedObjects&&(e=e.sort()),!1===o.respectType||a(t)||e.splice(0,0,\"prototype\",\"__proto__\",\"constructor\"),o.excludeKeys&&(e=e.filter(function(e){return!o.excludeKeys(e)})),u(\"object:\"+e.length+\":\"),n=this,e.forEach(function(e){n.dispatch(e),u(\":\"),o.excludeValues||n.dispatch(t[e]),u(\",\")});if(!this[\"_\"+r]){if(o.ignoreUnknown)return u(\"[\"+r+\"]\");throw new Error('Unknown object type \"'+r+'\"')}this[\"_\"+r](t)},_array:function(e,t){t=void 0!==t?t:!1!==o.unorderedArrays;var n=this;if(u(\"array:\"+e.length+\":\"),!t||e.length<=1)return e.forEach(function(e){return n.dispatch(e)});var r=[],t=e.map(function(e){var t=new l,n=i.slice();return f(o,t,n).dispatch(e),r=r.concat(n.slice(i.length)),t.read().toString()});return i=i.concat(r),t.sort(),this._array(t,!1)},_date:function(e){return u(\"date:\"+e.toJSON())},_symbol:function(e){return u(\"symbol:\"+e.toString())},_error:function(e){return u(\"error:\"+e.toString())},_boolean:function(e){return u(\"bool:\"+e.toString())},_string:function(e){u(\"string:\"+e.length+\":\"),u(e.toString())},_function:function(e){u(\"fn:\"),a(e)?this.dispatch(\"[native]\"):this.dispatch(e.toString()),!1!==o.respectFunctionNames&&this.dispatch(\"function-name:\"+String(e.name)),o.respectFunctionProperties&&this._object(e)},_number:function(e){return u(\"number:\"+e.toString())},_xml:function(e){return u(\"xml:\"+e.toString())},_null:function(){return u(\"Null\")},_undefined:function(){return u(\"Undefined\")},_regexp:function(e){return u(\"regex:\"+e.toString())},_uint8array:function(e){return u(\"uint8array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint8clampedarray:function(e){return u(\"uint8clampedarray:\"),this.dispatch(Array.prototype.slice.call(e))},_int8array:function(e){return u(\"int8array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint16array:function(e){return u(\"uint16array:\"),this.dispatch(Array.prototype.slice.call(e))},_int16array:function(e){return u(\"int16array:\"),this.dispatch(Array.prototype.slice.call(e))},_uint32array:function(e){return u(\"uint32array:\"),this.dispatch(Array.prototype.slice.call(e))},_int32array:function(e){return u(\"int32array:\"),this.dispatch(Array.prototype.slice.call(e))},_float32array:function(e){return u(\"float32array:\"),this.dispatch(Array.prototype.slice.call(e))},_float64array:function(e){return u(\"float64array:\"),this.dispatch(Array.prototype.slice.call(e))},_arraybuffer:function(e){return u(\"arraybuffer:\"),this.dispatch(new Uint8Array(e))},_url:function(e){return u(\"url:\"+e.toString())},_map:function(e){u(\"map:\");e=Array.from(e);return this._array(e,!1!==o.unorderedSets)},_set:function(e){u(\"set:\");e=Array.from(e);return this._array(e,!1!==o.unorderedSets)},_file:function(e){return u(\"file:\"),this.dispatch([e.name,e.size,e.type,e.lastModfied])},_blob:function(){if(o.ignoreUnknown)return u(\"[blob]\");throw Error('Hashing Blob objects is currently not supported\\n(see https://github.com/puleos/object-hash/issues/26)\\nUse \"options.replacer\" or \"options.ignoreUnknown\"\\n')},_domwindow:function(){return u(\"domwindow\")},_bigint:function(e){return u(\"bigint:\"+e.toString())},_process:function(){return u(\"process\")},_timer:function(){return u(\"timer\")},_pipe:function(){return u(\"pipe\")},_tcp:function(){return u(\"tcp\")},_udp:function(){return u(\"udp\")},_tty:function(){return u(\"tty\")},_statwatcher:function(){return u(\"statwatcher\")},_securecontext:function(){return u(\"securecontext\")},_connection:function(){return u(\"connection\")},_zlib:function(){return u(\"zlib\")},_context:function(){return u(\"context\")},_nodescript:function(){return u(\"nodescript\")},_httpparser:function(){return u(\"httpparser\")},_dataview:function(){return u(\"dataview\")},_signal:function(){return u(\"signal\")},_fsevent:function(){return u(\"fsevent\")},_tlswrap:function(){return u(\"tlswrap\")}}}function l(){return{buf:\"\",write:function(e){this.buf+=e},end:function(e){this.buf+=e},read:function(){return this.buf}}}m.writeToStream=function(e,t,n){return void 0===n&&(n=t,t={}),f(t=u(e,t),n).dispatch(e)}}.call(this,w(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},w(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/fake_9a5aa49d.js\",\"/\")},{buffer:3,crypto:5,lYpoI2:11}],2:[function(e,t,f){!function(e,t,n,r,o,i,u,s,a){!function(e){\"use strict\";var a=\"undefined\"!=typeof Uint8Array?Uint8Array:Array,t=\"+\".charCodeAt(0),n=\"/\".charCodeAt(0),r=\"0\".charCodeAt(0),o=\"a\".charCodeAt(0),i=\"A\".charCodeAt(0),u=\"-\".charCodeAt(0),s=\"_\".charCodeAt(0);function f(e){e=e.charCodeAt(0);return e===t||e===u?62:e===n||e===s?63:e<r?-1:e<r+10?e-r+26+26:e<i+26?e-i:e<o+26?e-o+26:void 0}e.toByteArray=function(e){var t,n;if(0<e.length%4)throw new Error(\"Invalid string. Length must be a multiple of 4\");var r=e.length,r=\"=\"===e.charAt(r-2)?2:\"=\"===e.charAt(r-1)?1:0,o=new a(3*e.length/4-r),i=0<r?e.length-4:e.length,u=0;function s(e){o[u++]=e}for(t=0;t<i;t+=4,0)s((16711680&(n=f(e.charAt(t))<<18|f(e.charAt(t+1))<<12|f(e.charAt(t+2))<<6|f(e.charAt(t+3))))>>16),s((65280&n)>>8),s(255&n);return 2==r?s(255&(n=f(e.charAt(t))<<2|f(e.charAt(t+1))>>4)):1==r&&(s((n=f(e.charAt(t))<<10|f(e.charAt(t+1))<<4|f(e.charAt(t+2))>>2)>>8&255),s(255&n)),o},e.fromByteArray=function(e){var t,n,r,o,i=e.length%3,u=\"\";function s(e){return\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".charAt(e)}for(t=0,r=e.length-i;t<r;t+=3)n=(e[t]<<16)+(e[t+1]<<8)+e[t+2],u+=s((o=n)>>18&63)+s(o>>12&63)+s(o>>6&63)+s(63&o);switch(i){case 1:u=(u+=s((n=e[e.length-1])>>2))+s(n<<4&63)+\"==\";break;case 2:u=(u=(u+=s((n=(e[e.length-2]<<8)+e[e.length-1])>>10))+s(n>>4&63))+s(n<<2&63)+\"=\"}return u}}(void 0===f?this.base64js={}:f)}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/base64-js/lib/b64.js\",\"/node_modules/gulp-browserify/node_modules/base64-js/lib\")},{buffer:3,lYpoI2:11}],3:[function(O,e,H){!function(e,n,f,r,h,p,g,y,w){var a=O(\"base64-js\"),i=O(\"ieee754\");function f(e,t,n){if(!(this instanceof f))return new f(e,t,n);var r,o,i,u,s=typeof e;if(\"base64\"===t&&\"string\"==s)for(e=(u=e).trim?u.trim():u.replace(/^\\s+|\\s+$/g,\"\");e.length%4!=0;)e+=\"=\";if(\"number\"==s)r=j(e);else if(\"string\"==s)r=f.byteLength(e,t);else{if(\"object\"!=s)throw new Error(\"First argument needs to be a number, array or string.\");r=j(e.length)}if(f._useTypedArrays?o=f._augment(new Uint8Array(r)):((o=this).length=r,o._isBuffer=!0),f._useTypedArrays&&\"number\"==typeof e.byteLength)o._set(e);else if(C(u=e)||f.isBuffer(u)||u&&\"object\"==typeof u&&\"number\"==typeof u.length)for(i=0;i<r;i++)f.isBuffer(e)?o[i]=e.readUInt8(i):o[i]=e[i];else if(\"string\"==s)o.write(e,0,t);else if(\"number\"==s&&!f._useTypedArrays&&!n)for(i=0;i<r;i++)o[i]=0;return o}function b(e,t,n,r){return f._charsWritten=c(function(e){for(var t=[],n=0;n<e.length;n++)t.push(255&e.charCodeAt(n));return t}(t),e,n,r)}function m(e,t,n,r){return f._charsWritten=c(function(e){for(var t,n,r=[],o=0;o<e.length;o++)n=e.charCodeAt(o),t=n>>8,n=n%256,r.push(n),r.push(t);return r}(t),e,n,r)}function v(e,t,n){var r=\"\";n=Math.min(e.length,n);for(var o=t;o<n;o++)r+=String.fromCharCode(e[o]);return r}function o(e,t,n,r){r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+1<e.length,\"Trying to read beyond buffer length\"));var o,r=e.length;if(!(r<=t))return n?(o=e[t],t+1<r&&(o|=e[t+1]<<8)):(o=e[t]<<8,t+1<r&&(o|=e[t+1])),o}function u(e,t,n,r){r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+3<e.length,\"Trying to read beyond buffer length\"));var o,r=e.length;if(!(r<=t))return n?(t+2<r&&(o=e[t+2]<<16),t+1<r&&(o|=e[t+1]<<8),o|=e[t],t+3<r&&(o+=e[t+3]<<24>>>0)):(t+1<r&&(o=e[t+1]<<16),t+2<r&&(o|=e[t+2]<<8),t+3<r&&(o|=e[t+3]),o+=e[t]<<24>>>0),o}function _(e,t,n,r){if(r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+1<e.length,\"Trying to read beyond buffer length\")),!(e.length<=t))return r=o(e,t,n,!0),32768&r?-1*(65535-r+1):r}function E(e,t,n,r){if(r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(null!=t,\"missing offset\"),d(t+3<e.length,\"Trying to read beyond buffer length\")),!(e.length<=t))return r=u(e,t,n,!0),2147483648&r?-1*(4294967295-r+1):r}function I(e,t,n,r){return r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(t+3<e.length,\"Trying to read beyond buffer length\")),i.read(e,t,n,23,4)}function A(e,t,n,r){return r||(d(\"boolean\"==typeof n,\"missing or invalid endian\"),d(t+7<e.length,\"Trying to read beyond buffer length\")),i.read(e,t,n,52,8)}function s(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+1<e.length,\"trying to write beyond buffer length\"),Y(t,65535));o=e.length;if(!(o<=n))for(var i=0,u=Math.min(o-n,2);i<u;i++)e[n+i]=(t&255<<8*(r?i:1-i))>>>8*(r?i:1-i)}function l(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+3<e.length,\"trying to write beyond buffer length\"),Y(t,4294967295));o=e.length;if(!(o<=n))for(var i=0,u=Math.min(o-n,4);i<u;i++)e[n+i]=t>>>8*(r?i:3-i)&255}function B(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+1<e.length,\"Trying to write beyond buffer length\"),F(t,32767,-32768)),e.length<=n||s(e,0<=t?t:65535+t+1,n,r,o)}function L(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+3<e.length,\"Trying to write beyond buffer length\"),F(t,2147483647,-2147483648)),e.length<=n||l(e,0<=t?t:4294967295+t+1,n,r,o)}function U(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+3<e.length,\"Trying to write beyond buffer length\"),D(t,34028234663852886e22,-34028234663852886e22)),e.length<=n||i.write(e,t,n,r,23,4)}function x(e,t,n,r,o){o||(d(null!=t,\"missing value\"),d(\"boolean\"==typeof r,\"missing or invalid endian\"),d(null!=n,\"missing offset\"),d(n+7<e.length,\"Trying to write beyond buffer length\"),D(t,17976931348623157e292,-17976931348623157e292)),e.length<=n||i.write(e,t,n,r,52,8)}H.Buffer=f,H.SlowBuffer=f,H.INSPECT_MAX_BYTES=50,f.poolSize=8192,f._useTypedArrays=function(){try{var e=new ArrayBuffer(0),t=new Uint8Array(e);return t.foo=function(){return 42},42===t.foo()&&\"function\"==typeof t.subarray}catch(e){return!1}}(),f.isEncoding=function(e){switch(String(e).toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"raw\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return!0;default:return!1}},f.isBuffer=function(e){return!(null==e||!e._isBuffer)},f.byteLength=function(e,t){var n;switch(e+=\"\",t||\"utf8\"){case\"hex\":n=e.length/2;break;case\"utf8\":case\"utf-8\":n=T(e).length;break;case\"ascii\":case\"binary\":case\"raw\":n=e.length;break;case\"base64\":n=M(e).length;break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":n=2*e.length;break;default:throw new Error(\"Unknown encoding\")}return n},f.concat=function(e,t){if(d(C(e),\"Usage: Buffer.concat(list, [totalLength])\\nlist should be an Array.\"),0===e.length)return new f(0);if(1===e.length)return e[0];if(\"number\"!=typeof t)for(o=t=0;o<e.length;o++)t+=e[o].length;for(var n=new f(t),r=0,o=0;o<e.length;o++){var i=e[o];i.copy(n,r),r+=i.length}return n},f.prototype.write=function(e,t,n,r){isFinite(t)?isFinite(n)||(r=n,n=void 0):(a=r,r=t,t=n,n=a),t=Number(t)||0;var o,i,u,s,a=this.length-t;switch((!n||a<(n=Number(n)))&&(n=a),r=String(r||\"utf8\").toLowerCase()){case\"hex\":o=function(e,t,n,r){n=Number(n)||0;var o=e.length-n;(!r||o<(r=Number(r)))&&(r=o),d((o=t.length)%2==0,\"Invalid hex string\"),o/2<r&&(r=o/2);for(var i=0;i<r;i++){var u=parseInt(t.substr(2*i,2),16);d(!isNaN(u),\"Invalid hex string\"),e[n+i]=u}return f._charsWritten=2*i,i}(this,e,t,n);break;case\"utf8\":case\"utf-8\":i=this,u=t,s=n,o=f._charsWritten=c(T(e),i,u,s);break;case\"ascii\":case\"binary\":o=b(this,e,t,n);break;case\"base64\":i=this,u=t,s=n,o=f._charsWritten=c(M(e),i,u,s);break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":o=m(this,e,t,n);break;default:throw new Error(\"Unknown encoding\")}return o},f.prototype.toString=function(e,t,n){var r,o,i,u,s=this;if(e=String(e||\"utf8\").toLowerCase(),t=Number(t)||0,(n=void 0!==n?Number(n):s.length)===t)return\"\";switch(e){case\"hex\":r=function(e,t,n){var r=e.length;(!t||t<0)&&(t=0);(!n||n<0||r<n)&&(n=r);for(var o=\"\",i=t;i<n;i++)o+=k(e[i]);return o}(s,t,n);break;case\"utf8\":case\"utf-8\":r=function(e,t,n){var r=\"\",o=\"\";n=Math.min(e.length,n);for(var i=t;i<n;i++)e[i]<=127?(r+=N(o)+String.fromCharCode(e[i]),o=\"\"):o+=\"%\"+e[i].toString(16);return r+N(o)}(s,t,n);break;case\"ascii\":case\"binary\":r=v(s,t,n);break;case\"base64\":o=s,u=n,r=0===(i=t)&&u===o.length?a.fromByteArray(o):a.fromByteArray(o.slice(i,u));break;case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":r=function(e,t,n){for(var r=e.slice(t,n),o=\"\",i=0;i<r.length;i+=2)o+=String.fromCharCode(r[i]+256*r[i+1]);return o}(s,t,n);break;default:throw new Error(\"Unknown encoding\")}return r},f.prototype.toJSON=function(){return{type:\"Buffer\",data:Array.prototype.slice.call(this._arr||this,0)}},f.prototype.copy=function(e,t,n,r){if(t=t||0,(r=r||0===r?r:this.length)!==(n=n||0)&&0!==e.length&&0!==this.length){d(n<=r,\"sourceEnd < sourceStart\"),d(0<=t&&t<e.length,\"targetStart out of bounds\"),d(0<=n&&n<this.length,\"sourceStart out of bounds\"),d(0<=r&&r<=this.length,\"sourceEnd out of bounds\"),r>this.length&&(r=this.length);var o=(r=e.length-t<r-n?e.length-t+n:r)-n;if(o<100||!f._useTypedArrays)for(var i=0;i<o;i++)e[i+t]=this[i+n];else e._set(this.subarray(n,n+o),t)}},f.prototype.slice=function(e,t){var n=this.length;if(e=S(e,n,0),t=S(t,n,n),f._useTypedArrays)return f._augment(this.subarray(e,t));for(var r=t-e,o=new f(r,void 0,!0),i=0;i<r;i++)o[i]=this[i+e];return o},f.prototype.get=function(e){return console.log(\".get() is deprecated. Access using array indexes instead.\"),this.readUInt8(e)},f.prototype.set=function(e,t){return console.log(\".set() is deprecated. Access using array indexes instead.\"),this.writeUInt8(e,t)},f.prototype.readUInt8=function(e,t){if(t||(d(null!=e,\"missing offset\"),d(e<this.length,\"Trying to read beyond buffer length\")),!(e>=this.length))return this[e]},f.prototype.readUInt16LE=function(e,t){return o(this,e,!0,t)},f.prototype.readUInt16BE=function(e,t){return o(this,e,!1,t)},f.prototype.readUInt32LE=function(e,t){return u(this,e,!0,t)},f.prototype.readUInt32BE=function(e,t){return u(this,e,!1,t)},f.prototype.readInt8=function(e,t){if(t||(d(null!=e,\"missing offset\"),d(e<this.length,\"Trying to read beyond buffer length\")),!(e>=this.length))return 128&this[e]?-1*(255-this[e]+1):this[e]},f.prototype.readInt16LE=function(e,t){return _(this,e,!0,t)},f.prototype.readInt16BE=function(e,t){return _(this,e,!1,t)},f.prototype.readInt32LE=function(e,t){return E(this,e,!0,t)},f.prototype.readInt32BE=function(e,t){return E(this,e,!1,t)},f.prototype.readFloatLE=function(e,t){return I(this,e,!0,t)},f.prototype.readFloatBE=function(e,t){return I(this,e,!1,t)},f.prototype.readDoubleLE=function(e,t){return A(this,e,!0,t)},f.prototype.readDoubleBE=function(e,t){return A(this,e,!1,t)},f.prototype.writeUInt8=function(e,t,n){n||(d(null!=e,\"missing value\"),d(null!=t,\"missing offset\"),d(t<this.length,\"trying to write beyond buffer length\"),Y(e,255)),t>=this.length||(this[t]=e)},f.prototype.writeUInt16LE=function(e,t,n){s(this,e,t,!0,n)},f.prototype.writeUInt16BE=function(e,t,n){s(this,e,t,!1,n)},f.prototype.writeUInt32LE=function(e,t,n){l(this,e,t,!0,n)},f.prototype.writeUInt32BE=function(e,t,n){l(this,e,t,!1,n)},f.prototype.writeInt8=function(e,t,n){n||(d(null!=e,\"missing value\"),d(null!=t,\"missing offset\"),d(t<this.length,\"Trying to write beyond buffer length\"),F(e,127,-128)),t>=this.length||(0<=e?this.writeUInt8(e,t,n):this.writeUInt8(255+e+1,t,n))},f.prototype.writeInt16LE=function(e,t,n){B(this,e,t,!0,n)},f.prototype.writeInt16BE=function(e,t,n){B(this,e,t,!1,n)},f.prototype.writeInt32LE=function(e,t,n){L(this,e,t,!0,n)},f.prototype.writeInt32BE=function(e,t,n){L(this,e,t,!1,n)},f.prototype.writeFloatLE=function(e,t,n){U(this,e,t,!0,n)},f.prototype.writeFloatBE=function(e,t,n){U(this,e,t,!1,n)},f.prototype.writeDoubleLE=function(e,t,n){x(this,e,t,!0,n)},f.prototype.writeDoubleBE=function(e,t,n){x(this,e,t,!1,n)},f.prototype.fill=function(e,t,n){if(t=t||0,n=n||this.length,d(\"number\"==typeof(e=\"string\"==typeof(e=e||0)?e.charCodeAt(0):e)&&!isNaN(e),\"value is not a number\"),d(t<=n,\"end < start\"),n!==t&&0!==this.length){d(0<=t&&t<this.length,\"start out of bounds\"),d(0<=n&&n<=this.length,\"end out of bounds\");for(var r=t;r<n;r++)this[r]=e}},f.prototype.inspect=function(){for(var e=[],t=this.length,n=0;n<t;n++)if(e[n]=k(this[n]),n===H.INSPECT_MAX_BYTES){e[n+1]=\"...\";break}return\"<Buffer \"+e.join(\" \")+\">\"},f.prototype.toArrayBuffer=function(){if(\"undefined\"==typeof Uint8Array)throw new Error(\"Buffer.toArrayBuffer not supported in this browser\");if(f._useTypedArrays)return new f(this).buffer;for(var e=new Uint8Array(this.length),t=0,n=e.length;t<n;t+=1)e[t]=this[t];return e.buffer};var t=f.prototype;function S(e,t,n){return\"number\"!=typeof e?n:t<=(e=~~e)?t:0<=e||0<=(e+=t)?e:0}function j(e){return(e=~~Math.ceil(+e))<0?0:e}function C(e){return(Array.isArray||function(e){return\"[object Array]\"===Object.prototype.toString.call(e)})(e)}function k(e){return e<16?\"0\"+e.toString(16):e.toString(16)}function T(e){for(var t=[],n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<=127)t.push(e.charCodeAt(n));else for(var o=n,i=(55296<=r&&r<=57343&&n++,encodeURIComponent(e.slice(o,n+1)).substr(1).split(\"%\")),u=0;u<i.length;u++)t.push(parseInt(i[u],16))}return t}function M(e){return a.toByteArray(e)}function c(e,t,n,r){for(var o=0;o<r&&!(o+n>=t.length||o>=e.length);o++)t[o+n]=e[o];return o}function N(e){try{return decodeURIComponent(e)}catch(e){return String.fromCharCode(65533)}}function Y(e,t){d(\"number\"==typeof e,\"cannot write a non-number as a number\"),d(0<=e,\"specified a negative value for writing an unsigned value\"),d(e<=t,\"value is larger than maximum value for type\"),d(Math.floor(e)===e,\"value has a fractional component\")}function F(e,t,n){d(\"number\"==typeof e,\"cannot write a non-number as a number\"),d(e<=t,\"value larger than maximum allowed value\"),d(n<=e,\"value smaller than minimum allowed value\"),d(Math.floor(e)===e,\"value has a fractional component\")}function D(e,t,n){d(\"number\"==typeof e,\"cannot write a non-number as a number\"),d(e<=t,\"value larger than maximum allowed value\"),d(n<=e,\"value smaller than minimum allowed value\")}function d(e,t){if(!e)throw new Error(t||\"Failed assertion\")}f._augment=function(e){return e._isBuffer=!0,e._get=e.get,e._set=e.set,e.get=t.get,e.set=t.set,e.write=t.write,e.toString=t.toString,e.toLocaleString=t.toString,e.toJSON=t.toJSON,e.copy=t.copy,e.slice=t.slice,e.readUInt8=t.readUInt8,e.readUInt16LE=t.readUInt16LE,e.readUInt16BE=t.readUInt16BE,e.readUInt32LE=t.readUInt32LE,e.readUInt32BE=t.readUInt32BE,e.readInt8=t.readInt8,e.readInt16LE=t.readInt16LE,e.readInt16BE=t.readInt16BE,e.readInt32LE=t.readInt32LE,e.readInt32BE=t.readInt32BE,e.readFloatLE=t.readFloatLE,e.readFloatBE=t.readFloatBE,e.readDoubleLE=t.readDoubleLE,e.readDoubleBE=t.readDoubleBE,e.writeUInt8=t.writeUInt8,e.writeUInt16LE=t.writeUInt16LE,e.writeUInt16BE=t.writeUInt16BE,e.writeUInt32LE=t.writeUInt32LE,e.writeUInt32BE=t.writeUInt32BE,e.writeInt8=t.writeInt8,e.writeInt16LE=t.writeInt16LE,e.writeInt16BE=t.writeInt16BE,e.writeInt32LE=t.writeInt32LE,e.writeInt32BE=t.writeInt32BE,e.writeFloatLE=t.writeFloatLE,e.writeFloatBE=t.writeFloatBE,e.writeDoubleLE=t.writeDoubleLE,e.writeDoubleBE=t.writeDoubleBE,e.fill=t.fill,e.inspect=t.inspect,e.toArrayBuffer=t.toArrayBuffer,e}}.call(this,O(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},O(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/buffer/index.js\",\"/node_modules/gulp-browserify/node_modules/buffer\")},{\"base64-js\":2,buffer:3,ieee754:10,lYpoI2:11}],4:[function(c,d,e){!function(e,t,a,n,r,o,i,u,s){var a=c(\"buffer\").Buffer,f=4,l=new a(f);l.fill(0);d.exports={hash:function(e,t,n,r){for(var o=t(function(e,t){e.length%f!=0&&(n=e.length+(f-e.length%f),e=a.concat([e,l],n));for(var n,r=[],o=t?e.readInt32BE:e.readInt32LE,i=0;i<e.length;i+=f)r.push(o.call(e,i));return r}(e=a.isBuffer(e)?e:new a(e),r),8*e.length),t=r,i=new a(n),u=t?i.writeInt32BE:i.writeInt32LE,s=0;s<o.length;s++)u.call(i,o[s],4*s,!0);return i}}}.call(this,c(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},c(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/helpers.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{buffer:3,lYpoI2:11}],5:[function(v,e,_){!function(l,c,u,d,h,p,g,y,w){var u=v(\"buffer\").Buffer,e=v(\"./sha\"),t=v(\"./sha256\"),n=v(\"./rng\"),b={sha1:e,sha256:t,md5:v(\"./md5\")},s=64,a=new u(s);function r(e,n){var r=b[e=e||\"sha1\"],o=[];return r||i(\"algorithm:\",e,\"is not yet supported\"),{update:function(e){return u.isBuffer(e)||(e=new u(e)),o.push(e),e.length,this},digest:function(e){var t=u.concat(o),t=n?function(e,t,n){u.isBuffer(t)||(t=new u(t)),u.isBuffer(n)||(n=new u(n)),t.length>s?t=e(t):t.length<s&&(t=u.concat([t,a],s));for(var r=new u(s),o=new u(s),i=0;i<s;i++)r[i]=54^t[i],o[i]=92^t[i];return n=e(u.concat([r,n])),e(u.concat([o,n]))}(r,n,t):r(t);return o=null,e?t.toString(e):t}}}function i(){var e=[].slice.call(arguments).join(\" \");throw new Error([e,\"we accept pull requests\",\"http://github.com/dominictarr/crypto-browserify\"].join(\"\\n\"))}a.fill(0),_.createHash=function(e){return r(e)},_.createHmac=r,_.randomBytes=function(e,t){if(!t||!t.call)return new u(n(e));try{t.call(this,void 0,new u(n(e)))}catch(e){t(e)}};var o,f=[\"createCredentials\",\"createCipher\",\"createCipheriv\",\"createDecipher\",\"createDecipheriv\",\"createSign\",\"createVerify\",\"createDiffieHellman\",\"pbkdf2\"],m=function(e){_[e]=function(){i(\"sorry,\",e,\"is not implemented yet\")}};for(o in f)m(f[o],o)}.call(this,v(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},v(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/index.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./md5\":6,\"./rng\":7,\"./sha\":8,\"./sha256\":9,buffer:3,lYpoI2:11}],6:[function(w,b,e){!function(e,r,o,i,u,a,f,l,y){var t=w(\"./helpers\");function n(e,t){e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;for(var n=1732584193,r=-271733879,o=-1732584194,i=271733878,u=0;u<e.length;u+=16){var s=n,a=r,f=o,l=i,n=c(n,r,o,i,e[u+0],7,-680876936),i=c(i,n,r,o,e[u+1],12,-389564586),o=c(o,i,n,r,e[u+2],17,606105819),r=c(r,o,i,n,e[u+3],22,-1044525330);n=c(n,r,o,i,e[u+4],7,-176418897),i=c(i,n,r,o,e[u+5],12,1200080426),o=c(o,i,n,r,e[u+6],17,-1473231341),r=c(r,o,i,n,e[u+7],22,-45705983),n=c(n,r,o,i,e[u+8],7,1770035416),i=c(i,n,r,o,e[u+9],12,-1958414417),o=c(o,i,n,r,e[u+10],17,-42063),r=c(r,o,i,n,e[u+11],22,-1990404162),n=c(n,r,o,i,e[u+12],7,1804603682),i=c(i,n,r,o,e[u+13],12,-40341101),o=c(o,i,n,r,e[u+14],17,-1502002290),n=d(n,r=c(r,o,i,n,e[u+15],22,1236535329),o,i,e[u+1],5,-165796510),i=d(i,n,r,o,e[u+6],9,-1069501632),o=d(o,i,n,r,e[u+11],14,643717713),r=d(r,o,i,n,e[u+0],20,-373897302),n=d(n,r,o,i,e[u+5],5,-701558691),i=d(i,n,r,o,e[u+10],9,38016083),o=d(o,i,n,r,e[u+15],14,-660478335),r=d(r,o,i,n,e[u+4],20,-405537848),n=d(n,r,o,i,e[u+9],5,568446438),i=d(i,n,r,o,e[u+14],9,-1019803690),o=d(o,i,n,r,e[u+3],14,-187363961),r=d(r,o,i,n,e[u+8],20,1163531501),n=d(n,r,o,i,e[u+13],5,-1444681467),i=d(i,n,r,o,e[u+2],9,-51403784),o=d(o,i,n,r,e[u+7],14,1735328473),n=h(n,r=d(r,o,i,n,e[u+12],20,-1926607734),o,i,e[u+5],4,-378558),i=h(i,n,r,o,e[u+8],11,-2022574463),o=h(o,i,n,r,e[u+11],16,1839030562),r=h(r,o,i,n,e[u+14],23,-35309556),n=h(n,r,o,i,e[u+1],4,-1530992060),i=h(i,n,r,o,e[u+4],11,1272893353),o=h(o,i,n,r,e[u+7],16,-155497632),r=h(r,o,i,n,e[u+10],23,-1094730640),n=h(n,r,o,i,e[u+13],4,681279174),i=h(i,n,r,o,e[u+0],11,-358537222),o=h(o,i,n,r,e[u+3],16,-722521979),r=h(r,o,i,n,e[u+6],23,76029189),n=h(n,r,o,i,e[u+9],4,-640364487),i=h(i,n,r,o,e[u+12],11,-421815835),o=h(o,i,n,r,e[u+15],16,530742520),n=p(n,r=h(r,o,i,n,e[u+2],23,-995338651),o,i,e[u+0],6,-198630844),i=p(i,n,r,o,e[u+7],10,1126891415),o=p(o,i,n,r,e[u+14],15,-1416354905),r=p(r,o,i,n,e[u+5],21,-57434055),n=p(n,r,o,i,e[u+12],6,1700485571),i=p(i,n,r,o,e[u+3],10,-1894986606),o=p(o,i,n,r,e[u+10],15,-1051523),r=p(r,o,i,n,e[u+1],21,-2054922799),n=p(n,r,o,i,e[u+8],6,1873313359),i=p(i,n,r,o,e[u+15],10,-30611744),o=p(o,i,n,r,e[u+6],15,-1560198380),r=p(r,o,i,n,e[u+13],21,1309151649),n=p(n,r,o,i,e[u+4],6,-145523070),i=p(i,n,r,o,e[u+11],10,-1120210379),o=p(o,i,n,r,e[u+2],15,718787259),r=p(r,o,i,n,e[u+9],21,-343485551),n=g(n,s),r=g(r,a),o=g(o,f),i=g(i,l)}return Array(n,r,o,i)}function s(e,t,n,r,o,i){return g((t=g(g(t,e),g(r,i)))<<o|t>>>32-o,n)}function c(e,t,n,r,o,i,u){return s(t&n|~t&r,e,t,o,i,u)}function d(e,t,n,r,o,i,u){return s(t&r|n&~r,e,t,o,i,u)}function h(e,t,n,r,o,i,u){return s(t^n^r,e,t,o,i,u)}function p(e,t,n,r,o,i,u){return s(n^(t|~r),e,t,o,i,u)}function g(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}b.exports=function(e){return t.hash(e,n,16)}}.call(this,w(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},w(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/md5.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:11}],7:[function(e,l,t){!function(e,t,n,r,o,i,u,s,f){var a;l.exports=a||function(e){for(var t,n=new Array(e),r=0;r<e;r++)0==(3&r)&&(t=4294967296*Math.random()),n[r]=t>>>((3&r)<<3)&255;return n}}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/rng.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{buffer:3,lYpoI2:11}],8:[function(c,d,e){!function(e,t,n,r,o,s,a,f,l){var i=c(\"./helpers\");function u(l,c){l[c>>5]|=128<<24-c%32,l[15+(c+64>>9<<4)]=c;for(var e,t,n,r=Array(80),o=1732584193,i=-271733879,u=-1732584194,s=271733878,d=-1009589776,h=0;h<l.length;h+=16){for(var p=o,g=i,y=u,w=s,b=d,a=0;a<80;a++){r[a]=a<16?l[h+a]:v(r[a-3]^r[a-8]^r[a-14]^r[a-16],1);var f=m(m(v(o,5),(f=i,t=u,n=s,(e=a)<20?f&t|~f&n:!(e<40)&&e<60?f&t|f&n|t&n:f^t^n)),m(m(d,r[a]),(e=a)<20?1518500249:e<40?1859775393:e<60?-1894007588:-899497514)),d=s,s=u,u=v(i,30),i=o,o=f}o=m(o,p),i=m(i,g),u=m(u,y),s=m(s,w),d=m(d,b)}return Array(o,i,u,s,d)}function m(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function v(e,t){return e<<t|e>>>32-t}d.exports=function(e){return i.hash(e,u,20,!0)}}.call(this,c(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},c(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:11}],9:[function(c,d,e){!function(e,t,n,r,u,s,a,f,l){function b(e,t){var n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function o(e,l){var c,d=new Array(1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298),t=new Array(1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225),n=new Array(64);e[l>>5]|=128<<24-l%32,e[15+(l+64>>9<<4)]=l;for(var r,o,h=0;h<e.length;h+=16){for(var i=t[0],u=t[1],s=t[2],p=t[3],a=t[4],g=t[5],y=t[6],w=t[7],f=0;f<64;f++)n[f]=f<16?e[f+h]:b(b(b((o=n[f-2],m(o,17)^m(o,19)^v(o,10)),n[f-7]),(o=n[f-15],m(o,7)^m(o,18)^v(o,3))),n[f-16]),c=b(b(b(b(w,m(o=a,6)^m(o,11)^m(o,25)),a&g^~a&y),d[f]),n[f]),r=b(m(r=i,2)^m(r,13)^m(r,22),i&u^i&s^u&s),w=y,y=g,g=a,a=b(p,c),p=s,s=u,u=i,i=b(c,r);t[0]=b(i,t[0]),t[1]=b(u,t[1]),t[2]=b(s,t[2]),t[3]=b(p,t[3]),t[4]=b(a,t[4]),t[5]=b(g,t[5]),t[6]=b(y,t[6]),t[7]=b(w,t[7])}return t}var i=c(\"./helpers\"),m=function(e,t){return e>>>t|e<<32-t},v=function(e,t){return e>>>t};d.exports=function(e){return i.hash(e,o,32,!0)}}.call(this,c(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},c(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/crypto-browserify/sha256.js\",\"/node_modules/gulp-browserify/node_modules/crypto-browserify\")},{\"./helpers\":4,buffer:3,lYpoI2:11}],10:[function(e,t,f){!function(e,t,n,r,o,i,u,s,a){f.read=function(e,t,n,r,o){var i,u,l=8*o-r-1,c=(1<<l)-1,d=c>>1,s=-7,a=n?o-1:0,f=n?-1:1,o=e[t+a];for(a+=f,i=o&(1<<-s)-1,o>>=-s,s+=l;0<s;i=256*i+e[t+a],a+=f,s-=8);for(u=i&(1<<-s)-1,i>>=-s,s+=r;0<s;u=256*u+e[t+a],a+=f,s-=8);if(0===i)i=1-d;else{if(i===c)return u?NaN:1/0*(o?-1:1);u+=Math.pow(2,r),i-=d}return(o?-1:1)*u*Math.pow(2,i-r)},f.write=function(e,t,l,n,r,c){var o,i,u=8*c-r-1,s=(1<<u)-1,a=s>>1,d=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,f=n?0:c-1,h=n?1:-1,c=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(i=isNaN(t)?1:0,o=s):(o=Math.floor(Math.log(t)/Math.LN2),t*(n=Math.pow(2,-o))<1&&(o--,n*=2),2<=(t+=1<=o+a?d/n:d*Math.pow(2,1-a))*n&&(o++,n/=2),s<=o+a?(i=0,o=s):1<=o+a?(i=(t*n-1)*Math.pow(2,r),o+=a):(i=t*Math.pow(2,a-1)*Math.pow(2,r),o=0));8<=r;e[l+f]=255&i,f+=h,i/=256,r-=8);for(o=o<<r|i,u+=r;0<u;e[l+f]=255&o,f+=h,o/=256,u-=8);e[l+f-h]|=128*c}}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/ieee754/index.js\",\"/node_modules/gulp-browserify/node_modules/ieee754\")},{buffer:3,lYpoI2:11}],11:[function(e,h,t){!function(e,t,n,r,o,f,l,c,d){var i,u,s;function a(){}(e=h.exports={}).nextTick=(u=\"undefined\"!=typeof window&&window.setImmediate,s=\"undefined\"!=typeof window&&window.postMessage&&window.addEventListener,u?function(e){return window.setImmediate(e)}:s?(i=[],window.addEventListener(\"message\",function(e){var t=e.source;t!==window&&null!==t||\"process-tick\"!==e.data||(e.stopPropagation(),0<i.length&&i.shift()())},!0),function(e){i.push(e),window.postMessage(\"process-tick\",\"*\")}):function(e){setTimeout(e,0)}),e.title=\"browser\",e.browser=!0,e.env={},e.argv=[],e.on=a,e.addListener=a,e.once=a,e.off=a,e.removeListener=a,e.removeAllListeners=a,e.emit=a,e.binding=function(e){throw new Error(\"process.binding is not supported\")},e.cwd=function(){return\"/\"},e.chdir=function(e){throw new Error(\"process.chdir is not supported\")}}.call(this,e(\"lYpoI2\"),\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:{},e(\"buffer\").Buffer,arguments[3],arguments[4],arguments[5],arguments[6],\"/node_modules/gulp-browserify/node_modules/process/browser.js\",\"/node_modules/gulp-browserify/node_modules/process\")},{buffer:3,lYpoI2:11}]},{},[1])(1)});","import hash from \"object-hash\";\nimport { GeoPoint } from \"@rebasepro/types\";\n\n/** @private is the value an empty array? */\nexport const isEmptyArray = (value?: unknown) =>\n Array.isArray(value) && value.length === 0;\n\n/** @private is the given object a Function? */\nexport const isFunction = (obj: unknown): obj is Function =>\n typeof obj === \"function\";\n\n/** @private is the given object an integer? */\nexport const isInteger = (obj: unknown): boolean =>\n String(Math.floor(Number(obj))) === String(obj);\n\n/** @private is the given object a NaN? */\n// eslint-disable-next-line no-self-compare\nexport const isNaN = (obj: unknown): boolean => obj !== obj;\n\n/**\n * Deeply get a value from an object via its path.\n */\nexport function getIn(\n obj: Record<string, unknown> | unknown[] | unknown,\n key: string | string[],\n def?: unknown,\n p = 0\n) {\n const path = toPath(key);\n while (obj && p < path.length) {\n obj = (obj as Record<string, unknown>)[path[p++]];\n }\n\n // check if path is not in the end\n if (p !== path.length && !obj) {\n return def;\n }\n\n return obj === undefined ? def : obj;\n}\n\nexport function setIn<T>(obj: T, path: string, value: unknown): T {\n const res = clone(obj) as Record<string, unknown>;\n let resVal: Record<string, unknown> = res;\n let i = 0;\n const pathArray = toPath(path);\n\n for (; i < pathArray.length - 1; i++) {\n const currentPath: string = pathArray[i];\n const currentObj = getIn(obj as Record<string, unknown>, pathArray.slice(0, i + 1));\n\n if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {\n resVal = resVal[currentPath] = clone(currentObj) as Record<string, unknown>;\n } else {\n const nextPath: string = pathArray[i + 1];\n resVal = resVal[currentPath] =\n (isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {}) as Record<string, unknown>;\n }\n }\n\n // Return original object if new value is the same as current\n if ((i === 0 ? obj as Record<string, unknown> : resVal)[pathArray[i]] === value) {\n return obj;\n }\n\n if (value === undefined) {\n delete resVal[pathArray[i]];\n } else {\n resVal[pathArray[i]] = value;\n }\n\n // If the path array has a single element, the loop did not run.\n // Deleting on `resVal` had no effect in this scenario, so we delete on the result instead.\n if (i === 0 && value === undefined) {\n delete res[pathArray[i]];\n }\n\n return res as T;\n}\n\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) {\n return [...value] as unknown as T;\n } else if (typeof value === \"object\" && value !== null) {\n return { ...value } as T;\n } else {\n return value; // This is for primitive types which do not need cloning.\n }\n}\n\nfunction toPath(value: string | string[]) {\n if (Array.isArray(value)) return value; // Already in path array form.\n // Replace brackets with dots, remove leading/trailing dots, then split by dot.\n return value.replace(/\\[(\\d+)]/g, \".$1\").replace(/^\\./, \"\").replace(/\\.$/, \"\").split(\".\");\n}\n\n\nexport const pick: <T extends Record<string, unknown>>(obj: T, ...args: (keyof T)[]) => Partial<T> = <T extends Record<string, unknown>>(obj: T, ...args: (keyof T)[]) => ({\n ...args.reduce<Record<string, unknown>>((res, key) => ({\n ...res,\n [key as string]: obj[key as string]\n }), {})\n}) as Partial<T>;\n\nexport function isObject(item: unknown): item is Record<string, unknown> {\n return !!item && typeof item === \"object\" && !Array.isArray(item);\n}\n\nexport function isPlainObject(obj: unknown): obj is Record<string, unknown> {\n // 1. Rule out non-objects, null, and arrays\n if (typeof obj !== \"object\" || obj === null || Array.isArray(obj)) {\n return false;\n }\n\n // 2. Get the object's direct prototype\n const proto = Object.getPrototypeOf(obj);\n\n // 3. A plain object's direct prototype is Object.prototype\n return proto === Object.prototype;\n}\n\nexport function mergeDeep<T extends object, U extends object>(\n target: T,\n source: U,\n ignoreUndefined: boolean = false\n): T & U {\n // If target is not a true object (e.g., null, array, primitive), return target itself.\n if (!isObject(target)) {\n return target as T & U;\n }\n\n // Create a shallow copy of the target to avoid modifying the original object.\n const output = { ...target };\n\n // If source is not a true object, there's nothing to merge from it.\n // Return the shallow copy of target.\n if (!isObject(source)) {\n return output as T & U;\n }\n\n // Iterate over keys in the source object.\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const outputValue = (output as Record<string, unknown>)[key]; // Current value in our merged object (originating from target)\n\n // Skip if source value is undefined and ignoreUndefined is true.\n // This handles both not adding new undefined properties and not overwriting existing properties with undefined.\n if (ignoreUndefined && sourceValue === undefined) {\n continue;\n }\n\n if ((sourceValue as unknown) instanceof Date) {\n // If source value is a Date, create a new Date instance.\n (output as Record<string, unknown>)[key] = new Date((sourceValue as unknown as Date).getTime());\n } else if (Array.isArray(sourceValue)) {\n if (Array.isArray(outputValue)) {\n const newArray = [];\n const maxLength = Math.max(outputValue.length, sourceValue.length);\n for (let i = 0; i < maxLength; i++) {\n const sourceItem = sourceValue[i];\n const targetItem = outputValue[i];\n\n if (i >= sourceValue.length) { // source is shorter\n newArray[i] = targetItem;\n } else if (i >= outputValue.length) { // target is shorter\n newArray[i] = sourceItem;\n } else if (sourceItem === null) {\n newArray[i] = targetItem;\n } else if (isPlainObject(sourceItem) && isPlainObject(targetItem)) {\n // Only recursively merge plain objects, preserve class instances\n newArray[i] = mergeDeep(targetItem, sourceItem, ignoreUndefined);\n } else {\n // For class instances and primitives, use source directly\n newArray[i] = sourceItem;\n }\n }\n (output as Record<string, unknown>)[key] = newArray;\n } else {\n // If output's value (from target) is not an array,\n // overwrite with a shallow copy of the source array.\n (output as Record<string, unknown>)[key] = [...sourceValue];\n }\n } else if (isPlainObject(sourceValue)) {\n // If source value is a plain object (not a class instance like EntityReference, GeoPoint, etc.):\n if (isPlainObject(outputValue)) {\n // If the corresponding value in output (from target) is also a plain object, recurse.\n // Ensure the ignoreUndefined flag is passed down.\n (output as Record<string, unknown>)[key] = mergeDeep(outputValue as Record<string, unknown>, sourceValue, ignoreUndefined);\n } else {\n // If output's value (from target) is not a plain object (e.g., null, primitive, class instance, or key didn't exist in original target),\n // overwrite with the source object.\n (output as Record<string, unknown>)[key] = sourceValue;\n }\n } else if (isObject(sourceValue)) {\n // If source value is a class instance (not a plain object), use it directly to preserve prototype\n (output as Record<string, unknown>)[key] = sourceValue;\n } else {\n // If source value is a primitive, null, or undefined (and not ignored).\n (output as Record<string, unknown>)[key] = sourceValue;\n }\n }\n }\n\n return output as T & U;\n}\n\nexport function getValueInPath(o: object | undefined, path: string): unknown {\n if (!o) return undefined;\n if (typeof o === \"object\") {\n if (path in o) {\n return (o as Record<string, unknown>)[path];\n }\n if (path.includes(\".\") || path.includes(\"[\")) {\n let pathSegments = path.split(/[.[]/);\n if (path.includes(\"[\")) {\n pathSegments = pathSegments.map(segment => segment.replace(\"]\", \"\"));\n }\n const firstSegment = pathSegments[0];\n const isArrayAndIndexExists = Array.isArray((o as Record<string, unknown>)[firstSegment]) && !isNaN(parseInt(pathSegments[1]));\n const nextObject = isArrayAndIndexExists\n ? ((o as Record<string, unknown>)[firstSegment] as unknown[])[parseInt(pathSegments[1])]\n : (o as Record<string, unknown>)[firstSegment];\n\n const nextPath = pathSegments.slice(isArrayAndIndexExists ? 2 : 1).join(\".\");\n if (nextPath === \"\")\n return nextObject;\n return getValueInPath(nextObject as object | undefined, nextPath);\n }\n }\n return undefined;\n}\n\nexport function removeInPath(o: object, path: string): object | undefined {\n let currentObject = { ...o };\n const parts = path.split(\".\");\n const last = parts.pop();\n for (const part of parts) {\n currentObject = (currentObject as Record<string, unknown>)[part] as Record<string, unknown>;\n }\n if (last)\n delete (currentObject as Record<string, unknown>)[last];\n return currentObject;\n}\n\nexport function removeFunctions(o: unknown): unknown {\n if (o === undefined) return undefined;\n if (o === null) return null;\n if (typeof o === \"object\") {\n // Handle arrays first - map over them recursively\n if (Array.isArray(o)) {\n return o.map(v => removeFunctions(v));\n }\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(o)) {\n return o;\n }\n return Object.entries(o)\n .filter(([_, value]) => typeof value !== \"function\")\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return { [key]: value.map(v => removeFunctions(v)) };\n } else if (typeof value === \"object\") {\n return { [key]: removeFunctions(value) };\n } else return { [key]: value };\n })\n .reduce((a, b) => ({ ...a, ...b }), {});\n }\n return o;\n}\n\nexport function getHashValue<T>(v: T): string | null {\n if (!v) return null;\n if (typeof v === \"object\" && v !== null) {\n if (\"id\" in v)\n return String((v as Record<string, unknown>).id);\n else if (v instanceof Date)\n return v.toLocaleString();\n else if (v instanceof GeoPoint)\n return hash(v as unknown as Record<string, unknown>);\n }\n return hash(v as object, { ignoreUnknown: true });\n}\n\nexport function removeUndefined(value: unknown, removeEmptyStrings?: boolean): unknown {\n if (typeof value === \"function\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v: unknown) => removeUndefined(v, removeEmptyStrings));\n }\n if (typeof value === \"object\") {\n if (value === null)\n return value;\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(value)) {\n return value;\n }\n const res: Record<string, unknown> = {};\n Object.keys(value).forEach((key) => {\n if (!isEmptyObject(value as object)) {\n const childRes = removeUndefined((value as Record<string, unknown>)[key], removeEmptyStrings);\n const isString = typeof childRes === \"string\";\n const shouldKeepIfString = !removeEmptyStrings || (removeEmptyStrings && !isString) || (removeEmptyStrings && isString && childRes !== \"\");\n if (childRes !== undefined && !isEmptyObject(childRes as object) && shouldKeepIfString)\n res[key] = childRes;\n }\n });\n return res;\n }\n return value;\n}\n\nexport function removeNulls(value: unknown): unknown {\n if (typeof value === \"function\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v: unknown) => removeNulls(v));\n }\n if (typeof value === \"object\") {\n if (value === null)\n return value;\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(value)) {\n return value;\n }\n const res: Record<string, unknown> = {};\n const obj = value as Record<string, unknown>;\n Object.keys(obj).forEach((key) => {\n if (obj[key] !== null)\n res[key] = removeNulls(obj[key]);\n });\n return res;\n }\n return value;\n}\n\nexport function isEmptyObject(obj: object) {\n return obj &&\n Object.getPrototypeOf(obj) === Object.prototype &&\n Object.keys(obj).length === 0\n}\n\nexport function removePropsIfExisting(source: Record<string, unknown> | unknown[], comparison: Record<string, unknown> | unknown[]) {\n const isObject = (val: unknown): val is Record<string, unknown> => typeof val === \"object\" && val !== null;\n const isArray = (val: unknown): val is unknown[] => Array.isArray(val);\n\n if (!isObject(source) || !isObject(comparison)) {\n return source;\n }\n\n const res = isArray(source) ? [...source] : { ...source };\n\n if (isArray(res)) {\n for (let i = res.length - 1; i >= 0; i--) {\n if (res[i] === comparison[i]) {\n res.splice(i, 1);\n } else if (isObject(res[i]) && isObject(comparison[i])) {\n res[i] = removePropsIfExisting(res[i] as Record<string, unknown>, (comparison as unknown as unknown[])[i] as Record<string, unknown>);\n }\n }\n } else {\n Object.keys(comparison).forEach(key => {\n if (key in res) {\n if (isObject(res[key]) && isObject(comparison[key])) {\n res[key] = removePropsIfExisting(res[key], comparison[key]);\n } else if (res[key] === comparison[key]) {\n delete res[key];\n }\n }\n });\n }\n\n return res;\n}\n","import { toSnakeCase } from \"./strings\";\n\n/**\n * Generates a foreign key column name from a given string, typically a collection slug or name.\n * It converts the name to snake_case, attempts to singularize it by removing a trailing 's'\n * (a common convention for collection names), and appends '_id'.\n *\n * @param name The base name to convert to a foreign key.\n * @returns A foreign key name in the format 'singular_name_id'.\n *\n * @example\n * // returns \"user_id\"\n * generateForeignKeyName(\"users\")\n *\n * @example\n * // returns \"post_id\"\n * generateForeignKeyName(\"posts\")\n *\n * @example\n * // returns \"product_id\"\n * generateForeignKeyName(\"Product\")\n *\n */\nexport function generateForeignKeyName(name: string): string {\n const snakeCaseName = toSnakeCase(name);\n // A simple heuristic to singularize a plural name, which is a common convention.\n const singularName = snakeCaseName.endsWith(\"s\") ? snakeCaseName.slice(0, -1) : snakeCaseName;\n return `${singularName}_id`;\n}\n\n","import { EnumValueConfig, EnumValues } from \"@rebasepro/types\";\n\nexport function enumToObjectEntries(enumValues: EnumValues): EnumValueConfig[] {\n if (Array.isArray(enumValues)) {\n return enumValues;\n } else {\n return Object.entries(enumValues).map(([id, value]) => {\n if (typeof value === \"string\") {\n return {\n id,\n label: value\n }\n } else {\n return {\n ...value,\n id\n }\n }\n });\n }\n}\n\nexport function getLabelOrConfigFrom(enumValues: EnumValueConfig[], key?: string | number): EnumValueConfig | undefined {\n if (key === null || key === undefined) return undefined;\n return enumValues.find((entry) => String(entry.id) === String(key));\n}\n","import {\n ArrayProperty,\n AuthController,\n EntityCollection,\n EnumValueConfig,\n EnumValues,\n NumberProperty,\n Properties,\n Property,\n Relation,\n RelationProperty,\n StringProperty,\n isPostgresCollection,\n isFirebaseCollection,\n} from \"@rebasepro/types\";\n\ntype PropertyConfig = { property: unknown; [key: string]: unknown };\nimport { isPropertyBuilder } from \"./entities\";\nimport { enumToObjectEntries } from \"./enums\";\nimport { DEFAULT_ONE_OF_TYPE } from \"./common\";\nimport { isDefaultFieldConfigId } from \"@rebasepro/utils\";\nimport { getIn, mergeDeep } from \"@rebasepro/utils\";\n\n/**\n * Resolve property builders, enums and arrays.\n */\n\nexport type ResolvePropertyProps<M extends Record<string, unknown> = Record<string, unknown>> = {\n property: Property\n propertyKey?: string,\n values?: Partial<M>,\n previousValues?: Partial<M>,\n path?: string,\n entityId?: string | number,\n index?: number,\n propertyConfigs?: Record<string, PropertyConfig>;\n ignoreMissingFields?: boolean;\n authController: AuthController;\n}\n\nexport function resolveProperty<M extends Record<string, unknown> = Record<string, unknown>>(props: ResolvePropertyProps<M>): Property | null {\n\n const {\n property,\n ignoreMissingFields = false,\n ...rest\n } = props;\n\n let resultProperty: Property;\n\n if (isPropertyBuilder(property)) {\n const path = rest.path;\n if (!path)\n throw Error(\"Trying to resolve a property builder without specifying the entity path\");\n\n const usedPropertyValue = rest.propertyKey ? getIn(rest.values, rest.propertyKey) : undefined;\n const dynamicProps = property.dynamicProps?.({\n ...rest,\n path,\n propertyValue: usedPropertyValue,\n values: rest.values ?? {},\n previousValues: rest.previousValues ?? rest.values ?? {}\n });\n resultProperty = mergeDeep(property, dynamicProps ?? {});\n } else {\n resultProperty = property as Property;\n }\n\n // Apply dynamic properties if they exist\n if (resultProperty.dynamicProps) {\n const path = rest.path;\n if (!path)\n throw Error(\"Trying to resolve dynamicProps without specifying the entity path\");\n\n const usedPropertyValue = rest.propertyKey ? getIn(rest.values, rest.propertyKey) : undefined;\n const dynamicPropsResult = resultProperty.dynamicProps({\n ...rest,\n path,\n propertyValue: usedPropertyValue,\n values: rest.values ?? {},\n previousValues: rest.previousValues ?? rest.values ?? {}\n });\n\n if (dynamicPropsResult) {\n resultProperty = mergeDeep(resultProperty, dynamicPropsResult);\n }\n }\n\n let resolvedProperty: Property | null;\n\n if (resultProperty?.type === \"map\" && resultProperty.properties) {\n const properties = resolveProperties({\n ignoreMissingFields,\n ...rest,\n properties: resultProperty.properties,\n });\n resolvedProperty = {\n ...resultProperty,\n properties\n } as Property;\n } else if (resultProperty?.type === \"array\") {\n resolvedProperty = resultProperty;\n } else if ((resultProperty?.type === \"string\" || resultProperty?.type === \"number\") && resultProperty.enum) {\n resolvedProperty = resolvePropertyEnum(resultProperty);\n } else {\n resolvedProperty = resultProperty;\n }\n\n if (resolvedProperty?.propertyConfig && !isDefaultFieldConfigId(resolvedProperty.propertyConfig)) {\n const cmsFields = rest.propertyConfigs;\n if (!cmsFields && !ignoreMissingFields) {\n throw Error(`Trying to resolve a property with key '${resolvedProperty.propertyConfig}' that inherits from a custom property config but no custom property configs were provided. Use the property 'propertyConfigs' in your app config to provide them`);\n }\n const customField: PropertyConfig | undefined = cmsFields?.[resolvedProperty.propertyConfig];\n if (!customField) {\n console.warn(`Trying to resolve a property with key '${resolvedProperty.propertyConfig}' that inherits from a custom property config but no custom property config with that key was found. Check the 'propertyConfigs' in your app config`)\n return resolvedProperty;\n }\n if (customField.property) {\n const restConfigProperty = { ...customField.property } as Record<string, unknown>;\n delete restConfigProperty.propertyConfig;\n const customFieldProperty = resolveProperty({\n property: { name: \"\", ...restConfigProperty } as Property,\n ignoreMissingFields,\n ...rest\n });\n if (customFieldProperty) {\n resolvedProperty = mergeDeep(customFieldProperty, resolvedProperty);\n }\n }\n\n }\n\n return resolvedProperty;\n}\n\nexport function resolveRelationProperty(property: RelationProperty, relations: Relation[]) {\n // find the relation by name\n const relation = relations.find((rel) => rel.relationName === property.relationName);\n if (!relation) {\n throw Error(`Relation ${property.relationName} not found`);\n }\n return {\n ...property,\n relation: relation\n } as RelationProperty;\n\n}\n\n/**\n * Resolve enum aliases for a string or number property\n * @param property\n */\nexport function resolvePropertyEnum(property: StringProperty | NumberProperty): StringProperty | NumberProperty {\n if (typeof property.enum === \"object\") {\n return {\n ...property,\n enum: enumToObjectEntries(property.enum)?.filter((value) => value && (value.id || value.id === 0) && value.label) ?? [],\n };\n }\n return property as StringProperty | NumberProperty;\n}\n\n/**\n * Resolve enums and arrays for properties\n * @param properties\n * @param value\n */\nexport function resolveProperties<M extends Record<string, unknown>>({\n propertyKey,\n properties,\n ignoreMissingFields,\n ...props\n}: {\n propertyKey?: string,\n properties: Properties,\n values?: Partial<M>,\n previousValues?: Partial<M>,\n path?: string,\n entityId?: string | number,\n index?: number,\n propertyConfigs?: Record<string, PropertyConfig>;\n ignoreMissingFields?: boolean;\n authController: AuthController;\n}): Properties {\n return Object.entries<Property>(properties as Record<string, Property>)\n .map(([key, property]) => {\n const childResolvedProperty = resolveProperty({\n propertyKey: propertyKey ? `${propertyKey}.${key}` : undefined,\n property: property,\n ignoreMissingFields,\n ...props\n });\n if (!childResolvedProperty) return {};\n return {\n [key]: childResolvedProperty\n };\n })\n .filter((a) => a !== null)\n .reduce((a, b) => ({ ...a, ...b }), {}) as Properties;\n}\n\nexport function resolveArrayProperties<M>({\n propertyKey,\n property,\n ignoreMissingFields = false,\n ...props\n}: {\n propertyKey?: string,\n property: ArrayProperty,\n values?: Partial<M>,\n previousValues?: Partial<M>,\n path?: string,\n entityId?: string | number,\n index?: number,\n propertyConfigs?: Record<string, PropertyConfig>;\n ignoreMissingFields?: boolean;\n authController: AuthController;\n}): Property[] {\n const propertyValue = propertyKey ? getIn(props.values, propertyKey) : undefined;\n\n if (property.of) {\n if (Array.isArray(property.of)) {\n return property.of.map((p, index) => {\n return resolveProperty({\n propertyKey: `${propertyKey}.${index}`,\n property: p as Property,\n ignoreMissingFields,\n ...props,\n index,\n });\n }) as Property[];\n } else {\n const of = property.of;\n const resolvedProperties = getArrayResolvedProperties({\n propertyValue,\n propertyKey,\n property,\n ignoreMissingFields,\n ...props\n });\n const {\n values,\n previousValues,\n ...rest\n } = props;\n const ofProperty = resolveProperty({ // we don't want to pass the values of the parent entity\n property: of,\n ignoreMissingFields,\n ...rest\n });\n if (!ofProperty && !ignoreMissingFields)\n throw Error(\"When using a property builder as the 'of' prop of an ArrayProperty, you must return a valid child property\")\n return resolvedProperties;\n }\n } else if (property.oneOf) {\n const typeField = property.oneOf?.typeField ?? DEFAULT_ONE_OF_TYPE;\n const resolvedProperties: Property[] = Array.isArray(propertyValue)\n ? propertyValue.map((v, index) => {\n const type = v && v[typeField];\n const childProperty = property.oneOf?.properties[type];\n if (!type || !childProperty) return null;\n return resolveProperty({\n propertyKey: `${propertyKey}.${index}`,\n property: childProperty,\n ignoreMissingFields,\n ...props\n });\n }).filter(e => Boolean(e)) as Property[]\n : [];\n return resolvedProperties;\n } else if (!(\"Field\" in property && property.Field)) {\n throw Error(`The array property (${propertyKey}) needs to declare an 'of' or a 'oneOf' property, or provide a custom \\`Field\\` component`);\n } else {\n return [];\n }\n\n}\n\nexport function getArrayResolvedProperties({\n propertyKey,\n propertyValue,\n property,\n ...props\n}: {\n propertyValue: unknown,\n propertyKey?: string,\n property: ArrayProperty,\n ignoreMissingFields: boolean,\n values?: object;\n previousValues?: object;\n path?: string;\n entityId?: string | number;\n index?: number;\n propertyConfigs?: Record<string, PropertyConfig>;\n authController: AuthController;\n}) {\n\n const of = property.of;\n if (!of)\n throw Error(\n `Trying to resolve an array property (${propertyKey}) without providing an 'of' property`\n )\n return Array.isArray(propertyValue)\n ? propertyValue.map((v: unknown, index: number) => {\n return resolveProperty({\n propertyKey: `${propertyKey}.${index}`,\n property: Array.isArray(of) ? of[index] : of,\n ...props,\n index\n });\n }).filter(e => Boolean(e)) as Property[]\n : [];\n}\n\nexport function resolveEnumValues(input: EnumValues): EnumValueConfig[] | undefined {\n if (typeof input === \"object\") {\n return Object.entries(input).map(([id, value]) =>\n (typeof value === \"string\"\n ? {\n id,\n label: value\n }\n : value));\n } else if (Array.isArray(input)) {\n return input as EnumValueConfig[];\n } else {\n return undefined;\n }\n}\n\n\n\nexport function getSubcollections<M extends Record<string, unknown> = Record<string, unknown>>(collection: EntityCollection<M>): EntityCollection<Record<string, unknown>>[] {\n if (collection.childCollections) {\n return collection.childCollections() ?? [];\n }\n \n if (isFirebaseCollection(collection) && collection.subcollections) {\n return collection.subcollections() ?? [];\n }\n \n if (isPostgresCollection(collection) && collection.relations) {\n const manyRelations = collection.relations.filter(r => r.cardinality === \"many\");\n return manyRelations.map(r => {\n const target = r.target();\n return r.overrides ? mergeDeep(target, r.overrides) : target;\n });\n }\n \n return [];\n}\n","import { EntityCallbacks, Properties } from \"@rebasepro/types\";\n\n/**\n * Helper function to recursively check if there are any callbacks in the properties.\n */\nfunction hasPropertyCallbacks(properties: Properties, callbackName: \"afterRead\" | \"beforeSave\"): boolean {\n if (!properties) return false;\n for (const property of Object.values(properties)) {\n if (property.callbacks?.[callbackName]) return true;\n if (property.type === \"map\" && property.properties) {\n if (hasPropertyCallbacks(property.properties, callbackName)) return true;\n } else if (property.type === \"array\" && property.of) {\n const ofs = Array.isArray(property.of) ? property.of : [property.of];\n for (const of of ofs) {\n if (of.callbacks?.[callbackName]) return true;\n if (of.type === \"map\" && of.properties && hasPropertyCallbacks(of.properties, callbackName)) return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Recursively process properties to apply field-level hooks.\n */\nasync function processProperties(\n properties: Properties,\n values: Record<string, unknown>,\n previousValues: Record<string, unknown>,\n propsContext: unknown,\n callbackName: \"afterRead\" | \"beforeSave\"\n): Promise<Record<string, unknown>> {\n if (!values || typeof values !== \"object\") return values;\n\n const result = { ...values };\n\n for (const [key, property] of Object.entries(properties)) {\n if (result[key] === undefined) continue;\n\n let currentValue = result[key];\n const previousValue = previousValues?.[key];\n\n // 1. Array Property\n if (property.type === \"array\" && Array.isArray(currentValue)) {\n // We only support traversing single-type arrays for hooks currently to avoid complex union matching\n if (property.of && !Array.isArray(property.of)) {\n currentValue = await Promise.all(currentValue.map(async (item, index) => {\n const prevItem = Array.isArray(previousValue) ? previousValue[index] : undefined;\n // Mock a properties object to process a single item\n const singlePropData = { \"_tmp\": property.of } as Properties;\n const res = await processProperties(singlePropData, { \"_tmp\": item }, { \"_tmp\": prevItem }, propsContext, callbackName);\n return res[\"_tmp\"];\n }));\n }\n }\n // 2. Map Property\n else if (property.type === \"map\" && property.properties && typeof currentValue === \"object\") {\n currentValue = await processProperties(property.properties, currentValue as Record<string, unknown>, (previousValue ?? {}) as Record<string, unknown>, propsContext, callbackName);\n }\n\n // 3. Property's own callback\n if (property.callbacks?.[callbackName]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cbRes = await Promise.resolve(property.callbacks[callbackName]({\n ...(propsContext as Record<string, unknown>),\n value: currentValue,\n previousValue\n } as never));\n if (cbRes !== undefined) {\n currentValue = cbRes;\n }\n }\n\n result[key] = currentValue;\n }\n return result;\n}\n\n/**\n * Helper function to extract field-level PropertyCallbacks from a properties schema\n * and wrap them into an EntityCallbacks object recursively.\n */\nexport const buildPropertyCallbacks = (properties: Properties): EntityCallbacks | undefined => {\n if (!properties) return undefined;\n\n const propertyCallbacks: EntityCallbacks = {};\n\n if (hasPropertyCallbacks(properties, \"afterRead\")) {\n propertyCallbacks.afterRead = async (props) => {\n const processedValues = await processProperties(\n properties,\n props.entity.values as Record<string, unknown>,\n props.entity.values as Record<string, unknown>,\n props as unknown,\n \"afterRead\"\n );\n return { ...props.entity, values: processedValues };\n };\n }\n\n if (hasPropertyCallbacks(properties, \"beforeSave\")) {\n propertyCallbacks.beforeSave = async (props) => {\n return await processProperties(\n properties,\n props.values as Record<string, unknown>,\n (props.previousValues ?? {}) as Record<string, unknown>,\n props as unknown,\n \"beforeSave\"\n );\n };\n }\n\n return Object.keys(propertyCallbacks).length > 0 ? propertyCallbacks : undefined;\n};\n","import { EntityCollection, isPostgresCollection, PostgresCollection, Property, Relation } from \"@rebasepro/types\";\nimport { toSnakeCase } from \"@rebasepro/utils\";\nimport { generateForeignKeyName } from \"@rebasepro/utils\";\n\nexport function sanitizeRelation(relation: Partial<Relation>, sourceCollection: PostgresCollection): Relation {\n if (!relation.target) {\n throw new Error(\"Relation is missing a `target` collection.\");\n }\n const targetCollection = relation.target();\n\n const newRelation: Partial<Relation> = { ...relation };\n\n // 1. Default relationName from target collection slug\n if (!newRelation.relationName) {\n newRelation.relationName = toSnakeCase(targetCollection.slug);\n }\n\n // 2. Infer or default direction if absent\n if (!newRelation.direction) {\n if (newRelation.foreignKeyOnTarget) newRelation.direction = \"inverse\";\n else if (newRelation.through) newRelation.direction = \"owning\";\n else if (newRelation.cardinality === \"many\") newRelation.direction = \"inverse\"; // Default has-many to be inverse\n else newRelation.direction = \"owning\"; // Default all others to owning\n }\n\n // Do not default keys if a custom joinPath is provided; it's an advanced override.\n if (!newRelation.joinPath) {\n const sourceName = toSnakeCase(sourceCollection.slug ?? sourceCollection.name);\n\n // 3. Default keys based on the relation type (cardinality and direction)\n if (newRelation.cardinality === \"one\" && newRelation.direction === \"owning\") {\n // Belongs-to / many-to-one\n if (!newRelation.localKey) {\n newRelation.localKey = generateForeignKeyName(newRelation.relationName);\n }\n } else if (newRelation.cardinality === \"one\" && newRelation.direction === \"inverse\") {\n // Inverse one-to-one: the foreign key is on the target table pointing back to this collection\n if (!newRelation.foreignKeyOnTarget) {\n // First, try to find the corresponding owning relation's localKey on the target collection\n let foundForeignKey = false;\n\n try {\n // Look for an owning relation on the target that points back to this collection\n const targetRelations = (targetCollection as PostgresCollection).relations || [];\n for (const targetRel of targetRelations) {\n if (targetRel.direction === \"owning\" &&\n targetRel.cardinality === \"one\" &&\n targetRel.localKey) {\n try {\n const targetRelTarget = targetRel.target();\n if (targetRelTarget.slug === sourceCollection.slug) {\n // Found the corresponding owning relation, use its localKey\n newRelation.foreignKeyOnTarget = targetRel.localKey;\n foundForeignKey = true;\n break;\n }\n } catch (e) {\n // Continue looking if we can't resolve this target\n continue;\n }\n }\n }\n } catch (e) {\n // If we can't inspect the target collection, fall back to naming convention\n }\n\n // If we couldn't find an explicit foreign key, fall back to naming convention\n if (!foundForeignKey) {\n const keyPrefix = newRelation.inverseRelationName\n ? toSnakeCase(newRelation.inverseRelationName)\n : sourceName;\n newRelation.foreignKeyOnTarget = generateForeignKeyName(keyPrefix);\n }\n }\n } else if (newRelation.cardinality === \"many\" && newRelation.direction === \"inverse\") {\n // This could be either one-to-many or many-to-many inverse relation\n // We need to check if there's a corresponding owning many-to-many relation\n\n let isManyToManyInverse = false;\n\n // Try to determine if this is a many-to-many inverse relation\n if (newRelation.inverseRelationName && !newRelation.foreignKeyOnTarget) {\n try {\n // Look for a corresponding owning many-to-many relation on the target collection.\n // Note: we intentionally do NOT require `through` here because the raw (unsanitized)\n // relations won't have `through` populated yet — sanitizeRelation fills it in later.\n // `cardinality: \"many\" + direction: \"owning\"` is sufficient to identify owning M2M.\n const targetRelations = (targetCollection as PostgresCollection).relations || [];\n for (const targetRel of targetRelations) {\n if (targetRel.cardinality === \"many\" &&\n (targetRel.direction === \"owning\" || !targetRel.direction) &&\n (targetRel.relationName === newRelation.inverseRelationName)) {\n // Found a corresponding owning many-to-many relation\n isManyToManyInverse = true;\n break;\n }\n }\n } catch (e) {\n // If we can't inspect the target collection, assume one-to-many\n }\n }\n\n // Only add foreignKeyOnTarget for one-to-many inverse relations\n if (!isManyToManyInverse && !newRelation.foreignKeyOnTarget) {\n newRelation.foreignKeyOnTarget = generateForeignKeyName(sourceName);\n }\n } else if (newRelation.cardinality === \"many\" && newRelation.direction === \"owning\") {\n\n // Many-to-many via junction table\n const sourceTableName = getTableName(sourceCollection);\n const targetTableName = getTableName(targetCollection);\n\n newRelation.through = {\n table: newRelation.through?.table ?? [sourceTableName, targetTableName].sort().join(\"_\"),\n sourceColumn: newRelation.through?.sourceColumn ?? generateForeignKeyName(sourceName),\n targetColumn: newRelation.through?.targetColumn ?? generateForeignKeyName(newRelation.relationName),\n };\n }\n }\n\n // 4. Basic validation to catch configuration errors early\n if (newRelation.cardinality === \"one\" && newRelation.direction === \"owning\" && !newRelation.localKey && !newRelation.joinPath) {\n throw new Error(`Configuration Error in relation from '${sourceCollection.name}': An 'owning' one-to-one relation requires a 'localKey'. Check the relation config for '${newRelation.relationName}'`);\n }\n if (newRelation.cardinality === \"one\" && newRelation.direction === \"inverse\" && !newRelation.foreignKeyOnTarget && !newRelation.joinPath) {\n throw new Error(`Configuration Error in relation from '${sourceCollection.name}': An 'inverse' one-to-one relation requires a 'foreignKeyOnTarget'. Check the relation config for '${newRelation.relationName}'`);\n }\n if (newRelation.cardinality === \"many\" && newRelation.direction === \"inverse\" && !newRelation.foreignKeyOnTarget && !newRelation.joinPath && !newRelation.inverseRelationName) {\n throw new Error(`Configuration Error in relation from '${sourceCollection.name}': An 'inverse' one-to-many relation requires a 'foreignKeyOnTarget'. Check the relation config for '${newRelation.relationName}'`);\n }\n\n return newRelation as Relation;\n}\n\nexport function resolveCollectionRelations(\n collection: PostgresCollection,\n): Record<string, Relation> {\n const relations: Record<string, Relation> = {};\n\n // 1. Process explicit relations from the new `relations` field\n if (collection.relations) {\n collection.relations.forEach((relation) => {\n const normalizedRelation = sanitizeRelation(relation, collection);\n const relationKey = normalizedRelation.relationName;\n if (relationKey) {\n relations[relationKey] = normalizedRelation;\n }\n });\n }\n\n // 2. Process properties of type \"relation\"\n if (collection.properties) {\n Object.entries(collection.properties).forEach(([propKey, prop]) => {\n const relation = resolvePropertyRelation({\n propertyKey: propKey,\n property: prop as Property,\n sourceCollection: collection\n });\n if (relation) {\n // Use property name as relation key if not already defined\n if (!relations[propKey]) {\n // FIX: Set relationName to propKey if not defined, before normalizing\n if (!relation.relationName) {\n relation.relationName = propKey;\n }\n relations[propKey] = sanitizeRelation(relation, collection); // Already normalized in collection.relations\n }\n }\n });\n }\n\n return relations;\n}\n\nexport function resolvePropertyRelation({\n propertyKey,\n property,\n sourceCollection\n}: {\n propertyKey: string;\n property: Property;\n sourceCollection: PostgresCollection;\n}): Relation | undefined {\n if (property.type !== \"relation\") return undefined;\n\n const relation = (sourceCollection.relations ?? []).find((rel: Relation) => rel.relationName === property.relationName)\n if (!relation) {\n console.warn(`Unrecognized relation format for property '${propertyKey}' in collection '${sourceCollection.slug}'`);\n return undefined;\n }\n\n return relation as Relation;\n\n}\n\nexport function getTableName(collection: EntityCollection): string {\n if (isPostgresCollection(collection)) {\n return collection.table ?? toSnakeCase(collection.slug) ?? toSnakeCase(collection.name);\n }\n return toSnakeCase(collection.slug) ?? toSnakeCase(collection.name);\n}\n\nexport function getTableVarName(tableName: string): string {\n return tableName.replace(/_([a-z])/g, (_, char) => char.toUpperCase());\n}\n\nexport function getEnumVarName(tableName: string, propName: string): string {\n const tableVar = getTableVarName(tableName);\n const propVar = propName.charAt(0).toUpperCase() + propName.slice(1);\n return `${tableVar}${propVar}`;\n}\n\nexport function getColumnName(fullColumn: string): string {\n return fullColumn.includes(\".\") ? fullColumn.split(\".\").pop()! : fullColumn;\n}\n","/* globals define,module */\n/*\nUsing a Universal Module Loader that should be browser, require, and AMD friendly\nhttp://ricostacruz.com/cheatsheets/umdjs.html\n*/\n;(function(root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(factory);\n } else if (typeof exports === \"object\") {\n module.exports = factory();\n } else {\n root.jsonLogic = factory();\n }\n}(this, function() {\n \"use strict\";\n /* globals console:false */\n\n if ( ! Array.isArray) {\n Array.isArray = function(arg) {\n return Object.prototype.toString.call(arg) === \"[object Array]\";\n };\n }\n\n /**\n * Return an array that contains no duplicates (original not modified)\n * @param {array} array Original reference array\n * @return {array} New array with no duplicates\n */\n function arrayUnique(array) {\n var a = [];\n for (var i=0, l=array.length; i<l; i++) {\n if (a.indexOf(array[i]) === -1) {\n a.push(array[i]);\n }\n }\n return a;\n }\n\n var jsonLogic = {};\n var operations = {\n \"==\": function(a, b) {\n return a == b;\n },\n \"===\": function(a, b) {\n return a === b;\n },\n \"!=\": function(a, b) {\n return a != b;\n },\n \"!==\": function(a, b) {\n return a !== b;\n },\n \">\": function(a, b) {\n return a > b;\n },\n \">=\": function(a, b) {\n return a >= b;\n },\n \"<\": function(a, b, c) {\n return (c === undefined) ? a < b : (a < b) && (b < c);\n },\n \"<=\": function(a, b, c) {\n return (c === undefined) ? a <= b : (a <= b) && (b <= c);\n },\n \"!!\": function(a) {\n return jsonLogic.truthy(a);\n },\n \"!\": function(a) {\n return !jsonLogic.truthy(a);\n },\n \"%\": function(a, b) {\n return a % b;\n },\n \"log\": function(a) {\n console.log(a); return a;\n },\n \"in\": function(a, b) {\n if (!b || typeof b.indexOf === \"undefined\") return false;\n return (b.indexOf(a) !== -1);\n },\n \"cat\": function() {\n return Array.prototype.join.call(arguments, \"\");\n },\n \"substr\": function(source, start, end) {\n if (end < 0) {\n // JavaScript doesn't support negative end, this emulates PHP behavior\n var temp = String(source).substr(start);\n return temp.substr(0, temp.length + end);\n }\n return String(source).substr(start, end);\n },\n \"+\": function() {\n return Array.prototype.reduce.call(arguments, function(a, b) {\n return parseFloat(a, 10) + parseFloat(b, 10);\n }, 0);\n },\n \"*\": function() {\n return Array.prototype.reduce.call(arguments, function(a, b) {\n return parseFloat(a, 10) * parseFloat(b, 10);\n });\n },\n \"-\": function(a, b) {\n if (b === undefined) {\n return -a;\n } else {\n return a - b;\n }\n },\n \"/\": function(a, b) {\n return a / b;\n },\n \"min\": function() {\n return Math.min.apply(this, arguments);\n },\n \"max\": function() {\n return Math.max.apply(this, arguments);\n },\n \"merge\": function() {\n return Array.prototype.reduce.call(arguments, function(a, b) {\n return a.concat(b);\n }, []);\n },\n \"var\": function(a, b) {\n var not_found = (b === undefined) ? null : b;\n var data = this;\n if (typeof a === \"undefined\" || a===\"\" || a===null) {\n return data;\n }\n var sub_props = String(a).split(\".\");\n for (var i = 0; i < sub_props.length; i++) {\n if (data === null || data === undefined) {\n return not_found;\n }\n // Descending into data\n data = data[sub_props[i]];\n if (data === undefined) {\n return not_found;\n }\n }\n return data;\n },\n \"missing\": function() {\n /*\n Missing can receive many keys as many arguments, like {\"missing:[1,2]}\n Missing can also receive *one* argument that is an array of keys,\n which typically happens if it's actually acting on the output of another command\n (like 'if' or 'merge')\n */\n\n var missing = [];\n var keys = Array.isArray(arguments[0]) ? arguments[0] : arguments;\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = jsonLogic.apply({\"var\": key}, this);\n if (value === null || value === \"\") {\n missing.push(key);\n }\n }\n\n return missing;\n },\n \"missing_some\": function(need_count, options) {\n // missing_some takes two arguments, how many (minimum) items must be present, and an array of keys (just like 'missing') to check for presence.\n var are_missing = jsonLogic.apply({\"missing\": options}, this);\n\n if (options.length - are_missing.length >= need_count) {\n return [];\n } else {\n return are_missing;\n }\n },\n };\n\n jsonLogic.is_logic = function(logic) {\n return (\n typeof logic === \"object\" && // An object\n logic !== null && // but not null\n ! Array.isArray(logic) && // and not an array\n Object.keys(logic).length === 1 // with exactly one key\n );\n };\n\n /*\n This helper will defer to the JsonLogic spec as a tie-breaker when different language interpreters define different behavior for the truthiness of primitives. E.g., PHP considers empty arrays to be falsy, but Javascript considers them to be truthy. JsonLogic, as an ecosystem, needs one consistent answer.\n\n Spec and rationale here: http://jsonlogic.com/truthy\n */\n jsonLogic.truthy = function(value) {\n if (Array.isArray(value) && value.length === 0) {\n return false;\n }\n return !! value;\n };\n\n\n jsonLogic.get_operator = function(logic) {\n return Object.keys(logic)[0];\n };\n\n jsonLogic.get_values = function(logic) {\n return logic[jsonLogic.get_operator(logic)];\n };\n\n jsonLogic.apply = function(logic, data) {\n // Does this array contain logic? Only one way to find out.\n if (Array.isArray(logic)) {\n return logic.map(function(l) {\n return jsonLogic.apply(l, data);\n });\n }\n // You've recursed to a primitive, stop!\n if ( ! jsonLogic.is_logic(logic) ) {\n return logic;\n }\n\n var op = jsonLogic.get_operator(logic);\n var values = logic[op];\n var i;\n var current;\n var scopedLogic;\n var scopedData;\n var initial;\n\n // easy syntax for unary operators, like {\"var\" : \"x\"} instead of strict {\"var\" : [\"x\"]}\n if ( ! Array.isArray(values)) {\n values = [values];\n }\n\n // 'if', 'and', and 'or' violate the normal rule of depth-first calculating consequents, let each manage recursion as needed.\n if (op === \"if\" || op == \"?:\") {\n /* 'if' should be called with a odd number of parameters, 3 or greater\n This works on the pattern:\n if( 0 ){ 1 }else{ 2 };\n if( 0 ){ 1 }else if( 2 ){ 3 }else{ 4 };\n if( 0 ){ 1 }else if( 2 ){ 3 }else if( 4 ){ 5 }else{ 6 };\n\n The implementation is:\n For pairs of values (0,1 then 2,3 then 4,5 etc)\n If the first evaluates truthy, evaluate and return the second\n If the first evaluates falsy, jump to the next pair (e.g, 0,1 to 2,3)\n given one parameter, evaluate and return it. (it's an Else and all the If/ElseIf were false)\n given 0 parameters, return NULL (not great practice, but there was no Else)\n */\n for (i = 0; i < values.length - 1; i += 2) {\n if ( jsonLogic.truthy( jsonLogic.apply(values[i], data) ) ) {\n return jsonLogic.apply(values[i+1], data);\n }\n }\n if (values.length === i+1) {\n return jsonLogic.apply(values[i], data);\n }\n return null;\n } else if (op === \"and\") { // Return first falsy, or last\n for (i=0; i < values.length; i+=1) {\n current = jsonLogic.apply(values[i], data);\n if ( ! jsonLogic.truthy(current)) {\n return current;\n }\n }\n return current; // Last\n } else if (op === \"or\") {// Return first truthy, or last\n for (i=0; i < values.length; i+=1) {\n current = jsonLogic.apply(values[i], data);\n if ( jsonLogic.truthy(current) ) {\n return current;\n }\n }\n return current; // Last\n } else if (op === \"filter\") {\n scopedData = jsonLogic.apply(values[0], data);\n scopedLogic = values[1];\n\n if ( ! Array.isArray(scopedData)) {\n return [];\n }\n // Return only the elements from the array in the first argument,\n // that return truthy when passed to the logic in the second argument.\n // For parity with JavaScript, reindex the returned array\n return scopedData.filter(function(datum) {\n return jsonLogic.truthy( jsonLogic.apply(scopedLogic, datum));\n });\n } else if (op === \"map\") {\n scopedData = jsonLogic.apply(values[0], data);\n scopedLogic = values[1];\n\n if ( ! Array.isArray(scopedData)) {\n return [];\n }\n\n return scopedData.map(function(datum) {\n return jsonLogic.apply(scopedLogic, datum);\n });\n } else if (op === \"reduce\") {\n scopedData = jsonLogic.apply(values[0], data);\n scopedLogic = values[1];\n initial = typeof values[2] !== \"undefined\" ? jsonLogic.apply(values[2], data) : null;\n\n if ( ! Array.isArray(scopedData)) {\n return initial;\n }\n\n return scopedData.reduce(\n function(accumulator, current) {\n return jsonLogic.apply(\n scopedLogic,\n {current: current, accumulator: accumulator}\n );\n },\n initial\n );\n } else if (op === \"all\") {\n scopedData = jsonLogic.apply(values[0], data);\n scopedLogic = values[1];\n // All of an empty set is false. Note, some and none have correct fallback after the for loop\n if ( ! Array.isArray(scopedData) || ! scopedData.length) {\n return false;\n }\n for (i=0; i < scopedData.length; i+=1) {\n if ( ! jsonLogic.truthy( jsonLogic.apply(scopedLogic, scopedData[i]) )) {\n return false; // First falsy, short circuit\n }\n }\n return true; // All were truthy\n } else if (op === \"none\") {\n scopedData = jsonLogic.apply(values[0], data);\n scopedLogic = values[1];\n\n if ( ! Array.isArray(scopedData) || ! scopedData.length) {\n return true;\n }\n for (i=0; i < scopedData.length; i+=1) {\n if ( jsonLogic.truthy( jsonLogic.apply(scopedLogic, scopedData[i]) )) {\n return false; // First truthy, short circuit\n }\n }\n return true; // None were truthy\n } else if (op === \"some\") {\n scopedData = jsonLogic.apply(values[0], data);\n scopedLogic = values[1];\n\n if ( ! Array.isArray(scopedData) || ! scopedData.length) {\n return false;\n }\n for (i=0; i < scopedData.length; i+=1) {\n if ( jsonLogic.truthy( jsonLogic.apply(scopedLogic, scopedData[i]) )) {\n return true; // First truthy, short circuit\n }\n }\n return false; // None were truthy\n }\n\n // Everyone else gets immediate depth-first recursion\n values = values.map(function(val) {\n return jsonLogic.apply(val, data);\n });\n\n\n // The operation is called with \"data\" bound to its \"this\" and \"values\" passed as arguments.\n // Structured commands like % or > can name formal arguments while flexible commands (like missing or merge) can operate on the pseudo-array arguments\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments\n if (operations.hasOwnProperty(op) && typeof operations[op] === \"function\") {\n return operations[op].apply(data, values);\n } else if (op.indexOf(\".\") > 0) { // Contains a dot, and not in the 0th position\n var sub_ops = String(op).split(\".\");\n var operation = operations;\n for (i = 0; i < sub_ops.length; i++) {\n if (!operation.hasOwnProperty(sub_ops[i])) {\n throw new Error(\"Unrecognized operation \" + op +\n \" (failed at \" + sub_ops.slice(0, i+1).join(\".\") + \")\");\n }\n // Descending into operations\n operation = operation[sub_ops[i]];\n }\n\n return operation.apply(data, values);\n }\n\n throw new Error(\"Unrecognized operation \" + op );\n };\n\n jsonLogic.uses_data = function(logic) {\n var collection = [];\n\n if (jsonLogic.is_logic(logic)) {\n var op = jsonLogic.get_operator(logic);\n var values = logic[op];\n\n if ( ! Array.isArray(values)) {\n values = [values];\n }\n\n if (op === \"var\") {\n // This doesn't cover the case where the arg to var is itself a rule.\n collection.push(values[0]);\n } else {\n // Recursion!\n values.forEach(function(val) {\n collection.push.apply(collection, jsonLogic.uses_data(val) );\n });\n }\n }\n\n return arrayUnique(collection);\n };\n\n jsonLogic.add_operation = function(name, code) {\n operations[name] = code;\n };\n\n jsonLogic.rm_operation = function(name) {\n delete operations[name];\n };\n\n jsonLogic.rule_like = function(rule, pattern) {\n // console.log(\"Is \". JSON.stringify(rule) . \" like \" . JSON.stringify(pattern) . \"?\");\n if (pattern === rule) {\n return true;\n } // TODO : Deep object equivalency?\n if (pattern === \"@\") {\n return true;\n } // Wildcard!\n if (pattern === \"number\") {\n return (typeof rule === \"number\");\n }\n if (pattern === \"string\") {\n return (typeof rule === \"string\");\n }\n if (pattern === \"array\") {\n // !logic test might be superfluous in JavaScript\n return Array.isArray(rule) && ! jsonLogic.is_logic(rule);\n }\n\n if (jsonLogic.is_logic(pattern)) {\n if (jsonLogic.is_logic(rule)) {\n var pattern_op = jsonLogic.get_operator(pattern);\n var rule_op = jsonLogic.get_operator(rule);\n\n if (pattern_op === \"@\" || pattern_op === rule_op) {\n // echo \"\\nOperators match, go deeper\\n\";\n return jsonLogic.rule_like(\n jsonLogic.get_values(rule, false),\n jsonLogic.get_values(pattern, false)\n );\n }\n }\n return false; // pattern is logic, rule isn't, can't be eq\n }\n\n if (Array.isArray(pattern)) {\n if (Array.isArray(rule)) {\n if (pattern.length !== rule.length) {\n return false;\n }\n /*\n Note, array order MATTERS, because we're using this array test logic to consider arguments, where order can matter. (e.g., + is commutative, but '-' or 'if' or 'var' are NOT)\n */\n for (var i = 0; i < pattern.length; i += 1) {\n // If any fail, we fail\n if ( ! jsonLogic.rule_like(rule[i], pattern[i])) {\n return false;\n }\n }\n return true; // If they *all* passed, we pass\n } else {\n return false; // Pattern is array, rule isn't\n }\n }\n\n // Not logic, not array, not a === match for rule.\n return false;\n };\n\n return jsonLogic;\n}));\n","var getOwnPropertyNames = Object.getOwnPropertyNames, getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Combine two comparators into a single comparators.\n */\nfunction combineComparators(comparatorA, comparatorB) {\n return function isEqual(a, b, state) {\n return comparatorA(a, b, state) && comparatorB(a, b, state);\n };\n}\n/**\n * Wrap the provided `areItemsEqual` method to manage the circular state, allowing\n * for circular references to be safely included in the comparison without creating\n * stack overflows.\n */\nfunction createIsCircular(areItemsEqual) {\n return function isCircular(a, b, state) {\n if (!a || !b || typeof a !== 'object' || typeof b !== 'object') {\n return areItemsEqual(a, b, state);\n }\n var cache = state.cache;\n var cachedA = cache.get(a);\n var cachedB = cache.get(b);\n if (cachedA && cachedB) {\n return cachedA === b && cachedB === a;\n }\n cache.set(a, b);\n cache.set(b, a);\n var result = areItemsEqual(a, b, state);\n cache.delete(a);\n cache.delete(b);\n return result;\n };\n}\n/**\n * Get the `@@toStringTag` of the value, if it exists.\n */\nfunction getShortTag(value) {\n return value != null ? value[Symbol.toStringTag] : undefined;\n}\n/**\n * Get the properties to strictly examine, which include both own properties that are\n * not enumerable and symbol properties.\n */\nfunction getStrictProperties(object) {\n return getOwnPropertyNames(object).concat(getOwnPropertySymbols(object));\n}\n/**\n * Whether the object contains the property passed as an own property.\n */\nvar hasOwn = Object.hasOwn ||\n (function (object, property) {\n return hasOwnProperty.call(object, property);\n });\n/**\n * Whether the values passed are strictly equal or both NaN.\n */\nfunction sameValueZeroEqual(a, b) {\n return a === b || (!a && !b && a !== a && b !== b);\n}\n\nvar PREACT_VNODE = '__v';\nvar PREACT_OWNER = '__o';\nvar REACT_OWNER = '_owner';\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor, keys = Object.keys;\n/**\n * Whether the arrays are equal in value.\n */\nfunction areArraysEqual(a, b, state) {\n var index = a.length;\n if (b.length !== index) {\n return false;\n }\n while (index-- > 0) {\n if (!state.equals(a[index], b[index], index, index, a, b, state)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the dates passed are equal in value.\n */\nfunction areDatesEqual(a, b) {\n return sameValueZeroEqual(a.getTime(), b.getTime());\n}\n/**\n * Whether the errors passed are equal in value.\n */\nfunction areErrorsEqual(a, b) {\n return (a.name === b.name &&\n a.message === b.message &&\n a.cause === b.cause &&\n a.stack === b.stack);\n}\n/**\n * Whether the functions passed are equal in value.\n */\nfunction areFunctionsEqual(a, b) {\n return a === b;\n}\n/**\n * Whether the `Map`s are equal in value.\n */\nfunction areMapsEqual(a, b, state) {\n var size = a.size;\n if (size !== b.size) {\n return false;\n }\n if (!size) {\n return true;\n }\n var matchedIndices = new Array(size);\n var aIterable = a.entries();\n var aResult;\n var bResult;\n var index = 0;\n while ((aResult = aIterable.next())) {\n if (aResult.done) {\n break;\n }\n var bIterable = b.entries();\n var hasMatch = false;\n var matchIndex = 0;\n while ((bResult = bIterable.next())) {\n if (bResult.done) {\n break;\n }\n if (matchedIndices[matchIndex]) {\n matchIndex++;\n continue;\n }\n var aEntry = aResult.value;\n var bEntry = bResult.value;\n if (state.equals(aEntry[0], bEntry[0], index, matchIndex, a, b, state) &&\n state.equals(aEntry[1], bEntry[1], aEntry[0], bEntry[0], a, b, state)) {\n hasMatch = matchedIndices[matchIndex] = true;\n break;\n }\n matchIndex++;\n }\n if (!hasMatch) {\n return false;\n }\n index++;\n }\n return true;\n}\n/**\n * Whether the numbers are equal in value.\n */\nvar areNumbersEqual = sameValueZeroEqual;\n/**\n * Whether the objects are equal in value.\n */\nfunction areObjectsEqual(a, b, state) {\n var properties = keys(a);\n var index = properties.length;\n if (keys(b).length !== index) {\n return false;\n }\n // Decrementing `while` showed faster results than either incrementing or\n // decrementing `for` loop and than an incrementing `while` loop. Declarative\n // methods like `some` / `every` were not used to avoid incurring the garbage\n // cost of anonymous callbacks.\n while (index-- > 0) {\n if (!isPropertyEqual(a, b, state, properties[index])) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the objects are equal in value with strict property checking.\n */\nfunction areObjectsEqualStrict(a, b, state) {\n var properties = getStrictProperties(a);\n var index = properties.length;\n if (getStrictProperties(b).length !== index) {\n return false;\n }\n var property;\n var descriptorA;\n var descriptorB;\n // Decrementing `while` showed faster results than either incrementing or\n // decrementing `for` loop and than an incrementing `while` loop. Declarative\n // methods like `some` / `every` were not used to avoid incurring the garbage\n // cost of anonymous callbacks.\n while (index-- > 0) {\n property = properties[index];\n if (!isPropertyEqual(a, b, state, property)) {\n return false;\n }\n descriptorA = getOwnPropertyDescriptor(a, property);\n descriptorB = getOwnPropertyDescriptor(b, property);\n if ((descriptorA || descriptorB) &&\n (!descriptorA ||\n !descriptorB ||\n descriptorA.configurable !== descriptorB.configurable ||\n descriptorA.enumerable !== descriptorB.enumerable ||\n descriptorA.writable !== descriptorB.writable)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the primitive wrappers passed are equal in value.\n */\nfunction arePrimitiveWrappersEqual(a, b) {\n return sameValueZeroEqual(a.valueOf(), b.valueOf());\n}\n/**\n * Whether the regexps passed are equal in value.\n */\nfunction areRegExpsEqual(a, b) {\n return a.source === b.source && a.flags === b.flags;\n}\n/**\n * Whether the `Set`s are equal in value.\n */\nfunction areSetsEqual(a, b, state) {\n var size = a.size;\n if (size !== b.size) {\n return false;\n }\n if (!size) {\n return true;\n }\n var matchedIndices = new Array(size);\n var aIterable = a.values();\n var aResult;\n var bResult;\n while ((aResult = aIterable.next())) {\n if (aResult.done) {\n break;\n }\n var bIterable = b.values();\n var hasMatch = false;\n var matchIndex = 0;\n while ((bResult = bIterable.next())) {\n if (bResult.done) {\n break;\n }\n if (!matchedIndices[matchIndex] &&\n state.equals(aResult.value, bResult.value, aResult.value, bResult.value, a, b, state)) {\n hasMatch = matchedIndices[matchIndex] = true;\n break;\n }\n matchIndex++;\n }\n if (!hasMatch) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the TypedArray instances are equal in value.\n */\nfunction areTypedArraysEqual(a, b) {\n var index = a.length;\n if (b.length !== index) {\n return false;\n }\n while (index-- > 0) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the URL instances are equal in value.\n */\nfunction areUrlsEqual(a, b) {\n return (a.hostname === b.hostname &&\n a.pathname === b.pathname &&\n a.protocol === b.protocol &&\n a.port === b.port &&\n a.hash === b.hash &&\n a.username === b.username &&\n a.password === b.password);\n}\nfunction isPropertyEqual(a, b, state, property) {\n if ((property === REACT_OWNER ||\n property === PREACT_OWNER ||\n property === PREACT_VNODE) &&\n (a.$$typeof || b.$$typeof)) {\n return true;\n }\n return (hasOwn(b, property) &&\n state.equals(a[property], b[property], property, property, a, b, state));\n}\n\nvar ARGUMENTS_TAG = '[object Arguments]';\nvar BOOLEAN_TAG = '[object Boolean]';\nvar DATE_TAG = '[object Date]';\nvar ERROR_TAG = '[object Error]';\nvar MAP_TAG = '[object Map]';\nvar NUMBER_TAG = '[object Number]';\nvar OBJECT_TAG = '[object Object]';\nvar REG_EXP_TAG = '[object RegExp]';\nvar SET_TAG = '[object Set]';\nvar STRING_TAG = '[object String]';\nvar URL_TAG = '[object URL]';\nvar isArray = Array.isArray;\nvar isTypedArray = typeof ArrayBuffer === 'function' && ArrayBuffer.isView\n ? ArrayBuffer.isView\n : null;\nvar assign = Object.assign;\nvar getTag = Object.prototype.toString.call.bind(Object.prototype.toString);\n/**\n * Create a comparator method based on the type-specific equality comparators passed.\n */\nfunction createEqualityComparator(_a) {\n var areArraysEqual = _a.areArraysEqual, areDatesEqual = _a.areDatesEqual, areErrorsEqual = _a.areErrorsEqual, areFunctionsEqual = _a.areFunctionsEqual, areMapsEqual = _a.areMapsEqual, areNumbersEqual = _a.areNumbersEqual, areObjectsEqual = _a.areObjectsEqual, arePrimitiveWrappersEqual = _a.arePrimitiveWrappersEqual, areRegExpsEqual = _a.areRegExpsEqual, areSetsEqual = _a.areSetsEqual, areTypedArraysEqual = _a.areTypedArraysEqual, areUrlsEqual = _a.areUrlsEqual, unknownTagComparators = _a.unknownTagComparators;\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n */\n return function comparator(a, b, state) {\n // If the items are strictly equal, no need to do a value comparison.\n if (a === b) {\n return true;\n }\n // If either of the items are nullish and fail the strictly equal check\n // above, then they must be unequal.\n if (a == null || b == null) {\n return false;\n }\n var type = typeof a;\n if (type !== typeof b) {\n return false;\n }\n if (type !== 'object') {\n if (type === 'number') {\n return areNumbersEqual(a, b, state);\n }\n if (type === 'function') {\n return areFunctionsEqual(a, b, state);\n }\n // If a primitive value that is not strictly equal, it must be unequal.\n return false;\n }\n var constructor = a.constructor;\n // Checks are listed in order of commonality of use-case:\n // 1. Common complex object types (plain object, array)\n // 2. Common data values (date, regexp)\n // 3. Less-common complex object types (map, set)\n // 4. Less-common data values (promise, primitive wrappers)\n // Inherently this is both subjective and assumptive, however\n // when reviewing comparable libraries in the wild this order\n // appears to be generally consistent.\n // Constructors should match, otherwise there is potential for false positives\n // between class and subclass or custom object and POJO.\n if (constructor !== b.constructor) {\n return false;\n }\n // `isPlainObject` only checks against the object's own realm. Cross-realm\n // comparisons are rare, and will be handled in the ultimate fallback, so\n // we can avoid capturing the string tag.\n if (constructor === Object) {\n return areObjectsEqual(a, b, state);\n }\n // `isArray()` works on subclasses and is cross-realm, so we can avoid capturing\n // the string tag or doing an `instanceof` check.\n if (isArray(a)) {\n return areArraysEqual(a, b, state);\n }\n // `isTypedArray()` works on all possible TypedArray classes, so we can avoid\n // capturing the string tag or comparing against all possible constructors.\n if (isTypedArray != null && isTypedArray(a)) {\n return areTypedArraysEqual(a, b, state);\n }\n // Try to fast-path equality checks for other complex object types in the\n // same realm to avoid capturing the string tag. Strict equality is used\n // instead of `instanceof` because it is more performant for the common\n // use-case. If someone is subclassing a native class, it will be handled\n // with the string tag comparison.\n if (constructor === Date) {\n return areDatesEqual(a, b, state);\n }\n if (constructor === RegExp) {\n return areRegExpsEqual(a, b, state);\n }\n if (constructor === Map) {\n return areMapsEqual(a, b, state);\n }\n if (constructor === Set) {\n return areSetsEqual(a, b, state);\n }\n // Since this is a custom object, capture the string tag to determing its type.\n // This is reasonably performant in modern environments like v8 and SpiderMonkey.\n var tag = getTag(a);\n if (tag === DATE_TAG) {\n return areDatesEqual(a, b, state);\n }\n // For RegExp, the properties are not enumerable, and therefore will give false positives if\n // tested like a standard object.\n if (tag === REG_EXP_TAG) {\n return areRegExpsEqual(a, b, state);\n }\n if (tag === MAP_TAG) {\n return areMapsEqual(a, b, state);\n }\n if (tag === SET_TAG) {\n return areSetsEqual(a, b, state);\n }\n if (tag === OBJECT_TAG) {\n // The exception for value comparison is custom `Promise`-like class instances. These should\n // be treated the same as standard `Promise` objects, which means strict equality, and if\n // it reaches this point then that strict equality comparison has already failed.\n return (typeof a.then !== 'function' &&\n typeof b.then !== 'function' &&\n areObjectsEqual(a, b, state));\n }\n // If a URL tag, it should be tested explicitly. Like RegExp, the properties are not\n // enumerable, and therefore will give false positives if tested like a standard object.\n if (tag === URL_TAG) {\n return areUrlsEqual(a, b, state);\n }\n // If an error tag, it should be tested explicitly. Like RegExp, the properties are not\n // enumerable, and therefore will give false positives if tested like a standard object.\n if (tag === ERROR_TAG) {\n return areErrorsEqual(a, b, state);\n }\n // If an arguments tag, it should be treated as a standard object.\n if (tag === ARGUMENTS_TAG) {\n return areObjectsEqual(a, b, state);\n }\n // As the penultimate fallback, check if the values passed are primitive wrappers. This\n // is very rare in modern JS, which is why it is deprioritized compared to all other object\n // types.\n if (tag === BOOLEAN_TAG || tag === NUMBER_TAG || tag === STRING_TAG) {\n return arePrimitiveWrappersEqual(a, b, state);\n }\n if (unknownTagComparators) {\n var unknownTagComparator = unknownTagComparators[tag];\n if (!unknownTagComparator) {\n var shortTag = getShortTag(a);\n if (shortTag) {\n unknownTagComparator = unknownTagComparators[shortTag];\n }\n }\n // If the custom config has an unknown tag comparator that matches the captured tag or the\n // @@toStringTag, it is the source of truth for whether the values are equal.\n if (unknownTagComparator) {\n return unknownTagComparator(a, b, state);\n }\n }\n // If not matching any tags that require a specific type of comparison, then we hard-code false because\n // the only thing remaining is strict equality, which has already been compared. This is for a few reasons:\n // - Certain types that cannot be introspected (e.g., `WeakMap`). For these types, this is the only\n // comparison that can be made.\n // - For types that can be introspected, but rarely have requirements to be compared\n // (`ArrayBuffer`, `DataView`, etc.), the cost is avoided to prioritize the common\n // use-cases (may be included in a future release, if requested enough).\n // - For types that can be introspected but do not have an objective definition of what\n // equality is (`Error`, etc.), the subjective decision is to be conservative and strictly compare.\n // In all cases, these decisions should be reevaluated based on changes to the language and\n // common development practices.\n return false;\n };\n}\n/**\n * Create the configuration object used for building comparators.\n */\nfunction createEqualityComparatorConfig(_a) {\n var circular = _a.circular, createCustomConfig = _a.createCustomConfig, strict = _a.strict;\n var config = {\n areArraysEqual: strict\n ? areObjectsEqualStrict\n : areArraysEqual,\n areDatesEqual: areDatesEqual,\n areErrorsEqual: areErrorsEqual,\n areFunctionsEqual: areFunctionsEqual,\n areMapsEqual: strict\n ? combineComparators(areMapsEqual, areObjectsEqualStrict)\n : areMapsEqual,\n areNumbersEqual: areNumbersEqual,\n areObjectsEqual: strict\n ? areObjectsEqualStrict\n : areObjectsEqual,\n arePrimitiveWrappersEqual: arePrimitiveWrappersEqual,\n areRegExpsEqual: areRegExpsEqual,\n areSetsEqual: strict\n ? combineComparators(areSetsEqual, areObjectsEqualStrict)\n : areSetsEqual,\n areTypedArraysEqual: strict\n ? areObjectsEqualStrict\n : areTypedArraysEqual,\n areUrlsEqual: areUrlsEqual,\n unknownTagComparators: undefined,\n };\n if (createCustomConfig) {\n config = assign({}, config, createCustomConfig(config));\n }\n if (circular) {\n var areArraysEqual$1 = createIsCircular(config.areArraysEqual);\n var areMapsEqual$1 = createIsCircular(config.areMapsEqual);\n var areObjectsEqual$1 = createIsCircular(config.areObjectsEqual);\n var areSetsEqual$1 = createIsCircular(config.areSetsEqual);\n config = assign({}, config, {\n areArraysEqual: areArraysEqual$1,\n areMapsEqual: areMapsEqual$1,\n areObjectsEqual: areObjectsEqual$1,\n areSetsEqual: areSetsEqual$1,\n });\n }\n return config;\n}\n/**\n * Default equality comparator pass-through, used as the standard `isEqual` creator for\n * use inside the built comparator.\n */\nfunction createInternalEqualityComparator(compare) {\n return function (a, b, _indexOrKeyA, _indexOrKeyB, _parentA, _parentB, state) {\n return compare(a, b, state);\n };\n}\n/**\n * Create the `isEqual` function used by the consuming application.\n */\nfunction createIsEqual(_a) {\n var circular = _a.circular, comparator = _a.comparator, createState = _a.createState, equals = _a.equals, strict = _a.strict;\n if (createState) {\n return function isEqual(a, b) {\n var _a = createState(), _b = _a.cache, cache = _b === void 0 ? circular ? new WeakMap() : undefined : _b, meta = _a.meta;\n return comparator(a, b, {\n cache: cache,\n equals: equals,\n meta: meta,\n strict: strict,\n });\n };\n }\n if (circular) {\n return function isEqual(a, b) {\n return comparator(a, b, {\n cache: new WeakMap(),\n equals: equals,\n meta: undefined,\n strict: strict,\n });\n };\n }\n var state = {\n cache: undefined,\n equals: equals,\n meta: undefined,\n strict: strict,\n };\n return function isEqual(a, b) {\n return comparator(a, b, state);\n };\n}\n\n/**\n * Whether the items passed are deeply-equal in value.\n */\nvar deepEqual = createCustomEqual();\n/**\n * Whether the items passed are deeply-equal in value based on strict comparison.\n */\nvar strictDeepEqual = createCustomEqual({ strict: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references.\n */\nvar circularDeepEqual = createCustomEqual({ circular: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularDeepEqual = createCustomEqual({\n circular: true,\n strict: true,\n});\n/**\n * Whether the items passed are shallowly-equal in value.\n */\nvar shallowEqual = createCustomEqual({\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value based on strict comparison\n */\nvar strictShallowEqual = createCustomEqual({\n strict: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references.\n */\nvar circularShallowEqual = createCustomEqual({\n circular: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularShallowEqual = createCustomEqual({\n circular: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n strict: true,\n});\n/**\n * Create a custom equality comparison method.\n *\n * This can be done to create very targeted comparisons in extreme hot-path scenarios\n * where the standard methods are not performant enough, but can also be used to provide\n * support for legacy environments that do not support expected features like\n * `RegExp.prototype.flags` out of the box.\n */\nfunction createCustomEqual(options) {\n if (options === void 0) { options = {}; }\n var _a = options.circular, circular = _a === void 0 ? false : _a, createCustomInternalComparator = options.createInternalComparator, createState = options.createState, _b = options.strict, strict = _b === void 0 ? false : _b;\n var config = createEqualityComparatorConfig(options);\n var comparator = createEqualityComparator(config);\n var equals = createCustomInternalComparator\n ? createCustomInternalComparator(comparator)\n : createInternalEqualityComparator(comparator);\n return createIsEqual({ circular: circular, comparator: comparator, createState: createState, equals: equals, strict: strict });\n}\n\nexport { circularDeepEqual, circularShallowEqual, createCustomEqual, deepEqual, sameValueZeroEqual, shallowEqual, strictCircularDeepEqual, strictCircularShallowEqual, strictDeepEqual, strictShallowEqual };\n//# sourceMappingURL=index.mjs.map\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","var assignValue = require('./_assignValue'),\n baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nmodule.exports = copyObject;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var copyObject = require('./_copyObject'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nmodule.exports = cloneBuffer;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nmodule.exports = copyArray;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","var copyObject = require('./_copyObject'),\n getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var arrayPush = require('./_arrayPush'),\n getPrototype = require('./_getPrototype'),\n getSymbols = require('./_getSymbols'),\n stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nmodule.exports = getSymbolsIn;\n","var copyObject = require('./_copyObject'),\n getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbolsIn = require('./_getSymbolsIn'),\n keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nmodule.exports = cloneRegExp;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n cloneDataView = require('./_cloneDataView'),\n cloneRegExp = require('./_cloneRegExp'),\n cloneSymbol = require('./_cloneSymbol'),\n cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n","var baseCreate = require('./_baseCreate'),\n getPrototype = require('./_getPrototype'),\n isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nmodule.exports = initCloneObject;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","var baseIsMap = require('./_baseIsMap'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","var baseIsSet = require('./_baseIsSet'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","var Stack = require('./_Stack'),\n arrayEach = require('./_arrayEach'),\n assignValue = require('./_assignValue'),\n baseAssign = require('./_baseAssign'),\n baseAssignIn = require('./_baseAssignIn'),\n cloneBuffer = require('./_cloneBuffer'),\n copyArray = require('./_copyArray'),\n copySymbols = require('./_copySymbols'),\n copySymbolsIn = require('./_copySymbolsIn'),\n getAllKeys = require('./_getAllKeys'),\n getAllKeysIn = require('./_getAllKeysIn'),\n getTag = require('./_getTag'),\n initCloneArray = require('./_initCloneArray'),\n initCloneByTag = require('./_initCloneByTag'),\n initCloneObject = require('./_initCloneObject'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isMap = require('./isMap'),\n isObject = require('./isObject'),\n isSet = require('./isSet'),\n keys = require('./keys'),\n keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n","import {\n ArrayProperty,\n EntityCollection,\n isPostgresCollection,\n isFirebaseCollection,\n NumberProperty,\n PostgresCollection,\n Properties,\n Property,\n Relation,\n RelationProperty,\n StringProperty\n} from \"@rebasepro/types\";\nimport { deepEqual } from \"fast-equals\";\n\nimport { enumToObjectEntries, getSubcollections, getTableName, resolveCollectionRelations } from \"../util\";\nimport cloneDeep from \"lodash/cloneDeep.js\";\nimport { removeFunctions, mergeDeep } from \"@rebasepro/utils\";\n\nexport class CollectionRegistry {\n\n // Normalized runtime layer (used by Data Grid / UI)\n private collectionsByTableName = new Map<string, EntityCollection>();\n private collectionsBySlug = new Map<string, EntityCollection>();\n private rootCollections: EntityCollection[] = [];\n\n // Raw configuration layer (used by Collection Editor AST generator)\n private rawCollectionsByTableName = new Map<string, EntityCollection>();\n private rawCollectionsBySlug = new Map<string, EntityCollection>();\n private rawRootCollections: EntityCollection[] = [];\n\n // Snapshot of raw input for idempotency check — compared BEFORE normalization\n // to avoid the issue where normalization creates new objects that always fail equality.\n private lastRawInputSnapshot: ReturnType<typeof removeFunctions>[] | null = null;\n\n constructor(collections?: EntityCollection[]) {\n if (collections) {\n this.registerMultiple(collections);\n }\n }\n\n reset() {\n this.collectionsByTableName.clear();\n this.collectionsBySlug.clear();\n this.rootCollections = [];\n\n this.rawCollectionsByTableName.clear();\n this.rawCollectionsBySlug.clear();\n this.rawRootCollections = [];\n }\n\n /**\n * Registers a collection and its subcollections recursively.\n * Returns true if the collections have changed, false otherwise.\n *\n * Idempotent: compares the raw input (before normalization) against a stored\n * snapshot. Only re-normalizes and re-registers when the raw input actually changed.\n * @param collections\n */\n registerMultiple(collections: EntityCollection[]): boolean {\n // Compare raw input BEFORE normalization to detect actual changes.\n // This avoids the old issue where normalization creates new objects\n // that always fail deep-equal even when the source data is identical.\n const rawSnapshot = collections.map(c => removeFunctions(c));\n if (this.lastRawInputSnapshot && deepEqual(this.lastRawInputSnapshot, rawSnapshot)) {\n return false;\n }\n\n // Raw input has changed — normalize and register\n this.reset();\n\n const normalizedCollections = collections.map(c => this.normalizeCollection({ ...c }));\n\n // Phase 1: Register all top-level collections first (without recursion).\n // This ensures that injected entityViews (e.g. History tab) are preserved.\n // Without this, _registerRecursively could register a relation-target collection\n // (e.g. Tags from Posts.relations) using the raw module object (without injected views)\n // before the top-level Tags collection (with injected views) gets its turn.\n normalizedCollections.forEach((c, index) => {\n const raw = cloneDeep(collections[index]);\n this.rootCollections.push(c);\n this.rawRootCollections.push(raw);\n\n const normalized = this.normalizeCollection(c);\n this.collectionsByTableName.set(getTableName(normalized), normalized);\n this.rawCollectionsByTableName.set(getTableName(raw), raw);\n if (normalized.slug) {\n this.collectionsBySlug.set(normalized.slug, normalized);\n }\n if (raw.slug) {\n this.rawCollectionsBySlug.set(raw.slug, raw);\n }\n });\n\n // Phase 2: Now recurse into subcollections (relations, etc.)\n normalizedCollections.forEach((c, index) => {\n const subcollections = getSubcollections(c);\n const rawSubcollections = getSubcollections(collections[index]);\n if (subcollections && rawSubcollections) {\n subcollections.forEach((subCollection, subIndex) => {\n this._registerRecursively(this.normalizeCollection(subCollection), cloneDeep(rawSubcollections[subIndex]));\n });\n }\n });\n\n // Store the snapshot for future comparisons\n this.lastRawInputSnapshot = rawSnapshot;\n\n return true;\n }\n\n register(collection: EntityCollection, rawCollection?: EntityCollection) {\n const raw = rawCollection ? cloneDeep(rawCollection) : cloneDeep(collection);\n\n this.rootCollections.push(collection);\n this.rawRootCollections.push(raw);\n\n this._registerRecursively(collection, raw);\n }\n\n private _registerRecursively(collection: EntityCollection, rawCollection: EntityCollection) {\n if (this.collectionsByTableName.has(getTableName(collection))) {\n return;\n }\n\n const normalizedCollection = this.normalizeCollection(collection);\n this.collectionsByTableName.set(getTableName(normalizedCollection), normalizedCollection);\n this.rawCollectionsByTableName.set(getTableName(rawCollection), rawCollection);\n\n if (normalizedCollection.slug) {\n this.collectionsBySlug.set(normalizedCollection.slug, normalizedCollection);\n }\n if (rawCollection.slug) {\n this.rawCollectionsBySlug.set(rawCollection.slug, rawCollection);\n }\n\n const subcollections = getSubcollections(collection);\n const rawSubcollections = getSubcollections(rawCollection);\n\n if (subcollections && rawSubcollections) {\n subcollections.forEach((subCollection, index) => {\n this._registerRecursively(this.normalizeCollection(subCollection), cloneDeep(rawSubcollections[index]));\n });\n }\n }\n\n public normalizeCollection(collection: EntityCollection): EntityCollection {\n const relations = isPostgresCollection(collection) ? (collection.relations ?? []) : [];\n const properties: Properties = this.normalizeProperties(collection.properties, relations);\n\n collection.properties = properties;\n \n // Populate childCollections from driver-specific fields\n if (!collection.childCollections) {\n if (isFirebaseCollection(collection) && collection.subcollections) {\n collection.childCollections = collection.subcollections;\n } else if (isPostgresCollection(collection) && collection.relations) {\n const manyRelations = collection.relations.filter(r => r.cardinality === \"many\");\n if (manyRelations.length > 0) {\n collection.childCollections = () => manyRelations.map(r => {\n const target = r.target();\n return r.overrides ? mergeDeep(target, r.overrides) : target;\n });\n }\n }\n }\n \n return collection;\n }\n\n private normalizeProperties(properties: Properties, relations: Relation[]): Properties {\n const newProperties: Properties = {};\n for (const key in properties) {\n newProperties[key] = this.normalizeProperty(properties[key], relations);\n }\n return newProperties;\n }\n\n private normalizeProperty(property: Property, relations: Relation[]): Property {\n const newProperty = { ...property };\n\n if (newProperty.type === \"map\" && newProperty.properties) {\n newProperty.properties = this.normalizeProperties(newProperty.properties, relations);\n } else if (newProperty.type === \"array\") {\n // Cast via unknown to get a properly typed mutable reference\n const arrayProp = newProperty as unknown as ArrayProperty;\n if (arrayProp.of) {\n if (Array.isArray(arrayProp.of)) {\n (arrayProp as { of: Property | Property[] }).of = arrayProp.of.map(p => this.normalizeProperty(p, relations));\n } else {\n arrayProp.of = this.normalizeProperty(arrayProp.of, relations);\n }\n } else if (arrayProp.oneOf && arrayProp.oneOf.properties) {\n arrayProp.oneOf.properties = this.normalizeProperties(arrayProp.oneOf.properties, relations);\n }\n } else if ((newProperty.type === \"string\" || newProperty.type === \"number\") && newProperty.enum) {\n const stringOrNumberProperty = newProperty as StringProperty | NumberProperty;\n if (typeof stringOrNumberProperty.enum === \"object\" && !Array.isArray(stringOrNumberProperty.enum)) {\n (stringOrNumberProperty as unknown as Record<string, unknown>).enum = enumToObjectEntries(stringOrNumberProperty.enum)?.filter((value) => value && (value.id || value.id === 0) && value.label) ?? [];\n }\n } else if (newProperty.type === \"relation\") {\n const relationProperty = newProperty as RelationProperty;\n const relation = relations.find(r => r.relationName === relationProperty.relationName);\n if (relation) {\n // we attach the resolved relation to the property\n (relationProperty as unknown as Record<string, unknown>).relation = relation;\n } else {\n console.warn(`Could not find relation for property with relationName: ${relationProperty.relationName}`);\n }\n }\n\n return newProperty;\n }\n\n get(path: string): EntityCollection | undefined {\n // First try slug lookup\n const bySlug = this.collectionsBySlug.get(path);\n if (bySlug) return bySlug;\n\n // Fallback to table name lookup\n return this.collectionsByTableName.get(path);\n }\n\n /**\n * Gets the pristine, un-normalized collection exactly as it was provided.\n * Useful for the AST editor so it doesn't accidentally serialize injected metadata back to disk.\n */\n getRaw(path: string): EntityCollection | undefined {\n const bySlug = this.rawCollectionsBySlug.get(path);\n if (bySlug) return bySlug;\n return this.rawCollectionsByTableName.get(path);\n }\n\n /**\n * Get collection by resolving multi-segment paths through relations\n * e.g., \"authors/70/posts\" resolves to the posts collection\n */\n getCollectionByPath(collectionPath: string): EntityCollection | undefined {\n // Handle simple single collection path\n if (!collectionPath.includes(\"/\")) {\n return this.get(collectionPath);\n }\n\n // Handle multi-segment paths by resolving through relations\n const pathSegments = collectionPath.split(\"/\").filter(p => p);\n\n if (pathSegments.length < 3 || pathSegments.length % 2 === 0) {\n throw new Error(`Invalid relation path: ${collectionPath}. Expected format: collection/id/relation or collection/id/relation/id/relation`);\n }\n\n // Start with the root collection\n const rootCollectionPath = pathSegments[0];\n let currentCollection = this.get(rootCollectionPath);\n\n if (!currentCollection) {\n throw new Error(`Root collection not found: ${rootCollectionPath}`);\n }\n\n // Navigate through the path using relations\n for (let i = 2; i < pathSegments.length; i += 2) {\n const relationKey = pathSegments[i];\n\n // Get relations for current collection\n if (!isPostgresCollection(currentCollection)) {\n throw new Error(`Relation path navigation requires a PostgreSQL collection, but '${currentCollection.slug}' uses driver '${currentCollection.driver}'`);\n }\n const resolvedRelations = resolveCollectionRelations(currentCollection);\n const relation = resolvedRelations[relationKey];\n\n if (!relation) {\n throw new Error(`Relation '${relationKey}' not found in collection '${currentCollection.slug}'`);\n }\n\n // Move to the target collection\n currentCollection = relation.target();\n\n // If there are more segments, continue navigation\n if (i + 1 < pathSegments.length) {\n // Skip entity ID segment\n }\n }\n\n return currentCollection;\n }\n\n getCollections(): EntityCollection[] {\n return Array.from(this.collectionsByTableName.values());\n }\n\n getRawCollections(): EntityCollection[] {\n return Array.from(this.rawCollectionsByTableName.values());\n }\n\n /**\n * Resolves a multi-segment path like \"products/123/locales\" and returns\n * information about the collections and entity IDs along the path\n */\n resolvePathToCollections(path: string): {\n collections: EntityCollection[],\n entityIds: (string | number)[],\n finalCollection: EntityCollection\n } {\n const pathSegments = path.split(\"/\").filter(p => p);\n\n if (pathSegments.length === 0) {\n throw new Error(`Invalid path: ${path}`);\n }\n\n if (pathSegments.length % 2 !== 1) {\n throw new Error(`Invalid collection path: ${path}. It must have an odd number of segments.`);\n }\n\n const collections: EntityCollection[] = [];\n const entityIds: (string | number)[] = [];\n\n // Start with the first collection\n let currentCollection = this.get(pathSegments[0]);\n\n if (!currentCollection) {\n throw new Error(`Unknown collection path or slug: ${pathSegments[0]}`);\n }\n\n collections.push(currentCollection);\n\n // Process the rest of the path in pairs (entityId, subcollectionSlug)\n for (let i = 1; i < pathSegments.length; i += 2) {\n const entityId = pathSegments[i];\n entityIds.push(entityId);\n\n if (i + 1 < pathSegments.length) {\n const subcollectionSlug = pathSegments[i + 1];\n const subcollections: EntityCollection[] | undefined = getSubcollections(currentCollection);\n if (!subcollections || subcollections.length === 0) {\n throw new Error(`No subcollections found for ${currentCollection.slug} in path: ${path}`);\n }\n\n const subcollection: EntityCollection | undefined = subcollections.find(c => c.slug === subcollectionSlug);\n if (!subcollection) {\n throw new Error(`Subcollection '${subcollectionSlug}' not found in ${currentCollection.slug}`);\n }\n currentCollection = subcollection;\n collections.push(currentCollection);\n }\n }\n\n return {\n collections,\n entityIds,\n finalCollection: currentCollection\n };\n }\n\n}\n\nfunction areCollectionListsEqual(a: EntityCollection[], b: EntityCollection[]) {\n // console.log(\"Comparing collection lists\", a, b);\n // return true;\n if (a.length !== b.length) {\n return false;\n }\n const aCopy = [...a];\n const bCopy = [...b];\n const aSorted = aCopy.sort((x, y) => x.slug.localeCompare(y.slug));\n const bSorted = bCopy.sort((x, y) => x.slug.localeCompare(y.slug));\n return aSorted.every((value, index) => areCollectionsEqual(value, bSorted[index]));\n}\n\nfunction areCollectionsEqual(a: EntityCollection, b: EntityCollection) {\n const subcollectionsA = getSubcollections(a);\n const subcollectionsB = getSubcollections(b);\n const { driver: _dA, ...restA } = a as unknown as Record<string, unknown>;\n const { driver: _dB, ...restB } = b as unknown as Record<string, unknown>;\n // Remove subcollections/relations from comparison objects (already handled above)\n delete restA.subcollections;\n delete restB.subcollections;\n delete restA.relations;\n delete restB.relations;\n if (!areCollectionListsEqual(subcollectionsA, subcollectionsB)) {\n return false;\n }\n return deepEqual(removeFunctions(restA), removeFunctions(restB));\n}\n","import {\n DataDriver,\n RebaseData,\n CollectionAccessor,\n FindParams,\n FindResponse,\n Entity,\n EntityValues,\n FilterValues,\n WhereFilterOp\n} from \"@rebasepro/types\";\n\n/**\n * Convert PostgREST-style filter object to the internal DataDriver FilterValues format.\n *\n * PostgREST: { status: \"eq.published\", age: \"gte.18\" }\n * Internal: { status: [\"==\", \"published\"], age: [\">=\", 18] }\n */\nfunction convertWhereToFilter(where?: Record<string, string>): FilterValues<string> | undefined {\n if (!where) return undefined;\n\n const operatorMap: Record<string, WhereFilterOp> = {\n \"eq\": \"==\",\n \"neq\": \"!=\",\n \"gt\": \">\",\n \"gte\": \">=\",\n \"lt\": \"<\",\n \"lte\": \"<=\",\n \"in\": \"in\",\n \"nin\": \"not-in\",\n \"cs\": \"array-contains\",\n \"csa\": \"array-contains-any\",\n };\n\n const filter: FilterValues<string> = {};\n\n for (const [field, rawValue] of Object.entries(where)) {\n const dotIndex = rawValue.indexOf(\".\");\n if (dotIndex === -1) continue;\n\n const op = rawValue.substring(0, dotIndex);\n let value: unknown = rawValue.substring(dotIndex + 1);\n\n // Parse list values like \"(admin,editor)\"\n if (typeof value === \"string\" && value.startsWith(\"(\") && value.endsWith(\")\")) {\n value = value.slice(1, -1).split(\",\").map((v: string) => v.trim());\n }\n\n // Try to parse numbers\n if (typeof value === \"string\" && !isNaN(Number(value)) && value.trim() !== \"\") {\n value = Number(value);\n }\n\n const mappedOp = operatorMap[op];\n if (mappedOp) {\n filter[field] = [mappedOp, value];\n }\n }\n\n return Object.keys(filter).length > 0 ? filter : undefined;\n}\n\n/**\n * Parse an orderBy string like \"created_at:desc\" into [field, direction].\n */\nfunction parseOrderBy(orderBy?: string): [string, \"asc\" | \"desc\"] | undefined {\n if (!orderBy) return undefined;\n const parts = orderBy.split(\":\");\n const field = parts[0];\n const direction = (parts[1] as \"asc\" | \"desc\") || \"asc\";\n return [field, direction];\n}\n\n/**\n * Create a CollectionAccessor that delegates to a DataDriver for a given collection slug.\n */\nfunction createDriverAccessor<M extends Record<string, unknown> = Record<string, unknown>>(\n driver: DataDriver,\n slug: string\n): CollectionAccessor<M> {\n return {\n async find(params?: FindParams): Promise<FindResponse<M>> {\n const orderParsed = parseOrderBy(params?.orderBy);\n const entities = await driver.fetchCollection<M>({\n path: slug,\n limit: params?.limit,\n startAfter: params?.offset,\n filter: convertWhereToFilter(params?.where),\n orderBy: orderParsed?.[0],\n order: orderParsed?.[1],\n searchString: params?.searchString,\n });\n const limit = params?.limit ?? 20;\n const offset = params?.offset ?? 0;\n return {\n data: entities,\n meta: {\n total: entities.length,\n limit,\n offset,\n hasMore: entities.length >= limit\n }\n };\n },\n\n async findById(id: string | number): Promise<Entity<M> | undefined> {\n return driver.fetchEntity<M>({ path: slug, entityId: id });\n },\n\n async create(data: Partial<EntityValues<M>>, id?: string | number): Promise<Entity<M>> {\n return driver.saveEntity<M>({\n path: slug,\n values: data,\n entityId: id,\n status: \"new\"\n });\n },\n\n async update(id: string | number, data: Partial<EntityValues<M>>): Promise<Entity<M>> {\n return driver.saveEntity<M>({\n path: slug,\n values: data,\n entityId: id,\n status: \"existing\"\n });\n },\n\n async delete(id: string | number): Promise<void> {\n return driver.deleteEntity({\n entity: { id, path: slug, values: {} as Record<string, unknown> }\n });\n },\n\n count: driver.countEntities\n ? async (params?: FindParams): Promise<number> => {\n return driver.countEntities!({\n path: slug,\n filter: convertWhereToFilter(params?.where),\n });\n }\n : undefined,\n\n listen: driver.listenCollection\n ? (params: FindParams | undefined, onUpdate: (response: FindResponse<M>) => void, onError?: (error: Error) => void) => {\n const orderParsed = parseOrderBy(params?.orderBy);\n const limit = params?.limit ?? 20;\n const offset = params?.offset ?? 0;\n return driver.listenCollection!<M>({\n path: slug,\n limit: params?.limit,\n startAfter: params?.offset,\n filter: convertWhereToFilter(params?.where),\n orderBy: orderParsed?.[0],\n order: orderParsed?.[1],\n searchString: params?.searchString,\n onUpdate: (entities) => {\n onUpdate({\n data: entities,\n meta: {\n total: entities.length,\n limit,\n offset,\n hasMore: entities.length >= limit\n }\n });\n },\n onError\n });\n } : undefined,\n\n listenById: driver.listenEntity\n ? (id: string | number, onUpdate: (entity: Entity<M> | undefined) => void, onError?: (error: Error) => void) => {\n return driver.listenEntity!<M>({\n path: slug,\n entityId: id,\n onUpdate: (entity) => onUpdate(entity ?? undefined),\n onError\n });\n } : undefined\n };\n}\n\n/**\n * Build a `RebaseData` object from a `DataDriver` using JavaScript Proxy.\n *\n * This is the key bridge: any property access like `data.products` returns\n * a `CollectionAccessor` backed by the underlying DataDriver, without\n * needing per-collection code generation.\n *\n * @example\n * const data = buildRebaseData(driver);\n * await data.products.create({ name: \"Camera\", price: 299 });\n * const { data: items } = await data.products.find({ where: { status: \"eq.published\" } });\n */\nexport function buildRebaseData(driver: DataDriver): RebaseData {\n const cache = new Map<string, CollectionAccessor>();\n\n function getAccessor(slug: string): CollectionAccessor {\n let accessor = cache.get(slug);\n if (!accessor) {\n accessor = createDriverAccessor(driver, slug);\n cache.set(slug, accessor);\n }\n return accessor;\n }\n\n const target = {\n collection: getAccessor\n } as RebaseData;\n\n return new Proxy(target, {\n get(_target, prop: string | symbol) {\n if (prop === \"collection\") return getAccessor;\n // Ignore Symbol properties (e.g. Symbol.toPrimitive, Symbol.iterator)\n if (typeof prop === \"symbol\") return undefined;\n // Ignore internal JS properties\n if (prop === \"then\" || prop === \"toJSON\" || prop === \"$$typeof\") return undefined;\n return getAccessor(prop);\n }\n });\n}\n","import { and, eq, or, sql, SQL, ilike, inArray } from \"drizzle-orm\";\nimport { AnyPgColumn, PgTable } from \"drizzle-orm/pg-core\";\nimport { FilterValues, WhereFilterOp, Relation, JoinStep } from \"@rebasepro/types\";\nimport { getColumnName, resolveCollectionRelations } from \"@rebasepro/common\";\nimport { PostgresCollectionRegistry } from \"../collections/PostgresCollectionRegistry\";\nimport { ConditionBuilderStatic } from \"../interfaces\";\n\n/** Drizzle dynamic query builder — accepts innerJoin + where chaining */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface DrizzleDynamicQuery {\n innerJoin(table: PgTable<any>, condition: SQL): this;\n where(condition: SQL | undefined): this;\n limit(limit: number): this;\n}\n\n/**\n * Unified condition builder for Drizzle/PostgreSQL queries.\n * \n * This class uses static methods and satisfies the ConditionBuilderStatic<SQL> type.\n * It translates Rebase filter conditions to Drizzle SQL conditions.\n * \n * @example\n * const builder: ConditionBuilderStatic<SQL> = DrizzleConditionBuilder;\n */\nexport class DrizzleConditionBuilder {\n\n /**\n * Build filter conditions from FilterValues\n */\n static buildFilterConditions<M extends Record<string, any>>(\n filter: FilterValues<Extract<keyof M, string>>,\n table: PgTable<any>,\n collectionPath: string\n ): SQL[] {\n const conditions: SQL[] = [];\n\n for (const [field, filterParam] of Object.entries(filter)) {\n if (!filterParam) continue;\n\n const [op, value] = filterParam as [WhereFilterOp, any];\n const fieldColumn = table[field as keyof typeof table] as AnyPgColumn;\n\n if (!fieldColumn) {\n console.warn(`Filtering by field '${field}', but it does not exist in table for collection '${collectionPath}'`);\n continue;\n }\n\n const condition = this.buildSingleFilterCondition(fieldColumn, op, value);\n if (condition) {\n conditions.push(condition);\n }\n }\n\n return conditions;\n }\n\n /**\n * Build a single filter condition for a specific operator and value\n */\n static buildSingleFilterCondition(\n column: AnyPgColumn,\n op: WhereFilterOp,\n value: unknown\n ): SQL | null {\n switch (op) {\n case \"==\":\n return eq(column, value);\n case \"!=\":\n return sql`${column} != ${value}`;\n case \">\":\n return sql`${column} > ${value}`;\n case \">=\":\n return sql`${column} >= ${value}`;\n case \"<\":\n return sql`${column} < ${value}`;\n case \"<=\":\n return sql`${column} <= ${value}`;\n case \"in\":\n if (Array.isArray(value) && value.length > 0) {\n return inArray(column, value);\n }\n return null;\n case \"array-contains\":\n // For JSONB arrays\n return sql`${column} @> ${JSON.stringify([value])}`;\n default:\n console.warn(`Unsupported filter operation: ${op}`);\n return null;\n }\n }\n\n /**\n * Build relation-based conditions for different relation types\n */\n static buildRelationConditions(\n relation: Relation,\n parentEntityId: string | number | (string | number)[],\n targetTable: PgTable<any>,\n parentTable: PgTable<any>,\n parentIdColumn: AnyPgColumn,\n targetIdColumn: AnyPgColumn,\n registry: PostgresCollectionRegistry\n ): {\n joinConditions: { table: PgTable<any>; condition: SQL }[];\n whereConditions: SQL[];\n } {\n console.debug(`🔍 [buildRelationConditions] Building conditions for relation:`, {\n relationName: relation.relationName,\n cardinality: relation.cardinality,\n direction: relation.direction,\n hasThrough: !!relation.through,\n hasForeignKeyOnTarget: !!relation.foreignKeyOnTarget,\n inverseRelationName: relation.inverseRelationName,\n parentEntityId: parentEntityId\n });\n\n const joinConditions: { table: PgTable<any>; condition: SQL }[] = [];\n const whereConditions: SQL[] = [];\n\n if (relation.joinPath && relation.joinPath.length > 0) {\n console.debug(`🔍 [buildRelationConditions] Using joinPath logic`);\n // Handle join path relations\n const {\n joins,\n finalCondition\n } = this.buildJoinPathConditions(\n relation.joinPath,\n targetTable,\n parentTable,\n parentIdColumn,\n parentEntityId,\n registry\n );\n joinConditions.push(...joins);\n whereConditions.push(finalCondition);\n\n } else if (relation.through && relation.cardinality === \"many\" && relation.direction === \"owning\") {\n console.debug(`🔍 [buildRelationConditions] Using owning many-to-many with explicit through`);\n // Handle many-to-many relations with junction table\n const junctionResult = this.buildJunctionTableConditions(\n relation.through,\n targetIdColumn,\n parentEntityId,\n registry\n );\n joinConditions.push(junctionResult.join);\n whereConditions.push(junctionResult.condition);\n\n } else if (relation.through && relation.cardinality === \"many\" && relation.direction === \"inverse\") {\n console.debug(`🔍 [buildRelationConditions] Using inverse many-to-many with explicit through`);\n // Handle inverse many-to-many relations with junction table\n const junctionResult = this.buildInverseJunctionTableConditions(\n relation.through,\n targetIdColumn,\n parentEntityId,\n registry\n );\n joinConditions.push(junctionResult.join);\n whereConditions.push(junctionResult.condition);\n\n } else if (relation.cardinality === \"many\" && relation.direction === \"inverse\" && !relation.through) {\n console.debug(`🔍 [buildRelationConditions] Handling inverse many relationship without explicit through`);\n\n // First, try to find a junction table (for many-to-many relationships)\n const junctionInfo = this.findCorrespondingJunctionTable(relation, registry);\n if (junctionInfo) {\n console.debug(`🔍 [buildRelationConditions] Found junction info for inverse many-to-many, building junction conditions`);\n const junctionResult = this.buildInverseJunctionTableConditions(\n junctionInfo,\n targetIdColumn,\n parentEntityId,\n registry\n );\n joinConditions.push(junctionResult.join);\n whereConditions.push(junctionResult.condition);\n } else if (relation.foreignKeyOnTarget) {\n console.debug(`🔍 [buildRelationConditions] No junction table found, treating as inverse one-to-many with foreign key on target`);\n // This is a true inverse one-to-many relationship\n const simpleCondition = this.buildSimpleRelationCondition(\n relation,\n targetTable,\n parentTable,\n parentEntityId\n );\n whereConditions.push(simpleCondition);\n } else {\n console.error(`🔍 [buildRelationConditions] Failed to find junction table info and no foreign key specified`);\n throw new Error(`Cannot resolve inverse many relation '${relation.relationName}'. Either specify 'through' property, ensure corresponding owning relation exists with junction table configuration, or specify 'foreignKeyOnTarget' for one-to-many relationships.`);\n }\n } else {\n console.debug(`🔍 [buildRelationConditions] Using simple relation logic - THIS IS WHERE THE ERROR MIGHT OCCUR`);\n // Handle simple relations\n const simpleCondition = this.buildSimpleRelationCondition(\n relation,\n targetTable,\n parentTable,\n parentEntityId\n );\n whereConditions.push(simpleCondition);\n }\n\n console.debug(`🔍 [buildRelationConditions] Final result:`, {\n joinConditionsCount: joinConditions.length,\n whereConditionsCount: whereConditions.length\n });\n\n return {\n joinConditions,\n whereConditions\n };\n }\n\n /**\n * Build conditions for join path relations\n */\n private static buildJoinPathConditions(\n joinPath: JoinStep[],\n targetTable: PgTable<any>,\n parentTable: PgTable<any>,\n parentIdColumn: AnyPgColumn,\n parentEntityId: string | number | (string | number)[],\n registry: PostgresCollectionRegistry\n ): {\n joins: { table: PgTable<any>; condition: SQL }[];\n finalCondition: SQL;\n } {\n const joins: { table: PgTable<any>; condition: SQL }[] = [];\n let currentTable = targetTable;\n\n // Process join steps in reverse order to build path back to parent\n for (const joinStep of [...joinPath].reverse()) {\n const fromTableName = this.getTableNamesFromColumns(joinStep.on.from)[0];\n const toTableName = this.getTableNamesFromColumns(joinStep.on.to)[0];\n const fromColName = this.getColumnNamesFromColumns(joinStep.on.from)[0];\n const toColName = this.getColumnNamesFromColumns(joinStep.on.to)[0];\n\n const fromTable = registry.getTable(fromTableName);\n const toTable = registry.getTable(toTableName);\n\n if (!fromTable || !toTable) {\n throw new Error(`Join tables not found for step: from ${fromTableName} to ${toTableName}`);\n }\n\n const {\n joinTable,\n condition,\n additionalJoins\n } = this.buildSingleJoinCondition(\n currentTable,\n fromTable,\n toTable,\n fromColName,\n toColName,\n fromTableName,\n toTableName,\n registry\n );\n\n joins.push({\n table: joinTable,\n condition\n });\n currentTable = joinTable;\n\n // Add any additional joins needed for many-to-many relationships\n if (additionalJoins && additionalJoins.length > 0) {\n joins.push(...additionalJoins);\n }\n }\n\n // Ensure we've connected back to the parent table\n // For junction tables, we might end up at the junction table instead of the parent table\n if (currentTable !== parentTable) {\n // Try to get table names from the Drizzle table objects\n let currentTableName = \"unknown\";\n let parentTableName = \"unknown\";\n\n // Try multiple ways to extract table names from Drizzle objects\n if (currentTable && typeof currentTable === \"object\") {\n // Check common Drizzle table name properties\n currentTableName = (currentTable as unknown as Record<string | symbol, unknown>)[Symbol.for(\"drizzle:Name\")] as string ||\n ((currentTable as unknown as Record<string, unknown>)._ as Record<string, unknown>)?.name as string ||\n (currentTable as unknown as Record<string, unknown>).tableName as string ||\n (currentTable as unknown as Record<string, unknown>).name as string ||\n \"unknown\";\n }\n\n if (parentTable && typeof parentTable === \"object\") {\n parentTableName = (parentTable as unknown as Record<string | symbol, unknown>)[Symbol.for(\"drizzle:Name\")] as string ||\n ((parentTable as unknown as Record<string, unknown>)._ as Record<string, unknown>)?.name as string ||\n (parentTable as unknown as Record<string, unknown>).tableName as string ||\n (parentTable as unknown as Record<string, unknown>).name as string ||\n \"unknown\";\n }\n\n // For junction table scenarios, be more lenient with validation\n // If we can't determine table names reliably, or if this looks like a junction table scenario,\n // we'll allow it and let the SQL execution validate the correctness\n const couldBeJunctionScenario = currentTableName.includes(\"_\") ||\n currentTableName === \"unknown\" ||\n parentTableName === \"unknown\";\n\n if (!couldBeJunctionScenario) {\n throw new Error(`Join path did not result in connecting to parent table. Current: ${currentTableName}, Parent: ${parentTableName}`);\n }\n }\n\n // Handle both single ID and array of IDs\n const finalCondition = Array.isArray(parentEntityId)\n ? inArray(parentIdColumn, parentEntityId)\n : eq(parentIdColumn, parentEntityId);\n\n return {\n joins,\n finalCondition\n };\n }\n\n /**\n * Build a single join condition between tables\n */\n private static buildSingleJoinCondition(\n currentTable: PgTable<any>,\n fromTable: PgTable<any>,\n toTable: PgTable<any>,\n fromColName: string,\n toColName: string,\n fromTableName: string,\n toTableName: string,\n registry?: PostgresCollectionRegistry\n ): { joinTable: PgTable<any>; condition: SQL; additionalJoins?: { table: PgTable<any>; condition: SQL }[] } {\n let joinTable: PgTable<any>;\n let condition: SQL;\n const additionalJoins: { table: PgTable<any>; condition: SQL }[] = [];\n\n if (currentTable === toTable) {\n // current -> toTable, so join the fromTable\n const left = fromTable[fromColName as keyof typeof fromTable] as AnyPgColumn;\n const right = (currentTable as unknown as Record<string, unknown>)[toColName] as AnyPgColumn;\n\n if (!left || !right) {\n // Check if this might be a many-to-many relationship requiring a junction table\n if (registry) {\n const junctionResult = this.tryBuildJunctionJoin(\n currentTable,\n fromTable,\n fromColName,\n toColName,\n fromTableName,\n toTableName,\n registry\n );\n if (junctionResult) {\n return junctionResult;\n }\n }\n throw new Error(`Join columns not found: ${fromTableName}.${fromColName} = ${toTableName}.${toColName}`);\n }\n\n joinTable = fromTable;\n condition = eq(left, right);\n } else if (currentTable === fromTable) {\n // current -> fromTable, so join the toTable\n const left = toTable[toColName as keyof typeof toTable] as AnyPgColumn;\n const right = (currentTable as unknown as Record<string, unknown>)[fromColName] as AnyPgColumn;\n\n if (!left || !right) {\n // Check if this might be a many-to-many relationship requiring a junction table\n if (registry) {\n const junctionResult = this.tryBuildJunctionJoin(\n currentTable,\n toTable,\n fromColName,\n toColName,\n fromTableName,\n toTableName,\n registry\n );\n if (junctionResult) {\n return junctionResult;\n }\n }\n throw new Error(`Join columns not found: ${toTableName}.${toColName} = ${fromTableName}.${fromColName}`);\n }\n\n joinTable = toTable;\n condition = eq(left, right);\n } else {\n throw new Error(`Join step does not match current table. Current table does not match from: ${fromTableName} or to: ${toTableName}`);\n }\n\n return {\n joinTable,\n condition,\n additionalJoins\n };\n }\n\n /**\n * Try to build a junction table join when direct foreign key relationship is not found\n */\n private static tryBuildJunctionJoin(\n currentTable: PgTable<any>,\n targetTable: PgTable<any>,\n fromColName: string,\n toColName: string,\n fromTableName: string,\n toTableName: string,\n registry: PostgresCollectionRegistry\n ): { joinTable: PgTable<any>; condition: SQL; additionalJoins: { table: PgTable<any>; condition: SQL }[] } | null {\n // Try to find a junction table that connects these two tables\n // Common naming patterns: table1_table2, table1Table2, etc.\n const possibleJunctionNames = [\n `${fromTableName}_${toTableName}`,\n `${toTableName}_${fromTableName}`,\n `${fromTableName}${toTableName.charAt(0).toUpperCase() + toTableName.slice(1)}`,\n `${toTableName}${fromTableName.charAt(0).toUpperCase() + fromTableName.slice(1)}`\n ];\n\n for (const junctionName of possibleJunctionNames) {\n const junctionTable = registry.getTable(junctionName);\n if (junctionTable) {\n // Try to find the appropriate columns in the junction table\n const sourceColName = `${fromTableName.slice(0, -1)}_id`; // Remove 's' and add '_id'\n const targetColName = `${toTableName.slice(0, -1)}_id`;\n\n const junctionSourceCol = junctionTable[sourceColName as keyof typeof junctionTable] as AnyPgColumn;\n const junctionTargetCol = junctionTable[targetColName as keyof typeof junctionTable] as AnyPgColumn;\n\n if (junctionSourceCol && junctionTargetCol) {\n // Found a valid junction table setup\n const currentTableIdCol = Object.values(currentTable).find((col: Record<string, unknown>) => col.primary) as AnyPgColumn;\n const targetTableIdCol = Object.values(targetTable).find((col: Record<string, unknown>) => col.primary) as AnyPgColumn;\n\n if (!currentTableIdCol || !targetTableIdCol) {\n continue; // Skip if we can't find primary keys\n }\n\n // Determine which direction to join\n if (currentTable === targetTable) {\n // We're joining through junction to reach the other table\n return {\n joinTable: targetTable,\n condition: eq(targetTableIdCol, junctionTargetCol),\n additionalJoins: [\n {\n table: junctionTable,\n condition: eq(currentTableIdCol, junctionSourceCol)\n }\n ]\n };\n } else {\n // Standard junction join\n return {\n joinTable: junctionTable,\n condition: eq(currentTableIdCol, junctionSourceCol),\n additionalJoins: [\n {\n table: targetTable,\n condition: eq(targetTableIdCol, junctionTargetCol)\n }\n ]\n };\n }\n }\n }\n }\n\n return null; // No junction table found\n }\n\n /**\n * Build conditions for junction table (many-to-many) relations\n */\n private static buildJunctionTableConditions(\n through: { table: string; sourceColumn: string; targetColumn: string },\n targetIdColumn: AnyPgColumn,\n parentEntityId: string | number | (string | number)[],\n registry: PostgresCollectionRegistry\n ): { join: { table: PgTable<any>; condition: SQL }; condition: SQL } {\n const junctionTable = registry.getTable(through.table);\n if (!junctionTable) {\n throw new Error(`Junction table not found: ${through.table}`);\n }\n\n const junctionSourceCol = junctionTable[through.sourceColumn as keyof typeof junctionTable] as AnyPgColumn;\n const junctionTargetCol = junctionTable[through.targetColumn as keyof typeof junctionTable] as AnyPgColumn;\n\n if (!junctionSourceCol) {\n throw new Error(`Source column '${through.sourceColumn}' not found in junction table '${through.table}'`);\n }\n if (!junctionTargetCol) {\n throw new Error(`Target column '${through.targetColumn}' not found in junction table '${through.table}'`);\n }\n\n // Handle both single ID and array of IDs\n const condition = Array.isArray(parentEntityId)\n ? inArray(junctionSourceCol, parentEntityId)\n : eq(junctionSourceCol, parentEntityId);\n\n return {\n join: {\n table: junctionTable,\n condition: eq(targetIdColumn, junctionTargetCol)\n },\n condition\n };\n }\n\n /**\n * Build conditions for inverse junction table (many-to-many) relations\n */\n private static buildInverseJunctionTableConditions(\n through: { table: string; sourceColumn: string; targetColumn: string },\n targetIdColumn: AnyPgColumn,\n parentEntityId: string | number | (string | number)[],\n registry: PostgresCollectionRegistry\n ): { join: { table: PgTable<any>; condition: SQL }; condition: SQL } {\n const junctionTable = registry.getTable(through.table);\n if (!junctionTable) {\n throw new Error(`Junction table not found: ${through.table}`);\n }\n\n const junctionSourceCol = junctionTable[through.sourceColumn as keyof typeof junctionTable] as AnyPgColumn;\n const junctionTargetCol = junctionTable[through.targetColumn as keyof typeof junctionTable] as AnyPgColumn;\n\n if (!junctionSourceCol) {\n throw new Error(`Source column '${through.sourceColumn}' not found in junction table '${through.table}'`);\n }\n if (!junctionTargetCol) {\n throw new Error(`Target column '${through.targetColumn}' not found in junction table '${through.table}'`);\n }\n\n // For inverse relations, the parentEntityId (tag ID) should match the sourceColumn (tag_id)\n // and we want to find target entities (posts) through the targetColumn (post_id)\n const condition = Array.isArray(parentEntityId)\n ? inArray(junctionSourceCol, parentEntityId)\n : eq(junctionSourceCol, parentEntityId);\n\n return {\n join: {\n table: junctionTable,\n condition: eq(targetIdColumn, junctionTargetCol)\n },\n condition\n };\n }\n\n /**\n * Build conditions for simple relations (owning/inverse without join paths)\n */\n private static buildSimpleRelationCondition(\n relation: Relation,\n targetTable: PgTable<any>,\n parentTable: PgTable<any>,\n parentEntityId: string | number | (string | number)[]\n ): SQL {\n if (relation.direction === \"owning\" && relation.localKey) {\n // For owning relations, the parentEntityId is actually the foreign key value\n // that should match the target table's primary key\n const targetIdCol = Object.values(targetTable).find((col: Record<string, unknown>) => col.primary) as AnyPgColumn;\n if (!targetIdCol) {\n // Fallback to looking for an \"id\" column by name\n const idCol = Object.values(targetTable).find((col: Record<string, unknown>) => col.name === \"id\") as AnyPgColumn;\n if (!idCol) {\n throw new Error(\"No primary key or \\\"id\\\" column found in target table\");\n }\n return Array.isArray(parentEntityId)\n ? inArray(idCol, parentEntityId)\n : eq(idCol, parentEntityId);\n }\n return Array.isArray(parentEntityId)\n ? inArray(targetIdCol, parentEntityId)\n : eq(targetIdCol, parentEntityId);\n\n } else if (relation.direction === \"inverse\" && relation.foreignKeyOnTarget) {\n // Inverse relation: use foreign key on target table\n const foreignKeyCol = targetTable[relation.foreignKeyOnTarget as keyof typeof targetTable] as AnyPgColumn;\n if (!foreignKeyCol) {\n // This could be a many-to-many relationship where foreignKeyOnTarget was set by sanitizeRelation\n // but the column doesn't actually exist. In this case, we should suggest using junction tables.\n throw new Error(`Foreign key column '${relation.foreignKeyOnTarget}' not found in target table. This might be a many-to-many relationship that requires a junction table. Consider using 'through' property or ensure the corresponding owning relation exists with junction table configuration.`);\n }\n return Array.isArray(parentEntityId)\n ? inArray(foreignKeyCol, parentEntityId)\n : eq(foreignKeyCol, parentEntityId);\n\n } else if (relation.direction === \"inverse\" && relation.cardinality === \"many\" && relation.inverseRelationName) {\n // For inverse many-to-many relations, this should not be called directly\n // The buildRelationConditions method should handle finding the junction table\n // If we reach here, it means the junction table lookup failed\n throw new Error(`Inverse many-to-many relation '${relation.relationName}' requires a junction table. Either specify 'through' property or ensure the corresponding owning relation exists with junction table configuration.`);\n\n } else if (relation.direction === \"inverse\" && relation.cardinality === \"one\" && relation.inverseRelationName) {\n // Auto-infer foreign key column for inverse one-to-one relations\n // Pattern: {inverseRelationName}_id (e.g., \"author\" -> \"author_id\")\n const inferredForeignKeyName = `${relation.inverseRelationName}_id`;\n const foreignKeyCol = targetTable[inferredForeignKeyName as keyof typeof targetTable] as AnyPgColumn;\n\n if (!foreignKeyCol) {\n throw new Error(`Auto-inferred foreign key column '${inferredForeignKeyName}' not found in target table for inverse relation '${relation.relationName}'. Please specify 'foreignKeyOnTarget' explicitly.`);\n }\n\n console.debug(`🔍 [DrizzleConditionBuilder] Auto-inferred foreign key '${inferredForeignKeyName}' for inverse relation '${relation.relationName}'`);\n\n return Array.isArray(parentEntityId)\n ? inArray(foreignKeyCol, parentEntityId)\n : eq(foreignKeyCol, parentEntityId);\n\n } else {\n throw new Error(`Relation '${relation.relationName}' lacks proper configuration. For many-to-many relations, use 'through' property. For simple relations, use 'localKey' or 'foreignKeyOnTarget'.`);\n }\n }\n\n /**\n * Combine multiple conditions with AND operator\n */\n static combineConditionsWithAnd(conditions: SQL[]): SQL | undefined {\n if (conditions.length === 0) return undefined;\n if (conditions.length === 1) return conditions[0];\n return and(...conditions);\n }\n\n /**\n * Combine multiple conditions with OR operator\n */\n static combineConditionsWithOr(conditions: SQL[]): SQL | undefined {\n if (conditions.length === 0) return undefined;\n if (conditions.length === 1) return conditions[0];\n return or(...conditions);\n }\n\n /**\n * Build search conditions for text fields\n */\n static buildSearchConditions(\n searchString: string,\n properties: Record<string, any>,\n table: PgTable<any>\n ): SQL[] {\n const searchConditions: SQL[] = [];\n\n for (const [key, prop] of Object.entries(properties)) {\n // Only include string properties that don't have enum defined\n // PostgreSQL enum and uuid columns don't support ILIKE, so we skip them\n if (prop.type === \"string\" && !prop.enum && prop.isId !== \"uuid\") {\n const fieldColumn = table[key as keyof typeof table] as AnyPgColumn;\n if (fieldColumn) {\n searchConditions.push(ilike(fieldColumn, `%${searchString}%`));\n }\n }\n }\n\n return searchConditions;\n }\n\n /**\n * Build a unique field check condition\n */\n static buildUniqueFieldCondition(\n fieldColumn: AnyPgColumn,\n value: unknown,\n idColumn?: AnyPgColumn,\n excludeId?: string | number\n ): SQL[] {\n const conditions: SQL[] = [eq(fieldColumn, value)];\n\n if (excludeId && idColumn) {\n conditions.push(sql`${idColumn} != ${excludeId}`);\n }\n\n return conditions;\n }\n\n /**\n * Build relation-based query with joins and conditions\n */\n static buildRelationQuery<T extends DrizzleDynamicQuery>(\n baseQuery: T,\n relation: Relation,\n parentEntityId: string | number | (string | number)[],\n targetTable: PgTable<any>,\n parentTable: PgTable<any>,\n parentIdColumn: AnyPgColumn,\n targetIdColumn: AnyPgColumn,\n registry: PostgresCollectionRegistry,\n additionalFilters?: SQL[]\n ): T {\n const { joinConditions, whereConditions } = this.buildRelationConditions(\n relation,\n parentEntityId,\n targetTable,\n parentTable,\n parentIdColumn,\n targetIdColumn,\n registry\n );\n\n let query = baseQuery;\n\n // Apply joins\n for (const { table, condition } of joinConditions) {\n query = query.innerJoin(table, condition);\n }\n\n // Combine all conditions\n const allConditions = [...whereConditions];\n if (additionalFilters) {\n allConditions.push(...additionalFilters);\n }\n\n // Apply where conditions\n if (allConditions.length > 0) {\n query = query.where(and(...allConditions));\n }\n\n return query;\n }\n\n /**\n * Build count query for relations with proper joins and conditions\n */\n static buildRelationCountQuery<T extends DrizzleDynamicQuery>(\n baseCountQuery: T,\n relation: Relation,\n parentEntityId: string | number,\n targetTable: PgTable<any>,\n parentTable: PgTable<any>,\n parentIdColumn: AnyPgColumn,\n targetIdColumn: AnyPgColumn,\n registry: PostgresCollectionRegistry,\n additionalFilters?: SQL[]\n ): T {\n // For count queries, we need to handle joins differently to avoid duplicates\n if (relation.joinPath && relation.joinPath.length > 0) {\n return this.buildJoinPathCountQuery(\n baseCountQuery,\n relation.joinPath,\n targetTable,\n parentTable,\n parentIdColumn,\n parentEntityId,\n registry,\n additionalFilters\n );\n } else if (relation.through && relation.cardinality === \"many\" && relation.direction === \"owning\") {\n return this.buildJunctionCountQuery(\n baseCountQuery,\n relation.through,\n targetIdColumn,\n parentEntityId,\n registry,\n additionalFilters\n );\n } else if (relation.through && relation.cardinality === \"many\" && relation.direction === \"inverse\") {\n return this.buildInverseJunctionCountQuery(\n baseCountQuery,\n relation.through,\n targetIdColumn,\n parentEntityId,\n registry,\n additionalFilters\n );\n } else {\n // Simple relations\n const simpleCondition = this.buildSimpleRelationCondition(\n relation,\n targetTable,\n parentTable,\n parentEntityId\n );\n\n const allConditions = [simpleCondition];\n if (additionalFilters) {\n allConditions.push(...additionalFilters);\n }\n\n return baseCountQuery.where(and(...allConditions));\n }\n }\n\n /**\n * Build join path conditions for count queries\n */\n private static buildJoinPathCountQuery<T extends DrizzleDynamicQuery>(\n baseCountQuery: T,\n joinPath: JoinStep[],\n targetTable: PgTable<any>,\n parentTable: PgTable<any>,\n parentIdColumn: AnyPgColumn,\n parentEntityId: string | number,\n registry: PostgresCollectionRegistry,\n additionalFilters?: SQL[]\n ): T {\n let query = baseCountQuery;\n let currentTable = targetTable;\n\n // Process join steps in reverse order\n for (const joinStep of [...joinPath].reverse()) {\n const fromTableName = this.getTableNamesFromColumns(joinStep.on.from)[0];\n const toTableName = this.getTableNamesFromColumns(joinStep.on.to)[0];\n const fromColName = this.getColumnNamesFromColumns(joinStep.on.from)[0];\n const toColName = this.getColumnNamesFromColumns(joinStep.on.to)[0];\n\n const fromTable = registry.getTable(fromTableName);\n const toTable = registry.getTable(toTableName);\n\n if (!fromTable || !toTable) {\n throw new Error(`Join tables not found for step: from ${fromTableName} to ${toTableName}`);\n }\n\n const { joinTable, condition } = this.buildSingleJoinCondition(\n currentTable,\n fromTable,\n toTable,\n fromColName,\n toColName,\n fromTableName,\n toTableName\n );\n\n query = query.innerJoin(joinTable, condition);\n currentTable = joinTable;\n }\n\n if (currentTable !== parentTable) {\n throw new Error(\"Join path did not result in connecting to parent table\");\n }\n\n const allConditions = [eq(parentIdColumn, parentEntityId)];\n if (additionalFilters) {\n allConditions.push(...additionalFilters);\n }\n\n return query.where(and(...allConditions));\n }\n\n /**\n * Build junction table conditions for count queries\n */\n private static buildJunctionCountQuery<T extends DrizzleDynamicQuery>(\n baseCountQuery: T,\n through: { table: string; sourceColumn: string; targetColumn: string },\n targetIdColumn: AnyPgColumn,\n parentEntityId: string | number,\n registry: PostgresCollectionRegistry,\n additionalFilters?: SQL[]\n ): T {\n const junctionTable = registry.getTable(through.table);\n if (!junctionTable) {\n throw new Error(`Junction table not found: ${through.table}`);\n }\n\n const junctionSourceCol = junctionTable[through.sourceColumn as keyof typeof junctionTable] as AnyPgColumn;\n const junctionTargetCol = junctionTable[through.targetColumn as keyof typeof junctionTable] as AnyPgColumn;\n\n if (!junctionSourceCol) {\n throw new Error(`Source column '${through.sourceColumn}' not found in junction table '${through.table}'`);\n }\n if (!junctionTargetCol) {\n throw new Error(`Target column '${through.targetColumn}' not found in junction table '${through.table}'`);\n }\n\n const baseConditions = [eq(junctionSourceCol, parentEntityId)];\n if (additionalFilters && additionalFilters.length > 0) {\n baseConditions.push(...additionalFilters);\n }\n\n return baseCountQuery\n .innerJoin(junctionTable, eq(targetIdColumn, junctionTargetCol))\n .where(and(...baseConditions));\n }\n\n /**\n * Build inverse junction table conditions for count queries\n */\n private static buildInverseJunctionCountQuery<T extends DrizzleDynamicQuery>(\n baseCountQuery: T,\n through: { table: string; sourceColumn: string; targetColumn: string },\n targetIdColumn: AnyPgColumn,\n parentEntityId: string | number,\n registry: PostgresCollectionRegistry,\n additionalFilters?: SQL[]\n ): T {\n const junctionTable = registry.getTable(through.table);\n if (!junctionTable) {\n throw new Error(`Junction table not found: ${through.table}`);\n }\n\n const junctionSourceCol = junctionTable[through.sourceColumn as keyof typeof junctionTable] as AnyPgColumn;\n const junctionTargetCol = junctionTable[through.targetColumn as keyof typeof junctionTable] as AnyPgColumn;\n\n if (!junctionSourceCol) {\n throw new Error(`Source column '${through.sourceColumn}' not found in junction table '${through.table}'`);\n }\n if (!junctionTargetCol) {\n throw new Error(`Target column '${through.targetColumn}' not found in junction table '${through.table}'`);\n }\n\n const baseConditions = [eq(junctionSourceCol, parentEntityId)];\n if (additionalFilters && additionalFilters.length > 0) {\n baseConditions.push(...additionalFilters);\n }\n\n return baseCountQuery\n .innerJoin(junctionTable, eq(targetIdColumn, junctionTargetCol))\n .where(and(...baseConditions));\n }\n\n /**\n * Helper method to extract table names from columns\n */\n static getTableNamesFromColumns(columns: string | string[]): string[] {\n if (Array.isArray(columns)) {\n return columns.map(col => col.includes(\".\") ? col.split(\".\")[0] : \"\");\n }\n return [columns.includes(\".\") ? columns.split(\".\")[0] : \"\"];\n }\n\n /**\n * Helper method to extract column names from columns\n */\n static getColumnNamesFromColumns(columns: string | string[]): string[] {\n if (Array.isArray(columns)) {\n return columns.map(col => getColumnName(col));\n }\n return [getColumnName(columns)];\n }\n\n /**\n * Find the corresponding junction table for an inverse many-to-many relation\n */\n private static findCorrespondingJunctionTable(\n relation: Relation,\n registry: PostgresCollectionRegistry\n ): { table: string; sourceColumn: string; targetColumn: string } | null {\n try {\n console.debug(`🔍 [findCorrespondingJunctionTable] Looking for junction table for inverse relation '${relation.relationName}' with inverseRelationName '${relation.inverseRelationName}'`);\n\n if (!relation.inverseRelationName) {\n console.debug(`🔍 [findCorrespondingJunctionTable] No inverseRelationName specified`);\n return null;\n }\n\n // Get the target collection of the inverse relation\n const targetCollection = relation.target();\n console.debug(`🔍 [findCorrespondingJunctionTable] Target collection: ${targetCollection.slug}`);\n\n // Find the corresponding owning relation on the target collection\n const targetCollectionRelations = resolveCollectionRelations(targetCollection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n console.debug(`🔍 [findCorrespondingJunctionTable] Target collection relations:`, Object.keys(targetCollectionRelations));\n\n // Look for the owning many-to-many relation that matches our inverseRelationName\n const correspondingRelation = targetCollectionRelations[relation.inverseRelationName];\n\n if (!correspondingRelation) {\n console.debug(`🔍 [findCorrespondingJunctionTable] No relation found with key '${relation.inverseRelationName}' on target collection`);\n return null;\n }\n\n console.debug(`🔍 [findCorrespondingJunctionTable] Found relation:`, {\n relationName: correspondingRelation.relationName,\n cardinality: correspondingRelation.cardinality,\n direction: correspondingRelation.direction,\n hasThrough: !!correspondingRelation.through\n });\n\n // Verify it's an owning many-to-many relation with junction table\n if (correspondingRelation.cardinality !== \"many\" ||\n correspondingRelation.direction !== \"owning\" ||\n !correspondingRelation.through) {\n console.debug(`🔍 [findCorrespondingJunctionTable] Relation is not an owning many-to-many with junction table`);\n return null;\n }\n\n console.debug(`🔍 [findCorrespondingJunctionTable] Found matching owning relation with junction table!`);\n\n // For inverse relation, we need to swap source and target columns\n const through = correspondingRelation.through;\n const result = {\n table: through.table,\n sourceColumn: through.targetColumn, // Swapped for inverse relation\n targetColumn: through.sourceColumn // Swapped for inverse relation\n };\n\n console.debug(`🔍 [findCorrespondingJunctionTable] Returning junction info:`, result);\n return result;\n } catch (error) {\n console.error(`🔍 [findCorrespondingJunctionTable] Error finding corresponding junction table for relation '${relation.relationName}':`, error);\n return null;\n }\n }\n}\n\n/**\n * Alias for DrizzleConditionBuilder for consistent naming with other database implementations.\n * This allows code to use PostgresConditionBuilder alongside future MongoConditionBuilder, etc.\n */\nexport const PostgresConditionBuilder = DrizzleConditionBuilder;\n","import { PgTable, AnyPgColumn } from \"drizzle-orm/pg-core\";\nimport { EntityCollection, Property } from \"@rebasepro/types\";\nimport { PostgresCollectionRegistry } from \"../collections/PostgresCollectionRegistry\";\nimport { getTableName } from \"@rebasepro/common\";\n\n/**\n * Shared helper functions for entity operations.\n * These are used by EntityFetchService, EntityPersistService, and RelationService.\n *\n * All functions that need collection/table lookups require an explicit\n * `PostgresCollectionRegistry` instance — there is no global singleton.\n */\n\nexport function getCollectionByPath(collectionPath: string, registry: PostgresCollectionRegistry): EntityCollection {\n const collection = registry.getCollectionByPath(collectionPath);\n if (!collection) {\n throw new Error(`Collection not found: ${collectionPath}`);\n }\n return collection;\n}\n\nexport function getTableForCollection(collection: EntityCollection, registry: PostgresCollectionRegistry): PgTable<any> {\n const tableName = getTableName(collection);\n const table = registry.getTable(tableName);\n if (!table) {\n throw new Error(`Table not found for collection '${collection.slug}' (table: ${tableName})`);\n }\n return table;\n}\n\nexport function getPrimaryKeys(collection: EntityCollection, registry: PostgresCollectionRegistry): { fieldName: string; type: \"string\" | \"number\" }[] {\n const table = getTableForCollection(collection, registry);\n\n // Fallback to explicitly defined isId properties\n if (collection.properties) {\n const idProps = Object.entries(collection.properties)\n .filter(([_, prop]) => \"isId\" in (prop as object) && Boolean((prop as unknown as Record<string, unknown>).isId))\n .map(([key, prop]) => ({\n fieldName: key,\n type: prop.type === \"number\" ? \"number\" as const : \"string\" as const\n }));\n\n if (idProps.length > 0) {\n return idProps;\n }\n }\n\n // Otherwise infer from Drizzle schema\n const keys: { fieldName: string; type: \"string\" | \"number\" }[] = [];\n for (const [key, colRaw] of Object.entries(table)) {\n const col = colRaw as AnyPgColumn;\n if (col && typeof col === \"object\" && \"primary\" in col && col.primary) {\n const type = col.dataType === \"number\" || (col as unknown as Record<string, unknown>).columnType === \"PgSerial\" || (col as unknown as Record<string, unknown>).columnType === \"PgInteger\" ? \"number\" : \"string\";\n keys.push({ fieldName: key, type });\n }\n }\n\n // Default to 'id' if no primary keys are found and it exists in the schema\n // This maintains backwards compatibility\n if (keys.length === 0 && \"id\" in table) {\n const idCol = table[\"id\" as keyof typeof table] as AnyPgColumn;\n const type = idCol.dataType === \"number\" || (idCol as unknown as Record<string, unknown>).columnType === \"PgSerial\" || (idCol as unknown as Record<string, unknown>).columnType === \"PgInteger\" ? \"number\" : \"string\";\n keys.push({ fieldName: \"id\", type });\n }\n\n return keys;\n}\n\nexport function parseIdValues(idValue: string | number, primaryKeys: { fieldName: string; type: \"string\" | \"number\" }[]): Record<string, string | number> {\n const result: Record<string, string | number> = {};\n\n if (primaryKeys.length === 0) {\n return result;\n }\n\n if (primaryKeys.length === 1) {\n const pk = primaryKeys[0];\n if (pk.type === \"number\") {\n const parsed = typeof idValue === \"number\" ? idValue : parseInt(String(idValue), 10);\n if (isNaN(parsed)) {\n throw new Error(`Invalid numeric ID: ${idValue}`);\n }\n result[pk.fieldName] = parsed;\n } else {\n result[pk.fieldName] = String(idValue);\n }\n return result;\n }\n\n // Composite key - split by :::\n const parts = String(idValue).split(\":::\");\n if (parts.length !== primaryKeys.length) {\n throw new Error(`Composite ID parts mismatch. Expected ${primaryKeys.length}, got ${parts.length} for ID: ${idValue}`);\n }\n\n for (let i = 0; i < primaryKeys.length; i++) {\n const pk = primaryKeys[i];\n const val = parts[i];\n if (pk.type === \"number\") {\n const parsed = parseInt(val, 10);\n if (isNaN(parsed)) {\n throw new Error(`Invalid numeric ID component: ${val}`);\n }\n result[pk.fieldName] = parsed;\n } else {\n result[pk.fieldName] = val;\n }\n }\n\n return result;\n}\n\nexport function buildCompositeId(values: Record<string, any>, primaryKeys: { fieldName: string; type: \"string\" | \"number\" }[]): string {\n if (primaryKeys.length === 0) {\n return \"\";\n }\n if (primaryKeys.length === 1) {\n return String(values[primaryKeys[0].fieldName] ?? \"\");\n }\n return primaryKeys.map(pk => String(values[pk.fieldName] ?? \"\")).join(\":::\");\n}\n","import { eq, SQL } from \"drizzle-orm\";\nimport { AnyPgColumn } from \"drizzle-orm/pg-core\";\nimport { NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport { EntityCollection, Properties, Property, Relation, RelationProperty } from \"@rebasepro/types\";\nimport { getTableName, resolveCollectionRelations } from \"@rebasepro/common\";\nimport { PostgresCollectionRegistry } from \"./collections/PostgresCollectionRegistry\";\nimport { DrizzleConditionBuilder } from \"./utils/drizzle-conditions\";\nimport { getPrimaryKeys, buildCompositeId } from \"./services/entity-helpers\";\n\n/**\n * Data transformation utilities for converting between frontend and database formats.\n */\n\n/**\n * Helper function to sanitize and convert dates to ISO strings\n */\nexport function sanitizeAndConvertDates(obj: unknown): unknown {\n if (obj === null || obj === undefined) {\n return null;\n }\n\n if (typeof obj === \"number\" && isNaN(obj)) {\n return null;\n }\n\n if (typeof obj === \"string\" && obj.toLowerCase() === \"nan\") {\n return null;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(v => sanitizeAndConvertDates(v));\n }\n\n if (obj instanceof Date) {\n return obj.toISOString();\n }\n\n if (typeof obj === \"object\") {\n const newObj: Record<string, unknown> = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n newObj[key] = sanitizeAndConvertDates((obj as Record<string, unknown>)[key]);\n }\n }\n return newObj;\n }\n\n if (typeof obj === \"string\") {\n const isoDateRegex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$/;\n const jsDateRegex = /^\\w{3} \\w{3} \\d{2} \\d{4} \\d{2}:\\d{2}:\\d{2} GMT[+-]\\d{4} \\(.+\\)$/;\n if (isoDateRegex.test(obj) || jsDateRegex.test(obj)) {\n const date = new Date(obj);\n if (!isNaN(date.getTime())) {\n return date.toISOString();\n }\n }\n }\n\n return obj;\n}\n\n/**\n * Transform relations for database storage (relation objects to IDs)\n */\nexport function serializeDataToServer<M extends Record<string, any>>(\n entity: M,\n properties: Properties,\n collection?: EntityCollection,\n registry?: PostgresCollectionRegistry\n): Record<string, unknown> {\n if (!entity || !properties) return entity;\n\n const result: Record<string, unknown> = {};\n\n // Get normalized relations if collection is provided\n const resolvedRelations = collection ? resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>) : {};\n\n // Track inverse relations that need to be handled separately\n const inverseRelationUpdates: Array<{\n relationKey: string;\n relation: Relation;\n newValue: unknown;\n currentEntityId?: string | number;\n }> = [];\n const joinPathRelationUpdates: Array<{\n relationKey: string;\n relation: Relation;\n newTargetId: string | number | null;\n }> = [];\n\n for (const [key, value] of Object.entries(entity)) {\n const property = properties[key as keyof M] as Property;\n if (!property) {\n result[key] = value;\n continue;\n }\n\n // Handle relation properties specially\n if (property.type === \"relation\" && collection) {\n const relation = resolvedRelations[key];\n if (relation) {\n if (relation.direction === \"owning\" && relation.localKey) {\n // Owning relation: Map relation object to FK column on current table\n const serializedValue = serializePropertyToServer(value, property);\n if (serializedValue !== null && serializedValue !== undefined) {\n result[relation.localKey] = serializedValue;\n }\n // Don't add the original relation property to the result\n continue;\n } else if (relation.direction === \"inverse\" && relation.foreignKeyOnTarget) {\n // Inverse relation: Need to update the target table's FK\n const serializedValue = serializePropertyToServer(value, property);\n const pks = getPrimaryKeys(collection, registry!);\n inverseRelationUpdates.push({\n relationKey: key,\n relation,\n newValue: serializedValue,\n currentEntityId: entity.id || buildCompositeId(entity, pks)\n });\n // Don't add the original relation property to the result\n continue;\n } else if (relation.direction === \"inverse\" && relation.joinPath && relation.joinPath.length > 0) {\n const serializedValue = serializePropertyToServer(value, property);\n if (relation.cardinality === \"one\") {\n // One-to-one inverse joinPath: route through joinPathRelationUpdates.\n // The write ordering in EntityPersistService ensures these are processed\n // BEFORE the main UPDATE, so parentSourceCol reads the pre-update FK value.\n // This prevents stale values from corrupting related entities when an\n // intermediate FK (e.g. author_id) changes in the same save.\n joinPathRelationUpdates.push({\n relationKey: key,\n relation,\n newTargetId: serializedValue as string | number | null\n });\n } else {\n // Many inverse joinPath: capture as inverse relation update\n const pks = getPrimaryKeys(collection, registry!);\n inverseRelationUpdates.push({\n relationKey: key,\n relation,\n newValue: serializedValue,\n currentEntityId: entity.id || buildCompositeId(entity, pks)\n });\n }\n // Don't add the original relation property to the result\n continue;\n } else if (relation.cardinality === \"one\" && relation.direction === \"owning\" && relation.joinPath && relation.joinPath.length > 0) {\n // Owning one-to-one via joinPath: capture as a write intent\n const serializedValue = serializePropertyToServer(value, property);\n joinPathRelationUpdates.push({\n relationKey: key,\n relation,\n newTargetId: serializedValue as string | number | null\n });\n // Don't include this property directly in payload\n continue;\n }\n }\n }\n\n result[key] = serializePropertyToServer(value, property);\n }\n\n if (inverseRelationUpdates.length > 0) {\n (result as Record<string, unknown>).__inverseRelationUpdates = inverseRelationUpdates;\n }\n if (joinPathRelationUpdates.length > 0) {\n (result as Record<string, unknown>).__joinPathRelationUpdates = joinPathRelationUpdates;\n }\n\n return result;\n}\n\n/**\n * Serialize a single property value for database storage\n */\nexport function serializePropertyToServer(value: unknown, property: Property): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n\n const propertyType = property.type;\n\n switch (propertyType) {\n case \"relation\":\n if (Array.isArray(value)) {\n return value.map(v => serializePropertyToServer(v, property));\n } else if (typeof value === \"object\" && value !== null && \"id\" in value) {\n return (value as Record<string, unknown>).id;\n }\n return value;\n\n case \"array\":\n if (Array.isArray(value) && property.of) {\n return value.map(item => serializePropertyToServer(item, property.of as Property));\n }\n return value;\n\n case \"map\":\n if (typeof value === \"object\" && property.properties) {\n const result: Record<string, unknown> = {};\n for (const [subKey, subValue] of Object.entries(value)) {\n const subProperty = (property.properties as Properties)[subKey];\n if (subProperty) {\n result[subKey] = serializePropertyToServer(subValue, subProperty);\n } else {\n result[subKey] = subValue;\n }\n }\n return result;\n }\n return value;\n\n default:\n return value;\n }\n}\n\n/**\n * Transform IDs back to relation objects for frontend\n */\nexport async function parseDataFromServer<M extends Record<string, any>>(\n data: M,\n collection: EntityCollection,\n db?: NodePgDatabase<any>,\n registry?: PostgresCollectionRegistry\n): Promise<M> {\n const properties = collection.properties;\n if (!data || !properties) return data;\n\n const result: Record<string, unknown> = {};\n\n // Get the normalized relations once\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n\n // Get list of FK columns that are used only for relations and not defined as properties\n const internalFKColumns = new Set<string>();\n Object.values(resolvedRelations).forEach(relation => {\n if (relation.localKey && !properties[relation.localKey]) {\n // This FK is used internally but not exposed as a property\n internalFKColumns.add(relation.localKey);\n }\n });\n\n // Process only the properties that are defined in the collection\n for (const [key, value] of Object.entries(data)) {\n // Skip internal FK columns that aren't defined as properties\n if (internalFKColumns.has(key)) {\n continue;\n }\n\n const property = properties[key as keyof M] as Property;\n if (!property) {\n // Also skip any other database columns not defined in properties\n continue;\n }\n\n result[key] = parsePropertyFromServer(value, property, collection, key);\n }\n\n // Add relation properties that should be populated from FK values or inverse queries\n for (const [propKey, property] of Object.entries(properties)) {\n if (property.type === \"relation\" && !(propKey in result)) {\n // Find the normalized relation for this property\n const relation = resolvedRelations[propKey];\n if (relation) {\n if (relation.direction === \"owning\" && relation.localKey && relation.localKey in data) {\n // Owning relation: FK is in current table\n const fkValue = data[relation.localKey as keyof M];\n if (fkValue !== null && fkValue !== undefined) {\n try {\n const targetCollection = relation.target();\n result[propKey] = {\n id: fkValue.toString(),\n path: targetCollection.slug,\n __type: \"relation\"\n };\n } catch (e) {\n console.warn(`Could not resolve target collection for relation property: ${propKey}`, e);\n }\n }\n } else if (relation.direction === \"inverse\" && relation.foreignKeyOnTarget && db && registry) {\n // Inverse relation: FK is in target table, need to query for it\n try {\n const targetCollection = relation.target();\n const targetTable = registry.getTable(getTableName(targetCollection));\n const pks = getPrimaryKeys(collection, registry!);\n const currentEntityId = buildCompositeId(data, pks);\n\n if (targetTable && currentEntityId) {\n const foreignKeyColumn = targetTable[relation.foreignKeyOnTarget as keyof typeof targetTable] as AnyPgColumn;\n if (foreignKeyColumn) {\n // Query the target table to find entity that references this entity\n const relatedEntities = await db\n .select()\n .from(targetTable)\n .where(eq(foreignKeyColumn, currentEntityId))\n .limit(relation.cardinality === \"one\" ? 1 : 100); // Limit for one-to-one vs one-to-many\n\n if (relatedEntities.length > 0) {\n if (relation.cardinality === \"one\") {\n // One-to-one: return single relation object\n const targetPks = getPrimaryKeys(targetCollection, registry!);\n const relatedEntity = relatedEntities[0] as Record<string, unknown>;\n result[propKey] = {\n id: buildCompositeId(relatedEntity, targetPks),\n path: targetCollection.slug,\n __type: \"relation\"\n };\n } else {\n // One-to-many: return array of relation objects\n const targetPks = getPrimaryKeys(targetCollection, registry!);\n result[propKey] = relatedEntities.map((entity: Record<string, unknown>) => ({\n id: buildCompositeId(entity, targetPks),\n path: targetCollection.slug,\n __type: \"relation\"\n }));\n }\n }\n }\n }\n } catch (e) {\n console.warn(`Could not resolve inverse relation property: ${propKey}`, e);\n }\n } else if (relation.direction === \"inverse\" && relation.joinPath && db && registry) {\n // Join path relation: Multi-hop relation using joins\n try {\n const targetCollection = relation.target();\n const pks = getPrimaryKeys(collection, registry!);\n const currentEntityId = buildCompositeId(data, pks);\n\n if (currentEntityId) {\n // Build the join query following the join path\n const sourceTable = registry.getTable(getTableName(collection));\n if (!sourceTable) {\n console.warn(`Source table not found for collection: ${collection.slug}`);\n continue;\n }\n\n let query = db.select().from(sourceTable);\n let currentTable = sourceTable;\n\n // Apply each join in the path\n for (const join of relation.joinPath) {\n const joinTable = registry.getTable(join.table);\n if (!joinTable) {\n console.warn(`Join table not found: ${join.table}`);\n break;\n }\n\n // Parse the join condition - handle both string and array formats\n const fromColumn = Array.isArray(join.on.from) ? join.on.from[0] : join.on.from;\n const toColumn = Array.isArray(join.on.to) ? join.on.to[0] : join.on.to;\n\n const fromParts = fromColumn.split(\".\");\n const toParts = toColumn.split(\".\");\n\n const fromColName = fromParts[fromParts.length - 1];\n const toColName = toParts[toParts.length - 1];\n\n const fromCol = currentTable[fromColName as keyof typeof currentTable] as AnyPgColumn;\n const toCol = joinTable[toColName as keyof typeof joinTable] as AnyPgColumn;\n\n if (!fromCol || !toCol) {\n console.warn(`Join columns not found: ${fromColumn} -> ${toColumn}`);\n break;\n }\n\n query = query.innerJoin(joinTable, eq(fromCol, toCol)) as unknown as typeof query;\n currentTable = joinTable;\n }\n\n // Add where condition for the current entity\n if (pks.length === 1) {\n const sourceIdField = sourceTable[pks[0].fieldName as keyof typeof sourceTable] as AnyPgColumn;\n query = query.where(eq(sourceIdField, currentEntityId)) as unknown as typeof query;\n } else {\n // For composite keys, we would need to map the split parts. For now log a warning.\n console.warn(`Join path resolution for composite primary keys is not yet fully supported: ${collection.slug}`);\n }\n\n // Build additional conditions array\n const additionalFilters: SQL[] = [];\n\n // Combine parent condition with additional filters using AND\n let combinedWhere: SQL | undefined;\n\n if (pks.length === 1) {\n const sourceIdField = sourceTable[pks[0].fieldName as keyof typeof sourceTable] as AnyPgColumn;\n combinedWhere = DrizzleConditionBuilder.combineConditionsWithAnd([\n eq(sourceIdField, currentEntityId),\n ...additionalFilters\n ].filter(Boolean) as SQL[]);\n }\n\n // Execute the query\n const joinResults = await query.where(combinedWhere).limit(relation.cardinality === \"one\" ? 1 : 100);\n\n if (joinResults.length > 0) {\n const targetPks = getPrimaryKeys(targetCollection, registry!);\n const targetTableName = relation.joinPath[relation.joinPath.length - 1].table;\n\n if (relation.cardinality === \"one\") {\n // One-to-one: return single relation object\n const joinResult = joinResults[0] as Record<string, unknown>;\n const targetEntity = joinResult[targetTableName] || joinResult;\n result[propKey] = {\n id: buildCompositeId(targetEntity, targetPks),\n path: targetCollection.slug,\n __type: \"relation\"\n };\n } else {\n // One-to-many: return array of relation objects\n result[propKey] = joinResults.map((joinResult: Record<string, unknown>) => {\n const targetEntity = joinResult[targetTableName] || joinResult;\n return {\n id: buildCompositeId(targetEntity, targetPks),\n path: targetCollection.slug,\n __type: \"relation\"\n };\n });\n }\n }\n }\n } catch (e) {\n console.warn(`Could not resolve join path relation property: ${propKey}`, e);\n }\n }\n }\n }\n }\n\n return result as M;\n}\n\n/**\n * Parse a single property value from database format to frontend format\n */\nexport function parsePropertyFromServer(value: unknown, property: Property, collection: EntityCollection, propertyKey?: string): unknown {\n if (value === null || value === undefined) {\n return value;\n }\n\n switch (property.type) {\n case \"relation\":\n // Transform ID back to relation object with type information\n if (typeof value === \"string\" || typeof value === \"number\") {\n let relationDef: Relation | undefined = (property as RelationProperty).relation;\n if (!relationDef && propertyKey) {\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n relationDef = resolvedRelations[propertyKey];\n }\n if (!relationDef) {\n relationDef = (collection as import(\"@rebasepro/types\").PostgresCollection<any, any>).relations?.find((rel) => rel.relationName === (property as RelationProperty).relationName);\n }\n \n if (!relationDef) {\n console.warn(`Relation not defined in property for key: ${propertyKey || 'unknown'}`);\n return value;\n }\n \n try {\n const targetCollection = relationDef.target();\n return {\n id: value.toString(),\n path: targetCollection.slug,\n __type: \"relation\"\n };\n } catch (e) {\n console.warn(`Could not resolve target collection for relation property: ${propertyKey || 'unknown'}`, e);\n return value;\n }\n }\n return value;\n\n case \"array\":\n if (Array.isArray(value) && property.of) {\n return value.map(item => parsePropertyFromServer(item, property.of as Property, collection));\n }\n return value;\n\n case \"map\":\n if (typeof value === \"object\" && property.properties) {\n const result: Record<string, unknown> = {};\n for (const [subKey, subValue] of Object.entries(value)) {\n const subProperty = (property.properties as Properties)[subKey];\n if (subProperty) {\n result[subKey] = parsePropertyFromServer(subValue, subProperty, collection);\n } else {\n result[subKey] = subValue;\n }\n }\n return result;\n }\n return value;\n\n case \"number\":\n if (typeof value === \"string\") {\n const parsed = parseFloat(value);\n return isNaN(parsed) ? null : parsed;\n }\n return value;\n\n case \"date\": {\n let date: Date | undefined;\n if (value instanceof Date) {\n date = value;\n } else if (typeof value === \"string\" || typeof value === \"number\") {\n const parsedDate = new Date(value);\n if (!isNaN(parsedDate.getTime())) {\n date = parsedDate;\n }\n }\n if (date) {\n return {\n __type: \"date\",\n value: date.toISOString()\n };\n }\n return null;\n }\n\n default:\n return value;\n }\n}\n\n/**\n * Lightweight value normalization for db.query results.\n * Only handles type coercion (dates, numbers, NaN) and property filtering.\n * Does NOT query the database for relations — those are already resolved\n * by Drizzle's relational query API.\n *\n * Use this instead of `parseDataFromServer` when processing results from\n * `db.query.findFirst/findMany` which return pre-hydrated relation data.\n */\nexport function normalizeDbValues<M extends Record<string, any>>(\n data: M,\n collection: EntityCollection\n): M {\n const properties = collection.properties;\n if (!data || !properties) return data;\n\n const result: Record<string, unknown> = {};\n\n // Get FK columns that are used internally for relations and not defined as properties\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const internalFKColumns = new Set<string>();\n Object.values(resolvedRelations).forEach(relation => {\n if (relation.localKey && !properties[relation.localKey]) {\n internalFKColumns.add(relation.localKey);\n }\n });\n\n for (const [key, value] of Object.entries(data)) {\n // Skip internal FK columns\n if (internalFKColumns.has(key)) continue;\n\n const property = properties[key as keyof M] as Property;\n if (!property) continue; // Skip DB columns not defined in properties\n\n // Skip relation properties — they're already handled by db.query\n if (property.type === \"relation\") continue;\n\n result[key] = parsePropertyFromServer(value, property, collection, key);\n }\n\n return result as M;\n}\n","import { and, eq, inArray, sql, SQL } from \"drizzle-orm\";\nimport { AnyPgColumn, PgTable } from \"drizzle-orm/pg-core\";\nimport { DrizzleClient } from \"../interfaces\";\nimport { Entity, EntityCollection, FilterValues, Relation } from \"@rebasepro/types\";\nimport { getTableName, resolveCollectionRelations } from \"@rebasepro/common\";\nimport { DrizzleConditionBuilder } from \"../utils/drizzle-conditions\";\nimport {\n getCollectionByPath,\n getTableForCollection,\n getPrimaryKeys,\n parseIdValues,\n buildCompositeId\n} from \"./entity-helpers\";\nimport { parseDataFromServer } from \"../data-transformer\";\nimport { PostgresCollectionRegistry } from \"../collections/PostgresCollectionRegistry\";\n\n/**\n * Service for handling all relation-related operations.\n * Handles fetching, updating, and managing entity relations.\n */\nexport class RelationService {\n constructor(private db: DrizzleClient, private registry: PostgresCollectionRegistry) { }\n\n /**\n * Fetch entities related to a parent entity through a specific relation\n */\n async fetchRelatedEntities<M extends Record<string, any>>(\n parentCollectionPath: string,\n parentEntityId: string | number,\n relationKey: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n startAfter?: Record<string, unknown>;\n searchString?: string;\n databaseId?: string;\n } = {}\n ): Promise<Entity<M>[]> {\n const parentCollection = getCollectionByPath(parentCollectionPath, this.registry);\n const resolvedRelations = resolveCollectionRelations(parentCollection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const relation = resolvedRelations[relationKey];\n\n if (!relation) {\n throw new Error(`Relation '${relationKey}' not found in collection '${parentCollectionPath}'`);\n }\n\n return this.fetchEntitiesUsingJoins<M>(parentCollection, parentEntityId, relation, options);\n }\n\n /**\n * Fetch entities using join paths for complex relations\n */\n async fetchEntitiesUsingJoins<M extends Record<string, any>>(\n parentCollection: EntityCollection,\n parentEntityId: string | number,\n relation: Relation,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n startAfter?: Record<string, unknown>;\n searchString?: string;\n databaseId?: string;\n } = {}\n ): Promise<Entity<M>[]> {\n const targetCollection = relation.target();\n const targetTable = getTableForCollection(targetCollection, this.registry);\n const idInfo = getPrimaryKeys(targetCollection, this.registry);\n const idField = targetTable[idInfo[0].fieldName as keyof typeof targetTable] as AnyPgColumn;\n\n const parentPks = getPrimaryKeys(parentCollection, this.registry);\n const parentIdInfo = parentPks[0];\n const parsedParentIdObj = parseIdValues(parentEntityId, parentPks);\n const parsedParentId = parsedParentIdObj[parentIdInfo.fieldName];\n const parentTable = this.registry.getTable(getTableName(parentCollection));\n if (!parentTable) throw new Error(\"Parent table not found\");\n const parentIdCol = parentTable[parentIdInfo.fieldName as keyof typeof parentTable] as AnyPgColumn;\n\n // Handle join path relations\n if (relation.joinPath && relation.joinPath.length > 0) {\n let query = this.db.select().from(parentTable).$dynamic();\n let currentTable = parentTable;\n\n // Apply each join in the path\n for (const join of relation.joinPath) {\n const joinTable = this.registry.getTable(join.table);\n if (!joinTable) {\n throw new Error(`Join table not found: ${join.table}`);\n }\n\n const fromColumn = Array.isArray(join.on.from) ? join.on.from[0] : join.on.from;\n const toColumn = Array.isArray(join.on.to) ? join.on.to[0] : join.on.to;\n\n const fromParts = fromColumn.split(\".\");\n const toParts = toColumn.split(\".\");\n\n const fromColName = fromParts[fromParts.length - 1];\n const toColName = toParts[toParts.length - 1];\n\n const fromCol = currentTable[fromColName as keyof typeof currentTable] as AnyPgColumn;\n const toCol = joinTable[toColName as keyof typeof joinTable] as AnyPgColumn;\n\n if (!fromCol || !toCol) {\n throw new Error(`Join columns not found: ${fromColumn} -> ${toColumn}`);\n }\n\n // @ts-expect-error Drizzle mutates base query generic on innerJoin\n query = query.innerJoin(joinTable, eq(fromCol, toCol));\n currentTable = joinTable;\n }\n\n // Add where condition for the parent entity\n const parentIdField = parentTable[getPrimaryKeys(parentCollection, this.registry)[0].fieldName as keyof typeof parentTable] as AnyPgColumn;\n query = query.where(eq(parentIdField, parsedParentId));\n\n if (options.limit) {\n query = query.limit(options.limit);\n }\n\n const results = await query;\n const targetTableName = relation.joinPath[relation.joinPath.length - 1].table;\n\n // Process results\n const entities: Entity<M>[] = [];\n for (const row of results as Array<Record<string, unknown>>) {\n const targetEntity = (row[targetTableName] as Record<string, unknown>) || row;\n const entityId = targetEntity[idInfo[0].fieldName as string];\n const parsedValues = await parseDataFromServer(targetEntity, targetCollection, this.db, this.registry);\n\n entities.push({\n id: entityId?.toString() || \"\",\n path: targetCollection.slug,\n values: parsedValues as M\n });\n }\n\n return entities;\n }\n\n // Handle other relation types\n let query = this.db.select().from(targetTable).$dynamic();\n\n // Build additional filter conditions\n const additionalFilters: SQL[] = [];\n\n // Handle search conditions if searchString is provided\n if (options.searchString) {\n const searchConditions = DrizzleConditionBuilder.buildSearchConditions(\n options.searchString,\n targetCollection.properties,\n targetTable\n );\n\n if (searchConditions.length === 0) {\n // No searchable fields found, return empty results\n return [];\n }\n\n const searchCombined = DrizzleConditionBuilder.combineConditionsWithOr(searchConditions);\n if (searchCombined) {\n additionalFilters.push(searchCombined);\n }\n }\n\n // Use unified relation query builder\n // @ts-expect-error buildRelationQuery uses dynamic queries\n query = DrizzleConditionBuilder.buildRelationQuery(\n query,\n relation,\n parsedParentId,\n targetTable,\n parentTable,\n parentIdCol,\n idField,\n this.registry,\n additionalFilters\n );\n\n if (options.limit) {\n query = query.limit(options.limit);\n }\n\n const results = await query;\n\n // Process results - ensure results is iterable\n if (!results || !Array.isArray(results)) {\n return [];\n }\n\n const entities: Entity<M>[] = [];\n for (const row of results) {\n const targetEntity = row[getTableName(targetCollection)] || row;\n const entityId = targetEntity[idInfo[0].fieldName];\n const parsedValues = await parseDataFromServer(targetEntity, targetCollection, this.db, this.registry);\n\n entities.push({\n id: entityId?.toString() || \"\",\n path: targetCollection.slug,\n values: parsedValues as M\n });\n }\n\n return entities;\n }\n\n /**\n * Count related entities for a parent entity\n */\n async countRelatedEntities<M extends Record<string, any>>(\n parentCollectionPath: string,\n parentEntityId: string | number,\n relationKey: string,\n options: { filter?: FilterValues<Extract<keyof M, string>>; databaseId?: string } = {}\n ): Promise<number> {\n const parentCollection = getCollectionByPath(parentCollectionPath, this.registry);\n const resolvedRelations = resolveCollectionRelations(parentCollection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const relation = resolvedRelations[relationKey];\n if (!relation) throw new Error(`Relation '${relationKey}' not found in collection '${parentCollectionPath}'`);\n\n const targetCollection = relation.target();\n const targetTable = getTableForCollection(targetCollection, this.registry);\n const targetPks = getPrimaryKeys(targetCollection, this.registry);\n const targetIdInfo = targetPks[0];\n const targetIdField = targetTable[targetIdInfo.fieldName as keyof typeof targetTable] as AnyPgColumn;\n\n const parentPks = getPrimaryKeys(parentCollection, this.registry);\n const parentIdInfo = parentPks[0];\n const parsedParentIdObj = parseIdValues(parentEntityId, parentPks);\n const parsedParentId = parsedParentIdObj[parentIdInfo.fieldName];\n const parentTable = this.registry.getTable(getTableName(parentCollection));\n if (!parentTable) throw new Error(\"Parent table not found\");\n const parentIdCol = parentTable[parentIdInfo.fieldName as keyof typeof parentTable] as AnyPgColumn;\n\n // Start count with distinct to avoid duplicates from junction tables\n let query = this.db.select({ count: sql<number>`count(distinct ${targetIdField})` }).from(targetTable).$dynamic();\n\n // Build additional filter conditions\n const additionalFilters: SQL[] = [];\n\n // Use unified count query builder from DrizzleConditionBuilder\n query = DrizzleConditionBuilder.buildRelationCountQuery(\n query,\n relation,\n parsedParentId,\n targetTable,\n parentTable,\n parentIdCol,\n targetIdField,\n this.registry,\n additionalFilters\n );\n\n const result = await query;\n return Number(result[0]?.count || 0);\n }\n\n /**\n * Batch fetch related entities for multiple parent entities to avoid N+1 queries\n */\n async batchFetchRelatedEntities(\n parentCollectionPath: string,\n parentEntityIds: (string | number)[],\n _relationKey: string,\n relation: Relation\n ): Promise<Map<string | number, Entity<Record<string, unknown>>>> {\n if (parentEntityIds.length === 0) return new Map();\n\n const parentCollection = getCollectionByPath(parentCollectionPath, this.registry);\n const targetCollection = relation.target();\n const targetTable = getTableForCollection(targetCollection, this.registry);\n const targetPks = getPrimaryKeys(targetCollection, this.registry);\n const targetIdInfo = targetPks[0];\n const targetIdField = targetTable[targetIdInfo.fieldName as keyof typeof targetTable] as AnyPgColumn;\n\n const parentPks = getPrimaryKeys(parentCollection, this.registry);\n const parentIdInfo = parentPks[0];\n const parentTable = this.registry.getTable(getTableName(parentCollection));\n if (!parentTable) throw new Error(\"Parent table not found\");\n const parentIdCol = parentTable[parentIdInfo.fieldName as keyof typeof parentTable] as AnyPgColumn;\n\n // Parse all parent IDs once\n const parsedParentIds = parentEntityIds.map(id => parseIdValues(id, parentPks)[parentIdInfo.fieldName]);\n\n // Handle join path relations with batching\n if (relation.joinPath && relation.joinPath.length > 0) {\n let query = this.db.select().from(parentTable).$dynamic();\n let currentTable = parentTable;\n\n // Apply each join in the path\n for (const join of relation.joinPath) {\n const joinTable = this.registry.getTable(join.table);\n if (!joinTable) {\n throw new Error(`Join table not found: ${join.table}`);\n }\n\n const fromColumn = Array.isArray(join.on.from) ? join.on.from[0] : join.on.from;\n const toColumn = Array.isArray(join.on.to) ? join.on.to[0] : join.on.to;\n\n const fromParts = fromColumn.split(\".\");\n const toParts = toColumn.split(\".\");\n\n const fromColName = fromParts[fromParts.length - 1];\n const toColName = toParts[toParts.length - 1];\n\n const fromCol = currentTable[fromColName as keyof typeof currentTable] as AnyPgColumn;\n const toCol = joinTable[toColName as keyof typeof joinTable] as AnyPgColumn;\n\n if (!fromCol || !toCol) {\n throw new Error(`Join columns not found: ${fromColumn} -> ${toColumn}`);\n }\n\n // @ts-expect-error Drizzle mutates base query generic on innerJoin\n query = query.innerJoin(joinTable, eq(fromCol, toCol));\n currentTable = joinTable;\n }\n\n // Add where condition for ALL parent entities at once\n const parentIdField = parentTable[getPrimaryKeys(parentCollection, this.registry)[0].fieldName as keyof typeof parentTable] as AnyPgColumn;\n query = query.where(inArray(parentIdField, parsedParentIds));\n\n const results = await query;\n const targetTableName = relation.joinPath[relation.joinPath.length - 1].table;\n const resultMap = new Map<string | number, Entity<Record<string, unknown>>>();\n\n // Group results by parent ID\n results.forEach((row: Record<string, unknown>) => {\n const parentEntity = (row[getTableName(parentCollection)] || row) as Record<string, unknown>;\n const targetEntity = (row[targetTableName] || row) as Record<string, unknown>;\n const parentId = parentEntity[parentIdInfo.fieldName] as string | number;\n\n resultMap.set(parentId, {\n id: String(targetEntity[targetIdInfo.fieldName]),\n path: targetCollection.slug,\n values: targetEntity\n });\n });\n\n return resultMap;\n }\n\n // Handle other relation types with batching\n let query = this.db.select().from(targetTable).$dynamic();\n\n // Build the relation query with ALL parent IDs\n // @ts-expect-error buildRelationQuery uses dynamic queries\n query = DrizzleConditionBuilder.buildRelationQuery(\n query,\n relation,\n parsedParentIds, // Pass array instead of single ID\n targetTable,\n parentTable,\n parentIdCol,\n targetIdField,\n this.registry,\n []\n );\n\n const results = await query;\n const resultMap = new Map<string | number, Entity<Record<string, unknown>>>();\n\n // Map results back to parent entities\n results.forEach((row: Record<string, unknown>) => {\n const targetEntity = (row[getTableName(targetCollection)] || row) as Record<string, unknown>;\n\n // Determine the parent ID this result belongs to based on the relation type\n let parentId: string | number | undefined;\n\n if (relation.direction === \"inverse\" && relation.foreignKeyOnTarget) {\n parentId = targetEntity[relation.foreignKeyOnTarget] as string | number | undefined;\n } else if (relation.direction === \"inverse\" && relation.cardinality === \"one\" && relation.inverseRelationName) {\n const inferredForeignKeyName = `${relation.inverseRelationName}_id`;\n parentId = targetEntity[inferredForeignKeyName] as string | number | undefined;\n } else if (relation.direction === \"owning\" && relation.localKey) {\n for (const parsedParentId of parsedParentIds) {\n if (!resultMap.has(parsedParentId)) {\n parentId = parsedParentId;\n break;\n }\n }\n }\n\n if (parentId !== undefined && parsedParentIds.includes(parentId)) {\n resultMap.set(parentId, {\n id: String(targetEntity[targetIdInfo.fieldName]),\n path: targetCollection.slug,\n values: targetEntity\n });\n }\n });\n\n return resultMap;\n }\n\n /**\n * Update many-to-many and junction relations\n */\n async updateRelationsUsingJoins<M extends Record<string, any>>(\n tx: DrizzleClient,\n collection: EntityCollection,\n entityId: string | number,\n relationValues: Partial<M>\n ) {\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n\n for (const [key, value] of Object.entries(relationValues)) {\n const relation = resolvedRelations[key];\n if (!relation || relation.cardinality !== \"many\") continue;\n\n const targetEntityIds = (value && Array.isArray(value)) ? value.map((rel: { id: string | number }) => rel.id) : [];\n const targetCollection = relation.target();\n\n // Use joinPath if available\n if (relation.joinPath && relation.joinPath.length > 0) {\n const parentTableName = getTableName(collection);\n const targetTableName = getTableName(targetCollection);\n\n let junctionTable: PgTable | undefined = undefined;\n let sourceJunctionColumn: AnyPgColumn | null = null;\n let targetJunctionColumn: AnyPgColumn | null = null;\n\n const junctionTableName = relation.joinPath.find(step =>\n step.table !== parentTableName && step.table !== targetTableName\n )?.table;\n\n if (junctionTableName) {\n junctionTable = this.registry.getTable(junctionTableName);\n\n if (junctionTable) {\n for (const joinStep of relation.joinPath) {\n const fromTable = DrizzleConditionBuilder.getTableNamesFromColumns(joinStep.on.from)[0];\n const toTable = DrizzleConditionBuilder.getTableNamesFromColumns(joinStep.on.to)[0];\n\n if (fromTable === parentTableName && toTable === junctionTableName) {\n const columnNames = DrizzleConditionBuilder.getColumnNamesFromColumns(joinStep.on.to);\n sourceJunctionColumn = junctionTable[columnNames[0] as keyof typeof junctionTable] as AnyPgColumn;\n } else if (fromTable === junctionTableName && toTable === parentTableName) {\n const columnNames = DrizzleConditionBuilder.getColumnNamesFromColumns(joinStep.on.from);\n sourceJunctionColumn = junctionTable[columnNames[0] as keyof typeof junctionTable] as AnyPgColumn;\n }\n\n if (fromTable === junctionTableName && toTable === targetTableName) {\n const columnNames = DrizzleConditionBuilder.getColumnNamesFromColumns(joinStep.on.from);\n targetJunctionColumn = junctionTable[columnNames[0] as keyof typeof junctionTable] as AnyPgColumn;\n } else if (fromTable === targetTableName && toTable === junctionTableName) {\n const columnNames = DrizzleConditionBuilder.getColumnNamesFromColumns(joinStep.on.to);\n targetJunctionColumn = junctionTable[columnNames[0] as keyof typeof junctionTable] as AnyPgColumn;\n }\n }\n }\n }\n\n if (!junctionTable || !sourceJunctionColumn || !targetJunctionColumn) {\n console.warn(`Could not determine junction table for relation '${key}' in collection '${collection.slug}'`);\n continue;\n }\n\n const parentPks = getPrimaryKeys(collection, this.registry);\n const parentIdInfo = parentPks[0];\n const parsedParentIdObj = parseIdValues(entityId, parentPks);\n const parsedParentId = parsedParentIdObj[parentIdInfo.fieldName];\n\n // Delete existing relations for this entity\n await tx.delete(junctionTable).where(eq(sourceJunctionColumn, parsedParentId));\n\n if (targetEntityIds.length > 0) {\n const targetPks = getPrimaryKeys(targetCollection, this.registry);\n const targetIdInfo = targetPks[0];\n const parsedTargetIds = targetEntityIds.map(id => parseIdValues(id, targetPks)[targetIdInfo.fieldName]);\n\n const newLinks = parsedTargetIds.map(targetId => ({\n [sourceJunctionColumn.name]: parsedParentId,\n [targetJunctionColumn.name]: targetId\n }));\n\n if (newLinks.length > 0) {\n await tx.insert(junctionTable).values(newLinks);\n }\n }\n } else if (relation.through && relation.cardinality === \"many\" && relation.direction === \"owning\") {\n // Handle many-to-many relations with junction table using 'through' property\n const junctionTable = this.registry.getTable(relation.through.table);\n if (!junctionTable) {\n console.warn(`Junction table '${relation.through.table}' not found for relation '${key}' in collection '${collection.slug}'`);\n continue;\n }\n\n const sourceJunctionColumn = junctionTable[relation.through.sourceColumn as keyof typeof junctionTable] as AnyPgColumn;\n const targetJunctionColumn = junctionTable[relation.through.targetColumn as keyof typeof junctionTable] as AnyPgColumn;\n\n if (!sourceJunctionColumn || !targetJunctionColumn) {\n console.warn(`Junction columns not found for relation '${key}'`);\n continue;\n }\n\n const parentPks = getPrimaryKeys(collection, this.registry);\n const parentIdInfo = parentPks[0];\n const parsedParentIdObj = parseIdValues(entityId, parentPks);\n const parsedParentId = parsedParentIdObj[parentIdInfo.fieldName];\n\n // Delete existing relations for this entity\n await tx.delete(junctionTable).where(eq(sourceJunctionColumn, parsedParentId));\n\n if (targetEntityIds.length > 0) {\n const targetPks = getPrimaryKeys(targetCollection, this.registry);\n const targetIdInfo = targetPks[0];\n const parsedTargetIds = targetEntityIds.map(id => parseIdValues(id, targetPks)[targetIdInfo.fieldName]);\n\n const newLinks = parsedTargetIds.map(targetId => ({\n [sourceJunctionColumn.name]: parsedParentId,\n [targetJunctionColumn.name]: targetId\n }));\n\n if (newLinks.length > 0) {\n await tx.insert(junctionTable).values(newLinks);\n }\n }\n } else if (relation.cardinality === \"many\" && relation.direction === \"inverse\" && relation.foreignKeyOnTarget) {\n // Handle one-to-many (inverse) by updating target FK to point to parent\n const targetTable = getTableForCollection(targetCollection, this.registry);\n const targetPks = getPrimaryKeys(targetCollection, this.registry);\n const targetIdInfo = targetPks[0];\n const targetIdCol = targetTable[targetIdInfo.fieldName as keyof typeof targetTable] as AnyPgColumn;\n const fkCol = targetTable[relation.foreignKeyOnTarget as keyof typeof targetTable] as AnyPgColumn;\n\n if (!fkCol || !targetIdCol) {\n console.warn(`Invalid inverse-many config for relation '${key}' in collection '${collection.slug}'`);\n continue;\n }\n\n const parentPks = getPrimaryKeys(collection, this.registry);\n const parentIdInfo = parentPks[0];\n const parsedParentIdObj = parseIdValues(entityId, parentPks);\n const parsedParentId = parsedParentIdObj[parentIdInfo.fieldName];\n\n // Clear existing links not in the new set\n if (targetEntityIds.length > 0) {\n const parsedTargetIds = targetEntityIds.map(id => parseIdValues(id, targetPks)[targetIdInfo.fieldName]);\n await tx\n .update(targetTable)\n .set({ [relation.foreignKeyOnTarget]: null })\n .where(and(eq(fkCol, parsedParentId), sql`${targetIdCol} NOT IN (${sql.join(parsedTargetIds)})`));\n\n // Set FK for the provided targets\n await tx\n .update(targetTable)\n .set({ [relation.foreignKeyOnTarget]: parsedParentId })\n .where(inArray(targetIdCol as AnyPgColumn, parsedTargetIds as unknown[]));\n } else {\n // If empty array provided, clear all existing links for this parent\n await tx\n .update(targetTable)\n .set({ [relation.foreignKeyOnTarget]: null })\n .where(eq(fkCol, parsedParentId));\n }\n } else {\n console.warn(`Many relation '${key}' in collection '${collection.slug}' lacks write configuration and will be skipped during save.`);\n }\n }\n }\n\n /**\n * Update inverse relations (where FK is on the target table)\n */\n async updateInverseRelations(\n tx: DrizzleClient,\n sourceCollection: EntityCollection,\n sourceEntityId: string | number,\n inverseRelationUpdates: Array<{\n relationKey: string;\n relation: Relation;\n newValue: unknown;\n currentEntityId?: string | number;\n }>\n ) {\n for (const update of inverseRelationUpdates) {\n const { relation, newValue } = update;\n\n try {\n const targetCollection = relation.target();\n const targetTable = getTableForCollection(targetCollection, this.registry);\n const targetPks = getPrimaryKeys(targetCollection, this.registry);\n const targetIdInfo = targetPks[0];\n const sourcePks = getPrimaryKeys(sourceCollection, this.registry);\n const sourceIdInfo = sourcePks[0];\n\n // Handle inverse relations with joinPath\n if (relation.direction === \"inverse\" && relation.joinPath && relation.joinPath.length > 0) {\n await this.updateInverseJoinPathRelation(\n tx,\n sourceCollection,\n sourceEntityId,\n targetCollection,\n relation,\n newValue\n );\n continue;\n }\n\n // Check if this is a many-to-many inverse relation\n if (relation.cardinality === \"many\" && relation.direction === \"inverse\") {\n const targetCollectionRelations = resolveCollectionRelations(targetCollection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n let junctionInfo: { table: string; sourceColumn: string; targetColumn: string } | null = null;\n\n for (const [relationKey, targetRelation] of Object.entries(targetCollectionRelations)) {\n if (targetRelation.cardinality === \"many\" &&\n targetRelation.direction === \"owning\" &&\n targetRelation.through &&\n (targetRelation.relationName === relation.inverseRelationName || relationKey === relation.inverseRelationName)) {\n junctionInfo = {\n table: targetRelation.through.table,\n sourceColumn: targetRelation.through.targetColumn,\n targetColumn: targetRelation.through.sourceColumn\n };\n break;\n }\n }\n\n if (junctionInfo) {\n await this.updateManyToManyInverseRelation(\n tx,\n sourceCollection,\n sourceEntityId,\n targetCollection,\n relation,\n newValue,\n junctionInfo\n );\n continue;\n }\n }\n\n // Handle simple inverse relations\n if (!relation.foreignKeyOnTarget) {\n console.warn(`Inverse relation '${relation.relationName}' is missing foreignKeyOnTarget property. Skipping.`);\n continue;\n }\n\n const foreignKeyColumn = targetTable[relation.foreignKeyOnTarget! as keyof typeof targetTable] as AnyPgColumn;\n if (!foreignKeyColumn) {\n console.warn(`Foreign key column '${relation.foreignKeyOnTarget}' not found in target table for relation '${relation.relationName}'`);\n continue;\n }\n\n const parsedSourceIdObj = parseIdValues(sourceEntityId, sourcePks);\n const parsedSourceId = parsedSourceIdObj[sourceIdInfo.fieldName];\n\n if (newValue === null || newValue === undefined) {\n await tx\n .update(targetTable)\n .set({ [relation.foreignKeyOnTarget!]: null })\n .where(eq(foreignKeyColumn, parsedSourceId));\n } else {\n const parsedNewTargetIdObj = parseIdValues(newValue as string | number, targetPks);\n const parsedNewTargetId = parsedNewTargetIdObj[targetIdInfo.fieldName];\n const targetIdField = targetTable[targetIdInfo.fieldName as keyof typeof targetTable] as AnyPgColumn;\n\n // First, clear any existing FK that points to this source entity\n await tx\n .update(targetTable)\n .set({ [relation.foreignKeyOnTarget!]: null })\n .where(eq(foreignKeyColumn, parsedSourceId));\n\n // Then, update the new target entity to point to this source entity\n await tx\n .update(targetTable)\n .set({ [relation.foreignKeyOnTarget!]: parsedSourceId })\n .where(eq(targetIdField, parsedNewTargetId));\n }\n } catch (e) {\n console.warn(`Failed to update inverse relation '${relation.relationName}':`, e);\n }\n }\n }\n\n /**\n * Handle inverse relations with joinPath\n */\n private async updateInverseJoinPathRelation(\n tx: DrizzleClient,\n sourceCollection: EntityCollection,\n sourceEntityId: string | number,\n targetCollection: EntityCollection,\n relation: Relation,\n newValue: unknown\n ) {\n try {\n if (!relation.joinPath || relation.joinPath.length === 0) {\n console.warn(`Inverse relation '${relation.relationName}' missing joinPath`);\n return;\n }\n\n const sourceTableName = getTableName(sourceCollection);\n const targetTableName = getTableName(targetCollection);\n\n // Find intermediate tables that are neither source nor target\n const intermediateTables = relation.joinPath\n .map(step => step.table)\n .filter(table => table !== sourceTableName && table !== targetTableName);\n\n // If there's exactly one intermediate table, it's likely a junction table for many-to-many\n if (intermediateTables.length === 1 && relation.cardinality === \"many\") {\n const junctionTableName = intermediateTables[0];\n const junctionTable = this.registry.getTable(junctionTableName);\n\n if (!junctionTable) {\n console.warn(`Junction table '${junctionTableName}' not found for inverse joinPath relation '${relation.relationName}'`);\n return;\n }\n\n let sourceJunctionColumn: AnyPgColumn | null = null;\n let targetJunctionColumn: AnyPgColumn | null = null;\n\n for (const step of relation.joinPath) {\n if (step.table === junctionTableName) {\n const fromTable = DrizzleConditionBuilder.getTableNamesFromColumns(step.on.from)[0];\n const toColumnNames = DrizzleConditionBuilder.getColumnNamesFromColumns(step.on.to);\n const fromColumnNames = DrizzleConditionBuilder.getColumnNamesFromColumns(step.on.from);\n\n if (fromTable === sourceTableName) {\n sourceJunctionColumn = junctionTable[toColumnNames[0] as keyof typeof junctionTable] as AnyPgColumn;\n } else if (fromTable === targetTableName) {\n targetJunctionColumn = junctionTable[toColumnNames[0] as keyof typeof junctionTable] as AnyPgColumn;\n } else {\n const toTable = DrizzleConditionBuilder.getTableNamesFromColumns(step.on.to)[0];\n if (toTable === sourceTableName) {\n sourceJunctionColumn = junctionTable[fromColumnNames[0] as keyof typeof junctionTable] as AnyPgColumn;\n } else if (toTable === targetTableName) {\n targetJunctionColumn = junctionTable[fromColumnNames[0] as keyof typeof junctionTable] as AnyPgColumn;\n }\n }\n }\n }\n\n if (!sourceJunctionColumn || !targetJunctionColumn) {\n console.warn(`Could not determine junction columns for inverse joinPath relation '${relation.relationName}'`);\n return;\n }\n\n // Perform the junction table update\n const sourcePks = getPrimaryKeys(sourceCollection, this.registry);\n const sourceIdInfo = sourcePks[0];\n const parsedSourceIdObj = parseIdValues(sourceEntityId, sourcePks);\n const parsedSourceId = parsedSourceIdObj[sourceIdInfo.fieldName];\n\n // Clear existing entries for this source entity\n await tx.delete(junctionTable).where(eq(sourceJunctionColumn, parsedSourceId));\n\n // Add new entries if newValue is provided\n if (newValue && Array.isArray(newValue) && newValue.length > 0) {\n const targetPks = getPrimaryKeys(targetCollection, this.registry);\n const targetIdInfo = targetPks[0];\n const targetEntityIds = (newValue as Array<{ id: string | number } | string | number>).map((rel) => typeof rel === 'object' && rel !== null ? rel.id : rel);\n const parsedTargetIds = targetEntityIds.map(id => parseIdValues(id, targetPks)[targetIdInfo.fieldName]);\n\n const newLinks = parsedTargetIds.map(targetId => ({\n [sourceJunctionColumn!.name]: parsedSourceId,\n [targetJunctionColumn!.name]: targetId\n }));\n\n if (newLinks.length > 0) {\n await tx.insert(junctionTable).values(newLinks);\n }\n } else if (newValue && !Array.isArray(newValue)) {\n // Single value for one-to-one\n const targetPks = getPrimaryKeys(targetCollection, this.registry);\n const targetIdInfo = targetPks[0];\n const targetId = typeof newValue === 'object' && newValue !== null ? (newValue as Record<string, unknown>).id as string | number : newValue as string | number;\n const parsedTargetIdObj = parseIdValues(targetId, targetPks);\n const parsedTargetId = parsedTargetIdObj[targetIdInfo.fieldName];\n\n const newLink = {\n [sourceJunctionColumn.name]: parsedSourceId,\n [targetJunctionColumn.name]: parsedTargetId\n };\n\n await tx.insert(junctionTable).values(newLink);\n }\n }\n } catch (error) {\n console.error(`Failed to update inverse joinPath relation '${relation.relationName}':`, error);\n throw error;\n }\n }\n\n /**\n * Handle many-to-many inverse relation updates using junction tables\n */\n private async updateManyToManyInverseRelation(\n tx: DrizzleClient,\n sourceCollection: EntityCollection,\n sourceEntityId: string | number,\n targetCollection: EntityCollection,\n relation: Relation,\n newValue: unknown,\n junctionInfo: { table: string; sourceColumn: string; targetColumn: string }\n ) {\n try {\n const junctionTable = this.registry.getTable(junctionInfo.table);\n if (!junctionTable) {\n console.warn(`Junction table '${junctionInfo.table}' not found for many-to-many inverse relation '${relation.relationName}'`);\n return;\n }\n\n const sourceJunctionColumn = junctionTable[junctionInfo.sourceColumn as keyof typeof junctionTable] as AnyPgColumn;\n const targetJunctionColumn = junctionTable[junctionInfo.targetColumn as keyof typeof junctionTable] as AnyPgColumn;\n\n if (!sourceJunctionColumn || !targetJunctionColumn) {\n console.warn(`Junction columns not found for relation '${relation.relationName}'`);\n return;\n }\n\n const sourcePks = getPrimaryKeys(sourceCollection, this.registry);\n const sourceIdInfo = sourcePks[0];\n const parsedSourceIdObj = parseIdValues(sourceEntityId, sourcePks);\n const parsedSourceId = parsedSourceIdObj[sourceIdInfo.fieldName];\n\n // Clear existing entries for this source entity\n await tx.delete(junctionTable).where(eq(sourceJunctionColumn, parsedSourceId));\n\n // Add new entries if newValue is provided\n if (newValue && Array.isArray(newValue) && newValue.length > 0) {\n const targetPks = getPrimaryKeys(targetCollection, this.registry);\n const targetIdInfo = targetPks[0];\n const targetEntityIds = (newValue as Array<{ id: string | number }>).map((rel) => rel.id);\n const parsedTargetIds = targetEntityIds.map(id => parseIdValues(id, targetPks)[targetIdInfo.fieldName]);\n\n const newLinks = parsedTargetIds.map(targetId => ({\n [sourceJunctionColumn.name]: parsedSourceId,\n [targetJunctionColumn.name]: targetId\n }));\n\n if (newLinks.length > 0) {\n await tx.insert(junctionTable).values(newLinks);\n }\n }\n } catch (error) {\n console.error(`Failed to update many-to-many inverse relation '${relation.relationName}':`, error);\n throw error;\n }\n }\n\n /**\n * Update one-to-one relations that use joinPath\n */\n async updateJoinPathOneToOneRelations(\n tx: DrizzleClient,\n parentCollection: EntityCollection,\n parentEntityId: string | number,\n updates: Array<{\n relationKey: string;\n relation: Relation;\n newTargetId: string | number | null;\n }>\n ) {\n for (const upd of updates) {\n const { relation, newTargetId } = upd;\n const targetCollection = relation.target();\n const targetTable = getTableForCollection(targetCollection, this.registry);\n const targetPks = getPrimaryKeys(targetCollection, this.registry);\n const targetIdInfo = targetPks[0];\n const targetIdCol = targetTable[targetIdInfo.fieldName as keyof typeof targetTable] as AnyPgColumn;\n\n // Determine mapping of columns\n const { targetFKColName, parentSourceColName } = this.resolveJoinPathWriteMapping(parentCollection, relation);\n const parentTable = getTableForCollection(parentCollection, this.registry);\n const parentPks = getPrimaryKeys(parentCollection, this.registry);\n const parentIdInfo = parentPks[0];\n const parsedParentIdObj = parseIdValues(parentEntityId, parentPks);\n const parsedParentId = parsedParentIdObj[parentIdInfo.fieldName];\n\n const parentIdCol = parentTable[parentIdInfo.fieldName as keyof typeof parentTable] as AnyPgColumn;\n const parentSourceCol = parentTable[parentSourceColName as keyof typeof parentTable] as AnyPgColumn;\n const targetFKCol = targetTable[targetFKColName as keyof typeof targetTable] as AnyPgColumn;\n\n if (!parentSourceCol) {\n console.warn(`Parent source column '${parentSourceColName}' not found for joinPath relation '${relation.relationName}'`);\n continue;\n }\n if (!targetFKCol) {\n console.warn(`Target FK column '${targetFKColName}' not found for joinPath relation '${relation.relationName}'`);\n continue;\n }\n\n // Fetch the parent row to obtain the value for parentSourceCol\n const parentRows = await tx\n .select({ val: parentSourceCol })\n .from(parentTable)\n .where(eq(parentIdCol, parsedParentId))\n .limit(1);\n if (parentRows.length === 0) continue;\n const parentFKValue = parentRows[0].val as string | number | null;\n\n if (newTargetId === null || newTargetId === undefined) {\n // Clear any target rows currently linked to this parent via the FK\n if (parentFKValue !== null && parentFKValue !== undefined) {\n await tx.update(targetTable)\n .set({ [targetFKColName]: null })\n .where(eq(targetFKCol, parentFKValue as unknown as string));\n }\n continue;\n }\n\n // Parse the new target id\n const parsedTargetIdObj = parseIdValues(newTargetId, targetPks);\n const parsedTargetId = parsedTargetIdObj[targetIdInfo.fieldName];\n\n // Ensure one-to-one by clearing existing link from any target rows with this parent FK\n if (parentFKValue !== null && parentFKValue !== undefined) {\n await tx.update(targetTable)\n .set({ [targetFKColName]: null })\n .where(eq(targetFKCol, parentFKValue as unknown as string));\n } else {\n console.warn(`Cannot set joinPath relation '${relation.relationName}' because parent FK value is null/undefined`);\n continue;\n }\n\n // Now set the FK on the target entity\n await tx.update(targetTable)\n .set({ [targetFKColName]: parentFKValue })\n .where(eq(targetIdCol, parsedTargetId));\n }\n }\n\n /**\n * Resolve joinPath write mapping for one-to-one relations\n */\n resolveJoinPathWriteMapping(\n parentCollection: EntityCollection,\n relation: Relation\n ): { targetFKColName: string; parentSourceColName: string } {\n if (!relation.joinPath || relation.joinPath.length === 0) {\n throw new Error(\"resolveJoinPathWriteMapping requires a joinPath relation\");\n }\n const parentTableName = getTableName(parentCollection);\n const lastStep = relation.joinPath[relation.joinPath.length - 1];\n const targetFKColName = DrizzleConditionBuilder.getColumnNamesFromColumns(lastStep.on.to)[0];\n let currentFrom = lastStep.on.from;\n\n let safety = 0;\n while (safety++ < 10) {\n const currentFromTable = DrizzleConditionBuilder.getTableNamesFromColumns(currentFrom)[0];\n if (currentFromTable === parentTableName) {\n break;\n }\n const prevStep = relation.joinPath.find((s) => {\n const to = Array.isArray(s.on.to) ? s.on.to[0] : s.on.to;\n return to === currentFrom;\n });\n if (!prevStep) {\n throw new Error(`Could not resolve parent source column for joinPath relation '${relation.relationName}'`);\n }\n currentFrom = prevStep.on.from;\n }\n const parentSourceColName = DrizzleConditionBuilder.getColumnNamesFromColumns(currentFrom)[0];\n return { targetFKColName, parentSourceColName };\n }\n\n /**\n * Handle junction table creation for many-to-many path-based saves\n */\n async handleJunctionTableCreation(\n tx: DrizzleClient,\n newEntityId: string | number,\n junctionTableInfo: {\n parentCollection: EntityCollection;\n parentId: string | number;\n relation: Relation;\n relationKey: string;\n }\n ) {\n const { parentCollection, parentId, relation, relationKey } = junctionTableInfo;\n const targetCollection = relation.target();\n\n try {\n const junctionTable = this.registry.getTable(relation.through!.table);\n if (!junctionTable) {\n console.warn(`Junction table '${relation.through!.table}' not found for relation '${relationKey}'`);\n return;\n }\n\n const sourceJunctionColumn = junctionTable[relation.through!.sourceColumn as keyof typeof junctionTable] as AnyPgColumn;\n const targetJunctionColumn = junctionTable[relation.through!.targetColumn as keyof typeof junctionTable] as AnyPgColumn;\n\n if (!sourceJunctionColumn || !targetJunctionColumn) {\n console.warn(`Junction columns not found for relation '${relationKey}'`);\n return;\n }\n\n // Parse the new entity ID to the correct type\n const targetPks = getPrimaryKeys(targetCollection, this.registry);\n const targetIdInfo = targetPks[0];\n const parsedNewEntityIdObj = parseIdValues(newEntityId, targetPks);\n const parsedNewEntityId = parsedNewEntityIdObj[targetIdInfo.fieldName];\n\n // Create the junction table entry linking parent to the new entity\n const junctionData = {\n [sourceJunctionColumn.name]: parentId,\n [targetJunctionColumn.name]: parsedNewEntityId\n };\n\n await tx.insert(junctionTable).values(junctionData);\n\n console.log(`Created junction table entry for many-to-many relation '${relationKey}': ${JSON.stringify(junctionData)}`);\n } catch (error) {\n console.error(`Failed to create junction table entry for relation '${relationKey}':`, error);\n throw error;\n }\n }\n}\n","import { and, asc, count, desc, eq, getTableName, gt, lt, or, SQL, TableRelationalConfig, TablesRelationalConfig } from \"drizzle-orm\";\nimport { AnyPgColumn, PgTable } from \"drizzle-orm/pg-core\";\nimport { Entity, EntityCollection, FilterValues, Relation } from \"@rebasepro/types\";\nimport { resolveCollectionRelations } from \"@rebasepro/common\";\nimport { DrizzleConditionBuilder } from \"../utils/drizzle-conditions\";\nimport {\n getCollectionByPath,\n getTableForCollection,\n getPrimaryKeys,\n parseIdValues,\n buildCompositeId\n} from \"./entity-helpers\";\nimport { parseDataFromServer, normalizeDbValues } from \"../data-transformer\";\nimport { RelationService } from \"./RelationService\";\nimport { RelationalQueryBuilder } from \"drizzle-orm/pg-core/query-builders/query\";\nimport { DrizzleClient } from \"../interfaces\";\nimport { PostgresCollectionRegistry } from \"../collections/PostgresCollectionRegistry\";\n\n/** Type-safe accessor for Drizzle's relational query API via dynamic table name */\ntype DbQueryAccessor = Record<string, RelationalQueryBuilder<any, any>> | undefined;\n\n/**\n * Service for handling all entity read operations.\n * Handles fetching, searching, counting, and filtering entities.\n */\nexport class EntityFetchService {\n private relationService: RelationService;\n\n constructor(private db: DrizzleClient, private registry: PostgresCollectionRegistry) {\n this.relationService = new RelationService(db, registry);\n }\n\n /**\n * Get the relational query builder for a given table name.\n * Safely narrows the DrizzleClient union type to access db.query[tableName].\n */\n private getQueryBuilder(tableName: string): RelationalQueryBuilder<TablesRelationalConfig, TableRelationalConfig> | undefined {\n const query = (this.db as { query?: DbQueryAccessor }).query;\n return query?.[tableName] as RelationalQueryBuilder<TablesRelationalConfig, TableRelationalConfig> | undefined;\n }\n\n /**\n * Build filter conditions from FilterValues\n * Delegates to DrizzleConditionBuilder.buildFilterConditions\n */\n buildFilterConditions<M extends Record<string, any>>(\n filter: FilterValues<Extract<keyof M, string>>,\n table: PgTable<any>,\n collectionPath: string\n ): SQL[] {\n return DrizzleConditionBuilder.buildFilterConditions(filter, table, collectionPath);\n }\n\n // =============================================================\n // DRIZZLE QUERY HELPERS\n // =============================================================\n\n /**\n * Build the `with` config for Drizzle's relational query API.\n * Converts collection relations to a Drizzle-compatible `with` object.\n *\n * When `include` is provided, only those relations are loaded.\n * When `include` is absent, ALL relations are loaded (CMS path).\n *\n * Automatically detects many-to-many junction tables and nests\n * the target relation so actual entity data is returned.\n */\n private buildWithConfig(\n collection: EntityCollection,\n include?: string[]\n ): Record<string, boolean | { with: Record<string, boolean> }> {\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const propertyKeys = new Set(Object.keys(collection.properties || {}));\n const withConfig: Record<string, boolean | { with: Record<string, boolean> }> = {};\n\n const shouldInclude = (key: string) =>\n !include || include.length === 0 || include[0] === \"*\" || include.includes(key);\n\n for (const [key, relation] of Object.entries(resolvedRelations)) {\n if (!shouldInclude(key)) continue;\n // Only include relations that map to actual properties (or include all for REST)\n if (!include && !propertyKeys.has(key)) continue;\n\n const drizzleRelName = relation.relationName || key;\n\n // Skip relations that use joinPath as they are not mapped in Drizzle schemas\n if (relation.joinPath && relation.joinPath.length > 0) {\n continue;\n }\n\n // Detect many-to-many junction tables:\n // If the relation goes through a junction table (relation.through exists or\n // the Drizzle schema maps to a junction table), we need two-level with.\n if (relation.cardinality === \"many\" && this.isJunctionRelation(relation, collection)) {\n // The Drizzle relation points to the junction table.\n // We need: { [junctionRelName]: { with: { [targetFkName]: true } } }\n // The target FK name is the relation on the junction table that points to the actual target.\n const targetFkName = this.getJunctionTargetRelationName(relation, collection);\n if (targetFkName) {\n withConfig[drizzleRelName] = { with: { [targetFkName]: true } };\n } else {\n withConfig[drizzleRelName] = true;\n }\n } else {\n withConfig[drizzleRelName] = true;\n }\n }\n\n return withConfig;\n }\n\n /**\n * Detect if a many-to-many relation uses a junction table in the Drizzle schema.\n */\n private isJunctionRelation(relation: Relation, _collection: EntityCollection): boolean {\n // If `through` is defined, it's explicitly a junction relation\n if (relation.through) return true;\n // If joinPath has an intermediate table, it's likely junction-based\n if (relation.joinPath && relation.joinPath.length > 1) return true;\n return false;\n }\n\n /**\n * Get the Drizzle relation name on the junction table that points to the actual target entity.\n * For example, for posts_tags junction, this returns \"tag_id\" (the relation pointing to tags).\n */\n private getJunctionTargetRelationName(relation: Relation, _collection: EntityCollection): string | null {\n if (relation.through) {\n // The junction relation on the junction table pointing to the target\n // uses the targetColumn name as the Drizzle relation name\n return relation.through.targetColumn.replace(/_id$/, \"_id\");\n }\n return null;\n }\n\n /**\n * Convert a db.query result row (with nested relation objects) to an Entity<M>.\n * Handles:\n * - The { id, path, values } wrapping\n * - Type normalization (dates, numbers, NaN) via normalizeDbValues\n * - Converting nested relation objects to { id, path, __type: \"relation\" } for CMS\n * - Flattening junction-table many-to-many results\n */\n private drizzleResultToEntity<M extends Record<string, any>>(\n row: Record<string, unknown>,\n collection: EntityCollection,\n collectionPath: string,\n idInfo: { fieldName: string; type: \"string\" | \"number\" },\n databaseId?: string,\n idInfoArray?: { fieldName: string; type: \"string\" | \"number\" }[]\n ): Entity<M> {\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const propertyKeys = new Set(Object.keys(collection.properties || {}));\n\n // Normalize non-relation values (dates, numbers, etc.)\n const normalizedValues = normalizeDbValues(row as M, collection);\n\n // Convert nested relation objects to CMS-style { id, path, __type: \"relation\" }\n for (const [key, relation] of Object.entries(resolvedRelations)) {\n if (!propertyKeys.has(key)) continue;\n const drizzleRelName = relation.relationName || key;\n const relData = row[drizzleRelName];\n\n if (relData === undefined || relData === null) continue;\n\n if (relation.cardinality === \"many\" && Array.isArray(relData)) {\n const targetCollection = relation.target();\n const targetPath = targetCollection.slug;\n const targetPks = getPrimaryKeys(targetCollection, this.registry);\n const targetIdField = targetPks[0].fieldName;\n\n (normalizedValues as Record<string, unknown>)[key] = relData.map((item: Record<string, unknown>) => {\n // Handle junction table flattening:\n // Junction rows look like { post_id: 1, tag_id: { id: 5, name: \"ts\" } }\n let targetEntity = item;\n if (this.isJunctionRelation(relation, collection)) {\n // Find the nested target object in the junction row\n const nestedKey = Object.keys(item).find(\n nk => typeof item[nk] === \"object\" && item[nk] !== null && !Array.isArray(item[nk])\n );\n if (nestedKey) {\n targetEntity = item[nestedKey] as Record<string, unknown>;\n }\n }\n\n const relId = String(targetEntity[targetIdField] ?? targetEntity.id ?? targetEntity[Object.keys(targetEntity)[0]]);\n const targetValues = normalizeDbValues(targetEntity, targetCollection);\n\n return {\n id: relId,\n path: targetPath,\n __type: \"relation\" as const,\n data: {\n id: relId,\n path: targetPath,\n values: targetValues,\n databaseId\n }\n };\n });\n } else if (relation.cardinality === \"one\" && typeof relData === \"object\" && !Array.isArray(relData)) {\n const targetCollection = relation.target();\n const targetPath = targetCollection.slug;\n const targetPks = getPrimaryKeys(targetCollection, this.registry);\n const targetIdField = targetPks[0].fieldName;\n const relObj = relData as Record<string, unknown>;\n\n const relId = String(relObj[targetIdField] ?? relObj.id ?? relObj[Object.keys(relObj)[0]]);\n const targetValues = normalizeDbValues(relObj, targetCollection);\n\n (normalizedValues as Record<string, unknown>)[key] = {\n id: relId,\n path: targetPath,\n __type: \"relation\" as const,\n data: {\n id: relId,\n path: targetPath,\n values: targetValues,\n databaseId\n }\n };\n }\n }\n\n return {\n id: (idInfoArray && idInfoArray.length > 1) ? buildCompositeId(row as Record<string, any>, idInfoArray) : String(row[idInfo.fieldName]),\n path: collectionPath,\n values: normalizedValues as M,\n databaseId\n };\n }\n\n /**\n * Post-fetch joinPath relations for a single entity.\n * joinPath relations cannot be expressed via Drizzle's `with` config,\n * so they must be loaded separately after the primary query.\n */\n private async resolveJoinPathRelations<M extends Record<string, any>>(\n entity: Entity<M>,\n collection: EntityCollection,\n collectionPath: string,\n parsedId: string | number,\n databaseId?: string\n ): Promise<void> {\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const propertyKeys = new Set(Object.keys(collection.properties || {}));\n\n const promises = Object.entries(resolvedRelations)\n .filter(([key, relation]) => propertyKeys.has(key) && relation.joinPath && relation.joinPath.length > 0)\n .map(async ([key, relation]) => {\n try {\n const relatedEntities = await this.relationService.fetchRelatedEntities(\n collectionPath,\n parsedId,\n key,\n { limit: relation.cardinality === \"one\" ? 1 : undefined }\n );\n\n if (relation.cardinality === \"one\" && relatedEntities.length > 0) {\n const e = relatedEntities[0];\n (entity.values as Record<string, unknown>)[key] = {\n id: e.id,\n path: e.path,\n __type: \"relation\" as const,\n data: e\n };\n } else if (relation.cardinality === \"many\") {\n (entity.values as Record<string, unknown>)[key] = relatedEntities.map(e => ({\n id: e.id,\n path: e.path,\n __type: \"relation\" as const,\n data: e\n }));\n }\n } catch (e) {\n console.warn(`Could not resolve joinPath relation '${key}':`, e);\n }\n });\n\n await Promise.all(promises);\n }\n\n /**\n * Post-fetch joinPath relations for a batch of entities.\n * Uses batch fetching to avoid N+1 queries for list views.\n */\n private async resolveJoinPathRelationsBatch<M extends Record<string, any>>(\n entities: Entity<M>[],\n collection: EntityCollection,\n collectionPath: string,\n idInfo: { fieldName: string; type: \"string\" | \"number\" },\n databaseId?: string\n ): Promise<void> {\n if (entities.length === 0) return;\n\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const propertyKeys = new Set(Object.keys(collection.properties || {}));\n\n const joinPathRelations = Object.entries(resolvedRelations)\n .filter(([key, relation]) => propertyKeys.has(key) && relation.joinPath && relation.joinPath.length > 0);\n\n if (joinPathRelations.length === 0) return;\n\n for (const [key, relation] of joinPathRelations) {\n try {\n const entityIds = entities.map(e => {\n const parsed = parseIdValues(e.id, [idInfo]);\n return parsed[idInfo.fieldName] as string | number;\n });\n\n const resultMap = await this.relationService.batchFetchRelatedEntities(\n collectionPath,\n entityIds,\n key,\n relation\n );\n\n for (const entity of entities) {\n const parsed = parseIdValues(entity.id, [idInfo]);\n const entityId = parsed[idInfo.fieldName] as string | number;\n const relatedEntity = resultMap.get(entityId);\n\n if (relatedEntity) {\n if (relation.cardinality === \"one\") {\n (entity.values as Record<string, unknown>)[key] = {\n id: relatedEntity.id,\n path: relatedEntity.path,\n __type: \"relation\" as const,\n data: relatedEntity\n };\n }\n }\n }\n } catch (e) {\n console.warn(`Could not batch resolve joinPath relation '${key}':`, e);\n }\n }\n }\n\n /**\n * Convert a db.query result row to a flat REST-style object with populated relations.\n */\n private drizzleResultToRestRow(\n row: Record<string, unknown>,\n collection: EntityCollection,\n idInfo: { fieldName: string; type: \"string\" | \"number\" },\n idInfoArray?: { fieldName: string; type: \"string\" | \"number\" }[]\n ): Record<string, unknown> {\n const flat: Record<string, unknown> = { id: (idInfoArray && idInfoArray.length > 1) ? buildCompositeId(row as Record<string, any>, idInfoArray) : String(row[idInfo.fieldName]) };\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n\n for (const [k, v] of Object.entries(row)) {\n if (k === idInfo.fieldName) continue;\n\n const relation = resolvedRelations[k];\n if (Array.isArray(v) && relation) {\n // Many relation — flatten each nested entity, handling junction tables\n flat[k] = v.map((item: Record<string, unknown>) => {\n if (this.isJunctionRelation(relation, collection)) {\n const nestedKey = Object.keys(item).find(\n nk => typeof item[nk] === \"object\" && item[nk] !== null && !Array.isArray(item[nk])\n );\n if (nestedKey) {\n const nested = item[nestedKey] as Record<string, unknown>;\n return { id: String(nested.id ?? nested[Object.keys(nested)[0]]), ...nested };\n }\n }\n return { id: String(item.id ?? item[Object.keys(item)[0]]), ...item };\n });\n } else if (typeof v === \"object\" && v !== null && !Array.isArray(v) && relation) {\n // One-to-one relation — inline the object\n const relObj = v as Record<string, unknown>;\n flat[k] = { id: String(relObj.id ?? relObj[Object.keys(relObj)[0]]), ...relObj };\n } else {\n flat[k] = v;\n }\n }\n return flat;\n }\n\n /**\n * Build db.query-compatible options from standard fetch options.\n * Handles filter, search, orderBy, limit, and cursor-based pagination.\n */\n private buildDrizzleQueryOptions<M extends Record<string, any>>(\n table: PgTable<any>,\n idField: AnyPgColumn,\n idInfo: { fieldName: string; type: \"string\" | \"number\" },\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n startAfter?: Record<string, unknown>;\n searchString?: string;\n },\n collectionPath: string,\n withConfig?: Record<string, any>\n ): Record<string, unknown> {\n const queryOpts: Record<string, unknown> = {};\n\n if (withConfig) queryOpts.with = withConfig;\n\n // Build where conditions\n const allConditions: SQL[] = [];\n\n if (options.searchString) {\n const collection = getCollectionByPath(collectionPath, this.registry);\n const searchConditions = DrizzleConditionBuilder.buildSearchConditions(\n options.searchString, collection.properties, table\n );\n if (searchConditions.length === 0) {\n // Return options that will produce empty results\n queryOpts.where = and(eq(idField, -99999999)); // impossible condition\n return queryOpts;\n }\n allConditions.push(DrizzleConditionBuilder.combineConditionsWithOr(searchConditions)!);\n }\n\n if (options.filter) {\n const filterConditions = this.buildFilterConditions(options.filter, table, collectionPath);\n if (filterConditions.length > 0) allConditions.push(...filterConditions);\n }\n\n // Cursor-based pagination (startAfter)\n if (options.startAfter) {\n const cursorConditions = this.buildCursorConditions(table, idField, idInfo, options);\n if (cursorConditions.length > 0) allConditions.push(...cursorConditions);\n }\n\n if (allConditions.length > 0) {\n queryOpts.where = and(...allConditions);\n }\n\n // OrderBy\n const orderExpressions: unknown[] = [];\n if (options.orderBy) {\n const orderByField = table[options.orderBy as keyof typeof table] as AnyPgColumn;\n if (orderByField) {\n orderExpressions.push(options.order === \"asc\" ? asc(orderByField) : desc(orderByField));\n }\n }\n orderExpressions.push(desc(idField));\n if (orderExpressions.length > 0) {\n queryOpts.orderBy = orderExpressions;\n }\n\n // Limit\n const limitValue = options.searchString ? (options.limit || 50) : options.limit;\n if (limitValue) queryOpts.limit = limitValue;\n\n return queryOpts;\n }\n\n /**\n * Extract cursor pagination conditions from startAfter options.\n */\n private buildCursorConditions(\n table: PgTable<any>,\n idField: AnyPgColumn,\n idInfo: { fieldName: string; type: \"string\" | \"number\" },\n options: { orderBy?: string; order?: \"desc\" | \"asc\"; startAfter?: Record<string, unknown> }\n ): SQL[] {\n if (!options.startAfter) return [];\n const cursor = options.startAfter;\n\n if (options.orderBy) {\n const orderByField = table[options.orderBy as keyof typeof table] as AnyPgColumn;\n if (orderByField) {\n const startAfterOrderValue = (cursor.values as Record<string, unknown> | undefined)?.[options.orderBy] ?? cursor[options.orderBy];\n const startAfterId = cursor.id ?? cursor[idInfo.fieldName];\n\n if (startAfterOrderValue !== undefined && startAfterId !== undefined) {\n if (options.order === \"asc\") {\n return [or(\n gt(orderByField, startAfterOrderValue),\n and(eq(orderByField, startAfterOrderValue), gt(idField, startAfterId))\n )!];\n } else {\n return [or(\n lt(orderByField, startAfterOrderValue),\n and(eq(orderByField, startAfterOrderValue), lt(idField, startAfterId))\n )!];\n }\n }\n }\n } else {\n const startAfterId = cursor.id ?? cursor[idInfo.fieldName];\n if (startAfterId !== undefined && startAfterId !== null) {\n const idInfoArray = [idInfo] as Array<{ fieldName: string; type: \"string\" | \"number\" }>;\n const parsedStartAfterIdObj = parseIdValues(startAfterId as string | number, idInfoArray);\n return [lt(idField, parsedStartAfterIdObj[idInfo.fieldName])];\n }\n }\n\n return [];\n }\n\n /**\n * Fetch a single entity by ID\n */\n async fetchEntity<M extends Record<string, any>>(\n collectionPath: string,\n entityId: string | number,\n databaseId?: string\n ): Promise<Entity<M> | undefined> {\n const collection = getCollectionByPath(collectionPath, this.registry);\n const table = getTableForCollection(collection, this.registry);\n const idInfoArray = getPrimaryKeys(collection, this.registry);\n const idInfo = idInfoArray[0];\n const idField = table[idInfo.fieldName as keyof typeof table] as AnyPgColumn;\n\n if (!idField) {\n throw new Error(`ID field '${idInfo.fieldName}' not found in table for collection '${collectionPath}'`);\n }\n\n const parsedIdObj = parseIdValues(entityId, idInfoArray);\n const parsedId = parsedIdObj[idInfo.fieldName];\n\n // Primary path: use db.query.findFirst with relation loading\n \n const tableName = getTableName(table);\n\n const qb = this.getQueryBuilder(tableName);\n if (qb) {\n try {\n const withConfig = this.buildWithConfig(collection);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic query config\n const row = await qb.findFirst({\n where: eq(idField, parsedId),\n with: withConfig\n } as unknown as Parameters<NonNullable<typeof qb>[\"findFirst\"]>[0]);\n\n if (!row) return undefined;\n\n const entity = this.drizzleResultToEntity<M>(row, collection, collectionPath, idInfo, databaseId, idInfoArray);\n\n // Post-fetch joinPath relations that Drizzle's `with` can't express\n await this.resolveJoinPathRelations(entity, collection, collectionPath, parsedId, databaseId);\n\n return entity;\n } catch (e) {\n console.warn(`[EntityFetchService] db.query.findFirst failed for ${collectionPath}, falling back to db.select:`, e);\n }\n }\n\n // Fallback: db.select + N+1 relation loading\n const result = await this.db\n .select()\n .from(table)\n .where(eq(idField, parsedId))\n .limit(1);\n\n if (result.length === 0) return undefined;\n\n const raw = result[0] as M;\n const values = await parseDataFromServer(raw, collection, this.db, this.registry);\n\n // Load relations based on cardinality (N+1 — only used in fallback)\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const propertyKeys = new Set(Object.keys(collection.properties));\n\n const relationPromises = Object.entries(resolvedRelations)\n .filter(([key]) => propertyKeys.has(key))\n .map(async ([key, relation]) => {\n if (relation.cardinality === \"many\") {\n const relatedEntities = await this.relationService.fetchRelatedEntities(\n collectionPath,\n parsedId,\n key,\n {}\n );\n (values as Record<string, unknown>)[key] = relatedEntities.map(e => ({\n id: e.id,\n path: e.path,\n __type: \"relation\"\n }));\n } else if (relation.cardinality === \"one\") {\n if ((values as Record<string, unknown>)[key] == null) {\n try {\n const relatedEntities = await this.relationService.fetchRelatedEntities(\n collectionPath,\n parsedId,\n key,\n { limit: 1 }\n );\n if (relatedEntities.length > 0) {\n const e = relatedEntities[0];\n (values as Record<string, unknown>)[key] = {\n id: e.id,\n path: e.path,\n __type: \"relation\"\n };\n }\n } catch (e) {\n console.warn(`Could not resolve one-to-one relation property: ${key}`, e);\n }\n }\n }\n });\n\n await Promise.all(relationPromises);\n\n return {\n id: entityId.toString(),\n path: collectionPath,\n values: values as M,\n databaseId\n };\n }\n\n /**\n * Unified method to fetch entities with optional search functionality\n */\n async fetchEntitiesWithConditions<M extends Record<string, any>>(\n collectionPath: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n startAfter?: Record<string, unknown>;\n searchString?: string;\n databaseId?: string;\n } = {}\n ): Promise<Entity<M>[]> {\n const collection = getCollectionByPath(collectionPath, this.registry);\n const table = getTableForCollection(collection, this.registry);\n const idInfoArray = getPrimaryKeys(collection, this.registry);\n const idInfo = idInfoArray[0];\n const idField = table[idInfo.fieldName as keyof typeof table] as AnyPgColumn;\n\n if (!idField) {\n throw new Error(`ID field '${idInfo.fieldName}' not found in table for collection '${collectionPath}'`);\n }\n\n // Primary path: use db.query.findMany with relation loading\n \n const tableName = getTableName(table);\n\n const qb = this.getQueryBuilder(tableName);\n if (qb) {\n try {\n const withConfig = this.buildWithConfig(collection);\n const queryOpts = this.buildDrizzleQueryOptions<M>(\n table, idField, idInfo, options, collectionPath, withConfig\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic query config\n const results = await qb.findMany(queryOpts as unknown as Parameters<NonNullable<typeof qb>[\"findMany\"]>[0]);\n\n const entities = (results as Record<string, unknown>[]).map(row =>\n this.drizzleResultToEntity<M>(row, collection, collectionPath, idInfo, options.databaseId, idInfoArray)\n );\n\n // Post-fetch joinPath relations that Drizzle's `with` can't express\n await this.resolveJoinPathRelationsBatch(entities, collection, collectionPath, idInfo, options.databaseId);\n\n return entities;\n } catch (e) {\n console.warn(`[EntityFetchService] db.query.findMany failed for ${collectionPath}, falling back to db.select:`, e);\n }\n }\n\n // Fallback: db.select + processEntityResults (N+1 for relations)\n let query = this.db.select().from(table).$dynamic();\n const allConditions: SQL[] = [];\n\n if (options.searchString) {\n const searchConditions = DrizzleConditionBuilder.buildSearchConditions(\n options.searchString, collection.properties, table\n );\n if (searchConditions.length === 0) return [];\n allConditions.push(DrizzleConditionBuilder.combineConditionsWithOr(searchConditions)!);\n }\n\n if (options.filter) {\n const filterConditions = this.buildFilterConditions(options.filter, table, collectionPath);\n if (filterConditions.length > 0) allConditions.push(...filterConditions);\n }\n\n if (allConditions.length > 0) {\n const finalCondition = DrizzleConditionBuilder.combineConditionsWithAnd(allConditions);\n if (finalCondition) query = query.where(finalCondition);\n }\n\n const orderExpressions = [];\n if (options.orderBy) {\n const orderByField = table[options.orderBy as keyof typeof table] as AnyPgColumn;\n if (orderByField) {\n orderExpressions.push(options.order === \"asc\" ? asc(orderByField) : desc(orderByField));\n }\n }\n orderExpressions.push(desc(idField));\n if (orderExpressions.length > 0) query = query.orderBy(...orderExpressions);\n\n if (options.startAfter) {\n const cursorConditions = this.buildCursorConditions(table, idField, idInfo, options);\n if (cursorConditions.length > 0) {\n allConditions.push(...cursorConditions);\n const finalCondition = DrizzleConditionBuilder.combineConditionsWithAnd(allConditions);\n if (finalCondition) query = query.where(finalCondition);\n }\n }\n\n const limitValue = options.searchString ? (options.limit || 50) : options.limit;\n if (limitValue) query = query.limit(limitValue);\n\n const results = await query;\n\n return this.processEntityResults<M>(results, collection, collectionPath, idInfo, options.databaseId, false, idInfoArray);\n }\n\n /**\n * Fallback path used when db.query is unavailable.\n * The primary path uses drizzleResultToEntity which handles relation\n * mapping without N+1 queries.\n *\n * Process raw database results into Entity objects with relations.\n */\n private async processEntityResults<M extends Record<string, any>>(\n results: Record<string, unknown>[],\n collection: EntityCollection,\n collectionPath: string,\n idInfo: { fieldName: string; type: \"string\" | \"number\" },\n databaseId?: string,\n skipRelations: boolean = false,\n idInfoArray?: { fieldName: string; type: \"string\" | \"number\" }[]\n ): Promise<Entity<M>[]> {\n if (results.length === 0) return [];\n\n // First pass: parse all entities\n const entitiesWithValues = await Promise.all(results.map(async (entity: Record<string, unknown>) => {\n const values = await parseDataFromServer(entity as M, collection, this.db, this.registry);\n return {\n entity,\n values,\n id: (idInfoArray && idInfoArray.length > 1) ? buildCompositeId(entity as Record<string, any>, idInfoArray!) : String(entity[idInfo.fieldName]),\n path: collectionPath\n };\n }));\n\n if (!skipRelations) {\n // Second pass: batch load missing one-to-one relations\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const propertyKeys = new Set(Object.keys(collection.properties));\n\n for (const [key, relation] of Object.entries(resolvedRelations)) {\n if (!propertyKeys.has(key) || relation.cardinality !== \"one\") continue;\n\n const entitiesMissingRelation = entitiesWithValues.filter(item => {\n const val = (item.values as Record<string, unknown>)[key];\n if (val == null) return true;\n if (typeof val === \"object\" && !Array.isArray(val) && (val as Record<string, unknown>).__type === \"relation\" && (val as Record<string, unknown>).data == null) return true;\n return false;\n });\n\n if (entitiesMissingRelation.length === 0) continue;\n\n try {\n const entityIds = entitiesMissingRelation.map(item => item.entity[idInfo.fieldName] as string | number);\n const relationResults = await this.relationService.batchFetchRelatedEntities(\n collectionPath,\n entityIds,\n key,\n relation\n );\n\n entitiesMissingRelation.forEach(item => {\n const entityId = item.entity[idInfo.fieldName] as string | number;\n const relatedEntity = relationResults.get(entityId);\n if (relatedEntity) {\n (item.values as Record<string, unknown>)[key] = {\n id: relatedEntity.id,\n path: relatedEntity.path,\n __type: \"relation\",\n data: relatedEntity\n };\n }\n });\n } catch (e) {\n console.warn(`Could not batch load one-to-one relation property: ${key}`, e);\n }\n }\n\n // Handle many relations\n const manyRelationPromises = entitiesWithValues.map(async (item) => {\n const manyRelationQueries = Object.entries(resolvedRelations)\n .filter(([key, relation]) => propertyKeys.has(key) && relation.cardinality === \"many\")\n .map(async ([key]) => {\n try {\n const relatedEntities = await this.relationService.fetchRelatedEntities(\n collectionPath,\n item.entity[idInfo.fieldName] as string | number,\n key,\n {}\n );\n (item.values as Record<string, unknown>)[key] = relatedEntities.map(e => ({\n id: e.id,\n path: e.path,\n __type: \"relation\",\n data: e\n }));\n } catch (e) {\n console.warn(`Could not resolve many relation property: ${key}`, e);\n }\n });\n await Promise.all(manyRelationQueries);\n });\n\n await Promise.all(manyRelationPromises);\n }\n\n return entitiesWithValues.map(item => ({\n id: item.id,\n path: item.path,\n values: item.values as M,\n databaseId\n }));\n }\n\n /**\n * Fetch a collection of entities\n */\n async fetchCollection<M extends Record<string, any>>(\n collectionPath: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n startAfter?: Record<string, unknown>;\n searchString?: string;\n databaseId?: string;\n } = {}\n ): Promise<Entity<M>[]> {\n // Handle multi-segment paths by resolving through relations\n if (collectionPath.includes(\"/\")) {\n return this.fetchCollectionFromPath<M>(collectionPath, options);\n }\n\n return this.fetchEntitiesWithConditions<M>(collectionPath, options);\n }\n\n /**\n * Search entities by text\n */\n async searchEntities<M extends Record<string, any>>(\n collectionPath: string,\n searchString: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n databaseId?: string;\n } = {}\n ): Promise<Entity<M>[]> {\n return this.fetchEntitiesWithConditions<M>(collectionPath, {\n ...options,\n searchString\n });\n }\n\n /**\n * Fetch collection from multi-segment path\n */\n private async fetchCollectionFromPath<M extends Record<string, any>>(\n path: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n startAfter?: Record<string, unknown>;\n searchString?: string;\n databaseId?: string;\n } = {}\n ): Promise<Entity<M>[]> {\n const pathSegments = path.split(\"/\").filter(p => p && p !== \"undefined\");\n\n if (pathSegments.length < 3 || pathSegments.length % 2 === 0) {\n throw new Error(`Invalid relation path: ${path}. Expected format: collection/id/relation`);\n }\n\n const rootCollectionPath = pathSegments[0];\n let currentCollection = getCollectionByPath(rootCollectionPath, this.registry);\n let currentEntityId: string | number = pathSegments[1];\n\n for (let i = 2; i < pathSegments.length; i += 2) {\n const relationKey = pathSegments[i];\n const resolvedRelations = resolveCollectionRelations(currentCollection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const relation = resolvedRelations[relationKey];\n\n if (!relation) {\n throw new Error(`Relation '${relationKey}' not found in collection '${currentCollection.slug}'`);\n }\n\n if (i === pathSegments.length - 1) {\n return this.relationService.fetchRelatedEntities<M>(\n currentCollection.slug,\n currentEntityId,\n relationKey,\n options\n );\n }\n\n if (i + 1 < pathSegments.length) {\n const nextEntityId = pathSegments[i + 1];\n currentCollection = relation.target();\n currentEntityId = nextEntityId;\n }\n }\n\n throw new Error(`Unable to resolve path: ${path}`);\n }\n\n /**\n * Count entities in a collection\n */\n async countEntities<M extends Record<string, any>>(\n collectionPath: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n databaseId?: string;\n } = {}\n ): Promise<number> {\n if (collectionPath.includes(\"/\")) {\n return this.countEntitiesFromPath<M>(collectionPath, options);\n }\n\n const collection = getCollectionByPath(collectionPath, this.registry);\n const table = getTableForCollection(collection, this.registry);\n\n let query = this.db.select({ count: count() }).from(table).$dynamic();\n\n if (options.filter) {\n const filterConditions = this.buildFilterConditions(options.filter, table, collectionPath);\n if (filterConditions.length > 0) {\n query = query.where(and(...filterConditions));\n }\n }\n\n const result = await query;\n return Number(result[0]?.count || 0);\n }\n\n /**\n * Count entities from multi-segment path\n */\n private async countEntitiesFromPath<M extends Record<string, any>>(\n path: string,\n options: { filter?: FilterValues<Extract<keyof M, string>>; databaseId?: string } = {}\n ): Promise<number> {\n const pathSegments = path.split(\"/\").filter(p => p && p !== \"undefined\");\n\n if (pathSegments.length < 3 || pathSegments.length % 2 === 0) {\n throw new Error(`Invalid relation path: ${path}`);\n }\n\n const rootCollectionPath = pathSegments[0];\n let currentCollection = getCollectionByPath(rootCollectionPath, this.registry);\n let currentEntityId: string | number = pathSegments[1];\n\n for (let i = 2; i < pathSegments.length; i += 2) {\n const relationKey = pathSegments[i];\n const resolvedRelations = resolveCollectionRelations(currentCollection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const relation = resolvedRelations[relationKey];\n\n if (!relation) {\n throw new Error(`Relation '${relationKey}' not found`);\n }\n\n if (i === pathSegments.length - 1) {\n return this.relationService.countRelatedEntities(\n currentCollection.slug,\n currentEntityId,\n relationKey,\n options\n );\n }\n\n if (i + 1 < pathSegments.length) {\n currentCollection = relation.target();\n currentEntityId = pathSegments[i + 1];\n }\n }\n\n throw new Error(`Unable to count for path: ${path}`);\n }\n\n /**\n * Check if a field value is unique\n */\n async checkUniqueField(\n collectionPath: string,\n fieldName: string,\n value: unknown,\n excludeEntityId?: string,\n _databaseId?: string\n ): Promise<boolean> {\n if (value === undefined || value === null) return true;\n\n const collection = getCollectionByPath(collectionPath, this.registry);\n const table = getTableForCollection(collection, this.registry);\n const idInfoArray = getPrimaryKeys(collection, this.registry);\n const idInfo = idInfoArray[0];\n const idField = table[idInfo.fieldName as keyof typeof table] as AnyPgColumn;\n const field = table[fieldName as keyof typeof table] as AnyPgColumn;\n\n if (!field) return true;\n\n const parsedExcludeId = excludeEntityId ? parseIdValues(excludeEntityId, idInfoArray)[idInfo.fieldName] : undefined;\n const conditions = DrizzleConditionBuilder.buildUniqueFieldCondition(\n field,\n value,\n idField,\n parsedExcludeId\n );\n\n const result = await this.db\n .select({ count: count() })\n .from(table)\n .where(and(...conditions));\n\n const countResult = Number(result[0]?.count || 0);\n return countResult === 0;\n }\n\n /**\n * Get the RelationService instance for external use\n */\n getRelationService(): RelationService {\n return this.relationService;\n }\n\n // =============================================================\n // REST API INCLUDE-AWARE METHODS\n // =============================================================\n\n /**\n * Fetch a collection of entities with optional relation includes.\n * When `include` is provided, only the specified relations are populated\n * with full entity data (not just { id, path, __type }).\n * When `include` is absent, no relation queries are made (fast path).\n *\n * @param include - Array of relation keys to populate, or [\"*\"] for all\n */\n async fetchCollectionForRest<M extends Record<string, any>>(\n collectionPath: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n startAfter?: Record<string, unknown>;\n searchString?: string;\n databaseId?: string;\n } = {},\n include?: string[]\n ): Promise<Record<string, unknown>[]> {\n const collection = getCollectionByPath(collectionPath, this.registry);\n const table = getTableForCollection(collection, this.registry);\n const idInfoArray = getPrimaryKeys(collection, this.registry);\n const idInfo = idInfoArray[0];\n const idField = table[idInfo.fieldName as keyof typeof table] as AnyPgColumn;\n\n // Primary path: use db.query.findMany\n \n const tableName = getTableName(table);\n\n const qb = this.getQueryBuilder(tableName);\n if (qb) {\n try {\n const withConfig = (include && include.length > 0)\n ? this.buildWithConfig(collection, include)\n : undefined;\n\n const queryOpts = this.buildDrizzleQueryOptions<M>(\n table, idField, idInfo, options, collectionPath, withConfig\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic query config\n const results = await qb.findMany(queryOpts as unknown as Parameters<NonNullable<typeof qb>[\"findMany\"]>[0]);\n\n return (results as Record<string, unknown>[]).map(row =>\n this.drizzleResultToRestRow(row, collection, idInfo, idInfoArray)\n );\n } catch (e) {\n console.warn(`[fetchCollectionForRest] db.query.findMany failed for ${collectionPath}, falling back:`, e);\n }\n }\n\n // Fallback: fetch base entities without relations\n const entities = await this.fetchEntitiesWithConditionsRaw<M>(collectionPath, options);\n\n if (!include || include.length === 0) {\n return entities.map(entity => ({\n id: (idInfoArray.length > 1) ? buildCompositeId(entity as Record<string, any>, idInfoArray) : String(entity[idInfo.fieldName]),\n ...entity\n }));\n }\n\n // Fallback relation loading via batch\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const propertyKeys = new Set(Object.keys(collection.properties || {}));\n const shouldInclude = (key: string) =>\n include[0] === \"*\" || include.includes(key);\n\n const entityIds = entities.map(e => e[idInfo.fieldName] as string | number);\n\n for (const [key, relation] of Object.entries(resolvedRelations)) {\n if (!propertyKeys.has(key) || !shouldInclude(key) || relation.cardinality !== \"one\") continue;\n try {\n const batchResults = await this.relationService.batchFetchRelatedEntities(\n collectionPath, entityIds, key, relation\n );\n for (const entity of entities) {\n const eid = entity[idInfo.fieldName] as string | number;\n const related = batchResults.get(eid);\n if (related) {\n (entity as Record<string, unknown>)[key] = { id: related.id, ...related.values };\n }\n }\n } catch (e) {\n console.warn(`[include] Failed to batch load one-to-one '${key}':`, e);\n }\n }\n\n for (const [key, relation] of Object.entries(resolvedRelations)) {\n if (!propertyKeys.has(key) || !shouldInclude(key) || relation.cardinality !== \"many\") continue;\n try {\n const batchResults = await this.batchFetchManyRelatedEntities(\n collectionPath, entityIds, key\n );\n for (const entity of entities) {\n const eid = entity[idInfo.fieldName] as string | number;\n const relatedList = batchResults.get(String(eid)) || [];\n (entity as Record<string, unknown>)[key] = relatedList.map(e => ({\n id: e.id, ...e.values\n }));\n }\n } catch (e) {\n console.warn(`[include] Failed to batch load many '${key}':`, e);\n }\n }\n\n return entities.map(entity => ({\n id: (idInfoArray.length > 1) ? buildCompositeId(entity as Record<string, any>, idInfoArray) : String(entity[idInfo.fieldName]),\n ...entity\n }));\n }\n\n /**\n * Fetch a single entity with optional relation includes for REST API.\n */\n async fetchEntityForRest<M extends Record<string, any>>(\n collectionPath: string,\n entityId: string | number,\n include?: string[],\n databaseId?: string\n ): Promise<Record<string, unknown> | null> {\n const collection = getCollectionByPath(collectionPath, this.registry);\n const table = getTableForCollection(collection, this.registry);\n const idInfoArray = getPrimaryKeys(collection, this.registry);\n const idInfo = idInfoArray[0];\n const idField = table[idInfo.fieldName as keyof typeof table] as AnyPgColumn;\n\n const parsedIdObj = parseIdValues(entityId, idInfoArray);\n const parsedId = parsedIdObj[idInfo.fieldName];\n\n // Primary path: use db.query.findFirst\n \n const tableName = getTableName(table);\n\n const qb = this.getQueryBuilder(tableName);\n if (qb) {\n try {\n const withConfig = (include && include.length > 0)\n ? this.buildWithConfig(collection, include)\n : undefined;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- dynamic query config\n const row = await qb.findFirst({\n where: eq(idField, parsedId),\n ...(withConfig ? { with: withConfig } : {})\n } as unknown as Parameters<NonNullable<typeof qb>[\"findFirst\"]>[0]);\n\n if (!row) return null;\n\n return this.drizzleResultToRestRow(row, collection, idInfo, idInfoArray);\n } catch (e) {\n console.warn(`[fetchEntityForRest] db.query.findFirst failed for ${collectionPath}, falling back:`, e);\n }\n }\n\n // Fallback: db.select + N+1 relation loading\n const result = await this.db\n .select()\n .from(table)\n .where(eq(idField, parsedId))\n .limit(1);\n\n if (result.length === 0) return null;\n\n const raw = result[0] as Record<string, unknown>;\n const flatEntity: Record<string, unknown> = { id: (idInfoArray.length > 1) ? buildCompositeId(raw as Record<string, any>, idInfoArray) : String(raw[idInfo.fieldName]), ...raw };\n\n if (!include || include.length === 0) {\n return flatEntity;\n }\n\n // Fallback relation population\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const propertyKeys = new Set(Object.keys(collection.properties || {}));\n const shouldInclude = (key: string) =>\n include[0] === \"*\" || include.includes(key);\n\n for (const [key, relation] of Object.entries(resolvedRelations)) {\n if (!propertyKeys.has(key) || !shouldInclude(key)) continue;\n\n try {\n const relatedEntities = await this.relationService.fetchRelatedEntities(\n collectionPath, parsedId, key, {}\n );\n\n if (relation.cardinality === \"one\") {\n if (relatedEntities.length > 0) {\n const e = relatedEntities[0];\n flatEntity[key] = { id: e.id, ...e.values };\n }\n } else {\n flatEntity[key] = relatedEntities.map(e => ({\n id: e.id, ...e.values\n }));\n }\n } catch (e) {\n console.warn(`[include] Failed to load relation '${key}':`, e);\n }\n }\n\n return flatEntity;\n }\n\n /**\n * Fetch raw rows without any relation processing (for REST fast path)\n */\n private async fetchEntitiesWithConditionsRaw<M extends Record<string, any>>(\n collectionPath: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n startAfter?: Record<string, unknown>;\n searchString?: string;\n } = {}\n ): Promise<Record<string, unknown>[]> {\n const collection = getCollectionByPath(collectionPath, this.registry);\n const table = getTableForCollection(collection, this.registry);\n const idInfoArray = getPrimaryKeys(collection, this.registry);\n const idInfo = idInfoArray[0];\n const idField = table[idInfo.fieldName as keyof typeof table] as AnyPgColumn;\n\n let query = this.db.select().from(table).$dynamic();\n const allConditions: SQL[] = [];\n\n if (options.searchString) {\n const searchConditions = DrizzleConditionBuilder.buildSearchConditions(\n options.searchString, collection.properties, table\n );\n if (searchConditions.length === 0) return [];\n allConditions.push(DrizzleConditionBuilder.combineConditionsWithOr(searchConditions)!);\n }\n\n if (options.filter) {\n const filterConditions = this.buildFilterConditions(options.filter, table, collectionPath);\n if (filterConditions.length > 0) allConditions.push(...filterConditions);\n }\n\n if (allConditions.length > 0) {\n const finalCondition = DrizzleConditionBuilder.combineConditionsWithAnd(allConditions);\n if (finalCondition) query = query.where(finalCondition);\n }\n\n const orderExpressions = [];\n if (options.orderBy) {\n const orderByField = table[options.orderBy as keyof typeof table] as AnyPgColumn;\n if (orderByField) {\n orderExpressions.push(options.order === \"asc\" ? asc(orderByField) : desc(orderByField));\n }\n }\n orderExpressions.push(desc(idField));\n if (orderExpressions.length > 0) query = query.orderBy(...orderExpressions);\n\n const limitValue = options.searchString ? (options.limit || 50) : options.limit;\n if (limitValue) query = query.limit(limitValue);\n\n return await query as Record<string, unknown>[];\n }\n\n /**\n * Check if the Drizzle instance has the relational query API available\n * for a given collection path.\n * Note: Primary path now uses inline `getQueryBuilder()` checks.\n */\n private hasDrizzleQueryAPI(collectionPath: string): boolean {\n \n const qb = this.getQueryBuilder(\"__probe__\");\n if (!qb) {\n // If getQueryBuilder returns undefined even for a probe, query API is not available\n return false;\n }\n const collection = getCollectionByPath(collectionPath, this.registry);\n const table = getTableForCollection(collection, this.registry);\n const tableName = getTableName(table);\n return !!this.getQueryBuilder(tableName);\n }\n\n /**\n * Attempt to use Drizzle's relational query API (db.query.<table>.findMany)\n * for efficient JOIN-based relation loading.\n * Returns null if the API is not available or the query fails.\n * Note: Primary path now uses `buildWithConfig` + `buildDrizzleQueryOptions`.\n */\n private async fetchWithDrizzleQuery<M extends Record<string, any>>(\n collectionPath: string,\n collection: EntityCollection,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n },\n include: string[],\n idInfo: { fieldName: string; type: \"string\" | \"number\" },\n idInfoArray?: { fieldName: string; type: \"string\" | \"number\" }[]\n ): Promise<Record<string, unknown>[] | null> {\n try {\n \n const table = getTableForCollection(collection, this.registry);\n const tableName = getTableName(table);\n const queryTarget = this.getQueryBuilder(tableName);\n\n if (!queryTarget?.findMany) return null;\n\n // Build the `with` config from include array\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const withConfig: Record<string, boolean> = {};\n for (const [key, relation] of Object.entries(resolvedRelations)) {\n if (include[0] === \"*\" || include.includes(key)) {\n // Use the Drizzle relation name (from the schema)\n const drizzleRelName = relation.relationName || key;\n withConfig[drizzleRelName] = true;\n }\n }\n\n // Build query options\n const queryOpts: Record<string, unknown> = { with: withConfig };\n if (options.limit) queryOpts.limit = options.limit;\n\n // Build where clause\n if (options.filter) {\n const filterConditions = this.buildFilterConditions(\n options.filter, table, collectionPath\n );\n if (filterConditions.length > 0) {\n queryOpts.where = and(...filterConditions);\n }\n }\n\n // Build orderBy\n if (options.orderBy) {\n const orderByField = table[options.orderBy as keyof typeof table] as AnyPgColumn;\n if (orderByField) {\n queryOpts.orderBy = options.order === \"asc\" ? asc(orderByField) : desc(orderByField);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- deprecated method, will be removed\n const results = await queryTarget.findMany(queryOpts as unknown as Parameters<NonNullable<typeof queryTarget>[\"findMany\"]>[0]);\n\n // Flatten the nested Drizzle results into REST format\n return results.map((row: Record<string, unknown>) => {\n const flat: Record<string, unknown> = { id: (idInfoArray && idInfoArray.length > 1) ? buildCompositeId(row as Record<string, any>, idInfoArray) : String(row[idInfo.fieldName]) };\n for (const [k, v] of Object.entries(row)) {\n if (k === idInfo.fieldName) continue;\n if (Array.isArray(v)) {\n // Many relation — flatten each nested entity\n flat[k] = v.map((item: Record<string, unknown>) => {\n // Junction table rows may have the target nested, flatten those\n const keys = Object.keys(item);\n // If it looks like a junction row (only FKs + nested objects), extract nested\n const nestedObj = keys.find(nk => typeof item[nk] === \"object\" && item[nk] !== null && !Array.isArray(item[nk]));\n if (nestedObj && keys.length <= 3) {\n const nested = item[nestedObj] as Record<string, unknown>;\n return { id: String(nested.id ?? nested[Object.keys(nested)[0]]), ...nested };\n }\n return { id: String(item.id ?? item[Object.keys(item)[0]]), ...item };\n });\n } else if (typeof v === \"object\" && v !== null) {\n // One-to-one relation — inline the object\n const relObj = v as Record<string, unknown>;\n flat[k] = { id: String(relObj.id ?? relObj[Object.keys(relObj)[0]]), ...relObj };\n } else {\n flat[k] = v;\n }\n }\n return flat;\n });\n } catch (e) {\n console.warn(`[include] Drizzle relational query failed for '${collectionPath}', falling back:`, e);\n return null;\n }\n }\n\n /**\n * Fallback path used when db.query is unavailable.\n * The primary path uses db.query.findMany with `with` config, which\n * loads all relations in a single query.\n *\n * Batch fetch many-to-many related entities for multiple parent IDs.\n * Groups results by parent ID to avoid N+1.\n */\n private async batchFetchManyRelatedEntities(\n parentCollectionPath: string,\n parentIds: (string | number)[],\n relationKey: string\n ): Promise<Map<string, Entity[]>> {\n const resultMap = new Map<string, Entity[]>();\n\n // Fetch for all parents using Promise.all (limited batch)\n const batchPromises = parentIds.map(async (parentId) => {\n try {\n const related = await this.relationService.fetchRelatedEntities(\n parentCollectionPath, parentId, relationKey, {}\n );\n resultMap.set(String(parentId), related);\n } catch (e) {\n resultMap.set(String(parentId), []);\n }\n });\n\n await Promise.all(batchPromises);\n return resultMap;\n }\n}\n","import { eq, and } from \"drizzle-orm\";\nimport { AnyPgColumn } from \"drizzle-orm/pg-core\";\n// import { NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport { Entity, EntityCollection, Properties, Relation } from \"@rebasepro/types\";\nimport { getTableName, resolveCollectionRelations } from \"@rebasepro/common\";\nimport { DrizzleConditionBuilder } from \"../utils/drizzle-conditions\";\nimport {\n getCollectionByPath,\n getTableForCollection,\n getPrimaryKeys,\n parseIdValues,\n buildCompositeId\n} from \"./entity-helpers\";\nimport { sanitizeAndConvertDates, serializeDataToServer } from \"../data-transformer\";\nimport { RelationService } from \"./RelationService\";\nimport { EntityFetchService } from \"./EntityFetchService\";\nimport { DrizzleClient } from \"../interfaces\";\nimport { PostgresCollectionRegistry } from \"../collections/PostgresCollectionRegistry\";\n\n/**\n * Service for handling all entity write operations.\n * Handles saving, deleting, and updating entities.\n */\nexport class EntityPersistService {\n private relationService: RelationService;\n private fetchService: EntityFetchService;\n\n constructor(private db: DrizzleClient, private registry: PostgresCollectionRegistry) {\n this.relationService = new RelationService(db, registry);\n this.fetchService = new EntityFetchService(db, registry);\n }\n\n\n /**\n * Delete an entity by ID\n */\n async deleteEntity(collectionPath: string, entityId: string | number, _databaseId?: string): Promise<void> {\n const collection = getCollectionByPath(collectionPath, this.registry);\n const table = getTableForCollection(collection, this.registry);\n const idInfoArray = getPrimaryKeys(collection, this.registry);\n const idInfo = idInfoArray[0];\n const idField = table[idInfo.fieldName as keyof typeof table] as AnyPgColumn;\n\n if (!idField) {\n throw new Error(`ID field '${idInfo.fieldName}' not found in table for collection '${collectionPath}'`);\n }\n\n const parsedIdObj = parseIdValues(entityId, idInfoArray);\n const parsedId = parsedIdObj[idInfo.fieldName];\n\n await this.db\n .delete(table)\n .where(eq(idField, parsedId));\n }\n\n /**\n * Save an entity (create or update)\n */\n async saveEntity<M extends Record<string, any>>(\n collectionPath: string,\n values: Partial<M>,\n entityId?: string | number,\n databaseId?: string\n ): Promise<Entity<M>> {\n // If saving under a nested relation path, resolve the parent and inject FK\n let effectiveCollectionPath = collectionPath;\n const effectiveValues: Partial<M> = { ...values };\n\n if (collectionPath.includes(\"/\")) {\n const segments = collectionPath.split(\"/\").filter(Boolean);\n if (segments.length >= 3 && segments.length % 2 === 1) {\n const rootSegment = segments[0];\n let currentCollection = getCollectionByPath(rootSegment, this.registry);\n let currentEntityId: string | number = segments[1];\n\n for (let i = 2; i < segments.length; i += 2) {\n const relationKey = segments[i];\n const resolvedRelations = resolveCollectionRelations(currentCollection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const relation = resolvedRelations[relationKey];\n\n if (!relation) {\n throw new Error(`Relation '${relationKey}' not found in collection '${currentCollection.slug}'`);\n }\n\n if (i === segments.length - 1) {\n const targetCollection = relation.target();\n effectiveCollectionPath = targetCollection.slug;\n\n // Handle many-to-many with junction table\n if (relation.cardinality === \"many\" && relation.through) {\n const parentIdInfoArray = getPrimaryKeys(currentCollection, this.registry);\n const parentIdInfo = parentIdInfoArray[0];\n const parsedParentIdObj = parseIdValues(currentEntityId, parentIdInfoArray);\n const parsedParentId = parsedParentIdObj[parentIdInfo.fieldName];\n\n (effectiveValues as Record<string, unknown>).__junction_table_info = {\n parentCollection: currentCollection,\n parentId: parsedParentId,\n relation: relation,\n relationKey: relationKey\n };\n break;\n }\n\n // Find the FK column that should store the parent ID\n let targetColumnName: string;\n\n if (relation.localKey) {\n targetColumnName = relation.localKey;\n } else if (relation.foreignKeyOnTarget) {\n targetColumnName = relation.foreignKeyOnTarget;\n } else if (relation.joinPath && relation.joinPath.length > 0) {\n const targetTableName = getTableName(targetCollection);\n const relevantJoinStep = relation.joinPath.find(joinStep => joinStep.table === targetTableName);\n\n if (relevantJoinStep) {\n const targetColumnNames = DrizzleConditionBuilder.getColumnNamesFromColumns(relevantJoinStep.on.to);\n targetColumnName = targetColumnNames[0];\n } else {\n console.warn(`Could not find specific join step for target table ${targetTableName} in relation '${relationKey}'.`);\n const targetColumnNames = DrizzleConditionBuilder.getColumnNamesFromColumns(relation.joinPath[0].on.to);\n targetColumnName = targetColumnNames[0];\n }\n } else {\n throw new Error(`Relation '${relationKey}' lacks configuration for path-based saving.`);\n }\n\n const parentIdInfoArray = getPrimaryKeys(currentCollection, this.registry);\n const parentIdInfo = parentIdInfoArray[0];\n const parsedParentIdObj = parseIdValues(currentEntityId, parentIdInfoArray);\n const parsedParentId = parsedParentIdObj[parentIdInfo.fieldName];\n\n const existingValue = (effectiveValues as Record<string, unknown>)[targetColumnName];\n if (existingValue !== undefined && existingValue !== null && existingValue !== parsedParentId) {\n console.warn(`Overriding provided value '${existingValue}' for FK '${targetColumnName}' with path parent id '${parsedParentId}'.`);\n }\n (effectiveValues as Record<string, unknown>)[targetColumnName] = parsedParentId;\n break;\n } else {\n const nextEntityId = segments[i + 1];\n currentCollection = relation.target();\n currentEntityId = nextEntityId;\n }\n }\n }\n }\n\n const collection = getCollectionByPath(effectiveCollectionPath, this.registry);\n const table = getTableForCollection(collection, this.registry);\n const idInfoArray = getPrimaryKeys(collection, this.registry);\n const primaryKeyFields = idInfoArray.map(info => info.fieldName);\n\n // Build an object mapping required for dynamic returning\n const returningKeys: Record<string, AnyPgColumn> = {};\n idInfoArray.forEach(info => {\n const field = table[info.fieldName as keyof typeof table] as AnyPgColumn;\n if (!field) throw new Error(`Primary key field '${info.fieldName}' not found in table for collection '${effectiveCollectionPath}'`);\n returningKeys[info.fieldName] = field;\n });\n\n // Separate relations that require special handling\n const relationValues: Record<string, unknown> = {};\n const otherValues: Partial<M> = { ...effectiveValues };\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n\n for (const key in resolvedRelations) {\n const relation = resolvedRelations[key];\n if (relation && relation.cardinality === \"many\") {\n if (Object.prototype.hasOwnProperty.call(otherValues, key)) {\n relationValues[key] = otherValues[key as keyof M];\n delete otherValues[key as keyof M];\n }\n }\n }\n\n // Transform relations to IDs, then sanitize\n const processedData = serializeDataToServer(otherValues as M, collection.properties as Properties, collection, this.registry);\n\n // Extract relation updates before sanitizing\n const inverseRelationUpdates = ((processedData as Record<string, unknown>).__inverseRelationUpdates as Array<{ relationKey: string; relation: Relation; newValue: unknown; currentEntityId?: string | number; }>) || [];\n const joinPathRelationUpdates = ((processedData as Record<string, unknown>).__joinPathRelationUpdates as Array<{ relationKey: string; relation: Relation; newTargetId: string | number | null; }>) || [];\n const junctionTableInfo = (processedData as Record<string, unknown>).__junction_table_info as { parentCollection: EntityCollection<any, any>; parentId: string | number; relation: Relation; relationKey: string; } | undefined;\n delete (processedData as Record<string, unknown>).__inverseRelationUpdates;\n delete (processedData as Record<string, unknown>).__joinPathRelationUpdates;\n delete (processedData as Record<string, unknown>).__junction_table_info;\n\n const entityData = sanitizeAndConvertDates(processedData);\n\n let savedId: string | number;\n try {\n savedId = await this.db.transaction(async (tx) => {\n let currentId: string | number;\n\n if (entityId) {\n // Update existing entity\n currentId = entityId; // `entityId` is already the formatted composite or singular string\n const idValues = parseIdValues(entityId, idInfoArray);\n\n // Apply joinPath one-to-one relation updates BEFORE the main UPDATE.\n // This ensures parentSourceCol reads the pre-update FK value, preventing\n // stale joinPath values from corrupting related entities when an\n // intermediate FK (e.g., author_id) changes in the same save.\n // Example: changing author A→B with stale profile P1 (A's):\n // reads old author_id=A → clears P1.author_id → re-sets P1.author_id=A (no-op).\n if (joinPathRelationUpdates.length > 0) {\n await this.relationService.updateJoinPathOneToOneRelations(tx, collection, currentId, joinPathRelationUpdates);\n }\n\n // Only issue an UPDATE if there are scalar columns to set.\n // When the payload contains only relation data, entityData is\n // empty after relation stripping and Drizzle throws \"No values to set\".\n const scalarKeys = Object.keys(entityData as Record<string, unknown>);\n if (scalarKeys.length > 0) {\n let updateQuery = tx.update(table).set(entityData as Record<string, unknown>);\n const conditions = [];\n for (const info of idInfoArray) {\n const field = table[info.fieldName as keyof typeof table] as AnyPgColumn;\n conditions.push(eq(field, idValues[info.fieldName]));\n }\n\n await updateQuery.where(and(...conditions));\n }\n } else {\n const dataForInsert = { ...(entityData as Record<string, unknown>) };\n\n // Strip empty primary keys so the database defaults (e.g. uuid_gen(), auto-increment) can trigger\n for (const info of idInfoArray) {\n if (dataForInsert[info.fieldName] === \"\" || dataForInsert[info.fieldName] === null || dataForInsert[info.fieldName] === undefined) {\n delete dataForInsert[info.fieldName];\n }\n }\n\n const result = await tx\n .insert(table)\n .values(dataForInsert)\n .returning(returningKeys);\n\n const resultRow = result[0];\n currentId = buildCompositeId(resultRow, idInfoArray);\n\n // For inserts, apply joinPath after since the parent row didn't exist before\n if (joinPathRelationUpdates.length > 0) {\n await this.relationService.updateJoinPathOneToOneRelations(tx, collection, currentId, joinPathRelationUpdates);\n }\n }\n\n // Handle inverse relation updates\n if (inverseRelationUpdates.length > 0) {\n await this.relationService.updateInverseRelations(tx, collection, currentId, inverseRelationUpdates);\n }\n\n // Update many-to-many relations\n if (Object.keys(relationValues).length > 0) {\n await this.relationService.updateRelationsUsingJoins(tx, collection, currentId, relationValues);\n }\n\n // Handle junction table creation for many-to-many path-based saves\n if (junctionTableInfo && !entityId) {\n await this.relationService.handleJunctionTableCreation(tx, currentId, junctionTableInfo);\n }\n\n return currentId;\n });\n } catch (error: unknown) {\n throw this.toUserFriendlyError(error, collection.slug);\n }\n\n // Fetch the updated/created entity to return with proper relation objects\n const finalEntity = await this.fetchService.fetchEntity<M>(collection.slug, savedId, databaseId);\n if (!finalEntity) throw new Error(\"Could not fetch entity after save.\");\n return finalEntity;\n }\n\n /**\n * Get the RelationService instance for external use\n */\n getRelationService(): RelationService {\n return this.relationService;\n }\n\n /**\n * Get the FetchService instance for external use\n */\n getFetchService(): EntityFetchService {\n return this.fetchService;\n }\n\n /**\n * Translate raw PostgreSQL / Drizzle errors into user-friendly messages.\n */\n private toUserFriendlyError(error: unknown, collectionSlug: string): Error {\n // Dig into Drizzle's wrapper to find the underlying PG error\n const pgError = this.extractPgError(error);\n\n if (pgError) {\n const detail = pgError.detail as string | undefined;\n const constraint = pgError.constraint as string | undefined;\n const column = pgError.column as string | undefined;\n const table = pgError.table as string | undefined;\n\n switch (pgError.code) {\n case \"23503\": // foreign_key_violation\n return new Error(\n detail\n ? `Foreign key constraint violated: ${detail}`\n : `Cannot save: a foreign key constraint${constraint ? ` (${constraint})` : \"\"} was violated in \"${collectionSlug}\".`\n );\n case \"23505\": // unique_violation\n return new Error(\n detail\n ? `Duplicate value: ${detail}`\n : `Cannot save: a unique constraint${constraint ? ` (${constraint})` : \"\"} was violated in \"${collectionSlug}\".`\n );\n case \"23502\": // not_null_violation\n return new Error(\n `Missing required field: \"${column ?? \"unknown\"}\" in \"${table ?? collectionSlug}\" cannot be empty.`\n );\n case \"23514\": // check_violation\n return new Error(\n `Validation failed: a check constraint${constraint ? ` (${constraint})` : \"\"} was violated in \"${collectionSlug}\".`\n );\n }\n }\n\n // Fall through: re-throw original\n if (error instanceof Error) return error;\n return new Error(String(error));\n }\n\n /**\n * Extract the underlying PostgreSQL error from a Drizzle wrapper.\n * Drizzle wraps PG errors in a `cause` property.\n */\n private extractPgError(error: unknown): (Error & { code?: string; detail?: unknown; constraint?: unknown; column?: unknown; table?: unknown }) | null {\n if (!error || typeof error !== \"object\") return null;\n\n const err = error as Error & { code?: string; cause?: unknown; detail?: unknown };\n\n // Check if the error itself has a PG error code\n if (err.code && /^[0-9]{5}$/.test(err.code)) {\n return err as Error & { code: string; detail?: unknown; constraint?: unknown; column?: unknown; table?: unknown };\n }\n\n // Check the cause chain (Drizzle wraps PG errors)\n if (err.cause && typeof err.cause === \"object\") {\n return this.extractPgError(err.cause);\n }\n\n return null;\n }\n}\n","// import { NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport { Entity, FilterValues } from \"@rebasepro/types\";\nimport { EntityFetchService } from \"./EntityFetchService\";\nimport { EntityPersistService } from \"./EntityPersistService\";\nimport { RelationService } from \"./RelationService\";\nimport { EntityRepository, FetchCollectionOptions, SearchOptions, CountOptions, DrizzleClient } from \"../interfaces\";\nimport { PostgresCollectionRegistry } from \"../collections/PostgresCollectionRegistry\";\n\n// Re-export data transformer functions for external use\nexport { sanitizeAndConvertDates, serializeDataToServer, parseDataFromServer } from \"../data-transformer\";\n\n// Re-export service classes for direct use\nexport { EntityFetchService } from \"./EntityFetchService\";\nexport { EntityPersistService } from \"./EntityPersistService\";\nexport { RelationService } from \"./RelationService\";\n\n// Re-export interfaces\nexport * from \"../interfaces\";\n\n/**\n * EntityService - Facade for entity operations.\n * \n * This class provides a unified API for entity CRUD operations by delegating\n * to specialized services:\n * - EntityFetchService: Read operations (fetch, search, count)\n * - EntityPersistService: Write operations (save, delete)\n * - RelationService: Relation operations (fetch related, update relations)\n * \n * Implements the EntityRepository interface for database abstraction.\n */\nexport class EntityService implements EntityRepository {\n private fetchService: EntityFetchService;\n private persistService: EntityPersistService;\n\n constructor(private db: DrizzleClient, private registry: PostgresCollectionRegistry) {\n this.fetchService = new EntityFetchService(db, registry);\n this.persistService = new EntityPersistService(db, registry);\n }\n\n // =============================================================\n // READ OPERATIONS - Delegated to EntityFetchService\n // =============================================================\n\n /**\n * Fetch a single entity by ID\n */\n async fetchEntity<M extends Record<string, any>>(\n collectionPath: string,\n entityId: string | number,\n databaseId?: string\n ): Promise<Entity<M> | undefined> {\n return this.fetchService.fetchEntity<M>(collectionPath, entityId, databaseId);\n }\n\n /**\n * Fetch a collection of entities with optional filtering, ordering, and pagination\n */\n async fetchCollection<M extends Record<string, any>>(\n collectionPath: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n startAfter?: Record<string, unknown>;\n searchString?: string;\n databaseId?: string;\n } = {}\n ): Promise<Entity<M>[]> {\n return this.fetchService.fetchCollection<M>(collectionPath, options);\n }\n\n /**\n * Search entities by text\n */\n async searchEntities<M extends Record<string, any>>(\n collectionPath: string,\n searchString: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n databaseId?: string;\n } = {}\n ): Promise<Entity<M>[]> {\n return this.fetchService.searchEntities<M>(collectionPath, searchString, options);\n }\n\n /**\n * Count entities in a collection\n */\n async countEntities<M extends Record<string, any>>(\n collectionPath: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n databaseId?: string;\n } = {}\n ): Promise<number> {\n return this.fetchService.countEntities<M>(collectionPath, options);\n }\n\n /**\n * Check if a field value is unique in a collection\n */\n async checkUniqueField(\n collectionPath: string,\n fieldName: string,\n value: unknown,\n excludeEntityId?: string,\n databaseId?: string\n ): Promise<boolean> {\n return this.fetchService.checkUniqueField(collectionPath, fieldName, value, excludeEntityId, databaseId);\n }\n\n /**\n * Fetch entities related to a parent entity\n */\n async fetchRelatedEntities<M extends Record<string, any>>(\n parentCollectionPath: string,\n parentEntityId: string | number,\n relationKey: string,\n options: {\n filter?: FilterValues<Extract<keyof M, string>>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n startAfter?: Record<string, unknown>;\n searchString?: string;\n databaseId?: string;\n } = {}\n ): Promise<Entity<M>[]> {\n return this.fetchService.getRelationService().fetchRelatedEntities<M>(\n parentCollectionPath,\n parentEntityId,\n relationKey,\n options\n );\n }\n\n // =============================================================\n // WRITE OPERATIONS - Delegated to EntityPersistService\n // =============================================================\n\n /**\n * Save an entity (create or update)\n */\n async saveEntity<M extends Record<string, any>>(\n collectionPath: string,\n values: Partial<M>,\n entityId?: string | number,\n databaseId?: string\n ): Promise<Entity<M>> {\n return this.persistService.saveEntity<M>(collectionPath, values, entityId, databaseId);\n }\n\n /**\n * Delete an entity by ID\n */\n async deleteEntity(\n collectionPath: string,\n entityId: string | number,\n databaseId?: string\n ): Promise<void> {\n return this.persistService.deleteEntity(collectionPath, entityId, databaseId);\n }\n\n\n /**\n * Execute raw SQL\n */\n async executeSql(sqlText: string): Promise<Record<string, unknown>[]> {\n if (process.env.NODE_ENV !== \"production\") {\n console.debug(\"Executing raw SQL:\", sqlText);\n }\n const { sql } = await import(\"drizzle-orm\");\n const result = await this.db.execute(sql.raw(sqlText));\n const rows = result.rows;\n if (process.env.NODE_ENV !== \"production\") {\n console.debug(`SQL executed successfully. Returned ${Array.isArray(rows) ? rows.length : 'non-array'} rows.`);\n }\n return rows as Record<string, unknown>[];\n }\n\n // =============================================================\n // SERVICE ACCESSORS\n // =============================================================\n\n /**\n * Get the underlying EntityFetchService for advanced use\n */\n getFetchService(): EntityFetchService {\n return this.fetchService;\n }\n\n /**\n * Get the underlying EntityPersistService for advanced use\n */\n getPersistService(): EntityPersistService {\n return this.persistService;\n }\n\n /**\n * Get the underlying RelationService for advanced use\n */\n getRelationService(): RelationService {\n return this.fetchService.getRelationService();\n }\n}\n","/**\n * BranchService\n *\n * Manages database branching by creating/deleting PostgreSQL databases\n * using `CREATE DATABASE ... TEMPLATE`. Branch metadata is stored in the\n * `rebase.branches` table in the default (main) database, following the\n * same `rebase` schema convention used by entity_history, auth, etc.\n */\n\nimport { sql } from \"drizzle-orm\";\nimport { BranchInfo } from \"@rebasepro/types\";\nimport { DrizzleClient } from \"../interfaces\";\nimport { DatabasePoolManager } from \"../databasePoolManager\";\n\n/** Internal prefix applied to branch database names to avoid collisions. */\nconst BRANCH_DB_PREFIX = \"rb_\";\n\n/** Fully-qualified metadata table in the rebase schema. */\nconst BRANCHES_TABLE = \"rebase.branches\";\n\n/**\n * Sanitize a user-provided branch name to a safe PostgreSQL identifier.\n * Only allows alphanumeric characters and underscores.\n */\nfunction sanitizeBranchName(name: string): string {\n return name.replace(/[^a-zA-Z0-9_]/g, \"\");\n}\n\n/**\n * Convert a user-facing branch name to the actual PostgreSQL database name.\n */\nfunction toBranchDbName(name: string): string {\n const sanitized = sanitizeBranchName(name);\n if (!sanitized) throw new Error(\"Branch name must contain at least one alphanumeric character.\");\n return `${BRANCH_DB_PREFIX}${sanitized}`;\n}\n\nexport class BranchService {\n constructor(\n private db: DrizzleClient,\n private poolManager: DatabasePoolManager\n ) {}\n\n /**\n * Ensure the `rebase.branches` metadata table exists in the default database.\n * Idempotent — safe to call on every startup.\n */\n async ensureBranchMetadataTable(): Promise<void> {\n // Create the rebase schema (idempotent — may already exist from auth/history init)\n await this.db.execute(sql`CREATE SCHEMA IF NOT EXISTS rebase`);\n\n await this.db.execute(sql.raw(`\n CREATE TABLE IF NOT EXISTS ${BRANCHES_TABLE} (\n name TEXT PRIMARY KEY,\n db_name TEXT NOT NULL UNIQUE,\n parent_db TEXT NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n metadata JSONB DEFAULT '{}'\n );\n `));\n }\n\n /**\n * Create a new branch database by templating the source database.\n *\n * Uses `CREATE DATABASE ... TEMPLATE` for an instant, full-fidelity copy\n * of both schema and data.\n *\n * @param name User-facing branch name (e.g., \"feature_auth\")\n * @param options.source Source database to clone; defaults to the main database.\n */\n async createBranch(name: string, options?: { source?: string }): Promise<BranchInfo> {\n const dbName = toBranchDbName(name);\n const sanitizedName = sanitizeBranchName(name);\n const sourceDb = options?.source || this.poolManager.defaultDatabaseName;\n\n // Check if branch already exists\n const existing = await this.db.execute(\n sql`SELECT name FROM rebase.branches WHERE name = ${sanitizedName} OR db_name = ${dbName}`\n );\n if ((existing.rows as unknown[]).length > 0) {\n throw new Error(`Branch \"${sanitizedName}\" already exists.`);\n }\n\n // Disconnect any idle pools to the source DB so TEMPLATE works.\n // CREATE DATABASE ... TEMPLATE requires no other connections to the template.\n await this.poolManager.disconnectDatabase(sourceDb);\n\n // Create the database using the source as a template.\n // Note: Identifiers must be double-quoted, not parameterized.\n const safeDbName = dbName.replace(/\"/g, '\"\"');\n const safeSourceDb = sourceDb.replace(/\"/g, '\"\"');\n try {\n await this.db.execute(\n sql.raw(`CREATE DATABASE \"${safeDbName}\" TEMPLATE \"${safeSourceDb}\"`)\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes(\"already exists\")) {\n throw new Error(`Database \"${dbName}\" already exists on the server. Choose a different branch name.`);\n }\n // If template fails due to active connections, provide a helpful error\n if (msg.includes(\"being accessed by other users\")) {\n throw new Error(\n `Cannot create branch: the source database \"${sourceDb}\" has active connections. ` +\n `Close other clients or connections and try again.`\n );\n }\n throw err;\n }\n\n // Record metadata in the default database\n const now = new Date();\n await this.db.execute(\n sql`INSERT INTO rebase.branches (name, db_name, parent_db, created_at) \n VALUES (${sanitizedName}, ${dbName}, ${sourceDb}, ${now.toISOString()})`\n );\n\n return {\n name: sanitizedName,\n parentDatabase: sourceDb,\n createdAt: now,\n };\n }\n\n /**\n * Delete a branch database and remove its metadata.\n * Cannot delete the main/default database.\n */\n async deleteBranch(name: string): Promise<void> {\n const sanitizedName = sanitizeBranchName(name);\n const dbName = toBranchDbName(name);\n\n // Safety: never delete the default database\n if (dbName === this.poolManager.defaultDatabaseName) {\n throw new Error(\"Cannot delete the main database.\");\n }\n\n // Verify the branch exists in our metadata\n const existing = await this.db.execute(\n sql`SELECT db_name FROM rebase.branches WHERE name = ${sanitizedName}`\n );\n if ((existing.rows as unknown[]).length === 0) {\n throw new Error(`Branch \"${sanitizedName}\" not found.`);\n }\n\n // Disconnect any pools to this branch before dropping\n await this.poolManager.disconnectDatabase(dbName);\n\n // Drop the database\n const safeDbName = dbName.replace(/\"/g, '\"\"');\n try {\n await this.db.execute(sql.raw(`DROP DATABASE \"${safeDbName}\"`));\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes(\"being accessed by other users\")) {\n throw new Error(\n `Cannot delete branch \"${sanitizedName}\": the database has active connections. ` +\n `Close other clients and try again.`\n );\n }\n throw err;\n }\n\n // Remove metadata\n await this.db.execute(\n sql`DELETE FROM rebase.branches WHERE name = ${sanitizedName}`\n );\n }\n\n /**\n * List all branches recorded in the metadata table.\n * Optionally fetches database sizes from pg_database.\n */\n async listBranches(): Promise<BranchInfo[]> {\n const result = await this.db.execute(sql.raw(`\n SELECT \n b.name,\n b.parent_db,\n b.created_at,\n pg_database_size(b.db_name) as size_bytes\n FROM ${BRANCHES_TABLE} b\n JOIN pg_database d ON d.datname = b.db_name\n ORDER BY b.created_at DESC\n `));\n\n return (result.rows as Record<string, unknown>[]).map((row) => ({\n name: row.name as string,\n parentDatabase: row.parent_db as string,\n createdAt: new Date(row.created_at as string),\n sizeBytes: row.size_bytes != null ? Number(row.size_bytes) : undefined,\n }));\n }\n\n /**\n * Get info about a specific branch.\n */\n async getBranchInfo(name: string): Promise<BranchInfo | undefined> {\n const sanitizedName = sanitizeBranchName(name);\n\n const result = await this.db.execute(sql`\n SELECT \n b.name,\n b.parent_db,\n b.created_at\n FROM rebase.branches b\n WHERE b.name = ${sanitizedName}\n `);\n\n const rows = result.rows as Record<string, unknown>[];\n if (rows.length === 0) return undefined;\n\n const row = rows[0];\n\n // Attempt to get size — may fail if the DB was externally dropped\n let sizeBytes: number | undefined;\n try {\n const dbName = toBranchDbName(sanitizedName);\n const sizeResult = await this.db.execute(\n sql`SELECT pg_database_size(${dbName}) as size_bytes`\n );\n const sizeRows = sizeResult.rows as Record<string, unknown>[];\n if (sizeRows.length > 0 && sizeRows[0].size_bytes != null) {\n sizeBytes = Number(sizeRows[0].size_bytes);\n }\n } catch {\n // Database might not exist anymore\n }\n\n return {\n name: row.name as string,\n parentDatabase: row.parent_db as string,\n createdAt: new Date(row.created_at as string),\n sizeBytes,\n };\n }\n}\n","// import { NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport { EntityService } from \"./services/entityService\";\nimport { BranchService } from \"./services/BranchService\";\nimport { RealtimeService } from \"./services/realtimeService\";\nimport { DatabasePoolManager } from \"./databasePoolManager\";\nimport { DrizzleClient } from \"./interfaces\";\nimport { User } from \"@rebasepro/types\";\nimport { sql as drizzleSql } from \"drizzle-orm\";\nimport { buildPropertyCallbacks } from \"@rebasepro/common\";\nimport { PostgresCollectionRegistry } from \"./collections/PostgresCollectionRegistry\";\nimport {\n DataDriver,\n DeleteEntityProps,\n Entity,\n EntityCollection,\n FetchCollectionProps,\n FetchEntityProps,\n ListenCollectionProps,\n ListenEntityProps,\n RebaseCallContext,\n SaveEntityProps,\n RebaseData,\n TableMetadata,\n TableColumnInfo,\n TableForeignKeyInfo,\n TableJunctionInfo,\n TablePolicyInfo,\n SQLAdmin,\n SchemaAdmin,\n DatabaseAdmin\n} from \"@rebasepro/types\";\nimport { buildRebaseData } from \"@rebasepro/common\";\n// @ts-ignore\nimport { HistoryService } from \"./history/HistoryService\";\nimport { mergeDeep } from \"@rebasepro/utils\";\n\nexport class PostgresBackendDriver implements DataDriver {\n key = \"postgres\";\n initialised = true;\n\n public entityService: EntityService;\n public realtimeService: RealtimeService;\n public historyService?: HistoryService;\n public branchService?: BranchService;\n public user?: User;\n public data: RebaseData;\n\n /**\n * When true, realtime notifications are deferred until after the\n * wrapping transaction commits. Set by `withAuth` → `withTransaction`.\n */\n _deferNotifications = false;\n _pendingNotifications: Array<{\n path: string;\n entityId: string;\n entity: Entity | null;\n databaseId?: string;\n }> = [];\n\n constructor(\n public db: DrizzleClient,\n realtimeService: RealtimeService,\n public readonly registry: PostgresCollectionRegistry,\n user?: User,\n public poolManager?: DatabasePoolManager,\n historyService?: HistoryService\n ) {\n this.entityService = new EntityService(db, registry);\n this.realtimeService = realtimeService;\n this.historyService = historyService;\n this.user = user;\n this.data = buildRebaseData(this);\n\n // Initialize BranchService when adminConnectionString is configured\n if (poolManager) {\n this.branchService = new BranchService(db, poolManager);\n }\n\n // Expose SQL + schema + branch admin capabilities via the typed `admin` property.\n // The individual methods on `this` are kept for backwards compatibility.\n this.admin = {\n executeSql: this.executeSql.bind(this),\n fetchAvailableDatabases: this.fetchAvailableDatabases.bind(this),\n fetchAvailableRoles: this.fetchAvailableRoles.bind(this),\n fetchCurrentDatabase: this.fetchCurrentDatabase.bind(this),\n fetchUnmappedTables: this.fetchUnmappedTables.bind(this),\n fetchTableMetadata: this.fetchTableMetadata.bind(this),\n // Branch operations (only available when poolManager is configured)\n ...(this.branchService ? {\n createBranch: this.branchService.createBranch.bind(this.branchService),\n deleteBranch: this.branchService.deleteBranch.bind(this.branchService),\n listBranches: this.branchService.listBranches.bind(this.branchService),\n getBranchInfo: this.branchService.getBranchInfo.bind(this.branchService),\n } : {}),\n };\n }\n\n /**\n * Typed admin capabilities (SQLAdmin + SchemaAdmin + BranchAdmin).\n */\n admin: DatabaseAdmin;\n\n\n\n private resolveCollectionCallbacks<M extends Record<string, any>>(collection: EntityCollection<M> | undefined, path: string) {\n if (!collection && !path) return { collection: undefined, callbacks: undefined, propertyCallbacks: undefined };\n const registryCollection = this.registry.getCollectionByPath(path);\n const resolvedCollection = registryCollection\n ? { ...collection, ...registryCollection } as EntityCollection<M>\n : collection as EntityCollection<M>;\n\n const callbacks = resolvedCollection?.callbacks;\n const properties = resolvedCollection?.properties;\n let propertyCallbacks;\n if (properties) {\n propertyCallbacks = buildPropertyCallbacks(properties);\n }\n return {\n collection: resolvedCollection,\n callbacks,\n propertyCallbacks\n };\n }\n\n async fetchCollection<M extends Record<string, any>>({\n path,\n collection,\n filter,\n limit,\n startAfter,\n orderBy,\n searchString,\n order\n }: FetchCollectionProps<M>): Promise<Entity<M>[]> {\n\n const entities = await this.entityService.fetchCollection<M>(path, {\n filter,\n orderBy,\n order,\n limit,\n startAfter: startAfter as Record<string, unknown> | undefined,\n databaseId: collection?.databaseId,\n searchString\n });\n\n const { collection: resolvedCollection, callbacks, propertyCallbacks } = this.resolveCollectionCallbacks(collection, path);\n\n if (callbacks?.afterRead || propertyCallbacks?.afterRead) {\n const contextForCallback = {\n user: this.user,\n driver: this,\n data: this.data\n } as unknown as RebaseCallContext; // Backend context\n return Promise.all(entities.map(async (entity) => {\n let fetched = entity;\n if (callbacks?.afterRead) {\n fetched = await callbacks.afterRead({\n collection: resolvedCollection as EntityCollection<M>,\n path,\n entity: fetched,\n context: contextForCallback\n }) ?? fetched;\n }\n if (propertyCallbacks?.afterRead) {\n fetched = await propertyCallbacks.afterRead({\n collection: resolvedCollection as EntityCollection<M>,\n path,\n entity: fetched,\n context: contextForCallback\n }) ?? fetched;\n }\n return fetched;\n }));\n }\n\n return entities;\n }\n\n listenCollection<M extends Record<string, any>>({\n path,\n collection,\n filter,\n limit,\n startAfter,\n orderBy,\n searchString,\n order,\n onUpdate,\n onError\n }: ListenCollectionProps<M>): () => void {\n\n const subscriptionId = this.generateSubscriptionId();\n\n // Type-adapter wrapper: RealtimeService expects a union callback signature\n const callbackWrapper = (entities: Entity<M>[]) => {\n onUpdate(entities);\n };\n\n // Store the subscription in RealtimeService properly using the new public method\n this.realtimeService.registerDataDriverSubscription(subscriptionId, {\n clientId: \"driver\",\n type: \"collection\" as const,\n path,\n collectionRequest: {\n filter,\n orderBy,\n order,\n limit,\n startAfter: startAfter as Record<string, unknown> | undefined,\n databaseId: collection?.databaseId,\n searchString\n }\n });\n\n // Store the callback for this subscription\n this.realtimeService.addSubscriptionCallback(subscriptionId, callbackWrapper as (data: Entity | Entity[] | null) => void);\n\n // Send initial data immediately\n this.fetchCollection({\n path: path,\n collection,\n filter,\n limit,\n startAfter,\n orderBy,\n searchString,\n order\n }).then(entities => {\n callbackWrapper(entities);\n }).catch(error => {\n if (onError) onError(error);\n });\n\n return () => {\n this.realtimeService.removeSubscriptionCallback(subscriptionId);\n this.realtimeService.subscriptions.delete(subscriptionId);\n };\n }\n\n async fetchEntity<M extends Record<string, any>>({\n path,\n entityId,\n databaseId,\n collection\n }: FetchEntityProps<M>): Promise<Entity<M> | undefined> {\n let entity = await this.entityService.fetchEntity<M>(\n path,\n entityId,\n databaseId || collection?.databaseId\n );\n\n const { collection: resolvedCollection, callbacks, propertyCallbacks } = this.resolveCollectionCallbacks(collection, path);\n\n if (entity && (callbacks?.afterRead || propertyCallbacks?.afterRead)) {\n const contextForCallback = {\n user: this.user,\n driver: this,\n data: this.data\n } as unknown as RebaseCallContext; // Backend context\n if (callbacks?.afterRead) {\n entity = await callbacks.afterRead({\n collection: resolvedCollection as EntityCollection<M>,\n path,\n entity,\n context: contextForCallback\n }) ?? entity;\n }\n if (propertyCallbacks?.afterRead) {\n entity = await propertyCallbacks.afterRead({\n collection: resolvedCollection as EntityCollection<M>,\n path,\n entity,\n context: contextForCallback\n }) ?? entity;\n }\n }\n\n return entity;\n }\n\n listenEntity<M extends Record<string, any>>({\n path,\n entityId,\n collection,\n onUpdate,\n onError\n }: ListenEntityProps<M>): () => void {\n\n const subscriptionId = this.generateSubscriptionId();\n const callbackWrapper = (entity: Entity<M> | null) => {\n if (entity)\n onUpdate(entity);\n };\n\n // Register the subscription with the RealtimeService\n this.realtimeService.registerDataDriverSubscription(subscriptionId, {\n clientId: \"driver\",\n type: \"entity\" as const,\n path,\n entityId\n });\n\n // Store the callback for this subscription\n this.realtimeService.addSubscriptionCallback(subscriptionId, callbackWrapper as (data: Entity | Entity[] | null) => void);\n\n // Fetch initial data\n this.fetchEntity({\n path,\n entityId,\n collection\n })\n .then(entity => {\n if (entity) onUpdate(entity);\n })\n .catch(error => {\n if (onError) onError(error as Error);\n });\n\n // Return the unsubscribe function\n return () => {\n this.realtimeService.removeSubscriptionCallback(subscriptionId);\n this.realtimeService.subscriptions.delete(subscriptionId);\n };\n }\n\n async saveEntity<M extends Record<string, any>>({\n path,\n entityId,\n values,\n collection,\n status\n }: SaveEntityProps<M>): Promise<Entity<M>> {\n\n const { collection: resolvedCollection, callbacks, propertyCallbacks } = this.resolveCollectionCallbacks(collection, path);\n\n let updatedValues = values;\n const contextForCallback = {\n user: this.user,\n driver: this,\n data: this.data\n } as unknown as RebaseCallContext;\n\n // Fetch previous values for callbacks AND history recording\n let previousValuesForHistory: Partial<Entity<M>[\"values\"]> | undefined;\n if (status === \"existing\" && entityId) {\n const existing = await this.entityService.fetchEntity<M>(path, entityId, resolvedCollection?.databaseId);\n if (existing) {\n previousValuesForHistory = existing.values as Partial<Entity<M>[\"values\"]>;\n }\n }\n\n if (callbacks?.beforeSave || propertyCallbacks?.beforeSave) {\n if (callbacks?.beforeSave) {\n const result = await callbacks.beforeSave({\n collection: resolvedCollection as EntityCollection<M>,\n path,\n entityId,\n values: updatedValues,\n previousValues: previousValuesForHistory,\n status,\n context: contextForCallback\n });\n if (result) updatedValues = mergeDeep(updatedValues, result);\n }\n\n if (propertyCallbacks?.beforeSave) {\n const result = await propertyCallbacks.beforeSave({\n collection: resolvedCollection as EntityCollection<M>,\n path,\n entityId,\n values: updatedValues,\n previousValues: previousValuesForHistory,\n status,\n context: contextForCallback\n });\n if (result) updatedValues = mergeDeep(updatedValues, result);\n }\n\n }\n\n try {\n let savedEntity = await this.entityService.saveEntity<M>(\n path,\n updatedValues,\n entityId,\n resolvedCollection?.databaseId\n );\n\n if (savedEntity && (callbacks?.afterRead || propertyCallbacks?.afterRead)) {\n if (callbacks?.afterRead) {\n savedEntity = await callbacks.afterRead({\n collection: resolvedCollection as EntityCollection<M>,\n path,\n entity: savedEntity,\n context: contextForCallback\n }) ?? savedEntity;\n }\n if (propertyCallbacks?.afterRead) {\n savedEntity = await propertyCallbacks.afterRead({\n collection: resolvedCollection as EntityCollection<M>,\n path,\n entity: savedEntity,\n context: contextForCallback\n }) ?? savedEntity;\n }\n }\n\n if (callbacks?.afterSave || propertyCallbacks?.afterSave) {\n if (callbacks?.afterSave) {\n await callbacks.afterSave({\n collection: resolvedCollection as EntityCollection<M>,\n path,\n entityId: savedEntity.id,\n values: updatedValues,\n previousValues: previousValuesForHistory,\n status,\n context: contextForCallback\n });\n }\n if (propertyCallbacks?.afterSave) {\n await propertyCallbacks.afterSave({\n collection: resolvedCollection as EntityCollection<M>,\n path,\n entityId: savedEntity.id,\n values: updatedValues,\n previousValues: previousValuesForHistory,\n status,\n context: contextForCallback\n });\n }\n }\n\n // Record entity history (fire-and-forget, never blocks the save)\n if (this.historyService && resolvedCollection?.history) {\n this.historyService.recordHistory({\n tableName: path,\n entityId: savedEntity.id.toString(),\n action: status === \"new\" ? \"create\" : \"update\",\n values: savedEntity.values as Record<string, unknown>,\n previousValues: previousValuesForHistory as Record<string, unknown> | undefined,\n updatedBy: this.user?.uid\n });\n }\n\n // Notify real-time subscribers (deferred if inside a transaction)\n if (this._deferNotifications) {\n this._pendingNotifications.push({\n path,\n entityId: savedEntity.id.toString(),\n entity: savedEntity,\n databaseId: resolvedCollection?.databaseId\n });\n } else {\n await this.realtimeService.notifyEntityUpdate(\n path,\n savedEntity.id.toString(),\n savedEntity,\n resolvedCollection?.databaseId\n );\n }\n\n return savedEntity;\n } catch (error) {\n if (callbacks?.afterSaveError || propertyCallbacks?.afterSaveError) {\n if (callbacks?.afterSaveError) {\n await callbacks.afterSaveError({\n collection: resolvedCollection as EntityCollection<M>,\n path,\n entityId: entityId || \"unknown\",\n values: updatedValues,\n previousValues: undefined,\n status,\n context: contextForCallback\n });\n }\n if (propertyCallbacks?.afterSaveError) {\n await propertyCallbacks.afterSaveError({\n collection: resolvedCollection as EntityCollection<M>,\n path,\n entityId: entityId || \"unknown\",\n values: updatedValues,\n previousValues: undefined,\n status,\n context: contextForCallback\n });\n }\n }\n throw error;\n }\n }\n\n async deleteEntity<M extends Record<string, any>>({\n entity,\n collection\n }: DeleteEntityProps<M>): Promise<void> {\n\n // Resolve from backend registry to restore callbacks lost during WebSocket serialization\n const { collection: resolvedCollection, callbacks, propertyCallbacks } = this.resolveCollectionCallbacks(collection, entity.path);\n\n const contextForCallback = {\n user: this.user,\n driver: this,\n data: this.data\n } as unknown as RebaseCallContext;\n\n if (callbacks?.beforeDelete || propertyCallbacks?.beforeDelete) {\n if (callbacks?.beforeDelete) {\n await callbacks.beforeDelete({\n collection: resolvedCollection as EntityCollection<M>,\n path: entity.path,\n entityId: entity.id,\n entity,\n context: contextForCallback\n });\n }\n if (propertyCallbacks?.beforeDelete) {\n await propertyCallbacks.beforeDelete({\n collection: resolvedCollection as EntityCollection<M>,\n path: entity.path,\n entityId: entity.id,\n entity,\n context: contextForCallback\n });\n }\n }\n\n await this.entityService.deleteEntity(\n entity.path,\n entity.id,\n entity.databaseId || resolvedCollection?.databaseId\n );\n\n if (callbacks?.afterDelete || propertyCallbacks?.afterDelete) {\n if (callbacks?.afterDelete) {\n await callbacks.afterDelete({\n collection: resolvedCollection as EntityCollection<M>,\n path: entity.path,\n entityId: entity.id,\n entity,\n context: contextForCallback\n });\n }\n if (propertyCallbacks?.afterDelete) {\n await propertyCallbacks.afterDelete({\n collection: resolvedCollection as EntityCollection<M>,\n path: entity.path,\n entityId: entity.id,\n entity,\n context: contextForCallback\n });\n }\n }\n\n // Record delete history (fire-and-forget)\n if (this.historyService && resolvedCollection?.history) {\n this.historyService.recordHistory({\n tableName: entity.path,\n entityId: entity.id.toString(),\n action: \"delete\",\n values: entity.values as Record<string, unknown>,\n updatedBy: this.user?.uid\n });\n }\n\n // Notify real-time subscribers (deferred if inside a transaction)\n if (this._deferNotifications) {\n this._pendingNotifications.push({\n path: entity.path,\n entityId: entity.id.toString(),\n entity: null,\n databaseId: entity.databaseId || resolvedCollection?.databaseId\n });\n } else {\n await this.realtimeService.notifyEntityUpdate(\n entity.path,\n entity.id.toString(),\n null,\n entity.databaseId || resolvedCollection?.databaseId\n );\n }\n\n }\n\n async checkUniqueField(\n path: string,\n name: string,\n value: unknown,\n entityId?: string,\n collection?: EntityCollection\n ): Promise<boolean> {\n return this.entityService.checkUniqueField(\n path,\n name,\n value,\n entityId,\n collection?.databaseId\n );\n }\n\n\n async countEntities<M extends Record<string, any>>({\n path,\n collection,\n filter\n }: FetchCollectionProps<M>): Promise<number> {\n return this.entityService.countEntities(\n path,\n { filter }\n );\n }\n\n private getTargetDb(databaseName?: string): DrizzleClient {\n if (!databaseName || databaseName === this.poolManager?.defaultDatabaseName) {\n return this.db;\n }\n if (!this.poolManager) {\n throw new Error(\n \"Cross-database execution requires adminConnectionString to be configured in the backend.\"\n );\n }\n return this.poolManager.getDrizzle(databaseName);\n }\n\n async executeSql(sqlText: string, options?: { database?: string, role?: string }): Promise<Record<string, unknown>[]> {\n if (!options?.database && !options?.role) {\n return this.entityService.executeSql(sqlText);\n }\n\n const targetDb = this.getTargetDb(options?.database);\n\n try {\n if (options?.role) {\n const safeRole = options.role.replace(/\"/g, '\"\"');\n return await targetDb.transaction(async (tx) => {\n await tx.execute(drizzleSql.raw(`SET LOCAL ROLE \"${safeRole}\"`));\n const result = await tx.execute(drizzleSql.raw(sqlText));\n return result.rows as Record<string, unknown>[];\n });\n }\n\n const result = await targetDb.execute(drizzleSql.raw(sqlText));\n return result.rows as Record<string, unknown>[];\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n // Provide a user-friendly message for connection/auth errors\n if (msg.includes(\"pg_hba.conf\") || msg.includes(\"no encryption\") || msg.includes(\"connection refused\")) {\n const dbName = options?.database || \"unknown\";\n throw new Error(`Cannot connect to database \"${dbName}\": the server rejected the connection. This database may require SSL or is not accessible from this host.`);\n }\n throw error;\n }\n }\n\n async fetchAvailableDatabases(): Promise<string[]> {\n // Exclude template databases, Cloud SQL internal databases, and the default 'postgres' system db\n const result = await this.executeSql(\n `SELECT datname FROM pg_database \n WHERE datistemplate = false \n AND datname NOT IN ('postgres', 'cloudsqladmin', '_cloudsqladmin')\n ORDER BY datname;`\n );\n const databases = result.map((r: Record<string, unknown>) => r.datname as string);\n // Ensure the current connected database is always first in the list\n const currentDb = this.poolManager?.defaultDatabaseName;\n if (currentDb && !databases.includes(currentDb)) {\n databases.unshift(currentDb);\n } else if (currentDb) {\n // Move it to the front\n const idx = databases.indexOf(currentDb);\n if (idx > 0) {\n databases.splice(idx, 1);\n databases.unshift(currentDb);\n }\n }\n return databases;\n }\n\n async fetchAvailableRoles(): Promise<string[]> {\n const result = await this.executeSql(`SELECT rolname FROM pg_roles;`);\n return result.map((r: Record<string, unknown>) => r.rolname as string);\n }\n\n async fetchCurrentDatabase(): Promise<string | undefined> {\n return this.poolManager?.defaultDatabaseName;\n }\n\n /**\n * Fetch public tables that are not yet mapped to a collection.\n * Excludes internal tables (_rebase_*, _auth_*, auth tables, etc.)\n * and junction/connection tables used for many-to-many relations.\n */\n async fetchUnmappedTables(mappedPaths?: string[]): Promise<string[]> {\n const result = await this.executeSql(`\n SELECT table_name\n FROM information_schema.tables\n WHERE table_schema = 'public'\n AND table_type = 'BASE TABLE'\n ORDER BY table_name;\n `);\n\n const internalPrefixes = [\"_rebase_\", \"_auth_\"];\n const internalExact = [\n \"users\", \"roles\", \"user_roles\", \"refresh_tokens\",\n \"password_reset_tokens\", \"email_verification_tokens\"\n ];\n\n const allTables = result\n .map((r: Record<string, unknown>) => r.table_name as string)\n .filter((name: string) => {\n if (internalPrefixes.some(prefix => name.startsWith(prefix))) return false;\n if (internalExact.includes(name)) return false;\n return true;\n });\n\n // Detect junction tables: tables where every column is part of a foreign key.\n // These are typically many-to-many connection tables and shouldn't be suggested.\n let junctionTables = new Set<string>();\n try {\n const junctionResult = await this.executeSql(`\n SELECT t.table_name\n FROM information_schema.tables t\n WHERE t.table_schema = 'public'\n AND t.table_type = 'BASE TABLE'\n AND NOT EXISTS (\n -- Find columns that are NOT part of any foreign key\n SELECT 1\n FROM information_schema.columns c\n WHERE c.table_schema = t.table_schema\n AND c.table_name = t.table_name\n AND c.column_name NOT IN (\n SELECT kcu.column_name\n FROM information_schema.key_column_usage kcu\n JOIN information_schema.table_constraints tc\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n WHERE tc.constraint_type = 'FOREIGN KEY'\n AND kcu.table_schema = t.table_schema\n AND kcu.table_name = t.table_name\n )\n );\n `);\n junctionTables = new Set(junctionResult.map((r: Record<string, unknown>) => r.table_name as string));\n } catch (e) {\n console.warn(\"Could not detect junction tables:\", e);\n }\n\n const filteredTables = allTables.filter(name => !junctionTables.has(name));\n\n if (!mappedPaths || mappedPaths.length === 0) return filteredTables;\n\n const mappedSet = new Set(mappedPaths.map(p => p.toLowerCase()));\n return filteredTables.filter((name: string) => !mappedSet.has(name.toLowerCase()));\n }\n\n \n /**\n * Fetch metadata for a given table from information_schema (columns, policies, constraints).\n */\n async fetchTableMetadata(tableName: string): Promise<TableMetadata> {\n // Sanitize table name as defense-in-depth (parameterized below)\n const safeName = tableName.replace(/[^a-zA-Z0-9_]/g, \"\");\n\n // 1. Fetch Columns\n const result = await this.db.execute(drizzleSql`\n SELECT column_name, data_type, udt_name, is_nullable, column_default, character_maximum_length\n FROM information_schema.columns\n WHERE table_schema = 'public'\n AND table_name = ${safeName}\n ORDER BY ordinal_position\n `);\n const columns = result.rows as Record<string, unknown>[];\n\n // Also fetch enum values for any USER-DEFINED columns\n const enumColumns = columns.filter((c) => c.data_type === \"USER-DEFINED\");\n if (enumColumns.length > 0) {\n for (const col of enumColumns) {\n try {\n const enumResult = await this.db.execute(drizzleSql`\n SELECT e.enumlabel\n FROM pg_type t\n JOIN pg_enum e ON t.oid = e.enumtypid\n WHERE t.typname = ${col.udt_name as string}\n ORDER BY e.enumsortorder\n `);\n col.enum_values = (enumResult.rows as Record<string, unknown>[]).map(e => e.enumlabel);\n } catch {\n col.enum_values = [];\n }\n }\n }\n const typedColumns = columns as unknown as TableColumnInfo[];\n\n // 2. Fetch Foreign Keys\n const fkResult = await this.db.execute(drizzleSql`\n SELECT\n kcu.column_name as column_name,\n ccu.table_name AS foreign_table_name,\n ccu.column_name AS foreign_column_name\n FROM \n information_schema.table_constraints AS tc \n JOIN information_schema.key_column_usage AS kcu\n ON tc.constraint_name = kcu.constraint_name\n AND tc.table_schema = kcu.table_schema\n JOIN information_schema.constraint_column_usage AS ccu\n ON ccu.constraint_name = tc.constraint_name\n AND ccu.table_schema = tc.table_schema\n WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_name = ${safeName};\n `);\n const foreignKeys = fkResult.rows as unknown as TableForeignKeyInfo[];\n\n // 3. Fetch Junction Tables (Many-to-Many)\n // A simple junction table is one that has foreign keys to our table and other tables\n const junctionsResult = await this.db.execute(drizzleSql`\n SELECT \n tc1.table_name as junction_table_name,\n kcu1.column_name as source_column_name,\n ccu2.table_name as target_table_name,\n kcu2.column_name as target_column_name\n FROM information_schema.table_constraints tc1\n JOIN information_schema.key_column_usage kcu1 ON tc1.constraint_name = kcu1.constraint_name\n JOIN information_schema.constraint_column_usage ccu1 ON ccu1.constraint_name = tc1.constraint_name\n JOIN information_schema.table_constraints tc2 ON tc1.table_name = tc2.table_name AND tc2.constraint_type = 'FOREIGN KEY'\n JOIN information_schema.key_column_usage kcu2 ON tc2.constraint_name = kcu2.constraint_name\n JOIN information_schema.constraint_column_usage ccu2 ON ccu2.constraint_name = tc2.constraint_name\n WHERE tc1.constraint_type = 'FOREIGN KEY' \n AND ccu1.table_name = ${safeName}\n AND ccu2.table_name != ${safeName};\n `);\n const junctions = junctionsResult.rows as unknown as TableJunctionInfo[];\n\n // 4. Fetch RLS Policies\n const policiesResult = await this.db.execute(drizzleSql`\n SELECT \n polname as policy_name, \n polcmd as cmd, \n polroles::regrole[]::text[] as roles, \n pg_get_expr(polqual, polrelid) as qual, \n pg_get_expr(polwithcheck, polrelid) as with_check\n FROM pg_policy\n WHERE polrelid = (SELECT oid FROM pg_class WHERE relname = ${safeName} AND relnamespace = 'public'::regnamespace);\n `);\n const policies = policiesResult.rows as unknown as TablePolicyInfo[];\n\n return {\n columns: typedColumns,\n foreignKeys,\n junctions,\n policies\n };\n }\n\n private generateSubscriptionId(): string {\n return `sub_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n }\n\n /**\n * Create a new delegate instance with authenticated context.\n * Starts a transaction and sets the current_user_id and current_user_roles\n * configuration parameters for PostgreSQL Row Level Security.\n */\n async withAuth(user: User): Promise<DataDriver> {\n return new AuthenticatedPostgresBackendDriver(this, user);\n }\n}\n\nexport class AuthenticatedPostgresBackendDriver implements DataDriver {\n key = \"postgres\";\n initialised = true;\n\n public user: User;\n public data: RebaseData;\n\n constructor(\n public delegate: PostgresBackendDriver,\n user: User\n ) {\n this.user = user;\n this.data = buildRebaseData(this);\n\n // Delegate admin ops to the base driver (no RLS wrapping for admin)\n this.admin = delegate.admin;\n }\n\n /**\n * Typed admin capabilities — delegates to the base driver.\n */\n admin: DatabaseAdmin;\n\n private async withTransaction<T>(\n operation: (delegate: PostgresBackendDriver) => Promise<T>\n ): Promise<T> {\n const pendingNotifications: PostgresBackendDriver[\"_pendingNotifications\"] = [];\n \n const result = await this.delegate.db.transaction(async (tx) => {\n let userId = this.user?.uid;\n if (!userId) {\n console.warn(`[DataDriver] User ID (uid) is missing for authenticated delegate. Using 'anonymous'. User object:`, this.user);\n userId = 'anonymous';\n }\n\n let userRoles = this.user?.roles ?? [];\n if (!this.user?.roles) {\n console.warn(`[DataDriver] User roles are missing for authenticated delegate. Using empty array. User object:`, this.user);\n }\n const normalizedRoles = userRoles.map((r: unknown) =>\n typeof r === \"string\" ? r : (r as Record<string, unknown>)?.id ?? String(r)\n );\n const rolesString = normalizedRoles.join(\",\");\n\n await tx.execute(drizzleSql`\n SELECT \n set_config('app.user_id', ${userId}, true),\n set_config('app.user_roles', ${rolesString}, true),\n set_config('app.jwt', ${JSON.stringify({ sub: userId, roles: userRoles })}, true)\n `);\n\n const txEntityService = new EntityService(tx, this.delegate.registry);\n const txDelegate = new PostgresBackendDriver(tx, this.delegate.realtimeService, this.delegate.registry, this.user, this.delegate.poolManager, this.delegate.historyService);\n \n txDelegate.entityService = txEntityService;\n txDelegate._deferNotifications = true;\n txDelegate._pendingNotifications = pendingNotifications;\n\n return await operation(txDelegate);\n });\n\n for (const notification of pendingNotifications) {\n try {\n await this.delegate.realtimeService.notifyEntityUpdate(\n notification.path,\n notification.entityId,\n notification.entity,\n notification.databaseId\n );\n } catch (e) {\n console.error(\"[DataDriver] Error flushing deferred notification:\", e);\n }\n }\n\n return result;\n }\n\n async fetchCollection<M extends Record<string, any>>(props: FetchCollectionProps<M>): Promise<Entity<M>[]> {\n return this.withTransaction((delegate) => delegate.fetchCollection(props));\n }\n\n /**\n * Injects the authenticated user's context into the most recently\n * registered realtime subscription so RLS-aware polling can apply.\n */\n private injectAuthContext(unsubscribe: () => void): () => void {\n const authContext = { userId: this.user?.uid || \"anonymous\", roles: this.user?.roles ?? [] };\n const entries = Array.from(this.delegate.realtimeService.subscriptions.entries());\n const lastEntry = entries[entries.length - 1];\n const lastSub = lastEntry?.[1] as Record<string, unknown> | undefined;\n if (lastSub && lastSub.clientId === \"driver\") {\n lastSub.authContext = authContext;\n }\n return unsubscribe;\n }\n\n listenCollection<M extends Record<string, any>>(props: ListenCollectionProps<M>): () => void {\n return this.injectAuthContext(this.delegate.listenCollection(props));\n }\n\n async fetchEntity<M extends Record<string, any>>(props: FetchEntityProps<M>): Promise<Entity<M> | undefined> {\n return this.withTransaction((delegate) => delegate.fetchEntity(props));\n }\n\n listenEntity<M extends Record<string, any>>(props: ListenEntityProps<M>): () => void {\n return this.injectAuthContext(this.delegate.listenEntity(props));\n }\n\n async saveEntity<M extends Record<string, any>>(props: SaveEntityProps<M>): Promise<Entity<M>> {\n return this.withTransaction((delegate) => delegate.saveEntity(props));\n }\n\n async deleteEntity<M extends Record<string, any>>(props: DeleteEntityProps<M>): Promise<void> {\n return this.withTransaction((delegate) => delegate.deleteEntity(props));\n }\n\n async checkUniqueField(\n path: string,\n name: string,\n value: unknown,\n entityId?: string,\n collection?: EntityCollection\n ): Promise<boolean> {\n return this.withTransaction((delegate) => delegate.checkUniqueField(path, name, value, entityId, collection));\n }\n\n async countEntities<M extends Record<string, any>>(props: FetchCollectionProps<M>): Promise<number> {\n return this.withTransaction((delegate) => delegate.countEntities(props));\n }\n\n /**\n * Intentionally delegates to the base delegate WITHOUT RLS wrapping.\n * executeSql is an admin-only feature; access control should be enforced\n * at the API route level, not via database-level RLS.\n */\n async executeSql(sqlText: string, options?: { database?: string, role?: string }): Promise<Record<string, unknown>[]> {\n return this.delegate.executeSql(sqlText, options);\n }\n\n async fetchAvailableDatabases(): Promise<string[]> {\n return this.delegate.fetchAvailableDatabases();\n }\n\n async fetchAvailableRoles(): Promise<string[]> {\n return this.delegate.fetchAvailableRoles();\n }\n\n async fetchCurrentDatabase(): Promise<string | undefined> {\n return this.delegate.fetchCurrentDatabase();\n }\n\n async fetchUnmappedTables(mappedPaths?: string[]): Promise<string[]> {\n return this.delegate.fetchUnmappedTables(mappedPaths);\n }\n\n async fetchTableMetadata(tableName: string) {\n return this.delegate.fetchTableMetadata(tableName);\n }\n}\n","import { Pool } from 'pg';\nimport { drizzle } from 'drizzle-orm/node-postgres';\nimport { NodePgDatabase } from 'drizzle-orm/node-postgres';\n\nexport class DatabasePoolManager {\n private pools: Map<string, Pool> = new Map();\n private drizzleInstances: Map<string, NodePgDatabase> = new Map();\n public readonly defaultDatabaseName: string;\n private readonly rootConnectionString: string;\n\n constructor(adminConnectionString: string) {\n this.rootConnectionString = adminConnectionString;\n try {\n const url = new URL(adminConnectionString);\n this.defaultDatabaseName = url.pathname.slice(1);\n } catch (e) {\n throw new Error(`Invalid adminConnectionString provided: ${e}`);\n }\n }\n\n public getDrizzle(databaseName: string): NodePgDatabase<any> {\n const existing = this.drizzleInstances.get(databaseName);\n if (existing) {\n return existing;\n }\n\n const pool = this.getPool(databaseName);\n const db = drizzle(pool);\n this.drizzleInstances.set(databaseName, db);\n return db;\n }\n\n public getPool(databaseName: string): Pool {\n if (this.pools.has(databaseName)) {\n return this.pools.get(databaseName)!;\n }\n\n const url = new URL(this.rootConnectionString);\n url.pathname = `/${databaseName}`;\n\n const pool = new Pool({\n connectionString: url.toString(),\n max: 10, // Default sensible limit, can be tuned later\n idleTimeoutMillis: 30000,\n });\n\n // Prevent idle client errors from crashing the Node.js process\n pool.on('error', (err) => {\n console.error(`[DatabasePoolManager] Unexpected error on idle client for db ${databaseName}`, err);\n });\n\n this.pools.set(databaseName, pool);\n return pool;\n }\n\n /**\n * Disconnect and remove the pool for a specific database.\n * Required before `CREATE DATABASE ... TEMPLATE` or `DROP DATABASE`,\n * which need exclusive access to the target database.\n */\n public async disconnectDatabase(databaseName: string): Promise<void> {\n const pool = this.pools.get(databaseName);\n if (pool) {\n await pool.end();\n this.pools.delete(databaseName);\n this.drizzleInstances.delete(databaseName);\n }\n }\n\n /** Check if a pool exists for a given database name. */\n public hasPool(databaseName: string): boolean {\n return this.pools.has(databaseName);\n }\n\n public async shutdown(): Promise<void> {\n const promises = [];\n for (const [dbName, pool] of this.pools.entries()) {\n console.log(`[DatabasePoolManager] Shutting down pool for ${dbName}`);\n promises.push(pool.end());\n }\n await Promise.all(promises);\n this.pools.clear();\n }\n}\n","import { pgSchema, varchar, uuid, timestamp, boolean, jsonb, primaryKey, unique } from \"drizzle-orm/pg-core\";\nimport { relations } from \"drizzle-orm\";\n\n/**\n * Dedicated PostgreSQL schema for all Rebase internal tables.\n * Keeps the user's `public` schema clean.\n */\nexport const rebaseSchema = pgSchema(\"rebase\");\n\n/**\n * Users table - stores both email/password and OAuth users\n */\nexport const users = rebaseSchema.table(\"users\", {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n email: varchar(\"email\", { length: 255 }).notNull().unique(),\n passwordHash: varchar(\"password_hash\", { length: 255 }), // NULL for OAuth-only users\n displayName: varchar(\"display_name\", { length: 255 }),\n photoUrl: varchar(\"photo_url\", { length: 500 }),\n provider: varchar(\"provider\", { length: 50 }).notNull().default(\"email\"), // 'email' | 'google'\n googleId: varchar(\"google_id\", { length: 255 }).unique(),\n emailVerified: boolean(\"email_verified\").default(false).notNull(),\n emailVerificationToken: varchar(\"email_verification_token\", { length: 255 }),\n emailVerificationSentAt: timestamp(\"email_verification_sent_at\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull()\n});\n\n/**\n * Roles table - defines permission sets\n */\nexport const roles = rebaseSchema.table(\"roles\", {\n id: varchar(\"id\", { length: 50 }).primaryKey(), // 'admin', 'editor', 'viewer'\n name: varchar(\"name\", { length: 100 }).notNull(),\n isAdmin: boolean(\"is_admin\").default(false).notNull(),\n defaultPermissions: jsonb(\"default_permissions\").$type<{\n read?: boolean;\n create?: boolean;\n edit?: boolean;\n delete?: boolean;\n }>(),\n collectionPermissions: jsonb(\"collection_permissions\").$type<\n Record<string, {\n read?: boolean;\n create?: boolean;\n edit?: boolean;\n delete?: boolean;\n }>\n >(),\n config: jsonb(\"config\").$type<{\n createCollections?: boolean;\n editCollections?: \"own\" | \"all\" | boolean;\n deleteCollections?: \"own\" | \"all\" | boolean;\n }>()\n});\n\n/**\n * User-Role junction table\n */\nexport const userRoles = rebaseSchema.table(\"user_roles\", {\n userId: uuid(\"user_id\").notNull().references(() => users.id, { onDelete: \"cascade\" }),\n roleId: varchar(\"role_id\", { length: 50 }).notNull().references(() => roles.id, { onDelete: \"cascade\" })\n}, (table) => ({\n pk: primaryKey({ columns: [table.userId, table.roleId] })\n}));\n\n/**\n * Refresh tokens for long-lived sessions\n */\nexport const refreshTokens = rebaseSchema.table(\"refresh_tokens\", {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n userId: uuid(\"user_id\").notNull().references(() => users.id, { onDelete: \"cascade\" }),\n tokenHash: varchar(\"token_hash\", { length: 255 }).notNull().unique(),\n expiresAt: timestamp(\"expires_at\").notNull(),\n userAgent: varchar(\"user_agent\", { length: 500 }),\n ipAddress: varchar(\"ip_address\", { length: 45 }),\n createdAt: timestamp(\"created_at\").defaultNow().notNull()\n}, (table) => ({\n uniqueDeviceSession: unique(\"unique_device_session\").on(table.userId, table.userAgent, table.ipAddress)\n}));\n\n/**\n * Password reset tokens for forgot password flow\n */\nexport const passwordResetTokens = rebaseSchema.table(\"password_reset_tokens\", {\n id: uuid(\"id\").defaultRandom().primaryKey(),\n userId: uuid(\"user_id\").notNull().references(() => users.id, { onDelete: \"cascade\" }),\n tokenHash: varchar(\"token_hash\", { length: 255 }).notNull().unique(),\n expiresAt: timestamp(\"expires_at\").notNull(),\n usedAt: timestamp(\"used_at\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull()\n});\n\n/**\n * App config - key/value store for custom settings\n */\nexport const appConfig = rebaseSchema.table(\"app_config\", {\n key: varchar(\"key\", { length: 100 }).primaryKey(),\n value: jsonb(\"value\").notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull()\n});\n\n// Relations\nexport const usersRelations = relations(users, ({ many }) => ({\n userRoles: many(userRoles),\n refreshTokens: many(refreshTokens),\n passwordResetTokens: many(passwordResetTokens)\n}));\n\nexport const rolesRelations = relations(roles, ({ many }) => ({\n userRoles: many(userRoles)\n}));\n\nexport const userRolesRelations = relations(userRoles, ({ one }) => ({\n user: one(users, {\n fields: [userRoles.userId],\n references: [users.id]\n }),\n role: one(roles, {\n fields: [userRoles.roleId],\n references: [roles.id]\n })\n}));\n\nexport const refreshTokensRelations = relations(refreshTokens, ({ one }) => ({\n user: one(users, {\n fields: [refreshTokens.userId],\n references: [users.id]\n })\n}));\n\nexport const passwordResetTokensRelations = relations(passwordResetTokens, ({ one }) => ({\n user: one(users, {\n fields: [passwordResetTokens.userId],\n references: [users.id]\n })\n}));\n\n// Type exports\nexport type User = typeof users.$inferSelect;\nexport type NewUser = typeof users.$inferInsert;\nexport type Role = typeof roles.$inferSelect;\nexport type NewRole = typeof roles.$inferInsert;\nexport type UserRole = typeof userRoles.$inferSelect;\nexport type RefreshToken = typeof refreshTokens.$inferSelect;\nexport type PasswordResetToken = typeof passwordResetTokens.$inferSelect;\nexport type AppConfig = typeof appConfig.$inferSelect;\n","import { EntityCollection, NumberProperty, Property, Relation, RelationProperty, SecurityOperation, SecurityRule, StringProperty } from \"@rebasepro/types\";\nimport { getPrimaryKeys } from \"../services/entity-helpers\";\nimport { getEnumVarName, getTableName, getTableVarName, resolveCollectionRelations } from \"@rebasepro/common\";\nimport { toSnakeCase } from \"@rebasepro/utils\";\n\n// --- Helper Functions ---\n\nconst getPrimaryKeyProp = (collection: EntityCollection): { name: string, type: \"string\" | \"number\" } => {\n if (collection.properties) {\n const idPropEntry = Object.entries(collection.properties).find(([_, prop]) => \"isId\" in (prop as object) && Boolean((prop as unknown as Record<string, unknown>).isId));\n if (idPropEntry) {\n return { name: idPropEntry[0], type: (idPropEntry[1] as Property).type === \"number\" ? \"number\" : \"string\" };\n }\n }\n // Fallback\n const idProp = collection.properties?.[\"id\"] as Property | undefined;\n if (idProp?.type === \"number\") {\n return { name: \"id\", type: \"number\" };\n }\n return { name: \"id\", type: \"string\" };\n};\n\nconst isNumericId = (collection: EntityCollection): boolean => {\n return getPrimaryKeyProp(collection).type === \"number\";\n};\n\nconst getPrimaryKeyName = (collection: EntityCollection): string => {\n return getPrimaryKeyProp(collection).name;\n};\n\nconst isIdProperty = (propName: string, prop: Property, collection: EntityCollection): boolean => {\n if (\"isId\" in prop && Boolean(prop.isId)) return true;\n\n // We only fallback to \"id\" if NO property is explicitly marked with `isId: true` or a generator string\n const hasExplicitId = Object.values(collection.properties ?? {}).some(p => \"isId\" in (p as object) && Boolean((p as unknown as Record<string, unknown>).isId));\n return !hasExplicitId && propName === \"id\";\n};\n\nconst getDrizzleColumn = (propName: string, prop: Property, collection: EntityCollection): string | null => {\n const colName = toSnakeCase(propName);\n let columnDefinition: string;\n\n switch (prop.type) {\n case \"string\": {\n const stringProp = prop as StringProperty;\n if (stringProp.enum) {\n const enumName = getEnumVarName(getTableName(collection), propName);\n columnDefinition = `${enumName}(\"${colName}\")`;\n } else if (\"isId\" in stringProp && stringProp.isId === \"uuid\") {\n columnDefinition = `uuid(\"${colName}\")`;\n } else if (stringProp.columnType === \"text\") {\n columnDefinition = `text(\"${colName}\")`;\n } else if (stringProp.columnType === \"char\") {\n columnDefinition = `char(\"${colName}\")`;\n } else {\n columnDefinition = `varchar(\"${colName}\")`;\n }\n if (isIdProperty(propName, prop, collection)) {\n columnDefinition += `.primaryKey()`;\n }\n if (\"isId\" in stringProp && stringProp.isId !== \"manual\" && stringProp.isId !== true) {\n if (stringProp.isId === \"uuid\") {\n columnDefinition += `.defaultRandom()`;\n } else if (stringProp.isId === \"cuid\") {\n columnDefinition += `.default(sql\\`cuid()\\`)`;\n } else if (typeof stringProp.isId === \"string\") {\n const sqlContent = stringProp.isId.startsWith(\"sql`\") && stringProp.isId.endsWith(\"`\")\n ? stringProp.isId.substring(4, stringProp.isId.length - 1)\n : stringProp.isId;\n columnDefinition += `.default(sql\\`${sqlContent}\\`)`;\n }\n }\n if (stringProp.validation?.unique) {\n columnDefinition += `.unique()`;\n }\n break;\n }\n case \"number\": {\n const numProp = prop as NumberProperty;\n const isId = isIdProperty(propName, prop, collection);\n\n let baseType = (numProp.validation?.integer || isId) ? `integer(\"${colName}\")` : `numeric(\"${colName}\")`;\n if (numProp.columnType) {\n if (numProp.columnType === \"double precision\") baseType = `doublePrecision(\"${colName}\")`;\n else baseType = `${numProp.columnType}(\"${colName}\")`;\n }\n\n if (\"isId\" in numProp && numProp.isId === \"increment\") {\n columnDefinition = `${baseType}.generatedByDefaultAsIdentity()`;\n } else if (\"isId\" in numProp && typeof numProp.isId === \"string\" && numProp.isId !== \"manual\") {\n columnDefinition = baseType;\n const sqlContent = numProp.isId.startsWith(\"sql`\") && numProp.isId.endsWith(\"`\")\n ? numProp.isId.substring(4, numProp.isId.length - 1)\n : numProp.isId;\n columnDefinition += `.default(sql\\`${sqlContent}\\`)`;\n } else {\n columnDefinition = baseType;\n }\n\n if (isId) {\n columnDefinition += `.primaryKey()`;\n }\n if (numProp.validation?.unique) {\n columnDefinition += `.unique()`;\n }\n break;\n }\n case \"boolean\":\n columnDefinition = `boolean(\"${colName}\")`;\n break;\n case \"date\": {\n const dateProp = prop as import(\"@rebasepro/types\").DateProperty;\n if (dateProp.columnType === \"date\") {\n columnDefinition = `date(\"${colName}\", { mode: 'string' })`;\n } else if (dateProp.columnType === \"time\") {\n columnDefinition = `time(\"${colName}\")`;\n } else {\n columnDefinition = `timestamp(\"${colName}\", { withTimezone: true, mode: 'string' })`;\n }\n break;\n }\n case \"map\":\n case \"array\": {\n const arrayOrMapProp = prop as import(\"@rebasepro/types\").ArrayProperty | import(\"@rebasepro/types\").MapProperty;\n if (arrayOrMapProp.columnType === \"json\") {\n columnDefinition = `json(\"${colName}\")`;\n } else {\n columnDefinition = `jsonb(\"${colName}\")`;\n }\n break;\n }\n case \"relation\": {\n const refProp = prop as RelationProperty;\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n const relation = resolvedRelations[refProp.relationName ?? propName];\n\n // Only owning one-to-one/many-to-one relations create a column here.\n if (!relation || relation.direction !== \"owning\" || relation.cardinality !== \"one\") {\n return null;\n }\n\n // The localKey property is the source of truth for the FK column name.\n if (!relation.localKey) {\n console.warn(`Could not generate column for owning relation '${relation.relationName}' on '${collection.name}': 'localKey' is not defined.`);\n return null;\n }\n\n // If the localKey property is defined elsewhere in the properties, it will be handled there.\n // This logic is for when the relation property itself defines the FK.\n if (collection.properties[relation.localKey] && propName !== relation.localKey) {\n return null;\n }\n\n let targetCollection: EntityCollection;\n try {\n targetCollection = relation.target();\n } catch {\n return null; // Cannot resolve target\n }\n\n const fkColumnName = toSnakeCase(relation.localKey);\n const targetTableVar = getTableVarName(getTableName(targetCollection));\n const targetIdField = getPrimaryKeyName(targetCollection);\n const baseColumn = isNumericId(targetCollection) ? `integer(\\\"${fkColumnName}\\\")` : `varchar(\\\"${fkColumnName}\\\")`;\n\n const onUpdate = relation.onUpdate ? `onUpdate: \\\"${relation.onUpdate}\\\"` : \"\";\n const required = prop.validation?.required;\n const onDeleteVal = relation.onDelete ?? (required ? \"cascade\" : \"set null\");\n const onDelete = `onDelete: \\\"${onDeleteVal}\\\"`;\n\n const refOptionsParts = [onUpdate, onDelete].filter(Boolean);\n const refOptions = refOptionsParts.length > 0 ? `{ ${refOptionsParts.join(\", \")} }` : \"\";\n\n let columnDef = `${baseColumn}.references(() => ${targetTableVar}.${targetIdField}${refOptions ? `, ${refOptions}` : \"\"})`;\n\n if (required) {\n columnDef += \".notNull()\";\n }\n\n return ` ${relation.localKey}: ${columnDef}`;\n }\n default:\n return null;\n }\n\n if (prop.validation?.required) {\n columnDefinition += \".notNull()\";\n }\n\n return ` ${propName}: ${columnDefinition}`;\n};\n\n/**\n * Resolves a raw SQL string, replacing `{column_name}` with `${table.column_name}`.\n * The result is wrapped in a Drizzle sql`` template literal.\n */\nconst resolveRawSql = (expression: string): string => {\n // Replace {column_name} with ${table.column_name}\n const resolved = expression.replace(/\\{(\\w+)\\}/g, (_, col) => `\\${table.${col}}`);\n return `sql\\`${resolved}\\``;\n};\n\n/**\n * Wraps a SQL clause with a role check using AND.\n * Generates: `(<clause>) AND (string_to_array(auth.roles(), ',') && ARRAY['<role1>','<role2>'])`\n */\nconst wrapWithRoleCheck = (clause: string, roles: string[]): string => {\n const rolesArrayString = `ARRAY[${roles.map(r => `'${r}'`).join(',')}]`;\n const roleCondition = `string_to_array(auth.roles(), ',') @> ${rolesArrayString}`;\n return `sql\\`(${unwrapSql(clause)}) AND (${roleCondition})\\``;\n};\n\n/**\n * Extracts the inner expression from a `sql\\`...\\`` wrapper.\n */\nconst unwrapSql = (sqlExpr: string): string => {\n const match = sqlExpr.match(/^sql`(.*)`$/s);\n return match ? match[1] : sqlExpr;\n};\n\n/**\n * Builds the USING clause for a policy based on shortcuts or raw SQL.\n */\nconst buildUsingClause = (rule: SecurityRule): string | null => {\n if (rule.using) {\n return resolveRawSql(rule.using);\n }\n if (rule.access === \"public\") {\n return `sql\\`true\\``;\n }\n if (rule.ownerField) {\n return `sql\\`\\${table.${rule.ownerField}} = auth.uid()\\``;\n }\n return null;\n};\n\n/**\n * Builds the WITH CHECK clause for a policy based on shortcuts or raw SQL.\n * Falls back to the USING clause if not explicitly provided.\n */\nconst buildWithCheckClause = (rule: SecurityRule): string | null => {\n if (rule.withCheck) {\n return resolveRawSql(rule.withCheck);\n }\n // For insert/update/all, fall back to using clause if withCheck not specified\n return buildUsingClause(rule);\n};\n\n/**\n * Generates Drizzle pgPolicy() calls from a declarative SecurityRule definition.\n *\n * Supports the full spectrum:\n * - Convenience shortcuts: ownerField, access, roles\n * - Raw SQL: using, withCheck\n * - Mode: permissive (default) or restrictive\n * - operations[] array: generates one policy per operation\n * - Combinations: roles + ownerField, roles + raw SQL, etc.\n */\nconst generatePolicyCode = (tableName: string, rule: SecurityRule, index: number): string => {\n // Resolve operations: operations[] takes precedence over operation (singular)\n const ops: SecurityOperation[] = rule.operations && rule.operations.length > 0\n ? rule.operations\n : [rule.operation ?? \"all\"];\n\n // Generate one pgPolicy per operation\n return ops.map((op, opIdx) => {\n const policyName = rule.name\n ? (ops.length > 1 ? `${rule.name}_${op}` : rule.name)\n : `${tableName}_${op}_policy_${index}${ops.length > 1 ? `_${opIdx}` : \"\"}`;\n\n return generateSinglePolicyCode(tableName, rule, op, policyName);\n }).join(\"\");\n};\n\n/**\n * Generates a single pgPolicy() call for one specific operation.\n */\nconst generateSinglePolicyCode = (tableName: string, rule: SecurityRule, operation: SecurityOperation, policyName: string): string => {\n const mode = rule.mode ?? \"permissive\";\n const roles = rule.roles;\n\n // Determine which clauses this operation needs:\n // SELECT, DELETE → USING only\n // INSERT → WITH CHECK only\n // UPDATE, ALL → both USING and WITH CHECK\n const needsUsing = operation !== \"insert\";\n const needsWithCheck = operation !== \"select\" && operation !== \"delete\";\n\n let usingClause = needsUsing ? buildUsingClause(rule) : null;\n let withCheckClause = needsWithCheck ? buildWithCheckClause(rule) : null;\n\n // If roles are specified, wrap existing clauses with role check,\n // or generate a roles-only clause.\n if (roles && roles.length > 0) {\n if (usingClause) {\n usingClause = wrapWithRoleCheck(usingClause, roles);\n } else if (needsUsing) {\n // Roles-only rule (e.g. { operation: \"select\", roles: [\"admin\"] })\n const rolesArrayString = `ARRAY[${roles.map(r => `'${r}'`).join(',')}]`;\n usingClause = `sql\\`string_to_array(auth.roles(), ',') @> ${rolesArrayString}\\``;\n }\n if (withCheckClause) {\n withCheckClause = wrapWithRoleCheck(withCheckClause, roles);\n } else if (needsWithCheck) {\n const rolesArrayString = `ARRAY[${roles.map(r => `'${r}'`).join(',')}]`;\n withCheckClause = `sql\\`string_to_array(auth.roles(), ',') @> ${rolesArrayString}\\``;\n }\n }\n\n // Fallback: if we still have no clauses, deny all (safety net)\n if (!usingClause && needsUsing) {\n usingClause = `sql\\`false\\``;\n }\n if (!withCheckClause && needsWithCheck) {\n withCheckClause = `sql\\`false\\``;\n }\n\n // Build the policy options object\n const parts: string[] = [];\n parts.push(`as: \"${mode}\"`);\n parts.push(`for: \"${operation}\"`);\n const toRoles = rule.pgRoles ?? [\"public\"];\n parts.push(`to: [${toRoles.map(r => `\"${r}\"`).join(\", \")}]`);\n if (usingClause) parts.push(`using: ${usingClause}`);\n if (withCheckClause) parts.push(`withCheck: ${withCheckClause}`);\n\n return ` pgPolicy(\"${policyName}\", { ${parts.join(\", \")} }),\\n`;\n};\n\n// --- Main Schema Generation Logic ---\nexport const generateSchema = async (collections: EntityCollection[]): Promise<string> => {\n let schemaContent = \"// This file is auto-generated by the Rebase Drizzle generator. Do not edit manually.\\n\\n\";\n\n const hasUuid = collections.some(c =>\n c.properties && Object.values(c.properties).some(\n (p: Property) => p.type === \"string\" && ((p as unknown as Record<string, unknown>).autoValue === \"uuid\" || (p as unknown as Record<string, unknown>).isId === \"uuid\")\n )\n );\n\n const hasJson = collections.some(c =>\n c.properties && Object.values(c.properties).some(\n (p: Property) => (p.type === \"map\" || p.type === \"array\") && (p as unknown as Record<string, unknown>).columnType === \"json\"\n )\n );\n\n // Always import pgPolicy and sql — RLS is enabled on every table (secure by default)\n const pgCoreImports = [\"primaryKey\", \"pgTable\", \"integer\", \"varchar\", \"text\", \"char\", \"boolean\", \"timestamp\", \"date\", \"time\", \"jsonb\", \"json\", \"pgEnum\", \"numeric\", \"real\", \"doublePrecision\", \"bigint\", \"serial\", \"bigserial\", \"pgPolicy\"];\n if (hasUuid) pgCoreImports.push(\"uuid\");\n schemaContent += `import { ${pgCoreImports.join(\", \")} } from 'drizzle-orm/pg-core';\\n`;\n schemaContent += `import { relations as drizzleRelations, sql } from 'drizzle-orm';\\n\\n`;\n\n const exportedTableVars: string[] = [];\n const exportedEnumVars: string[] = [];\n const exportedRelationVars: string[] = [];\n\n const allTablesToGenerate = new Map<string, {\n collection: EntityCollection,\n isJunction?: boolean,\n relation?: Relation,\n sourceCollection?: EntityCollection\n }>();\n\n // 1. Generate Enums\n collections.forEach(collection => {\n const collectionPath = getTableName(collection);\n Object.entries(collection.properties ?? {}).forEach(([propName, prop]) => {\n if ((\"enum\" in prop) && (prop.type === \"string\" || prop.type === \"number\") && prop.enum) {\n const enumVarName = getEnumVarName(collectionPath, propName);\n const enumDbName = `${collectionPath}_${toSnakeCase(propName)}`;\n const values = Array.isArray(prop.enum)\n ? prop.enum.map(v => String(v.id ?? v))\n : Object.keys(prop.enum);\n if (values.length > 0) {\n schemaContent += `export const ${enumVarName} = pgEnum(\\\"${enumDbName}\\\", [${values.map(v => `'${v}'`).join(\", \")}]);\\n`;\n if (!exportedEnumVars.includes(enumVarName)) exportedEnumVars.push(enumVarName);\n }\n }\n });\n });\n schemaContent += \"\\n\";\n\n // 2. Identify all tables (collections and junction tables only)\n for (const collection of collections) {\n const tableName = getTableName(collection);\n if (tableName) {\n allTablesToGenerate.set(tableName, { collection });\n }\n\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n for (const relation of Object.values(resolvedRelations)) {\n if (relation.through) { // Standard M2M junction table\n const junctionTableName = relation.through.table;\n if (!allTablesToGenerate.has(junctionTableName)) {\n allTablesToGenerate.set(junctionTableName, {\n collection: {\n table: junctionTableName,\n properties: {}\n } as EntityCollection,\n isJunction: true,\n relation: relation,\n sourceCollection: collection\n });\n }\n }\n // joinPath relations use existing user-controlled tables - no generation needed\n }\n }\n\n // 3. Generate pgTable definitions for all unique tables\n for (const [tableName, {\n collection,\n isJunction,\n relation,\n sourceCollection\n }] of allTablesToGenerate.entries()) {\n const tableVarName = getTableVarName(tableName);\n if (isJunction && relation && sourceCollection && relation.through) {\n const targetCollection = relation.target();\n const {\n sourceColumn,\n targetColumn\n } = relation.through;\n\n const onDelete = relation.onDelete ?? \"cascade\";\n const refOptions = `{ onDelete: \\\"${onDelete}\\\" }`;\n\n const sourceColType = isNumericId(sourceCollection) ? \"integer\" : \"varchar\";\n const targetColType = isNumericId(targetCollection) ? \"integer\" : \"varchar\";\n const sourceId = getPrimaryKeyName(sourceCollection);\n const targetId = getPrimaryKeyName(targetCollection);\n\n schemaContent += `export const ${tableVarName} = pgTable(\\\"${tableName}\\\", {\\n`;\n schemaContent += ` ${sourceColumn}: ${sourceColType}(\\\"${toSnakeCase(sourceColumn)}\\\").notNull().references(() => ${getTableVarName(getTableName(sourceCollection))}.${sourceId}, ${refOptions}),\\n`;\n schemaContent += ` ${targetColumn}: ${targetColType}(\\\"${toSnakeCase(targetColumn)}\\\").notNull().references(() => ${getTableVarName(getTableName(targetCollection))}.${targetId}, ${refOptions}),\\n`;\n schemaContent += `}, (table) => ({\\n`;\n schemaContent += ` pk: primaryKey({ columns: [table.${sourceColumn}, table.${targetColumn}] })\\n`;\n schemaContent += `}));\\n\\n`;\n } else if (!isJunction) {\n schemaContent += `export const ${tableVarName} = pgTable(\\\"${tableName}\\\", {\\n`;\n const columns = new Set<string>();\n Object.entries(collection.properties ?? {}).forEach(([propName, prop]) => {\n const columnString = getDrizzleColumn(propName, prop as Property, collection);\n if (columnString) columns.add(columnString);\n });\n\n // Backwards compatibility: if no id/primary key column is found in properties, but `id` wasn't explicitly provided\n // We should generate a basic id column if one was completely omitted.\n const hasIdColumn = Array.from(columns).some(col => col.includes(\".primaryKey()\"));\n if (!hasIdColumn) {\n columns.add(` id: varchar(\\\"id\\\").primaryKey()`);\n }\n\n schemaContent += `${Array.from(columns).join(\",\\n\")}`;\n\n const securityRules = (collection as import(\"@rebasepro/types\").PostgresCollection<Record<string, unknown>, import(\"@rebasepro/types\").User>).securityRules;\n if (securityRules && securityRules.length > 0) {\n schemaContent += \"\\n}, (table) => ([\\n\";\n securityRules.forEach((rule: SecurityRule, idx: number) => {\n schemaContent += generatePolicyCode(tableName, rule, idx);\n });\n schemaContent += \"])).enableRLS();\\n\\n\";\n } else {\n // No explicit policies — RLS enabled with deny-all default (Postgres denies\n // everything when RLS is on and no permissive policies exist).\n schemaContent += \"\\n}).enableRLS();\\n\\n\";\n }\n }\n if (!exportedTableVars.includes(tableVarName)) exportedTableVars.push(tableVarName);\n }\n\n // 4. Generate Drizzle Relations\n for (const [tableName, {\n collection,\n isJunction\n }] of allTablesToGenerate.entries()) {\n const tableVarName = getTableVarName(tableName);\n const tableRelations: string[] = [];\n\n if (isJunction) {\n const relationInfo = Array.from(allTablesToGenerate.values()).find(v => v.isJunction && getTableName(v.collection) === tableName);\n if (relationInfo && relationInfo.relation && relationInfo.sourceCollection && relationInfo.relation.through) {\n const {\n relation,\n sourceCollection\n } = relationInfo;\n const targetCollection = relation.target();\n const sourceTableVar = getTableVarName(getTableName(sourceCollection));\n const targetTableVar = getTableVarName(getTableName(targetCollection));\n const sourceId = getPrimaryKeyName(sourceCollection);\n const targetId = getPrimaryKeyName(targetCollection);\n\n if (!relation?.through)\n throw new Error(\"Internal, the relation should have a through property. Relations passed to this script should sanitized first with sanitizeRelation().\");\n\n // The owning relation's name — used on the source side of the junction\n const owningRelationName = relation.relationName ?? toSnakeCase(getTableName(targetCollection));\n\n // Find the inverse relation name on the target collection (if any)\n // This is needed so the junction's target-side one() can pair with the\n // inverse many() on the target table.\n let inverseRelationName: string | null = null;\n try {\n const targetRelations = resolveCollectionRelations(targetCollection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n for (const [, targetRel] of Object.entries(targetRelations)) {\n if (targetRel.direction === \"inverse\" &&\n targetRel.cardinality === \"many\" &&\n targetRel.inverseRelationName === owningRelationName) {\n inverseRelationName = targetRel.relationName ?? null;\n break;\n }\n }\n } catch {\n // ignore — inverse side may not exist\n }\n\n // Source side one(): pairs with owning table's many(junctionTable, { relationName })\n tableRelations.push(` ${relation.through.sourceColumn}: one(${sourceTableVar}, {\\n fields: [${tableVarName}.${relation.through.sourceColumn}],\\n references: [${sourceTableVar}.${sourceId}],\\n relationName: \\\"${owningRelationName}\\\"\\n })`);\n\n // Target side one(): pairs with inverse table's many(junctionTable, { relationName })\n const targetRelName = inverseRelationName ?? owningRelationName;\n tableRelations.push(` ${relation.through.targetColumn}: one(${targetTableVar}, {\\n fields: [${tableVarName}.${relation.through.targetColumn}],\\n references: [${targetTableVar}.${targetId}],\\n relationName: \\\"${targetRelName}\\\"\\n })`);\n }\n } else {\n const resolvedRelations = resolveCollectionRelations(collection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n for (const [relationKey, rel] of Object.entries(resolvedRelations)) {\n try {\n const target = rel.target();\n const targetTableVar = getTableVarName(getTableName(target));\n const relationName = rel.relationName ?? relationKey;\n\n // Determine the correct relation name for Drizzle\n // For inverse relations, we should use the current relation's name, not the inverse name\n const drizzleRelationName = relationName;\n\n if (rel.cardinality === \"one\") {\n if (rel.direction === \"owning\" && rel.localKey) {\n tableRelations.push(` ${relationKey}: one(${targetTableVar}, {\\n fields: [${tableVarName}.${rel.localKey}],\\n references: [${targetTableVar}.${getPrimaryKeyName(target)}],\\n relationName: \\\"${drizzleRelationName}\\\"\\n })`);\n } else if (rel.direction === \"inverse\" && rel.foreignKeyOnTarget) {\n const sourceIdField = getPrimaryKeyName(collection);\n tableRelations.push(` ${relationKey}: one(${targetTableVar}, {\\n fields: [${tableVarName}.${sourceIdField}],\\n references: [${targetTableVar}.${rel.foreignKeyOnTarget}],\\n relationName: \\\"${drizzleRelationName}\\\"\\n })`);\n } else if (rel.direction === \"inverse\" && !rel.foreignKeyOnTarget) {\n // Handle inverse one-to-one relations where the FK is on the target table\n // but foreignKeyOnTarget is not explicitly specified\n // In this case, we need to find the corresponding owning relation on the target\n try {\n const targetCollection = rel.target();\n const targetResolvedRelations = resolveCollectionRelations(targetCollection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n\n // Find the owning relation on the target that points back to this collection\n const correspondingRelation = Object.values(targetResolvedRelations).find(targetRel =>\n targetRel.direction === \"owning\" &&\n targetRel.cardinality === \"one\" &&\n targetRel.target().slug === collection.slug\n );\n\n if (correspondingRelation && correspondingRelation.localKey) {\n const sourceIdField = getPrimaryKeyName(collection);\n tableRelations.push(` ${relationKey}: one(${targetTableVar}, {\\n fields: [${tableVarName}.${sourceIdField}],\\n references: [${targetTableVar}.${correspondingRelation.localKey}],\\n relationName: \\\"${drizzleRelationName}\\\"\\n })`);\n }\n } catch (e) {\n console.warn(`Could not resolve inverse one-to-one relation '${relationKey}':`, e);\n }\n }\n } else if (rel.cardinality === \"many\") {\n if (rel.direction === \"inverse\" && rel.foreignKeyOnTarget) {\n // One-to-many inverse relation\n tableRelations.push(` ${relationKey}: many(${targetTableVar}, { relationName: \\\"${drizzleRelationName}\\\" })`);\n } else if (rel.through) {\n // Many-to-many owning relation with explicit junction table\n const junctionTableVar = getTableVarName(rel.through.table);\n tableRelations.push(` ${relationKey}: many(${junctionTableVar}, { relationName: \\\"${drizzleRelationName}\\\" })`);\n } else if (rel.direction === \"inverse\" && rel.inverseRelationName) {\n // Many-to-many inverse relation - find the corresponding owning relation's junction table\n try {\n const targetCollection = rel.target();\n const targetResolvedRelations = resolveCollectionRelations(targetCollection as import(\"@rebasepro/types\").PostgresCollection<any, any>);\n\n // Find the corresponding owning many-to-many relation on the target\n const correspondingRelation = Object.values(targetResolvedRelations).find(targetRel =>\n targetRel.direction === \"owning\" &&\n targetRel.cardinality === \"many\" &&\n targetRel.through &&\n targetRel.relationName === rel.inverseRelationName\n );\n\n if (correspondingRelation && correspondingRelation.through) {\n const junctionTableVar = getTableVarName(correspondingRelation.through.table);\n tableRelations.push(` ${relationKey}: many(${junctionTableVar}, { relationName: \\\"${drizzleRelationName}\\\" })`);\n } else {\n console.warn(`Could not find corresponding owning many-to-many relation for inverse relation '${relationKey}' on '${collection.name}'`);\n }\n } catch (e) {\n console.warn(`Could not resolve inverse many-to-many relation '${relationKey}':`, e);\n }\n }\n // joinPath relations don't generate Drizzle relations - they use existing user tables\n }\n } catch (e) {\n console.warn(`Could not generate relation ${relationKey} for ${collection.name}:`, e);\n }\n }\n }\n\n if (tableRelations.length > 0) {\n const relVarName = `${tableVarName}Relations`;\n schemaContent += `export const ${relVarName} = drizzleRelations(${tableVarName}, ({ one, many }) => ({\\n${tableRelations.join(\",\\n\")}\\n}));\\n\\n`;\n if (!exportedRelationVars.includes(relVarName)) exportedRelationVars.push(relVarName);\n }\n }\n\n // <<< ADDED: Final aggregated exports block\n const tablesExport = `export const tables = { ${exportedTableVars.join(\", \")} };\\n`;\n const enumsExport = `export const enums = { ${exportedEnumVars.join(\", \")} };\\n`;\n const relationsExport = `export const relations = { ${exportedRelationVars.join(\", \")} };\\n\\n`;\n schemaContent += tablesExport + enumsExport + relationsExport;\n\n return schemaContent;\n};\n","import { promises as fsPromises } from \"fs\";\nimport * as fs from \"fs\";\nimport path from \"path\";\nimport { pathToFileURL } from \"url\";\nimport chokidar from \"chokidar\";\nimport { generateSchema } from \"./generate-drizzle-schema-logic\";\nimport { EntityCollection } from \"@rebasepro/types\";\n\n// --- Helper Functions ---\n\nconst formatTerminalText = (text: string, options: {\n bold?: boolean;\n backgroundColor?: \"blue\" | \"green\" | \"red\" | \"yellow\" | \"cyan\" | \"magenta\";\n textColor?: \"white\" | \"black\" | \"red\" | \"green\" | \"yellow\" | \"blue\" | \"magenta\" | \"cyan\";\n} = {}): string => {\n let codes = \"\";\n if (options.bold) codes += \"\\x1b[1m\";\n if (options.backgroundColor) {\n const bgColors = {\n blue: \"\\x1b[44m\",\n green: \"\\x1b[42m\",\n red: \"\\x1b[41m\",\n yellow: \"\\x1b[43m\",\n cyan: \"\\x1b[46m\",\n magenta: \"\\x1b[45m\"\n } as const;\n codes += bgColors[options.backgroundColor];\n }\n if (options.textColor) {\n const textColors = {\n white: \"\\x1b[37m\",\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\"\n } as const;\n codes += textColors[options.textColor];\n }\n return `${codes}${text}\\x1b[0m`;\n};\n\n// --- Execution and Watch Logic ---\n\nconst runGeneration = async (collectionsFilePath?: string, outputPath?: string) => {\n try {\n if (!collectionsFilePath) {\n console.error(\"Error: No collections file path provided. Skipping schema generation.\");\n return;\n }\n\n const resolvedPath = path.resolve(collectionsFilePath);\n let collections: EntityCollection[] = [];\n const stats = fs.statSync(resolvedPath);\n\n if (stats.isDirectory()) {\n const files = fs.readdirSync(resolvedPath);\n for (const file of files) {\n if ((file.endsWith('.ts') || file.endsWith('.js')) &&\n !file.includes('.test.') &&\n !file.endsWith('.d.ts') &&\n file !== 'index.ts' && file !== 'index.js') {\n\n const filePath = path.join(resolvedPath, file);\n try {\n const fileUrl = pathToFileURL(filePath).href;\n const dynamicImport = new Function('url', 'return import(url)');\n const module = await dynamicImport(fileUrl);\n if (module && module.default) {\n collections.push(module.default);\n }\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`Error loading ${file}:`, message);\n }\n }\n }\n } else {\n const fileUrl = pathToFileURL(resolvedPath).href + `?t=${Date.now()}`;\n const dynamicImport = new Function('url', 'return import(url)');\n const imported = await dynamicImport(fileUrl);\n collections = imported.backendCollections || imported.collections;\n }\n\n if (!collections || !Array.isArray(collections) || collections.length === 0) {\n console.error(\"Error: Could not find collections array or failed to load directory.\");\n return;\n }\n\n const schemaContent = await generateSchema(collections);\n\n if (outputPath) {\n const outputDir = path.dirname(outputPath);\n await fsPromises.mkdir(outputDir, { recursive: true });\n await fsPromises.writeFile(outputPath, schemaContent);\n console.log(\"✅ Drizzle schema generated successfully at\", outputPath);\n } else {\n console.log(\"✅ Drizzle schema generated successfully.\");\n console.log(schemaContent);\n }\n\n console.log(`You can now run ${formatTerminalText(\"rebase db generate\", {\n bold: true,\n backgroundColor: \"blue\",\n textColor: \"black\"\n })} to generate the SQL migration files.`);\n\n } catch (error) {\n console.error(\"Error generating schema:\", error);\n }\n};\n\nconst main = () => {\n const collectionsFilePathArg = process.argv.find(arg => arg.startsWith(\"--collections=\"));\n const collectionsFilePath = collectionsFilePathArg ? collectionsFilePathArg.split(\"=\")[1] : process.argv[2];\n\n const outputPathArg = process.argv.find(arg => arg.startsWith(\"--output=\"));\n const outputPath = outputPathArg ? outputPathArg.split(\"=\")[1] : undefined;\n\n const watch = process.argv.includes(\"--watch\");\n\n if (!collectionsFilePath) {\n console.log(\"Usage: ts-node generate-drizzle-schema.ts <path-to-collections-file> [--output <path-to-output-file>] [--watch]\");\n return;\n }\n\n const resolvedPath = path.resolve(process.cwd(), collectionsFilePath);\n const resolvedOutputPath = outputPath ? path.resolve(process.cwd(), outputPath) : undefined;\n\n if (watch) {\n console.log(`Watching for changes in ${resolvedPath}...`);\n const watcher = chokidar.watch(resolvedPath, {\n persistent: true,\n ignoreInitial: false\n });\n\n watcher.on(\"all\", (event, filePath) => {\n console.log(`[${event}] ${filePath}. Regenerating schema...`);\n runGeneration(resolvedPath, resolvedOutputPath);\n });\n } else {\n runGeneration(resolvedPath, resolvedOutputPath);\n }\n};\n\n// This check ensures the script only runs when executed directly\nif (import.meta.url.endsWith(process.argv[1])) {\n main();\n}\n","import { WebSocket } from \"ws\";\nimport { EventEmitter } from \"events\";\nimport { Client as PgClient } from \"pg\";\nimport { randomUUID } from \"crypto\";\nimport { EntityService } from \"./entityService\";\n\nimport { Entity, FetchCollectionProps, ListenCollectionProps, ListenEntityProps, DataDriver, CollectionUpdateMessage, EntityUpdateMessage, CollectionEntityPatchMessage, WebSocketMessage } from \"@rebasepro/types\";\nimport { NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport { sql as drizzleSql } from \"drizzle-orm\";\nimport { RealtimeProvider, CollectionSubscriptionConfig, EntitySubscriptionConfig } from \"../interfaces\";\nimport { PostgresCollectionRegistry } from \"../collections/PostgresCollectionRegistry\";\nimport { buildPropertyCallbacks } from \"@rebasepro/common\";\n\n/** Channel name used for Postgres LISTEN/NOTIFY cross-instance realtime. */\nconst PG_NOTIFY_CHANNEL = \"rebase_entity_changes\";\n\n/**\n * Auth context stored per-subscription so real-time refetches respect RLS.\n * Mirrors the session variables set by PostgresBackendDriver.withAuth().\n */\nexport interface SubscriptionAuthContext {\n userId: string;\n roles: string[];\n}\n\ntype RealTimeListenCollectionProps = ListenCollectionProps & {\n subscriptionId: string\n};\n\ntype RealTimeListenEntityProps = ListenEntityProps & { subscriptionId: string };\n\n/**\n * PostgreSQL-specific realtime service.\n * Handles WebSocket connections and subscriptions for real-time entity updates.\n * \n * Implements the RealtimeProvider interface for database abstraction.\n */\nexport class RealtimeService extends EventEmitter implements RealtimeProvider {\n private clients = new Map<string, WebSocket>();\n private entityService: EntityService;\n // Enhanced subscriptions storage with full request parameters\n private _subscriptions = new Map<string, {\n clientId: string;\n type: \"collection\" | \"entity\";\n path: string;\n entityId?: string | number;\n // Store full collection request parameters for proper refetching\n collectionRequest?: {\n filter?: Record<string, unknown>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n startAfter?: Record<string, unknown>;\n databaseId?: string;\n searchString?: string;\n };\n // Auth context for RLS — when set, refetches run in a transaction\n // with set_config('app.user_id', ...) / set_config('app.user_roles', ...)\n authContext?: SubscriptionAuthContext;\n }>();\n\n // Add callback storage for DataDriver subscriptions\n private subscriptionCallbacks = new Map<string, (data: Entity[] | Entity | null) => void>();\n\n private driver?: DataDriver;\n\n // ── Cross-instance LISTEN/NOTIFY ──\n /** Unique identifier for this process instance, used to skip own notifications. */\n private readonly instanceId = `inst_${randomUUID().slice(0, 8)}`;\n /** Dedicated pg.Client for LISTEN (outside the Drizzle pool). */\n private listenClient?: PgClient;\n /** Connection string used for reconnecting the LISTEN client. */\n private listenConnectionString?: string;\n /** Whether cross-instance broadcasting is active. */\n private broadcasting = false;\n /** Reconnection timer handle. */\n private reconnectTimer?: ReturnType<typeof setTimeout>;\n /** Debounce timers for collection refetches to prevent refetch storms. */\n private refetchTimers = new Map<string, ReturnType<typeof setTimeout>>();\n /** Debounce window (ms) for coalescing rapid entity updates into a single correctness refetch. */\n private static readonly REFETCH_DEBOUNCE_MS = 300;\n\n constructor(private db: NodePgDatabase<any>, private registry: PostgresCollectionRegistry) {\n super();\n this.entityService = new EntityService(db, registry);\n }\n\n /** Whether to emit verbose debug logs (disabled in production). */\n private static readonly DEBUG = process.env.NODE_ENV !== \"production\";\n private debugLog(...args: unknown[]) {\n if (RealtimeService.DEBUG) console.debug(...args);\n }\n\n setDataDriver(driver: DataDriver) {\n this.driver = driver;\n }\n\n // Make subscriptions accessible for DataDriver\n get subscriptions() {\n return this._subscriptions;\n }\n\n // Add public method to register DataDriver subscriptions\n registerDataDriverSubscription(subscriptionId: string, subscription: {\n clientId: string;\n type: \"collection\" | \"entity\";\n path: string;\n entityId?: string | number;\n collectionRequest?: {\n filter?: Record<string, unknown>;\n orderBy?: string;\n order?: \"desc\" | \"asc\";\n limit?: number;\n startAfter?: Record<string, unknown>;\n databaseId?: string;\n searchString?: string;\n };\n authContext?: SubscriptionAuthContext;\n }) {\n this.debugLog(\"📋 [RealtimeService] Registering DataDriver subscription:\", subscriptionId, subscription.authContext ? \"(with auth)\" : \"(no auth)\");\n this._subscriptions.set(subscriptionId, subscription);\n }\n\n // Add callback management methods\n addSubscriptionCallback(subscriptionId: string, callback: (data: Entity[] | Entity | null) => void) {\n this.debugLog(\"📋 [RealtimeService] Adding callback for subscription:\", subscriptionId);\n this.subscriptionCallbacks.set(subscriptionId, callback);\n }\n\n removeSubscriptionCallback(subscriptionId: string) {\n this.debugLog(\"📋 [RealtimeService] Removing callback for subscription:\", subscriptionId);\n this.subscriptionCallbacks.delete(subscriptionId);\n }\n\n // =============================================================================\n // RealtimeProvider Interface Methods\n // =============================================================================\n\n /**\n * Subscribe to collection changes (RealtimeProvider interface)\n */\n subscribeToCollection(\n subscriptionId: string,\n config: CollectionSubscriptionConfig,\n callback?: (entities: Entity[]) => void\n ): void {\n this._subscriptions.set(subscriptionId, {\n clientId: config.clientId,\n type: \"collection\",\n path: config.path,\n collectionRequest: {\n filter: config.filter as Record<string, unknown> | undefined,\n orderBy: config.orderBy,\n order: config.order,\n limit: config.limit,\n startAfter: config.startAfter as Record<string, unknown> | undefined,\n databaseId: config.databaseId,\n searchString: config.searchString\n }\n });\n\n if (callback) {\n this.subscriptionCallbacks.set(subscriptionId, callback as (data: Entity[] | Entity | null) => void);\n }\n }\n\n /**\n * Subscribe to single entity changes (RealtimeProvider interface)\n */\n subscribeToEntity(\n subscriptionId: string,\n config: EntitySubscriptionConfig,\n callback?: (entity: Entity | null) => void\n ): void {\n this._subscriptions.set(subscriptionId, {\n clientId: config.clientId,\n type: \"entity\",\n path: config.path,\n entityId: config.entityId\n });\n\n if (callback) {\n this.subscriptionCallbacks.set(subscriptionId, callback as (data: Entity[] | Entity | null) => void);\n }\n }\n\n /**\n * Unsubscribe from a subscription (RealtimeProvider interface)\n */\n unsubscribe(subscriptionId: string): void {\n this._subscriptions.delete(subscriptionId);\n this.subscriptionCallbacks.delete(subscriptionId);\n }\n\n // =============================================================================\n // WebSocket Client Management\n // =============================================================================\n\n addClient(clientId: string, ws: WebSocket) {\n this.clients.set(clientId, ws);\n\n ws.on(\"close\", () => {\n this.removeClient(clientId);\n });\n\n ws.on(\"error\", (error) => {\n console.error(\"WebSocket error for client\", clientId, error);\n this.removeClient(clientId);\n });\n }\n\n // Public method to handle messages from external sources (like main WebSocket handler)\n async handleClientMessage(clientId: string, message: WebSocketMessage, authContext?: SubscriptionAuthContext) {\n await this.handleMessage(clientId, message, authContext);\n }\n\n async removeClient(clientId: string) {\n this.clients.delete(clientId);\n\n // Remove all subscriptions, callbacks, and pending refetch timers for this client\n for (const [subscriptionId, subscription] of this._subscriptions.entries()) {\n if (subscription.clientId === clientId) {\n this._subscriptions.delete(subscriptionId);\n this.subscriptionCallbacks.delete(subscriptionId);\n\n // Cancel any pending debounced refetch timers\n for (const prefix of [\"ws_\", \"drv_\", \"wse_\", \"drve_\"]) {\n const key = `${prefix}${subscriptionId}`;\n const timer = this.refetchTimers.get(key);\n if (timer) { clearTimeout(timer); this.refetchTimers.delete(key); }\n }\n }\n }\n }\n\n private async handleMessage(clientId: string, message: WebSocketMessage, authContext?: SubscriptionAuthContext) {\n switch (message.type) {\n case \"subscribe_collection\":\n await this.handleCollectionSubscription(clientId, message.payload as RealTimeListenCollectionProps, authContext);\n break;\n case \"subscribe_entity\":\n await this.handleEntitySubscription(clientId, message.payload as RealTimeListenEntityProps, authContext);\n break;\n case \"unsubscribe\":\n await this.handleUnsubscribe(clientId, message.subscriptionId!);\n break;\n default:\n this.sendError(clientId, \"Unknown message type \" + message.type, message.subscriptionId);\n }\n }\n\n private async handleCollectionSubscription(clientId: string, request: RealTimeListenCollectionProps, authContext?: SubscriptionAuthContext) {\n const subscriptionId = request.subscriptionId;\n\n try {\n // Store subscription with full request parameters and auth context for RLS\n this._subscriptions.set(subscriptionId, {\n clientId,\n type: \"collection\",\n path: request.path,\n collectionRequest: {\n filter: request.filter,\n orderBy: request.orderBy,\n order: request.order,\n limit: request.limit,\n startAfter: request.startAfter as Record<string, unknown> | undefined,\n databaseId: request.collection?.databaseId,\n searchString: request.searchString\n },\n authContext\n });\n\n // Send initial data\n let entities;\n if (this.driver) {\n const collection = this.registry.getCollectionByPath(request.path);\n entities = await this.driver.fetchCollection({\n path: request.path,\n collection: collection,\n filter: request.filter,\n orderBy: request.orderBy,\n order: request.order,\n limit: request.limit,\n startAfter: request.startAfter,\n searchString: request.searchString\n });\n } else {\n entities = await this.entityService.fetchCollection(request.path, {\n filter: request.filter,\n orderBy: request.orderBy,\n order: request.order,\n limit: request.limit,\n startAfter: request.startAfter as Record<string, unknown> | undefined,\n databaseId: request.collection?.databaseId,\n searchString: request.searchString\n });\n }\n\n this.sendCollectionUpdate(clientId, subscriptionId, entities);\n\n } catch (error) {\n this.sendError(clientId, `Failed to subscribe to collection: ${error}`, subscriptionId);\n }\n }\n\n private async handleEntitySubscription(clientId: string, request: RealTimeListenEntityProps, authContext?: SubscriptionAuthContext) {\n const subscriptionId = request.subscriptionId;\n\n try {\n // Store subscription in memory with auth context for RLS\n this._subscriptions.set(subscriptionId, {\n clientId,\n type: \"entity\",\n path: request.path,\n entityId: request.entityId,\n authContext\n });\n\n // Send initial data\n let entity;\n if (this.driver) {\n const collection = this.registry.getCollectionByPath(request.path);\n entity = await this.driver.fetchEntity({\n path: request.path,\n entityId: request.entityId,\n collection: collection\n });\n } else {\n entity = await this.entityService.fetchEntity(\n request.path,\n request.entityId,\n request.collection?.databaseId\n );\n }\n\n this.sendEntityUpdate(clientId, subscriptionId, entity || null);\n\n } catch (error) {\n this.sendError(clientId, `Failed to subscribe to entity: ${request.path} ${request.entityId} ${error}`, subscriptionId);\n }\n }\n\n private async handleUnsubscribe(_clientId: string, subscriptionId: string) {\n this._subscriptions.delete(subscriptionId);\n this.subscriptionCallbacks.delete(subscriptionId);\n // Cancel any pending debounced refetch\n for (const prefix of [\"ws_\", \"drv_\", \"wse_\", \"drve_\"]) {\n const key = `${prefix}${subscriptionId}`;\n const timer = this.refetchTimers.get(key);\n if (timer) { clearTimeout(timer); this.refetchTimers.delete(key); }\n }\n }\n\n /**\n * Enhanced notification method that handles nested relation updates.\n * @param broadcast When true (default), also sends a pg_notify so other instances\n * pick up the change. Set to false when handling an incoming\n * cross-instance notification to avoid infinite loops.\n */\n async notifyEntityUpdate(path: string, entityId: string, entity: Entity | null, databaseId?: string, broadcast = true) {\n this.debugLog(\"🔔 [RealtimeService] notifyEntityUpdate called for path:\", path, \"entityId:\", entityId, \"isDelete:\", entity === null);\n\n // Get all paths that need to be notified - the direct path plus any parent paths\n const pathsToNotify = [path];\n\n // If this is a nested relation path (like \"posts/70/tags\"), also notify parent paths\n if (path.includes(\"/\") && path.split(\"/\").length > 1) {\n const parentPaths = this.getParentPaths(path);\n pathsToNotify.push(...parentPaths);\n this.debugLog(`🔗 [RealtimeService] Nested path detected. Will notify paths: ${pathsToNotify.join(\", \")}`);\n }\n\n // Process each path that needs notification\n for (const notifyPath of pathsToNotify) {\n await this.notifyPathUpdate(notifyPath, path, entityId, entity, databaseId);\n }\n\n // Broadcast to other instances via pg_notify (only for local mutations)\n if (broadcast && this.broadcasting) {\n try {\n await this.broadcastChange(path, entityId, databaseId);\n } catch (err) {\n console.error(\"❌ [RealtimeService] Failed to broadcast change via pg_notify:\", err);\n }\n }\n\n this.debugLog(\"🔔 [RealtimeService] notifyEntityUpdate completed for path:\", path);\n }\n\n /**\n * Notify subscriptions for a specific path\n */\n private async notifyPathUpdate(notifyPath: string, originalPath: string, entityId: string, entity: Entity | null, _databaseId?: string) {\n this.debugLog(`📡 [RealtimeService] Notifying path: ${notifyPath} (original: ${originalPath})`);\n\n // Find all relevant subscriptions for this specific path\n const allSubscriptions = Array.from(this._subscriptions.entries()).filter(([, sub]) => {\n const isPathMatch = sub.path === notifyPath;\n\n // For entity subscriptions, check if the entityId matches (only for exact path matches)\n if (sub.type === \"entity\") {\n return isPathMatch && (notifyPath === originalPath ? sub.entityId === entityId : true);\n }\n // For collection subscriptions, it's always relevant if the path matches\n if (sub.type === \"collection\") {\n return isPathMatch;\n }\n return false;\n });\n\n this.debugLog(`📡 [RealtimeService] Found ${allSubscriptions.length} subscriptions for path: ${notifyPath}`);\n\n // Separate WebSocket subscriptions from DataDriver callback subscriptions\n const webSocketSubscriptions = allSubscriptions.filter(([, sub]) =>\n sub.clientId !== \"driver\" && this.clients.has(sub.clientId)\n );\n\n const driverSubscriptions = allSubscriptions.filter(([subscriptionId, sub]) =>\n sub.clientId === \"driver\" && this.subscriptionCallbacks.has(subscriptionId)\n );\n\n // Handle WebSocket subscriptions\n for (const [subscriptionId, subscription] of webSocketSubscriptions) {\n try {\n if (subscription.type === \"entity\" && notifyPath === originalPath) {\n // Send entity update directly (only for exact path matches)\n if (entity && (entity as any).values?._rebase_invalidated) {\n this.debouncedEntityRefetch(subscriptionId, notifyPath, entityId, subscription);\n } else {\n this.sendEntityUpdate(subscription.clientId, subscriptionId, entity);\n }\n } else if (subscription.type === \"collection\" && subscription.collectionRequest) {\n // Phase 1: Send instant entity-level patch (no DB query)\n // This gives immediate cross-tab feedback\n if (!entity || !(entity as any).values?._rebase_invalidated) {\n this.sendCollectionEntityPatch(subscription.clientId, subscriptionId, entityId, entity);\n }\n\n // Phase 2: Schedule a deferred full refetch for correctness\n // Handles filter/sort changes and ensures consistency\n this.debouncedCollectionRefetch(subscriptionId, notifyPath, subscription);\n }\n } catch (error) {\n console.error(`❌ [RealtimeService] Error processing WebSocket subscription ${subscriptionId}:`, error);\n this.sendError(subscription.clientId, `Failed to process update for subscription ${subscriptionId}`, subscriptionId);\n }\n }\n\n // Handle DataDriver callback subscriptions\n for (const [subscriptionId, subscription] of driverSubscriptions) {\n try {\n const callback = this.subscriptionCallbacks.get(subscriptionId);\n if (!callback) continue;\n\n if (subscription.type === \"entity\" && notifyPath === originalPath) {\n if (entity && (entity as any).values?._rebase_invalidated) {\n this.debouncedEntityDriverRefetch(subscriptionId, notifyPath, entityId, subscription, callback);\n } else {\n // Call the callback directly with the entity (only for exact path matches)\n callback(entity);\n }\n } else if (subscription.type === \"collection\" && subscription.collectionRequest) {\n // Debounce collection refetches for DataDriver subscriptions too\n this.debouncedDriverRefetch(subscriptionId, notifyPath, subscription, callback);\n }\n } catch (error) {\n console.error(`❌ [RealtimeService] Error processing DataDriver subscription ${subscriptionId}:`, error);\n }\n }\n }\n\n /**\n * Debounce a collection refetch for a WebSocket subscription.\n * Coalesces rapid entity mutations into a single database query.\n */\n private debouncedCollectionRefetch(\n subscriptionId: string,\n notifyPath: string,\n subscription: { clientId: string; collectionRequest?: { filter?: Record<string, unknown>; orderBy?: string; order?: \"desc\" | \"asc\"; limit?: number; startAfter?: Record<string, unknown>; databaseId?: string; searchString?: string }; authContext?: SubscriptionAuthContext }\n ) {\n const timerKey = `ws_${subscriptionId}`;\n const existing = this.refetchTimers.get(timerKey);\n if (existing) clearTimeout(existing);\n\n this.refetchTimers.set(timerKey, setTimeout(async () => {\n this.refetchTimers.delete(timerKey);\n // Verify subscription still exists (client may have disconnected)\n if (!this._subscriptions.has(subscriptionId)) return;\n try {\n const entities = await this.fetchCollectionWithAuth(notifyPath, subscription.collectionRequest!, subscription.authContext);\n this.sendCollectionUpdate(subscription.clientId, subscriptionId, entities);\n } catch (error) {\n console.error(`❌ [RealtimeService] Error in debounced refetch for ${subscriptionId}:`, error);\n this.sendError(subscription.clientId, `Failed to process update for subscription ${subscriptionId}`, subscriptionId);\n }\n }, RealtimeService.REFETCH_DEBOUNCE_MS));\n }\n\n /**\n * Debounce a collection refetch for a DataDriver callback subscription.\n */\n private debouncedDriverRefetch(\n subscriptionId: string,\n notifyPath: string,\n subscription: { collectionRequest?: { filter?: Record<string, unknown>; orderBy?: string; order?: \"desc\" | \"asc\"; limit?: number; startAfter?: Record<string, unknown>; databaseId?: string; searchString?: string }; authContext?: SubscriptionAuthContext },\n callback: (data: Entity[] | Entity | null) => void\n ) {\n const timerKey = `drv_${subscriptionId}`;\n const existing = this.refetchTimers.get(timerKey);\n if (existing) clearTimeout(existing);\n\n this.refetchTimers.set(timerKey, setTimeout(async () => {\n this.refetchTimers.delete(timerKey);\n if (!this._subscriptions.has(subscriptionId)) return;\n try {\n const entities = await this.fetchCollectionWithAuth(notifyPath, subscription.collectionRequest!, subscription.authContext);\n callback(entities);\n } catch (error) {\n console.error(`❌ [RealtimeService] Error in debounced driver refetch for ${subscriptionId}:`, error);\n }\n }, RealtimeService.REFETCH_DEBOUNCE_MS));\n }\n\n /**\n * Fetch a collection with optional RLS auth context.\n * When authContext is provided, the fetch runs inside a transaction\n * with set_config calls so PostgreSQL RLS policies are enforced.\n */\n private async fetchCollectionWithAuth(\n notifyPath: string,\n collectionRequest: { filter?: Record<string, unknown>; orderBy?: string; order?: \"desc\" | \"asc\"; limit?: number; startAfter?: Record<string, unknown>; databaseId?: string; searchString?: string },\n authContext?: SubscriptionAuthContext\n ): Promise<Entity[]> {\n if (this.driver) {\n const collection = this.registry.getCollectionByPath(notifyPath);\n const fetchFn = async () => this.driver!.fetchCollection({\n path: notifyPath,\n collection: collection,\n filter: collectionRequest.filter as FetchCollectionProps[\"filter\"],\n orderBy: collectionRequest.orderBy,\n order: collectionRequest.order,\n limit: collectionRequest.limit,\n startAfter: collectionRequest.startAfter,\n searchString: collectionRequest.searchString\n });\n\n // If we have auth context, wrap in a transaction with session vars\n if (authContext) {\n return await this.db.transaction(async (tx) => {\n await tx.execute(drizzleSql`SELECT set_config('app.user_id', ${authContext.userId}, true)`);\n await tx.execute(drizzleSql`SELECT set_config('app.user_roles', ${authContext.roles.join(\",\")}, true)`);\n await tx.execute(drizzleSql`SELECT set_config('app.jwt', ${JSON.stringify({ sub: authContext.userId, roles: authContext.roles })}, true)`);\n const txEntityService = new EntityService(tx, this.registry);\n let fetchedEntities;\n if (collectionRequest.searchString) {\n fetchedEntities = await txEntityService.searchEntities(\n notifyPath,\n collectionRequest.searchString,\n {\n filter: collectionRequest.filter as import(\"@rebasepro/types\").FilterValues<string>,\n orderBy: collectionRequest.orderBy,\n order: collectionRequest.order,\n limit: collectionRequest.limit,\n databaseId: collectionRequest.databaseId\n }\n );\n } else {\n fetchedEntities = await txEntityService.fetchCollection(notifyPath, {\n filter: collectionRequest.filter as import(\"@rebasepro/types\").FilterValues<string>,\n orderBy: collectionRequest.orderBy,\n order: collectionRequest.order,\n limit: collectionRequest.limit,\n startAfter: collectionRequest.startAfter,\n databaseId: collectionRequest.databaseId\n });\n }\n\n // Re-apply `afterRead` lifecycle hooks to ensure consistent data structures\n // between the initial driver fetch and this RLS-bound refetch.\n const registryCollection = this.registry.getCollectionByPath(notifyPath);\n const resolvedCollection = collection ? { ...collection, ...registryCollection } as import(\"@rebasepro/types\").EntityCollection : registryCollection as import(\"@rebasepro/types\").EntityCollection;\n \n const callbacks = resolvedCollection?.callbacks;\n const propertyCallbacks = resolvedCollection?.properties ? buildPropertyCallbacks(resolvedCollection.properties) : undefined;\n\n if (callbacks?.afterRead || propertyCallbacks?.afterRead) {\n const contextForCallback = {\n user: { uid: authContext.userId, roles: authContext.roles },\n driver: this.driver,\n data: this.driver ? (this.driver as any).data : undefined\n } as any;\n \n return await Promise.all(fetchedEntities.map(async (entity) => {\n let processedEntity = entity;\n if (callbacks?.afterRead) {\n processedEntity = await callbacks.afterRead({\n collection: resolvedCollection,\n path: notifyPath,\n entity: processedEntity,\n context: contextForCallback\n }) ?? processedEntity;\n }\n if (propertyCallbacks?.afterRead) {\n processedEntity = await propertyCallbacks.afterRead({\n collection: resolvedCollection,\n path: notifyPath,\n entity: processedEntity,\n context: contextForCallback\n }) ?? processedEntity;\n }\n return processedEntity;\n }));\n }\n\n return fetchedEntities;\n });\n }\n\n return fetchFn();\n }\n\n // No driver — use entityService directly (no auth wrapping possible)\n if (collectionRequest.searchString) {\n return await this.entityService.searchEntities(\n notifyPath,\n collectionRequest.searchString,\n {\n filter: collectionRequest.filter as import(\"@rebasepro/types\").FilterValues<string>,\n orderBy: collectionRequest.orderBy,\n order: collectionRequest.order,\n limit: collectionRequest.limit,\n databaseId: collectionRequest.databaseId\n }\n );\n }\n return await this.entityService.fetchCollection(notifyPath, {\n filter: collectionRequest.filter as import(\"@rebasepro/types\").FilterValues<string>,\n orderBy: collectionRequest.orderBy,\n order: collectionRequest.order,\n limit: collectionRequest.limit,\n startAfter: collectionRequest.startAfter,\n databaseId: collectionRequest.databaseId\n });\n }\n\n /**\n * Debounce an entity refetch for a WebSocket subscription.\n */\n private debouncedEntityRefetch(\n subscriptionId: string,\n notifyPath: string,\n entityId: string,\n subscription: { clientId: string; authContext?: SubscriptionAuthContext }\n ) {\n const timerKey = `wse_${subscriptionId}`;\n const existing = this.refetchTimers.get(timerKey);\n if (existing) clearTimeout(existing);\n\n this.refetchTimers.set(timerKey, setTimeout(async () => {\n this.refetchTimers.delete(timerKey);\n if (!this._subscriptions.has(subscriptionId)) return;\n try {\n const entity = await this.fetchEntityWithAuth(notifyPath, entityId, subscription.authContext);\n this.sendEntityUpdate(subscription.clientId, subscriptionId, entity || null);\n } catch (error) {\n console.error(`❌ [RealtimeService] Error in debounced entity refetch for ${subscriptionId}:`, error);\n this.sendError(subscription.clientId, `Failed to process entity update for subscription ${subscriptionId}`, subscriptionId);\n }\n }, RealtimeService.REFETCH_DEBOUNCE_MS));\n }\n\n /**\n * Debounce an entity refetch for a Driver callback subscription.\n */\n private debouncedEntityDriverRefetch(\n subscriptionId: string,\n notifyPath: string,\n entityId: string,\n subscription: { clientId: string; authContext?: SubscriptionAuthContext },\n callback: (data: any) => void\n ) {\n const timerKey = `drve_${subscriptionId}`;\n const existing = this.refetchTimers.get(timerKey);\n if (existing) clearTimeout(existing);\n\n this.refetchTimers.set(timerKey, setTimeout(async () => {\n this.refetchTimers.delete(timerKey);\n if (!this._subscriptions.has(subscriptionId)) return;\n try {\n const entity = await this.fetchEntityWithAuth(notifyPath, entityId, subscription.authContext);\n callback(entity || null);\n } catch (error) {\n console.error(`❌ [RealtimeService] Error in debounced entity driver refetch for ${subscriptionId}:`, error);\n }\n }, RealtimeService.REFETCH_DEBOUNCE_MS));\n }\n\n /**\n * Fetch a single entity with optional RLS auth context.\n */\n private async fetchEntityWithAuth(\n notifyPath: string,\n entityId: string,\n authContext?: SubscriptionAuthContext\n ): Promise<Entity | undefined> {\n if (this.driver) {\n const collection = this.registry.getCollectionByPath(notifyPath);\n const fetchFn = async () => this.driver!.fetchEntity({\n path: notifyPath,\n entityId,\n collection\n });\n\n // If we have auth context, wrap in a transaction with session vars\n if (authContext) {\n return await this.db.transaction(async (tx) => {\n await tx.execute(drizzleSql`SELECT set_config('app.user_id', ${authContext.userId}, true)`);\n await tx.execute(drizzleSql`SELECT set_config('app.user_roles', ${authContext.roles.join(\",\")}, true)`);\n await tx.execute(drizzleSql`SELECT set_config('app.jwt', ${JSON.stringify({ sub: authContext.userId, roles: authContext.roles })}, true)`);\n const txEntityService = new EntityService(tx, this.registry);\n let processedEntity = await txEntityService.fetchEntity(notifyPath, entityId, collection?.databaseId);\n\n if (processedEntity) {\n const registryCollection = this.registry.getCollectionByPath(notifyPath);\n const resolvedCollection = collection ? { ...collection, ...registryCollection } as import(\"@rebasepro/types\").EntityCollection : registryCollection as import(\"@rebasepro/types\").EntityCollection;\n \n const callbacks = resolvedCollection?.callbacks;\n const propertyCallbacks = resolvedCollection?.properties ? buildPropertyCallbacks(resolvedCollection.properties) : undefined;\n\n if (callbacks?.afterRead || propertyCallbacks?.afterRead) {\n const contextForCallback = {\n user: { uid: authContext.userId, roles: authContext.roles },\n driver: this.driver,\n data: this.driver ? (this.driver as any).data : undefined\n } as any;\n \n if (callbacks?.afterRead) {\n processedEntity = await callbacks.afterRead({\n collection: resolvedCollection,\n path: notifyPath,\n entity: processedEntity,\n context: contextForCallback\n }) ?? processedEntity;\n }\n if (propertyCallbacks?.afterRead) {\n processedEntity = await propertyCallbacks.afterRead({\n collection: resolvedCollection,\n path: notifyPath,\n entity: processedEntity,\n context: contextForCallback\n }) ?? processedEntity;\n }\n }\n }\n\n return processedEntity;\n });\n }\n\n return fetchFn();\n }\n\n return await this.entityService.fetchEntity(notifyPath, entityId);\n }\n\n private sendCollectionUpdate(clientId: string, subscriptionId: string, entities: Entity[]) {\n const message: CollectionUpdateMessage = {\n type: \"collection_update\",\n subscriptionId,\n entities: entities as Entity<Record<string, unknown>>[]\n };\n this.sendMessage(clientId, message);\n }\n\n private sendEntityUpdate(clientId: string, subscriptionId: string, entity: Entity | null) {\n const message: EntityUpdateMessage = {\n type: \"entity_update\",\n subscriptionId,\n entity: entity as Entity<Record<string, unknown>> | null\n };\n this.sendMessage(clientId, message);\n }\n\n /**\n * Send a lightweight entity-level patch to a collection subscriber.\n * The client can merge this into its cached data for instant feedback.\n */\n private sendCollectionEntityPatch(clientId: string, subscriptionId: string, entityId: string, entity: Entity | null) {\n const message: CollectionEntityPatchMessage = {\n type: \"collection_entity_patch\",\n subscriptionId,\n entityId,\n entity: entity as Entity<Record<string, unknown>> | null\n };\n this.sendMessage(clientId, message);\n }\n\n private sendError(clientId: string, error: string, subscriptionId?: string) {\n console.error(\"Error handling collection subscription:\", error);\n const message = {\n type: \"error\" as const,\n subscriptionId,\n error\n };\n this.sendMessage(clientId, message);\n }\n\n private sendMessage(clientId: string, message: CollectionUpdateMessage | EntityUpdateMessage | CollectionEntityPatchMessage | { type: string; subscriptionId?: string; error?: string }) {\n const client = this.clients.get(clientId);\n if (client && client.readyState === WebSocket.OPEN) {\n client.send(JSON.stringify(message));\n }\n }\n\n /**\n * Extract parent paths from a nested path like \"posts/70/tags\"\n * Returns [\"posts\", \"posts/70\"] for the example above\n */\n private getParentPaths(path: string): string[] {\n const segments = path.split(\"/\").filter(s => s.length > 0);\n const parentPaths: string[] = [];\n\n // Build parent paths progressively\n for (let i = 1; i < segments.length; i += 2) {\n const parentPath = segments.slice(0, i).join(\"/\");\n if (parentPath) {\n parentPaths.push(parentPath);\n }\n\n // If there's an entity ID, add the path including the entity\n if (i + 1 < segments.length) {\n const pathWithEntity = segments.slice(0, i + 1).join(\"/\");\n parentPaths.push(pathWithEntity);\n }\n }\n\n return parentPaths;\n }\n // =============================================================================\n // Cross-Instance LISTEN/NOTIFY\n // =============================================================================\n\n /**\n * Enable cross-instance realtime broadcasting via Postgres LISTEN/NOTIFY.\n * Creates a dedicated pg.Client (outside the Drizzle pool) that stays\n * connected and listens for change notifications from other instances.\n *\n * This is an **optional** feature — if never called, the backend operates\n * in single-instance mode (the default, perfectly fine for most setups).\n *\n * @param connectionString Raw Postgres connection string for the LISTEN client.\n */\n async startListening(connectionString: string): Promise<void> {\n if (this.broadcasting) {\n console.warn(\"⚠️ [RealtimeService] startListening called but already listening. Ignoring.\");\n return;\n }\n\n this.listenConnectionString = connectionString;\n // Set broadcasting BEFORE connecting so that scheduleReconnect()\n // works correctly if the initial connection attempt fails.\n this.broadcasting = true;\n await this.connectListenClient();\n console.log(`📡 [RealtimeService] Cross-instance realtime enabled (instanceId: ${this.instanceId})`);\n }\n\n /**\n * Stop listening and clean up the dedicated LISTEN connection.\n */\n async stopListening(): Promise<void> {\n this.broadcasting = false;\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = undefined;\n }\n if (this.listenClient) {\n try {\n await this.listenClient.end();\n } catch { /* ignore close errors */ }\n this.listenClient = undefined;\n }\n console.log(\"📡 [RealtimeService] Cross-instance realtime disabled.\");\n }\n\n /**\n * Broadcast a change notification to other instances via pg_notify.\n * Uses the main Drizzle connection (pooled) — NOT the LISTEN client.\n */\n private async broadcastChange(path: string, entityId: string, databaseId?: string): Promise<void> {\n const payload = JSON.stringify({\n sid: this.instanceId,\n p: path,\n eid: entityId,\n db: databaseId ?? null\n });\n await this.db.execute(drizzleSql`SELECT pg_notify(${PG_NOTIFY_CHANNEL}, ${payload})`);\n }\n\n /**\n * Create and connect the dedicated LISTEN client with auto-reconnect.\n */\n private async connectListenClient(): Promise<void> {\n if (!this.listenConnectionString) return;\n\n try {\n const client = new PgClient({ connectionString: this.listenConnectionString });\n\n client.on(\"error\", (err) => {\n console.error(\"❌ [RealtimeService] LISTEN client error:\", err.message);\n this.scheduleReconnect();\n });\n\n client.on(\"end\", () => {\n if (this.broadcasting) {\n console.warn(\"⚠️ [RealtimeService] LISTEN client disconnected unexpectedly.\");\n this.scheduleReconnect();\n }\n });\n\n client.on(\"notification\", async (msg) => {\n if (!msg.payload) return;\n try {\n const { sid, p, eid, db } = JSON.parse(msg.payload) as {\n sid: string;\n p: string;\n eid: string;\n db: string | null;\n };\n\n // Skip our own notifications — already processed locally\n if (sid === this.instanceId) return;\n\n this.debugLog(`📡 [RealtimeService] Received cross-instance notification: path=${p}, entityId=${eid}, from=${sid}`);\n\n // Refetch the entity from the DB so entity subscriptions\n // receive the actual data instead of null (which the client\n // would interpret as \"deleted\").\n let entity: Entity | null = null;\n try {\n if (this.driver) {\n const collection = this.registry.getCollectionByPath(p);\n const fetched = await this.driver.fetchEntity({\n path: p,\n entityId: eid,\n collection: collection\n });\n entity = fetched ?? null;\n } else {\n const fetched = await this.entityService.fetchEntity(\n p, eid, db ?? undefined\n );\n entity = fetched ?? null;\n }\n } catch (fetchErr) {\n // If the fetch fails (e.g. entity was deleted), entity stays null\n this.debugLog(`📡 [RealtimeService] Could not refetch entity ${eid} from ${p} — treating as deleted`, fetchErr);\n }\n\n // Trigger local fan-out with broadcast=false to avoid re-broadcasting\n await this.notifyEntityUpdate(p, eid, entity, db ?? undefined, false);\n } catch (err) {\n console.error(\"❌ [RealtimeService] Error processing cross-instance notification:\", err);\n }\n });\n\n await client.connect();\n await client.query(`LISTEN ${PG_NOTIFY_CHANNEL}`);\n this.listenClient = client;\n\n this.debugLog(`📡 [RealtimeService] LISTEN client connected on channel \"${PG_NOTIFY_CHANNEL}\"`);\n } catch (err) {\n console.error(\"❌ [RealtimeService] Failed to connect LISTEN client:\", err);\n this.scheduleReconnect();\n }\n }\n\n /**\n * Schedule a reconnection attempt with a fixed 3s delay.\n */\n private scheduleReconnect(): void {\n if (!this.broadcasting || this.reconnectTimer) return;\n\n const delay = 3000; // Fixed 3s delay; simple and predictable\n this.debugLog(`📡 [RealtimeService] Scheduling LISTEN reconnect in ${delay}ms...`);\n\n this.reconnectTimer = setTimeout(async () => {\n this.reconnectTimer = undefined;\n if (!this.broadcasting) return;\n\n // Clean up old client\n if (this.listenClient) {\n try { await this.listenClient.end(); } catch { /* ignore */ }\n this.listenClient = undefined;\n }\n\n await this.connectListenClient();\n }, delay);\n }\n}\n\n/**\n * Alias for RealtimeService for consistent naming with other database implementations.\n * This allows code to use PostgresRealtimeProvider alongside future MongoRealtimeProvider, etc.\n */\nexport const PostgresRealtimeProvider = RealtimeService;\n","import { RealtimeService } from \"./services/realtimeService\";\nimport { PostgresBackendDriver } from \"./PostgresBackendDriver\";\nimport { DataDriver, DeleteEntityProps, FetchCollectionProps, FetchEntityProps, SaveEntityProps, TableMetadata, BranchInfo } from \"@rebasepro/types\";\nimport { WebSocketServer, WebSocket } from \"ws\";\nimport { Server } from \"http\";\nimport { inspect } from \"util\";\n// @ts-ignore\nimport { extractUserFromToken, AccessTokenPayload } from \"@rebasepro/server-core\";\n// @ts-ignore\nimport { AuthConfig } from \"@rebasepro/server-core\";\n\ninterface ClientSession {\n ws: WebSocket;\n user?: AccessTokenPayload;\n authenticated: boolean;\n /** Sliding window message counter for rate limiting */\n messageCount: number;\n messageWindowStart: number;\n}\n\nconst clientSessions = new Map<string, ClientSession>();\n\n/** Maximum messages per client per window */\nconst WS_RATE_LIMIT = 200;\n/** Rate limit window in milliseconds (60 seconds) */\nconst WS_RATE_WINDOW_MS = 60_000;\n\n/** Admin-only WebSocket message types */\nconst ADMIN_ONLY_TYPES = new Set([\n \"EXECUTE_SQL\",\n \"FETCH_DATABASES\",\n \"FETCH_ROLES\",\n \"FETCH_UNMAPPED_TABLES\",\n \"FETCH_TABLE_METADATA\",\n \"FETCH_CURRENT_DATABASE\",\n \"CREATE_BRANCH\",\n \"DELETE_BRANCH\",\n \"LIST_BRANCHES\"\n]);\n\n/**\n * Check if the current session belongs to an admin user.\n */\nfunction isAdminSession(session: ClientSession | undefined): boolean {\n if (!session?.user?.roles) return false;\n return session.user.roles.some((r: unknown) => {\n if (typeof r === \"string\") return r === \"admin\";\n if (r && typeof r === \"object\" && \"isAdmin\" in r) return (r as { isAdmin: boolean }).isAdmin;\n if (r && typeof r === \"object\" && \"id\" in r) return (r as { id: string }).id === \"admin\";\n return false;\n });\n}\n\nexport function createPostgresWebSocket(\n server: Server,\n realtimeService: RealtimeService,\n driver: PostgresBackendDriver,\n authConfig?: AuthConfig\n) {\n const isProduction = process.env.NODE_ENV === \"production\";\n /** Debug logger that is suppressed in production to prevent PII/data leaks */\n const wsDebug = (...args: unknown[]) => { if (!isProduction) console.debug(...args); };\n const wss = new WebSocketServer({ server });\n const requireAuth = authConfig?.requireAuth !== false && authConfig?.jwtSecret;\n\n wss.on(\"connection\", (ws) => {\n const clientId = `client_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;\n wsDebug(`WebSocket client connected: ${clientId}`);\n\n // Initialize client session\n clientSessions.set(clientId, { ws, authenticated: !requireAuth, messageCount: 0, messageWindowStart: Date.now() });\n realtimeService.addClient(clientId, ws);\n\n ws.on(\"close\", () => {\n wsDebug(`WebSocket client disconnected: ${clientId}`);\n clientSessions.delete(clientId);\n });\n\n // Route all messages through RealtimeService for unified handling\n ws.on(\"message\", async (message) => {\n let requestId: string | undefined;\n try {\n const {\n type,\n payload,\n requestId: reqId\n } = JSON.parse(message.toString());\n requestId = reqId; // Capture requestId for use in catch block\n\n wsDebug(`[WS] ${clientId} → ${type}`, requestId ? `(${requestId})` : \"\");\n\n // Handle authentication first\n // Helper: send a canonical error frame\n const sendError = (errType: \"ERROR\" | \"AUTH_ERROR\", code: string, msg: string) => {\n ws.send(JSON.stringify({\n type: errType,\n requestId,\n payload: { error: { message: msg, code } }\n }));\n };\n\n if (type === \"AUTHENTICATE\") {\n const { token } = payload || {};\n if (!token) {\n sendError(\"AUTH_ERROR\", \"INVALID_INPUT\", \"Token is required\");\n return;\n }\n\n const user = extractUserFromToken(token);\n if (user) {\n const session = clientSessions.get(clientId);\n if (session) {\n session.user = user;\n session.authenticated = true;\n }\n wsDebug(`[WS] replying AUTH_SUCCESS for requestId ${requestId}`);\n ws.send(JSON.stringify({\n type: \"AUTH_SUCCESS\",\n requestId,\n payload: { userId: user.userId, roles: user.roles }\n }));\n wsDebug(`🔐 [WebSocket Server] Client ${clientId} authenticated as ${user.userId}`);\n } else {\n wsDebug(`[WS] replying AUTH_ERROR for requestId ${requestId} (invalid token)`);\n sendError(\"AUTH_ERROR\", \"INVALID_TOKEN\", \"Invalid or expired token\");\n }\n return;\n }\n\n // Check authentication for protected operations\n if (requireAuth) {\n const session = clientSessions.get(clientId);\n if (!session?.authenticated) {\n sendError(\"ERROR\", \"UNAUTHORIZED\", \"Authentication required\");\n return;\n }\n }\n\n // Rate limiting: reject if client exceeds message limit\n {\n const session = clientSessions.get(clientId);\n if (session) {\n const now = Date.now();\n if (now - session.messageWindowStart > WS_RATE_WINDOW_MS) {\n session.messageCount = 0;\n session.messageWindowStart = now;\n }\n session.messageCount++;\n if (session.messageCount > WS_RATE_LIMIT) {\n sendError(\"ERROR\", \"RATE_LIMITED\", \"Too many requests. Please slow down.\");\n return;\n }\n }\n }\n\n // Admin-only operations require admin role\n if (ADMIN_ONLY_TYPES.has(type)) {\n const session = clientSessions.get(clientId);\n if (!isAdminSession(session)) {\n sendError(\"ERROR\", \"FORBIDDEN\", \"Admin access required for this operation\");\n return;\n }\n }\n\n // Helper to get correctly scoped delegate for the current request\n const getScopedDelegate = async () => {\n const session = clientSessions.get(clientId);\n if (session?.user && \"withAuth\" in driver && typeof (driver as unknown as Record<string, unknown>).withAuth === \"function\") {\n try {\n // Map AccessTokenPayload back to User interface for withAuth (roles are already string IDs from JWT)\n const userForAuth: Record<string, unknown> = {\n uid: session.user.userId,\n roles: session.user.roles ?? []\n };\n return await (driver as unknown as { withAuth: (user: Record<string, unknown>) => Promise<DataDriver> }).withAuth(userForAuth);\n } catch (e) {\n console.error(\"Failed to create authenticated delegate for WS request\", e);\n return driver;\n }\n }\n return driver;\n };\n\n switch (type) {\n case \"FETCH_COLLECTION\": {\n wsDebug(\"📋 [WebSocket Server] Processing FETCH_COLLECTION request\");\n const request: FetchCollectionProps = payload;\n const delegate = await getScopedDelegate();\n const entities = await delegate.fetchCollection(request);\n wsDebug(\"📋 [WebSocket Server] FETCH_COLLECTION result - entities count:\", entities.length);\n const response = {\n type: \"FETCH_COLLECTION_SUCCESS\",\n payload: { entities },\n requestId\n };\n wsDebug(\"📋 [WebSocket Server] Sending FETCH_COLLECTION_SUCCESS response\");\n ws.send(JSON.stringify(response));\n }\n break;\n\n case \"FETCH_ENTITY\": {\n wsDebug(\"📄 [WebSocket Server] Processing FETCH_ENTITY request\");\n const request: FetchEntityProps = payload;\n const delegate = await getScopedDelegate();\n const entity = await delegate.fetchEntity(request);\n wsDebug(\"📄 [WebSocket Server] FETCH_ENTITY result:\", entity);\n const response = {\n type: \"FETCH_ENTITY_SUCCESS\",\n payload: { entity },\n requestId\n };\n wsDebug(\"📄 [WebSocket Server] Sending FETCH_ENTITY_SUCCESS response\");\n ws.send(JSON.stringify(response));\n }\n break;\n\n case \"SAVE_ENTITY\": {\n wsDebug(\"💾 [WebSocket Server] Processing SAVE_ENTITY request\");\n const request: SaveEntityProps = payload;\n wsDebug(\"💾 [WebSocket Server] Saving entity with request:\", inspect(request, { depth: null, colors: true }));\n const delegate = await getScopedDelegate();\n const entity = await delegate.saveEntity(request);\n wsDebug(\"💾 [WebSocket Server] SAVE_ENTITY result:\", inspect(entity, { depth: null, colors: true }));\n const response = {\n type: \"SAVE_ENTITY_SUCCESS\",\n payload: { entity },\n requestId\n };\n wsDebug(\"💾 [WebSocket Server] Sending SAVE_ENTITY_SUCCESS response\");\n ws.send(JSON.stringify(response));\n }\n break;\n\n case \"DELETE_ENTITY\": {\n wsDebug(\"🗑️ [WebSocket Server] Processing DELETE_ENTITY request\");\n const request: DeleteEntityProps = payload;\n wsDebug(\"🗑️ [WebSocket Server] Deleting entity:\", request.entity);\n const delegate = await getScopedDelegate();\n await delegate.deleteEntity(request);\n wsDebug(\"🗑️ [WebSocket Server] DELETE_ENTITY completed successfully\");\n const response = {\n type: \"DELETE_ENTITY_SUCCESS\",\n payload: { success: true },\n requestId\n };\n wsDebug(\"🗑️ [WebSocket Server] Sending DELETE_ENTITY_SUCCESS response\");\n ws.send(JSON.stringify(response));\n }\n break;\n\n case \"CHECK_UNIQUE_FIELD\": {\n wsDebug(\"🔍 [WebSocket Server] Processing CHECK_UNIQUE_FIELD request\");\n const {\n path,\n name,\n value,\n entityId,\n collection\n } = payload;\n const delegate = await getScopedDelegate();\n const isUnique = await delegate.checkUniqueField(path, name, value, entityId, collection);\n wsDebug(\"🔍 [WebSocket Server] CHECK_UNIQUE_FIELD result:\", isUnique);\n const response = {\n type: \"CHECK_UNIQUE_FIELD_SUCCESS\",\n payload: { isUnique },\n requestId\n };\n wsDebug(\"🔍 [WebSocket Server] Sending CHECK_UNIQUE_FIELD_SUCCESS response\");\n ws.send(JSON.stringify(response));\n }\n break;\n\n\n case \"COUNT_ENTITIES\": {\n const request: FetchCollectionProps = payload;\n const delegate = await getScopedDelegate();\n const count = await delegate.countEntities!(request);\n const response = {\n type: \"COUNT_ENTITIES_SUCCESS\",\n payload: { count },\n requestId\n };\n ws.send(JSON.stringify(response));\n }\n break;\n\n case \"EXECUTE_SQL\": {\n const { sql, options } = payload;\n const delegate = await getScopedDelegate();\n const result = await (delegate as unknown as { executeSql: (sql: string, options?: { database?: string, role?: string }) => Promise<Record<string, unknown>[]> }).executeSql(sql, options);\n if (process.env.NODE_ENV !== \"production\") {\n wsDebug(`⚡ [WebSocket Server] SQL executed. Returned ${Array.isArray(result) ? result.length : 'non-array'} rows.`);\n }\n const response = {\n type: \"EXECUTE_SQL_SUCCESS\",\n payload: { result },\n requestId\n };\n ws.send(JSON.stringify(response));\n }\n break;\n\n case \"FETCH_DATABASES\": {\n wsDebug(\"📚 [WebSocket Server] Processing FETCH_DATABASES request\");\n const delegate = await getScopedDelegate();\n let databases: string[] = [];\n if (delegate.fetchAvailableDatabases) {\n databases = await delegate.fetchAvailableDatabases();\n }\n wsDebug(`📚 [WebSocket Server] Fetched ${databases.length} databases.`);\n const response = {\n type: \"FETCH_DATABASES_SUCCESS\",\n payload: { databases },\n requestId\n };\n ws.send(JSON.stringify(response));\n }\n break;\n\n case \"FETCH_ROLES\": {\n wsDebug(\"👤 [WebSocket Server] Processing FETCH_ROLES request\");\n const delegate = await getScopedDelegate();\n let roles: string[] = [];\n if (delegate.fetchAvailableRoles) {\n roles = await delegate.fetchAvailableRoles();\n }\n wsDebug(`👤 [WebSocket Server] Fetched ${roles.length} roles.`);\n const response = {\n type: \"FETCH_ROLES_SUCCESS\",\n payload: { roles },\n requestId\n };\n ws.send(JSON.stringify(response));\n }\n break;\n\n case \"FETCH_CURRENT_DATABASE\": {\n wsDebug(\"📚 [WebSocket Server] Processing FETCH_CURRENT_DATABASE request\");\n const delegate = await getScopedDelegate();\n let database: string | undefined = undefined;\n if (delegate.fetchCurrentDatabase) {\n database = await delegate.fetchCurrentDatabase();\n }\n const response = {\n type: \"FETCH_CURRENT_DATABASE_SUCCESS\",\n payload: { database },\n requestId\n };\n ws.send(JSON.stringify(response));\n }\n break;\n\n case \"FETCH_UNMAPPED_TABLES\": {\n wsDebug(\"📋 [WebSocket Server] Processing FETCH_UNMAPPED_TABLES request\");\n const delegate = await getScopedDelegate();\n let tables: string[] = [];\n if (delegate.fetchUnmappedTables) {\n tables = await delegate.fetchUnmappedTables(payload?.mappedPaths);\n }\n wsDebug(`📋 [WebSocket Server] Fetched ${tables.length} unmapped tables.`);\n const response = {\n type: \"FETCH_UNMAPPED_TABLES_SUCCESS\",\n payload: { tables },\n requestId\n };\n ws.send(JSON.stringify(response));\n }\n break;\n\n case \"FETCH_TABLE_METADATA\": {\n wsDebug(\"📋 [WebSocket Server] Processing FETCH_TABLE_METADATA request\");\n const { tableName } = payload;\n const delegate = await getScopedDelegate();\n let metadata: TableMetadata | undefined;\n if (delegate.fetchTableMetadata) {\n metadata = await delegate.fetchTableMetadata(tableName);\n }\n wsDebug(`📋 [WebSocket Server] Fetched metadata for table '${tableName}'. (${metadata?.columns?.length ?? 0} columns)`);\n const response = {\n type: \"FETCH_TABLE_METADATA_SUCCESS\",\n payload: { metadata },\n requestId\n };\n ws.send(JSON.stringify(response));\n }\n break;\n\n case \"CREATE_BRANCH\": {\n wsDebug(\"🌿 [WebSocket Server] Processing CREATE_BRANCH request\");\n const { name, options } = payload;\n const delegate = await getScopedDelegate();\n if (!delegate.admin?.createBranch) {\n sendError(\"ERROR\", \"NOT_SUPPORTED\", \"Database branching is not available. Configure adminConnectionString.\");\n break;\n }\n const branch: BranchInfo = await delegate.admin.createBranch(name, options);\n wsDebug(`🌿 [WebSocket Server] Branch created: ${branch.name}`);\n const response = {\n type: \"CREATE_BRANCH_SUCCESS\",\n payload: { branch },\n requestId\n };\n ws.send(JSON.stringify(response));\n }\n break;\n\n case \"DELETE_BRANCH\": {\n wsDebug(\"🗑️ [WebSocket Server] Processing DELETE_BRANCH request\");\n const { name: branchName } = payload;\n const delegate = await getScopedDelegate();\n if (!delegate.admin?.deleteBranch) {\n sendError(\"ERROR\", \"NOT_SUPPORTED\", \"Database branching is not available.\");\n break;\n }\n await delegate.admin.deleteBranch(branchName);\n wsDebug(`🗑️ [WebSocket Server] Branch deleted: ${branchName}`);\n const response = {\n type: \"DELETE_BRANCH_SUCCESS\",\n payload: { success: true },\n requestId\n };\n ws.send(JSON.stringify(response));\n }\n break;\n\n case \"LIST_BRANCHES\": {\n wsDebug(\"🌿 [WebSocket Server] Processing LIST_BRANCHES request\");\n const delegate = await getScopedDelegate();\n let branches: BranchInfo[] = [];\n if (delegate.admin?.listBranches) {\n branches = await delegate.admin.listBranches();\n }\n wsDebug(`🌿 [WebSocket Server] Listed ${branches.length} branches.`);\n const response = {\n type: \"LIST_BRANCHES_SUCCESS\",\n payload: { branches },\n requestId\n };\n ws.send(JSON.stringify(response));\n }\n break;\n\n // Route subscription messages to RealtimeService\n case \"subscribe_collection\":\n case \"subscribe_entity\":\n case \"unsubscribe\": {\n wsDebug(\"🔄 [WebSocket Server] Routing subscription message to RealtimeService:\", type);\n // Attach auth context from the WS session so RLS-aware refetches work\n const session = clientSessions.get(clientId);\n const authContext = session?.user\n ? { userId: session.user.userId, roles: session.user.roles ?? [] }\n : undefined;\n // Let RealtimeService handle these messages\n await realtimeService.handleClientMessage(clientId, {\n type,\n payload,\n subscriptionId: payload?.subscriptionId\n }, authContext);\n break;\n }\n\n default:\n console.error(\"❌ [WebSocket Server] Unknown message type:\", type);\n }\n } catch (error: unknown) {\n console.error(\"💥 [WebSocket Server] Error handling message:\", error);\n if (error instanceof Error) {\n console.error(\"Stack trace:\", error.stack);\n }\n const errorMessage = process.env.NODE_ENV === \"production\"\n ? \"An unexpected error occurred\"\n : (error instanceof Error ? error.message : \"An unexpected error occurred\");\n const errorResponse = {\n type: \"ERROR\",\n requestId,\n payload: {\n error: {\n message: errorMessage,\n code: \"INTERNAL_ERROR\"\n }\n }\n };\n ws.send(JSON.stringify(errorResponse));\n }\n });\n });\n}\n","import { CollectionRegistry } from \"@rebasepro/common\";\nimport type { EntityCollection } from \"@rebasepro/types\";\nimport { PgEnum, PgTable } from \"drizzle-orm/pg-core\";\nimport { Relations } from \"drizzle-orm\";\nimport { CollectionRegistryInterface } from \"../interfaces\";\nimport { getTableName } from \"@rebasepro/common\";\n\n/**\n * PostgreSQL-specific collection registry.\n * Extends the base CollectionRegistry with support for Drizzle ORM tables, enums, and relations.\n * \n * Satisfies CollectionRegistryInterface through inheritance from CollectionRegistry.\n */\nexport class PostgresCollectionRegistry extends CollectionRegistry implements CollectionRegistryInterface {\n\n private tables = new Map<string, PgTable>();\n private enums = new Map<string, PgEnum<[string, ...string[]]>>();\n private relations = new Map<string, Relations>();\n\n registerTable(table: PgTable, tableName: string) {\n this.tables.set(tableName, table);\n }\n\n getTable(tableName: string): PgTable | undefined {\n return this.tables.get(tableName);\n }\n\n /**\n * Checks if a specific collection has a registered table\n */\n hasTableForCollection(tableName: string): boolean {\n return this.tables.has(tableName);\n }\n\n /**\n * Finds collections assigned to a specific driver that do not have a registered table.\n */\n getCollectionsWithoutTables(driverId: string = \"(default)\"): EntityCollection[] {\n const collections = this.getCollections().filter(\n c => c.driver === driverId || (!c.driver && driverId === \"(default)\")\n );\n return collections.filter(c => !this.tables.has(getTableName(c)));\n }\n\n registerEnums(enums: Record<string, PgEnum<[string, ...string[]]>>) {\n Object.entries(enums).forEach(([name, value]) => this.enums.set(name, value));\n }\n\n registerRelations(relations: Record<string, Relations>) {\n Object.entries(relations).forEach(([name, value]) => this.relations.set(name, value));\n }\n\n getEnum(name: string): PgEnum<[string, ...string[]]> | undefined {\n return this.enums.get(name);\n }\n\n getRelation(name: string): Relations | undefined {\n return this.relations.get(name);\n }\n\n getAllEnums(): Record<string, PgEnum<[string, ...string[]]>> {\n return Object.fromEntries(this.enums.entries());\n }\n\n getAllRelations(): Record<string, Relations> {\n return Object.fromEntries(this.relations.entries());\n }\n\n /**\n * Get the merged schema object (tables + relations) for use with Drizzle's\n * relational query API (`db.query`).\n */\n getMergedSchema(): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [name, table] of this.tables.entries()) {\n result[name] = table;\n }\n for (const [name, relation] of this.relations.entries()) {\n result[name] = relation;\n }\n return result;\n }\n\n /**\n * Get the available Drizzle relation keys for a given collection path.\n * Maps from the collection's relation property names to the Drizzle relation names\n * defined in the schema.\n */\n getRelationKeysForCollection(collectionPath: string): string[] {\n const collection = this.getCollectionByPath(collectionPath) as import(\"@rebasepro/types\").PostgresCollection<Record<string, unknown>, import(\"@rebasepro/types\").User>;\n if (!collection?.relations) return [];\n return collection.relations.map(r => r.relationName || r.localKey || \"\").filter(Boolean);\n }\n\n}\n\n","import { sql } from \"drizzle-orm\";\nimport { NodePgDatabase } from \"drizzle-orm/node-postgres\";\n\n/**\n * Default roles to seed on first run\n */\nconst DEFAULT_ROLES = [\n {\n id: \"admin\",\n name: \"Admin\",\n is_admin: true,\n default_permissions: { read: true, create: true, edit: true, delete: true },\n config: { createCollections: true, editCollections: \"all\", deleteCollections: \"all\" }\n },\n {\n id: \"editor\",\n name: \"Editor\",\n is_admin: false,\n default_permissions: { read: true, create: true, edit: true, delete: true },\n config: { createCollections: true, editCollections: \"own\", deleteCollections: \"own\" }\n },\n {\n id: \"viewer\",\n name: \"Viewer\",\n is_admin: false,\n default_permissions: { read: true, create: false, edit: false, delete: false },\n config: null\n }\n];\n\n/**\n * Auto-create auth tables if they don't exist\n * This runs on startup to ensure the database is ready for auth\n */\nexport async function ensureAuthTablesExist(db: NodePgDatabase): Promise<void> {\n console.log(\"🔍 Checking auth tables...\");\n\n try {\n // ── Create the rebase schema ────────────────────────────────────\n await db.execute(sql`CREATE SCHEMA IF NOT EXISTS rebase`);\n\n // ── Create tables (idempotent) ──────────────────────────────────\n\n // Create users table\n await db.execute(sql`\n CREATE TABLE IF NOT EXISTS rebase.users (\n id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,\n email TEXT NOT NULL UNIQUE,\n password_hash TEXT,\n display_name TEXT,\n photo_url TEXT,\n provider TEXT DEFAULT 'email',\n google_id TEXT UNIQUE,\n created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n )\n `);\n\n // Create index on email for faster lookups\n await db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_users_email \n ON rebase.users(email)\n `);\n\n // Create index on google_id for OAuth lookups\n await db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_users_google_id \n ON rebase.users(google_id)\n `);\n\n // Create roles table\n await db.execute(sql`\n CREATE TABLE IF NOT EXISTS rebase.roles (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n is_admin BOOLEAN DEFAULT FALSE,\n default_permissions JSONB,\n collection_permissions JSONB,\n config JSONB,\n created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n )\n `);\n\n // Migration: Add collection_permissions column if it doesn't exist (for existing databases)\n await db.execute(sql`\n ALTER TABLE rebase.roles \n ADD COLUMN IF NOT EXISTS collection_permissions JSONB\n `);\n\n // Create user_roles junction table\n await db.execute(sql`\n CREATE TABLE IF NOT EXISTS rebase.user_roles (\n user_id TEXT NOT NULL REFERENCES rebase.users(id) ON DELETE CASCADE,\n role_id TEXT NOT NULL REFERENCES rebase.roles(id) ON DELETE CASCADE,\n PRIMARY KEY (user_id, role_id)\n )\n `);\n\n // Create index on user_id for faster lookups\n await db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_user_roles_user \n ON rebase.user_roles(user_id)\n `);\n\n // Create refresh tokens table (includes user_agent, ip_address, and unique constraint)\n await db.execute(sql`\n CREATE TABLE IF NOT EXISTS rebase.refresh_tokens (\n id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,\n user_id TEXT NOT NULL REFERENCES rebase.users(id) ON DELETE CASCADE,\n token_hash TEXT NOT NULL UNIQUE,\n expires_at TIMESTAMP WITH TIME ZONE NOT NULL,\n user_agent TEXT,\n ip_address TEXT,\n created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),\n CONSTRAINT unique_device_session UNIQUE (user_id, user_agent, ip_address)\n )\n `);\n\n // Create index on token_hash for faster lookups\n await db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_refresh_tokens_hash \n ON rebase.refresh_tokens(token_hash)\n `);\n\n // Create index on user_id for cleanup operations\n await db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_refresh_tokens_user \n ON rebase.refresh_tokens(user_id)\n `);\n\n // Migration: Add user_agent and ip_address to refresh tokens (for tables created before these columns existed)\n await db.execute(sql`\n ALTER TABLE rebase.refresh_tokens \n ADD COLUMN IF NOT EXISTS user_agent TEXT\n `);\n\n await db.execute(sql`\n ALTER TABLE rebase.refresh_tokens \n ADD COLUMN IF NOT EXISTS ip_address TEXT\n `);\n\n // Migration: Ensure unique_device_session constraint exists (for tables created before it was in CREATE TABLE)\n // Check if constraint already exists before attempting to add it\n const constraintCheck = await db.execute(sql`\n SELECT 1 FROM information_schema.table_constraints \n WHERE constraint_name = 'unique_device_session' \n AND table_schema = 'rebase'\n AND table_name = 'refresh_tokens'\n `);\n if (constraintCheck.rows.length === 0) {\n try {\n await db.execute(sql`\n ALTER TABLE rebase.refresh_tokens\n ADD CONSTRAINT unique_device_session UNIQUE (user_id, user_agent, ip_address)\n `);\n console.log(\"✅ Added unique_device_session constraint\");\n } catch (e: unknown) {\n const errorMessage = e instanceof Error ? e.message : String(e);\n // If there's duplicate data preventing the constraint, clean up first\n if (errorMessage.includes('could not create unique index')) {\n console.warn(\"⚠️ Duplicate sessions found, cleaning up before adding constraint...\");\n // Keep only the most recent token per user/device combo\n await db.execute(sql`\n DELETE FROM rebase.refresh_tokens a\n USING rebase.refresh_tokens b\n WHERE a.user_id = b.user_id \n AND COALESCE(a.user_agent, '') = COALESCE(b.user_agent, '')\n AND COALESCE(a.ip_address, '') = COALESCE(b.ip_address, '')\n AND a.created_at < b.created_at\n `);\n // Retry constraint creation\n await db.execute(sql`\n ALTER TABLE rebase.refresh_tokens\n ADD CONSTRAINT unique_device_session UNIQUE (user_id, user_agent, ip_address)\n `).catch((retryErr: unknown) => {\n const retryMessage = retryErr instanceof Error ? retryErr.message : String(retryErr);\n console.error(\"Failed to add unique_device_session constraint after cleanup:\", retryMessage);\n });\n } else {\n console.error(\"Constraint migration issue:\", errorMessage);\n }\n }\n }\n\n // Create password reset tokens table\n await db.execute(sql`\n CREATE TABLE IF NOT EXISTS rebase.password_reset_tokens (\n id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,\n user_id TEXT NOT NULL REFERENCES rebase.users(id) ON DELETE CASCADE,\n token_hash TEXT NOT NULL UNIQUE,\n expires_at TIMESTAMP WITH TIME ZONE NOT NULL,\n used_at TIMESTAMP WITH TIME ZONE,\n created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n )\n `);\n\n // Create index on token_hash for password reset lookups\n await db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_password_reset_tokens_hash \n ON rebase.password_reset_tokens(token_hash)\n `);\n\n // Create index on user_id for password reset cleanup\n await db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_password_reset_tokens_user \n ON rebase.password_reset_tokens(user_id)\n `);\n\n // Create app config table\n await db.execute(sql`\n CREATE TABLE IF NOT EXISTS rebase.app_config (\n key TEXT PRIMARY KEY,\n value JSONB NOT NULL,\n updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()\n )\n `);\n\n // Migration: Add email verification columns to users if they don't exist\n await db.execute(sql`\n ALTER TABLE rebase.users \n ADD COLUMN IF NOT EXISTS email_verified BOOLEAN DEFAULT FALSE\n `);\n\n await db.execute(sql`\n ALTER TABLE rebase.users \n ADD COLUMN IF NOT EXISTS email_verification_token TEXT\n `);\n\n await db.execute(sql`\n ALTER TABLE rebase.users \n ADD COLUMN IF NOT EXISTS email_verification_sent_at TIMESTAMP WITH TIME ZONE\n `);\n\n // Create the `auth` schema with Supabase-style helper functions for RLS.\n // auth.uid() → returns the current user's ID (reads app.user_id)\n // auth.jwt() → returns the full JWT claims as JSONB (reads app.jwt)\n // auth.roles() → returns comma-separated role IDs (reads app.user_roles)\n // These read from session-local config vars set per-transaction by withAuth().\n await db.execute(sql`CREATE SCHEMA IF NOT EXISTS auth`);\n\n // Use an advisory transaction lock to serialize function recreation during HMR\n // This prevents the \"tuple concurrently updated\" race condition when multiple Node \n // workers or rapid restarts attempt to CREATE OR REPLACE FUNCTION simultaneously.\n await db.transaction(async (tx) => {\n await tx.execute(sql`SELECT pg_advisory_xact_lock(hashtext('rebase_auth_functions_init'))`);\n\n await tx.execute(sql`\n CREATE OR REPLACE FUNCTION auth.uid() RETURNS text AS $$\n SELECT NULLIF(current_setting('app.user_id', true), '');\n $$ LANGUAGE sql STABLE\n `);\n\n await tx.execute(sql`\n CREATE OR REPLACE FUNCTION auth.jwt() RETURNS jsonb AS $$\n SELECT COALESCE(\n NULLIF(current_setting('app.jwt', true), ''),\n '{}'\n )::jsonb;\n $$ LANGUAGE sql STABLE\n `);\n\n await tx.execute(sql`\n CREATE OR REPLACE FUNCTION auth.roles() RETURNS text AS $$\n SELECT COALESCE(NULLIF(current_setting('app.user_roles', true), ''), '');\n $$ LANGUAGE sql STABLE\n `);\n });\n\n // Seed default roles if none exist\n await seedDefaultRoles(db);\n\n console.log(\"✅ Auth tables ready\");\n } catch (error) {\n console.error(\"❌ Failed to create auth tables:\", error);\n console.warn(\"⚠️ Continuing without creating auth tables.\");\n }\n}\n\n/**\n * Seed default roles if the roles table is empty\n */\nasync function seedDefaultRoles(db: NodePgDatabase): Promise<void> {\n // Check if any roles exist\n const result = await db.execute(sql`SELECT COUNT(*) as count FROM rebase.roles`);\n const count = parseInt((result.rows[0] as unknown as Record<string, string | number>)?.count as string || \"0\", 10);\n\n if (count > 0) {\n console.log(`📋 Found ${count} existing roles`);\n return;\n }\n\n console.log(\"🌱 Seeding default roles...\");\n\n for (const role of DEFAULT_ROLES) {\n await db.execute(sql`\n INSERT INTO rebase.roles (id, name, is_admin, default_permissions, config)\n VALUES (\n ${role.id}, \n ${role.name}, \n ${role.is_admin}, \n ${JSON.stringify(role.default_permissions)}::jsonb, \n ${role.config ? JSON.stringify(role.config) : null}::jsonb\n )\n ON CONFLICT (id) DO NOTHING\n `);\n }\n\n console.log(\"✅ Default roles created: admin, editor, viewer\");\n}\n","import { eq, sql } from \"drizzle-orm\";\nimport { NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport { users, refreshTokens, passwordResetTokens, User, NewUser } from \"../schema/auth-schema\";\nimport {\n UserRepository,\n RoleRepository,\n TokenRepository,\n AuthRepository,\n UserData,\n CreateUserData,\n RoleData,\n CreateRoleData,\n RefreshTokenInfo,\n PasswordResetTokenInfo,\n ListUsersOptions,\n PaginatedUsersResult,\n RoleData as Role\n// @ts-ignore\n} from \"@rebasepro/server-core\";\n\nexport type { Role };\n\n/**\n * PostgreSQL implementation of UserRepository.\n * Handles all user-related database operations using Drizzle ORM.\n */\nexport class UserService implements UserRepository {\n constructor(private db: NodePgDatabase) { }\n\n async createUser(data: NewUser): Promise<User> {\n const [user] = await this.db.insert(users).values(data).returning();\n return user;\n }\n\n async getUserById(id: string): Promise<User | null> {\n const [user] = await this.db.select().from(users).where(eq(users.id, id));\n return user || null;\n }\n\n async getUserByEmail(email: string): Promise<User | null> {\n const [user] = await this.db.select().from(users).where(eq(users.email, email.toLowerCase()));\n return user || null;\n }\n\n async getUserByGoogleId(googleId: string): Promise<User | null> {\n const [user] = await this.db.select().from(users).where(eq(users.googleId, googleId));\n return user || null;\n }\n\n async updateUser(id: string, data: Partial<Omit<NewUser, \"id\">>): Promise<User | null> {\n const [user] = await this.db\n .update(users)\n .set({ ...data, updatedAt: new Date() })\n .where(eq(users.id, id))\n .returning();\n return user || null;\n }\n\n async deleteUser(id: string): Promise<void> {\n await this.db.delete(users).where(eq(users.id, id));\n }\n\n async listUsers(): Promise<User[]> {\n return this.db.select().from(users);\n }\n\n async listUsersPaginated(options?: ListUsersOptions): Promise<PaginatedUsersResult> {\n const limit = options?.limit ?? 25;\n const offset = options?.offset ?? 0;\n const search = options?.search?.trim() || \"\";\n const orderBy = options?.orderBy || \"createdAt\";\n const orderDir = options?.orderDir || \"desc\";\n\n // Map camelCase field names to snake_case column names\n const columnMap: Record<string, string> = {\n email: \"email\",\n displayName: \"display_name\",\n createdAt: \"created_at\",\n updatedAt: \"updated_at\",\n provider: \"provider\"\n };\n const orderColumn = columnMap[orderBy] || \"created_at\";\n const direction = orderDir === \"asc\" ? sql`ASC` : sql`DESC`;\n\n let rows: User[];\n let total: number;\n\n if (search) {\n const pattern = `%${search}%`;\n\n const countResult = await this.db.execute(sql`\n SELECT count(*)::int as total FROM rebase.users\n WHERE email ILIKE ${pattern} OR display_name ILIKE ${pattern}\n `);\n total = (countResult.rows[0] as { total: number }).total;\n\n const dataResult = await this.db.execute(sql`\n SELECT * FROM rebase.users\n WHERE email ILIKE ${pattern} OR display_name ILIKE ${pattern}\n ORDER BY ${sql.raw(orderColumn)} ${direction}\n LIMIT ${limit} OFFSET ${offset}\n `);\n rows = dataResult.rows as User[];\n } else {\n const countResult = await this.db.execute(sql`\n SELECT count(*)::int as total FROM rebase.users\n `);\n total = (countResult.rows[0] as { total: number }).total;\n\n const dataResult = await this.db.execute(sql`\n SELECT * FROM rebase.users\n ORDER BY ${sql.raw(orderColumn)} ${direction}\n LIMIT ${limit} OFFSET ${offset}\n `);\n rows = dataResult.rows as User[];\n }\n\n // Map snake_case rows to camelCase UserData\n const mappedUsers: User[] = rows.map((row: Record<string, any>) => ({\n id: row.id,\n email: row.email,\n passwordHash: row.password_hash ?? row.passwordHash ?? null,\n displayName: row.display_name ?? row.displayName ?? null,\n photoUrl: row.photo_url ?? row.photoUrl ?? null,\n provider: row.provider,\n googleId: row.google_id ?? row.googleId ?? null,\n emailVerified: row.email_verified ?? row.emailVerified ?? false,\n emailVerificationToken: row.email_verification_token ?? row.emailVerificationToken ?? null,\n emailVerificationSentAt: row.email_verification_sent_at ?? row.emailVerificationSentAt ?? null,\n createdAt: row.created_at ?? row.createdAt,\n updatedAt: row.updated_at ?? row.updatedAt\n })) as User[];\n\n return { users: mappedUsers, total, limit, offset };\n }\n\n /**\n * Update user's password hash\n */\n async updatePassword(id: string, passwordHash: string): Promise<void> {\n await this.db\n .update(users)\n .set({ passwordHash, updatedAt: new Date() })\n .where(eq(users.id, id));\n }\n\n /**\n * Set email verification status\n */\n async setEmailVerified(id: string, verified: boolean): Promise<void> {\n await this.db\n .update(users)\n .set({\n emailVerified: verified,\n emailVerificationToken: null,\n updatedAt: new Date()\n })\n .where(eq(users.id, id));\n }\n\n /**\n * Set email verification token\n */\n async setVerificationToken(id: string, token: string | null): Promise<void> {\n await this.db\n .update(users)\n .set({\n emailVerificationToken: token,\n emailVerificationSentAt: token ? new Date() : null,\n updatedAt: new Date()\n })\n .where(eq(users.id, id));\n }\n\n /**\n * Find user by email verification token\n */\n async getUserByVerificationToken(token: string): Promise<User | null> {\n const [user] = await this.db\n .select()\n .from(users)\n .where(eq(users.emailVerificationToken, token));\n return user || null;\n }\n\n /**\n * Get roles for a user from database\n */\n async getUserRoles(userId: string): Promise<Role[]> {\n const result = await this.db.execute(sql`\n SELECT r.id, r.name, r.is_admin, r.default_permissions, r.collection_permissions, r.config\n FROM rebase.roles r\n INNER JOIN rebase.user_roles ur ON r.id = ur.role_id\n WHERE ur.user_id = ${userId}\n `);\n\n return (result.rows as Array<{ id: string; name: string; is_admin: boolean; default_permissions: Record<string, boolean> | null; collection_permissions: Record<string, Record<string, boolean>> | null; config: Record<string, unknown> | null }>).map(row => ({\n id: row.id,\n name: row.name,\n isAdmin: row.is_admin,\n defaultPermissions: row.default_permissions,\n collectionPermissions: row.collection_permissions,\n config: row.config\n }));\n }\n\n /**\n * Get role IDs for a user\n */\n async getUserRoleIds(userId: string): Promise<string[]> {\n const roles = await this.getUserRoles(userId);\n return roles.map(r => r.id);\n }\n\n /**\n * Set roles for a user\n */\n async setUserRoles(userId: string, roleIds: string[]): Promise<void> {\n // Delete existing roles\n await this.db.execute(sql`DELETE FROM rebase.user_roles WHERE user_id = ${userId}`);\n\n // Insert new roles\n for (const roleId of roleIds) {\n await this.db.execute(sql`\n INSERT INTO rebase.user_roles (user_id, role_id)\n VALUES (${userId}, ${roleId})\n ON CONFLICT DO NOTHING\n `);\n }\n }\n\n /**\n * Assign a specific role to new user\n */\n async assignDefaultRole(userId: string, roleId: string): Promise<void> {\n await this.db.execute(sql`\n INSERT INTO rebase.user_roles (user_id, role_id)\n VALUES (${userId}, ${roleId})\n ON CONFLICT DO NOTHING\n `);\n }\n\n /**\n * Get user with their roles\n */\n async getUserWithRoles(userId: string): Promise<{ user: User; roles: Role[] } | null> {\n const user = await this.getUserById(userId);\n if (!user) return null;\n\n const roles = await this.getUserRoles(userId);\n return { user, roles };\n }\n}\n\n/**\n * PostgreSQL implementation of RoleRepository.\n * Handles all role-related database operations using Drizzle ORM.\n */\nexport class RoleService implements RoleRepository {\n constructor(private db: NodePgDatabase) { }\n\n async getRoleById(id: string): Promise<Role | null> {\n const result = await this.db.execute(sql`\n SELECT id, name, is_admin, default_permissions, collection_permissions, config\n FROM rebase.roles\n WHERE id = ${id}\n `);\n\n if (result.rows.length === 0) return null;\n\n const row = result.rows[0] as { id: string; name: string; is_admin: boolean; default_permissions: Record<string, boolean> | null; collection_permissions: Record<string, Record<string, boolean>> | null; config: Record<string, unknown> | null };\n return {\n id: row.id,\n name: row.name,\n isAdmin: row.is_admin,\n defaultPermissions: row.default_permissions,\n collectionPermissions: row.collection_permissions,\n config: row.config\n };\n }\n\n async listRoles(): Promise<Role[]> {\n const result = await this.db.execute(sql`\n SELECT id, name, is_admin, default_permissions, collection_permissions, config\n FROM rebase.roles\n ORDER BY name\n `);\n\n return (result.rows as Array<{ id: string; name: string; is_admin: boolean; default_permissions: Record<string, boolean> | null; collection_permissions: Record<string, Record<string, boolean>> | null; config: Record<string, unknown> | null }>).map(row => ({\n id: row.id,\n name: row.name,\n isAdmin: row.is_admin,\n defaultPermissions: row.default_permissions,\n collectionPermissions: row.collection_permissions,\n config: row.config\n }));\n }\n\n async createRole(data: Omit<Role, \"isAdmin\" | \"collectionPermissions\"> & { isAdmin?: boolean; collectionPermissions?: Role[\"collectionPermissions\"] }): Promise<Role> {\n const result = await this.db.execute(sql`\n INSERT INTO rebase.roles (id, name, is_admin, default_permissions, collection_permissions, config)\n VALUES (\n ${data.id},\n ${data.name},\n ${data.isAdmin ?? false},\n ${data.defaultPermissions ? JSON.stringify(data.defaultPermissions) : null}::jsonb,\n ${data.collectionPermissions ? JSON.stringify(data.collectionPermissions) : null}::jsonb,\n ${data.config ? JSON.stringify(data.config) : null}::jsonb\n )\n RETURNING id, name, is_admin, default_permissions, collection_permissions, config\n `);\n\n const row = result.rows[0] as { id: string; name: string; is_admin: boolean; default_permissions: Record<string, boolean> | null; collection_permissions: Record<string, Record<string, boolean>> | null; config: Record<string, unknown> | null };\n return {\n id: row.id,\n name: row.name,\n isAdmin: row.is_admin,\n defaultPermissions: row.default_permissions,\n collectionPermissions: row.collection_permissions,\n config: row.config\n };\n }\n\n async updateRole(id: string, data: Partial<Omit<Role, \"id\">>): Promise<Role | null> {\n // For now, use simpler approach\n const existing = await this.getRoleById(id);\n if (!existing) return null;\n\n await this.db.execute(sql`\n UPDATE rebase.roles \n SET \n name = ${data.name ?? existing.name},\n is_admin = ${data.isAdmin ?? existing.isAdmin},\n default_permissions = ${data.defaultPermissions ? JSON.stringify(data.defaultPermissions) : JSON.stringify(existing.defaultPermissions)}::jsonb,\n collection_permissions = ${data.collectionPermissions !== undefined ? (data.collectionPermissions ? JSON.stringify(data.collectionPermissions) : null) : (existing.collectionPermissions ? JSON.stringify(existing.collectionPermissions) : null)}::jsonb,\n config = ${data.config ? JSON.stringify(data.config) : (existing.config ? JSON.stringify(existing.config) : null)}::jsonb\n WHERE id = ${id}\n `);\n\n return this.getRoleById(id);\n }\n\n async deleteRole(id: string): Promise<void> {\n await this.db.execute(sql`DELETE FROM rebase.roles WHERE id = ${id}`);\n }\n}\n\nexport class RefreshTokenService {\n constructor(private db: NodePgDatabase) { }\n\n async createToken(userId: string, tokenHash: string, expiresAt: Date, userAgent?: string, ipAddress?: string): Promise<void> {\n // Fallback to empty string because UNIQUE constraints treat NULLs as strictly distinct in standard Postgres.\n // We want (userId, NULL, NULL) to collide and overwrite, so we map undefined/null to empty strings.\n const safeUserAgent = userAgent || \"\";\n const safeIpAddress = ipAddress || \"\";\n\n // Delete any existing session for this user/device combo, then insert.\n // This approach doesn't require the unique_device_session constraint to exist.\n await this.db.execute(sql`\n DELETE FROM rebase.refresh_tokens \n WHERE user_id = ${userId} \n AND user_agent = ${safeUserAgent} \n AND ip_address = ${safeIpAddress}\n `);\n\n await this.db.insert(refreshTokens)\n .values({\n userId,\n tokenHash,\n expiresAt,\n userAgent: safeUserAgent,\n ipAddress: safeIpAddress\n });\n }\n\n async findByHash(tokenHash: string): Promise<RefreshTokenInfo | null> {\n const [token] = await this.db\n .select({\n id: refreshTokens.id,\n userId: refreshTokens.userId,\n tokenHash: refreshTokens.tokenHash,\n expiresAt: refreshTokens.expiresAt,\n createdAt: refreshTokens.createdAt,\n userAgent: refreshTokens.userAgent,\n ipAddress: refreshTokens.ipAddress\n })\n .from(refreshTokens)\n .where(eq(refreshTokens.tokenHash, tokenHash));\n\n return token || null;\n }\n\n async deleteByHash(tokenHash: string): Promise<void> {\n await this.db.delete(refreshTokens).where(eq(refreshTokens.tokenHash, tokenHash));\n }\n\n async deleteAllForUser(userId: string): Promise<void> {\n await this.db.delete(refreshTokens).where(eq(refreshTokens.userId, userId));\n }\n\n async listForUser(userId: string): Promise<RefreshTokenInfo[]> {\n const tokens = await this.db\n .select({\n id: refreshTokens.id,\n userId: refreshTokens.userId,\n tokenHash: refreshTokens.tokenHash,\n expiresAt: refreshTokens.expiresAt,\n createdAt: refreshTokens.createdAt,\n userAgent: refreshTokens.userAgent,\n ipAddress: refreshTokens.ipAddress\n })\n .from(refreshTokens)\n .where(eq(refreshTokens.userId, userId))\n .orderBy(refreshTokens.createdAt);\n\n return tokens;\n }\n\n async deleteById(id: string, userId: string): Promise<void> {\n await this.db.delete(refreshTokens)\n .where(sql`${refreshTokens.id} = ${id} AND ${refreshTokens.userId} = ${userId}`);\n }\n}\n\n/**\n * Password reset token service\n */\nexport class PasswordResetTokenService {\n constructor(private db: NodePgDatabase) { }\n\n /**\n * Create a password reset token\n */\n async createToken(userId: string, tokenHash: string, expiresAt: Date): Promise<void> {\n // Delete any existing unused tokens for this user\n await this.db.execute(sql`\n DELETE FROM rebase.password_reset_tokens \n WHERE user_id = ${userId} AND used_at IS NULL\n `);\n\n await this.db.insert(passwordResetTokens).values({\n userId,\n tokenHash,\n expiresAt\n });\n }\n\n /**\n * Find a valid (not expired, not used) token by hash\n */\n async findValidByHash(tokenHash: string): Promise<{ userId: string; expiresAt: Date } | null> {\n const [token] = await this.db\n .select({\n userId: passwordResetTokens.userId,\n expiresAt: passwordResetTokens.expiresAt\n })\n .from(passwordResetTokens)\n .where(eq(passwordResetTokens.tokenHash, tokenHash));\n\n if (!token) return null;\n\n // Check if expired or used\n const result = await this.db.execute(sql`\n SELECT user_id, expires_at \n FROM rebase.password_reset_tokens \n WHERE token_hash = ${tokenHash} \n AND used_at IS NULL \n AND expires_at > NOW()\n `);\n\n if (result.rows.length === 0) return null;\n\n const row = result.rows[0] as { user_id: string; expires_at: string | number | Date };\n return {\n userId: row.user_id,\n expiresAt: new Date(row.expires_at)\n };\n }\n\n /**\n * Mark token as used\n */\n async markAsUsed(tokenHash: string): Promise<void> {\n await this.db\n .update(passwordResetTokens)\n .set({ usedAt: new Date() })\n .where(eq(passwordResetTokens.tokenHash, tokenHash));\n }\n\n /**\n * Delete all tokens for a user\n */\n async deleteAllForUser(userId: string): Promise<void> {\n await this.db.delete(passwordResetTokens).where(eq(passwordResetTokens.userId, userId));\n }\n\n /**\n * Clean up expired tokens\n */\n async deleteExpired(): Promise<void> {\n await this.db.execute(sql`\n DELETE FROM rebase.password_reset_tokens \n WHERE expires_at < NOW()\n `);\n }\n}\n\n/**\n * PostgreSQL implementation of TokenRepository.\n * Combines refresh token and password reset token operations.\n */\nexport class PostgresTokenRepository implements TokenRepository {\n private refreshTokenService: RefreshTokenService;\n private passwordResetTokenService: PasswordResetTokenService;\n\n constructor(private db: NodePgDatabase) {\n this.refreshTokenService = new RefreshTokenService(db);\n this.passwordResetTokenService = new PasswordResetTokenService(db);\n }\n\n // Refresh token operations\n\n async createRefreshToken(userId: string, tokenHash: string, expiresAt: Date, userAgent?: string, ipAddress?: string): Promise<void> {\n await this.refreshTokenService.createToken(userId, tokenHash, expiresAt, userAgent, ipAddress);\n }\n\n async findRefreshTokenByHash(tokenHash: string): Promise<RefreshTokenInfo | null> {\n return this.refreshTokenService.findByHash(tokenHash);\n }\n\n async deleteRefreshToken(tokenHash: string): Promise<void> {\n await this.refreshTokenService.deleteByHash(tokenHash);\n }\n\n async deleteAllRefreshTokensForUser(userId: string): Promise<void> {\n await this.refreshTokenService.deleteAllForUser(userId);\n }\n\n async listRefreshTokensForUser(userId: string): Promise<RefreshTokenInfo[]> {\n return this.refreshTokenService.listForUser(userId);\n }\n\n async deleteRefreshTokenById(id: string, userId: string): Promise<void> {\n await this.refreshTokenService.deleteById(id, userId);\n }\n\n // Password reset token operations\n\n async createPasswordResetToken(userId: string, tokenHash: string, expiresAt: Date): Promise<void> {\n await this.passwordResetTokenService.createToken(userId, tokenHash, expiresAt);\n }\n\n async findValidPasswordResetToken(tokenHash: string): Promise<PasswordResetTokenInfo | null> {\n return this.passwordResetTokenService.findValidByHash(tokenHash);\n }\n\n async markPasswordResetTokenUsed(tokenHash: string): Promise<void> {\n await this.passwordResetTokenService.markAsUsed(tokenHash);\n }\n\n async deleteAllPasswordResetTokensForUser(userId: string): Promise<void> {\n await this.passwordResetTokenService.deleteAllForUser(userId);\n }\n\n async deleteExpiredTokens(): Promise<void> {\n await this.passwordResetTokenService.deleteExpired();\n }\n}\n\n/**\n * PostgreSQL implementation of AuthRepository.\n * Combines user, role, and token repository operations.\n * This provides a convenient single-class interface for all auth operations.\n */\nexport class PostgresAuthRepository implements AuthRepository {\n private userService: UserService;\n private roleService: RoleService;\n private tokenRepository: PostgresTokenRepository;\n\n constructor(private db: NodePgDatabase) {\n this.userService = new UserService(db);\n this.roleService = new RoleService(db);\n this.tokenRepository = new PostgresTokenRepository(db);\n }\n\n // User operations (delegate to UserService)\n\n async createUser(data: CreateUserData): Promise<UserData> {\n return this.userService.createUser(data as NewUser) as Promise<UserData>;\n }\n\n async getUserById(id: string): Promise<UserData | null> {\n return this.userService.getUserById(id) as Promise<UserData | null>;\n }\n\n async getUserByEmail(email: string): Promise<UserData | null> {\n return this.userService.getUserByEmail(email) as Promise<UserData | null>;\n }\n\n async getUserByGoogleId(googleId: string): Promise<UserData | null> {\n return this.userService.getUserByGoogleId(googleId) as Promise<UserData | null>;\n }\n\n async updateUser(id: string, data: Partial<Omit<CreateUserData, \"id\">>): Promise<UserData | null> {\n return this.userService.updateUser(id, data) as Promise<UserData | null>;\n }\n\n async deleteUser(id: string): Promise<void> {\n await this.userService.deleteUser(id);\n }\n\n async listUsers(): Promise<UserData[]> {\n return this.userService.listUsers() as Promise<UserData[]>;\n }\n\n async listUsersPaginated(options?: ListUsersOptions): Promise<PaginatedUsersResult> {\n return this.userService.listUsersPaginated(options);\n }\n\n async updatePassword(id: string, passwordHash: string): Promise<void> {\n await this.userService.updatePassword(id, passwordHash);\n }\n\n async setEmailVerified(id: string, verified: boolean): Promise<void> {\n await this.userService.setEmailVerified(id, verified);\n }\n\n async setVerificationToken(id: string, token: string | null): Promise<void> {\n await this.userService.setVerificationToken(id, token);\n }\n\n async getUserByVerificationToken(token: string): Promise<UserData | null> {\n return this.userService.getUserByVerificationToken(token) as Promise<UserData | null>;\n }\n\n async getUserRoles(userId: string): Promise<RoleData[]> {\n return this.userService.getUserRoles(userId);\n }\n\n async getUserRoleIds(userId: string): Promise<string[]> {\n return this.userService.getUserRoleIds(userId);\n }\n\n async setUserRoles(userId: string, roleIds: string[]): Promise<void> {\n await this.userService.setUserRoles(userId, roleIds);\n }\n\n async assignDefaultRole(userId: string, roleId: string): Promise<void> {\n await this.userService.assignDefaultRole(userId, roleId);\n }\n\n async getUserWithRoles(userId: string): Promise<{ user: UserData; roles: RoleData[] } | null> {\n const result = await this.userService.getUserWithRoles(userId);\n return result as { user: UserData; roles: RoleData[] } | null;\n }\n\n // Role operations (delegate to RoleService)\n\n async getRoleById(id: string): Promise<RoleData | null> {\n return this.roleService.getRoleById(id);\n }\n\n async listRoles(): Promise<RoleData[]> {\n return this.roleService.listRoles();\n }\n\n async createRole(data: CreateRoleData): Promise<RoleData> {\n return this.roleService.createRole({\n ...data,\n defaultPermissions: data.defaultPermissions ?? null,\n collectionPermissions: data.collectionPermissions ?? null,\n config: data.config ?? null\n });\n }\n\n async updateRole(id: string, data: Partial<Omit<RoleData, \"id\">>): Promise<RoleData | null> {\n return this.roleService.updateRole(id, data);\n }\n\n async deleteRole(id: string): Promise<void> {\n await this.roleService.deleteRole(id);\n }\n\n // Token operations (delegate to PostgresTokenRepository)\n\n async createRefreshToken(userId: string, tokenHash: string, expiresAt: Date, userAgent?: string, ipAddress?: string): Promise<void> {\n await this.tokenRepository.createRefreshToken(userId, tokenHash, expiresAt, userAgent, ipAddress);\n }\n\n async findRefreshTokenByHash(tokenHash: string): Promise<RefreshTokenInfo | null> {\n return this.tokenRepository.findRefreshTokenByHash(tokenHash);\n }\n\n async deleteRefreshToken(tokenHash: string): Promise<void> {\n await this.tokenRepository.deleteRefreshToken(tokenHash);\n }\n\n async deleteAllRefreshTokensForUser(userId: string): Promise<void> {\n await this.tokenRepository.deleteAllRefreshTokensForUser(userId);\n }\n\n async listRefreshTokensForUser(userId: string): Promise<RefreshTokenInfo[]> {\n return this.tokenRepository.listRefreshTokensForUser(userId);\n }\n\n async deleteRefreshTokenById(id: string, userId: string): Promise<void> {\n await this.tokenRepository.deleteRefreshTokenById(id, userId);\n }\n\n async createPasswordResetToken(userId: string, tokenHash: string, expiresAt: Date): Promise<void> {\n await this.tokenRepository.createPasswordResetToken(userId, tokenHash, expiresAt);\n }\n\n async findValidPasswordResetToken(tokenHash: string): Promise<PasswordResetTokenInfo | null> {\n return this.tokenRepository.findValidPasswordResetToken(tokenHash);\n }\n\n async markPasswordResetTokenUsed(tokenHash: string): Promise<void> {\n await this.tokenRepository.markPasswordResetTokenUsed(tokenHash);\n }\n\n async deleteAllPasswordResetTokensForUser(userId: string): Promise<void> {\n await this.tokenRepository.deleteAllPasswordResetTokensForUser(userId);\n }\n\n async deleteExpiredTokens(): Promise<void> {\n await this.tokenRepository.deleteExpiredTokens();\n }\n}\n\n// =============================================================================\n// PostgreSQL Type Aliases (for consistent naming with other implementations)\n// =============================================================================\n\n/** PostgreSQL user repository implementation */\nexport type PostgresUserRepository = UserService;\n\n/** PostgreSQL role repository implementation */\nexport type PostgresRoleRepository = RoleService;\n\n","import { sql } from \"drizzle-orm\";\nimport { NodePgDatabase } from \"drizzle-orm/node-postgres\";\n\nexport interface HistoryEntry {\n id: string;\n table_name: string;\n entity_id: string;\n action: \"create\" | \"update\" | \"delete\";\n changed_fields: string[] | null;\n values: Record<string, unknown> | null;\n previous_values: Record<string, unknown> | null;\n updated_by: string | null;\n updated_at: string;\n}\n\nexport interface RecordHistoryParams {\n tableName: string;\n entityId: string;\n action: \"create\" | \"update\" | \"delete\";\n values?: Record<string, unknown> | null;\n previousValues?: Record<string, unknown> | null;\n updatedBy?: string | null;\n}\n\nexport interface FetchHistoryOptions {\n limit?: number;\n offset?: number;\n}\n\nexport interface HistoryRetentionConfig {\n /** Max entries per entity. Oldest pruned first. Default 200. */\n maxEntries: number;\n /** Entries older than this many days are pruned. Default 90. */\n ttlDays: number;\n}\n\nconst DEFAULT_RETENTION: HistoryRetentionConfig = {\n maxEntries: 200,\n ttlDays: 90\n};\n\n/**\n * Service for recording and querying entity change history.\n * Stores snapshots in the `rebase.entity_history` table.\n */\nexport class HistoryService {\n public retention: HistoryRetentionConfig;\n\n constructor(\n private db: NodePgDatabase,\n retention?: Partial<HistoryRetentionConfig>\n ) {\n this.retention = { ...DEFAULT_RETENTION, ...retention };\n }\n\n /**\n * Record a history entry for an entity change.\n * This is intentionally fire-and-forget safe — errors are logged but never\n * bubble up to block the main save/delete operation.\n *\n * After inserting, kicks off a non-blocking pruning pass for this entity.\n */\n async recordHistory(params: RecordHistoryParams): Promise<void> {\n const {\n tableName,\n entityId,\n action,\n values,\n previousValues,\n updatedBy\n } = params;\n\n const changedFields = previousValues && values\n ? findChangedFields(previousValues, values)\n : null;\n\n try {\n require('fs').appendFileSync(\n '/Users/francesco/rebase/packages/backend/history_diff.log', \n `[recordHistory: ${tableName}/${entityId} - ${action}]\\n` +\n `CHANGED FIELDS: ${JSON.stringify(changedFields)}\\n` +\n `PREVIOUS: ${JSON.stringify(previousValues, null, 2)}\\n` +\n `NEW: ${JSON.stringify(values, null, 2)}\\n\\n`\n );\n } catch (e) {\n console.error(\"DEBUG FILE WRITE ERROR:\", e);\n }\n\n // Skip recording if this is an update with zero actual changes\n if (action === \"update\" && (!changedFields || changedFields.length === 0)) {\n return;\n }\n\n try {\n await this.db.execute(sql`\n INSERT INTO rebase.entity_history \n (table_name, entity_id, action, changed_fields, \"values\", previous_values, updated_by)\n VALUES (\n ${tableName},\n ${String(entityId)},\n ${action},\n ${changedFields ? sql`ARRAY[${sql.join(changedFields.map(f => sql`${f}`), sql`, `)}]::text[]` : sql`NULL`},\n ${values ? sql`${JSON.stringify(values)}::jsonb` : sql`NULL`},\n ${previousValues ? sql`${JSON.stringify(previousValues)}::jsonb` : sql`NULL`},\n ${updatedBy ?? null}\n )\n `);\n\n // Non-blocking prune for this specific entity\n this.pruneEntity(tableName, entityId).catch(err =>\n console.error(\"History prune failed:\", err)\n );\n } catch (error) {\n console.error(\"Failed to record entity history:\", error);\n }\n }\n\n /**\n * Fetch history entries for an entity, ordered by most recent first.\n */\n async fetchHistory(\n tableName: string,\n entityId: string,\n options: FetchHistoryOptions = {}\n ): Promise<{ data: HistoryEntry[]; total: number }> {\n const limit = options.limit ?? 20;\n const offset = options.offset ?? 0;\n\n const [countResult, dataResult] = await Promise.all([\n this.db.execute(sql`\n SELECT COUNT(*) as count\n FROM rebase.entity_history\n WHERE table_name = ${tableName}\n AND entity_id = ${String(entityId)}\n `),\n this.db.execute(sql`\n SELECT id, table_name, entity_id, action, changed_fields,\n \"values\", previous_values, updated_by, updated_at\n FROM rebase.entity_history\n WHERE table_name = ${tableName}\n AND entity_id = ${String(entityId)}\n ORDER BY updated_at DESC\n LIMIT ${limit}\n OFFSET ${offset}\n `)\n ]);\n\n const total = parseInt(\n (countResult.rows[0] as Record<string, string>)?.count ?? \"0\",\n 10\n );\n\n return {\n data: dataResult.rows as unknown as HistoryEntry[],\n total\n };\n }\n\n /**\n * Fetch a single history entry by ID.\n */\n async fetchHistoryEntry(historyId: string): Promise<HistoryEntry | null> {\n const result = await this.db.execute(sql`\n SELECT id, table_name, entity_id, action, changed_fields,\n \"values\", previous_values, updated_by, updated_at\n FROM rebase.entity_history\n WHERE id = ${historyId}\n `);\n\n if (result.rows.length === 0) return null;\n return result.rows[0] as unknown as HistoryEntry;\n }\n\n // ───────── Retention / Pruning ─────────\n\n /**\n * Prune history for a single entity: enforce maxEntries and TTL.\n */\n async pruneEntity(tableName: string, entityId: string): Promise<number> {\n let deleted = 0;\n\n // 1. TTL — delete entries older than ttlDays\n const ttlResult = await this.db.execute(sql`\n DELETE FROM rebase.entity_history\n WHERE table_name = ${tableName}\n AND entity_id = ${String(entityId)}\n AND updated_at < NOW() - MAKE_INTERVAL(days => ${this.retention.ttlDays})\n `);\n deleted += ttlResult.rowCount ?? 0;\n\n // 2. Max entries — keep the newest maxEntries, delete the rest\n const maxResult = await this.db.execute(sql`\n DELETE FROM rebase.entity_history\n WHERE id IN (\n SELECT id FROM rebase.entity_history\n WHERE table_name = ${tableName}\n AND entity_id = ${String(entityId)}\n ORDER BY updated_at DESC\n OFFSET ${this.retention.maxEntries}\n )\n `);\n deleted += maxResult.rowCount ?? 0;\n\n return deleted;\n }\n\n /**\n * Global prune: enforce TTL across ALL entities in a single sweep.\n * Intended to be called periodically (e.g. once per hour or daily).\n */\n async pruneExpired(): Promise<number> {\n const result = await this.db.execute(sql`\n DELETE FROM rebase.entity_history\n WHERE updated_at < NOW() - MAKE_INTERVAL(days => ${this.retention.ttlDays})\n `);\n return result.rowCount ?? 0;\n }\n}\n\n\n/**\n * Shallow comparison to find top-level keys that changed between two objects.\n */\nexport function findChangedFields(\n oldValues: Record<string, unknown>,\n newValues: Record<string, unknown>\n): string[] | null {\n const changed: string[] = [];\n const allKeys = new Set([\n ...Object.keys(oldValues),\n ...Object.keys(newValues)\n ]);\n\n for (const key of allKeys) {\n const oldVal = oldValues[key];\n const newVal = newValues[key];\n\n // Skip internal metadata\n if (key.startsWith(\"__\")) continue;\n\n if (oldVal !== newVal) {\n // For objects/arrays, use JSON comparison\n if (\n typeof oldVal === \"object\" && oldVal !== null &&\n typeof newVal === \"object\" && newVal !== null\n ) {\n if (JSON.stringify(oldVal) !== JSON.stringify(newVal)) {\n changed.push(key);\n }\n } else {\n changed.push(key);\n }\n }\n }\n\n return changed.length > 0 ? changed : null;\n}\n","import { sql } from \"drizzle-orm\";\nimport { NodePgDatabase } from \"drizzle-orm/node-postgres\";\n\n/**\n * Auto-create the entity history table if it doesn't exist.\n * This runs on startup when history is enabled, following the same\n * pattern as `ensureAuthTablesExist`.\n */\nexport async function ensureHistoryTableExists(db: NodePgDatabase): Promise<void> {\n console.log(\"🔍 Checking entity history table...\");\n\n try {\n // Create the rebase schema (idempotent — may already exist from auth init)\n await db.execute(sql`CREATE SCHEMA IF NOT EXISTS rebase`);\n\n await db.execute(sql`\n CREATE TABLE IF NOT EXISTS rebase.entity_history (\n id TEXT PRIMARY KEY DEFAULT gen_random_uuid()::text,\n table_name TEXT NOT NULL,\n entity_id TEXT NOT NULL,\n action TEXT NOT NULL,\n changed_fields TEXT[],\n \"values\" JSONB,\n previous_values JSONB,\n updated_by TEXT,\n updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()\n )\n `);\n\n await db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_history_entity\n ON rebase.entity_history(table_name, entity_id)\n `);\n\n await db.execute(sql`\n CREATE INDEX IF NOT EXISTS idx_history_time\n ON rebase.entity_history(table_name, entity_id, updated_at DESC)\n `);\n\n console.log(\"✅ Entity history table ready\");\n } catch (error) {\n console.error(\"❌ Failed to create entity history table:\", error);\n console.warn(\"⚠️ Continuing without creating history table.\");\n }\n}\n","/**\n * PostgresBootstrapper\n *\n * Implements the `BackendBootstrapper` interface for PostgreSQL.\n * Encapsulates all Postgres-specific initialization logic that was previously\n * hardcoded inside `initializeRebaseBackend()`.\n *\n * Third-party drivers (MongoDB, MySQL, etc.) can implement their own\n * bootstrapper following this pattern and pass it to the coordinator.\n */\n\nimport { getTableName, isTable, Relations, sql } from \"drizzle-orm\";\nimport { NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport { PgEnum, PgTable } from \"drizzle-orm/pg-core\";\nimport {\n BackendBootstrapper,\n InitializedDriver,\n BootstrappedAuth,\n DatabaseAdmin,\n RealtimeProvider,\n type DataDriver,\n EntityCollection\n} from \"@rebasepro/types\";\nimport { PostgresBackendDriver } from \"./PostgresBackendDriver\";\nimport { RealtimeService } from \"./services/realtimeService\";\nimport { DatabasePoolManager } from \"./databasePoolManager\";\nimport { PostgresCollectionRegistry } from \"./collections/PostgresCollectionRegistry\";\nimport {\n configureGoogleOAuth,\n createAuthRoutes,\n createAdminRoutes,\n requireAuth,\n requireAdmin\n// @ts-ignore\n} from \"@rebasepro/server-core\";\nimport { ensureAuthTablesExist } from \"./auth/ensure-tables\";\nimport { RoleService, UserService, PostgresAuthRepository } from \"./auth/services\";\n\n// @ts-ignore\nimport { createEmailService, type EmailConfig, type EmailService } from \"@rebasepro/server-core\";\n// @ts-ignore\nimport { createHistoryRoutes } from \"@rebasepro/server-core\";\nimport { HistoryService } from \"./history/HistoryService\";\nimport { ensureHistoryTableExists } from \"./history/ensure-history-table\";\n// @ts-ignore\nimport type { AuthConfig, PostgresDriverConfig, HistoryConfig } from \"@rebasepro/server-core\";\nimport type { Hono } from \"hono\";\n// @ts-ignore\nimport type { HonoEnv } from \"@rebasepro/server-core\";\n\n/**\n * Opaque internals bag that PostgresBootstrapper stores during `initializeDriver()`\n * and re-uses in subsequent lifecycle hooks.\n */\nexport interface PostgresDriverInternals {\n db: NodePgDatabase<any>;\n registry: PostgresCollectionRegistry;\n realtimeService: RealtimeService;\n driver: PostgresBackendDriver;\n poolManager?: DatabasePoolManager;\n}\n\n/**\n * Default PostgreSQL bootstrapper.\n *\n * Use it to register Postgres with `initializeRebaseBackend()`:\n * ```typescript\n * initializeRebaseBackend({\n * ...config,\n * bootstrappers: [postgresBootstrapper()]\n * });\n * ```\n */\nexport function createPostgresBootstrapper(pgConfig: PostgresDriverConfig): BackendBootstrapper {\n return {\n type: \"postgres\",\n\n async initializeDriver(config: unknown): Promise<InitializedDriver> {\n // config is passed from coordinator, we merge it with our internal pgConfig if needed\n // Currently config from init.ts is `{ collections, collectionRegistry }`\n const { collections, collectionRegistry } = config as {\n collections?: EntityCollection[];\n collectionRegistry?: unknown;\n };\n\n // Create a fresh registry for this driver\n const registry = new PostgresCollectionRegistry();\n if (collections) {\n registry.registerMultiple(collections);\n }\n\n // Register tables\n if (pgConfig.schema?.tables) {\n Object.values(pgConfig.schema.tables).forEach((table) => {\n if (isTable(table)) {\n const tableName = getTableName(table);\n registry.registerTable(table as PgTable, tableName);\n }\n });\n }\n\n if (pgConfig.schema?.enums) registry.registerEnums(pgConfig.schema.enums as Record<string, PgEnum<any>>);\n if (pgConfig.schema?.relations) registry.registerRelations(pgConfig.schema.relations as Record<string, Relations>);\n\n // Build schema-aware Drizzle connection\n const mergedSchema: Record<string, unknown> = {\n ...pgConfig.schema?.tables,\n ...(pgConfig.schema?.relations || {})\n };\n const { drizzle: createDrizzle } = await import(\"drizzle-orm/node-postgres\");\n const rawClient = (\"$client\" in pgConfig.connection\n ? (pgConfig.connection as Record<string, unknown>).$client\n : pgConfig.connection) as import(\"pg\").Pool;\n const schemaAwareDb = createDrizzle(rawClient, { schema: mergedSchema });\n\n // Verify connection\n try {\n await schemaAwareDb.execute(sql`SELECT 1`);\n } catch (err) {\n console.error(\"❌ Failed to connect to PostgreSQL:\", err);\n console.warn(\"⚠️ Continuing without initial database verification. Drizzle/PG will attempt to connect on subsequent queries.\");\n }\n\n // Create services\n const realtimeService = new RealtimeService(schemaAwareDb, registry);\n const poolManager = pgConfig.adminConnectionString\n ? new DatabasePoolManager(pgConfig.adminConnectionString)\n : undefined;\n const driver = new PostgresBackendDriver(schemaAwareDb, realtimeService, registry, undefined, poolManager);\n realtimeService.setDataDriver(driver);\n\n // Ensure branch metadata table exists when branching is available\n if (driver.branchService) {\n try {\n await driver.branchService.ensureBranchMetadataTable();\n } catch (err) {\n console.warn(\"⚠️ Could not initialize branch metadata table:\", err);\n }\n }\n\n // Enable cross-instance realtime (opt-in)\n if (pgConfig.connectionString) {\n try {\n await realtimeService.startListening(pgConfig.connectionString);\n } catch (err) {\n console.warn(\"⚠️ Cross-instance realtime could not be started:\", err);\n }\n }\n\n const internals: PostgresDriverInternals = {\n db: schemaAwareDb,\n registry,\n realtimeService,\n driver,\n poolManager\n };\n\n return {\n driver,\n realtimeProvider: realtimeService,\n collectionRegistry: registry,\n internals,\n };\n },\n\n async initializeAuth(config: unknown, driverResult: InitializedDriver): Promise<BootstrappedAuth | undefined> {\n const authConfig = config as AuthConfig | undefined;\n if (!authConfig) return undefined;\n\n const internals = driverResult.internals as PostgresDriverInternals;\n const db = internals.db;\n\n await ensureAuthTablesExist(db);\n\n if (authConfig.google?.clientId) {\n configureGoogleOAuth(authConfig.google.clientId);\n }\n\n let emailService: EmailService | undefined;\n if (authConfig.email) {\n emailService = createEmailService(authConfig.email);\n }\n\n const userService = new UserService(db);\n const roleService = new RoleService(db);\n const authRepository = new PostgresAuthRepository(db);\n\n return { userService, roleService, emailService, authRepository };\n },\n\n async initializeHistory(config: unknown, driverResult: InitializedDriver): Promise<{ historyService: HistoryService } | undefined> {\n const historyConfig = config as HistoryConfig | boolean | undefined;\n if (!historyConfig) return undefined;\n\n const internals = driverResult.internals as PostgresDriverInternals;\n const db = internals.db;\n\n await ensureHistoryTableExists(db);\n \n const retention = typeof historyConfig === \"object\" && historyConfig !== null ? (historyConfig as { retention?: number }).retention : undefined;\n const historyService = new HistoryService(db, retention ? { ttlDays: retention } : undefined);\n\n return { historyService };\n },\n\n async initializeRealtime(_config: unknown, driverResult: InitializedDriver): Promise<RealtimeProvider | undefined> {\n const internals = driverResult.internals as PostgresDriverInternals;\n return internals.realtimeService;\n },\n\n getAdmin(driverResult: InitializedDriver): DatabaseAdmin | undefined {\n const internals = driverResult.internals as PostgresDriverInternals;\n return internals.driver.admin;\n },\n\n mountRoutes(app: unknown, basePath: string, driverResult: InitializedDriver): void {\n // The coordinator handles auth/storage/data routes.\n // This hook is for driver-specific extensions only.\n // Currently Postgres doesn't need additional routes beyond what the coordinator mounts.\n },\n\n async initializeWebsockets(server: unknown, realtimeService: RealtimeProvider, driver: DataDriver, config?: unknown): Promise<void> {\n const { createPostgresWebSocket } = await import(\"./websocket\");\n createPostgresWebSocket(\n server as import(\"http\").Server,\n realtimeService as RealtimeService,\n driver as PostgresBackendDriver,\n config as AuthConfig\n );\n }\n };\n}\n"],"names":["createPostgresDatabaseConnection","connectionString","schema","pool","Pool","max","idleTimeoutMillis","connectionTimeoutMillis","query_timeout","statement_timeout","keepAlive","keepAliveInitialDelayMillis","on","err","console","error","message","includes","warn","client","debug","db","drizzle","process","log","end","exit","isPostgresCollection","collection","driver","isFirebaseCollection","snakeCaseRegex","toSnakeCase","str","regExpMatchArray","match","map","x","toLowerCase","join","e","require","t","n","r","o","i","u","a","s","f","l","c","d","isObject","item","Array","isArray","isPlainObject","obj","proto","Object","getPrototypeOf","prototype","mergeDeep","target","source","ignoreUndefined","output","key","hasOwnProperty","call","sourceValue","outputValue","undefined","Date","getTime","newArray","maxLength","Math","length","sourceItem","targetItem","removeFunctions","v","entries","filter","_","value","reduce","b","generateForeignKeyName","name","snakeCaseName","singularName","endsWith","slice","enumToObjectEntries","enumValues","id","label","getSubcollections","childCollections","subcollections","relations","manyRelations","cardinality","overrides","hasPropertyCallbacks","properties","callbackName","property","values","callbacks","type","of","ofs","processProperties","previousValues","propsContext","result","currentValue","previousValue","Promise","all","index","prevItem","singlePropData","res","cbRes","resolve","buildPropertyCallbacks","propertyCallbacks","afterRead","props","processedValues","entity","beforeSave","keys","sanitizeRelation","relation","sourceCollection","Error","targetCollection","newRelation","relationName","slug","direction","foreignKeyOnTarget","through","joinPath","sourceName","localKey","foundForeignKey","targetRelations","targetRel","targetRelTarget","keyPrefix","inverseRelationName","isManyToManyInverse","sourceTableName","getTableName","targetTableName","table","sort","sourceColumn","targetColumn","resolveCollectionRelations","forEach","normalizedRelation","relationKey","propKey","prop","resolvePropertyRelation","propertyKey","find","rel","getTableVarName","tableName","replace","char","toUpperCase","getEnumVarName","propName","tableVar","propVar","charAt","getColumnName","fullColumn","split","pop","root","this","logic","current","isTypedArray","getTag","areArraysEqual","areDatesEqual","areErrorsEqual","areFunctionsEqual","areMapsEqual","areNumbersEqual","areObjectsEqual","arePrimitiveWrappersEqual","areRegExpsEqual","areSetsEqual","areTypedArraysEqual","areUrlsEqual","_a","listCacheClear","eq","require$$0","assocIndexOf","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","require$$1","require$$2","require$$3","require$$4","ListCache","stackClear","stackDelete","stackGet","stackHas","freeGlobal","global","Symbol","objectProto","nativeObjectToString","symToStringTag","getRawTag","objectToString","baseGetTag","funcTag","genTag","isFunction","coreJsData","isMasked","funcProto","funcToString","toSource","baseIsNative","getValue","getNative","Map","nativeCreate","hashClear","hashDelete","HASH_UNDEFINED","hashGet","hashHas","hashSet","Hash","mapCacheClear","isKeyable","getMapData","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","stackSet","require$$5","Stack","arrayEach","defineProperty","baseAssignValue","assignValue","copyObject","baseTimes","isObjectLike","argsTag","baseIsArguments","propertyIsEnumerable","isArguments","stubFalse","exports","isBuffer","MAX_SAFE_INTEGER","isIndex","isLength","arrayTag","boolTag","dateTag","errorTag","mapTag","numberTag","objectTag","regexpTag","setTag","stringTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","baseIsTypedArray","baseUnary","nodeUtil","arrayLikeKeys","isPrototype","overArg","nativeKeys","baseKeys","isArrayLike","baseAssign","nativeKeysIn","baseKeysIn","keysIn","baseAssignIn","cloneBuffer","copyArray","arrayFilter","stubArray","nativeGetSymbols","getSymbols","copySymbols","arrayPush","getPrototype","getSymbolsIn","copySymbolsIn","baseGetAllKeys","getAllKeys","getAllKeysIn","DataView","Set","WeakMap","require$$6","initCloneArray","Uint8Array","cloneArrayBuffer","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","symbolTag","initCloneByTag","baseCreate","initCloneObject","baseIsMap","isMap","baseIsSet","isSet","require$$7","require$$8","require$$9","require$$10","require$$11","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","require$$21","CLONE_DEEP_FLAG","CLONE_SYMBOLS_FLAG","baseClone","CollectionRegistry","collectionsByTableName","collectionsBySlug","rootCollections","rawCollectionsByTableName","rawCollectionsBySlug","rawRootCollections","lastRawInputSnapshot","constructor","collections","registerMultiple","reset","clear","rawSnapshot","deepEqual","normalizedCollections","normalizeCollection","raw","cloneDeep","push","normalized","set","rawSubcollections","subCollection","subIndex","_registerRecursively","register","rawCollection","has","normalizedCollection","normalizeProperties","newProperties","normalizeProperty","newProperty","arrayProp","p","oneOf","enum","stringOrNumberProperty","relationProperty","get","path","bySlug","getRaw","getCollectionByPath","collectionPath","pathSegments","rootCollectionPath","currentCollection","resolvedRelations","getCollections","from","getRawCollections","resolvePathToCollections","entityIds","entityId","subcollectionSlug","subcollection","finalCollection","convertWhereToFilter","where","operatorMap","field","rawValue","dotIndex","indexOf","op","substring","startsWith","trim","isNaN","Number","mappedOp","parseOrderBy","orderBy","parts","createDriverAccessor","params","orderParsed","entities","fetchCollection","limit","startAfter","offset","order","searchString","data","meta","total","hasMore","findById","fetchEntity","create","saveEntity","status","update","delete","deleteEntity","count","countEntities","listen","listenCollection","onUpdate","onError","listenById","listenEntity","buildRebaseData","cache","getAccessor","accessor","Proxy","_target","DrizzleConditionBuilder","buildFilterConditions","conditions","filterParam","fieldColumn","condition","buildSingleFilterCondition","column","sql","inArray","JSON","stringify","buildRelationConditions","parentEntityId","targetTable","parentTable","parentIdColumn","targetIdColumn","registry","hasThrough","hasForeignKeyOnTarget","joinConditions","whereConditions","joins","finalCondition","buildJoinPathConditions","junctionResult","buildJunctionTableConditions","buildInverseJunctionTableConditions","junctionInfo","findCorrespondingJunctionTable","simpleCondition","buildSimpleRelationCondition","joinConditionsCount","whereConditionsCount","currentTable","joinStep","reverse","fromTableName","getTableNamesFromColumns","toTableName","to","fromColName","getColumnNamesFromColumns","toColName","fromTable","getTable","toTable","joinTable","additionalJoins","buildSingleJoinCondition","currentTableName","parentTableName","for","couldBeJunctionScenario","left","right","tryBuildJunctionJoin","possibleJunctionNames","junctionName","junctionTable","sourceColName","targetColName","junctionSourceCol","junctionTargetCol","currentTableIdCol","col","primary","targetTableIdCol","targetIdCol","idCol","foreignKeyCol","inferredForeignKeyName","combineConditionsWithAnd","and","combineConditionsWithOr","or","buildSearchConditions","searchConditions","isId","ilike","buildUniqueFieldCondition","idColumn","excludeId","buildRelationQuery","baseQuery","additionalFilters","query","innerJoin","allConditions","buildRelationCountQuery","baseCountQuery","buildJoinPathCountQuery","buildJunctionCountQuery","buildInverseJunctionCountQuery","baseConditions","columns","targetCollectionRelations","correspondingRelation","PostgresConditionBuilder","getTableForCollection","getPrimaryKeys","idProps","Boolean","fieldName","colRaw","dataType","columnType","parseIdValues","idValue","primaryKeys","pk","parsed","parseInt","String","val","buildCompositeId","sanitizeAndConvertDates","toISOString","newObj","isoDateRegex","jsDateRegex","test","date","serializeDataToServer","inverseRelationUpdates","joinPathRelationUpdates","serializedValue","serializePropertyToServer","pks","newValue","currentEntityId","newTargetId","__inverseRelationUpdates","__joinPathRelationUpdates","propertyType","subKey","subValue","subProperty","parseDataFromServer","internalFKColumns","add","parsePropertyFromServer","fkValue","toString","__type","foreignKeyColumn","relatedEntities","select","targetPks","relatedEntity","sourceTable","fromColumn","toColumn","fromParts","toParts","fromCol","toCol","sourceIdField","combinedWhere","joinResults","joinResult","targetEntity","relationDef","parseFloat","parsedDate","normalizeDbValues","RelationService","fetchRelatedEntities","parentCollectionPath","options","parentCollection","fetchEntitiesUsingJoins","idInfo","idField","parentPks","parentIdInfo","parsedParentIdObj","parsedParentId","parentIdCol","$dynamic","parentIdField","results","row","parsedValues","searchCombined","countRelatedEntities","targetIdInfo","targetIdField","batchFetchRelatedEntities","parentEntityIds","_relationKey","parsedParentIds","resultMap","parentEntity","parentId","updateRelationsUsingJoins","tx","relationValues","targetEntityIds","sourceJunctionColumn","targetJunctionColumn","junctionTableName","step","columnNames","parsedTargetIds","newLinks","targetId","insert","fkCol","updateInverseRelations","sourceEntityId","sourcePks","sourceIdInfo","updateInverseJoinPathRelation","targetRelation","updateManyToManyInverseRelation","parsedSourceIdObj","parsedSourceId","parsedNewTargetIdObj","parsedNewTargetId","intermediateTables","toColumnNames","fromColumnNames","parsedTargetIdObj","parsedTargetId","newLink","updateJoinPathOneToOneRelations","updates","upd","targetFKColName","parentSourceColName","resolveJoinPathWriteMapping","parentSourceCol","targetFKCol","parentRows","parentFKValue","lastStep","currentFrom","safety","currentFromTable","prevStep","handleJunctionTableCreation","newEntityId","junctionTableInfo","parsedNewEntityIdObj","parsedNewEntityId","junctionData","EntityFetchService","relationService","getQueryBuilder","buildWithConfig","include","propertyKeys","withConfig","shouldInclude","drizzleRelName","isJunctionRelation","targetFkName","getJunctionTargetRelationName","with","_collection","drizzleResultToEntity","databaseId","idInfoArray","normalizedValues","relData","targetPath","nestedKey","nk","relId","targetValues","relObj","resolveJoinPathRelations","parsedId","promises","resolveJoinPathRelationsBatch","joinPathRelations","drizzleResultToRestRow","flat","k","nested","buildDrizzleQueryOptions","queryOpts","filterConditions","cursorConditions","buildCursorConditions","orderExpressions","orderByField","asc","desc","limitValue","cursor","startAfterOrderValue","startAfterId","gt","lt","parsedStartAfterIdObj","parsedIdObj","qb","findFirst","relationPromises","fetchEntitiesWithConditions","findMany","processEntityResults","skipRelations","entitiesWithValues","entitiesMissingRelation","relationResults","manyRelationPromises","manyRelationQueries","fetchCollectionFromPath","searchEntities","nextEntityId","countEntitiesFromPath","checkUniqueField","excludeEntityId","_databaseId","parsedExcludeId","countResult","getRelationService","fetchCollectionForRest","fetchEntitiesWithConditionsRaw","batchResults","eid","related","batchFetchManyRelatedEntities","relatedList","fetchEntityForRest","flatEntity","hasDrizzleQueryAPI","fetchWithDrizzleQuery","queryTarget","nestedObj","parentIds","batchPromises","EntityPersistService","fetchService","effectiveCollectionPath","effectiveValues","segments","rootSegment","parentIdInfoArray","__junction_table_info","targetColumnName","relevantJoinStep","targetColumnNames","existingValue","info","returningKeys","otherValues","processedData","entityData","savedId","transaction","currentId","idValues","scalarKeys","updateQuery","dataForInsert","returning","resultRow","toUserFriendlyError","finalEntity","getFetchService","collectionSlug","pgError","extractPgError","detail","constraint","code","cause","EntityService","persistService","executeSql","sqlText","env","NODE_ENV","execute","rows","getPersistService","BRANCH_DB_PREFIX","BRANCHES_TABLE","sanitizeBranchName","toBranchDbName","sanitized","BranchService","poolManager","ensureBranchMetadataTable","createBranch","dbName","sanitizedName","sourceDb","defaultDatabaseName","existing","disconnectDatabase","safeDbName","safeSourceDb","msg","now","parentDatabase","createdAt","deleteBranch","listBranches","parent_db","created_at","sizeBytes","size_bytes","getBranchInfo","sizeResult","sizeRows","PostgresBackendDriver","realtimeService","user","historyService","entityService","branchService","admin","bind","fetchAvailableDatabases","fetchAvailableRoles","fetchCurrentDatabase","fetchUnmappedTables","fetchTableMetadata","initialised","_deferNotifications","_pendingNotifications","resolveCollectionCallbacks","registryCollection","resolvedCollection","contextForCallback","fetched","context","subscriptionId","generateSubscriptionId","callbackWrapper","registerDataDriverSubscription","clientId","collectionRequest","addSubscriptionCallback","then","catch","removeSubscriptionCallback","subscriptions","updatedValues","previousValuesForHistory","savedEntity","afterSave","history","recordHistory","action","updatedBy","uid","notifyEntityUpdate","afterSaveError","beforeDelete","afterDelete","getTargetDb","databaseName","getDrizzle","database","role","targetDb","safeRole","drizzleSql","databases","datname","currentDb","unshift","idx","splice","rolname","mappedPaths","internalPrefixes","internalExact","allTables","table_name","some","prefix","junctionTables","filteredTables","mappedSet","safeName","enumColumns","data_type","enumResult","udt_name","enum_values","enumlabel","typedColumns","fkResult","foreignKeys","junctionsResult","junctions","policiesResult","policies","random","withAuth","AuthenticatedPostgresBackendDriver","delegate","withTransaction","operation","pendingNotifications","userId","userRoles","roles","normalizedRoles","rolesString","sub","txEntityService","txDelegate","notification","injectAuthContext","unsubscribe","authContext","lastEntry","lastSub","DatabasePoolManager","pools","drizzleInstances","rootConnectionString","adminConnectionString","url","URL","pathname","getPool","hasPool","shutdown","rebaseSchema","pgSchema","users","uuid","defaultRandom","primaryKey","email","varchar","notNull","unique","passwordHash","displayName","photoUrl","provider","default","googleId","emailVerified","boolean","emailVerificationToken","emailVerificationSentAt","timestamp","defaultNow","updatedAt","isAdmin","defaultPermissions","jsonb","$type","collectionPermissions","config","references","onDelete","roleId","refreshTokens","tokenHash","expiresAt","userAgent","ipAddress","uniqueDeviceSession","passwordResetTokens","usedAt","appConfig","usersRelations","many","rolesRelations","userRolesRelations","one","fields","refreshTokensRelations","passwordResetTokensRelations","getPrimaryKeyProp","idPropEntry","idProp","isNumericId","getPrimaryKeyName","isIdProperty","hasExplicitId","getDrizzleColumn","colName","columnDefinition","stringProp","enumName","sqlContent","validation","numProp","baseType","integer","dateProp","arrayOrMapProp","refProp","fkColumnName","targetTableVar","baseColumn","required","onDeleteVal","refOptionsParts","refOptions","columnDef","resolveRawSql","expression","resolved","wrapWithRoleCheck","clause","rolesArrayString","roleCondition","unwrapSql","sqlExpr","buildUsingClause","rule","using","access","ownerField","buildWithCheckClause","withCheck","generatePolicyCode","ops","operations","opIdx","policyName","generateSinglePolicyCode","mode","needsUsing","needsWithCheck","usingClause","withCheckClause","toRoles","pgRoles","generateSchema","schemaContent","hasUuid","autoValue","pgCoreImports","exportedTableVars","exportedEnumVars","exportedRelationVars","allTablesToGenerate","enumVarName","enumDbName","isJunction","tableVarName","sourceColType","targetColType","sourceId","columnString","hasIdColumn","securityRules","tableRelations","relationInfo","sourceTableVar","owningRelationName","targetRelName","drizzleRelationName","targetResolvedRelations","junctionTableVar","relVarName","tablesExport","enumsExport","relationsExport","formatTerminalText","text","codes","bold","backgroundColor","bgColors","blue","green","red","yellow","cyan","magenta","textColor","textColors","white","black","runGeneration","collectionsFilePath","outputPath","resolvedPath","stats","fs","statSync","isDirectory","files","readdirSync","file","filePath","fileUrl","pathToFileURL","href","dynamicImport","Function","module","imported","backendCollections","outputDir","dirname","fsPromises","mkdir","recursive","writeFile","main","collectionsFilePathArg","argv","arg","outputPathArg","watch","cwd","resolvedOutputPath","watcher","chokidar","persistent","ignoreInitial","event","import","PG_NOTIFY_CHANNEL","RealtimeService","EventEmitter","clients","_subscriptions","subscriptionCallbacks","instanceId","randomUUID","listenClient","listenConnectionString","broadcasting","reconnectTimer","refetchTimers","REFETCH_DEBOUNCE_MS","DEBUG","debugLog","args","setDataDriver","subscription","callback","subscribeToCollection","subscribeToEntity","addClient","ws","removeClient","handleClientMessage","handleMessage","timer","clearTimeout","handleCollectionSubscription","payload","handleEntitySubscription","handleUnsubscribe","sendError","request","sendCollectionUpdate","sendEntityUpdate","_clientId","broadcast","pathsToNotify","parentPaths","getParentPaths","notifyPath","notifyPathUpdate","broadcastChange","originalPath","allSubscriptions","isPathMatch","webSocketSubscriptions","driverSubscriptions","_rebase_invalidated","debouncedEntityRefetch","sendCollectionEntityPatch","debouncedCollectionRefetch","debouncedEntityDriverRefetch","debouncedDriverRefetch","timerKey","setTimeout","fetchCollectionWithAuth","fetchFn","fetchedEntities","processedEntity","fetchEntityWithAuth","sendMessage","readyState","WebSocket","OPEN","send","parentPath","pathWithEntity","startListening","connectListenClient","stopListening","sid","PgClient","scheduleReconnect","parse","fetchErr","connect","delay","PostgresRealtimeProvider","clientSessions","WS_RATE_LIMIT","WS_RATE_WINDOW_MS","ADMIN_ONLY_TYPES","isAdminSession","session","createPostgresWebSocket","server","authConfig","isProduction","wsDebug","wss","WebSocketServer","requireAuth","jwtSecret","authenticated","messageCount","messageWindowStart","requestId","reqId","errType","token","extractUserFromToken","getScopedDelegate","userForAuth","response","inspect","depth","colors","success","isUnique","tables","metadata","branch","branchName","branches","stack","errorMessage","errorResponse","PostgresCollectionRegistry","enums","registerTable","hasTableForCollection","getCollectionsWithoutTables","driverId","registerEnums","registerRelations","getEnum","getRelation","getAllEnums","fromEntries","getAllRelations","getMergedSchema","getRelationKeysForCollection","DEFAULT_ROLES","is_admin","default_permissions","read","edit","createCollections","editCollections","deleteCollections","ensureAuthTablesExist","constraintCheck","retryErr","retryMessage","seedDefaultRoles","UserService","createUser","getUserById","getUserByEmail","getUserByGoogleId","updateUser","deleteUser","listUsers","listUsersPaginated","search","orderDir","columnMap","orderColumn","pattern","dataResult","mappedUsers","password_hash","display_name","photo_url","google_id","email_verified","email_verification_token","email_verification_sent_at","updated_at","updatePassword","setEmailVerified","verified","setVerificationToken","getUserByVerificationToken","getUserRoles","collection_permissions","getUserRoleIds","setUserRoles","roleIds","assignDefaultRole","getUserWithRoles","RoleService","getRoleById","listRoles","createRole","updateRole","deleteRole","RefreshTokenService","createToken","safeUserAgent","safeIpAddress","findByHash","deleteByHash","deleteAllForUser","listForUser","tokens","deleteById","PasswordResetTokenService","findValidByHash","user_id","expires_at","markAsUsed","deleteExpired","PostgresTokenRepository","refreshTokenService","passwordResetTokenService","createRefreshToken","findRefreshTokenByHash","deleteRefreshToken","deleteAllRefreshTokensForUser","listRefreshTokensForUser","deleteRefreshTokenById","createPasswordResetToken","findValidPasswordResetToken","markPasswordResetTokenUsed","deleteAllPasswordResetTokensForUser","deleteExpiredTokens","PostgresAuthRepository","userService","roleService","tokenRepository","DEFAULT_RETENTION","maxEntries","ttlDays","HistoryService","retention","changedFields","findChangedFields","appendFileSync","pruneEntity","fetchHistory","fetchHistoryEntry","historyId","deleted","ttlResult","rowCount","maxResult","pruneExpired","oldValues","newValues","changed","allKeys","oldVal","newVal","ensureHistoryTableExists","createPostgresBootstrapper","pgConfig","initializeDriver","collectionRegistry","isTable","mergedSchema","createDrizzle","rawClient","connection","$client","schemaAwareDb","internals","realtimeProvider","initializeAuth","driverResult","google","configureGoogleOAuth","emailService","createEmailService","authRepository","initializeHistory","historyConfig","initializeRealtime","_config","getAdmin","mountRoutes","app","basePath","initializeWebsockets"],"mappings":"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","x_google_ignoreList":[3,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119]}
|