@ronin/compiler 0.10.0 → 0.10.1-leo-ron-1083-experimental-209

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. package/dist/index.js +115 -33
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -102,6 +102,9 @@ var expand = (obj) => {
102
102
  return res;
103
103
  }, {});
104
104
  };
105
+ var getProperty = (obj, path) => {
106
+ return path.split(".").reduce((acc, key) => acc?.[key], obj);
107
+ };
105
108
  var splitQuery = (query) => {
106
109
  const queryType = Object.keys(query)[0];
107
110
  const queryModel = Object.keys(query[queryType])[0];
@@ -648,11 +651,15 @@ var formatModelEntity = (type, entities) => {
648
651
  });
649
652
  return entries ? Object.fromEntries(entries) : void 0;
650
653
  };
651
- var composeSystemModelStatement = (models, dependencyStatements, action, systemModel) => {
654
+ var handleSystemModel = (models, dependencyStatements, action, systemModel, newModel) => {
652
655
  const { system: _, ...systemModelClean } = systemModel;
653
656
  const query = {
654
657
  [action]: { model: action === "create" ? systemModelClean : systemModelClean.slug }
655
658
  };
659
+ if (action === "alter" && newModel) {
660
+ const { system: _2, ...newModelClean } = newModel;
661
+ query.alter.to = newModelClean;
662
+ }
656
663
  const statement = compileQueryInput(query, models, []);
657
664
  dependencyStatements.push(...statement.dependencies);
658
665
  };
@@ -712,12 +719,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
712
719
  }
713
720
  queryTypeDetails = { to: finalModel };
714
721
  getSystemModels(models, modelWithPresets).map((systemModel) => {
715
- return composeSystemModelStatement(
716
- models,
717
- dependencyStatements,
718
- "create",
719
- systemModel
720
- );
722
+ return handleSystemModel(models, dependencyStatements, "create", systemModel);
721
723
  });
722
724
  }
723
725
  if (action === "alter" && model) {
@@ -744,12 +746,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
744
746
  dependencyStatements.push({ statement: `DROP TABLE "${model.table}"`, params: [] });
745
747
  queryTypeDetails = { with: { slug } };
746
748
  models.filter(({ system }) => system?.model === model.slug).map((systemModel) => {
747
- return composeSystemModelStatement(
748
- models,
749
- dependencyStatements,
750
- "drop",
751
- systemModel
752
- );
749
+ return handleSystemModel(models, dependencyStatements, "drop", systemModel);
753
750
  });
754
751
  }
755
752
  const queryTypeAction = action === "create" ? "add" : action === "alter" ? "set" : "remove";
@@ -759,6 +756,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
759
756
  }
760
757
  };
761
758
  }
759
+ const modelBeforeUpdate = structuredClone(model);
762
760
  const existingModel = model;
763
761
  const pluralType = PLURAL_MODEL_ENTITIES[entity];
764
762
  const targetEntityIndex = existingModel[pluralType]?.findIndex(
@@ -773,6 +771,8 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
773
771
  const existingEntity = existingModel[pluralType]?.[targetEntityIndex];
774
772
  if (entity === "field") {
775
773
  const statement = `ALTER TABLE "${existingModel.table}"`;
774
+ const existingField = existingEntity;
775
+ const existingLinkField = existingField?.type === "link" && existingField.kind === "many";
776
776
  if (action === "create") {
777
777
  const field2 = jsonValue;
778
778
  field2.type = field2.type || "string";
@@ -785,20 +785,17 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
785
785
  }
786
786
  } else if (action === "alter") {
787
787
  const newSlug = jsonValue?.slug;
788
- if (newSlug) {
788
+ if (newSlug && !existingLinkField) {
789
789
  dependencyStatements.push({
790
790
  statement: `${statement} RENAME COLUMN "${slug}" TO "${newSlug}"`,
791
791
  params: []
792
792
  });
793
793
  }
794
- } else if (action === "drop") {
795
- const existingField = existingEntity;
796
- if (!(existingField.type === "link" && existingField.kind === "many")) {
797
- dependencyStatements.push({
798
- statement: `${statement} DROP COLUMN "${slug}"`,
799
- params: []
800
- });
801
- }
794
+ } else if (action === "drop" && !existingLinkField) {
795
+ dependencyStatements.push({
796
+ statement: `${statement} DROP COLUMN "${slug}"`,
797
+ params: []
798
+ });
802
799
  }
803
800
  }
804
801
  const statementAction = action.toUpperCase();
@@ -890,7 +887,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
890
887
  const value = prepareStatementValue(statementParams, jsonValue);
891
888
  json = `json_set(${field}, '$.${slug}', json_patch(json_extract(${field}, '$.${slug}'), ${value}))`;
892
889
  const targetEntity = existingModel[pluralType];
893
- targetEntity[targetEntityIndex] = jsonValue;
890
+ Object.assign(targetEntity[targetEntityIndex], jsonValue);
894
891
  break;
895
892
  }
