@bobbykim/manguito-cms-api 0.9.1 → 0.9.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.
@@ -621,15 +621,30 @@ var import_dataloader = __toESM(require("dataloader"));
621
621
 
622
622
  // src/relations.ts
623
623
  var import_node_crypto = __toESM(require("crypto"));
624
+ var import_drizzle_orm2 = require("drizzle-orm");
625
+ var import_manguito_cms_core3 = require("@bobbykim/manguito-cms-core");
626
+
627
+ // src/relation-input.ts
624
628
  var import_drizzle_orm = require("drizzle-orm");
625
629
  var import_manguito_cms_core2 = require("@bobbykim/manguito-cms-core");
630
+
631
+ // src/relations.ts
626
632
  function quoteIdent(name) {
627
633
  if (!/^[a-z][a-z0-9_-]*$/.test(name)) throw new Error(`Unsafe identifier: ${name}`);
628
634
  return `"${name}"`;
629
635
  }
630
636
  function junctionOrderBy(junction) {
631
- const right = import_drizzle_orm.sql.raw(quoteIdent(junction.right_column));
632
- return junction.order_column ? import_drizzle_orm.sql` ORDER BY "order" ASC, ${right} ASC` : import_drizzle_orm.sql` ORDER BY ${right} ASC`;
637
+ const right = import_drizzle_orm2.sql.raw(quoteIdent(junction.right_column));
638
+ return junction.order_column ? import_drizzle_orm2.sql` ORDER BY "order" ASC, ${right} ASC` : import_drizzle_orm2.sql` ORDER BY ${right} ASC`;
639
+ }
640
+ function firstOfEach(items, key) {
641
+ const seen = /* @__PURE__ */ new Set();
642
+ return items.filter((item) => {
643
+ const k = key(item);
644
+ if (seen.has(k)) return false;
645
+ seen.add(k);
646
+ return true;
647
+ });
633
648
  }
