@ronin/compiler 0.8.5 → 0.8.7
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/dist/index.d.ts +1 -1
- package/dist/index.js +74 -133
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
@@ -5985,4 +5985,4 @@ declare const compileQueries: (queries: Array<Query>, models: Array<PublicModel>
|
|
5985
5985
|
inlineParams?: boolean;
|
5986
5986
|
}) => Array<Statement>;
|
5987
5987
|
|
5988
|
-
export { type PublicModel as Model, type ModelField, type ModelIndex, type ModelTrigger, type Query, type Statement, compileQueries };
|
5988
|
+
export { type PublicModel as Model, type ModelField, type ModelIndex, type ModelPreset, type ModelTrigger, type Query, type Statement, compileQueries };
|
package/dist/index.js
CHANGED
@@ -587,11 +587,6 @@ var addDefaultModelPresets = (list, model) => {
|
|
587
587
|
}
|
588
588
|
return model;
|
589
589
|
};
|
590
|
-
var mappedInstructions = {
|
591
|
-
create: "to",
|
592
|
-
alter: "with",
|
593
|
-
drop: "with"
|
594
|
-
};
|
595
590
|
var typesInSQLite = {
|
596
591
|
link: "TEXT",
|
597
592
|
string: "TEXT",
|
@@ -638,112 +633,72 @@ var PLURAL_MODEL_ENTITIES = {
|
|
638
633
|
trigger: "triggers",
|
639
634
|
preset: "presets"
|
640
635
|
};
|
636
|
+
var formatModelEntity = (type, entities) => {
|
637
|
+
const entries = entities?.map((entity) => {
|
638
|
+
const { slug, ...rest } = "slug" in entity ? entity : { slug: `${type}Slug`, ...entity };
|
639
|
+
return [slug, rest];
|
640
|
+
});
|
641
|
+
return entries ? Object.fromEntries(entries) : void 0;
|
642
|
+
};
|
641
643
|
var transformMetaQuery = (models, dependencyStatements, statementParams, query) => {
|
642
644
|
const { queryType } = splitQuery(query);
|
643
|
-
|
644
|
-
|
645
|
-
|
645
|
+
const subAltering = query.alter && !("to" in query.alter);
|
646
|
+
const action = subAltering && query.alter ? Object.keys(query.alter).filter((key) => key !== "model")[0] : queryType;
|
647
|
+
const actionReadable = action === "create" ? "creating" : action === "alter" ? "altering" : "dropping";
|
648
|
+
const entity = subAltering && query.alter ? Object.keys(query.alter[action])[0] : "model";
|
649
|
+
let slug = entity === "model" && action === "create" ? null : query[queryType].model;
|
650
|
+
let modelSlug = slug;
|
651
|
+
let jsonValue;
|
646
652
|
if (query.create) {
|
647
653
|
const init = query.create.model;
|
648
|
-
|
649
|
-
|
650
|
-
to: details
|
651
|
-
};
|
652
|
-
}
|
653
|
-
if (query.drop) {
|
654
|
-
queryInstructions = {
|
655
|
-
with: { slug: query.drop.model }
|
656
|
-
};
|
654
|
+
jsonValue = "to" in query.create ? { slug: init, ...query.create.to } : init;
|
655
|
+
slug = modelSlug = jsonValue.slug;
|
657
656
|
}
|
658
657
|
if (query.alter) {
|
659
|
-
const modelSlugTest = query.alter.model;
|
660
658
|
if ("to" in query.alter) {
|
661
|
-
|
662
|
-
with: { slug: modelSlugTest },
|
663
|
-
to: query.alter.to
|
664
|
-
};
|
659
|
+
jsonValue = query.alter.to;
|
665
660
|
} else {
|
666
|
-
|
667
|
-
(key) => key !== "model"
|
668
|
-
)[0];
|
669
|
-
const details = query.alter[action];
|
670
|
-
entity = Object.keys(details)[0];
|
671
|
-
let jsonSlug = details[entity];
|
672
|
-
let jsonValue2;
|
661
|
+
slug = query.alter[action][entity];
|
673
662
|
if ("create" in query.alter) {
|
674
663
|
const item = query.alter.create[entity];
|
675
|
-
|
676
|
-
|
677
|
-
queryInstructions = {
|
678
|
-
to: {
|
679
|
-
model: { slug: modelSlugTest },
|
680
|
-
...jsonValue2
|
681
|
-
}
|
682
|
-
};
|
683
|
-
}
|
684
|
-
if ("alter" in query.alter) {
|
685
|
-
jsonValue2 = query.alter.alter.to;
|
686
|
-
queryInstructions = {
|
687
|
-
with: { model: { slug: modelSlugTest }, slug: jsonSlug },
|
688
|
-
to: jsonValue2
|
689
|
-
};
|
690
|
-
}
|
691
|
-
if ("drop" in query.alter) {
|
692
|
-
queryInstructions = {
|
693
|
-
with: { model: { slug: modelSlugTest }, slug: jsonSlug }
|
694
|
-
};
|
664
|
+
slug = item.slug || `${entity}Slug`;
|
665
|
+
jsonValue = { slug, ...item };
|
695
666
|
}
|
667
|
+
if ("alter" in query.alter) jsonValue = query.alter.alter.to;
|
696
668
|
}
|
697
669
|
}
|
698
|
-
if (!
|
699
|
-
const
|
700
|
-
const
|
701
|
-
|
702
|
-
let actionReadable = null;
|
703
|
-
switch (action) {
|
704
|
-
case "create": {
|
705
|
-
if (entity === "model" || entity === "index" || entity === "trigger") {
|
706
|
-
tableAction = "CREATE";
|
707
|
-
}
|
708
|
-
actionReadable = "creating";
|
709
|
-
break;
|
710
|
-
}
|
711
|
-
case "alter": {
|
712
|
-
if (entity === "model") tableAction = "ALTER";
|
713
|
-
actionReadable = "updating";
|
714
|
-
break;
|
715
|
-
}
|
716
|
-
case "drop": {
|
717
|
-
if (entity === "model" || entity === "index" || entity === "trigger") {
|
718
|
-
tableAction = "DROP";
|
719
|
-
}
|
720
|
-
actionReadable = "deleting";
|
721
|
-
break;
|
722
|
-
}
|
723
|
-
}
|
724
|
-
const slug = instructionList?.slug?.being || instructionList?.slug;
|
725
|
-
const modelInstruction = instructionList?.model;
|
726
|
-
const modelSlug = modelInstruction?.slug?.being || modelInstruction?.slug;
|
727
|
-
const usableSlug = entity === "model" ? slug : modelSlug;
|
728
|
-
const tableName = convertToSnakeCase(pluralize(usableSlug));
|
729
|
-
const targetModel = entity === "model" && action === "create" ? null : getModelBySlug(models, usableSlug);
|
670
|
+
if (!(modelSlug && slug)) return query;
|
671
|
+
const tableAction = ["model", "index", "trigger"].includes(entity) ? action.toUpperCase() : "ALTER";
|
672
|
+
const tableName = convertToSnakeCase(pluralize(modelSlug));
|
673
|
+
const model = action === "create" && entity === "model" ? null : getModelBySlug(models, modelSlug);
|
730
674
|
const statement = `${tableAction} TABLE "${tableName}"`;
|
731
675
|
if (entity === "model") {
|
732
676
|
let queryTypeDetails;
|
733
677
|
if (action === "create") {
|
734
|
-
const
|
678
|
+
const newModel = jsonValue;
|
679
|
+
const modelWithFields = addDefaultModelFields(newModel, true);
|
735
680
|
const modelWithPresets = addDefaultModelPresets(models, modelWithFields);
|
736
|
-
const
|
737
|
-
|
681
|
+
const entities = Object.fromEntries(
|
682
|
+
Object.entries(PLURAL_MODEL_ENTITIES).map(([type, pluralType2]) => {
|
683
|
+
const list = modelWithPresets[pluralType2];
|
684
|
+
return [pluralType2, formatModelEntity(type, list)];
|
685
|
+
})
|
686
|
+
);
|
687
|
+
const columns = modelWithPresets.fields.map((field) => getFieldStatement(models, modelWithPresets, field)).filter(Boolean);
|
738
688
|
dependencyStatements.push({
|
739
689
|
statement: `${statement} (${columns.join(", ")})`,
|
740
690
|
params: []
|
741
691
|
});
|
742
692
|
models.push(modelWithPresets);
|
743
|
-
|
693
|
+
const finalModel = Object.assign({}, modelWithPresets);
|
694
|
+
for (const entity2 in entities) {
|
695
|
+
if (entities[entity2]) finalModel[entity2] = entities[entity2];
|
696
|
+
}
|
697
|
+
queryTypeDetails = { to: finalModel };
|
744
698
|
}
|
745
|
-
if (action === "alter") {
|
746
|
-
const
|
699
|
+
if (action === "alter" && model) {
|
700
|
+
const newModel = jsonValue;
|
701
|
+
const modelWithFields = addDefaultModelFields(newModel, false);
|
747
702
|
const modelWithPresets = addDefaultModelPresets(models, modelWithFields);
|
748
703
|
const newSlug = modelWithPresets.pluralSlug;
|
749
704
|
if (newSlug) {
|
@@ -753,20 +708,18 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
753
708
|
params: []
|
754
709
|
});
|
755
710
|
}
|
756
|
-
Object.assign(
|
711
|
+
Object.assign(model, modelWithPresets);
|
757
712
|
queryTypeDetails = {
|
758
713
|
with: {
|
759
|
-
slug
|
714
|
+
slug
|
760
715
|
},
|
761
716
|
to: modelWithPresets
|
762
717
|
};
|
763
718
|
}
|
764
|
-
if (action === "drop") {
|
765
|
-
models.splice(models.indexOf(
|
719
|
+
if (action === "drop" && model) {
|
720
|
+
models.splice(models.indexOf(model), 1);
|
766
721
|
dependencyStatements.push({ statement, params: [] });
|
767
|
-
queryTypeDetails = {
|
768
|
-
with: { slug: usableSlug }
|
769
|
-
};
|
722
|
+
queryTypeDetails = { with: { slug } };
|
770
723
|
}
|
771
724
|
const queryTypeAction = action === "create" ? "add" : action === "alter" ? "set" : "remove";
|
772
725
|
return {
|
@@ -775,15 +728,16 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
775
728
|
}
|
776
729
|
};
|
777
730
|
}
|
778
|
-
if (entity === "field") {
|
731
|
+
if (entity === "field" && model) {
|
779
732
|
if (action === "create") {
|
780
|
-
|
733
|
+
const field = jsonValue;
|
734
|
+
field.type = field.type || "string";
|
781
735
|
dependencyStatements.push({
|
782
|
-
statement: `${statement} ADD COLUMN ${getFieldStatement(models,
|
736
|
+
statement: `${statement} ADD COLUMN ${getFieldStatement(models, model, field)}`,
|
783
737
|
params: []
|
784
738
|
});
|
785
739
|
} else if (action === "alter") {
|
786
|
-
const newSlug =
|
740
|
+
const newSlug = jsonValue?.slug;
|
787
741
|
if (newSlug) {
|
788
742
|
dependencyStatements.push({
|
789
743
|
statement: `${statement} RENAME COLUMN "${slug}" TO "${newSlug}"`,
|
@@ -797,81 +751,69 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
797
751
|
});
|
798
752
|
}
|
799
753
|
}
|
800
|
-
if (entity === "index") {
|
754
|
+
if (entity === "index" && model) {
|
755
|
+
const index = jsonValue;
|
801
756
|
const indexName = convertToSnakeCase(slug);
|
802
|
-
const unique = instructionList?.unique;
|
803
|
-
const filterQuery = instructionList?.filter;
|
804
|
-
const fields = instructionList?.fields;
|
805
757
|
const params = [];
|
806
|
-
let statement2 = `${tableAction}${unique ? " UNIQUE" : ""} INDEX "${indexName}"`;
|
758
|
+
let statement2 = `${tableAction}${index?.unique ? " UNIQUE" : ""} INDEX "${indexName}"`;
|
807
759
|
if (action === "create") {
|
808
|
-
const
|
809
|
-
const columns = fields.map((field) => {
|
760
|
+
const columns = index.fields.map((field) => {
|
810
761
|
let fieldSelector = "";
|
811
762
|
if ("slug" in field) {
|
812
763
|
({ fieldSelector } = getFieldFromModel(model, field.slug, "to"));
|
813
764
|
} else if ("expression" in field) {
|
814
|
-
fieldSelector = parseFieldExpression(model, "to", field.expression
|
765
|
+
fieldSelector = parseFieldExpression(model, "to", field.expression);
|
815
766
|
}
|
816
767
|
if (field.collation) fieldSelector += ` COLLATE ${field.collation}`;
|
817
768
|
if (field.order) fieldSelector += ` ${field.order}`;
|
818
769
|
return fieldSelector;
|
819
770
|
});
|
820
771
|
statement2 += ` ON "${tableName}" (${columns.join(", ")})`;
|
821
|
-
if (
|
822
|
-
const withStatement = handleWith(
|
823
|
-
models,
|
824
|
-
targetModel,
|
825
|
-
params,
|
826
|
-
filterQuery
|
827
|
-
);
|
772
|
+
if (index.filter) {
|
773
|
+
const withStatement = handleWith(models, model, params, index.filter);
|
828
774
|
statement2 += ` WHERE (${withStatement})`;
|
829
775
|
}
|
830
776
|
}
|
831
777
|
dependencyStatements.push({ statement: statement2, params });
|
832
778
|
}
|
833
|
-
if (entity === "trigger") {
|
779
|
+
if (entity === "trigger" && model) {
|
834
780
|
const triggerName = convertToSnakeCase(slug);
|
835
781
|
const params = [];
|
836
782
|
let statement2 = `${tableAction} TRIGGER "${triggerName}"`;
|
837
783
|
if (action === "create") {
|
838
|
-
const
|
839
|
-
const {
|
840
|
-
|
841
|
-
|
842
|
-
const filterQuery = instructionList?.filter;
|
843
|
-
const fields = instructionList?.fields;
|
844
|
-
if (fields) {
|
845
|
-
if (action2 !== "UPDATE") {
|
784
|
+
const trigger = jsonValue;
|
785
|
+
const statementParts = [`${trigger.when} ${trigger.action}`];
|
786
|
+
if (trigger.fields) {
|
787
|
+
if (trigger.action !== "UPDATE") {
|
846
788
|
throw new RoninError({
|
847
789
|
message: `When ${actionReadable} ${PLURAL_MODEL_ENTITIES[entity]}, targeting specific fields requires the \`UPDATE\` action.`,
|
848
790
|
code: "INVALID_MODEL_VALUE",
|
849
791
|
fields: ["action"]
|
850
792
|
});
|
851
793
|
}
|
852
|
-
const fieldSelectors = fields.map((field) => {
|
853
|
-
return getFieldFromModel(
|
794
|
+
const fieldSelectors = trigger.fields.map((field) => {
|
795
|
+
return getFieldFromModel(model, field.slug, "to").fieldSelector;
|
854
796
|
});
|
855
797
|
statementParts.push(`OF (${fieldSelectors.join(", ")})`);
|
856
798
|
}
|
857
799
|
statementParts.push("ON", `"${tableName}"`);
|
858
|
-
if (
|
800
|
+
if (trigger.filter || trigger.effects.some((query2) => findInObject(query2, RONIN_MODEL_SYMBOLS.FIELD))) {
|
859
801
|
statementParts.push("FOR EACH ROW");
|
860
802
|
}
|
861
|
-
if (
|
862
|
-
const tableAlias =
|
803
|
+
if (trigger.filter) {
|
804
|
+
const tableAlias = trigger.action === "DELETE" ? RONIN_MODEL_SYMBOLS.FIELD_PARENT_OLD : RONIN_MODEL_SYMBOLS.FIELD_PARENT_NEW;
|
863
805
|
const withStatement = handleWith(
|
864
806
|
models,
|
865
|
-
{ ...
|
807
|
+
{ ...model, tableAlias },
|
866
808
|
params,
|
867
|
-
|
809
|
+
trigger.filter
|
868
810
|
);
|
869
811
|
statementParts.push("WHEN", `(${withStatement})`);
|
870
812
|
}
|
871
|
-
const effectStatements =
|
813
|
+
const effectStatements = trigger.effects.map((effectQuery) => {
|
872
814
|
return compileQueryInput(effectQuery, models, params, {
|
873
815
|
returning: false,
|
874
|
-
parentModel:
|
816
|
+
parentModel: model
|
875
817
|
}).main.statement;
|
876
818
|
});
|
877
819
|
if (effectStatements.length > 1) statementParts.push("BEGIN");
|
@@ -883,14 +825,13 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
883
825
|
}
|
884
826
|
const pluralType = PLURAL_MODEL_ENTITIES[entity];
|
885
827
|
const jsonAction = action === "create" ? "insert" : action === "alter" ? "patch" : "remove";
|
886
|
-
const jsonValue = action === "create" ? { ...instructionList, model: void 0 } : action === "alter" ? queryInstructions.to : null;
|
887
828
|
let json = `json_${jsonAction}(${RONIN_MODEL_SYMBOLS.FIELD}${pluralType}, '$.${slug}'`;
|
888
829
|
if (jsonValue) json += `, ${prepareStatementValue(statementParams, jsonValue)}`;
|
889
830
|
json += ")";
|
890
831
|
return {
|
891
832
|
set: {
|
892
833
|
model: {
|
893
|
-
with: { slug:
|
834
|
+
with: { slug: modelSlug },
|
894
835
|
to: {
|
895
836
|
[pluralType]: { [RONIN_MODEL_SYMBOLS.EXPRESSION]: json }
|
896
837
|
}
|