@ronin/compiler 0.9.0-leo-ron-1083-experimental-201 → 0.9.0-leo-ron-1083-experimental-203
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/index.d.ts +4 -0
- package/dist/index.js +41 -13
- package/package.json +1 -1
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
@@ -20,6 +20,12 @@ var RONIN_MODEL_FIELD_REGEX = new RegExp(
|
|
20
20
|
`${RONIN_MODEL_SYMBOLS.FIELD}[_a-zA-Z0-9]+`,
|
21
21
|
"g"
|
22
22
|
);
|
23
|
+
var MODEL_ENTITY_ERROR_CODES = {
|
24
|
+
field: "FIELD_NOT_FOUND",
|
25
|
+
index: "INDEX_NOT_FOUND",
|
26
|
+
trigger: "TRIGGER_NOT_FOUND",
|
27
|
+
preset: "PRESET_NOT_FOUND"
|
28
|
+
};
|
23
29
|
var RoninError = class extends Error {
|
24
30
|
code;
|
25
31
|
field;
|
@@ -617,6 +623,7 @@ var getFieldStatement = (models, model, field) => {
|
|
617
623
|
statement += ` GENERATED ALWAYS AS (${parseFieldExpression(model, "to", symbol?.value)}) ${kind}`;
|
618
624
|
}
|
619
625
|
if (field.type === "link") {
|
626
|
+
if (field.kind === "many") return null;
|
620
627
|
const actions = field.actions || {};
|
621
628
|
const targetTable = getModelBySlug(models, field.target).table;
|
622
629
|
statement += ` REFERENCES ${targetTable}("id")`;
|
@@ -729,14 +736,18 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
729
736
|
}
|
730
737
|
};
|
731
738
|
}
|
732
|
-
|
739
|
+
const existingModel = model;
|
740
|
+
if (entity === "field") {
|
733
741
|
if (action === "create") {
|
734
742
|
const field2 = jsonValue;
|
735
743
|
field2.type = field2.type || "string";
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
744
|
+
const fieldStatement = getFieldStatement(models, existingModel, field2);
|
745
|
+
if (fieldStatement) {
|
746
|
+
dependencyStatements.push({
|
747
|
+
statement: `${statement} ADD COLUMN ${fieldStatement}`,
|
748
|
+
params: []
|
749
|
+
});
|
750
|
+
}
|
740
751
|
} else if (action === "alter") {
|
741
752
|
const newSlug = jsonValue?.slug;
|
742
753
|
if (newSlug) {
|
@@ -752,7 +763,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
752
763
|
});
|
753
764
|
}
|
754
765
|
}
|
755
|
-
if (entity === "index"
|
766
|
+
if (entity === "index") {
|
756
767
|
const index = jsonValue;
|
757
768
|
const indexName = convertToSnakeCase(slug);
|
758
769
|
const params = [];
|
@@ -761,9 +772,9 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
761
772
|
const columns = index.fields.map((field2) => {
|
762
773
|
let fieldSelector = "";
|
763
774
|
if ("slug" in field2) {
|
764
|
-
({ fieldSelector } = getFieldFromModel(
|
775
|
+
({ fieldSelector } = getFieldFromModel(existingModel, field2.slug, "to"));
|
765
776
|
} else if ("expression" in field2) {
|
766
|
-
fieldSelector = parseFieldExpression(
|
777
|
+
fieldSelector = parseFieldExpression(existingModel, "to", field2.expression);
|
767
778
|
}
|
768
779
|
if (field2.collation) fieldSelector += ` COLLATE ${field2.collation}`;
|
769
780
|
if (field2.order) fieldSelector += ` ${field2.order}`;
|
@@ -771,13 +782,13 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
771
782
|
});
|
772
783
|
statement2 += ` ON "${tableName}" (${columns.join(", ")})`;
|
773
784
|
if (index.filter) {
|
774
|
-
const withStatement = handleWith(models,
|
785
|
+
const withStatement = handleWith(models, existingModel, params, index.filter);
|
775
786
|
statement2 += ` WHERE (${withStatement})`;
|
776
787
|
}
|
777
788
|
}
|
778
789
|
dependencyStatements.push({ statement: statement2, params });
|
779
790
|
}
|
780
|
-
if (entity === "trigger"
|
791
|
+
if (entity === "trigger") {
|
781
792
|
const triggerName = convertToSnakeCase(slug);
|
782
793
|
const params = [];
|
783
794
|
let statement2 = `${tableAction} TRIGGER "${triggerName}"`;
|
@@ -793,7 +804,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
793
804
|
});
|
794
805
|
}
|
795
806
|
const fieldSelectors = trigger.fields.map((field2) => {
|
796
|
-
return getFieldFromModel(
|
807
|
+
return getFieldFromModel(existingModel, field2.slug, "to").fieldSelector;
|
797
808
|
});
|
798
809
|
statementParts.push(`OF (${fieldSelectors.join(", ")})`);
|
799
810
|
}
|
@@ -805,7 +816,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
805
816
|
const tableAlias = trigger.action === "DELETE" ? RONIN_MODEL_SYMBOLS.FIELD_PARENT_OLD : RONIN_MODEL_SYMBOLS.FIELD_PARENT_NEW;
|
806
817
|
const withStatement = handleWith(
|
807
818
|
models,
|
808
|
-
{ ...
|
819
|
+
{ ...existingModel, tableAlias },
|
809
820
|
params,
|
810
821
|
trigger.filter
|
811
822
|
);
|
@@ -814,7 +825,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
814
825
|
const effectStatements = trigger.effects.map((effectQuery) => {
|
815
826
|
return compileQueryInput(effectQuery, models, params, {
|
816
827
|
returning: false,
|
817
|
-
parentModel:
|
828
|
+
parentModel: existingModel
|
818
829
|
}).main.statement;
|
819
830
|
});
|
820
831
|
if (effectStatements.length > 1) statementParts.push("BEGIN");
|
@@ -826,20 +837,37 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
826
837
|
}
|
827
838
|
const pluralType = PLURAL_MODEL_ENTITIES[entity];
|
828
839
|
const field = `${RONIN_MODEL_SYMBOLS.FIELD}${pluralType}`;
|
840
|
+
const targetEntityIndex = existingModel[pluralType]?.findIndex(
|
841
|
+
(entity2) => entity2.slug === slug
|
842
|
+
);
|
843
|
+
if ((action === "alter" || action === "drop") && (typeof targetEntityIndex === "undefined" || targetEntityIndex === -1)) {
|
844
|
+
throw new RoninError({
|
845
|
+
message: `No ${entity} with slug "${slug}" defined in model "${existingModel.name}".`,
|
846
|
+
code: MODEL_ENTITY_ERROR_CODES[entity]
|
847
|
+
});
|
848
|
+
}
|
829
849
|
let json;
|
830
850
|
switch (action) {
|
831
851
|
case "create": {
|
832
852
|
const value = prepareStatementValue(statementParams, jsonValue);
|
833
853
|
json = `json_insert(${field}, '$.${slug}', ${value})`;
|
854
|
+
existingModel[pluralType] = [
|
855
|
+
...existingModel[pluralType] || [],
|
856
|
+
jsonValue
|
857
|
+
];
|
834
858
|
break;
|
835
859
|
}
|
836
860
|
case "alter": {
|
837
861
|
const value = prepareStatementValue(statementParams, jsonValue);
|
838
862
|
json = `json_set(${field}, '$.${slug}', json_patch(json_extract(${field}, '$.${slug}'), ${value}))`;
|
863
|
+
const targetEntity = existingModel[pluralType];
|
864
|
+
targetEntity[targetEntityIndex] = jsonValue;
|
839
865
|
break;
|
840
866
|
}
|
841
867
|
case "drop": {
|
842
868
|
json = `json_remove(${field}, '$.${slug}')`;
|
869
|
+
const targetEntity = existingModel[pluralType];
|
870
|
+
delete targetEntity[targetEntityIndex];
|
843
871
|
}
|
844
872
|
}
|
845
873
|
return {
|