@ronin/compiler 0.9.0-leo-ron-1083-experimental-200 → 0.9.0-leo-ron-1083-experimental-202

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -52,6 +52,9 @@ const transaction = new Transaction([
52
52
 
53
53
  transaction.statements;
54
54
  // [{
55
+ // statement: 'CREATE TABLE "accounts" ...',
56
+ // params: []
57
+ // }, {
55
58
  // statement: 'SELECT * FROM "accounts"',
56
59
  // params: [],
57
60
  // returning: true,
package/dist/index.d.ts CHANGED
@@ -5919,6 +5919,10 @@ type ModelTriggerField<T extends Array<ModelField> = Array<ModelField>> = {
5919
5919
  slug: T[number]['slug'];
5920
5920
  };
5921
5921
  type ModelTrigger<T extends Array<ModelField> = Array<ModelField>> = {
5922
+ /**
5923
+ * The identifier of the index.
5924
+ */
5925
+ slug?: string;
5922
5926
  /** The type of query for which the trigger should fire. */
5923
5927
  action: 'INSERT' | 'UPDATE' | 'DELETE';
5924
5928
  /** When the trigger should fire in the case that a matching query is executed. */
package/dist/index.js CHANGED
@@ -617,6 +617,7 @@ var getFieldStatement = (models, model, field) => {
617
617
  statement += ` GENERATED ALWAYS AS (${parseFieldExpression(model, "to", symbol?.value)}) ${kind}`;
618
618
  }
619
619
  if (field.type === "link") {
620
+ if (field.kind === "many") return null;
620
621
  const actions = field.actions || {};
621
622
  const targetTable = getModelBySlug(models, field.target).table;
622
623
  statement += ` REFERENCES ${targetTable}("id")`;
@@ -729,14 +730,18 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
729
730
  }
730
731
  };
731
732
  }
732
- if (entity === "field" && model) {
733
+ const existingModel = model;
734
+ if (entity === "field") {
733
735
  if (action === "create") {
734
736
  const field2 = jsonValue;
735
737
  field2.type = field2.type || "string";
736
- dependencyStatements.push({
737
- statement: `${statement} ADD COLUMN ${getFieldStatement(models, model, field2)}`,
738
- params: []
739
- });
738
+ const fieldStatement = getFieldStatement(models, existingModel, field2);
739
+ if (fieldStatement) {
740
+ dependencyStatements.push({
741
+ statement: `${statement} ADD COLUMN ${fieldStatement}`,
742
+ params: []
743
+ });
744
+ }
740
745
  } else if (action === "alter") {
741
746
  const newSlug = jsonValue?.slug;
742
747
  if (newSlug) {
@@ -752,7 +757,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
752
757
  });
753
758
  }
754
759
  }
755
- if (entity === "index" && model) {
760
+ if (entity === "index") {
756
761
  const index = jsonValue;
757
762
  const indexName = convertToSnakeCase(slug);
758
763
  const params = [];
@@ -761,9 +766,9 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
761
766
  const columns = index.fields.map((field2) => {
762
767
  let fieldSelector = "";
763
768
  if ("slug" in field2) {
764
- ({ fieldSelector } = getFieldFromModel(model, field2.slug, "to"));
769
+ ({ fieldSelector } = getFieldFromModel(existingModel, field2.slug, "to"));
765
770
  } else if ("expression" in field2) {
766
- fieldSelector = parseFieldExpression(model, "to", field2.expression);
771
+ fieldSelector = parseFieldExpression(existingModel, "to", field2.expression);
767
772
  }
768
773
  if (field2.collation) fieldSelector += ` COLLATE ${field2.collation}`;
769
774
  if (field2.order) fieldSelector += ` ${field2.order}`;
@@ -771,13 +776,13 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
771
776
  });
772
777
  statement2 += ` ON "${tableName}" (${columns.join(", ")})`;
773
778
  if (index.filter) {
774
- const withStatement = handleWith(models, model, params, index.filter);
779
+ const withStatement = handleWith(models, existingModel, params, index.filter);
775
780
  statement2 += ` WHERE (${withStatement})`;
776
781
  }
777
782
  }
778
783
  dependencyStatements.push({ statement: statement2, params });
779
784
  }
780
- if (entity === "trigger" && model) {
785
+ if (entity === "trigger") {
781
786
  const triggerName = convertToSnakeCase(slug);
782
787
  const params = [];
783
788
  let statement2 = `${tableAction} TRIGGER "${triggerName}"`;
@@ -793,7 +798,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
793
798
  });
794
799
  }