896
893
  case "drop": {
@@ -903,15 +900,35 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
903
900
  return system?.model === existingModel.slug;
904
901
  });
905
902
  const newSystemModels = getSystemModels(models, existingModel);
903
+ const matchSystemModels = (oldSystemModel, newSystemModel) => {
904
+ const conditions = [
905
+ oldSystemModel.system?.model === newSystemModel.system?.model
906
+ ];
907
+ if (oldSystemModel.system?.associationSlug) {
908
+ const oldFieldIndex = modelBeforeUpdate?.fields.findIndex((item) => {
909
+ return item.slug === newSystemModel.system?.associationSlug;
910
+ });
911
+ const newFieldIndex = existingModel.fields.findIndex((item) => {
912
+ return item.slug === oldSystemModel.system?.associationSlug;
913
+ });
914
+ conditions.push(oldFieldIndex === newFieldIndex);
915
+ }
916
+ return conditions.every((condition) => condition === true);
917
+ };
906
918
  for (const systemModel of currentSystemModels) {
907
- const exists = newSystemModels.find((model2) => model2.slug === systemModel.slug);
908
- if (exists) continue;
909
- composeSystemModelStatement(models, dependencyStatements, "drop", systemModel);
919
+ const exists = newSystemModels.find(matchSystemModels.bind(null, systemModel));
920
+ if (exists) {
921
+ if (exists.slug !== systemModel.slug) {
922
+ handleSystemModel(models, dependencyStatements, "alter", systemModel, exists);
923
+ }
924
+ continue;
925
+ }
926
+ handleSystemModel(models, dependencyStatements, "drop", systemModel);
910
927
  }
911
928
  for (const systemModel of newSystemModels) {
912
- const exists = currentSystemModels.find((model2) => model2.slug === systemModel.slug);
929
+ const exists = currentSystemModels.find(matchSystemModels.bind(null, systemModel));
913
930
  if (exists) continue;
914
- composeSystemModelStatement(models, dependencyStatements, "create", systemModel);
931
+ handleSystemModel(models, dependencyStatements, "create", systemModel);
915
932
  }
916
933
  return {
917
934
  set: {
@@ -925,9 +942,24 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
925
942
  };
926
943
  };
927
944
 
928
- // src/instructions/before-after.ts
945
+ // src/utils/pagination.ts
929
946
  var CURSOR_SEPARATOR = ",";
930
947
  var CURSOR_NULL_PLACEHOLDER = "RONIN_NULL";
