@ronin/compiler 0.3.0 → 0.4.0

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.js CHANGED
@@ -1,4 +1,4 @@
1
- // src/utils/index.ts
1
+ // src/utils/helpers.ts
2
2
  import { init as cuid } from "@paralleldrive/cuid2";
3
3
  var RONIN_SCHEMA_SYMBOLS = {
4
4
  // Represents a sub query.
@@ -33,7 +33,7 @@ var DOUBLE_QUOTE_REGEX = /"/g;
33
33
  var AMPERSAND_REGEX = /\s*&+\s*/g;
34
34
  var SPECIAL_CHARACTERS_REGEX = /[^\w\s-]+/g;
35
35
  var SPLIT_REGEX = /(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|[\s.\-_]+/;
36
- var generateRecordId = (prefix) => `${prefix || "rec"}_${cuid({ length: 16 })()}`;
36
+ var generateRecordId = (prefix) => `${prefix}_${cuid({ length: 16 })()}`;
37
37
  var capitalize = (str) => {
38
38
  if (!str || str.length === 0) return "";
39
39
  return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
@@ -96,8 +96,9 @@ var splitQuery = (query) => {
96
96
  };
97
97
 
98
98
  // src/utils/statement.ts
99
- var prepareStatementValue = (statementValues, value, bindNull = false) => {
100
- if (!bindNull && value === null) return "NULL";
99
+ var prepareStatementValue = (statementValues, value) => {
100
+ if (value === null) return "NULL";
101
+ if (!statementValues) return JSON.stringify(value);
101
102
  let formattedValue = value;
102
103
  if (Array.isArray(value) || isObject(value)) {
103
104
  formattedValue = JSON.stringify(value);
@@ -122,7 +123,7 @@ var composeFieldValues = (schemas, schema, statementValues, instructionName, val
122
123
  conditionValue = `(${compileQueryInput(
123
124
  value[RONIN_SCHEMA_SYMBOLS.QUERY],
124
125
  schemas,
125
- { statementValues }
126
+ statementValues
126
127
  ).readStatement})`;
127
128
  } else if (typeof value === "string" && value.startsWith(RONIN_SCHEMA_SYMBOLS.FIELD)) {
128
129
  let targetTable = `"${options.rootTable}"`;
@@ -139,11 +140,11 @@ var composeFieldValues = (schemas, schema, statementValues, instructionName, val
139
140
  } else if (schemaField.type === "json" && instructionName === "to") {
140
141
  conditionSelector = `"${schemaField.slug}"`;
141
142
  if (collectStatementValue) {
142
- const preparedValue = prepareStatementValue(statementValues, value, false);
143
+ const preparedValue = prepareStatementValue(statementValues, value);
143
144
  conditionValue = `IIF(${conditionSelector} IS NULL, ${preparedValue}, json_patch(${conditionSelector}, ${preparedValue}))`;
144
145
  }
145
146
  } else if (collectStatementValue) {
146
- conditionValue = prepareStatementValue(statementValues, value, false);
147
+ conditionValue = prepareStatementValue(statementValues, value);
147
148
  }
148
149
  if (options.type === "fields") return conditionSelector;
149
150
  if (options.type === "values") return conditionValue;
@@ -250,10 +251,10 @@ var formatIdentifiers = ({ identifiers }, queryInstructions) => {
250
251
  return queryInstructions;
251
252
  const newNestedInstructions = { ...nestedInstructions };
252
253
  for (const oldKey of Object.keys(newNestedInstructions)) {
253
- if (oldKey !== "titleIdentifier" && oldKey !== "slugIdentifier") continue;
254
- const identifierName = oldKey === "titleIdentifier" ? "title" : "slug";
254
+ if (oldKey !== "nameIdentifier" && oldKey !== "slugIdentifier") continue;
255
+ const identifierName = oldKey === "nameIdentifier" ? "name" : "slug";
255
256
  const value = newNestedInstructions[oldKey];
256
- const newKey = identifiers?.[identifierName] || "id";
257
+ const newKey = identifiers[identifierName];
257
258
  newNestedInstructions[newKey] = value;
258
259
  delete newNestedInstructions[oldKey];
259
260
  }
@@ -395,6 +396,10 @@ var SYSTEM_SCHEMAS = [
395
396
  pluralName: "Schemas",
396
397
  slug: "schema",
397
398
  pluralSlug: "schemas",
399
+ identifiers: {
400
+ name: "name",
401
+ slug: "slug"
402
+ },
398
403
  fields: [
399
404
  ...SYSTEM_FIELDS,
400
405
  { slug: "name", type: "string" },
@@ -403,8 +408,11 @@ var SYSTEM_SCHEMAS = [
403
408
  { slug: "pluralSlug", type: "string" },
404
409
  { slug: "idPrefix", type: "string" },
405
410
  { slug: "identifiers", type: "group" },
406
- { slug: "identifiers.title", type: "string" },
407
- { slug: "identifiers.slug", type: "string" }
411
+ { slug: "identifiers.name", type: "string" },
412
+ { slug: "identifiers.slug", type: "string" },
413
+ { slug: "fields", type: "json" },
414
+ { slug: "indexes", type: "json" },
415
+ { slug: "triggers", type: "json" }
408
416
  ]
409
417
  },
410
418
  {
@@ -412,6 +420,10 @@ var SYSTEM_SCHEMAS = [
412
420
  pluralName: "Fields",
413
421
  slug: "field",
414
422
  pluralSlug: "fields",
423
+ identifiers: {
424
+ name: "name",
425
+ slug: "slug"
426
+ },
415
427
  fields: [
416
428
  ...SYSTEM_FIELDS,
417
429
  { slug: "name", type: "string" },
@@ -440,6 +452,10 @@ var SYSTEM_SCHEMAS = [
440
452
  pluralName: "Indexes",
441
453
  slug: "index",
442
454
  pluralSlug: "indexes",
455
+ identifiers: {
456
+ name: "slug",
457
+ slug: "slug"
458
+ },
443
459
  fields: [
444
460
  ...SYSTEM_FIELDS,
445
461
  { slug: "slug", type: "string", required: true },
@@ -458,6 +474,10 @@ var SYSTEM_SCHEMAS = [
458
474
  pluralName: "Triggers",
459
475
  slug: "trigger",
460
476
  pluralSlug: "triggers",
477
+ identifiers: {
478
+ name: "slug",
479
+ slug: "slug"
480
+ },
461
481
  fields: [
462
482
  ...SYSTEM_FIELDS,
463
483
  { slug: "slug", type: "string", required: true },
@@ -478,6 +498,10 @@ var prepareSchema = (schema) => {
478
498
  if (!copiedSchema.name) copiedSchema.name = slugToName(copiedSchema.slug);
479
499
  if (!copiedSchema.pluralName)
480
500
  copiedSchema.pluralName = slugToName(copiedSchema.pluralSlug);
501
+ if (!copiedSchema.idPrefix) copiedSchema.idPrefix = copiedSchema.slug.slice(0, 3);
502
+ if (!copiedSchema.identifiers) copiedSchema.identifiers = {};
503
+ if (!copiedSchema.identifiers.name) copiedSchema.identifiers.name = "id";
504
+ if (!copiedSchema.identifiers.slug) copiedSchema.identifiers.slug = "id";
481
505
  return copiedSchema;
482
506
  };
483
507
  var addSystemSchemas = (schemas) => {
@@ -493,6 +517,10 @@ var addSystemSchemas = (schemas) => {
493
517
  list.push({
494
518
  pluralSlug: fieldSlug,
495
519
  slug: fieldSlug,
520
+ identifiers: {
521
+ name: "id",
522
+ slug: "id"
523
+ },
496
524
  fields: [
497
525
  {
498
526
  slug: "source",
@@ -574,9 +602,14 @@ var getFieldStatement = (field) => {
574
602
  return statement;
575
603
  };
576
604
  var addSchemaQueries = (schemas, statementValues, queryDetails, writeStatements) => {
577
- const { queryType, querySchema, queryInstructions } = queryDetails;
578
- if (!["create", "set", "drop"].includes(queryType)) return;
579
- if (!SYSTEM_SCHEMA_SLUGS.includes(querySchema)) return;
605
+ const {
606
+ queryType,
607
+ querySchema,
608
+ queryInstructions: queryInstructionsRaw
609
+ } = queryDetails;
610
+ const queryInstructions = queryInstructionsRaw;
611
+ if (!["create", "set", "drop"].includes(queryType)) return queryInstructions;
612
+ if (!SYSTEM_SCHEMA_SLUGS.includes(querySchema)) return queryInstructions;
580
613
  const instructionName = mappedInstructions[queryType];
581
614
  const instructionList = queryInstructions[instructionName];
582
615
  const kind = getSchemaBySlug(SYSTEM_SCHEMAS, querySchema).pluralSlug;
@@ -640,7 +673,7 @@ var addSchemaQueries = (schemas, statementValues, queryDetails, writeStatements)
640
673
  }
641
674
  }
642
675
  writeStatements.push(statement2);
643
- return;
676
+ return queryInstructions;
644
677
  }
645
678
  if (kind === "triggers") {
646
679
  const triggerName = convertToSnakeCase(slug);
@@ -666,8 +699,7 @@ var addSchemaQueries = (schemas, statementValues, queryDetails, writeStatements)
666
699
  statementParts.push("WHEN", `(${withStatement})`);
667
700
  }
668
701
  const effectStatements = effectQueries.map((effectQuery) => {
669
- return compileQueryInput(effectQuery, schemas, {
670
- statementValues,
702
+ return compileQueryInput(effectQuery, schemas, statementValues, {
671
703
  disableReturning: true
672
704
  }).readStatement;
673
705
  });
@@ -677,23 +709,27 @@ var addSchemaQueries = (schemas, statementValues, queryDetails, writeStatements)
677
709
  statement2 += ` ${statementParts.join(" ")}`;
678
710
  }
679
711
  writeStatements.push(statement2);
680
- return;
712
+ return queryInstructions;
681
713
  }
682
714
  let statement = `${tableAction} TABLE "${tableName}"`;
683
715
  if (kind === "schemas") {
684
- const fields = [...SYSTEM_FIELDS];
716
+ const providedFields = instructionList?.fields || [];
717
+ const fields = [...SYSTEM_FIELDS, ...providedFields];
718
+ if (queryType === "create" || queryType === "set") {
719
+ queryInstructions.to = prepareSchema(queryInstructions.to);
720
+ }
685
721
  if (queryType === "create") {
686
722
  const columns = fields.map(getFieldStatement).filter(Boolean);
687
723
  statement += ` (${columns.join(", ")})`;
688
724
  } else if (queryType === "set") {
689
- const newSlug = queryInstructions.to?.slug;
725
+ const newSlug = queryInstructions.to?.pluralSlug;
690
726
  if (newSlug) {
691
- const newTable = convertToSnakeCase(pluralize(newSlug));
727
+ const newTable = convertToSnakeCase(newSlug);
692
728
  statement += ` RENAME TO "${newTable}"`;
693
729
  }
694
730
  }
695
731
  writeStatements.push(statement);
696
- return;
732
+ return queryInstructions;
697
733
  }
698
734
  if (kind === "fields") {
699
735
  if (queryType === "create") {
@@ -715,6 +751,7 @@ var addSchemaQueries = (schemas, statementValues, queryDetails, writeStatements)
715
751
  }
716
752
  writeStatements.push(statement);
717
753
  }
754
+ return queryInstructions;
718
755
  };
719
756
  var slugToName = (slug) => {
720
757
  const name = slug.replace(/([a-z])([A-Z])/g, "$1 $2");
@@ -879,7 +916,7 @@ var handleIncluding = (schemas, statementValues, schema, instruction, rootTable)
879
916
  }
880
917
  },
881
918
  schemas,
882
- { statementValues }
919
+ statementValues
883
920
  );
884
921
  relatedTableSelector = `(${subSelect.readStatement})`;
885
922
  }
@@ -1006,9 +1043,7 @@ var handleTo = (schemas, schema, statementValues, queryType, writeStatements, in
1006
1043
  ...subQueryInstructions.including
1007
1044
  };
1008
1045
  }
1009
- return compileQueryInput(subQuery, schemas, {
1010
- statementValues
1011
- }).readStatement;
1046
+ return compileQueryInput(subQuery, schemas, statementValues).readStatement;
1012
1047
  }
1013
1048
  Object.assign(toInstruction, defaultFields);
1014
1049
  for (const fieldSlug in toInstruction) {
@@ -1031,7 +1066,8 @@ var handleTo = (schemas, schema, statementValues, queryType, writeStatements, in
1031
1066
  }
1032
1067
  },
1033
1068
  schemas,
1034
- { statementValues, disableReturning: true }
1069
+ statementValues,
1070
+ { disableReturning: true }
1035
1071
  );
1036
1072
  return readStatement;
1037
1073
  };
@@ -1080,8 +1116,8 @@ var handleTo = (schemas, schema, statementValues, queryType, writeStatements, in
1080
1116
  return statement;
1081
1117
  };
1082
1118
 
1083
- // src/index.ts
1084
- var compileQueryInput = (query, defaultSchemas, options) => {
1119
+ // src/utils/index.ts
1120
+ var compileQueryInput = (query, defaultSchemas, statementValues, options) => {
1085
1121
  const parsedQuery = splitQuery(query);
1086
1122
  const { queryType, querySchema, queryInstructions } = parsedQuery;
1087
1123
  const schemas = addSystemSchemas(defaultSchemas);
@@ -1089,9 +1125,13 @@ var compileQueryInput = (query, defaultSchemas, options) => {
1089
1125
  const single = querySchema !== schema.pluralSlug;
1090
1126
  let instructions = formatIdentifiers(schema, queryInstructions);
1091
1127
  let table = getTableForSchema(schema);
1092
- const statementValues = options?.statementValues || [];
1093
1128
  const writeStatements = [];
1094
- addSchemaQueries(schemas, statementValues, parsedQuery, writeStatements);
1129
+ instructions = addSchemaQueries(
1130
+ schemas,
1131
+ statementValues,
1132
+ { queryType, querySchema, queryInstructions: instructions },
1133
+ writeStatements
1134
+ );
1095
1135
  const columns = handleSelecting(schema, statementValues, {
1096
1136
  selecting: instructions?.selecting,
1097
1137
  including: instructions?.including
@@ -1231,9 +1271,15 @@ var compileQueryInput = (query, defaultSchemas, options) => {
1231
1271
  return {
1232
1272
  writeStatements,
1233
1273
  readStatement: finalStatement,
1234
- values: statementValues
1274
+ values: statementValues || []
1235
1275
  };
1236
1276
  };
1277
+
1278
+ // src/index.ts
1279
+ var compileQuery = (query, schemas, options) => {
1280
+ const statementValues = options?.inlineValues ? null : [];
1281
+ return compileQueryInput(query, schemas, statementValues);
1282
+ };
1237
1283
  export {
1238
- compileQueryInput
1284
+ compileQuery
1239
1285
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ronin/compiler",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "Compiles RONIN queries to SQL statements.",
6
6
  "publishConfig": {