@ronin/compiler 0.10.3-leo-ron-1083-experimental-217 → 0.10.3-leo-ron-1083-experimental-219
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/index.d.ts +40 -1
- package/dist/index.js +28 -26
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
@@ -6005,6 +6005,45 @@ type AmountResult = {
|
|
6005
6005
|
};
|
6006
6006
|
type Result = SingleRecordResult | MultipleRecordResult | AmountResult;
|
6007
6007
|
|
6008
|
+
/**
|
6009
|
+
* A list of placeholders that can be located inside queries after those queries were
|
6010
|
+
* serialized into JSON objects.
|
6011
|
+
*
|
6012
|
+
* These placeholders are used to represent special keys and values. For example, if a
|
6013
|
+
* query is nested into a query, the nested query will be marked with `__RONIN_QUERY`,
|
6014
|
+
* which allows for distinguishing that nested query from an object of instructions.
|
6015
|
+
*/
|
6016
|
+
declare const QUERY_SYMBOLS: {
|
6017
|
+
readonly QUERY: "__RONIN_QUERY";
|
6018
|
+
readonly EXPRESSION: "__RONIN_EXPRESSION";
|
6019
|
+
readonly FIELD: "__RONIN_FIELD_";
|
6020
|
+
readonly FIELD_PARENT: "__RONIN_FIELD_PARENT_";
|
6021
|
+
readonly FIELD_PARENT_OLD: "__RONIN_FIELD_PARENT_OLD_";
|
6022
|
+
readonly FIELD_PARENT_NEW: "__RONIN_FIELD_PARENT_NEW_";
|
6023
|
+
readonly VALUE: "__RONIN_VALUE";
|
6024
|
+
};
|
6025
|
+
type RoninErrorCode = 'MODEL_NOT_FOUND' | 'FIELD_NOT_FOUND' | 'INDEX_NOT_FOUND' | 'TRIGGER_NOT_FOUND' | 'PRESET_NOT_FOUND' | 'INVALID_WITH_VALUE' | 'INVALID_TO_VALUE' | 'INVALID_INCLUDING_VALUE' | 'INVALID_FOR_VALUE' | 'INVALID_BEFORE_OR_AFTER_INSTRUCTION' | 'INVALID_MODEL_VALUE' | 'MUTUALLY_EXCLUSIVE_INSTRUCTIONS' | 'MISSING_INSTRUCTION' | 'MISSING_FIELD';
|
6026
|
+
interface Issue {
|
6027
|
+
message: string;
|
6028
|
+
path: Array<string | number>;
|
6029
|
+
}
|
6030
|
+
interface Details {
|
6031
|
+
message: string;
|
6032
|
+
code: RoninErrorCode;
|
6033
|
+
field?: string;
|
6034
|
+
fields?: Array<string>;
|
6035
|
+
issues?: Array<Issue>;
|
6036
|
+
queries?: Array<Query> | null;
|
6037
|
+
}
|
6038
|
+
declare class RoninError extends Error {
|
6039
|
+
code: Details['code'];
|
6040
|
+
field?: Details['field'];
|
6041
|
+
fields?: Details['fields'];
|
6042
|
+
issues?: Details['issues'];
|
6043
|
+
queries?: Details['queries'];
|
6044
|
+
constructor(details: Details);
|
6045
|
+
}
|
6046
|
+
|
6008
6047
|
interface TransactionOptions {
|
6009
6048
|
/** A list of models that already exist in the database. */
|
6010
6049
|
models?: Array<PublicModel>;
|
@@ -6037,4 +6076,4 @@ declare class Transaction {
|
|
6037
6076
|
|
6038
6077
|
declare const CLEAN_ROOT_MODEL: PublicModel;
|
6039
6078
|
|
6040
|
-
export { type PublicModel as Model, type ModelField, type ModelIndex, type ModelPreset, type ModelTrigger, type Query, CLEAN_ROOT_MODEL as ROOT_MODEL, type Result, type Statement, Transaction };
|
6079
|
+
export { type PublicModel as Model, type ModelField, type ModelIndex, type ModelPreset, type ModelTrigger, QUERY_SYMBOLS, type Query, CLEAN_ROOT_MODEL as ROOT_MODEL, type Result, RoninError, type Statement, Transaction };
|
package/dist/index.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
// src/utils/helpers.ts
|
2
2
|
import { init as cuid } from "@paralleldrive/cuid2";
|
3
|
-
var
|
3
|
+
var QUERY_SYMBOLS = {
|
4
4
|
// Represents a sub query.
|
5
5
|
QUERY: "__RONIN_QUERY",
|
6
6
|
// Represents an expression that should be evaluated.
|
@@ -17,7 +17,7 @@ var RONIN_MODEL_SYMBOLS = {
|
|
17
17
|
VALUE: "__RONIN_VALUE"
|
18
18
|
};
|
19
19
|
var RONIN_MODEL_FIELD_REGEX = new RegExp(
|
20
|
-
`${
|
20
|
+
`${QUERY_SYMBOLS.FIELD}[_a-zA-Z0-9.]+`,
|
21
21
|
"g"
|
22
22
|
);
|
23
23
|
var MODEL_ENTITY_ERROR_CODES = {
|
@@ -68,16 +68,16 @@ var isObject = (value) => value != null && typeof value === "object" && Array.is
|
|
68
68
|
var getSymbol = (value) => {
|
69
69
|
if (!isObject(value)) return null;
|
70
70
|
const objectValue = value;
|
71
|
-
if (
|
71
|
+
if (QUERY_SYMBOLS.QUERY in objectValue) {
|
72
72
|
return {
|
73
73
|
type: "query",
|
74
|
-
value: objectValue[
|
74
|
+
value: objectValue[QUERY_SYMBOLS.QUERY]
|
75
75
|
};
|
76
76
|
}
|
77
|
-
if (
|
77
|
+
if (QUERY_SYMBOLS.EXPRESSION in objectValue) {
|
78
78
|
return {
|
79
79
|
type: "expression",
|
80
|
-
value: objectValue[
|
80
|
+
value: objectValue[QUERY_SYMBOLS.EXPRESSION]
|
81
81
|
};
|
82
82
|
}
|
83
83
|
return null;
|
@@ -151,15 +151,15 @@ var prepareStatementValue = (statementParams, value) => {
|
|
151
151
|
};
|
152
152
|
var parseFieldExpression = (model, instructionName, expression, parentModel) => {
|
153
153
|
return expression.replace(RONIN_MODEL_FIELD_REGEX, (match) => {
|
154
|
-
let toReplace =
|
154
|
+
let toReplace = QUERY_SYMBOLS.FIELD;
|
155
155
|
let rootModel = model;
|
156
|
-
if (match.startsWith(
|
156
|
+
if (match.startsWith(QUERY_SYMBOLS.FIELD_PARENT)) {
|
157
157
|
rootModel = parentModel;
|
158
|
-
toReplace =
|
159
|
-
if (match.startsWith(
|
160
|
-
rootModel.tableAlias = toReplace =
|
161
|
-
} else if (match.startsWith(
|
162
|
-
rootModel.tableAlias = toReplace =
|
158
|
+
toReplace = QUERY_SYMBOLS.FIELD_PARENT;
|
159
|
+
if (match.startsWith(QUERY_SYMBOLS.FIELD_PARENT_OLD)) {
|
160
|
+
rootModel.tableAlias = toReplace = QUERY_SYMBOLS.FIELD_PARENT_OLD;
|
161
|
+
} else if (match.startsWith(QUERY_SYMBOLS.FIELD_PARENT_NEW)) {
|
162
|
+
rootModel.tableAlias = toReplace = QUERY_SYMBOLS.FIELD_PARENT_NEW;
|
163
163
|
}
|
164
164
|
}
|
165
165
|
const fieldSlug = match.replace(toReplace, "");
|
@@ -238,7 +238,7 @@ var composeConditions = (models, model, statementParams, instructionName, value,
|
|
238
238
|
}
|
239
239
|
};
|
240
240
|
recordTarget = {
|
241
|
-
[
|
241
|
+
[QUERY_SYMBOLS.QUERY]: subQuery
|
242
242
|
};
|
243
243
|
}
|
244
244
|
return composeConditions(
|
@@ -348,7 +348,7 @@ var getModelBySlug = (models, slug) => {
|
|
348
348
|
};
|
349
349
|
var composeAssociationModelSlug = (model, field) => convertToCamelCase(`ronin_link_${model.slug}_${field.slug}`);
|
350
350
|
var getFieldSelector = (model, field, fieldPath, instructionName) => {
|
351
|
-
const symbol = model.tableAlias?.startsWith(
|
351
|
+
const symbol = model.tableAlias?.startsWith(QUERY_SYMBOLS.FIELD_PARENT) ? `${model.tableAlias.replace(QUERY_SYMBOLS.FIELD_PARENT, "").slice(0, -1)}.` : "";
|
352
352
|
const tablePrefix = symbol || (model.tableAlias ? `"${model.tableAlias}".` : "");
|
353
353
|
if (field.type === "json" && instructionName !== "to") {
|
354
354
|
const dotParts = fieldPath.split(".");
|
@@ -544,14 +544,14 @@ var addDefaultModelPresets = (list, model) => {
|
|
544
544
|
instructions: {
|
545
545
|
including: {
|
546
546
|
[field.slug]: {
|
547
|
-
[
|
547
|
+
[QUERY_SYMBOLS.QUERY]: {
|
548
548
|
get: {
|
549
549
|
[relatedModel.slug]: {
|
550
550
|
with: {
|
551
551
|
// Compare the `id` field of the related model to the link field on
|
552
552
|
// the root model (`field.slug`).
|
553
553
|
id: {
|
554
|
-
[
|
554
|
+
[QUERY_SYMBOLS.EXPRESSION]: `${QUERY_SYMBOLS.FIELD_PARENT}${field.slug}`
|
555
555
|
}
|
556
556
|
}
|
557
557
|
}
|
@@ -579,12 +579,12 @@ var addDefaultModelPresets = (list, model) => {
|
|
579
579
|
instructions: {
|
580
580
|
including: {
|
581
581
|
[presetSlug]: {
|
582
|
-
[
|
582
|
+
[QUERY_SYMBOLS.QUERY]: {
|
583
583
|
get: {
|
584
584
|
[pluralSlug]: {
|
585
585
|
with: {
|
586
586
|
[childField.slug]: {
|
587
|
-
[
|
587
|
+
[QUERY_SYMBOLS.EXPRESSION]: `${QUERY_SYMBOLS.FIELD_PARENT}id`
|
588
588
|
}
|
589
589
|
}
|
590
590
|
}
|
@@ -851,11 +851,11 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
851
851
|
statementParts.push(`OF (${fieldSelectors.join(", ")})`);
|
852
852
|
}
|
853
853
|
statementParts.push("ON", `"${existingModel.table}"`);
|
854
|
-
if (trigger.filter || trigger.effects.some((query2) => findInObject(query2,
|
854
|
+
if (trigger.filter || trigger.effects.some((query2) => findInObject(query2, QUERY_SYMBOLS.FIELD))) {
|
855
855
|
statementParts.push("FOR EACH ROW");
|
856
856
|
}
|
857
857
|
if (trigger.filter) {
|
858
|
-
const tableAlias = trigger.action === "DELETE" ?
|
858
|
+
const tableAlias = trigger.action === "DELETE" ? QUERY_SYMBOLS.FIELD_PARENT_OLD : QUERY_SYMBOLS.FIELD_PARENT_NEW;
|
859
859
|
const withStatement = handleWith(
|
860
860
|
models,
|
861
861
|
{ ...existingModel, tableAlias },
|
@@ -877,7 +877,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
877
877
|
}
|
878
878
|
dependencyStatements.push({ statement, params });
|
879
879
|
}
|
880
|
-
const field = `${
|
880
|
+
const field = `${QUERY_SYMBOLS.FIELD}${pluralType}`;
|
881
881
|
let json;
|
882
882
|
switch (action) {
|
883
883
|
case "create": {
|
@@ -941,7 +941,7 @@ var transformMetaQuery = (models, dependencyStatements, statementParams, query)
|
|
941
941
|
model: {
|
942
942
|
with: { slug: modelSlug },
|
943
943
|
to: {
|
944
|
-
[pluralType]: { [
|
944
|
+
[pluralType]: { [QUERY_SYMBOLS.EXPRESSION]: json }
|
945
945
|
}
|
946
946
|
}
|
947
947
|
}
|
@@ -1060,8 +1060,8 @@ var handleFor = (model, instructions) => {
|
|
1060
1060
|
if (arg !== null) {
|
1061
1061
|
findInObject(
|
1062
1062
|
replacedForFilter,
|
1063
|
-
|
1064
|
-
(match) => match.replace(
|
1063
|
+
QUERY_SYMBOLS.VALUE,
|
1064
|
+
(match) => match.replace(QUERY_SYMBOLS.VALUE, arg)
|
1065
1065
|
);
|
1066
1066
|
}
|
1067
1067
|
for (const subInstruction in replacedForFilter) {
|
@@ -1207,7 +1207,7 @@ var handleSelecting = (models, model, statementParams, instructions, options) =>
|
|
1207
1207
|
const value2 = parseFieldExpression(
|
1208
1208
|
{ ...queryModel, tableAlias: tableName },
|
1209
1209
|
"including",
|
1210
|
-
`${
|
1210
|
+
`${QUERY_SYMBOLS.FIELD}${field.slug}`
|
1211
1211
|
);
|
1212
1212
|
return {
|
1213
1213
|
key: `${tableName}.${field.slug}`,
|
@@ -1607,6 +1607,8 @@ var Transaction = class {
|
|
1607
1607
|
};
|
1608
1608
|
var CLEAN_ROOT_MODEL = omit(ROOT_MODEL, ["system"]);
|
1609
1609
|
export {
|
1610
|
+
QUERY_SYMBOLS,
|
1610
1611
|
CLEAN_ROOT_MODEL as ROOT_MODEL,
|
1612
|
+
RoninError,
|
1611
1613
|
Transaction
|
1612
1614
|
};
|
package/package.json
CHANGED