948
+ var generatePaginationCursor = (model, orderedBy, record) => {
949
+ const { ascending = [], descending = [] } = orderedBy || {};
950
+ const keys = [...ascending, ...descending];
951
+ if (keys.length === 0) keys.push("ronin.createdAt");
952
+ const cursors = keys.map((fieldSlug) => {
953
+ const property = getProperty(record, fieldSlug);
954
+ if (property === null || property === void 0) return CURSOR_NULL_PLACEHOLDER;
955
+ const { field } = getFieldFromModel(model, fieldSlug, "orderedBy");
956
+ if (field.type === "date") return new Date(property).getTime();
957
+ return property;
958
+ });
959
+ return cursors.map((cursor) => encodeURIComponent(String(cursor))).join(CURSOR_SEPARATOR);
960
+ };
961
+
962
+ // src/instructions/before-after.ts
931
963
  var handleBeforeOrAfter = (model, statementParams, instructions) => {
932
964
  if (!(instructions.before || instructions.after)) {
933
965
  throw new RoninError({
@@ -1198,6 +1230,11 @@ var handleTo = (models, model, statementParams, queryType, dependencyStatements,
1198
1230
  if (symbol?.type === "query") {
1199
1231
  let { queryModel: subQueryModelSlug, queryInstructions: subQueryInstructions } = splitQuery(symbol.value);
1200
1232
  const subQueryModel = getModelBySlug(models, subQueryModelSlug);
1233
+ if (subQueryInstructions?.selecting) {
1234
+ const currentFields = new Set(subQueryInstructions.selecting);
1235
+ currentFields.add("id");
1236
+ subQueryInstructions.selecting = Array.from(currentFields);
1237
+ }
1201
1238
  const subQuerySelectedFields = subQueryInstructions?.selecting;
1202
1239
  const subQueryIncludedFields = subQueryInstructions?.including;
1203
1240
  const subQueryFields = [
@@ -1220,7 +1257,19 @@ var handleTo = (models, model, statementParams, queryType, dependencyStatements,
1220
1257
  ...subQueryInstructions.including
1221
1258
  };
1222
1259
  }
1223
- return compileQueryInput(symbol.value, models, statementParams).main.statement;
1260
+ let statement2 = "";
1261
+ if (subQuerySelectedFields) {
1262
+ const selectedFields = [
1263
+ ...subQueryFields,
1264
+ ...defaultFieldsToAdd.map(([key]) => key)
1265
+ ];
1266
+ const columns = selectedFields.map((field) => {
1267
+ return getFieldFromModel(model, field, "to").fieldSelector;
1268
+ });
1269
+ statement2 = `(${columns.join(", ")}) `;
1270
+ }
1271
+ statement2 += compileQueryInput(symbol.value, models, statementParams).main.statement;
1272
+ return statement2;
1224
1273
  }
1225
1274
  Object.assign(toInstruction, defaultFields);
1226
1275
  for (const fieldSlug in toInstruction) {
@@ -1484,11 +1533,44 @@ var Transaction = class {
1484
1533
  return expand(formattedRecord);
1485
1534
  }
1486
1535
  prepareResults(results) {
1487
- return results.map((result, index) => {
1536
+ const relevantResults = results.filter((_, index) => {
1537
+ return this.statements[index].returning;
1538
+ });
1539
+ return relevantResults.map((result, index) => {
1488
1540
  const query = this.queries.at(-index);
1489
- const { queryModel } = splitQuery(query);
1541
+ const { queryModel, queryInstructions } = splitQuery(query);
1490
1542
  const model = getModelBySlug(this.models, queryModel);
1491
- return { record: this.formatRecord(model, result[0]) };
1543
+ const single = queryModel !== model.pluralSlug;
1544
+ if (single) {
1545
+ return { record: this.formatRecord(model, result[0]) };
1546
+ }
1547
+ const pageSize = queryInstructions?.limitedTo;
1548
+ const output = {
1549
+ records: result.map((resultItem) => {
1550
+ return this.formatRecord(model, resultItem);
1551
+ })
1552
+ };
1553
+ if (pageSize && output.records.length > 0) {
1554
+ if (queryInstructions?.before || queryInstructions?.after) {
1555
+ const direction = queryInstructions?.before ? "moreAfter" : "moreBefore";
1556
+ const firstRecord = output.records[0];
1557
+ output[direction] = generatePaginationCursor(
1558
+ model,
1559
+ queryInstructions.orderedBy,
1560
+ firstRecord
1561
+ );
1562
+ }
1563
+ if (output.records.length > pageSize) {
1564
+ const direction = queryInstructions?.before ? "moreBefore" : "moreAfter";
1565
+ const lastRecord = output.records.pop();
1566
+ output[direction] = generatePaginationCursor(
1567
+ model,
1568
+ queryInstructions.orderedBy,
1569
+ lastRecord
1570
+ );
1571
+ }
1572
+ }
1573
+ return output;
1492
1574
  });
1493
1575
  }
1494
1576
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ronin/compiler",
3
- "version": "0.10.0",
3
+ "version": "0.10.1-leo-ron-1083-experimental-209",
4
4
  "type": "module",
5
5
  "description": "Compiles RONIN queries to SQL statements.",
6
6
  "publishConfig": {