@ronin/compiler 0.9.0 → 0.10.0-leo-ron-1083-experimental-206
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 +3 -0
- package/dist/index.d.ts +17 -5
- package/dist/index.js +194 -106
- package/package.json +1 -1
package/README.md
CHANGED
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 trigger.
|
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. */
|
@@ -5957,17 +5961,25 @@ interface Model<T extends Array<ModelField> = Array<ModelField>> {
|
|
5957
5961
|
*/
|
5958
5962
|
tableAlias?: string;
|
5959
5963
|
/**
|
5960
|
-
*
|
5961
|
-
*
|
5962
|
-
* the associative model should be mounted on the source model.
|
5964
|
+
* Details that identify the model as a model that was automatically created by RONIN,
|
5965
|
+
* instead of being manually created by a developer.
|
5963
5966
|
*/
|
5964
|
-
|
5967
|
+
system?: {
|
5968
|
+
/** The model that caused the system model to get created. */
|
5969
|
+
model: string | 'root';
|
5970
|
+
/**
|
5971
|
+
* If the model is used to associate two models with each other (in the case of
|
5972
|
+
* many-cardinality link fields), this property should contain the field slug to
|
5973
|
+
* which the associative model should be mounted on the source model.
|
5974
|
+
*/
|
5975
|
+
associationSlug?: string;
|
5976
|
+
};
|
5965
5977
|
fields: T;
|
5966
5978
|
indexes?: Array<ModelIndex<T>>;
|
5967
5979
|
triggers?: Array<ModelTrigger<T>>;
|
5968
5980
|
presets?: Array<ModelPreset>;
|
5969
5981
|
}
|
5970
|
-
type PublicModel<T extends Array<ModelField> = Array<ModelField>> = Omit<Partial<Model<T>>, 'slug' | 'identifiers' | '
|
5982
|
+
type PublicModel<T extends Array<ModelField> = Array<ModelField>> = Omit<Partial<Model<T>>, 'slug' | 'identifiers' | 'system' | 'table' | 'tableAlias'> & {
|
5971
5983
|
slug: Required<Model['slug']>;
|
5972
5984
|
identifiers?: Partial<Model['identifiers']>;
|
5973
5985
|
};
|
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;
|
@@ -459,67 +465,67 @@ var SYSTEM_FIELDS = [
|
|
459
465
|
slug: "ronin.updatedBy"
|
460
466
|
}
|
461
467
|
];
|
462
|
-
var
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
var
|
492
|
-
const
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
468
|
+
var ROOT_MODEL = {
|
469
|
+
slug: "model",
|
470
|
+
identifiers: {
|
471
|
+
name: "name",
|
472
|
+
slug: "slug"
|
473
|
+
},
|
474
|
+
// This name mimics the `sqlite_schema` table in SQLite.
|
475
|
+
table: "ronin_schema",
|
476
|
+
// Indicates that the model was automatically generated by RONIN.
|
477
|
+
system: { model: "root" },
|
478
|
+
fields: [
|
479
|
+
{ slug: "name", type: "string" },
|
480
|
+
{ slug: "pluralName", type: "string" },
|
481
|
+
{ slug: "slug", type: "string" },
|
482
|
+
{ slug: "pluralSlug", type: "string" },
|
483
|
+
{ slug: "idPrefix", type: "string" },
|
484
|
+
{ slug: "table", type: "string" },
|
485
|
+
{ slug: "identifiers", type: "group" },
|
486
|
+
{ slug: "identifiers.name", type: "string" },
|
487
|
+
{ slug: "identifiers.slug", type: "string" },
|
488
|
+
// Providing an empty object as a default value allows us to use `json_insert`
|
489
|
+
// without needing to fall back to an empty object in the insertion statement,
|
490
|
+
// which makes the statement shorter.
|
491
|
+
{ slug: "fields", type: "json", defaultValue: "{}" },
|
492
|
+
{ slug: "indexes", type: "json", defaultValue: "{}" },
|
493
|
+
{ slug: "triggers", type: "json", defaultValue: "{}" },
|
494
|
+
{ slug: "presets", type: "json", defaultValue: "{}" }
|
495
|
+
]
|
496
|
+
};
|
497
|
+
var getSystemModels = (models, model) => {
|
498
|
+
const addedModels = [];
|
499
|
+
for (const field of model.fields || []) {
|
500
|
+
if (field.type === "link" && !field.slug.startsWith("ronin.")) {
|
501
|
+
const relatedModel = getModelBySlug(models, field.target);
|
502
|
+
let fieldSlug = relatedModel.slug;
|
503
|
+
if (field.kind === "many") {
|
504
|
+
fieldSlug = composeAssociationModelSlug(model, field);
|
505
|
+
addedModels.push({
|
506
|
+
pluralSlug: fieldSlug,
|
507
|
+
slug: fieldSlug,
|
508
|
+
system: {
|
509
|
+
model: model.slug,
|
510
|
+
associationSlug: field.slug
|
511
|
+
},
|
512
|
+
fields: [
|
513
|
+
{
|
514
|
+
slug: "source",
|
515
|
+
type: "link",
|
516
|
+
target: model.slug
|
517
|
+
},
|
518
|
+
{
|
519
|
+
slug: "target",
|
520
|
+
type: "link",
|
521
|
+
target: relatedModel.slug
|
522
|
+
}
|
523
|
+
]
|
524
|
+
});
|
518
525
|
}
|
519
526
|
}
|
520
|
-
|
521
|
-
|
522
|
-
return [...SYSTEM_MODELS, ...associativeModels, ...models];
|
527
|
+
}
|
528
|
+
return addedModels;
|
523
529
|
};
|
524
530
|
var addDefaultModelPresets = (list, model) => {
|
525
531
|
const defaultPresets = [];
|
@@ -561,7 +567,7 @@ var addDefaultModelPresets = (list, model) => {
|
|
561
567
|
for (const childMatch of childModels) {
|
562
568
|
const { model: childModel, field: childField } = childMatch;
|
563
569
|
const pluralSlug = childModel.pluralSlug;
|
564
|
-
const presetSlug = childModel.associationSlug || pluralSlug;
|
570
|
+
const presetSlug = childModel.system?.associationSlug || pluralSlug;
|
565
571
|
defaultPresets.push({
|
566
572
|
instructions: {
|
567
573
|
including: {
|
@@ -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")`;
|
@@ -641,6 +648,18 @@ var formatModelEntity = (type, entities) => {
|
|
641
648
|
});
|
642
649
|
return entries ? Object.fromEntries(entries) : void 0;
|
643
650
|
};
|
651
|
+
var handleSystemModel = (models, dependencyStatements, action, systemModel, newModel) => {
|
652
|
+
const { system: _, ...systemModelClean } = systemModel;
|
653
|
+
const query = {
|
654
|
+
[action]: { model: action === "create" ? systemModelClean : systemModelClean.slug }
|
655
|
+
};
|
656
|
+
if (action === "alter" && newModel) {
|
657
|
+
const { system: _2, ...newModelClean } = newModel;
|
658
|
+
query.alter.to = newModelClean;
|
659
|
+
}
|
660
|
+
const statement = compileQueryInput(query, models, []);
|
661
|
+
dependencyStatements.push(...statement.dependencies);
|
662
|
+
};
|
644
663
|
var transformMetaQuery = (models, dependencyStatements, statementParams, query) => {
|
645
664
|
const { queryType } = splitQuery(query);
|
646
665
|
const subAltering = query.alter && !("to" in query.alter);
|
@@ -669,16 +688,16 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
669
688
|
}
|
670
689
|
}
|
671
690
|
if (!(modelSlug && slug)) return query;
|
672
|
-
const tableAction = ["model", "index", "trigger"].includes(entity) ? action.toUpperCase() : "ALTER";
|
673
|
-
const tableName = convertToSnakeCase(pluralize(modelSlug));
|
674
691
|
const model = action === "create" && entity === "model" ? null : getModelBySlug(models, modelSlug);
|
675
|
-
const statement = `${tableAction} TABLE "${tableName}"`;
|
676
692
|
if (entity === "model") {
|
677
693
|
let queryTypeDetails;
|
678
694
|
if (action === "create") {
|
679
695
|
const newModel = jsonValue;
|
680
696
|
const modelWithFields = addDefaultModelFields(newModel, true);
|
681
|
-
const modelWithPresets = addDefaultModelPresets(
|
697
|
+
const modelWithPresets = addDefaultModelPresets(
|
698
|
+
[...models, modelWithFields],
|
699
|
+
modelWithFields
|
700
|
+
);
|
682
701
|
const entities = Object.fromEntries(
|
683
702
|
Object.entries(PLURAL_MODEL_ENTITIES).map(([type, pluralType2]) => {
|
684
703
|
const list = modelWithPresets[pluralType2];
|
@@ -687,7 +706,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
687
706
|
);
|
688
707
|
const columns = modelWithPresets.fields.map((field2) => getFieldStatement(models, modelWithPresets, field2)).filter(Boolean);
|
689
708
|
dependencyStatements.push({
|
690
|
-
statement:
|
709
|
+
statement: `CREATE TABLE "${modelWithPresets.table}" (${columns.join(", ")})`,
|
691
710
|
params: []
|
692
711
|
});
|
693
712
|
models.push(modelWithPresets);
|
@@ -696,16 +715,18 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
696
715
|
if (entities[entity2]) finalModel[entity2] = entities[entity2];
|
697
716
|
}
|
698
717
|
queryTypeDetails = { to: finalModel };
|
718
|
+
getSystemModels(models, modelWithPresets).map((systemModel) => {
|
719
|
+
return handleSystemModel(models, dependencyStatements, "create", systemModel);
|
720
|
+
});
|
699
721
|
}
|
700
722
|
if (action === "alter" && model) {
|
701
723
|
const newModel = jsonValue;
|
702
724
|
const modelWithFields = addDefaultModelFields(newModel, false);
|
703
725
|
const modelWithPresets = addDefaultModelPresets(models, modelWithFields);
|
704
|
-
const
|
705
|
-
if (
|
706
|
-
const newTable = convertToSnakeCase(newSlug);
|
726
|
+
const newTableName = modelWithPresets.table;
|
727
|
+
if (newTableName) {
|
707
728
|
dependencyStatements.push({
|
708
|
-
statement:
|
729
|
+
statement: `ALTER TABLE "${model.table}" RENAME TO "${newTableName}"`,
|
709
730
|
params: []
|
710
731
|
});
|
711
732
|
}
|
@@ -719,8 +740,11 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
719
740
|
}
|
720
741
|
if (action === "drop" && model) {
|
721
742
|
models.splice(models.indexOf(model), 1);
|
722
|
-
dependencyStatements.push({ statement
|
743
|
+
dependencyStatements.push({ statement: `DROP TABLE "${model.table}"`, params: [] });
|
723
744
|
queryTypeDetails = { with: { slug } };
|
745
|
+
models.filter(({ system }) => system?.model === model.slug).map((systemModel) => {
|
746
|
+
return handleSystemModel(models, dependencyStatements, "drop", systemModel);
|
747
|
+
});
|
724
748
|
}
|
725
749
|
const queryTypeAction = action === "create" ? "add" : action === "alter" ? "set" : "remove";
|
726
750
|
return {
|
@@ -729,58 +753,78 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
729
753
|
}
|
730
754
|
};
|
731
755
|
}
|
732
|
-
|
756
|
+
const modelBeforeUpdate = structuredClone(model);
|
757
|
+
const existingModel = model;
|
758
|
+
const pluralType = PLURAL_MODEL_ENTITIES[entity];
|
759
|
+
const targetEntityIndex = existingModel[pluralType]?.findIndex(
|
760
|
+
(entity2) => entity2.slug === slug
|
761
|
+
);
|
762
|
+
if ((action === "alter" || action === "drop") && (typeof targetEntityIndex === "undefined" || targetEntityIndex === -1)) {
|
763
|
+
throw new RoninError({
|
764
|
+
message: `No ${entity} with slug "${slug}" defined in model "${existingModel.name}".`,
|
765
|
+
code: MODEL_ENTITY_ERROR_CODES[entity]
|
766
|
+
});
|
767
|
+
}
|
768
|
+
const existingEntity = existingModel[pluralType]?.[targetEntityIndex];
|
769
|
+
if (entity === "field") {
|
770
|
+
const statement = `ALTER TABLE "${existingModel.table}"`;
|
771
|
+
const existingField = existingEntity;
|
772
|
+
const existingLinkField = existingField?.type === "link" && existingField.kind === "many";
|
733
773
|
if (action === "create") {
|
734
774
|
const field2 = jsonValue;
|
735
775
|
field2.type = field2.type || "string";
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
776
|
+
const fieldStatement = getFieldStatement(models, existingModel, field2);
|
777
|
+
if (fieldStatement) {
|
778
|
+
dependencyStatements.push({
|
779
|
+
statement: `${statement} ADD COLUMN ${fieldStatement}`,
|
780
|
+
params: []
|
781
|
+
});
|
782
|
+
}
|
740
783
|
} else if (action === "alter") {
|
741
784
|
const newSlug = jsonValue?.slug;
|
742
|
-
if (newSlug) {
|
785
|
+
if (newSlug && !existingLinkField) {
|
743
786
|
dependencyStatements.push({
|
744
787
|
statement: `${statement} RENAME COLUMN "${slug}" TO "${newSlug}"`,
|
745
788
|
params: []
|
746
789
|
});
|
747
790
|
}
|
748
|
-
} else if (action === "drop") {
|
791
|
+
} else if (action === "drop" && !existingLinkField) {
|
749
792
|
dependencyStatements.push({
|
750
793
|
statement: `${statement} DROP COLUMN "${slug}"`,
|
751
794
|
params: []
|
752
795
|
});
|
753
796
|
}
|
754
797
|
}
|
755
|
-
|
798
|
+
const statementAction = action.toUpperCase();
|
799
|
+
if (entity === "index") {
|
756
800
|
const index = jsonValue;
|
757
801
|
const indexName = convertToSnakeCase(slug);
|
758
802
|
const params = [];
|
759
|
-
let
|
803
|
+
let statement = `${statementAction}${index?.unique ? " UNIQUE" : ""} INDEX "${indexName}"`;
|
760
804
|
if (action === "create") {
|
761
805
|
const columns = index.fields.map((field2) => {
|
762
806
|
let fieldSelector = "";
|
763
807
|
if ("slug" in field2) {
|
764
|
-
({ fieldSelector } = getFieldFromModel(
|
808
|
+
({ fieldSelector } = getFieldFromModel(existingModel, field2.slug, "to"));
|
765
809
|
} else if ("expression" in field2) {
|
766
|
-
fieldSelector = parseFieldExpression(
|
810
|
+
fieldSelector = parseFieldExpression(existingModel, "to", field2.expression);
|
767
811
|
}
|
768
812
|
if (field2.collation) fieldSelector += ` COLLATE ${field2.collation}`;
|
769
813
|
if (field2.order) fieldSelector += ` ${field2.order}`;
|
770
814
|
return fieldSelector;
|
771
815
|
});
|
772
|
-
|
816
|
+
statement += ` ON "${existingModel.table}" (${columns.join(", ")})`;
|
773
817
|
if (index.filter) {
|
774
|
-
const withStatement = handleWith(models,
|
775
|
-
|
818
|
+
const withStatement = handleWith(models, existingModel, params, index.filter);
|
819
|
+
statement += ` WHERE (${withStatement})`;
|
776
820
|
}
|
777
821
|
}
|
778
|
-
dependencyStatements.push({ statement
|
822
|
+
dependencyStatements.push({ statement, params });
|
779
823
|
}
|
780
|
-
if (entity === "trigger"
|
824
|
+
if (entity === "trigger") {
|
781
825
|
const triggerName = convertToSnakeCase(slug);
|
782
826
|
const params = [];
|
783
|
-
let
|
827
|
+
let statement = `${statementAction} TRIGGER "${triggerName}"`;
|
784
828
|
if (action === "create") {
|
785
829
|
const trigger = jsonValue;
|
786
830
|
const statementParts = [`${trigger.when} ${trigger.action}`];
|
@@ -793,11 +837,11 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
793
837
|
});
|
794
838
|
}
|
795
839
|
const fieldSelectors = trigger.fields.map((field2) => {
|
796
|
-
return getFieldFromModel(
|
840
|
+
return getFieldFromModel(existingModel, field2.slug, "to").fieldSelector;
|
797
841
|
});
|
798
842
|
statementParts.push(`OF (${fieldSelectors.join(", ")})`);
|
799
843
|
}
|
800
|
-
statementParts.push("ON", `"${
|
844
|
+
statementParts.push("ON", `"${existingModel.table}"`);
|
801
845
|
if (trigger.filter || trigger.effects.some((query2) => findInObject(query2, RONIN_MODEL_SYMBOLS.FIELD))) {
|
802
846
|
statementParts.push("FOR EACH ROW");
|
803
847
|
}
|
@@ -805,7 +849,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
805
849
|
const tableAlias = trigger.action === "DELETE" ? RONIN_MODEL_SYMBOLS.FIELD_PARENT_OLD : RONIN_MODEL_SYMBOLS.FIELD_PARENT_NEW;
|
806
850
|
const withStatement = handleWith(
|
807
851
|
models,
|
808
|
-
{ ...
|
852
|
+
{ ...existingModel, tableAlias },
|
809
853
|
params,
|
810
854
|
trigger.filter
|
811
855
|
);
|
@@ -814,34 +858,75 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
814
858
|
const effectStatements = trigger.effects.map((effectQuery) => {
|
815
859
|
return compileQueryInput(effectQuery, models, params, {
|
816
860
|
returning: false,
|
817
|
-
parentModel:
|
861
|
+
parentModel: existingModel
|
818
862
|
}).main.statement;
|
819
863
|
});
|
820
864
|
if (effectStatements.length > 1) statementParts.push("BEGIN");
|
821
865
|
statementParts.push(effectStatements.join("; "));
|
822
866
|
if (effectStatements.length > 1) statementParts.push("END");
|
823
|
-
|
867
|
+
statement += ` ${statementParts.join(" ")}`;
|
824
868
|
}
|
825
|
-
dependencyStatements.push({ statement
|
869
|
+
dependencyStatements.push({ statement, params });
|
826
870
|
}
|
827
|
-
const pluralType = PLURAL_MODEL_ENTITIES[entity];
|
828
871
|
const field = `${RONIN_MODEL_SYMBOLS.FIELD}${pluralType}`;
|
829
872
|
let json;
|
830
873
|
switch (action) {
|
831
874
|
case "create": {
|
832
875
|
const value = prepareStatementValue(statementParams, jsonValue);
|
833
876
|
json = `json_insert(${field}, '$.${slug}', ${value})`;
|
877
|
+
existingModel[pluralType] = [
|
878
|
+
...existingModel[pluralType] || [],
|
879
|
+
jsonValue
|
880
|
+
];
|
834
881
|
break;
|
835
882
|
}
|
836
883
|
case "alter": {
|
837
884
|
const value = prepareStatementValue(statementParams, jsonValue);
|
838
885
|
json = `json_set(${field}, '$.${slug}', json_patch(json_extract(${field}, '$.${slug}'), ${value}))`;
|
886
|
+
const targetEntity = existingModel[pluralType];
|
887
|
+
Object.assign(targetEntity[targetEntityIndex], jsonValue);
|
839
888
|
break;
|
840
889
|
}
|
841
890
|
case "drop": {
|
842
891
|
json = `json_remove(${field}, '$.${slug}')`;
|
892
|
+
const targetEntity = existingModel[pluralType];
|
893
|
+
targetEntity.splice(targetEntityIndex, 1);
|
843
894
|
}
|
844
895
|
}
|
896
|
+
const currentSystemModels = models.filter(({ system }) => {
|
897
|
+
return system?.model === existingModel.slug;
|
898
|
+
});
|
899
|
+
const newSystemModels = getSystemModels(models, existingModel);
|
900
|
+
const matchSystemModels = (oldSystemModel, newSystemModel) => {
|
901
|
+
const conditions = [
|
902
|
+
oldSystemModel.system?.model === newSystemModel.system?.model
|
903
|
+
];
|
904
|
+
if (oldSystemModel.system?.associationSlug) {
|
905
|
+
const oldFieldIndex = modelBeforeUpdate?.fields.findIndex((item) => {
|
906
|
+
return item.slug === newSystemModel.system?.associationSlug;
|
907
|
+
});
|
908
|
+
const newFieldIndex = existingModel.fields.findIndex((item) => {
|
909
|
+
return item.slug === oldSystemModel.system?.associationSlug;
|
910
|
+
});
|
911
|
+
conditions.push(oldFieldIndex === newFieldIndex);
|
912
|
+
}
|
913
|
+
return conditions.every((condition) => condition === true);
|
914
|
+
};
|
915
|
+
for (const systemModel of currentSystemModels) {
|
916
|
+
const exists = newSystemModels.find(matchSystemModels.bind(null, systemModel));
|
917
|
+
if (exists) {
|
918
|
+
if (exists.slug !== systemModel.slug) {
|
919
|
+
handleSystemModel(models, dependencyStatements, "alter", systemModel, exists);
|
920
|
+
}
|
921
|
+
continue;
|
922
|
+
}
|
923
|
+
handleSystemModel(models, dependencyStatements, "drop", systemModel);
|
924
|
+
}
|
925
|
+
for (const systemModel of newSystemModels) {
|
926
|
+
const exists = currentSystemModels.find(matchSystemModels.bind(null, systemModel));
|
927
|
+
if (exists) continue;
|
928
|
+
handleSystemModel(models, dependencyStatements, "create", systemModel);
|
929
|
+
}
|
845
930
|
return {
|
846
931
|
set: {
|
847
932
|
model: {
|
@@ -1212,13 +1297,19 @@ var handleTo = (models, model, statementParams, queryType, dependencyStatements,
|
|
1212
1297
|
};
|
1213
1298
|
|
1214
1299
|
// src/utils/index.ts
|
1215
|
-
var compileQueryInput = (
|
1300
|
+
var compileQueryInput = (defaultQuery, models, statementParams, options) => {
|
1301
|
+
const dependencyStatements = [];
|
1302
|
+
const query = transformMetaQuery(
|
1303
|
+
models,
|
1304
|
+
dependencyStatements,
|
1305
|
+
statementParams,
|
1306
|
+
defaultQuery
|
1307
|
+
);
|
1216
1308
|
const parsedQuery = splitQuery(query);
|
1217
1309
|
const { queryType, queryModel, queryInstructions } = parsedQuery;
|
1218
1310
|
const model = getModelBySlug(models, queryModel);
|
1219
1311
|
const single = queryModel !== model.pluralSlug;
|
1220
1312
|
let instructions = formatIdentifiers(model, queryInstructions);
|
1221
|
-
const dependencyStatements = [];
|
1222
1313
|
const returning = options?.returning ?? true;
|
1223
1314
|
if (instructions && Object.hasOwn(instructions, "for")) {
|
1224
1315
|
instructions = handleFor(model, instructions);
|
@@ -1370,7 +1461,11 @@ var Transaction = class {
|
|
1370
1461
|
* @returns The composed SQL statements.
|
1371
1462
|
*/
|
1372
1463
|
compileQueries = (queries, models, options) => {
|
1373
|
-
const modelList =
|
1464
|
+
const modelList = [
|
1465
|
+
ROOT_MODEL,
|
1466
|
+
...models.flatMap((model) => getSystemModels(models, model)),
|
1467
|
+
...models
|
1468
|
+
].map((model) => {
|
1374
1469
|
return addDefaultModelFields(model, true);
|
1375
1470
|
});
|
1376
1471
|
const modelListWithPresets = modelList.map((model) => {
|
@@ -1379,17 +1474,10 @@ var Transaction = class {
|
|
1379
1474
|
const dependencyStatements = [];
|
1380
1475
|
const mainStatements = [];
|
1381
1476
|
for (const query of queries) {
|
1382
|
-
const statementValues = options?.inlineParams ? null : [];
|
1383
|
-
const transformedQuery = transformMetaQuery(
|
1384
|
-
modelListWithPresets,
|
1385
|
-
dependencyStatements,
|
1386
|
-
statementValues,
|
1387
|
-
query
|
1388
|
-
);
|
1389
1477
|
const result = compileQueryInput(
|
1390
|
-
|
1478
|
+
query,
|
1391
1479
|
modelListWithPresets,
|
1392
|
-
|
1480
|
+
options?.inlineParams ? null : []
|
1393
1481
|
);
|
1394
1482
|
dependencyStatements.push(...result.dependencies);
|
1395
1483
|
mainStatements.push(result.main);
|