sql-typechecker 0.0.52 → 0.0.54

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/out/cli.js CHANGED
@@ -241354,7 +241354,14 @@ var builtinoperatorsFromSchema = [
241354
241354
  var builtinoperators = builtinoperatorsFromSyntax.concat(builtinoperatorsFromSchema);
241355
241355
 
241356
241356
  // src/builtinunaryoperators.ts
241357
- var builtinunaryoperatorsFromSyntax = [];
241357
+ var builtinunaryoperatorsFromSyntax = [
241358
+ {
241359
+ name: {name: "NOT"},
241360
+ operand: {kind: "scalar", name: {name: "boolean"}},
241361
+ result: {kind: "scalar", name: {name: "boolean"}},
241362
+ description: ""
241363
+ }
241364
+ ];
241358
241365
  var builtinunaryoperatorsFromSchema = [
241359
241366
  {
241360
241367
  name: {name: "!"},
@@ -241983,6 +241990,16 @@ function checkType(g, l, name) {
241983
241990
  }
241984
241991
  };
241985
241992
  }
241993
+ const foundEnum = g.enums.find((d) => d.name.name === name);
241994
+ if (foundEnum) {
241995
+ return {
241996
+ kind: "scalar",
241997
+ name: {_location: l, name},
241998
+ isEnum: {
241999
+ values: foundEnum.values
242000
+ }
242001
+ };
242002
+ }
241986
242003
  const builtintype = Object.keys(BuiltinTypes).concat(["bytea"]).find((b) => b.toLowerCase() === name);
241987
242004
  if (builtintype) {
241988
242005
  return {
@@ -242839,6 +242856,12 @@ function elabBinaryOp(g, c, e) {
242839
242856
  right: {kind: "scalar", name: d.name},
242840
242857
  result: {kind: "scalar", name: {name: "boolean"}},
242841
242858
  description: "equal"
242859
+ }))).concat(g.enums.map((d) => ({
242860
+ name: {schema: "pg_catalog", name: "="},
242861
+ left: {kind: "scalar", name: d.name},
242862
+ right: {kind: "scalar", name: d.name},
242863
+ result: {kind: "scalar", name: {name: "boolean"}},
242864
+ description: "equal"
242842
242865
  }))).filter(function(op) {
242843
242866
  return eqQNames({
242844
242867
  name: normalizeOperatorName(e.op),
@@ -243235,7 +243258,7 @@ function elabExpr(g, c, e) {
243235
243258
  function inferNullability(c, e) {
243236
243259
  if (e.type === "unary") {
243237
243260
  if (e.op === "NOT") {
243238
- return inferNullability(c, e).map((judg) => ({
243261
+ return inferNullability(c, e.operand).map((judg) => ({
243239
243262
  ...judg,
243240
243263
  isNull: !judg.isNull
243241
243264
  }));
@@ -243290,6 +243313,14 @@ function parseSetupScripts(g, ast) {
243290
243313
  realtype: mkType(acc, a.dataType, [{type: "not null"}])
243291
243314
  })
243292
243315
  };
243316
+ } else if (a.type === "create enum") {
243317
+ return {
243318
+ ...acc,
243319
+ enums: acc.enums.concat({
243320
+ name: a.name,
243321
+ values: a.values.map((v) => v.value)
243322
+ })
243323
+ };
243293
243324
  } else {
243294
243325
  return acc;
243295
243326
  }
@@ -243349,7 +243380,9 @@ function showTypeAsTypescriptType(t) {
243349
243380
  } else if (t.kind === "nullable") {
243350
243381
  return showTypeAsTypescriptType(t.typevar) + " | null";
243351
243382
  } else if (t.kind === "scalar") {
243352
- if ([
243383
+ if (t.domain) {
243384
+ return `types.${t.name.name}`;
243385
+ } else if ([
243353
243386
  "numeric",
243354
243387
  "bigint",
243355
243388
  "smallint",
@@ -243371,6 +243404,8 @@ function showTypeAsTypescriptType(t) {
243371
243404
  return "LocalTime";
243372
243405
  } else if (t.name.name === "timestamp without time zone" || t.name.name === "timestamp") {
243373
243406
  return "LocalDateTime";
243407
+ } else if (t.isEnum) {
243408
+ return "types." + t.name.name;
243374
243409
  } else {
243375
243410
  return t.name.name;
243376
243411
  }
@@ -243385,7 +243420,7 @@ function showTypeAsTypescriptType(t) {
243385
243420
  }
243386
243421
  function genDeserializeSimpleT(t, literalVar) {
243387
243422
  if (t.kind === "array") {
243388
- return `parseArray(${literalVar}, (el: any) => ${genDeserializeSimpleT(t.typevar, "el")})`;
243423
+ return `${literalVar} === null ? [] : (Array.isArray(${literalVar}) ? ${literalVar} : parseArray(${literalVar})).map((el: any) => ${genDeserializeSimpleT(t.typevar, "el")})`;
243389
243424
  } else if (t.kind === "nullable") {
243390
243425
  const inner = genDeserializeSimpleT(t.typevar, literalVar);
243391
243426
  if (inner === literalVar) {
@@ -243399,7 +243434,7 @@ function genDeserializeSimpleT(t, literalVar) {
243399
243434
  return "({" + t.record.fields.map((f) => `${f.name?.name || "?"}: ${genDeserializeSimpleT(f.type, literalVar + '["' + f.name?.name + '"]')}`).join(",\n") + "})";
243400
243435
  } else if (t.kind === "scalar") {
243401
243436
  if (t.domain) {
243402
- return `${genDeserializeSimpleT(t.domain.realtype, literalVar)} as ${t.name.name}`;
243437
+ return `${genDeserializeSimpleT(t.domain.realtype, literalVar)} as types.${t.name.name}`;
243403
243438
  }
243404
243439
  if (t.name.name === "date") {
243405
243440
  return `LocalDate.parse(${literalVar})`;
@@ -243479,6 +243514,11 @@ export async function ${f.name.name}(pool: Pool, args: ${argsType})
243479
243514
  function genDomain(dom) {
243480
243515
  return `export type ${dom.name.name} = ${showTypeAsTypescriptType(dom.realtype)} & { readonly __tag: "${dom.name.name}" };`;
243481
243516
  }
243517
+ function genEnum(enu) {
243518
+ return `export type ${enu.name.name} =
243519
+ | ${enu.values.map((v) => `"${v}"`).join("\n | ")};
243520
+ `;
243521
+ }
243482
243522
  function getImports() {
243483
243523
  return `
243484
243524
  import type { Pool } from "pg";
@@ -243621,7 +243661,7 @@ async function go() {
243621
243661
  throw new Error("Please provide at least one SQL file with flags -f/--file or -d/--dir");
243622
243662
  }
243623
243663
  const allStatements = [];
243624
- let g = {tables: [], views: [], domains: []};
243664
+ let g = {tables: [], views: [], domains: [], enums: []};
243625
243665
  for (let sqlFile of allSqlFiles) {
243626
243666
  const fileContents = await fs.readFile(sqlFile, "utf-8");
243627
243667
  const statements = import_trader_pgsql_ast_parser2.parse(fileContents, {
@@ -243631,6 +243671,7 @@ async function go() {
243631
243671
  try {
243632
243672
  g = parseSetupScripts(g, statements);
243633
243673
  } catch (err) {
243674
+ console.error("Error in setup script");
243634
243675
  console.error("---------------------------------------------");
243635
243676
  if (err instanceof ErrorWithLocation && err.l !== void 0) {
243636
243677
  const found = findCode(fileContents, err.l);
@@ -243645,20 +243686,24 @@ async function go() {
243645
243686
  console.error(err instanceof Error ? err.message : JSON.stringify(err));
243646
243687
  console.error("---------------------------------------------");
243647
243688
  console.error("");
243689
+ process.exit(1);
243648
243690
  }
243649
243691
  }
243650
243692
  const outDir = path.resolve(process.cwd(), outArg);
243651
243693
  await fs.mkdir(outDir, {recursive: true});
243652
- const domainFile = path.format({
243694
+ const typesFile = path.format({
243653
243695
  dir: outDir,
243654
- name: "domains",
243696
+ name: "types",
243655
243697
  ext: ".ts"
243656
243698
  });
243657
- await prepOutFile(domainFile);
243699
+ await prepOutFile(typesFile);
243658
243700
  for (let dom of g.domains) {
243659
- await fs.appendFile(domainFile, genDomain(dom) + "\n", "utf-8");
243701
+ await fs.appendFile(typesFile, genDomain(dom) + "\n", "utf-8");
243702
+ }
243703
+ for (let enu of g.enums) {
243704
+ await fs.appendFile(typesFile, genEnum(enu) + "\n", "utf-8");
243660
243705
  }
243661
- await fs.appendFile(domainFile, `
243706
+ await fs.appendFile(typesFile, `
243662
243707
  `, "utf-8");
243663
243708
  const tablesIndexFile = path.format({
243664
243709
  dir: outDir,
@@ -243675,7 +243720,7 @@ async function go() {
243675
243720
  });
243676
243721
  await prepOutFile(tableOutFile);
243677
243722
  const text = genCrudOperations(table);
243678
- await fs.appendFile(tableOutFile, mkImportDomainsStatement(g.domains, tableOutFile, domainFile), "utf8");
243723
+ await fs.appendFile(tableOutFile, mkImportDomainsStatement(g.domains, tableOutFile, typesFile), "utf8");
243679
243724
  await fs.appendFile(tableOutFile, prettier.format(text, {parser: "typescript"}), "utf-8");
243680
243725
  await fs.appendFile(tablesIndexFile, `export * as ${table.name.name} from "./tables/${table.name.name}";
243681
243726
  `);
@@ -243689,7 +243734,7 @@ async function go() {
243689
243734
  ext: ".ts"
243690
243735
  });
243691
243736
  const functionsOutFile = await prepOutFile(outFileName);
243692
- await fs.appendFile(outFileName, mkImportDomainsStatement(g.domains, outFileName, domainFile), "utf8");
243737
+ await fs.appendFile(outFileName, mkImportDomainsStatement(g.domains, outFileName, typesFile), "utf8");
243693
243738
  for (let st of createFunctionStatements) {
243694
243739
  try {
243695
243740
  const res = doCreateFunction(g, {decls: [], froms: []}, st);
@@ -243774,11 +243819,10 @@ function mkImportDomainsStatement(domains, thisFile, domainFile) {
243774
243819
  const p = path.relative(path.dirname(thisFile), path.dirname(domainFile));
243775
243820
  const formatted = path.format({
243776
243821
  dir: p || ".",
243777
- name: "domains",
243822
+ name: "types",
243778
243823
  ext: ""
243779
243824
  });
243780
- const doms = domains.map((d) => d.name.name).join(", ");
243781
- return `import {${doms}} from "${formatted}";
243825
+ return `import * as types from "${formatted}";
243782
243826
 
243783
243827
  `;
243784
243828
  }