634
649
  function oneOrMany(cardinality, list) {
635
650
  return cardinality === "one" ? list[0] ?? null : list;
@@ -647,7 +662,7 @@ function buildRelationsMap(fields, registry) {
647
662
  relations[field.name] = {
648
663
  type: "paragraph",
649
664
  table: pType.db.table_name,
650
- cardinality: (0, import_manguito_cms_core2.relationCardinality)(field) ?? "many"
665
+ cardinality: (0, import_manguito_cms_core3.relationCardinality)(field) ?? "many"
651
666
  };
652
667
  } else if (field.field_type === "reference") {
653
668
  if (!field.db_column) continue;
@@ -690,9 +705,9 @@ async function resolveRelationField(db, rows, fieldName, rel, cache, publishedOn
690
705
  const batch = [...new Set(rows)];
691
706
  if (rel.type === "paragraph") {
692
707
  const parentIds = batch.map((r) => r["id"]);
693
- const inList = import_drizzle_orm.sql.join(parentIds.map((id) => import_drizzle_orm.sql`${id}`), import_drizzle_orm.sql`, `);
708
+ const inList = import_drizzle_orm2.sql.join(parentIds.map((id) => import_drizzle_orm2.sql`${id}`), import_drizzle_orm2.sql`, `);
694
709
  const result = await db.execute(
695
- import_drizzle_orm.sql`SELECT * FROM ${import_drizzle_orm.sql.raw(quoteIdent(rel.table))} WHERE parent_id IN (${inList}) AND parent_field = ${fieldName} ORDER BY "order" ASC`
710
+ import_drizzle_orm2.sql`SELECT * FROM ${import_drizzle_orm2.sql.raw(quoteIdent(rel.table))} WHERE parent_id IN (${inList}) AND parent_field = ${fieldName} ORDER BY "order" ASC, id ASC`
696
711
  );
697
712
  const byParent = groupBy(result.rows, "parent_id");
698
713
  for (const row of batch) {
@@ -709,10 +724,10 @@ async function resolveRelationField(db, rows, fieldName, rel, cache, publishedOn
709
724
  const unique = [...new Set(fkValues)];
710
725
  const uncached = unique.filter((id) => !cache.has(`${rel.table}:${id}`));
711
726
  if (uncached.length > 0) {
712
- const inList = import_drizzle_orm.sql.join(uncached.map((id) => import_drizzle_orm.sql`${id}`), import_drizzle_orm.sql`, `);
713
- const publishedCond = publishedOnly ? import_drizzle_orm.sql` AND published = true` : import_drizzle_orm.sql``;
727
+ const inList = import_drizzle_orm2.sql.join(uncached.map((id) => import_drizzle_orm2.sql`${id}`), import_drizzle_orm2.sql`, `);
728
+ const publishedCond = publishedOnly ? import_drizzle_orm2.sql` AND published = true` : import_drizzle_orm2.sql``;
714
729
  const result = await db.execute(
715
- import_drizzle_orm.sql`SELECT * FROM ${import_drizzle_orm.sql.raw(quoteIdent(rel.table))} WHERE id IN (${inList})${publishedCond}`
730
+ import_drizzle_orm2.sql`SELECT * FROM ${import_drizzle_orm2.sql.raw(quoteIdent(rel.table))} WHERE id IN (${inList})${publishedCond}`
716
731
  );
717
732
  for (const item of result.rows) {
718
733
  cache.set(`${rel.table}:${item["id"]}`, item);
@@ -724,18 +739,18 @@ async function resolveRelationField(db, rows, fieldName, rel, cache, publishedOn
724
739
  }
725
740
  } else if (rel.type === "junction") {
726
741
  const parentIds = batch.map((r) => r["id"]);
727
- const inList = import_drizzle_orm.sql.join(parentIds.map((id) => import_drizzle_orm.sql`${id}`), import_drizzle_orm.sql`, `);
742
+ const inList = import_drizzle_orm2.sql.join(parentIds.map((id) => import_drizzle_orm2.sql`${id}`), import_drizzle_orm2.sql`, `);
728
743
  const junctionResult = await db.execute(
729
- import_drizzle_orm.sql`SELECT * FROM ${import_drizzle_orm.sql.raw(quoteIdent(rel.junction_table))} WHERE ${import_drizzle_orm.sql.raw(quoteIdent(rel.left_column))} IN (${inList})${junctionOrderBy(rel)}`
744
+ import_drizzle_orm2.sql`SELECT * FROM ${import_drizzle_orm2.sql.raw(quoteIdent(rel.junction_table))} WHERE ${import_drizzle_orm2.sql.raw(quoteIdent(rel.left_column))} IN (${inList})${junctionOrderBy(rel)}`
730
745
  );
731
746
  const jRows = junctionResult.rows;
732
747
  const rightIds = [...new Set(jRows.map((r) => r[rel.right_column]))];
733
748
  const uncached = rightIds.filter((id) => !cache.has(`${rel.table}:${id}`));
734
749
  if (uncached.length > 0) {
735
- const rightInList = import_drizzle_orm.sql.join(uncached.map((id) => import_drizzle_orm.sql`${id}`), import_drizzle_orm.sql`, `);
736
- const publishedCond = publishedOnly ? import_drizzle_orm.sql` AND published = true` : import_drizzle_orm.sql``;
750
+ const rightInList = import_drizzle_orm2.sql.join(uncached.map((id) => import_drizzle_orm2.sql`${id}`), import_drizzle_orm2.sql`, `);
751
+ const publishedCond = publishedOnly ? import_drizzle_orm2.sql` AND published = true` : import_drizzle_orm2.sql``;
737
752
  const entitiesResult = await db.execute(
738
- import_drizzle_orm.sql`SELECT * FROM ${import_drizzle_orm.sql.raw(quoteIdent(rel.table))} WHERE id IN (${rightInList})${publishedCond}`
753
+ import_drizzle_orm2.sql`SELECT * FROM ${import_drizzle_orm2.sql.raw(quoteIdent(rel.table))} WHERE id IN (${rightInList})${publishedCond}`
739
754
  );
740
755
  for (const item of entitiesResult.rows) {
741
756
  cache.set(`${rel.table}:${item["id"]}`, item);
@@ -743,7 +758,7 @@ async function resolveRelationField(db, rows, fieldName, rel, cache, publishedOn
743
758
  }
744
759
  const byLeft = groupBy(jRows, rel.left_column);
745
760
  for (const row of batch) {
746
- const jEntries = byLeft[row["id"]] ?? [];
761
+ const jEntries = firstOfEach(byLeft[row["id"]] ?? [], (jr) => jr[rel.right_column]);
747
762
  row[fieldName] = jEntries.map((jr) => cache.get(`${rel.table}:${jr[rel.right_column]}`)).filter(Boolean);
748
763
  }
749
764
  } else if (rel.type === "media") {
@@ -757,8 +772,8 @@ async function resolveRelationField(db, rows, fieldName, rel, cache, publishedOn
757
772
  const unique = [...new Set(fkValues)];
758
773
  const uncached = unique.filter((id) => !cache.has(`media:${id}`));
759
774
  if (uncached.length > 0) {
760
- const inList = import_drizzle_orm.sql.join(uncached.map((id) => import_drizzle_orm.sql`${id}`), import_drizzle_orm.sql`, `);
761
- const result = await db.execute(import_drizzle_orm.sql`SELECT * FROM "media" WHERE id IN (${inList})`);
775
+ const inList = import_drizzle_orm2.sql.join(uncached.map((id) => import_drizzle_orm2.sql`${id}`), import_drizzle_orm2.sql`, `);
776
+ const result = await db.execute(import_drizzle_orm2.sql`SELECT * FROM "media" WHERE id IN (${inList})`);
762
777
  for (const item of result.rows) {
763
778
  cache.set(`media:${item["id"]}`, item);
764
779
  }