@warlock.js/cascade 5.1.0 → 5.2.3

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.
Files changed (99) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +4 -0
  3. package/cjs/index.cjs.map +1 -1
  4. package/esm/context/database-data-source-context.d.mts.map +1 -1
  5. package/esm/context/database-transaction-context.d.mts.map +1 -1
  6. package/esm/contracts/query-builder.contract.d.mts +13 -0
  7. package/esm/contracts/query-builder.contract.d.mts.map +1 -1
  8. package/esm/data-source/data-source-registry.d.mts.map +1 -1
  9. package/esm/data-source/data-source.d.mts.map +1 -1
  10. package/esm/database-dirty-tracker.d.mts.map +1 -1
  11. package/esm/drivers/mongodb/mongodb-blueprint.mjs.map +1 -1
  12. package/esm/drivers/mongodb/mongodb-driver.d.mts.map +1 -1
  13. package/esm/drivers/mongodb/mongodb-driver.mjs.map +1 -1
  14. package/esm/drivers/mongodb/mongodb-id-generator.mjs.map +1 -1
  15. package/esm/drivers/mongodb/mongodb-migration-driver.d.mts.map +1 -1
  16. package/esm/drivers/mongodb/mongodb-migration-driver.mjs.map +1 -1
  17. package/esm/drivers/mongodb/mongodb-query-builder.d.mts.map +1 -1
  18. package/esm/drivers/mongodb/mongodb-query-builder.mjs.map +1 -1
  19. package/esm/drivers/mongodb/mongodb-query-parser.d.mts.map +1 -1
  20. package/esm/drivers/mongodb/mongodb-query-parser.mjs.map +1 -1
  21. package/esm/drivers/mongodb/mongodb-sync-adapter.mjs.map +1 -1
  22. package/esm/drivers/postgres/postgres-blueprint.d.mts.map +1 -1
  23. package/esm/drivers/postgres/postgres-blueprint.mjs.map +1 -1
  24. package/esm/drivers/postgres/postgres-dialect.mjs.map +1 -1
  25. package/esm/drivers/postgres/postgres-driver.d.mts.map +1 -1
  26. package/esm/drivers/postgres/postgres-driver.mjs.map +1 -1
  27. package/esm/drivers/postgres/postgres-migration-driver.d.mts.map +1 -1
  28. package/esm/drivers/postgres/postgres-migration-driver.mjs.map +1 -1
  29. package/esm/drivers/postgres/postgres-query-builder.d.mts.map +1 -1
  30. package/esm/drivers/postgres/postgres-query-builder.mjs.map +1 -1
  31. package/esm/drivers/postgres/postgres-query-parser.d.mts.map +1 -1
  32. package/esm/drivers/postgres/postgres-query-parser.mjs.map +1 -1
  33. package/esm/drivers/postgres/postgres-sql-serializer.mjs.map +1 -1
  34. package/esm/drivers/postgres/postgres-sync-adapter.mjs.map +1 -1
  35. package/esm/events/model-events.d.mts.map +1 -1
  36. package/esm/events/model-events.mjs.map +1 -1
  37. package/esm/expressions/column-expressions.d.mts.map +1 -1
  38. package/esm/index.d.mts +2 -2
  39. package/esm/migration/column-builder.d.mts.map +1 -1
  40. package/esm/migration/column-helpers.d.mts.map +1 -1
  41. package/esm/migration/foreign-key-builder.d.mts.map +1 -1
  42. package/esm/migration/migration-runner.d.mts +23 -3
  43. package/esm/migration/migration-runner.d.mts.map +1 -1
  44. package/esm/migration/migration-runner.mjs.map +1 -1
  45. package/esm/migration/migration.d.mts +1 -1
  46. package/esm/migration/migration.d.mts.map +1 -1
  47. package/esm/migration/migration.mjs.map +1 -1
  48. package/esm/migration/sql-grammar.mjs.map +1 -1
  49. package/esm/model/methods/accessor-methods.mjs.map +1 -1
  50. package/esm/model/methods/delete-methods.mjs.map +1 -1
  51. package/esm/model/methods/hydration-methods.mjs.map +1 -1
  52. package/esm/model/methods/instance-event-methods.mjs.map +1 -1
  53. package/esm/model/methods/meta-methods.mjs.map +1 -1
  54. package/esm/model/methods/pivot-methods.mjs.map +1 -1
  55. package/esm/model/methods/query-methods.mjs.map +1 -1
  56. package/esm/model/methods/restore-methods.mjs.map +1 -1
  57. package/esm/model/methods/scope-methods.mjs.map +1 -1
  58. package/esm/model/methods/serialization-methods.mjs.map +1 -1
  59. package/esm/model/methods/static-event-methods.mjs.map +1 -1
  60. package/esm/model/methods/write-methods.mjs.map +1 -1
  61. package/esm/model/model.d.mts.map +1 -1
  62. package/esm/model/model.mjs.map +1 -1
  63. package/esm/model/register-model.d.mts.map +1 -1
  64. package/esm/model/register-model.mjs.map +1 -1
  65. package/esm/operations/database.mjs.map +1 -1
  66. package/esm/operations/migrations.d.mts.map +1 -1
  67. package/esm/operations/migrations.mjs.map +1 -1
  68. package/esm/query-builder/query-builder.d.mts.map +1 -1
  69. package/esm/query-builder/query-builder.mjs.map +1 -1
  70. package/esm/relations/key-conventions.mjs.map +1 -1
  71. package/esm/relations/pivot-operations.d.mts.map +1 -1
  72. package/esm/relations/pivot-operations.mjs.map +1 -1
  73. package/esm/relations/relation-loader.d.mts.map +1 -1
  74. package/esm/relations/relation-loader.mjs.map +1 -1
  75. package/esm/remover/database-remover.mjs.map +1 -1
  76. package/esm/restorer/database-restorer.mjs.map +1 -1
  77. package/esm/sync/model-sync-operation.d.mts.map +1 -1
  78. package/esm/sync/model-sync-operation.mjs.map +1 -1
  79. package/esm/sync/model-sync.d.mts.map +1 -1
  80. package/esm/sync/sync-manager.mjs.map +1 -1
  81. package/esm/utils/connect-to-database.d.mts.map +1 -1
  82. package/esm/utils/connect-to-database.mjs.map +1 -1
  83. package/esm/utils/define-model.d.mts.map +1 -1
  84. package/esm/utils/escape-regex.mjs.map +1 -1
  85. package/esm/utils/is-valid-date-value.mjs.map +1 -1
  86. package/esm/utils/sanitize-filter.d.mts.map +1 -1
  87. package/esm/validation/database-writer-validation-error.d.mts.map +1 -1
  88. package/esm/validation/database-writer-validation-error.mjs.map +1 -1
  89. package/esm/validation/mutators/embed-mutator.mjs.map +1 -1
  90. package/esm/validation/plugins/embed-validator-plugin.mjs.map +1 -1
  91. package/esm/validation/rules/database-model-rule.mjs.map +1 -1
  92. package/esm/validation/rules/exists-rule.mjs.map +1 -1
  93. package/esm/validation/rules/unique-rule.mjs.map +1 -1
  94. package/esm/writer/database-writer.d.mts.map +1 -1
  95. package/esm/writer/database-writer.mjs.map +1 -1
  96. package/llms-full.txt +2 -0
  97. package/package.json +7 -4
  98. package/skills/cascade-basics/SKILL.md +3 -1
  99. package/skills/write-migration/SKILL.md +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"sql-grammar.mjs","names":[],"sources":["../../../../../../../cascade/src/migration/sql-grammar.ts"],"sourcesContent":["import { compareCreatedAt } from \"./parse-created-at\";\r\nimport type { SQLStatementType, TaggedSQL } from \"./types\";\r\n\r\n/**\r\n * Parses and sorts SQL statements globally based on their execution phase,\r\n * and classifies statements by their semantic type.\r\n */\r\nexport class SQLGrammar {\r\n /**\r\n * Determine the execution phase of a SQL statement (1–6).\r\n *\r\n * Phase ordering ensures DDL operations run in dependency-safe order\r\n * regardless of which migration file they originate from.\r\n *\r\n * | Phase | Statements |\r\n * |-------|-----------------------------------------------|\r\n * | 1 | CREATE EXTENSION, TYPE, DOMAIN, SCHEMA |\r\n * | 2 | CREATE TABLE |\r\n * | 3 | ADD COLUMN, ADD PRIMARY KEY |\r\n * | 4 | CREATE INDEX, ADD FOREIGN KEY |\r\n * | 5 | DROP COLUMN, ALTER COLUMN, DROP TABLE |\r\n * | 6 | Raw / unclassified |\r\n *\r\n * @example\r\n * SQLGrammar.phase(\"CREATE EXTENSION IF NOT EXISTS vector\"); // => 1\r\n * SQLGrammar.phase(\"ALTER TABLE users ADD COLUMN email TEXT\"); // => 3\r\n */\r\n public static phase(sql: string): 1 | 2 | 3 | 4 | 5 | 6 {\r\n const s = sql.trim().toUpperCase();\r\n\r\n // Phase 1: Preparation (Extensions, Enums, Domains, Types)\r\n if (\r\n s.startsWith(\"CREATE EXTENSION\") ||\r\n s.startsWith(\"CREATE TYPE\") ||\r\n s.startsWith(\"CREATE DOMAIN\") ||\r\n s.startsWith(\"CREATE SCHEMA\")\r\n ) {\r\n return 1;\r\n }\r\n\r\n // Phase 2: Table Creation\r\n if (s.startsWith(\"CREATE TABLE\")) {\r\n return 2;\r\n }\r\n\r\n // Phase 3 / 4 / 5: ALTER TABLE — broken down by clause\r\n if (s.startsWith(\"ALTER TABLE\")) {\r\n if (s.includes(\"ADD CONSTRAINT\") && s.includes(\"FOREIGN KEY\")) return 4;\r\n if (s.includes(\"DROP COLUMN\") || s.includes(\"DROP CONSTRAINT\") || s.includes(\"ALTER COLUMN\")) return 5;\r\n if (s.includes(\"ADD COLUMN\")) return 3;\r\n if (s.includes(\"ADD CONSTRAINT\") && s.includes(\"PRIMARY KEY\")) return 3;\r\n }\r\n\r\n // Phase 4: Index Creation\r\n if (s.startsWith(\"CREATE INDEX\") || s.startsWith(\"CREATE UNIQUE INDEX\")) {\r\n return 4;\r\n }\r\n\r\n // Phase 5: Destructive table/index operations\r\n if (s.startsWith(\"DROP TABLE\") || s.startsWith(\"TRUNCATE TABLE\") || s.startsWith(\"DROP INDEX\")) {\r\n return 5;\r\n }\r\n\r\n // Phase 6: Raw / unclassified (DML, triggers, procedures, views)\r\n return 6;\r\n }\r\n\r\n /**\r\n * Classify a SQL statement into its semantic statement type.\r\n *\r\n * This is independent of execution phase — it identifies *what* a statement\r\n * does, not *when* it should run. Use this for pre-flight checks, dry-run\r\n * display, selective filtering, and extension detection.\r\n *\r\n * @example\r\n * SQLGrammar.classify(\"CREATE EXTENSION IF NOT EXISTS vector\");\r\n * // => \"CREATE_EXTENSION\"\r\n *\r\n * SQLGrammar.classify(\"ALTER TABLE users ADD COLUMN email TEXT\");\r\n * // => \"ADD_COLUMN\"\r\n */\r\n public static classify(sql: string): SQLStatementType {\r\n const s = sql.trim().toUpperCase();\r\n\r\n if (s.startsWith(\"CREATE EXTENSION\")) return \"CREATE_EXTENSION\";\r\n if (s.startsWith(\"CREATE SCHEMA\")) return \"CREATE_SCHEMA\";\r\n if (s.startsWith(\"CREATE TYPE\")) return \"CREATE_TYPE\";\r\n if (s.startsWith(\"CREATE DOMAIN\")) return \"CREATE_DOMAIN\";\r\n if (s.startsWith(\"CREATE TABLE\")) return \"CREATE_TABLE\";\r\n if (s.startsWith(\"DROP TABLE\")) return \"DROP_TABLE\";\r\n if (s.startsWith(\"TRUNCATE TABLE\")) return \"TRUNCATE_TABLE\";\r\n if (s.startsWith(\"DROP INDEX\")) return \"DROP_INDEX\";\r\n\r\n // Must check UNIQUE before plain INDEX to avoid misclassification\r\n if (s.startsWith(\"CREATE UNIQUE INDEX\")) return \"CREATE_UNIQUE_INDEX\";\r\n if (s.startsWith(\"CREATE INDEX\")) return \"CREATE_INDEX\";\r\n\r\n if (s.startsWith(\"ALTER TABLE\")) {\r\n if (s.includes(\"ADD CONSTRAINT\") && s.includes(\"FOREIGN KEY\")) return \"ADD_FOREIGN_KEY\";\r\n if (s.includes(\"DROP CONSTRAINT\") && s.includes(\"FOREIGN KEY\")) return \"DROP_FOREIGN_KEY\";\r\n if (s.includes(\"ADD CONSTRAINT\") && s.includes(\"PRIMARY KEY\")) return \"ADD_PRIMARY_KEY\";\r\n if (s.includes(\"DROP CONSTRAINT\")) return \"DROP_PRIMARY_KEY\";\r\n if (s.includes(\"ADD COLUMN\")) return \"ADD_COLUMN\";\r\n if (s.includes(\"DROP COLUMN\")) return \"DROP_COLUMN\";\r\n if (s.includes(\"RENAME COLUMN\")) return \"RENAME_COLUMN\";\r\n if (s.includes(\"RENAME TO\")) return \"RENAME_TABLE\";\r\n if (s.includes(\"ALTER COLUMN\")) return \"MODIFY_COLUMN\";\r\n }\r\n\r\n return \"RAW\";\r\n }\r\n\r\n /**\r\n * Extract the extension name from a CREATE EXTENSION statement.\r\n *\r\n * Returns undefined if the statement is not a CREATE EXTENSION statement\r\n * or the name cannot be parsed.\r\n *\r\n * @example\r\n * SQLGrammar.extractExtensionName(\"CREATE EXTENSION IF NOT EXISTS vector\");\r\n * // => \"vector\"\r\n *\r\n * SQLGrammar.extractExtensionName(\"CREATE EXTENSION postgis\");\r\n * // => \"postgis\"\r\n */\r\n public static extractExtensionName(sql: string): string | undefined {\r\n // Matches: CREATE EXTENSION [IF NOT EXISTS] <name>\r\n const match = sql\r\n .trim()\r\n .match(/^CREATE\\s+EXTENSION\\s+(?:IF\\s+NOT\\s+EXISTS\\s+)?(\\w+)/i);\r\n\r\n return match?.[1]?.toLowerCase();\r\n }\r\n\r\n /**\r\n * Sort an array of tagged SQL statements by phase, then creation date, then migration name.\r\n *\r\n * This is the sort that decides **execution order** — it runs across every\r\n * pending migration's statements at once, after the migration list itself\r\n * has been ordered, so whatever it decides is final.\r\n *\r\n * The creation date must go through {@link compareCreatedAt}. Parsing these\r\n * stamps with `new Date()` returns `Invalid Date` for the framework's own\r\n * `MM-DD-YYYY_HH-MM-SS` filename format, which collapsed every timestamp to\r\n * the same value and quietly handed the whole ordering to the alphabetical\r\n * tiebreaker below — running, for example, a January 2026 migration before a\r\n * December 2025 one.\r\n */\r\n public static sort(statements: TaggedSQL[]): TaggedSQL[] {\r\n return statements.slice().sort((a, b) => {\r\n // 1. Sort by Phase (ascending)\r\n if (a.phase !== b.phase) {\r\n return a.phase - b.phase;\r\n }\r\n\r\n // 2. Sort by CreatedAt (within same phase)\r\n const byCreatedAt = compareCreatedAt(a.createdAt, b.createdAt);\r\n\r\n if (byCreatedAt !== undefined) {\r\n return byCreatedAt;\r\n }\r\n\r\n // 3. Sort by Migration Name (tie-breaker)\r\n const nameA = a.migrationName || \"\";\r\n const nameB = b.migrationName || \"\";\r\n return nameA.localeCompare(nameB);\r\n });\r\n }\r\n}\r\n"],"mappings":";;;;;;;AAOA,IAAa,aAAb,MAAwB;;;;;;;;;;;;;;;;;;;;CAoBtB,OAAc,MAAM,KAAoC;EACtD,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,YAAY;EAGjC,IACE,EAAE,WAAW,kBAAkB,KAC/B,EAAE,WAAW,aAAa,KAC1B,EAAE,WAAW,eAAe,KAC5B,EAAE,WAAW,eAAe,GAE5B,OAAO;EAIT,IAAI,EAAE,WAAW,cAAc,GAC7B,OAAO;EAIT,IAAI,EAAE,WAAW,aAAa,GAAG;GAC/B,IAAI,EAAE,SAAS,gBAAgB,KAAK,EAAE,SAAS,aAAa,GAAG,OAAO;GACtE,IAAI,EAAE,SAAS,aAAa,KAAK,EAAE,SAAS,iBAAiB,KAAK,EAAE,SAAS,cAAc,GAAG,OAAO;GACrG,IAAI,EAAE,SAAS,YAAY,GAAG,OAAO;GACrC,IAAI,EAAE,SAAS,gBAAgB,KAAK,EAAE,SAAS,aAAa,GAAG,OAAO;EACxE;EAGA,IAAI,EAAE,WAAW,cAAc,KAAK,EAAE,WAAW,qBAAqB,GACpE,OAAO;EAIT,IAAI,EAAE,WAAW,YAAY,KAAK,EAAE,WAAW,gBAAgB,KAAK,EAAE,WAAW,YAAY,GAC3F,OAAO;EAIT,OAAO;CACT;;;;;;;;;;;;;;;CAgBA,OAAc,SAAS,KAA+B;EACpD,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,YAAY;EAEjC,IAAI,EAAE,WAAW,kBAAkB,GAAG,OAAO;EAC7C,IAAI,EAAE,WAAW,eAAe,GAAG,OAAO;EAC1C,IAAI,EAAE,WAAW,aAAa,GAAG,OAAO;EACxC,IAAI,EAAE,WAAW,eAAe,GAAG,OAAO;EAC1C,IAAI,EAAE,WAAW,cAAc,GAAG,OAAO;EACzC,IAAI,EAAE,WAAW,YAAY,GAAG,OAAO;EACvC,IAAI,EAAE,WAAW,gBAAgB,GAAG,OAAO;EAC3C,IAAI,EAAE,WAAW,YAAY,GAAG,OAAO;EAGvC,IAAI,EAAE,WAAW,qBAAqB,GAAG,OAAO;EAChD,IAAI,EAAE,WAAW,cAAc,GAAG,OAAO;EAEzC,IAAI,EAAE,WAAW,aAAa,GAAG;GAC/B,IAAI,EAAE,SAAS,gBAAgB,KAAK,EAAE,SAAS,aAAa,GAAG,OAAO;GACtE,IAAI,EAAE,SAAS,iBAAiB,KAAK,EAAE,SAAS,aAAa,GAAG,OAAO;GACvE,IAAI,EAAE,SAAS,gBAAgB,KAAK,EAAE,SAAS,aAAa,GAAG,OAAO;GACtE,IAAI,EAAE,SAAS,iBAAiB,GAAG,OAAO;GAC1C,IAAI,EAAE,SAAS,YAAY,GAAG,OAAO;GACrC,IAAI,EAAE,SAAS,aAAa,GAAG,OAAO;GACtC,IAAI,EAAE,SAAS,eAAe,GAAG,OAAO;GACxC,IAAI,EAAE,SAAS,WAAW,GAAG,OAAO;GACpC,IAAI,EAAE,SAAS,cAAc,GAAG,OAAO;EACzC;EAEA,OAAO;CACT;;;;;;;;;;;;;;CAeA,OAAc,qBAAqB,KAAiC;EAMlE,OAJc,IACX,KAAK,CAAC,CACN,MAAM,uDAEE,CAAC,GAAG,EAAE,EAAE,YAAY;CACjC;;;;;;;;;;;;;;;CAgBA,OAAc,KAAK,YAAsC;EACvD,OAAO,WAAW,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM;GAEvC,IAAI,EAAE,UAAU,EAAE,OAChB,OAAO,EAAE,QAAQ,EAAE;GAIrB,MAAM,cAAc,iBAAiB,EAAE,WAAW,EAAE,SAAS;GAE7D,IAAI,gBAAgB,QAClB,OAAO;GAIT,MAAM,QAAQ,EAAE,iBAAiB;GACjC,MAAM,QAAQ,EAAE,iBAAiB;GACjC,OAAO,MAAM,cAAc,KAAK;EAClC,CAAC;CACH;AACF"}