795
800
  const fieldSelectors = trigger.fields.map((field2) => {
796
- return getFieldFromModel(model, field2.slug, "to").fieldSelector;
801
+ return getFieldFromModel(existingModel, field2.slug, "to").fieldSelector;
797
802
  });
798
803
  statementParts.push(`OF (${fieldSelectors.join(", ")})`);
799
804
  }
@@ -805,7 +810,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
805
810
  const tableAlias = trigger.action === "DELETE" ? RONIN_MODEL_SYMBOLS.FIELD_PARENT_OLD : RONIN_MODEL_SYMBOLS.FIELD_PARENT_NEW;
806
811
  const withStatement = handleWith(
807
812
  models,
808
- { ...model, tableAlias },
813
+ { ...existingModel, tableAlias },
809
814
  params,
810
815
  trigger.filter
811
816
  );
@@ -814,7 +819,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
814
819
  const effectStatements = trigger.effects.map((effectQuery) => {
815
820
  return compileQueryInput(effectQuery, models, params, {
816
821
  returning: false,
817
- parentModel: model
822
+ parentModel: existingModel
818
823
  }).main.statement;
819
824
  });
820
825
  if (effectStatements.length > 1) statementParts.push("BEGIN");
@@ -826,20 +831,42 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
826
831
  }
827
832
  const pluralType = PLURAL_MODEL_ENTITIES[entity];
828
833
  const field = `${RONIN_MODEL_SYMBOLS.FIELD}${pluralType}`;
834
+ const targetEntityIndex = existingModel[pluralType]?.findIndex(
835
+ (entity2) => entity2.slug === slug
836
+ );
837
+ if ((action === "alter" || action === "drop") && (typeof targetEntityIndex === "undefined" || targetEntityIndex === -1)) {
838
+ throw new RoninError({
839
+ message: `No ${entity} with slug "${slug}" defined in model "${existingModel.name}".`,
840
+ code: {
841
+ field: "FIELD_NOT_FOUND",
842
+ index: "INDEX_NOT_FOUND",
843
+ trigger: "TRIGGER_NOT_FOUND",
844
+ preset: "PRESET_NOT_FOUND"
845
+ }[entity]
846
+ });
847
+ }
829
848
  let json;
830
849
  switch (action) {
831
850
  case "create": {
832
851
  const value = prepareStatementValue(statementParams, jsonValue);
833
852
  json = `json_insert(${field}, '$.${slug}', ${value})`;
853
+ existingModel[pluralType] = [
854
+ ...existingModel[pluralType] || [],
855
+ jsonValue
856
+ ];
834
857
  break;
835
858
  }
836
859
  case "alter": {
837
860
  const value = prepareStatementValue(statementParams, jsonValue);
838
861
  json = `json_set(${field}, '$.${slug}', json_patch(json_extract(${field}, '$.${slug}'), ${value}))`;
862
+ const targetEntity = existingModel[pluralType];
863
+ targetEntity[targetEntityIndex] = jsonValue;
839
864
  break;
840
865
  }
841
866
  case "drop": {
842
867
  json = `json_remove(${field}, '$.${slug}')`;
868
+ const targetEntity = existingModel[pluralType];
869
+ delete targetEntity[targetEntityIndex];
843
870
  }
844
871
  }
845
872
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ronin/compiler",
3
- "version": "0.9.0-leo-ron-1083-experimental-200",
3
+ "version": "0.9.0-leo-ron-1083-experimental-202",
4
4
  "type": "module",
5
5
  "description": "Compiles RONIN queries to SQL statements.",
6
6
  "publishConfig": {