1
+ {"version":3,"file":"sql-grammar.mjs","names":[],"sources":["../../../../../../../cascade/src/migration/sql-grammar.ts"],"sourcesContent":["import { compareCreatedAt } from \"./parse-created-at\";\r\nimport type { SQLStatementType, TaggedSQL } from \"./types\";\r\n\r\n/**\r\n * Parses and sorts SQL statements globally based on their execution phase,\r\n * and classifies statements by their semantic type.\r\n */\r\nexport class SQLGrammar {\r\n /**\r\n * Determine the execution phase of a SQL statement (1–6).\r\n *\r\n * Phase ordering ensures DDL operations run in dependency-safe order\r\n * regardless of which migration file they originate from.\r\n *\r\n * | Phase | Statements |\r\n * |-------|-----------------------------------------------|\r\n * | 1 | CREATE EXTENSION, TYPE, DOMAIN, SCHEMA |\r\n * | 2 | CREATE TABLE |\r\n * | 3 | ADD COLUMN, ADD PRIMARY KEY |\r\n * | 4 | CREATE INDEX, ADD FOREIGN KEY |\r\n * | 5 | DROP COLUMN, ALTER COLUMN, DROP TABLE |\r\n * | 6 | Raw / unclassified |\r\n *\r\n * @example\r\n * SQLGrammar.phase(\"CREATE EXTENSION IF NOT EXISTS vector\"); // => 1\r\n * SQLGrammar.phase(\"ALTER TABLE users ADD COLUMN email TEXT\"); // => 3\r\n */\r\n public static phase(sql: string): 1 | 2 | 3 | 4 | 5 | 6 {\r\n const s = sql.trim().toUpperCase();\r\n\r\n // Phase 1: Preparation (Extensions, Enums, Domains, Types)\r\n if (\r\n s.startsWith(\"CREATE EXTENSION\") ||\r\n s.startsWith(\"CREATE TYPE\") ||\r\n s.startsWith(\"CREATE DOMAIN\") ||\r\n s.startsWith(\"CREATE SCHEMA\")\r\n ) {\r\n return 1;\r\n }\r\n\r\n // Phase 2: Table Creation\r\n if (s.startsWith(\"CREATE TABLE\")) {\r\n return 2;\r\n }\r\n\r\n // Phase 3 / 4 / 5: ALTER TABLE — broken down by clause\r\n if (s.startsWith(\"ALTER TABLE\")) {\r\n if (s.includes(\"ADD CONSTRAINT\") && s.includes(\"FOREIGN KEY\")) return 4;\r\n if (s.includes(\"DROP COLUMN\") || s.includes(\"DROP CONSTRAINT\") || s.includes(\"ALTER COLUMN\")) return 5;\r\n if (s.includes(\"ADD COLUMN\")) return 3;\r\n if (s.includes(\"ADD CONSTRAINT\") && s.includes(\"PRIMARY KEY\")) return 3;\r\n }\r\n\r\n // Phase 4: Index Creation\r\n if (s.startsWith(\"CREATE INDEX\") || s.startsWith(\"CREATE UNIQUE INDEX\")) {\r\n return 4;\r\n }\r\n\r\n // Phase 5: Destructive table/index operations\r\n if (s.startsWith(\"DROP TABLE\") || s.startsWith(\"TRUNCATE TABLE\") || s.startsWith(\"DROP INDEX\")) {\r\n return 5;\r\n }\r\n\r\n // Phase 6: Raw / unclassified (DML, triggers, procedures, views)\r\n return 6;\r\n }\r\n\r\n /**\r\n * Classify a SQL statement into its semantic statement type.\r\n *\r\n * This is independent of execution phase — it identifies *what* a statement\r\n * does, not *when* it should run. Use this for pre-flight checks, dry-run\r\n * display, selective filtering, and extension detection.\r\n *\r\n * @example\r\n * SQLGrammar.classify(\"CREATE EXTENSION IF NOT EXISTS vector\");\r\n * // => \"CREATE_EXTENSION\"\r\n *\r\n * SQLGrammar.classify(\"ALTER TABLE users ADD COLUMN email TEXT\");\r\n * // => \"ADD_COLUMN\"\r\n */\r\n public static classify(sql: string): SQLStatementType {\r\n const s = sql.trim().toUpperCase();\r\n\r\n if (s.startsWith(\"CREATE EXTENSION\")) return \"CREATE_EXTENSION\";\r\n if (s.startsWith(\"CREATE SCHEMA\")) return \"CREATE_SCHEMA\";\r\n if (s.startsWith(\"CREATE TYPE\")) return \"CREATE_TYPE\";\r\n if (s.startsWith(\"CREATE DOMAIN\")) return \"CREATE_DOMAIN\";\r\n if (s.startsWith(\"CREATE TABLE\")) return \"CREATE_TABLE\";\r\n if (s.startsWith(\"DROP TABLE\")) return \"DROP_TABLE\";\r\n if (s.startsWith(\"TRUNCATE TABLE\")) return \"TRUNCATE_TABLE\";\r\n if (s.startsWith(\"DROP INDEX\")) return \"DROP_INDEX\";\r\n\r\n // Must check UNIQUE before plain INDEX to avoid misclassification\r\n if (s.startsWith(\"CREATE UNIQUE INDEX\")) return \"CREATE_UNIQUE_INDEX\";\r\n if (s.startsWith(\"CREATE INDEX\")) return \"CREATE_INDEX\";\r\n\r\n if (s.startsWith(\"ALTER TABLE\")) {\r\n if (s.includes(\"ADD CONSTRAINT\") && s.includes(\"FOREIGN KEY\")) return \"ADD_FOREIGN_KEY\";\r\n if (s.includes(\"DROP CONSTRAINT\") && s.includes(\"FOREIGN KEY\")) return \"DROP_FOREIGN_KEY\";\r\n if (s.includes(\"ADD CONSTRAINT\") && s.includes(\"PRIMARY KEY\")) return \"ADD_PRIMARY_KEY\";\r\n if (s.includes(\"DROP CONSTRAINT\")) return \"DROP_PRIMARY_KEY\";\r\n if (s.includes(\"ADD COLUMN\")) return \"ADD_COLUMN\";\r\n if (s.includes(\"DROP COLUMN\")) return \"DROP_COLUMN\";\r\n if (s.includes(\"RENAME COLUMN\")) return \"RENAME_COLUMN\";\r\n if (s.includes(\"RENAME TO\")) return \"RENAME_TABLE\";\r\n if (s.includes(\"ALTER COLUMN\")) return \"MODIFY_COLUMN\";\r\n }\r\n\r\n return \"RAW\";\r\n }\r\n\r\n /**\r\n * Extract the extension name from a CREATE EXTENSION statement.\r\n *\r\n * Returns undefined if the statement is not a CREATE EXTENSION statement\r\n * or the name cannot be parsed.\r\n *\r\n * @example\r\n * SQLGrammar.extractExtensionName(\"CREATE EXTENSION IF NOT EXISTS vector\");\r\n * // => \"vector\"\r\n *\r\n * SQLGrammar.extractExtensionName(\"CREATE EXTENSION postgis\");\r\n * // => \"postgis\"\r\n */\r\n public static extractExtensionName(sql: string): string | undefined {\r\n // Matches: CREATE EXTENSION [IF NOT EXISTS] <name>\r\n const match = sql\r\n .trim()\r\n .match(/^CREATE\\s+EXTENSION\\s+(?:IF\\s+NOT\\s+EXISTS\\s+)?(\\w+)/i);\r\n\r\n return match?.[1]?.toLowerCase();\r\n }\r\n\r\n /**\r\n * Sort an array of tagged SQL statements by phase, then creation date, then migration name.\r\n *\r\n * This is the sort that decides **execution order** — it runs across every\r\n * pending migration's statements at once, after the migration list itself\r\n * has been ordered, so whatever it decides is final.\r\n *\r\n * The creation date must go through {@link compareCreatedAt}. Parsing these\r\n * stamps with `new Date()` returns `Invalid Date` for the framework's own\r\n * `MM-DD-YYYY_HH-MM-SS` filename format, which collapsed every timestamp to\r\n * the same value and quietly handed the whole ordering to the alphabetical\r\n * tiebreaker below — running, for example, a January 2026 migration before a\r\n * December 2025 one.\r\n */\r\n public static sort(statements: TaggedSQL[]): TaggedSQL[] {\r\n return statements.slice().sort((a, b) => {\r\n // 1. Sort by Phase (ascending)\r\n if (a.phase !== b.phase) {\r\n return a.phase - b.phase;\r\n }\r\n\r\n // 2. Sort by CreatedAt (within same phase)\r\n const byCreatedAt = compareCreatedAt(a.createdAt, b.createdAt);\r\n\r\n if (byCreatedAt !== undefined) {\r\n return byCreatedAt;\r\n }\r\n\r\n // 3. Sort by Migration Name (tie-breaker)\r\n const nameA = a.migrationName || \"\";\r\n const nameB = b.migrationName || \"\";\r\n return nameA.localeCompare(nameB);\r\n });\r\n }\r\n}\r\n"],"mappings":";;;;;;;AAOA,IAAa,aAAb,MAAwB;;;;;;;;;;;;;;;;;;;;CAoBtB,OAAc,MAAM,KAAoC;EACtD,MAAM,IAAI,IAAI,KAAK,EAAE,YAAY;EAGjC,IACE,EAAE,WAAW,kBAAkB,KAC/B,EAAE,WAAW,aAAa,KAC1B,EAAE,WAAW,eAAe,KAC5B,EAAE,WAAW,eAAe,GAE5B,OAAO;EAIT,IAAI,EAAE,WAAW,cAAc,GAC7B,OAAO;EAIT,IAAI,EAAE,WAAW,aAAa,GAAG;GAC/B,IAAI,EAAE,SAAS,gBAAgB,KAAK,EAAE,SAAS,aAAa,GAAG,OAAO;GACtE,IAAI,EAAE,SAAS,aAAa,KAAK,EAAE,SAAS,iBAAiB,KAAK,EAAE,SAAS,cAAc,GAAG,OAAO;GACrG,IAAI,EAAE,SAAS,YAAY,GAAG,OAAO;GACrC,IAAI,EAAE,SAAS,gBAAgB,KAAK,EAAE,SAAS,aAAa,GAAG,OAAO;EACxE;EAGA,IAAI,EAAE,WAAW,cAAc,KAAK,EAAE,WAAW,qBAAqB,GACpE,OAAO;EAIT,IAAI,EAAE,WAAW,YAAY,KAAK,EAAE,WAAW,gBAAgB,KAAK,EAAE,WAAW,YAAY,GAC3F,OAAO;EAIT,OAAO;CACT;;;;;;;;;;;;;;;CAgBA,OAAc,SAAS,KAA+B;EACpD,MAAM,IAAI,IAAI,KAAK,EAAE,YAAY;EAEjC,IAAI,EAAE,WAAW,kBAAkB,GAAG,OAAO;EAC7C,IAAI,EAAE,WAAW,eAAe,GAAG,OAAO;EAC1C,IAAI,EAAE,WAAW,aAAa,GAAG,OAAO;EACxC,IAAI,EAAE,WAAW,eAAe,GAAG,OAAO;EAC1C,IAAI,EAAE,WAAW,cAAc,GAAG,OAAO;EACzC,IAAI,EAAE,WAAW,YAAY,GAAG,OAAO;EACvC,IAAI,EAAE,WAAW,gBAAgB,GAAG,OAAO;EAC3C,IAAI,EAAE,WAAW,YAAY,GAAG,OAAO;EAGvC,IAAI,EAAE,WAAW,qBAAqB,GAAG,OAAO;EAChD,IAAI,EAAE,WAAW,cAAc,GAAG,OAAO;EAEzC,IAAI,EAAE,WAAW,aAAa,GAAG;GAC/B,IAAI,EAAE,SAAS,gBAAgB,KAAK,EAAE,SAAS,aAAa,GAAG,OAAO;GACtE,IAAI,EAAE,SAAS,iBAAiB,KAAK,EAAE,SAAS,aAAa,GAAG,OAAO;GACvE,IAAI,EAAE,SAAS,gBAAgB,KAAK,EAAE,SAAS,aAAa,GAAG,OAAO;GACtE,IAAI,EAAE,SAAS,iBAAiB,GAAG,OAAO;GAC1C,IAAI,EAAE,SAAS,YAAY,GAAG,OAAO;GACrC,IAAI,EAAE,SAAS,aAAa,GAAG,OAAO;GACtC,IAAI,EAAE,SAAS,eAAe,GAAG,OAAO;GACxC,IAAI,EAAE,SAAS,WAAW,GAAG,OAAO;GACpC,IAAI,EAAE,SAAS,cAAc,GAAG,OAAO;EACzC;EAEA,OAAO;CACT;;;;;;;;;;;;;;CAeA,OAAc,qBAAqB,KAAiC;EAMlE,OAJc,IACX,KAAK,EACL,MAAM,uDAEE,IAAI,IAAI,YAAY;CACjC;;;;;;;;;;;;;;;CAgBA,OAAc,KAAK,YAAsC;EACvD,OAAO,WAAW,MAAM,EAAE,MAAM,GAAG,MAAM;GAEvC,IAAI,EAAE,UAAU,EAAE,OAChB,OAAO,EAAE,QAAQ,EAAE;GAIrB,MAAM,cAAc,iBAAiB,EAAE,WAAW,EAAE,SAAS;GAE7D,IAAI,gBAAgB,QAClB,OAAO;GAIT,MAAM,QAAQ,EAAE,iBAAiB;GACjC,MAAM,QAAQ,EAAE,iBAAiB;GACjC,OAAO,MAAM,cAAc,KAAK;EAClC,CAAC;CACH;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"accessor-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/accessor-methods.ts"],"sourcesContent":["import { get, merge, only, set, unset } from \"@mongez/reinforcements\";\nimport type { Model } from \"../model\";\n\n/**\n * Sentinel symbol to distinguish a genuinely missing field from a field\n * whose value is `undefined`. Encapsulated here — callers use `hasField()`.\n */\nconst MISSING_VALUE = Symbol(\"missing\");\n\nexport function getFieldValue(model: Model, field: string, defaultValue?: unknown): any {\n return get(model.data, field, defaultValue);\n}\n\nexport function setFieldValue(model: Model, field: string, value: unknown): Model {\n const path = String(field);\n set(model.data, path, value);\n\n const partial: Record<string, unknown> = {};\n set(partial, path, value);\n model.dirtyTracker.mergeChanges(partial);\n\n return model;\n}\n\nexport function hasField(model: Model, field: string): boolean {\n return get(model.data, field, MISSING_VALUE as any) !== MISSING_VALUE;\n}\n\nexport function incrementField(model: Model, field: string, amount?: number): Model {\n const value = getFieldValue(model, field, 0) as number;\n const incrementedValue = value + (amount ?? 1);\n return setFieldValue(model, field, incrementedValue);\n}\n\nexport function decrementField(model: Model, field: string, amount?: number): Model {\n const value = getFieldValue(model, field, 0) as number;\n const decrementedValue = value - (amount ?? 1);\n return setFieldValue(model, field, decrementedValue);\n}\n\nexport function unsetFields(model: Model, ...fields: string[]): Model {\n model.data = unset(model.data, fields);\n model.dirtyTracker.unset(fields);\n\n return model;\n}\n\n/**\n * Identity columns that a mass-assignment payload may never carry into an\n * already-persisted model. `merge()` is the method request bodies reach\n * (`model.merge(req.body)` / `save({ merge })`), and the primary key is what\n * the UPDATE filter is built from — letting it through means a payload of\n * `{ id: \"<victim-id>\" }` rewrites which document the save targets. Both the\n * configured primary key and the two framework identity columns are dropped,\n * because `id` and `_id` are managed by the writer/driver either way.\n *\n * A NEW model is untouched: creating with an explicit id is a legitimate flow,\n * and the writer itself merges the driver-returned document (`_id`, defaults)\n * back onto the instance before it is marked persisted.\n */\nfunction stripIdentityColumns(\n model: Model,\n values: Record<string, unknown>,\n): Record<string, unknown> {\n if (model.isNew) return values;\n\n const identityColumns = new Set([model.getPrimaryKey(), \"id\", \"_id\"]);\n const blockedKeys = Object.keys(values).filter(key => identityColumns.has(key));\n\n if (blockedKeys.length === 0) return values;\n\n // Copy — the caller's object (often the request body itself) is not ours to mutate.\n const safeValues = { ...values };\n for (const key of blockedKeys) {\n delete safeValues[key];\n }\n\n return safeValues;\n}\n\nexport function mergeFields(model: Model, values: Record<string, unknown>): Model {\n return mergeDriverFields(model, stripIdentityColumns(model, values));\n}\n\n/**\n * Merge a document the DRIVER produced (generated `_id`, `RETURNING *`, DB\n * defaults) back onto the model, identity columns included.\n *\n * Framework-internal counterpart of {@link mergeFields}: the write pipeline is\n * the one caller allowed to set identity columns on an already-persisted\n * instance, because the values come from the database rather than from a\n * request. Never route caller-supplied data through this.\n */\nexport function mergeDriverFields(model: Model, values: Record<string, unknown>): Model {\n model.data = merge(model.data, values) as any;\n model.dirtyTracker.mergeChanges(values);\n return model;\n}\n\nexport function getOnlyFields(model: Model, fields: string[]): Record<string, unknown> {\n return only(model.data, fields);\n}\n\nexport function getStringField(model: Model, key: string, defaultValue?: string): string | undefined {\n return getFieldValue(model, key, defaultValue) as string | undefined;\n}\n\nexport function getNumberField(model: Model, key: string, defaultValue?: number): number | undefined {\n return getFieldValue(model, key, defaultValue) as number | undefined;\n}\n\nexport function getBooleanField(model: Model, key: string, defaultValue?: boolean): boolean | undefined {\n return getFieldValue(model, key, defaultValue) as boolean | undefined;\n}\n"],"mappings":";;;;;;;AAOA,MAAM,gBAAgB,OAAO,SAAS;AAEtC,SAAgB,cAAc,OAAc,OAAe,cAA6B;CACtF,OAAO,IAAI,MAAM,MAAM,OAAO,YAAY;AAC5C;AAEA,SAAgB,cAAc,OAAc,OAAe,OAAuB;CAChF,MAAM,OAAO,OAAO,KAAK;CACzB,IAAI,MAAM,MAAM,MAAM,KAAK;CAE3B,MAAM,UAAmC,CAAC;CAC1C,IAAI,SAAS,MAAM,KAAK;CACxB,MAAM,aAAa,aAAa,OAAO;CAEvC,OAAO;AACT;AAEA,SAAgB,SAAS,OAAc,OAAwB;CAC7D,OAAO,IAAI,MAAM,MAAM,OAAO,aAAoB,MAAM;AAC1D;AAEA,SAAgB,eAAe,OAAc,OAAe,QAAwB;CAGlF,OAAO,cAAc,OAAO,OAFd,cAAc,OAAO,OAAO,CACb,KAAK,UAAU,EACO;AACrD;AAEA,SAAgB,eAAe,OAAc,OAAe,QAAwB;CAGlF,OAAO,cAAc,OAAO,OAFd,cAAc,OAAO,OAAO,CACb,KAAK,UAAU,EACO;AACrD;AAEA,SAAgB,YAAY,OAAc,GAAG,QAAyB;CACpE,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM;CACrC,MAAM,aAAa,MAAM,MAAM;CAE/B,OAAO;AACT;;;;;;;;;;;;;;AAeA,SAAS,qBACP,OACA,QACyB;CACzB,IAAI,MAAM,OAAO,OAAO;CAExB,MAAM,kBAAkB,IAAI,IAAI;EAAC,MAAM,cAAc;EAAG;EAAM;CAAK,CAAC;CACpE,MAAM,cAAc,OAAO,KAAK,MAAM,CAAC,CAAC,QAAO,QAAO,gBAAgB,IAAI,GAAG,CAAC;CAE9E,IAAI,YAAY,WAAW,GAAG,OAAO;CAGrC,MAAM,aAAa,EAAE,GAAG,OAAO;CAC/B,KAAK,MAAM,OAAO,aAChB,OAAO,WAAW;CAGpB,OAAO;AACT;AAEA,SAAgB,YAAY,OAAc,QAAwC;CAChF,OAAO,kBAAkB,OAAO,qBAAqB,OAAO,MAAM,CAAC;AACrE;;;;;;;;;;AAWA,SAAgB,kBAAkB,OAAc,QAAwC;CACtF,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM;CACrC,MAAM,aAAa,aAAa,MAAM;CACtC,OAAO;AACT;AAEA,SAAgB,cAAc,OAAc,QAA2C;CACrF,OAAO,KAAK,MAAM,MAAM,MAAM;AAChC;AAEA,SAAgB,eAAe,OAAc,KAAa,cAA2C;CACnG,OAAO,cAAc,OAAO,KAAK,YAAY;AAC/C;AAEA,SAAgB,eAAe,OAAc,KAAa,cAA2C;CACnG,OAAO,cAAc,OAAO,KAAK,YAAY;AAC/C;AAEA,SAAgB,gBAAgB,OAAc,KAAa,cAA6C;CACtG,OAAO,cAAc,OAAO,KAAK,YAAY;AAC/C"}
1
+ {"version":3,"file":"accessor-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/accessor-methods.ts"],"sourcesContent":["import { get, merge, only, set, unset } from \"@mongez/reinforcements\";\nimport type { Model } from \"../model\";\n\n/**\n * Sentinel symbol to distinguish a genuinely missing field from a field\n * whose value is `undefined`. Encapsulated here — callers use `hasField()`.\n */\nconst MISSING_VALUE = Symbol(\"missing\");\n\nexport function getFieldValue(model: Model, field: string, defaultValue?: unknown): any {\n return get(model.data, field, defaultValue);\n}\n\nexport function setFieldValue(model: Model, field: string, value: unknown): Model {\n const path = String(field);\n set(model.data, path, value);\n\n const partial: Record<string, unknown> = {};\n set(partial, path, value);\n model.dirtyTracker.mergeChanges(partial);\n\n return model;\n}\n\nexport function hasField(model: Model, field: string): boolean {\n return get(model.data, field, MISSING_VALUE as any) !== MISSING_VALUE;\n}\n\nexport function incrementField(model: Model, field: string, amount?: number): Model {\n const value = getFieldValue(model, field, 0) as number;\n const incrementedValue = value + (amount ?? 1);\n return setFieldValue(model, field, incrementedValue);\n}\n\nexport function decrementField(model: Model, field: string, amount?: number): Model {\n const value = getFieldValue(model, field, 0) as number;\n const decrementedValue = value - (amount ?? 1);\n return setFieldValue(model, field, decrementedValue);\n}\n\nexport function unsetFields(model: Model, ...fields: string[]): Model {\n model.data = unset(model.data, fields);\n model.dirtyTracker.unset(fields);\n\n return model;\n}\n\n/**\n * Identity columns that a mass-assignment payload may never carry into an\n * already-persisted model. `merge()` is the method request bodies reach\n * (`model.merge(req.body)` / `save({ merge })`), and the primary key is what\n * the UPDATE filter is built from — letting it through means a payload of\n * `{ id: \"<victim-id>\" }` rewrites which document the save targets. Both the\n * configured primary key and the two framework identity columns are dropped,\n * because `id` and `_id` are managed by the writer/driver either way.\n *\n * A NEW model is untouched: creating with an explicit id is a legitimate flow,\n * and the writer itself merges the driver-returned document (`_id`, defaults)\n * back onto the instance before it is marked persisted.\n */\nfunction stripIdentityColumns(\n model: Model,\n values: Record<string, unknown>,\n): Record<string, unknown> {\n if (model.isNew) return values;\n\n const identityColumns = new Set([model.getPrimaryKey(), \"id\", \"_id\"]);\n const blockedKeys = Object.keys(values).filter(key => identityColumns.has(key));\n\n if (blockedKeys.length === 0) return values;\n\n // Copy — the caller's object (often the request body itself) is not ours to mutate.\n const safeValues = { ...values };\n for (const key of blockedKeys) {\n delete safeValues[key];\n }\n\n return safeValues;\n}\n\nexport function mergeFields(model: Model, values: Record<string, unknown>): Model {\n return mergeDriverFields(model, stripIdentityColumns(model, values));\n}\n\n/**\n * Merge a document the DRIVER produced (generated `_id`, `RETURNING *`, DB\n * defaults) back onto the model, identity columns included.\n *\n * Framework-internal counterpart of {@link mergeFields}: the write pipeline is\n * the one caller allowed to set identity columns on an already-persisted\n * instance, because the values come from the database rather than from a\n * request. Never route caller-supplied data through this.\n */\nexport function mergeDriverFields(model: Model, values: Record<string, unknown>): Model {\n model.data = merge(model.data, values) as any;\n model.dirtyTracker.mergeChanges(values);\n return model;\n}\n\nexport function getOnlyFields(model: Model, fields: string[]): Record<string, unknown> {\n return only(model.data, fields);\n}\n\nexport function getStringField(model: Model, key: string, defaultValue?: string): string | undefined {\n return getFieldValue(model, key, defaultValue) as string | undefined;\n}\n\nexport function getNumberField(model: Model, key: string, defaultValue?: number): number | undefined {\n return getFieldValue(model, key, defaultValue) as number | undefined;\n}\n\nexport function getBooleanField(model: Model, key: string, defaultValue?: boolean): boolean | undefined {\n return getFieldValue(model, key, defaultValue) as boolean | undefined;\n}\n"],"mappings":";;;;;;;AAOA,MAAM,gBAAgB,OAAO,SAAS;AAEtC,SAAgB,cAAc,OAAc,OAAe,cAA6B;CACtF,OAAO,IAAI,MAAM,MAAM,OAAO,YAAY;AAC5C;AAEA,SAAgB,cAAc,OAAc,OAAe,OAAuB;CAChF,MAAM,OAAO,OAAO,KAAK;CACzB,IAAI,MAAM,MAAM,MAAM,KAAK;CAE3B,MAAM,UAAmC,CAAC;CAC1C,IAAI,SAAS,MAAM,KAAK;CACxB,MAAM,aAAa,aAAa,OAAO;CAEvC,OAAO;AACT;AAEA,SAAgB,SAAS,OAAc,OAAwB;CAC7D,OAAO,IAAI,MAAM,MAAM,OAAO,aAAoB,MAAM;AAC1D;AAEA,SAAgB,eAAe,OAAc,OAAe,QAAwB;CAGlF,OAAO,cAAc,OAAO,OAFd,cAAc,OAAO,OAAO,CACb,KAAK,UAAU,EACO;AACrD;AAEA,SAAgB,eAAe,OAAc,OAAe,QAAwB;CAGlF,OAAO,cAAc,OAAO,OAFd,cAAc,OAAO,OAAO,CACb,KAAK,UAAU,EACO;AACrD;AAEA,SAAgB,YAAY,OAAc,GAAG,QAAyB;CACpE,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM;CACrC,MAAM,aAAa,MAAM,MAAM;CAE/B,OAAO;AACT;;;;;;;;;;;;;;AAeA,SAAS,qBACP,OACA,QACyB;CACzB,IAAI,MAAM,OAAO,OAAO;CAExB,MAAM,kBAAkB,IAAI,IAAI;EAAC,MAAM,cAAc;EAAG;EAAM;CAAK,CAAC;CACpE,MAAM,cAAc,OAAO,KAAK,MAAM,EAAE,QAAO,QAAO,gBAAgB,IAAI,GAAG,CAAC;CAE9E,IAAI,YAAY,WAAW,GAAG,OAAO;CAGrC,MAAM,aAAa,EAAE,GAAG,OAAO;CAC/B,KAAK,MAAM,OAAO,aAChB,OAAO,WAAW;CAGpB,OAAO;AACT;AAEA,SAAgB,YAAY,OAAc,QAAwC;CAChF,OAAO,kBAAkB,OAAO,qBAAqB,OAAO,MAAM,CAAC;AACrE;;;;;;;;;;AAWA,SAAgB,kBAAkB,OAAc,QAAwC;CACtF,MAAM,OAAO,MAAM,MAAM,MAAM,MAAM;CACrC,MAAM,aAAa,aAAa,MAAM;CACtC,OAAO;AACT;AAEA,SAAgB,cAAc,OAAc,QAA2C;CACrF,OAAO,KAAK,MAAM,MAAM,MAAM;AAChC;AAEA,SAAgB,eAAe,OAAc,KAAa,cAA2C;CACnG,OAAO,cAAc,OAAO,KAAK,YAAY;AAC/C;AAEA,SAAgB,eAAe,OAAc,KAAa,cAA2C;CACnG,OAAO,cAAc,OAAO,KAAK,YAAY;AAC/C;AAEA,SAAgB,gBAAgB,OAAc,KAAa,cAA6C;CACtG,OAAO,cAAc,OAAO,KAAK,YAAY;AAC/C"}
@@ -1 +1 @@
1
- {"version":3,"file":"delete-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/delete-methods.ts"],"sourcesContent":["import { DatabaseRemover } from \"../../remover/database-remover\";\r\nimport type { DeleteStrategy } from \"../../types\";\r\nimport type { RemoverResult } from \"../../contracts\";\r\nimport { sanitizeFilter } from \"../../utils/sanitize-filter\";\r\nimport type { ChildModel, Model } from \"../model\";\r\n\r\nexport async function destroyModel(\r\n model: Model,\r\n options?: { strategy?: DeleteStrategy; skipEvents?: boolean },\r\n): Promise<RemoverResult> {\r\n const remover = new DatabaseRemover(model);\r\n return remover.destroy(options);\r\n}\r\n\r\nexport async function deleteRecords(\r\n ModelClass: ChildModel<any>,\r\n filter?: Record<string, unknown>,\r\n): Promise<number> {\r\n return ModelClass.getDriver().deleteMany(ModelClass.table, filter ? sanitizeFilter(filter) : filter);\r\n}\r\n\r\nexport async function deleteOneRecord(\r\n ModelClass: ChildModel<any>,\r\n filter?: Record<string, unknown>,\r\n): Promise<number> {\r\n return ModelClass.getDriver().delete(ModelClass.table, filter ? sanitizeFilter(filter) : filter);\r\n}\r\n"],"mappings":";;;;AAMA,eAAsB,aACpB,OACA,SACwB;CAExB,OAAO,IADa,gBAAgB,KACvB,CAAC,CAAC,QAAQ,OAAO;AAChC;AAEA,eAAsB,cACpB,YACA,QACiB;CACjB,OAAO,WAAW,UAAU,CAAC,CAAC,WAAW,WAAW,OAAO,SAAS,eAAe,MAAM,IAAI,MAAM;AACrG;AAEA,eAAsB,gBACpB,YACA,QACiB;CACjB,OAAO,WAAW,UAAU,CAAC,CAAC,OAAO,WAAW,OAAO,SAAS,eAAe,MAAM,IAAI,MAAM;AACjG"}
1
+ {"version":3,"file":"delete-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/delete-methods.ts"],"sourcesContent":["import { DatabaseRemover } from \"../../remover/database-remover\";\r\nimport type { DeleteStrategy } from \"../../types\";\r\nimport type { RemoverResult } from \"../../contracts\";\r\nimport { sanitizeFilter } from \"../../utils/sanitize-filter\";\r\nimport type { ChildModel, Model } from \"../model\";\r\n\r\nexport async function destroyModel(\r\n model: Model,\r\n options?: { strategy?: DeleteStrategy; skipEvents?: boolean },\r\n): Promise<RemoverResult> {\r\n const remover = new DatabaseRemover(model);\r\n return remover.destroy(options);\r\n}\r\n\r\nexport async function deleteRecords(\r\n ModelClass: ChildModel<any>,\r\n filter?: Record<string, unknown>,\r\n): Promise<number> {\r\n return ModelClass.getDriver().deleteMany(ModelClass.table, filter ? sanitizeFilter(filter) : filter);\r\n}\r\n\r\nexport async function deleteOneRecord(\r\n ModelClass: ChildModel<any>,\r\n filter?: Record<string, unknown>,\r\n): Promise<number> {\r\n return ModelClass.getDriver().delete(ModelClass.table, filter ? sanitizeFilter(filter) : filter);\r\n}\r\n"],"mappings":";;;;AAMA,eAAsB,aACpB,OACA,SACwB;CAExB,OAAO,IADa,gBAAgB,KACvB,EAAE,QAAQ,OAAO;AAChC;AAEA,eAAsB,cACpB,YACA,QACiB;CACjB,OAAO,WAAW,UAAU,EAAE,WAAW,WAAW,OAAO,SAAS,eAAe,MAAM,IAAI,MAAM;AACrG;AAEA,eAAsB,gBACpB,YACA,QACiB;CACjB,OAAO,WAAW,UAAU,EAAE,OAAO,WAAW,OAAO,SAAS,eAAe,MAAM,IAAI,MAAM;AACjG"}
@@ -1 +1 @@
1
- {"version":3,"file":"hydration-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/hydration-methods.ts"],"sourcesContent":["import { RelationHydrator, type ModelSnapshot, type SerializedRelation } from \"../../relations/relation-hydrator\";\nimport type { ChildModel, Model } from \"../model\";\n\nexport function hydrateModel<TModel extends Model = Model>(\n ModelClass: ChildModel<TModel>,\n data: Record<string, unknown>,\n): TModel {\n const model = new ModelClass(ModelClass.getDriver().deserialize(data));\n model.isNew = false;\n return model;\n}\n\nexport function modelFromSnapshot<TModel extends Model>(\n ModelClass: ChildModel<TModel>,\n snapshot: ModelSnapshot,\n): TModel {\n const model = ModelClass.hydrate(snapshot.data) as TModel;\n RelationHydrator.hydrate(model, ModelClass.relations, snapshot.relations);\n return model;\n}\n\nexport function modelToSnapshot(model: Model): ModelSnapshot {\n const driver = (model.constructor as typeof Model).getDataSource().driver;\n const relations: Record<string, SerializedRelation> = {};\n\n for (const [name, related] of model.loadedRelations) {\n if (related === null) {\n relations[name] = null;\n } else if (Array.isArray(related)) {\n relations[name] = related.map((m) => (m instanceof Object && typeof m.toSnapshot === \"function\" ? m.toSnapshot() : m));\n } else if (related instanceof Object && typeof related.toSnapshot === \"function\") {\n relations[name] = related.toSnapshot();\n }\n }\n\n return {\n data: driver.serialize({ ...model.data }) as Record<string, unknown>,\n relations,\n };\n}\n\nexport function serializeModel(model: Model) {\n return (model.constructor as typeof Model).getDataSource().driver.serialize(model.data);\n}\n\nexport function cloneModel<TModel extends Model>(model: TModel): TModel {\n const clonedData = JSON.parse(JSON.stringify(model.data));\n const ModelClass = model.self();\n const clonedModel = new ModelClass(clonedData) as TModel;\n\n clonedModel.isNew = model.isNew;\n deepFreezeObject(clonedModel.data);\n clonedModel.dirtyTracker.reset();\n\n return clonedModel;\n}\n\nexport function deepFreezeObject<T>(obj: T): T {\n Object.freeze(obj);\n\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n const value = (obj as any)[prop];\n if (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n !Object.isFrozen(value)\n ) {\n deepFreezeObject(value);\n }\n });\n\n return obj;\n}\n\nexport function replaceModelData<TModel extends Model>(\n model: TModel,\n data: Record<string, unknown>,\n): void {\n model.data = data as any;\n model.dirtyTracker.replaceCurrentData(data);\n}\n"],"mappings":";;;AAGA,SAAgB,aACd,YACA,MACQ;CACR,MAAM,QAAQ,IAAI,WAAW,WAAW,UAAU,CAAC,CAAC,YAAY,IAAI,CAAC;CACrE,MAAM,QAAQ;CACd,OAAO;AACT;AAEA,SAAgB,kBACd,YACA,UACQ;CACR,MAAM,QAAQ,WAAW,QAAQ,SAAS,IAAI;CAC9C,iBAAiB,QAAQ,OAAO,WAAW,WAAW,SAAS,SAAS;CACxE,OAAO;AACT;AAEA,SAAgB,gBAAgB,OAA6B;CAC3D,MAAM,SAAU,MAAM,YAA6B,cAAc,CAAC,CAAC;CACnE,MAAM,YAAgD,CAAC;CAEvD,KAAK,MAAM,CAAC,MAAM,YAAY,MAAM,iBAClC,IAAI,YAAY,MACd,UAAU,QAAQ;MACb,IAAI,MAAM,QAAQ,OAAO,GAC9B,UAAU,QAAQ,QAAQ,KAAK,MAAO,aAAa,UAAU,OAAO,EAAE,eAAe,aAAa,EAAE,WAAW,IAAI,CAAE;MAChH,IAAI,mBAAmB,UAAU,OAAO,QAAQ,eAAe,YACpE,UAAU,QAAQ,QAAQ,WAAW;CAIzC,OAAO;EACL,MAAM,OAAO,UAAU,EAAE,GAAG,MAAM,KAAK,CAAC;EACxC;CACF;AACF;AAEA,SAAgB,eAAe,OAAc;CAC3C,OAAQ,MAAM,YAA6B,cAAc,CAAC,CAAC,OAAO,UAAU,MAAM,IAAI;AACxF;AAEA,SAAgB,WAAiC,OAAuB;CACtE,MAAM,aAAa,KAAK,MAAM,KAAK,UAAU,MAAM,IAAI,CAAC;CAExD,MAAM,cAAc,KADD,MAAM,KACQ,GAAE,UAAU;CAE7C,YAAY,QAAQ,MAAM;CAC1B,iBAAiB,YAAY,IAAI;CACjC,YAAY,aAAa,MAAM;CAE/B,OAAO;AACT;AAEA,SAAgB,iBAAoB,KAAW;CAC7C,OAAO,OAAO,GAAG;CAEjB,OAAO,oBAAoB,GAAG,CAAC,CAAC,SAAS,SAAS;EAChD,MAAM,QAAS,IAAY;EAC3B,IACE,UAAU,SACT,OAAO,UAAU,YAAY,OAAO,UAAU,eAC/C,CAAC,OAAO,SAAS,KAAK,GAEtB,iBAAiB,KAAK;CAE1B,CAAC;CAED,OAAO;AACT;AAEA,SAAgB,iBACd,OACA,MACM;CACN,MAAM,OAAO;CACb,MAAM,aAAa,mBAAmB,IAAI;AAC5C"}
1
+ {"version":3,"file":"hydration-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/hydration-methods.ts"],"sourcesContent":["import { RelationHydrator, type ModelSnapshot, type SerializedRelation } from \"../../relations/relation-hydrator\";\nimport type { ChildModel, Model } from \"../model\";\n\nexport function hydrateModel<TModel extends Model = Model>(\n ModelClass: ChildModel<TModel>,\n data: Record<string, unknown>,\n): TModel {\n const model = new ModelClass(ModelClass.getDriver().deserialize(data));\n model.isNew = false;\n return model;\n}\n\nexport function modelFromSnapshot<TModel extends Model>(\n ModelClass: ChildModel<TModel>,\n snapshot: ModelSnapshot,\n): TModel {\n const model = ModelClass.hydrate(snapshot.data) as TModel;\n RelationHydrator.hydrate(model, ModelClass.relations, snapshot.relations);\n return model;\n}\n\nexport function modelToSnapshot(model: Model): ModelSnapshot {\n const driver = (model.constructor as typeof Model).getDataSource().driver;\n const relations: Record<string, SerializedRelation> = {};\n\n for (const [name, related] of model.loadedRelations) {\n if (related === null) {\n relations[name] = null;\n } else if (Array.isArray(related)) {\n relations[name] = related.map((m) => (m instanceof Object && typeof m.toSnapshot === \"function\" ? m.toSnapshot() : m));\n } else if (related instanceof Object && typeof related.toSnapshot === \"function\") {\n relations[name] = related.toSnapshot();\n }\n }\n\n return {\n data: driver.serialize({ ...model.data }) as Record<string, unknown>,\n relations,\n };\n}\n\nexport function serializeModel(model: Model) {\n return (model.constructor as typeof Model).getDataSource().driver.serialize(model.data);\n}\n\nexport function cloneModel<TModel extends Model>(model: TModel): TModel {\n const clonedData = JSON.parse(JSON.stringify(model.data));\n const ModelClass = model.self();\n const clonedModel = new ModelClass(clonedData) as TModel;\n\n clonedModel.isNew = model.isNew;\n deepFreezeObject(clonedModel.data);\n clonedModel.dirtyTracker.reset();\n\n return clonedModel;\n}\n\nexport function deepFreezeObject<T>(obj: T): T {\n Object.freeze(obj);\n\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n const value = (obj as any)[prop];\n if (\n value !== null &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n !Object.isFrozen(value)\n ) {\n deepFreezeObject(value);\n }\n });\n\n return obj;\n}\n\nexport function replaceModelData<TModel extends Model>(\n model: TModel,\n data: Record<string, unknown>,\n): void {\n model.data = data as any;\n model.dirtyTracker.replaceCurrentData(data);\n}\n"],"mappings":";;;AAGA,SAAgB,aACd,YACA,MACQ;CACR,MAAM,QAAQ,IAAI,WAAW,WAAW,UAAU,EAAE,YAAY,IAAI,CAAC;CACrE,MAAM,QAAQ;CACd,OAAO;AACT;AAEA,SAAgB,kBACd,YACA,UACQ;CACR,MAAM,QAAQ,WAAW,QAAQ,SAAS,IAAI;CAC9C,iBAAiB,QAAQ,OAAO,WAAW,WAAW,SAAS,SAAS;CACxE,OAAO;AACT;AAEA,SAAgB,gBAAgB,OAA6B;CAC3D,MAAM,SAAU,MAAM,YAA6B,cAAc,EAAE;CACnE,MAAM,YAAgD,CAAC;CAEvD,KAAK,MAAM,CAAC,MAAM,YAAY,MAAM,iBAClC,IAAI,YAAY,MACd,UAAU,QAAQ;MACb,IAAI,MAAM,QAAQ,OAAO,GAC9B,UAAU,QAAQ,QAAQ,KAAK,MAAO,aAAa,UAAU,OAAO,EAAE,eAAe,aAAa,EAAE,WAAW,IAAI,CAAE;MAChH,IAAI,mBAAmB,UAAU,OAAO,QAAQ,eAAe,YACpE,UAAU,QAAQ,QAAQ,WAAW;CAIzC,OAAO;EACL,MAAM,OAAO,UAAU,EAAE,GAAG,MAAM,KAAK,CAAC;EACxC;CACF;AACF;AAEA,SAAgB,eAAe,OAAc;CAC3C,OAAQ,MAAM,YAA6B,cAAc,EAAE,OAAO,UAAU,MAAM,IAAI;AACxF;AAEA,SAAgB,WAAiC,OAAuB;CACtE,MAAM,aAAa,KAAK,MAAM,KAAK,UAAU,MAAM,IAAI,CAAC;CAExD,MAAM,cAAc,KADD,MAAM,KACQ,GAAE,UAAU;CAE7C,YAAY,QAAQ,MAAM;CAC1B,iBAAiB,YAAY,IAAI;CACjC,YAAY,aAAa,MAAM;CAE/B,OAAO;AACT;AAEA,SAAgB,iBAAoB,KAAW;CAC7C,OAAO,OAAO,GAAG;CAEjB,OAAO,oBAAoB,GAAG,EAAE,SAAS,SAAS;EAChD,MAAM,QAAS,IAAY;EAC3B,IACE,UAAU,SACT,OAAO,UAAU,YAAY,OAAO,UAAU,eAC/C,CAAC,OAAO,SAAS,KAAK,GAEtB,iBAAiB,KAAK;CAE1B,CAAC;CAED,OAAO;AACT;AAEA,SAAgB,iBACd,OACA,MACM;CACN,MAAM,OAAO;CACb,MAAM,aAAa,mBAAmB,IAAI;AAC5C"}
@@ -1 +1 @@
1
- {"version":3,"file":"instance-event-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/instance-event-methods.ts"],"sourcesContent":["import {\n globalModelEvents,\n type ModelEventListener,\n type ModelEventName,\n} from \"../../events/model-events\";\nimport type { Model } from \"../model\";\n\nexport async function emitModelEvent<TContext = unknown>(\n model: Model,\n event: ModelEventName,\n context?: TContext,\n): Promise<void> {\n const ctor = model.constructor as any;\n await model.events.emit(event, model, context as TContext);\n await ctor.events().emit(event, model, context as TContext);\n await globalModelEvents.emit(event, model, context as TContext);\n}\n\nexport function onModelEvent<TContext = unknown>(\n model: Model,\n event: ModelEventName,\n listener: ModelEventListener<any, TContext>,\n): () => void {\n return model.events.on(event, listener);\n}\n\nexport function onceModelEvent<TContext = unknown>(\n model: Model,\n event: ModelEventName,\n listener: ModelEventListener<any, TContext>,\n): () => void {\n return model.events.once(event, listener);\n}\n\nexport function offModelEvent<TContext = unknown>(\n model: Model,\n event: ModelEventName,\n listener: ModelEventListener<any, TContext>,\n): void {\n model.events.off(event, listener);\n}\n"],"mappings":";;;AAOA,eAAsB,eACpB,OACA,OACA,SACe;CACf,MAAM,OAAO,MAAM;CACnB,MAAM,MAAM,OAAO,KAAK,OAAO,OAAO,OAAmB;CACzD,MAAM,KAAK,OAAO,CAAC,CAAC,KAAK,OAAO,OAAO,OAAmB;CAC1D,MAAM,kBAAkB,KAAK,OAAO,OAAO,OAAmB;AAChE;AAEA,SAAgB,aACd,OACA,OACA,UACY;CACZ,OAAO,MAAM,OAAO,GAAG,OAAO,QAAQ;AACxC;AAEA,SAAgB,eACd,OACA,OACA,UACY;CACZ,OAAO,MAAM,OAAO,KAAK,OAAO,QAAQ;AAC1C;AAEA,SAAgB,cACd,OACA,OACA,UACM;CACN,MAAM,OAAO,IAAI,OAAO,QAAQ;AAClC"}
1
+ {"version":3,"file":"instance-event-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/instance-event-methods.ts"],"sourcesContent":["import {\n globalModelEvents,\n type ModelEventListener,\n type ModelEventName,\n} from \"../../events/model-events\";\nimport type { Model } from \"../model\";\n\nexport async function emitModelEvent<TContext = unknown>(\n model: Model,\n event: ModelEventName,\n context?: TContext,\n): Promise<void> {\n const ctor = model.constructor as any;\n await model.events.emit(event, model, context as TContext);\n await ctor.events().emit(event, model, context as TContext);\n await globalModelEvents.emit(event, model, context as TContext);\n}\n\nexport function onModelEvent<TContext = unknown>(\n model: Model,\n event: ModelEventName,\n listener: ModelEventListener<any, TContext>,\n): () => void {\n return model.events.on(event, listener);\n}\n\nexport function onceModelEvent<TContext = unknown>(\n model: Model,\n event: ModelEventName,\n listener: ModelEventListener<any, TContext>,\n): () => void {\n return model.events.once(event, listener);\n}\n\nexport function offModelEvent<TContext = unknown>(\n model: Model,\n event: ModelEventName,\n listener: ModelEventListener<any, TContext>,\n): void {\n model.events.off(event, listener);\n}\n"],"mappings":";;;AAOA,eAAsB,eACpB,OACA,OACA,SACe;CACf,MAAM,OAAO,MAAM;CACnB,MAAM,MAAM,OAAO,KAAK,OAAO,OAAO,OAAmB;CACzD,MAAM,KAAK,OAAO,EAAE,KAAK,OAAO,OAAO,OAAmB;CAC1D,MAAM,kBAAkB,KAAK,OAAO,OAAO,OAAmB;AAChE;AAEA,SAAgB,aACd,OACA,OACA,UACY;CACZ,OAAO,MAAM,OAAO,GAAG,OAAO,QAAQ;AACxC;AAEA,SAAgB,eACd,OACA,OACA,UACY;CACZ,OAAO,MAAM,OAAO,KAAK,OAAO,QAAQ;AAC1C;AAEA,SAAgB,cACd,OACA,OACA,UACM;CACN,MAAM,OAAO,IAAI,OAAO,QAAQ;AAClC"}
@@ -1 +1 @@
1
- {"version":3,"file":"meta-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/meta-methods.ts"],"sourcesContent":["import { DatabaseWriter } from \"../../writer/database-writer\";\nimport type { Model } from \"../model\";\n\nexport function applyDefaultsToModel(ModelClass: any, defaults: any): void {\n // Only apply defaults if model doesn't have its own value\n\n // ============================================================================\n // ID Generation\n // ============================================================================\n if (defaults.autoGenerateId !== undefined && ModelClass.autoGenerateId === undefined) {\n ModelClass.autoGenerateId = defaults.autoGenerateId;\n }\n if (defaults.initialId !== undefined && ModelClass.initialId === undefined) {\n ModelClass.initialId = defaults.initialId;\n }\n if (defaults.randomInitialId !== undefined && ModelClass.randomInitialId === undefined) {\n ModelClass.randomInitialId = defaults.randomInitialId;\n }\n if (defaults.incrementIdBy !== undefined && ModelClass.incrementIdBy === undefined) {\n ModelClass.incrementIdBy = defaults.incrementIdBy;\n }\n if (defaults.randomIncrement !== undefined && ModelClass.randomIncrement === undefined) {\n ModelClass.randomIncrement = defaults.randomIncrement;\n }\n\n // ============================================================================\n // Timestamps\n // ============================================================================\n if (defaults.createdAtColumn !== undefined && ModelClass.createdAtColumn === undefined) {\n ModelClass.createdAtColumn = defaults.createdAtColumn;\n }\n\n if (defaults.updatedAtColumn !== undefined && ModelClass.updatedAtColumn === undefined) {\n ModelClass.updatedAtColumn = defaults.updatedAtColumn;\n }\n\n // ============================================================================\n // Deletion\n // ============================================================================\n if (defaults.deleteStrategy !== undefined && ModelClass.deleteStrategy === undefined) {\n ModelClass.deleteStrategy = defaults.deleteStrategy;\n }\n if (defaults.deletedAtColumn !== undefined && ModelClass.deletedAtColumn === undefined) {\n ModelClass.deletedAtColumn = defaults.deletedAtColumn;\n }\n if (defaults.trashTable !== undefined && ModelClass.trashTable === undefined) {\n // Handle function-based trash table\n if (typeof defaults.trashTable === \"function\") {\n ModelClass.trashTable = defaults.trashTable(ModelClass.table);\n } else {\n ModelClass.trashTable = defaults.trashTable;\n }\n }\n\n // ============================================================================\n // Validation\n // ============================================================================\n if (defaults.strictMode !== undefined && ModelClass.strictMode === undefined) {\n ModelClass.strictMode = defaults.strictMode;\n }\n}\n\nexport async function generateModelNextId(model: Model): Promise<number | string> {\n const writer = new DatabaseWriter(model);\n await writer.generateNextId();\n return model.id!;\n}\n\nexport async function performAtomicUpdate(\n model: Model,\n operations: Record<string, unknown>,\n): Promise<number> {\n return model.self().atomic({ id: model.id! }, operations);\n}\n\nexport async function performAtomicIncrement<T extends string>(\n model: Model,\n field: T,\n amount = 1,\n): Promise<number> {\n model.increment(field, amount);\n return performAtomicUpdate(model, {\n $inc: {\n [field]: amount,\n },\n });\n}\n\nexport async function performAtomicDecrement<T extends string>(\n model: Model,\n field: T,\n amount = 1,\n): Promise<number> {\n model.decrement(field, amount);\n return performAtomicUpdate(model, {\n $inc: {\n [field]: -amount,\n },\n });\n}\n"],"mappings":";;;AAGA,SAAgB,qBAAqB,YAAiB,UAAqB;CAMzE,IAAI,SAAS,mBAAmB,UAAa,WAAW,mBAAmB,QACzE,WAAW,iBAAiB,SAAS;CAEvC,IAAI,SAAS,cAAc,UAAa,WAAW,cAAc,QAC/D,WAAW,YAAY,SAAS;CAElC,IAAI,SAAS,oBAAoB,UAAa,WAAW,oBAAoB,QAC3E,WAAW,kBAAkB,SAAS;CAExC,IAAI,SAAS,kBAAkB,UAAa,WAAW,kBAAkB,QACvE,WAAW,gBAAgB,SAAS;CAEtC,IAAI,SAAS,oBAAoB,UAAa,WAAW,oBAAoB,QAC3E,WAAW,kBAAkB,SAAS;CAMxC,IAAI,SAAS,oBAAoB,UAAa,WAAW,oBAAoB,QAC3E,WAAW,kBAAkB,SAAS;CAGxC,IAAI,SAAS,oBAAoB,UAAa,WAAW,oBAAoB,QAC3E,WAAW,kBAAkB,SAAS;CAMxC,IAAI,SAAS,mBAAmB,UAAa,WAAW,mBAAmB,QACzE,WAAW,iBAAiB,SAAS;CAEvC,IAAI,SAAS,oBAAoB,UAAa,WAAW,oBAAoB,QAC3E,WAAW,kBAAkB,SAAS;CAExC,IAAI,SAAS,eAAe,UAAa,WAAW,eAAe,QAEjE,IAAI,OAAO,SAAS,eAAe,YACjC,WAAW,aAAa,SAAS,WAAW,WAAW,KAAK;MAE5D,WAAW,aAAa,SAAS;CAOrC,IAAI,SAAS,eAAe,UAAa,WAAW,eAAe,QACjE,WAAW,aAAa,SAAS;AAErC;AAEA,eAAsB,oBAAoB,OAAwC;CAEhF,MAAM,IADa,eAAe,KACvB,CAAC,CAAC,eAAe;CAC5B,OAAO,MAAM;AACf;AAEA,eAAsB,oBACpB,OACA,YACiB;CACjB,OAAO,MAAM,KAAK,CAAC,CAAC,OAAO,EAAE,IAAI,MAAM,GAAI,GAAG,UAAU;AAC1D;AAEA,eAAsB,uBACpB,OACA,OACA,SAAS,GACQ;CACjB,MAAM,UAAU,OAAO,MAAM;CAC7B,OAAO,oBAAoB,OAAO,EAChC,MAAM,GACH,QAAQ,OACX,EACF,CAAC;AACH;AAEA,eAAsB,uBACpB,OACA,OACA,SAAS,GACQ;CACjB,MAAM,UAAU,OAAO,MAAM;CAC7B,OAAO,oBAAoB,OAAO,EAChC,MAAM,GACH,QAAQ,CAAC,OACZ,EACF,CAAC;AACH"}
1
+ {"version":3,"file":"meta-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/meta-methods.ts"],"sourcesContent":["import { DatabaseWriter } from \"../../writer/database-writer\";\nimport type { Model } from \"../model\";\n\nexport function applyDefaultsToModel(ModelClass: any, defaults: any): void {\n // Only apply defaults if model doesn't have its own value\n\n // ============================================================================\n // ID Generation\n // ============================================================================\n if (defaults.autoGenerateId !== undefined && ModelClass.autoGenerateId === undefined) {\n ModelClass.autoGenerateId = defaults.autoGenerateId;\n }\n if (defaults.initialId !== undefined && ModelClass.initialId === undefined) {\n ModelClass.initialId = defaults.initialId;\n }\n if (defaults.randomInitialId !== undefined && ModelClass.randomInitialId === undefined) {\n ModelClass.randomInitialId = defaults.randomInitialId;\n }\n if (defaults.incrementIdBy !== undefined && ModelClass.incrementIdBy === undefined) {\n ModelClass.incrementIdBy = defaults.incrementIdBy;\n }\n if (defaults.randomIncrement !== undefined && ModelClass.randomIncrement === undefined) {\n ModelClass.randomIncrement = defaults.randomIncrement;\n }\n\n // ============================================================================\n // Timestamps\n // ============================================================================\n if (defaults.createdAtColumn !== undefined && ModelClass.createdAtColumn === undefined) {\n ModelClass.createdAtColumn = defaults.createdAtColumn;\n }\n\n if (defaults.updatedAtColumn !== undefined && ModelClass.updatedAtColumn === undefined) {\n ModelClass.updatedAtColumn = defaults.updatedAtColumn;\n }\n\n // ============================================================================\n // Deletion\n // ============================================================================\n if (defaults.deleteStrategy !== undefined && ModelClass.deleteStrategy === undefined) {\n ModelClass.deleteStrategy = defaults.deleteStrategy;\n }\n if (defaults.deletedAtColumn !== undefined && ModelClass.deletedAtColumn === undefined) {\n ModelClass.deletedAtColumn = defaults.deletedAtColumn;\n }\n if (defaults.trashTable !== undefined && ModelClass.trashTable === undefined) {\n // Handle function-based trash table\n if (typeof defaults.trashTable === \"function\") {\n ModelClass.trashTable = defaults.trashTable(ModelClass.table);\n } else {\n ModelClass.trashTable = defaults.trashTable;\n }\n }\n\n // ============================================================================\n // Validation\n // ============================================================================\n if (defaults.strictMode !== undefined && ModelClass.strictMode === undefined) {\n ModelClass.strictMode = defaults.strictMode;\n }\n}\n\nexport async function generateModelNextId(model: Model): Promise<number | string> {\n const writer = new DatabaseWriter(model);\n await writer.generateNextId();\n return model.id!;\n}\n\nexport async function performAtomicUpdate(\n model: Model,\n operations: Record<string, unknown>,\n): Promise<number> {\n return model.self().atomic({ id: model.id! }, operations);\n}\n\nexport async function performAtomicIncrement<T extends string>(\n model: Model,\n field: T,\n amount = 1,\n): Promise<number> {\n model.increment(field, amount);\n return performAtomicUpdate(model, {\n $inc: {\n [field]: amount,\n },\n });\n}\n\nexport async function performAtomicDecrement<T extends string>(\n model: Model,\n field: T,\n amount = 1,\n): Promise<number> {\n model.decrement(field, amount);\n return performAtomicUpdate(model, {\n $inc: {\n [field]: -amount,\n },\n });\n}\n"],"mappings":";;;AAGA,SAAgB,qBAAqB,YAAiB,UAAqB;CAMzE,IAAI,SAAS,mBAAmB,UAAa,WAAW,mBAAmB,QACzE,WAAW,iBAAiB,SAAS;CAEvC,IAAI,SAAS,cAAc,UAAa,WAAW,cAAc,QAC/D,WAAW,YAAY,SAAS;CAElC,IAAI,SAAS,oBAAoB,UAAa,WAAW,oBAAoB,QAC3E,WAAW,kBAAkB,SAAS;CAExC,IAAI,SAAS,kBAAkB,UAAa,WAAW,kBAAkB,QACvE,WAAW,gBAAgB,SAAS;CAEtC,IAAI,SAAS,oBAAoB,UAAa,WAAW,oBAAoB,QAC3E,WAAW,kBAAkB,SAAS;CAMxC,IAAI,SAAS,oBAAoB,UAAa,WAAW,oBAAoB,QAC3E,WAAW,kBAAkB,SAAS;CAGxC,IAAI,SAAS,oBAAoB,UAAa,WAAW,oBAAoB,QAC3E,WAAW,kBAAkB,SAAS;CAMxC,IAAI,SAAS,mBAAmB,UAAa,WAAW,mBAAmB,QACzE,WAAW,iBAAiB,SAAS;CAEvC,IAAI,SAAS,oBAAoB,UAAa,WAAW,oBAAoB,QAC3E,WAAW,kBAAkB,SAAS;CAExC,IAAI,SAAS,eAAe,UAAa,WAAW,eAAe,QAEjE,IAAI,OAAO,SAAS,eAAe,YACjC,WAAW,aAAa,SAAS,WAAW,WAAW,KAAK;MAE5D,WAAW,aAAa,SAAS;CAOrC,IAAI,SAAS,eAAe,UAAa,WAAW,eAAe,QACjE,WAAW,aAAa,SAAS;AAErC;AAEA,eAAsB,oBAAoB,OAAwC;CAEhF,MAAM,IADa,eAAe,KACvB,EAAE,eAAe;CAC5B,OAAO,MAAM;AACf;AAEA,eAAsB,oBACpB,OACA,YACiB;CACjB,OAAO,MAAM,KAAK,EAAE,OAAO,EAAE,IAAI,MAAM,GAAI,GAAG,UAAU;AAC1D;AAEA,eAAsB,uBACpB,OACA,OACA,SAAS,GACQ;CACjB,MAAM,UAAU,OAAO,MAAM;CAC7B,OAAO,oBAAoB,OAAO,EAChC,MAAM,GACH,QAAQ,OACX,EACF,CAAC;AACH;AAEA,eAAsB,uBACpB,OACA,OACA,SAAS,GACQ;CACjB,MAAM,UAAU,OAAO,MAAM;CAC7B,OAAO,oBAAoB,OAAO,EAChC,MAAM,GACH,QAAQ,CAAC,OACZ,EACF,CAAC;AACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"pivot-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/pivot-methods.ts"],"sourcesContent":["import { createPivotOperations, type PivotOperations } from \"../../relations/pivot-operations\";\nimport type { PivotData, PivotIds } from \"../../relations/types\";\nimport type { Model } from \"../model\";\n\n/**\n * Get the pivot-operations handle for a `belongsToMany` relation.\n *\n * Returns the `PivotOperations` object exposing `attach` / `detach` /\n * `sync` / `toggle` for the named relation's pivot table.\n *\n * @throws Error if the relation is not a belongsToMany relation.\n *\n * @example\n * await post.pivot(\"tags\").attach([1, 2, 3]);\n * await post.pivot(\"tags\").sync([1, 3, 5]);\n * await post.pivot(\"tags\").toggle([1, 7]);\n */\nexport function pivotRelation(model: Model, relation: string): PivotOperations {\n return createPivotOperations(model, relation);\n}\n\n/**\n * Attach one or more related records to a belongsToMany pivot table.\n *\n * @throws Error if the relation is not a belongsToMany relation.\n *\n * @example\n * await post.attach(\"tags\", [1, 2, 3]);\n * await post.attach(\"tags\", [4], { addedBy: currentUserId });\n */\nexport async function attachPivotRelation(\n model: Model,\n relation: string,\n ids: PivotIds,\n pivotData?: PivotData,\n): Promise<void> {\n return createPivotOperations(model, relation).attach(ids, pivotData);\n}\n\n/**\n * Detach related records from a belongsToMany pivot table. Omit `ids` to\n * detach every row for this side of the relation.\n *\n * @throws Error if the relation is not a belongsToMany relation.\n *\n * @example\n * await post.detach(\"tags\", [2]);\n * await post.detach(\"tags\"); // detach all\n */\nexport async function detachPivotRelation(\n model: Model,\n relation: string,\n ids?: PivotIds,\n): Promise<void> {\n return createPivotOperations(model, relation).detach(ids);\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,SAAgB,cAAc,OAAc,UAAmC;CAC7E,OAAO,sBAAsB,OAAO,QAAQ;AAC9C;;;;;;;;;;AAWA,eAAsB,oBACpB,OACA,UACA,KACA,WACe;CACf,OAAO,sBAAsB,OAAO,QAAQ,CAAC,CAAC,OAAO,KAAK,SAAS;AACrE;;;;;;;;;;;AAYA,eAAsB,oBACpB,OACA,UACA,KACe;CACf,OAAO,sBAAsB,OAAO,QAAQ,CAAC,CAAC,OAAO,GAAG;AAC1D"}
1
+ {"version":3,"file":"pivot-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/pivot-methods.ts"],"sourcesContent":["import { createPivotOperations, type PivotOperations } from \"../../relations/pivot-operations\";\nimport type { PivotData, PivotIds } from \"../../relations/types\";\nimport type { Model } from \"../model\";\n\n/**\n * Get the pivot-operations handle for a `belongsToMany` relation.\n *\n * Returns the `PivotOperations` object exposing `attach` / `detach` /\n * `sync` / `toggle` for the named relation's pivot table.\n *\n * @throws Error if the relation is not a belongsToMany relation.\n *\n * @example\n * await post.pivot(\"tags\").attach([1, 2, 3]);\n * await post.pivot(\"tags\").sync([1, 3, 5]);\n * await post.pivot(\"tags\").toggle([1, 7]);\n */\nexport function pivotRelation(model: Model, relation: string): PivotOperations {\n return createPivotOperations(model, relation);\n}\n\n/**\n * Attach one or more related records to a belongsToMany pivot table.\n *\n * @throws Error if the relation is not a belongsToMany relation.\n *\n * @example\n * await post.attach(\"tags\", [1, 2, 3]);\n * await post.attach(\"tags\", [4], { addedBy: currentUserId });\n */\nexport async function attachPivotRelation(\n model: Model,\n relation: string,\n ids: PivotIds,\n pivotData?: PivotData,\n): Promise<void> {\n return createPivotOperations(model, relation).attach(ids, pivotData);\n}\n\n/**\n * Detach related records from a belongsToMany pivot table. Omit `ids` to\n * detach every row for this side of the relation.\n *\n * @throws Error if the relation is not a belongsToMany relation.\n *\n * @example\n * await post.detach(\"tags\", [2]);\n * await post.detach(\"tags\"); // detach all\n */\nexport async function detachPivotRelation(\n model: Model,\n relation: string,\n ids?: PivotIds,\n): Promise<void> {\n return createPivotOperations(model, relation).detach(ids);\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,SAAgB,cAAc,OAAc,UAAmC;CAC7E,OAAO,sBAAsB,OAAO,QAAQ;AAC9C;;;;;;;;;;AAWA,eAAsB,oBACpB,OACA,UACA,KACA,WACe;CACf,OAAO,sBAAsB,OAAO,QAAQ,EAAE,OAAO,KAAK,SAAS;AACrE;;;;;;;;;;;AAYA,eAAsB,oBACpB,OACA,UACA,KACe;CACf,OAAO,sBAAsB,OAAO,QAAQ,EAAE,OAAO,GAAG;AAC1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"query-methods.mjs","names":["ctor"],"sources":["../../../../../../../../cascade/src/model/methods/query-methods.ts"],"sourcesContent":["import type {\r\n PaginationOptions,\r\n PaginationResult,\r\n QueryBuilderContract,\r\n UpdateOperations,\r\n} from \"../../contracts\";\r\nimport type { DataSource } from \"../../data-source/data-source\";\r\nimport { dataSourceRegistry } from \"../../data-source/data-source-registry\";\r\nimport { sanitizeFilter } from \"../../utils/sanitize-filter\";\r\nimport type { ChildModel, GlobalScopeDefinition, Model } from \"../model\";\r\nimport { warnUndeclaredSensitiveFields } from \"./serialization-methods\";\r\n\r\nexport function buildQuery<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n BaseModel: typeof Model,\r\n): QueryBuilderContract<TModel> {\r\n const queryBuilder = ModelClass.newQueryBuilder<TModel>();\r\n const qb = queryBuilder;\r\n\r\n // Collect global scopes from base Model and child model\r\n const allGlobalScopes = new Map<string, GlobalScopeDefinition>([\r\n ...BaseModel.globalScopes,\r\n ...ModelClass.globalScopes,\r\n ]);\r\n\r\n queryBuilder.pendingGlobalScopes = allGlobalScopes;\r\n queryBuilder.availableLocalScopes = ModelClass.localScopes;\r\n queryBuilder.disabledGlobalScopes = new Set();\r\n queryBuilder.relationDefinitions = ModelClass.relations;\r\n queryBuilder.modelClass = ModelClass;\r\n\r\n ModelClass.events().emitFetching(queryBuilder, {\r\n table: ModelClass.table,\r\n modelClass: ModelClass,\r\n });\r\n\r\n queryBuilder.hydrate((data: any) => {\r\n return ModelClass.hydrate(data);\r\n });\r\n\r\n // Eager-loading runs inside the driver's `get()` so it works for any\r\n // builder construction path (Model.query, Model.newQueryBuilder, custom\r\n // subclassed builders). This hook only handles the model-level `fetched`\r\n // event emission.\r\n queryBuilder.onFetched(async (models: any[]) => {\r\n await ModelClass.events().emit(\"fetched\", models as any, {});\r\n });\r\n\r\n return queryBuilder;\r\n}\r\n\r\nexport function buildNewQueryBuilder<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n): QueryBuilderContract<TModel> {\r\n const dataSource = ModelClass.getDataSource();\r\n\r\n if (ModelClass.builder) {\r\n const BuilderClass = ModelClass.builder;\r\n return new BuilderClass(ModelClass.table, dataSource) as QueryBuilderContract<TModel>;\r\n }\r\n\r\n const queryBuilder = dataSource.driver.queryBuilder<TModel>(ModelClass.table);\r\n return queryBuilder;\r\n}\r\n\r\nexport async function findFirst<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter?: Record<string, unknown>,\r\n): Promise<TModel | null> {\r\n const query = ModelClass.query();\r\n if (filter) {\r\n query.where(filter);\r\n }\r\n return query.first();\r\n}\r\n\r\nexport async function findLast<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter?: Record<string, unknown>,\r\n): Promise<TModel | null> {\r\n const query = ModelClass.query();\r\n if (filter) {\r\n query.where(filter);\r\n }\r\n\r\n return query.last();\r\n}\r\n\r\nexport async function findAll<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter?: Record<string, unknown>,\r\n): Promise<TModel[]> {\r\n const query = ModelClass.query();\r\n if (filter) {\r\n query.where(filter);\r\n }\r\n return query.get();\r\n}\r\n\r\nexport function countRecords<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter?: Record<string, unknown>,\r\n): Promise<number> {\r\n const query = ModelClass.query();\r\n if (filter) {\r\n query.where(filter);\r\n }\r\n return query.count();\r\n}\r\n\r\nexport async function findById<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n id: string | number,\r\n): Promise<TModel | null> {\r\n const query = ModelClass.query();\r\n return query.where(ModelClass.primaryKey, id).first();\r\n}\r\n\r\nexport async function paginateRecords<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n options: PaginationOptions & { filter?: Record<string, unknown> } = {},\r\n): Promise<PaginationResult<TModel>> {\r\n const query = ModelClass.query();\r\n if (options.filter) {\r\n query.where(options.filter);\r\n }\r\n\r\n return query.paginate({\r\n limit: options.limit,\r\n page: options.page,\r\n });\r\n}\r\n\r\nexport async function findLatest<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter?: Record<string, unknown>,\r\n): Promise<TModel[]> {\r\n const query = ModelClass.query();\r\n if (filter) {\r\n query.where(filter);\r\n }\r\n return (await query.latest()) as unknown as TModel[];\r\n}\r\n\r\nexport function increaseField<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Record<string, unknown>,\r\n field: string,\r\n amount: number,\r\n): Promise<number> {\r\n const query = ModelClass.query().where(filter);\r\n return query.increment(field, amount);\r\n}\r\n\r\nexport function decreaseField<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Record<string, unknown>,\r\n field: string,\r\n amount: number,\r\n): Promise<number> {\r\n const query = ModelClass.query().where(filter);\r\n return query.decrement(field, amount);\r\n}\r\n\r\n// The atomic/find-and-modify statics below forward their filter straight to\r\n// the driver — they never pass through where(), so they must run the same\r\n// operator-injection check themselves. Only the FILTER is sanitized; update\r\n// operators ($set/$inc/…) are the point of these APIs and stay untouched.\r\nexport async function performAtomic<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Record<string, unknown>,\r\n operations: UpdateOperations,\r\n): Promise<number> {\r\n const result = await ModelClass.getDriver().atomic(\r\n ModelClass.table,\r\n sanitizeFilter(filter),\r\n operations,\r\n );\r\n return result.modifiedCount;\r\n}\r\n\r\nexport async function updateById<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n id: string | number,\r\n data: Record<string, unknown>,\r\n): Promise<number> {\r\n const result = await ModelClass.getDriver().update(ModelClass.table, { [ModelClass.primaryKey]: id }, { $set: data });\r\n return result.modifiedCount;\r\n}\r\n\r\nexport async function findAndUpdateRecords<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Record<string, unknown>,\r\n update: UpdateOperations,\r\n): Promise<TModel[]> {\r\n await performAtomic(ModelClass, filter, update);\r\n return await ModelClass.query().where(filter).get();\r\n}\r\n\r\nexport async function findOneAndUpdateRecord<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Record<string, unknown>,\r\n update: UpdateOperations,\r\n): Promise<TModel | null> {\r\n const result = await ModelClass.getDriver().findOneAndUpdate(\r\n ModelClass.table,\r\n sanitizeFilter(filter),\r\n update,\r\n );\r\n if (!result) return null;\r\n const ctor = ModelClass as any;\r\n return new ctor(result);\r\n}\r\n\r\nexport async function findAndReplaceRecord<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Record<string, unknown>,\r\n document: Record<string, unknown>,\r\n): Promise<TModel | null> {\r\n const result = await ModelClass.getDriver().replace(\r\n ModelClass.table,\r\n sanitizeFilter(filter),\r\n document,\r\n );\r\n if (!result) return null;\r\n const ctor = ModelClass as any;\r\n return new ctor(result);\r\n}\r\n\r\nexport async function findOneAndDeleteRecord<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Record<string, unknown>,\r\n options?: Record<string, unknown>,\r\n): Promise<TModel | null> {\r\n const driver = ModelClass.getDriver();\r\n const result = await driver.findOneAndDelete(ModelClass.table, sanitizeFilter(filter), options);\r\n\r\n if (!result) {\r\n return null;\r\n }\r\n\r\n const model = ModelClass.hydrate(result as Record<string, unknown>);\r\n model.dirtyTracker.reset();\r\n return model;\r\n}\r\n\r\nexport function resolveDataSource<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n): DataSource {\r\n const ref = ModelClass.dataSource;\r\n let dataSource: DataSource;\r\n\r\n if (typeof ref === \"string\") {\r\n dataSource = dataSourceRegistry.get(ref);\r\n } else if (ref) {\r\n dataSource = ref;\r\n } else {\r\n dataSource = dataSourceRegistry.get();\r\n }\r\n\r\n if (!ModelClass.hasOwnProperty(\"_defaultsApplied\")) {\r\n const driverDefaults = dataSource.driver.modelDefaults || {};\r\n const dataSourceDefaults = dataSource.modelDefaults || {};\r\n\r\n const mergedDefaults = {\r\n ...driverDefaults,\r\n ...dataSourceDefaults,\r\n };\r\n\r\n if (Object.keys(mergedDefaults).length > 0) {\r\n (ModelClass as any).applyModelDefaults(mergedDefaults);\r\n }\r\n\r\n (ModelClass as any)._defaultsApplied = true;\r\n }\r\n\r\n // First data-source resolution is the earliest per-class hook every model\r\n // passes through — warn here (once) if the schema carries credential-shaped\r\n // fields that toJSON() would expose.\r\n warnUndeclaredSensitiveFields(ModelClass);\r\n\r\n return dataSource;\r\n}\r\n"],"mappings":";;;;;AAYA,SAAgB,WACd,YACA,WAC8B;CAC9B,MAAM,eAAe,WAAW,gBAAwB;CASxD,aAAa,sBAAsB,IALP,IAAmC,CAC7D,GAAG,UAAU,cACb,GAAG,WAAW,YAChB,CAEiD;CACjD,aAAa,uBAAuB,WAAW;CAC/C,aAAa,uCAAuB,IAAI,IAAI;CAC5C,aAAa,sBAAsB,WAAW;CAC9C,aAAa,aAAa;CAE1B,WAAW,OAAO,CAAC,CAAC,aAAa,cAAc;EAC7C,OAAO,WAAW;EAClB,YAAY;CACd,CAAC;CAED,aAAa,SAAS,SAAc;EAClC,OAAO,WAAW,QAAQ,IAAI;CAChC,CAAC;CAMD,aAAa,UAAU,OAAO,WAAkB;EAC9C,MAAM,WAAW,OAAO,CAAC,CAAC,KAAK,WAAW,QAAe,CAAC,CAAC;CAC7D,CAAC;CAED,OAAO;AACT;AAEA,SAAgB,qBACd,YAC8B;CAC9B,MAAM,aAAa,WAAW,cAAc;CAE5C,IAAI,WAAW,SAAS;EACtB,MAAM,eAAe,WAAW;EAChC,OAAO,IAAI,aAAa,WAAW,OAAO,UAAU;CACtD;CAGA,OADqB,WAAW,OAAO,aAAqB,WAAW,KACrD;AACpB;AAEA,eAAsB,UACpB,YACA,QACwB;CACxB,MAAM,QAAQ,WAAW,MAAM;CAC/B,IAAI,QACF,MAAM,MAAM,MAAM;CAEpB,OAAO,MAAM,MAAM;AACrB;AAEA,eAAsB,SACpB,YACA,QACwB;CACxB,MAAM,QAAQ,WAAW,MAAM;CAC/B,IAAI,QACF,MAAM,MAAM,MAAM;CAGpB,OAAO,MAAM,KAAK;AACpB;AAEA,eAAsB,QACpB,YACA,QACmB;CACnB,MAAM,QAAQ,WAAW,MAAM;CAC/B,IAAI,QACF,MAAM,MAAM,MAAM;CAEpB,OAAO,MAAM,IAAI;AACnB;AAEA,SAAgB,aACd,YACA,QACiB;CACjB,MAAM,QAAQ,WAAW,MAAM;CAC/B,IAAI,QACF,MAAM,MAAM,MAAM;CAEpB,OAAO,MAAM,MAAM;AACrB;AAEA,eAAsB,SACpB,YACA,IACwB;CAExB,OADc,WAAW,MACd,CAAC,CAAC,MAAM,WAAW,YAAY,EAAE,CAAC,CAAC,MAAM;AACtD;AAEA,eAAsB,gBACpB,YACA,UAAoE,CAAC,GAClC;CACnC,MAAM,QAAQ,WAAW,MAAM;CAC/B,IAAI,QAAQ,QACV,MAAM,MAAM,QAAQ,MAAM;CAG5B,OAAO,MAAM,SAAS;EACpB,OAAO,QAAQ;EACf,MAAM,QAAQ;CAChB,CAAC;AACH;AAEA,eAAsB,WACpB,YACA,QACmB;CACnB,MAAM,QAAQ,WAAW,MAAM;CAC/B,IAAI,QACF,MAAM,MAAM,MAAM;CAEpB,OAAQ,MAAM,MAAM,OAAO;AAC7B;AAEA,SAAgB,cACd,YACA,QACA,OACA,QACiB;CAEjB,OADc,WAAW,MAAM,CAAC,CAAC,MAAM,MAC5B,CAAC,CAAC,UAAU,OAAO,MAAM;AACtC;AAEA,SAAgB,cACd,YACA,QACA,OACA,QACiB;CAEjB,OADc,WAAW,MAAM,CAAC,CAAC,MAAM,MAC5B,CAAC,CAAC,UAAU,OAAO,MAAM;AACtC;AAMA,eAAsB,cACpB,YACA,QACA,YACiB;CAMjB,QAAO,MALc,WAAW,UAAU,CAAC,CAAC,OAC1C,WAAW,OACX,eAAe,MAAM,GACrB,UACF,EACa,CAAC;AAChB;AAEA,eAAsB,WACpB,YACA,IACA,MACiB;CAEjB,QAAO,MADc,WAAW,UAAU,CAAC,CAAC,OAAO,WAAW,OAAO,GAAG,WAAW,aAAa,GAAG,GAAG,EAAE,MAAM,KAAK,CAAC,EACvG,CAAC;AAChB;AAEA,eAAsB,qBACpB,YACA,QACA,QACmB;CACnB,MAAM,cAAc,YAAY,QAAQ,MAAM;CAC9C,OAAO,MAAM,WAAW,MAAM,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,IAAI;AACpD;AAEA,eAAsB,uBACpB,YACA,QACA,QACwB;CACxB,MAAM,SAAS,MAAM,WAAW,UAAU,CAAC,CAAC,iBAC1C,WAAW,OACX,eAAe,MAAM,GACrB,MACF;CACA,IAAI,CAAC,QAAQ,OAAO;CAEpB,OAAO,IAAIA,WAAK,MAAM;AACxB;AAEA,eAAsB,qBACpB,YACA,QACA,UACwB;CACxB,MAAM,SAAS,MAAM,WAAW,UAAU,CAAC,CAAC,QAC1C,WAAW,OACX,eAAe,MAAM,GACrB,QACF;CACA,IAAI,CAAC,QAAQ,OAAO;CAEpB,OAAO,IAAIA,WAAK,MAAM;AACxB;AAEA,eAAsB,uBACpB,YACA,QACA,SACwB;CAExB,MAAM,SAAS,MADA,WAAW,UACA,CAAC,CAAC,iBAAiB,WAAW,OAAO,eAAe,MAAM,GAAG,OAAO;CAE9F,IAAI,CAAC,QACH,OAAO;CAGT,MAAM,QAAQ,WAAW,QAAQ,MAAiC;CAClE,MAAM,aAAa,MAAM;CACzB,OAAO;AACT;AAEA,SAAgB,kBACd,YACY;CACZ,MAAM,MAAM,WAAW;CACvB,IAAI;CAEJ,IAAI,OAAO,QAAQ,UACjB,aAAa,mBAAmB,IAAI,GAAG;MAClC,IAAI,KACT,aAAa;MAEb,aAAa,mBAAmB,IAAI;CAGtC,IAAI,CAAC,WAAW,eAAe,kBAAkB,GAAG;EAClD,MAAM,iBAAiB,WAAW,OAAO,iBAAiB,CAAC;EAC3D,MAAM,qBAAqB,WAAW,iBAAiB,CAAC;EAExD,MAAM,iBAAiB;GACrB,GAAG;GACH,GAAG;EACL;EAEA,IAAI,OAAO,KAAK,cAAc,CAAC,CAAC,SAAS,GACvC,AAAC,WAAmB,mBAAmB,cAAc;EAGvD,AAAC,WAAmB,mBAAmB;CACzC;CAKA,8BAA8B,UAAU;CAExC,OAAO;AACT"}
1
+ {"version":3,"file":"query-methods.mjs","names":["ctor"],"sources":["../../../../../../../../cascade/src/model/methods/query-methods.ts"],"sourcesContent":["import type {\r\n PaginationOptions,\r\n PaginationResult,\r\n QueryBuilderContract,\r\n UpdateOperations,\r\n} from \"../../contracts\";\r\nimport type { DataSource } from \"../../data-source/data-source\";\r\nimport { dataSourceRegistry } from \"../../data-source/data-source-registry\";\r\nimport { sanitizeFilter } from \"../../utils/sanitize-filter\";\r\nimport type { ChildModel, GlobalScopeDefinition, Model } from \"../model\";\r\nimport { warnUndeclaredSensitiveFields } from \"./serialization-methods\";\r\n\r\nexport function buildQuery<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n BaseModel: typeof Model,\r\n): QueryBuilderContract<TModel> {\r\n const queryBuilder = ModelClass.newQueryBuilder<TModel>();\r\n const qb = queryBuilder;\r\n\r\n // Collect global scopes from base Model and child model\r\n const allGlobalScopes = new Map<string, GlobalScopeDefinition>([\r\n ...BaseModel.globalScopes,\r\n ...ModelClass.globalScopes,\r\n ]);\r\n\r\n queryBuilder.pendingGlobalScopes = allGlobalScopes;\r\n queryBuilder.availableLocalScopes = ModelClass.localScopes;\r\n queryBuilder.disabledGlobalScopes = new Set();\r\n queryBuilder.relationDefinitions = ModelClass.relations;\r\n queryBuilder.modelClass = ModelClass;\r\n\r\n ModelClass.events().emitFetching(queryBuilder, {\r\n table: ModelClass.table,\r\n modelClass: ModelClass,\r\n });\r\n\r\n queryBuilder.hydrate((data: any) => {\r\n return ModelClass.hydrate(data);\r\n });\r\n\r\n // Eager-loading runs inside the driver's `get()` so it works for any\r\n // builder construction path (Model.query, Model.newQueryBuilder, custom\r\n // subclassed builders). This hook only handles the model-level `fetched`\r\n // event emission.\r\n queryBuilder.onFetched(async (models: any[]) => {\r\n await ModelClass.events().emit(\"fetched\", models as any, {});\r\n });\r\n\r\n return queryBuilder;\r\n}\r\n\r\nexport function buildNewQueryBuilder<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n): QueryBuilderContract<TModel> {\r\n const dataSource = ModelClass.getDataSource();\r\n\r\n if (ModelClass.builder) {\r\n const BuilderClass = ModelClass.builder;\r\n return new BuilderClass(ModelClass.table, dataSource) as QueryBuilderContract<TModel>;\r\n }\r\n\r\n const queryBuilder = dataSource.driver.queryBuilder<TModel>(ModelClass.table);\r\n return queryBuilder;\r\n}\r\n\r\nexport async function findFirst<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter?: Record<string, unknown>,\r\n): Promise<TModel | null> {\r\n const query = ModelClass.query();\r\n if (filter) {\r\n query.where(filter);\r\n }\r\n return query.first();\r\n}\r\n\r\nexport async function findLast<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter?: Record<string, unknown>,\r\n): Promise<TModel | null> {\r\n const query = ModelClass.query();\r\n if (filter) {\r\n query.where(filter);\r\n }\r\n\r\n return query.last();\r\n}\r\n\r\nexport async function findAll<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter?: Record<string, unknown>,\r\n): Promise<TModel[]> {\r\n const query = ModelClass.query();\r\n if (filter) {\r\n query.where(filter);\r\n }\r\n return query.get();\r\n}\r\n\r\nexport function countRecords<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter?: Record<string, unknown>,\r\n): Promise<number> {\r\n const query = ModelClass.query();\r\n if (filter) {\r\n query.where(filter);\r\n }\r\n return query.count();\r\n}\r\n\r\nexport async function findById<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n id: string | number,\r\n): Promise<TModel | null> {\r\n const query = ModelClass.query();\r\n return query.where(ModelClass.primaryKey, id).first();\r\n}\r\n\r\nexport async function paginateRecords<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n options: PaginationOptions & { filter?: Record<string, unknown> } = {},\r\n): Promise<PaginationResult<TModel>> {\r\n const query = ModelClass.query();\r\n if (options.filter) {\r\n query.where(options.filter);\r\n }\r\n\r\n return query.paginate({\r\n limit: options.limit,\r\n page: options.page,\r\n });\r\n}\r\n\r\nexport async function findLatest<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter?: Record<string, unknown>,\r\n): Promise<TModel[]> {\r\n const query = ModelClass.query();\r\n if (filter) {\r\n query.where(filter);\r\n }\r\n return (await query.latest()) as unknown as TModel[];\r\n}\r\n\r\nexport function increaseField<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Record<string, unknown>,\r\n field: string,\r\n amount: number,\r\n): Promise<number> {\r\n const query = ModelClass.query().where(filter);\r\n return query.increment(field, amount);\r\n}\r\n\r\nexport function decreaseField<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Record<string, unknown>,\r\n field: string,\r\n amount: number,\r\n): Promise<number> {\r\n const query = ModelClass.query().where(filter);\r\n return query.decrement(field, amount);\r\n}\r\n\r\n// The atomic/find-and-modify statics below forward their filter straight to\r\n// the driver — they never pass through where(), so they must run the same\r\n// operator-injection check themselves. Only the FILTER is sanitized; update\r\n// operators ($set/$inc/…) are the point of these APIs and stay untouched.\r\nexport async function performAtomic<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Record<string, unknown>,\r\n operations: UpdateOperations,\r\n): Promise<number> {\r\n const result = await ModelClass.getDriver().atomic(\r\n ModelClass.table,\r\n sanitizeFilter(filter),\r\n operations,\r\n );\r\n return result.modifiedCount;\r\n}\r\n\r\nexport async function updateById<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n id: string | number,\r\n data: Record<string, unknown>,\r\n): Promise<number> {\r\n const result = await ModelClass.getDriver().update(ModelClass.table, { [ModelClass.primaryKey]: id }, { $set: data });\r\n return result.modifiedCount;\r\n}\r\n\r\nexport async function findAndUpdateRecords<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Record<string, unknown>,\r\n update: UpdateOperations,\r\n): Promise<TModel[]> {\r\n await performAtomic(ModelClass, filter, update);\r\n return await ModelClass.query().where(filter).get();\r\n}\r\n\r\nexport async function findOneAndUpdateRecord<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Record<string, unknown>,\r\n update: UpdateOperations,\r\n): Promise<TModel | null> {\r\n const result = await ModelClass.getDriver().findOneAndUpdate(\r\n ModelClass.table,\r\n sanitizeFilter(filter),\r\n update,\r\n );\r\n if (!result) return null;\r\n const ctor = ModelClass as any;\r\n return new ctor(result);\r\n}\r\n\r\nexport async function findAndReplaceRecord<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Record<string, unknown>,\r\n document: Record<string, unknown>,\r\n): Promise<TModel | null> {\r\n const result = await ModelClass.getDriver().replace(\r\n ModelClass.table,\r\n sanitizeFilter(filter),\r\n document,\r\n );\r\n if (!result) return null;\r\n const ctor = ModelClass as any;\r\n return new ctor(result);\r\n}\r\n\r\nexport async function findOneAndDeleteRecord<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Record<string, unknown>,\r\n options?: Record<string, unknown>,\r\n): Promise<TModel | null> {\r\n const driver = ModelClass.getDriver();\r\n const result = await driver.findOneAndDelete(ModelClass.table, sanitizeFilter(filter), options);\r\n\r\n if (!result) {\r\n return null;\r\n }\r\n\r\n const model = ModelClass.hydrate(result as Record<string, unknown>);\r\n model.dirtyTracker.reset();\r\n return model;\r\n}\r\n\r\nexport function resolveDataSource<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n): DataSource {\r\n const ref = ModelClass.dataSource;\r\n let dataSource: DataSource;\r\n\r\n if (typeof ref === \"string\") {\r\n dataSource = dataSourceRegistry.get(ref);\r\n } else if (ref) {\r\n dataSource = ref;\r\n } else {\r\n dataSource = dataSourceRegistry.get();\r\n }\r\n\r\n if (!ModelClass.hasOwnProperty(\"_defaultsApplied\")) {\r\n const driverDefaults = dataSource.driver.modelDefaults || {};\r\n const dataSourceDefaults = dataSource.modelDefaults || {};\r\n\r\n const mergedDefaults = {\r\n ...driverDefaults,\r\n ...dataSourceDefaults,\r\n };\r\n\r\n if (Object.keys(mergedDefaults).length > 0) {\r\n (ModelClass as any).applyModelDefaults(mergedDefaults);\r\n }\r\n\r\n (ModelClass as any)._defaultsApplied = true;\r\n }\r\n\r\n // First data-source resolution is the earliest per-class hook every model\r\n // passes through — warn here (once) if the schema carries credential-shaped\r\n // fields that toJSON() would expose.\r\n warnUndeclaredSensitiveFields(ModelClass);\r\n\r\n return dataSource;\r\n}\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"restore-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/restore-methods.ts"],"sourcesContent":["import { DatabaseRestorer } from \"../../restorer/database-restorer\";\nimport type { ChildModel, Model } from \"../model\";\n\nexport async function restoreRecord<TModel extends Model>(\n ModelClass: ChildModel<TModel>,\n id: string | number,\n options?: { onIdConflict?: \"fail\" | \"assignNew\"; skipEvents?: boolean },\n): Promise<TModel> {\n const restorer = new DatabaseRestorer(ModelClass as unknown as typeof Model);\n const result = await restorer.restore(id, options);\n\n if (!result.restoredRecord) {\n throw new Error(\n `Failed to restore ${ModelClass.name} with ${ModelClass.primaryKey} ${id}: no record returned.`,\n );\n }\n\n return result.restoredRecord as TModel;\n}\n\nexport async function restoreAllRecords<TModel extends Model>(\n ModelClass: ChildModel<TModel>,\n options?: { onIdConflict?: \"fail\" | \"assignNew\"; skipEvents?: boolean },\n): Promise<TModel[]> {\n const restorer = new DatabaseRestorer(ModelClass as unknown as typeof Model);\n const result = await restorer.restoreAll(options);\n\n return result.restoredCount === 0 ? [] : (result.restoredRecords as TModel[]);\n}\n"],"mappings":";;;AAGA,eAAsB,cACpB,YACA,IACA,SACiB;CAEjB,MAAM,SAAS,MAAM,IADA,iBAAiB,UACV,CAAC,CAAC,QAAQ,IAAI,OAAO;CAEjD,IAAI,CAAC,OAAO,gBACV,MAAM,IAAI,MACR,qBAAqB,WAAW,KAAK,QAAQ,WAAW,WAAW,GAAG,GAAG,sBAC3E;CAGF,OAAO,OAAO;AAChB;AAEA,eAAsB,kBACpB,YACA,SACmB;CAEnB,MAAM,SAAS,MAAM,IADA,iBAAiB,UACV,CAAC,CAAC,WAAW,OAAO;CAEhD,OAAO,OAAO,kBAAkB,IAAI,CAAC,IAAK,OAAO;AACnD"}
1
+ {"version":3,"file":"restore-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/restore-methods.ts"],"sourcesContent":["import { DatabaseRestorer } from \"../../restorer/database-restorer\";\nimport type { ChildModel, Model } from \"../model\";\n\nexport async function restoreRecord<TModel extends Model>(\n ModelClass: ChildModel<TModel>,\n id: string | number,\n options?: { onIdConflict?: \"fail\" | \"assignNew\"; skipEvents?: boolean },\n): Promise<TModel> {\n const restorer = new DatabaseRestorer(ModelClass as unknown as typeof Model);\n const result = await restorer.restore(id, options);\n\n if (!result.restoredRecord) {\n throw new Error(\n `Failed to restore ${ModelClass.name} with ${ModelClass.primaryKey} ${id}: no record returned.`,\n );\n }\n\n return result.restoredRecord as TModel;\n}\n\nexport async function restoreAllRecords<TModel extends Model>(\n ModelClass: ChildModel<TModel>,\n options?: { onIdConflict?: \"fail\" | \"assignNew\"; skipEvents?: boolean },\n): Promise<TModel[]> {\n const restorer = new DatabaseRestorer(ModelClass as unknown as typeof Model);\n const result = await restorer.restoreAll(options);\n\n return result.restoredCount === 0 ? [] : (result.restoredRecords as TModel[]);\n}\n"],"mappings":";;;AAGA,eAAsB,cACpB,YACA,IACA,SACiB;CAEjB,MAAM,SAAS,MAAM,IADA,iBAAiB,UACV,EAAE,QAAQ,IAAI,OAAO;CAEjD,IAAI,CAAC,OAAO,gBACV,MAAM,IAAI,MACR,qBAAqB,WAAW,KAAK,QAAQ,WAAW,WAAW,GAAG,GAAG,sBAC3E;CAGF,OAAO,OAAO;AAChB;AAEA,eAAsB,kBACpB,YACA,SACmB;CAEnB,MAAM,SAAS,MAAM,IADA,iBAAiB,UACV,EAAE,WAAW,OAAO;CAEhD,OAAO,OAAO,kBAAkB,IAAI,CAAC,IAAK,OAAO;AACnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"scope-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/scope-methods.ts"],"sourcesContent":["import type { QueryBuilderContract } from \"../../contracts\";\nimport type { GlobalScopeOptions, LocalScopeCallback, ChildModel, Model } from \"../model\";\n\n/**\n * Give the model class its OWN scope map before mutating.\n *\n * The `globalScopes` / `localScopes` statics live on the base `Model`; without\n * this, `ModelClass.globalScopes.set(...)` from any subclass mutates the ONE\n * inherited Map and the scope leaks onto every other model (a soft-delete\n * `notDeleted` scope registered on `User` would filter `Post` too). The own\n * map snapshots the currently-inherited entries so parent scopes registered so\n * far are kept.\n */\nfunction ownScopeMap(\n ModelClass: ChildModel<any>,\n property: \"globalScopes\" | \"localScopes\",\n): Map<string, any> {\n if (!Object.prototype.hasOwnProperty.call(ModelClass, property)) {\n (ModelClass as any)[property] = new Map((ModelClass as any)[property]);\n }\n\n return (ModelClass as any)[property];\n}\n\nexport function addGlobalModelScope(\n ModelClass: ChildModel<any>,\n name: string,\n callback: (query: QueryBuilderContract) => void,\n options: GlobalScopeOptions = {},\n): void {\n ownScopeMap(ModelClass, \"globalScopes\").set(name, {\n callback,\n timing: options.timing || \"before\",\n });\n}\n\nexport function removeGlobalModelScope(ModelClass: ChildModel<any>, name: string): void {\n ownScopeMap(ModelClass, \"globalScopes\").delete(name);\n}\n\nexport function addLocalModelScope(\n ModelClass: ChildModel<any>,\n name: string,\n callback: LocalScopeCallback,\n): void {\n ownScopeMap(ModelClass, \"localScopes\").set(name, callback);\n}\n\nexport function removeLocalModelScope(ModelClass: ChildModel<any>, name: string): void {\n ownScopeMap(ModelClass, \"localScopes\").delete(name);\n}\n"],"mappings":";;;;;;;;;;;AAaA,SAAS,YACP,YACA,UACkB;CAClB,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,YAAY,QAAQ,GAC5D,AAAC,WAAmB,YAAY,IAAI,IAAK,WAAmB,SAAS;CAGvE,OAAQ,WAAmB;AAC7B;AAEA,SAAgB,oBACd,YACA,MACA,UACA,UAA8B,CAAC,GACzB;CACN,YAAY,YAAY,cAAc,CAAC,CAAC,IAAI,MAAM;EAChD;EACA,QAAQ,QAAQ,UAAU;CAC5B,CAAC;AACH;AAEA,SAAgB,uBAAuB,YAA6B,MAAoB;CACtF,YAAY,YAAY,cAAc,CAAC,CAAC,OAAO,IAAI;AACrD;AAEA,SAAgB,mBACd,YACA,MACA,UACM;CACN,YAAY,YAAY,aAAa,CAAC,CAAC,IAAI,MAAM,QAAQ;AAC3D;AAEA,SAAgB,sBAAsB,YAA6B,MAAoB;CACrF,YAAY,YAAY,aAAa,CAAC,CAAC,OAAO,IAAI;AACpD"}
1
+ {"version":3,"file":"scope-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/scope-methods.ts"],"sourcesContent":["import type { QueryBuilderContract } from \"../../contracts\";\nimport type { GlobalScopeOptions, LocalScopeCallback, ChildModel, Model } from \"../model\";\n\n/**\n * Give the model class its OWN scope map before mutating.\n *\n * The `globalScopes` / `localScopes` statics live on the base `Model`; without\n * this, `ModelClass.globalScopes.set(...)` from any subclass mutates the ONE\n * inherited Map and the scope leaks onto every other model (a soft-delete\n * `notDeleted` scope registered on `User` would filter `Post` too). The own\n * map snapshots the currently-inherited entries so parent scopes registered so\n * far are kept.\n */\nfunction ownScopeMap(\n ModelClass: ChildModel<any>,\n property: \"globalScopes\" | \"localScopes\",\n): Map<string, any> {\n if (!Object.prototype.hasOwnProperty.call(ModelClass, property)) {\n (ModelClass as any)[property] = new Map((ModelClass as any)[property]);\n }\n\n return (ModelClass as any)[property];\n}\n\nexport function addGlobalModelScope(\n ModelClass: ChildModel<any>,\n name: string,\n callback: (query: QueryBuilderContract) => void,\n options: GlobalScopeOptions = {},\n): void {\n ownScopeMap(ModelClass, \"globalScopes\").set(name, {\n callback,\n timing: options.timing || \"before\",\n });\n}\n\nexport function removeGlobalModelScope(ModelClass: ChildModel<any>, name: string): void {\n ownScopeMap(ModelClass, \"globalScopes\").delete(name);\n}\n\nexport function addLocalModelScope(\n ModelClass: ChildModel<any>,\n name: string,\n callback: LocalScopeCallback,\n): void {\n ownScopeMap(ModelClass, \"localScopes\").set(name, callback);\n}\n\nexport function removeLocalModelScope(ModelClass: ChildModel<any>, name: string): void {\n ownScopeMap(ModelClass, \"localScopes\").delete(name);\n}\n"],"mappings":";;;;;;;;;;;AAaA,SAAS,YACP,YACA,UACkB;CAClB,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,YAAY,QAAQ,GAC5D,AAAC,WAAmB,YAAY,IAAI,IAAK,WAAmB,SAAS;CAGvE,OAAQ,WAAmB;AAC7B;AAEA,SAAgB,oBACd,YACA,MACA,UACA,UAA8B,CAAC,GACzB;CACN,YAAY,YAAY,cAAc,EAAE,IAAI,MAAM;EAChD;EACA,QAAQ,QAAQ,UAAU;CAC5B,CAAC;AACH;AAEA,SAAgB,uBAAuB,YAA6B,MAAoB;CACtF,YAAY,YAAY,cAAc,EAAE,OAAO,IAAI;AACrD;AAEA,SAAgB,mBACd,YACA,MACA,UACM;CACN,YAAY,YAAY,aAAa,EAAE,IAAI,MAAM,QAAQ;AAC3D;AAEA,SAAgB,sBAAsB,YAA6B,MAAoB;CACrF,YAAY,YAAY,aAAa,EAAE,OAAO,IAAI;AACpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"serialization-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/serialization-methods.ts"],"sourcesContent":["import type { GenericObject } from \"@mongez/reinforcements\";\nimport type { ChildModel, Model } from \"../model\";\n\n/**\n * Field names that commonly hold credentials/secrets. Used only to emit a\n * one-time warning when such a field exists in a model's schema but is not\n * covered by `hidden`/`resource`/`toJsonColumns` — the fail-open default\n * (`toJSON()` returns the raw document) would leak it.\n */\nconst SENSITIVE_FIELD_PATTERN = /^(password|passwordHash|secret|token|apiKey|api_key)$/i;\n\nconst warnedModelClasses = new WeakSet<object>();\n\n/**\n * Warn once per model class when its schema declares a sensitive-looking field\n * that serialization would expose: no `hidden` entry for it, no `resource`\n * class, and no `toJsonColumns` allow-list excluding it.\n *\n * A warning rather than an error — the fail-open `toJSON()` default is kept\n * for compatibility, but it should at least be loud.\n */\nexport function warnUndeclaredSensitiveFields(ModelClass: ChildModel<Model>): void {\n if (warnedModelClasses.has(ModelClass)) return;\n warnedModelClasses.add(ModelClass);\n\n const schema = ModelClass.schema;\n if (!schema) return;\n\n const hidden = ModelClass.hidden ?? [];\n const toJsonColumns = ModelClass.toJsonColumns;\n\n const exposed = Object.keys(schema.schema).filter((field) => {\n if (!SENSITIVE_FIELD_PATTERN.test(field)) return false;\n if (hidden.includes(field)) return false;\n if (ModelClass.resource) return false;\n if (toJsonColumns && toJsonColumns.length > 0 && !toJsonColumns.includes(field)) return false;\n return true;\n });\n\n if (exposed.length === 0) return;\n\n console.warn(\n `[cascade] Model \"${ModelClass.name}\" (table \"${ModelClass.table}\") has sensitive-looking schema field(s) ${exposed\n .map((field) => `\"${field}\"`)\n .join(\", \")} that toJSON()/JSON.stringify() will include in output. ` +\n `Add them to \\`static hidden = [...]\\` (or configure \\`resource\\`/\\`toJsonColumns\\`) so they cannot leak via res.json(model).`,\n );\n}\n\n/**\n * Return `data` without the model's `hidden` top-level fields.\n * Returns `data` untouched (same reference) when nothing is hidden.\n */\nfunction stripHiddenFields(\n data: Record<string, unknown>,\n hidden: string[],\n): Record<string, unknown> {\n if (hidden.length === 0) return data;\n\n const output = { ...data };\n for (const field of hidden) {\n delete output[field];\n }\n return output;\n}\n\nexport function modelToJSON(model: Model): Record<string, unknown> {\n const ModelClass = model.self();\n const resource = ModelClass.resource;\n const hidden = ModelClass.hidden ?? [];\n\n warnUndeclaredSensitiveFields(ModelClass);\n\n if (!resource) {\n const toJsonColumns = ModelClass.toJsonColumns;\n if (toJsonColumns && toJsonColumns.length > 0) {\n return stripHiddenFields(model.only(toJsonColumns), hidden);\n }\n return stripHiddenFields(model.data, hidden);\n }\n\n const resourceColumns = ModelClass.resourceColumns;\n let data: GenericObject =\n resourceColumns !== undefined && resourceColumns.length > 0\n ? model.only(resourceColumns)\n : { ...model.data };\n\n for (const [relationName, relatedModel] of model.loadedRelations) {\n if (Array.isArray(relatedModel)) {\n data[relationName] = relatedModel.map((m) =>\n m instanceof Object && typeof m.toJSON === \"function\" ? m.toJSON() : m,\n );\n } else if (relatedModel instanceof Object && typeof relatedModel.toJSON === \"function\") {\n data[relationName] = relatedModel.toJSON();\n } else {\n data[relationName] = relatedModel;\n }\n }\n\n return new resource(stripHiddenFields(data, hidden)).toJSON();\n}\n"],"mappings":";;;;;;;AASA,MAAM,0BAA0B;AAEhC,MAAM,qCAAqB,IAAI,QAAgB;;;;;;;;;AAU/C,SAAgB,8BAA8B,YAAqC;CACjF,IAAI,mBAAmB,IAAI,UAAU,GAAG;CACxC,mBAAmB,IAAI,UAAU;CAEjC,MAAM,SAAS,WAAW;CAC1B,IAAI,CAAC,QAAQ;CAEb,MAAM,SAAS,WAAW,UAAU,CAAC;CACrC,MAAM,gBAAgB,WAAW;CAEjC,MAAM,UAAU,OAAO,KAAK,OAAO,MAAM,CAAC,CAAC,QAAQ,UAAU;EAC3D,IAAI,CAAC,wBAAwB,KAAK,KAAK,GAAG,OAAO;EACjD,IAAI,OAAO,SAAS,KAAK,GAAG,OAAO;EACnC,IAAI,WAAW,UAAU,OAAO;EAChC,IAAI,iBAAiB,cAAc,SAAS,KAAK,CAAC,cAAc,SAAS,KAAK,GAAG,OAAO;EACxF,OAAO;CACT,CAAC;CAED,IAAI,QAAQ,WAAW,GAAG;CAE1B,QAAQ,KACN,oBAAoB,WAAW,KAAK,YAAY,WAAW,MAAM,2CAA2C,QACzG,KAAK,UAAU,IAAI,MAAM,EAAE,CAAC,CAC5B,KAAK,IAAI,EAAE,qLAEhB;AACF;;;;;AAMA,SAAS,kBACP,MACA,QACyB;CACzB,IAAI,OAAO,WAAW,GAAG,OAAO;CAEhC,MAAM,SAAS,EAAE,GAAG,KAAK;CACzB,KAAK,MAAM,SAAS,QAClB,OAAO,OAAO;CAEhB,OAAO;AACT;AAEA,SAAgB,YAAY,OAAuC;CACjE,MAAM,aAAa,MAAM,KAAK;CAC9B,MAAM,WAAW,WAAW;CAC5B,MAAM,SAAS,WAAW,UAAU,CAAC;CAErC,8BAA8B,UAAU;CAExC,IAAI,CAAC,UAAU;EACb,MAAM,gBAAgB,WAAW;EACjC,IAAI,iBAAiB,cAAc,SAAS,GAC1C,OAAO,kBAAkB,MAAM,KAAK,aAAa,GAAG,MAAM;EAE5D,OAAO,kBAAkB,MAAM,MAAM,MAAM;CAC7C;CAEA,MAAM,kBAAkB,WAAW;CACnC,IAAI,OACF,oBAAoB,UAAa,gBAAgB,SAAS,IACtD,MAAM,KAAK,eAAe,IAC1B,EAAE,GAAG,MAAM,KAAK;CAEtB,KAAK,MAAM,CAAC,cAAc,iBAAiB,MAAM,iBAC/C,IAAI,MAAM,QAAQ,YAAY,GAC5B,KAAK,gBAAgB,aAAa,KAAK,MACrC,aAAa,UAAU,OAAO,EAAE,WAAW,aAAa,EAAE,OAAO,IAAI,CACvE;MACK,IAAI,wBAAwB,UAAU,OAAO,aAAa,WAAW,YAC1E,KAAK,gBAAgB,aAAa,OAAO;MAEzC,KAAK,gBAAgB;CAIzB,OAAO,IAAI,SAAS,kBAAkB,MAAM,MAAM,CAAC,CAAC,CAAC,OAAO;AAC9D"}
1
+ {"version":3,"file":"serialization-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/serialization-methods.ts"],"sourcesContent":["import type { GenericObject } from \"@mongez/reinforcements\";\nimport type { ChildModel, Model } from \"../model\";\n\n/**\n * Field names that commonly hold credentials/secrets. Used only to emit a\n * one-time warning when such a field exists in a model's schema but is not\n * covered by `hidden`/`resource`/`toJsonColumns` — the fail-open default\n * (`toJSON()` returns the raw document) would leak it.\n */\nconst SENSITIVE_FIELD_PATTERN = /^(password|passwordHash|secret|token|apiKey|api_key)$/i;\n\nconst warnedModelClasses = new WeakSet<object>();\n\n/**\n * Warn once per model class when its schema declares a sensitive-looking field\n * that serialization would expose: no `hidden` entry for it, no `resource`\n * class, and no `toJsonColumns` allow-list excluding it.\n *\n * A warning rather than an error — the fail-open `toJSON()` default is kept\n * for compatibility, but it should at least be loud.\n */\nexport function warnUndeclaredSensitiveFields(ModelClass: ChildModel<Model>): void {\n if (warnedModelClasses.has(ModelClass)) return;\n warnedModelClasses.add(ModelClass);\n\n const schema = ModelClass.schema;\n if (!schema) return;\n\n const hidden = ModelClass.hidden ?? [];\n const toJsonColumns = ModelClass.toJsonColumns;\n\n const exposed = Object.keys(schema.schema).filter((field) => {\n if (!SENSITIVE_FIELD_PATTERN.test(field)) return false;\n if (hidden.includes(field)) return false;\n if (ModelClass.resource) return false;\n if (toJsonColumns && toJsonColumns.length > 0 && !toJsonColumns.includes(field)) return false;\n return true;\n });\n\n if (exposed.length === 0) return;\n\n console.warn(\n `[cascade] Model \"${ModelClass.name}\" (table \"${ModelClass.table}\") has sensitive-looking schema field(s) ${exposed\n .map((field) => `\"${field}\"`)\n .join(\", \")} that toJSON()/JSON.stringify() will include in output. ` +\n `Add them to \\`static hidden = [...]\\` (or configure \\`resource\\`/\\`toJsonColumns\\`) so they cannot leak via res.json(model).`,\n );\n}\n\n/**\n * Return `data` without the model's `hidden` top-level fields.\n * Returns `data` untouched (same reference) when nothing is hidden.\n */\nfunction stripHiddenFields(\n data: Record<string, unknown>,\n hidden: string[],\n): Record<string, unknown> {\n if (hidden.length === 0) return data;\n\n const output = { ...data };\n for (const field of hidden) {\n delete output[field];\n }\n return output;\n}\n\nexport function modelToJSON(model: Model): Record<string, unknown> {\n const ModelClass = model.self();\n const resource = ModelClass.resource;\n const hidden = ModelClass.hidden ?? [];\n\n warnUndeclaredSensitiveFields(ModelClass);\n\n if (!resource) {\n const toJsonColumns = ModelClass.toJsonColumns;\n if (toJsonColumns && toJsonColumns.length > 0) {\n return stripHiddenFields(model.only(toJsonColumns), hidden);\n }\n return stripHiddenFields(model.data, hidden);\n }\n\n const resourceColumns = ModelClass.resourceColumns;\n let data: GenericObject =\n resourceColumns !== undefined && resourceColumns.length > 0\n ? model.only(resourceColumns)\n : { ...model.data };\n\n for (const [relationName, relatedModel] of model.loadedRelations) {\n if (Array.isArray(relatedModel)) {\n data[relationName] = relatedModel.map((m) =>\n m instanceof Object && typeof m.toJSON === \"function\" ? m.toJSON() : m,\n );\n } else if (relatedModel instanceof Object && typeof relatedModel.toJSON === \"function\") {\n data[relationName] = relatedModel.toJSON();\n } else {\n data[relationName] = relatedModel;\n }\n }\n\n return new resource(stripHiddenFields(data, hidden)).toJSON();\n}\n"],"mappings":";;;;;;;AASA,MAAM,0BAA0B;AAEhC,MAAM,qCAAqB,IAAI,QAAgB;;;;;;;;;AAU/C,SAAgB,8BAA8B,YAAqC;CACjF,IAAI,mBAAmB,IAAI,UAAU,GAAG;CACxC,mBAAmB,IAAI,UAAU;CAEjC,MAAM,SAAS,WAAW;CAC1B,IAAI,CAAC,QAAQ;CAEb,MAAM,SAAS,WAAW,UAAU,CAAC;CACrC,MAAM,gBAAgB,WAAW;CAEjC,MAAM,UAAU,OAAO,KAAK,OAAO,MAAM,EAAE,QAAQ,UAAU;EAC3D,IAAI,CAAC,wBAAwB,KAAK,KAAK,GAAG,OAAO;EACjD,IAAI,OAAO,SAAS,KAAK,GAAG,OAAO;EACnC,IAAI,WAAW,UAAU,OAAO;EAChC,IAAI,iBAAiB,cAAc,SAAS,KAAK,CAAC,cAAc,SAAS,KAAK,GAAG,OAAO;EACxF,OAAO;CACT,CAAC;CAED,IAAI,QAAQ,WAAW,GAAG;CAE1B,QAAQ,KACN,oBAAoB,WAAW,KAAK,YAAY,WAAW,MAAM,2CAA2C,QACzG,KAAK,UAAU,IAAI,MAAM,EAAE,EAC3B,KAAK,IAAI,EAAE,qLAEhB;AACF;;;;;AAMA,SAAS,kBACP,MACA,QACyB;CACzB,IAAI,OAAO,WAAW,GAAG,OAAO;CAEhC,MAAM,SAAS,EAAE,GAAG,KAAK;CACzB,KAAK,MAAM,SAAS,QAClB,OAAO,OAAO;CAEhB,OAAO;AACT;AAEA,SAAgB,YAAY,OAAuC;CACjE,MAAM,aAAa,MAAM,KAAK;CAC9B,MAAM,WAAW,WAAW;CAC5B,MAAM,SAAS,WAAW,UAAU,CAAC;CAErC,8BAA8B,UAAU;CAExC,IAAI,CAAC,UAAU;EACb,MAAM,gBAAgB,WAAW;EACjC,IAAI,iBAAiB,cAAc,SAAS,GAC1C,OAAO,kBAAkB,MAAM,KAAK,aAAa,GAAG,MAAM;EAE5D,OAAO,kBAAkB,MAAM,MAAM,MAAM;CAC7C;CAEA,MAAM,kBAAkB,WAAW;CACnC,IAAI,OACF,oBAAoB,UAAa,gBAAgB,SAAS,IACtD,MAAM,KAAK,eAAe,IAC1B,EAAE,GAAG,MAAM,KAAK;CAEtB,KAAK,MAAM,CAAC,cAAc,iBAAiB,MAAM,iBAC/C,IAAI,MAAM,QAAQ,YAAY,GAC5B,KAAK,gBAAgB,aAAa,KAAK,MACrC,aAAa,UAAU,OAAO,EAAE,WAAW,aAAa,EAAE,OAAO,IAAI,CACvE;MACK,IAAI,wBAAwB,UAAU,OAAO,aAAa,WAAW,YAC1E,KAAK,gBAAgB,aAAa,OAAO;MAEzC,KAAK,gBAAgB;CAIzB,OAAO,IAAI,SAAS,kBAAkB,MAAM,MAAM,CAAC,EAAE,OAAO;AAC9D"}
@@ -1 +1 @@
1
- {"version":3,"file":"static-event-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/static-event-methods.ts"],"sourcesContent":["import {\n ModelEvents,\n globalModelEvents,\n type ModelEventListener,\n type ModelEventName,\n} from \"../../events/model-events\";\nimport { removeModelFromRegistery } from \"../register-model\";\nimport type { ChildModel, Model } from \"../model\";\n\n/**\n * Isolated event emitter registry — one ModelEvents instance per model constructor.\n * Encapsulated here so no other module needs to know it exists.\n */\nconst modelEventsRegistry = new WeakMap<any, any>();\n\nexport function getModelEvents<TModel extends Model>(\n ModelClass: any,\n): ModelEvents<TModel> {\n let events = modelEventsRegistry.get(ModelClass);\n if (!events) {\n events = new ModelEvents<TModel>();\n modelEventsRegistry.set(ModelClass, events);\n }\n return events as ModelEvents<TModel>;\n}\n\nexport function cleanupModelEvents(ModelClass: any): void {\n modelEventsRegistry.delete(ModelClass);\n removeModelFromRegistery(ModelClass.name);\n}\n\nexport function onStaticEvent<TModel extends Model = Model, TContext = unknown>(\n ModelClass: ChildModel<TModel>,\n event: ModelEventName,\n listener: ModelEventListener<TModel, TContext>,\n): () => void {\n return ModelClass.events<TModel>().on(event, listener);\n}\n\nexport function onceStaticEvent<TModel extends Model = Model, TContext = unknown>(\n ModelClass: ChildModel<TModel>,\n event: ModelEventName,\n listener: ModelEventListener<TModel, TContext>,\n): () => void {\n return ModelClass.events<TModel>().once(event, listener);\n}\n\nexport function offStaticEvent<TModel extends Model = Model, TContext = unknown>(\n ModelClass: ChildModel<TModel>,\n event: ModelEventName,\n listener: ModelEventListener<TModel, TContext>,\n): void {\n ModelClass.events<TModel>().off(event, listener);\n}\n\nexport function getGlobalEvents(): ModelEvents<Model> {\n return globalModelEvents;\n}\n"],"mappings":";;;;;;;;AAaA,MAAM,sCAAsB,IAAI,QAAkB;AAElD,SAAgB,eACd,YACqB;CACrB,IAAI,SAAS,oBAAoB,IAAI,UAAU;CAC/C,IAAI,CAAC,QAAQ;EACX,SAAS,IAAI,YAAoB;EACjC,oBAAoB,IAAI,YAAY,MAAM;CAC5C;CACA,OAAO;AACT;AAEA,SAAgB,mBAAmB,YAAuB;CACxD,oBAAoB,OAAO,UAAU;CACrC,yBAAyB,WAAW,IAAI;AAC1C;AAEA,SAAgB,cACd,YACA,OACA,UACY;CACZ,OAAO,WAAW,OAAe,CAAC,CAAC,GAAG,OAAO,QAAQ;AACvD;AAEA,SAAgB,gBACd,YACA,OACA,UACY;CACZ,OAAO,WAAW,OAAe,CAAC,CAAC,KAAK,OAAO,QAAQ;AACzD;AAEA,SAAgB,eACd,YACA,OACA,UACM;CACN,WAAW,OAAe,CAAC,CAAC,IAAI,OAAO,QAAQ;AACjD;AAEA,SAAgB,kBAAsC;CACpD,OAAO;AACT"}
1
+ {"version":3,"file":"static-event-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/static-event-methods.ts"],"sourcesContent":["import {\n ModelEvents,\n globalModelEvents,\n type ModelEventListener,\n type ModelEventName,\n} from \"../../events/model-events\";\nimport { removeModelFromRegistery } from \"../register-model\";\nimport type { ChildModel, Model } from \"../model\";\n\n/**\n * Isolated event emitter registry — one ModelEvents instance per model constructor.\n * Encapsulated here so no other module needs to know it exists.\n */\nconst modelEventsRegistry = new WeakMap<any, any>();\n\nexport function getModelEvents<TModel extends Model>(\n ModelClass: any,\n): ModelEvents<TModel> {\n let events = modelEventsRegistry.get(ModelClass);\n if (!events) {\n events = new ModelEvents<TModel>();\n modelEventsRegistry.set(ModelClass, events);\n }\n return events as ModelEvents<TModel>;\n}\n\nexport function cleanupModelEvents(ModelClass: any): void {\n modelEventsRegistry.delete(ModelClass);\n removeModelFromRegistery(ModelClass.name);\n}\n\nexport function onStaticEvent<TModel extends Model = Model, TContext = unknown>(\n ModelClass: ChildModel<TModel>,\n event: ModelEventName,\n listener: ModelEventListener<TModel, TContext>,\n): () => void {\n return ModelClass.events<TModel>().on(event, listener);\n}\n\nexport function onceStaticEvent<TModel extends Model = Model, TContext = unknown>(\n ModelClass: ChildModel<TModel>,\n event: ModelEventName,\n listener: ModelEventListener<TModel, TContext>,\n): () => void {\n return ModelClass.events<TModel>().once(event, listener);\n}\n\nexport function offStaticEvent<TModel extends Model = Model, TContext = unknown>(\n ModelClass: ChildModel<TModel>,\n event: ModelEventName,\n listener: ModelEventListener<TModel, TContext>,\n): void {\n ModelClass.events<TModel>().off(event, listener);\n}\n\nexport function getGlobalEvents(): ModelEvents<Model> {\n return globalModelEvents;\n}\n"],"mappings":";;;;;;;;AAaA,MAAM,sCAAsB,IAAI,QAAkB;AAElD,SAAgB,eACd,YACqB;CACrB,IAAI,SAAS,oBAAoB,IAAI,UAAU;CAC/C,IAAI,CAAC,QAAQ;EACX,SAAS,IAAI,YAAoB;EACjC,oBAAoB,IAAI,YAAY,MAAM;CAC5C;CACA,OAAO;AACT;AAEA,SAAgB,mBAAmB,YAAuB;CACxD,oBAAoB,OAAO,UAAU;CACrC,yBAAyB,WAAW,IAAI;AAC1C;AAEA,SAAgB,cACd,YACA,OACA,UACY;CACZ,OAAO,WAAW,OAAe,EAAE,GAAG,OAAO,QAAQ;AACvD;AAEA,SAAgB,gBACd,YACA,OACA,UACY;CACZ,OAAO,WAAW,OAAe,EAAE,KAAK,OAAO,QAAQ;AACzD;AAEA,SAAgB,eACd,YACA,OACA,UACM;CACN,WAAW,OAAe,EAAE,IAAI,OAAO,QAAQ;AACjD;AAEA,SAAgB,kBAAsC;CACpD,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"write-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/write-methods.ts"],"sourcesContent":["import { DatabaseWriter } from \"../../writer/database-writer\";\r\nimport type { InsertResult, WriterOptions } from \"../../contracts\";\r\nimport type { ChildModel, Model, ModelSchema } from \"../model\";\r\nimport { mergeDriverFields } from \"./accessor-methods\";\r\nimport { emitModelEvent } from \"./instance-event-methods\";\r\n\r\n/**\r\n * Default number of rows processed per chunk by {@link createManyRecords}.\r\n *\r\n * Chunking keeps a single huge `createMany` call from flooding the driver:\r\n * the default path runs each chunk's `save()` calls under one `Promise.all`,\r\n * and the bulk path emits one multi-row `insertMany` per chunk so the\r\n * generated `INSERT ... VALUES (...),(...)` stays under the database's bind\r\n * parameter ceiling.\r\n */\r\nexport const DEFAULT_CREATE_MANY_BATCH_SIZE = 500;\r\n\r\n/**\r\n * Options for {@link createManyRecords} (and `Model.createMany`).\r\n */\r\nexport type CreateManyOptions = {\r\n /**\r\n * Number of rows processed per chunk.\r\n *\r\n * @default 500 ({@link DEFAULT_CREATE_MANY_BATCH_SIZE})\r\n */\r\n batchSize?: number;\r\n\r\n /**\r\n * Route each chunk through the driver's native multi-row insert\r\n * (`insertMany`) instead of per-row `save()`.\r\n *\r\n * **Tradeoff:** the bulk path is 10–100× faster for large arrays but\r\n * SKIPS the per-row lifecycle: `saving` / `creating` / `created` / `saved`\r\n * events, instance hooks, and sync operations are NOT emitted. Casts,\r\n * timestamps, defaults and id-generation that the writer normally applies\r\n * ARE still applied (the rows are prepped through the same writer pipeline),\r\n * so persisted columns match the default path.\r\n *\r\n * @default false\r\n */\r\n bulk?: boolean;\r\n};\r\n\r\nexport async function saveModel<TModel extends Model>(\r\n model: TModel,\r\n options?: WriterOptions & { merge?: Partial<ModelSchema> },\r\n): Promise<TModel> {\r\n if (options?.merge) {\r\n model.merge(options.merge);\r\n }\r\n const writer = new DatabaseWriter(model);\r\n await writer.save(options);\r\n return model;\r\n}\r\n\r\nexport async function createRecord<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(ModelClass: ChildModel<TModel>, data: Partial<TSchema>): Promise<TModel> {\r\n const model = new ModelClass(data);\r\n await model.save();\r\n return model;\r\n}\r\n\r\n/**\r\n * Split an array into sequential chunks of at most `size` elements.\r\n *\r\n * @param items - The array to split.\r\n * @param size - Maximum chunk length (callers pass a value `>= 1`).\r\n * @returns An array of chunks preserving the original order.\r\n */\r\nfunction chunkArray<TItem>(items: TItem[], size: number): TItem[][] {\r\n const chunks: TItem[][] = [];\r\n\r\n for (let index = 0; index < items.length; index += size) {\r\n chunks.push(items.slice(index, index + size));\r\n }\r\n\r\n return chunks;\r\n}\r\n\r\n/**\r\n * Create many records, chunking the work so a huge array can't overwhelm the\r\n * driver.\r\n *\r\n * Two strategies are available via `options.bulk`:\r\n *\r\n * - **Default (`bulk` falsy):** each row is persisted through `save()`, so\r\n * model hooks, lifecycle events, casts and generated ids are all preserved.\r\n * Rows are processed in sequential chunks of `batchSize`, each chunk running\r\n * under a single `Promise.all`, so an array of millions of rows can't open\r\n * millions of concurrent inserts at once.\r\n *\r\n * - **Bulk (`bulk: true`):** each chunk is routed to the driver's native\r\n * multi-row insert (`insertMany`) for 10–100× throughput. This SKIPS the\r\n * per-row save lifecycle (no `saving` / `creating` / `created` / `saved`\r\n * events, hooks, or sync). Rows are still prepped through the writer\r\n * pipeline (validation, casting, timestamps, defaults, id-generation) so the\r\n * persisted columns match the default path, and the values returned by the\r\n * driver (generated `_id`, timestamps, SQL `RETURNING *`) are merged back\r\n * onto the returned models.\r\n *\r\n * Both strategies return the created model instances (an empty array is a\r\n * no-op that never touches the driver).\r\n *\r\n * @param ModelClass - The model class to create records for.\r\n * @param data - The rows to insert.\r\n * @param options - Chunking / bulk options.\r\n * @returns The created model instances.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Default: per-row save(), chunked in batches of 500\r\n * const users = await User.createMany(rows);\r\n *\r\n * // Bulk: one multi-row INSERT per 1000-row chunk (skips per-row hooks)\r\n * const users = await User.createMany(rows, { bulk: true, batchSize: 1000 });\r\n * ```\r\n */\r\nexport async function createManyRecords<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(\r\n ModelClass: ChildModel<TModel>,\r\n data: Partial<TSchema>[],\r\n options: CreateManyOptions = {},\r\n): Promise<TModel[]> {\r\n if (data.length === 0) {\r\n return [];\r\n }\r\n\r\n const batchSize =\r\n options.batchSize && options.batchSize > 0\r\n ? options.batchSize\r\n : DEFAULT_CREATE_MANY_BATCH_SIZE;\r\n\r\n const chunks = chunkArray(data, batchSize);\r\n\r\n if (options.bulk === true) {\r\n return await createManyBulk(ModelClass, chunks);\r\n }\r\n\r\n const created: TModel[] = [];\r\n\r\n for (const chunk of chunks) {\r\n const models = chunk.map((item) => new ModelClass(item)) as TModel[];\r\n\r\n // Reserve one contiguous id block for the whole chunk (1 counter op instead\r\n // of N), pre-seeding each id-less model so its per-row save() no-ops id-gen.\r\n await assignIdBlock(ModelClass, models);\r\n\r\n const chunkModels = await Promise.all(\r\n models.map(async (model) => {\r\n await model.save();\r\n return model;\r\n }),\r\n );\r\n\r\n created.push(...chunkModels);\r\n }\r\n\r\n return created;\r\n}\r\n\r\n/**\r\n * Reserve a single contiguous id block for one chunk and pre-assign the ids to\r\n * the models that don't already carry one, so the per-row writer's id\r\n * generation no-ops (its `model.get(\"id\")` guard short-circuits). This turns N\r\n * per-row counter round-trips into ONE per chunk.\r\n *\r\n * Falls back to per-row generation (a no-op here) when:\r\n * - the model disables auto-generation (`autoGenerateId === false`) — e.g. SQL,\r\n * which uses native `SERIAL`;\r\n * - the data source's id generator has no batch API (`generateNextIds`) — the\r\n * optional contract member is feature-detected;\r\n * - the model uses a random initial id / increment — a random stride can't form\r\n * a contiguous block, so those models keep per-row generation.\r\n *\r\n * Only models WITHOUT a caller-supplied id consume a block slot, so a chunk\r\n * mixing supplied and auto ids allocates exactly the right number (no gaps).\r\n *\r\n * @param ModelClass - The model class being inserted.\r\n * @param models - The freshly-constructed (unsaved) models for one chunk.\r\n */\r\nasync function assignIdBlock<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n models: TModel[],\r\n): Promise<void> {\r\n if (!ModelClass.autoGenerateId || ModelClass.randomInitialId || ModelClass.randomIncrement) {\r\n return;\r\n }\r\n\r\n const idGenerator = ModelClass.getDataSource().idGenerator;\r\n\r\n if (!idGenerator || typeof idGenerator.generateNextIds !== \"function\") {\r\n return;\r\n }\r\n\r\n const idLessModels = models.filter((model) => !model.get(\"id\"));\r\n\r\n if (idLessModels.length === 0) {\r\n return;\r\n }\r\n\r\n const ids = await idGenerator.generateNextIds({\r\n table: ModelClass.table,\r\n initialId: ModelClass.initialId || 1,\r\n incrementIdBy: ModelClass.incrementIdBy || 1,\r\n count: idLessModels.length,\r\n });\r\n\r\n // Enforce the contract at this pluggable, feature-detected boundary: a\r\n // non-conforming generator returning the wrong count would otherwise set\r\n // `id = undefined` on the unmatched rows, the per-row writer would silently\r\n // re-generate single ids, and the reserved block would no longer match what\r\n // is persisted. Fail loud instead of corrupting the sequence.\r\n if (ids.length !== idLessModels.length) {\r\n throw new Error(\r\n `generateNextIds returned ${ids.length} id(s) for ${idLessModels.length} row(s) on ` +\r\n `\"${ModelClass.table}\" — a batch id generator must return exactly the requested count.`,\r\n );\r\n }\r\n\r\n idLessModels.forEach((model, index) => {\r\n model.set(\"id\", ids[index]);\r\n });\r\n}\r\n\r\n/**\r\n * Bulk variant of {@link createManyRecords}: prep each row through the writer\r\n * pipeline (validation, casting, timestamps, defaults, id-generation) without\r\n * touching the database, then flush each chunk with a single\r\n * `driver.insertMany` call.\r\n *\r\n * The writer reuse is achieved by swapping the driver's single-row `insert`\r\n * for a capturing stub for the lifetime of the bulk operation: running\r\n * `writer.save({ skipEvents, skipSync })` exercises the real prep but records\r\n * the prepared document instead of issuing N single-row inserts. The original\r\n * `insert` is always restored in `finally`.\r\n *\r\n * @param ModelClass - The model class to create records for.\r\n * @param chunks - Pre-chunked rows.\r\n * @returns The created model instances with driver-returned values merged in.\r\n */\r\nasync function createManyBulk<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(ModelClass: ChildModel<TModel>, chunks: Partial<TSchema>[][]): Promise<TModel[]> {\r\n const dataSource = ModelClass.getDataSource();\r\n const driver = dataSource.driver;\r\n const table = ModelClass.table;\r\n // Keep the exact original reference so it can be restored verbatim (binding a\r\n // copy would, for a spied driver, replace the spy with a non-spy wrapper).\r\n const originalInsert = driver.insert;\r\n\r\n // Capture the prepared (validated/casted/timestamped/id-generated) document\r\n // instead of inserting it per row, so the writer's prep runs exactly once\r\n // per model while the actual write is deferred to a single insertMany.\r\n driver.insert = (async (\r\n _table: string,\r\n document: Record<string, unknown>,\r\n ): Promise<InsertResult> => {\r\n return { document };\r\n }) as typeof driver.insert;\r\n\r\n const created: TModel[] = [];\r\n\r\n try {\r\n for (const chunk of chunks) {\r\n const models = chunk.map((item) => new ModelClass(item)) as TModel[];\r\n\r\n // Reserve one contiguous id block for the whole chunk (1 counter op\r\n // instead of N), pre-seeding each id-less model so the per-row writer's\r\n // id generation no-ops.\r\n await assignIdBlock(ModelClass, models);\r\n\r\n // Prep every model through the real writer pipeline. The captured\r\n // `insert` keeps this off the wire while still mutating each model's\r\n // data with casts/timestamps/defaults/generated ids.\r\n const preparedDocuments = await Promise.all(\r\n models.map(async (model) => {\r\n const writer = new DatabaseWriter(model);\r\n await writer.save({ skipEvents: true, skipSync: true });\r\n return { ...model.data } as Record<string, unknown>;\r\n }),\r\n );\r\n\r\n const results = await driver.insertMany(table, preparedDocuments);\r\n\r\n // Merge driver-returned values (generated _id, timestamps, RETURNING *)\r\n // back onto each model so the returned instances reflect persisted state.\r\n models.forEach((model, index) => {\r\n const result = results[index] as InsertResult | Record<string, unknown> | undefined;\r\n\r\n if (result) {\r\n const returnedDocument =\r\n \"document\" in (result as Record<string, unknown>)\r\n ? (result as InsertResult).document\r\n : result;\r\n\r\n // Driver-returned identity (generated _id / RETURNING *) — merged\r\n // through the framework-internal path so it is not treated as mass\r\n // assignment on a model the writer has already marked persisted.\r\n mergeDriverFields(model, returnedDocument as Record<string, unknown>);\r\n }\r\n\r\n model.dirtyTracker.reset();\r\n model.isNew = false;\r\n });\r\n\r\n created.push(...models);\r\n }\r\n } finally {\r\n driver.insert = originalInsert;\r\n }\r\n\r\n return created;\r\n}\r\n\r\nexport async function findOrCreateRecord<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Partial<TSchema>,\r\n data: Partial<TSchema>,\r\n): Promise<TModel> {\r\n const existing = await ModelClass.first(filter as Record<string, unknown>);\r\n\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n return await createRecord(ModelClass, { ...filter, ...data } as Partial<TSchema>);\r\n}\r\n\r\nexport async function upsertRecord<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Partial<TSchema>,\r\n data: Partial<TSchema>,\r\n options?: Record<string, unknown>,\r\n): Promise<TModel> {\r\n const driver = ModelClass.getDriver();\r\n const mergedData = { ...filter, ...data } as Record<string, unknown>;\r\n\r\n const tempModel = new ModelClass(mergedData as Partial<TSchema>);\r\n tempModel.isNew = true;\r\n\r\n await emitModelEvent(tempModel, \"saving\", {\r\n isInsert: true,\r\n options,\r\n mode: \"upsert\",\r\n });\r\n\r\n const createdAtColumn = ModelClass.createdAtColumn;\r\n const updatedAtColumn = ModelClass.updatedAtColumn;\r\n\r\n if (createdAtColumn !== false && createdAtColumn !== undefined) {\r\n const createdAtKey = createdAtColumn as string;\r\n if (!mergedData[createdAtKey]) {\r\n mergedData[createdAtKey] = new Date();\r\n }\r\n }\r\n\r\n if (updatedAtColumn !== false && updatedAtColumn !== undefined) {\r\n const updatedAtKey = updatedAtColumn as string;\r\n mergedData[updatedAtKey] = new Date();\r\n }\r\n\r\n await emitModelEvent(tempModel, \"saving\", { filter, data: mergedData, options, mode: \"upsert\" });\r\n\r\n const result = await driver.upsert(ModelClass.table, filter as Record<string, unknown>, mergedData, options);\r\n\r\n const model = ModelClass.hydrate(result as Record<string, unknown>) as TModel;\r\n model.dirtyTracker.reset();\r\n\r\n await emitModelEvent(model, \"saved\", { filter, data: result, options, mode: \"upsert\" });\r\n\r\n return model;\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"write-methods.mjs","names":[],"sources":["../../../../../../../../cascade/src/model/methods/write-methods.ts"],"sourcesContent":["import { DatabaseWriter } from \"../../writer/database-writer\";\r\nimport type { InsertResult, WriterOptions } from \"../../contracts\";\r\nimport type { ChildModel, Model, ModelSchema } from \"../model\";\r\nimport { mergeDriverFields } from \"./accessor-methods\";\r\nimport { emitModelEvent } from \"./instance-event-methods\";\r\n\r\n/**\r\n * Default number of rows processed per chunk by {@link createManyRecords}.\r\n *\r\n * Chunking keeps a single huge `createMany` call from flooding the driver:\r\n * the default path runs each chunk's `save()` calls under one `Promise.all`,\r\n * and the bulk path emits one multi-row `insertMany` per chunk so the\r\n * generated `INSERT ... VALUES (...),(...)` stays under the database's bind\r\n * parameter ceiling.\r\n */\r\nexport const DEFAULT_CREATE_MANY_BATCH_SIZE = 500;\r\n\r\n/**\r\n * Options for {@link createManyRecords} (and `Model.createMany`).\r\n */\r\nexport type CreateManyOptions = {\r\n /**\r\n * Number of rows processed per chunk.\r\n *\r\n * @default 500 ({@link DEFAULT_CREATE_MANY_BATCH_SIZE})\r\n */\r\n batchSize?: number;\r\n\r\n /**\r\n * Route each chunk through the driver's native multi-row insert\r\n * (`insertMany`) instead of per-row `save()`.\r\n *\r\n * **Tradeoff:** the bulk path is 10–100× faster for large arrays but\r\n * SKIPS the per-row lifecycle: `saving` / `creating` / `created` / `saved`\r\n * events, instance hooks, and sync operations are NOT emitted. Casts,\r\n * timestamps, defaults and id-generation that the writer normally applies\r\n * ARE still applied (the rows are prepped through the same writer pipeline),\r\n * so persisted columns match the default path.\r\n *\r\n * @default false\r\n */\r\n bulk?: boolean;\r\n};\r\n\r\nexport async function saveModel<TModel extends Model>(\r\n model: TModel,\r\n options?: WriterOptions & { merge?: Partial<ModelSchema> },\r\n): Promise<TModel> {\r\n if (options?.merge) {\r\n model.merge(options.merge);\r\n }\r\n const writer = new DatabaseWriter(model);\r\n await writer.save(options);\r\n return model;\r\n}\r\n\r\nexport async function createRecord<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(ModelClass: ChildModel<TModel>, data: Partial<TSchema>): Promise<TModel> {\r\n const model = new ModelClass(data);\r\n await model.save();\r\n return model;\r\n}\r\n\r\n/**\r\n * Split an array into sequential chunks of at most `size` elements.\r\n *\r\n * @param items - The array to split.\r\n * @param size - Maximum chunk length (callers pass a value `>= 1`).\r\n * @returns An array of chunks preserving the original order.\r\n */\r\nfunction chunkArray<TItem>(items: TItem[], size: number): TItem[][] {\r\n const chunks: TItem[][] = [];\r\n\r\n for (let index = 0; index < items.length; index += size) {\r\n chunks.push(items.slice(index, index + size));\r\n }\r\n\r\n return chunks;\r\n}\r\n\r\n/**\r\n * Create many records, chunking the work so a huge array can't overwhelm the\r\n * driver.\r\n *\r\n * Two strategies are available via `options.bulk`:\r\n *\r\n * - **Default (`bulk` falsy):** each row is persisted through `save()`, so\r\n * model hooks, lifecycle events, casts and generated ids are all preserved.\r\n * Rows are processed in sequential chunks of `batchSize`, each chunk running\r\n * under a single `Promise.all`, so an array of millions of rows can't open\r\n * millions of concurrent inserts at once.\r\n *\r\n * - **Bulk (`bulk: true`):** each chunk is routed to the driver's native\r\n * multi-row insert (`insertMany`) for 10–100× throughput. This SKIPS the\r\n * per-row save lifecycle (no `saving` / `creating` / `created` / `saved`\r\n * events, hooks, or sync). Rows are still prepped through the writer\r\n * pipeline (validation, casting, timestamps, defaults, id-generation) so the\r\n * persisted columns match the default path, and the values returned by the\r\n * driver (generated `_id`, timestamps, SQL `RETURNING *`) are merged back\r\n * onto the returned models.\r\n *\r\n * Both strategies return the created model instances (an empty array is a\r\n * no-op that never touches the driver).\r\n *\r\n * @param ModelClass - The model class to create records for.\r\n * @param data - The rows to insert.\r\n * @param options - Chunking / bulk options.\r\n * @returns The created model instances.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Default: per-row save(), chunked in batches of 500\r\n * const users = await User.createMany(rows);\r\n *\r\n * // Bulk: one multi-row INSERT per 1000-row chunk (skips per-row hooks)\r\n * const users = await User.createMany(rows, { bulk: true, batchSize: 1000 });\r\n * ```\r\n */\r\nexport async function createManyRecords<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(\r\n ModelClass: ChildModel<TModel>,\r\n data: Partial<TSchema>[],\r\n options: CreateManyOptions = {},\r\n): Promise<TModel[]> {\r\n if (data.length === 0) {\r\n return [];\r\n }\r\n\r\n const batchSize =\r\n options.batchSize && options.batchSize > 0\r\n ? options.batchSize\r\n : DEFAULT_CREATE_MANY_BATCH_SIZE;\r\n\r\n const chunks = chunkArray(data, batchSize);\r\n\r\n if (options.bulk === true) {\r\n return await createManyBulk(ModelClass, chunks);\r\n }\r\n\r\n const created: TModel[] = [];\r\n\r\n for (const chunk of chunks) {\r\n const models = chunk.map((item) => new ModelClass(item)) as TModel[];\r\n\r\n // Reserve one contiguous id block for the whole chunk (1 counter op instead\r\n // of N), pre-seeding each id-less model so its per-row save() no-ops id-gen.\r\n await assignIdBlock(ModelClass, models);\r\n\r\n const chunkModels = await Promise.all(\r\n models.map(async (model) => {\r\n await model.save();\r\n return model;\r\n }),\r\n );\r\n\r\n created.push(...chunkModels);\r\n }\r\n\r\n return created;\r\n}\r\n\r\n/**\r\n * Reserve a single contiguous id block for one chunk and pre-assign the ids to\r\n * the models that don't already carry one, so the per-row writer's id\r\n * generation no-ops (its `model.get(\"id\")` guard short-circuits). This turns N\r\n * per-row counter round-trips into ONE per chunk.\r\n *\r\n * Falls back to per-row generation (a no-op here) when:\r\n * - the model disables auto-generation (`autoGenerateId === false`) — e.g. SQL,\r\n * which uses native `SERIAL`;\r\n * - the data source's id generator has no batch API (`generateNextIds`) — the\r\n * optional contract member is feature-detected;\r\n * - the model uses a random initial id / increment — a random stride can't form\r\n * a contiguous block, so those models keep per-row generation.\r\n *\r\n * Only models WITHOUT a caller-supplied id consume a block slot, so a chunk\r\n * mixing supplied and auto ids allocates exactly the right number (no gaps).\r\n *\r\n * @param ModelClass - The model class being inserted.\r\n * @param models - The freshly-constructed (unsaved) models for one chunk.\r\n */\r\nasync function assignIdBlock<TModel extends Model>(\r\n ModelClass: ChildModel<TModel>,\r\n models: TModel[],\r\n): Promise<void> {\r\n if (!ModelClass.autoGenerateId || ModelClass.randomInitialId || ModelClass.randomIncrement) {\r\n return;\r\n }\r\n\r\n const idGenerator = ModelClass.getDataSource().idGenerator;\r\n\r\n if (!idGenerator || typeof idGenerator.generateNextIds !== \"function\") {\r\n return;\r\n }\r\n\r\n const idLessModels = models.filter((model) => !model.get(\"id\"));\r\n\r\n if (idLessModels.length === 0) {\r\n return;\r\n }\r\n\r\n const ids = await idGenerator.generateNextIds({\r\n table: ModelClass.table,\r\n initialId: ModelClass.initialId || 1,\r\n incrementIdBy: ModelClass.incrementIdBy || 1,\r\n count: idLessModels.length,\r\n });\r\n\r\n // Enforce the contract at this pluggable, feature-detected boundary: a\r\n // non-conforming generator returning the wrong count would otherwise set\r\n // `id = undefined` on the unmatched rows, the per-row writer would silently\r\n // re-generate single ids, and the reserved block would no longer match what\r\n // is persisted. Fail loud instead of corrupting the sequence.\r\n if (ids.length !== idLessModels.length) {\r\n throw new Error(\r\n `generateNextIds returned ${ids.length} id(s) for ${idLessModels.length} row(s) on ` +\r\n `\"${ModelClass.table}\" — a batch id generator must return exactly the requested count.`,\r\n );\r\n }\r\n\r\n idLessModels.forEach((model, index) => {\r\n model.set(\"id\", ids[index]);\r\n });\r\n}\r\n\r\n/**\r\n * Bulk variant of {@link createManyRecords}: prep each row through the writer\r\n * pipeline (validation, casting, timestamps, defaults, id-generation) without\r\n * touching the database, then flush each chunk with a single\r\n * `driver.insertMany` call.\r\n *\r\n * The writer reuse is achieved by swapping the driver's single-row `insert`\r\n * for a capturing stub for the lifetime of the bulk operation: running\r\n * `writer.save({ skipEvents, skipSync })` exercises the real prep but records\r\n * the prepared document instead of issuing N single-row inserts. The original\r\n * `insert` is always restored in `finally`.\r\n *\r\n * @param ModelClass - The model class to create records for.\r\n * @param chunks - Pre-chunked rows.\r\n * @returns The created model instances with driver-returned values merged in.\r\n */\r\nasync function createManyBulk<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(ModelClass: ChildModel<TModel>, chunks: Partial<TSchema>[][]): Promise<TModel[]> {\r\n const dataSource = ModelClass.getDataSource();\r\n const driver = dataSource.driver;\r\n const table = ModelClass.table;\r\n // Keep the exact original reference so it can be restored verbatim (binding a\r\n // copy would, for a spied driver, replace the spy with a non-spy wrapper).\r\n const originalInsert = driver.insert;\r\n\r\n // Capture the prepared (validated/casted/timestamped/id-generated) document\r\n // instead of inserting it per row, so the writer's prep runs exactly once\r\n // per model while the actual write is deferred to a single insertMany.\r\n driver.insert = (async (\r\n _table: string,\r\n document: Record<string, unknown>,\r\n ): Promise<InsertResult> => {\r\n return { document };\r\n }) as typeof driver.insert;\r\n\r\n const created: TModel[] = [];\r\n\r\n try {\r\n for (const chunk of chunks) {\r\n const models = chunk.map((item) => new ModelClass(item)) as TModel[];\r\n\r\n // Reserve one contiguous id block for the whole chunk (1 counter op\r\n // instead of N), pre-seeding each id-less model so the per-row writer's\r\n // id generation no-ops.\r\n await assignIdBlock(ModelClass, models);\r\n\r\n // Prep every model through the real writer pipeline. The captured\r\n // `insert` keeps this off the wire while still mutating each model's\r\n // data with casts/timestamps/defaults/generated ids.\r\n const preparedDocuments = await Promise.all(\r\n models.map(async (model) => {\r\n const writer = new DatabaseWriter(model);\r\n await writer.save({ skipEvents: true, skipSync: true });\r\n return { ...model.data } as Record<string, unknown>;\r\n }),\r\n );\r\n\r\n const results = await driver.insertMany(table, preparedDocuments);\r\n\r\n // Merge driver-returned values (generated _id, timestamps, RETURNING *)\r\n // back onto each model so the returned instances reflect persisted state.\r\n models.forEach((model, index) => {\r\n const result = results[index] as InsertResult | Record<string, unknown> | undefined;\r\n\r\n if (result) {\r\n const returnedDocument =\r\n \"document\" in (result as Record<string, unknown>)\r\n ? (result as InsertResult).document\r\n : result;\r\n\r\n // Driver-returned identity (generated _id / RETURNING *) — merged\r\n // through the framework-internal path so it is not treated as mass\r\n // assignment on a model the writer has already marked persisted.\r\n mergeDriverFields(model, returnedDocument as Record<string, unknown>);\r\n }\r\n\r\n model.dirtyTracker.reset();\r\n model.isNew = false;\r\n });\r\n\r\n created.push(...models);\r\n }\r\n } finally {\r\n driver.insert = originalInsert;\r\n }\r\n\r\n return created;\r\n}\r\n\r\nexport async function findOrCreateRecord<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Partial<TSchema>,\r\n data: Partial<TSchema>,\r\n): Promise<TModel> {\r\n const existing = await ModelClass.first(filter as Record<string, unknown>);\r\n\r\n if (existing) {\r\n return existing;\r\n }\r\n\r\n return await createRecord(ModelClass, { ...filter, ...data } as Partial<TSchema>);\r\n}\r\n\r\nexport async function upsertRecord<\r\n TModel extends Model,\r\n TSchema extends ModelSchema = TModel extends Model<infer S> ? S : ModelSchema,\r\n>(\r\n ModelClass: ChildModel<TModel>,\r\n filter: Partial<TSchema>,\r\n data: Partial<TSchema>,\r\n options?: Record<string, unknown>,\r\n): Promise<TModel> {\r\n const driver = ModelClass.getDriver();\r\n const mergedData = { ...filter, ...data } as Record<string, unknown>;\r\n\r\n const tempModel = new ModelClass(mergedData as Partial<TSchema>);\r\n tempModel.isNew = true;\r\n\r\n await emitModelEvent(tempModel, \"saving\", {\r\n isInsert: true,\r\n options,\r\n mode: \"upsert\",\r\n });\r\n\r\n const createdAtColumn = ModelClass.createdAtColumn;\r\n const updatedAtColumn = ModelClass.updatedAtColumn;\r\n\r\n if (createdAtColumn !== false && createdAtColumn !== undefined) {\r\n const createdAtKey = createdAtColumn as string;\r\n if (!mergedData[createdAtKey]) {\r\n mergedData[createdAtKey] = new Date();\r\n }\r\n }\r\n\r\n if (updatedAtColumn !== false && updatedAtColumn !== undefined) {\r\n const updatedAtKey = updatedAtColumn as string;\r\n mergedData[updatedAtKey] = new Date();\r\n }\r\n\r\n await emitModelEvent(tempModel, \"saving\", { filter, data: mergedData, options, mode: \"upsert\" });\r\n\r\n const result = await driver.upsert(ModelClass.table, filter as Record<string, unknown>, mergedData, options);\r\n\r\n const model = ModelClass.hydrate(result as Record<string, unknown>) as TModel;\r\n model.dirtyTracker.reset();\r\n\r\n await emitModelEvent(model, \"saved\", { filter, data: result, options, mode: \"upsert\" });\r\n\r\n return model;\r\n}\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.mts","names":[],"sources":["../../../../../../../cascade/src/model/model.ts"],"mappings":"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"}
1
+ {"version":3,"file":"model.d.mts","names":[],"sources":["../../../../../../../cascade/src/model/model.ts"],"mappings":"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"}