purplekit 1.0.4 → 1.0.6

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.
Files changed (76) hide show
  1. package/README.md +46 -6
  2. package/build/src/app.js +48 -12
  3. package/build/src/app.js.map +1 -1
  4. package/build/src/config/constants.d.ts +2 -1
  5. package/build/src/config/constants.d.ts.map +1 -1
  6. package/build/src/config/constants.js +3 -1
  7. package/build/src/config/constants.js.map +1 -1
  8. package/build/src/config/index.d.ts +7 -1
  9. package/build/src/config/index.d.ts.map +1 -1
  10. package/build/src/config/index.js +30 -1
  11. package/build/src/config/index.js.map +1 -1
  12. package/build/src/features/createdb.d.ts +1 -1
  13. package/build/src/features/createdb.d.ts.map +1 -1
  14. package/build/src/features/createdb.js +6 -7
  15. package/build/src/features/createdb.js.map +1 -1
  16. package/build/src/features/dropdb.d.ts +1 -1
  17. package/build/src/features/dropdb.d.ts.map +1 -1
  18. package/build/src/features/dropdb.js +6 -7
  19. package/build/src/features/dropdb.js.map +1 -1
  20. package/build/src/features/gen.d.ts +5 -5
  21. package/build/src/features/gen.d.ts.map +1 -1
  22. package/build/src/features/gen.js +17 -15
  23. package/build/src/features/gen.js.map +1 -1
  24. package/build/src/features/init.d.ts +1 -1
  25. package/build/src/features/init.d.ts.map +1 -1
  26. package/build/src/features/init.js +18 -9
  27. package/build/src/features/init.js.map +1 -1
  28. package/build/src/features/migrate.d.ts +3 -2
  29. package/build/src/features/migrate.d.ts.map +1 -1
  30. package/build/src/features/migrate.js +28 -39
  31. package/build/src/features/migrate.js.map +1 -1
  32. package/build/src/features/migration.d.ts +3 -1
  33. package/build/src/features/migration.d.ts.map +1 -1
  34. package/build/src/features/migration.js +13 -8
  35. package/build/src/features/migration.js.map +1 -1
  36. package/build/src/features/seed.d.ts +1 -1
  37. package/build/src/features/seed.d.ts.map +1 -1
  38. package/build/src/features/seed.js +5 -8
  39. package/build/src/features/seed.js.map +1 -1
  40. package/build/src/features/status.d.ts +1 -1
  41. package/build/src/features/status.d.ts.map +1 -1
  42. package/build/src/features/status.js +11 -19
  43. package/build/src/features/status.js.map +1 -1
  44. package/build/src/index.d.ts +1 -1
  45. package/build/src/index.d.ts.map +1 -1
  46. package/build/src/index.js.map +1 -1
  47. package/build/src/libs/compare-mig.d.ts +2 -2
  48. package/build/src/libs/compare-mig.d.ts.map +1 -1
  49. package/build/src/libs/compare-mig.js +12 -11
  50. package/build/src/libs/compare-mig.js.map +1 -1
  51. package/build/src/libs/create-ds.d.ts +19 -1
  52. package/build/src/libs/create-ds.d.ts.map +1 -1
  53. package/build/src/libs/create-ds.js +35 -8
  54. package/build/src/libs/create-ds.js.map +1 -1
  55. package/build/src/libs/format-error.d.ts +12 -0
  56. package/build/src/libs/format-error.d.ts.map +1 -0
  57. package/build/src/libs/format-error.js +56 -0
  58. package/build/src/libs/format-error.js.map +1 -0
  59. package/build/src/libs/get-commands.d.ts +9 -9
  60. package/build/src/libs/get-commands.d.ts.map +1 -1
  61. package/build/src/libs/get-commands.js +10 -35
  62. package/build/src/libs/get-commands.js.map +1 -1
  63. package/build/src/libs/print.d.ts +1 -1
  64. package/build/src/libs/print.js +2 -2
  65. package/build/src/libs/print.js.map +1 -1
  66. package/build/src/libs/sanitize.d.ts +8 -4
  67. package/build/src/libs/sanitize.d.ts.map +1 -1
  68. package/build/src/libs/sanitize.js +19 -9
  69. package/build/src/libs/sanitize.js.map +1 -1
  70. package/build/src/libs/version.d.ts +10 -0
  71. package/build/src/libs/version.d.ts.map +1 -0
  72. package/build/src/libs/version.js +64 -0
  73. package/build/src/libs/version.js.map +1 -0
  74. package/build/src/types.d.ts +12 -2
  75. package/build/src/types.d.ts.map +1 -1
  76. package/package.json +7 -5
@@ -5,11 +5,11 @@ export type MigrationDuplicate = {
5
5
  migHash: string;
6
6
  hashes: string[];
7
7
  };
8
- type SqlDialect = 'postgresql' | 'mysql' | 'mariadb' | 'sqlite' | 'transactsql';
8
+ type SqlDialect = 'postgresql' | 'mysql';
9
9
  /**
10
10
  * Maps a TypeORM driver type to a `node-sql-parser` dialect name.
11
11
  *
12
- * @param type - TypeORM data source type (e.g. `postgres`, `mysql`).
12
+ * @param type - TypeORM data source type (`postgres`, `mysql` or `mariadb`).
13
13
  * @returns SQL parser dialect; defaults to `postgresql` when unknown.
14
14
  */
15
15
  declare function getParserDialect(type: string): SqlDialect;
@@ -1 +1 @@
1
- {"version":3,"file":"compare-mig.d.ts","sourceRoot":"","sources":["../../../src/libs/compare-mig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKnD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAGF,KAAK,UAAU,GACZ,YAAY,GACX,OAAO,GACP,SAAS,GACT,QAAQ,GACR,aAAa,CAAC;AA4BlB;;;;;GAKG;AACH,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAelD;AA2GD;;;;;;;;GAQG;AACH,iBAAe,UAAU,CACvB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAiBpC;AAED,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"compare-mig.d.ts","sourceRoot":"","sources":["../../../src/libs/compare-mig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKnD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAGF,KAAK,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;AA4BzC;;;;;GAKG;AACH,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAUlD;AAiHD;;;;;;;;GAQG;AACH,iBAAe,UAAU,CACvB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,aAAa,EAAE,EACzB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAiBpC;AAED,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC"}
@@ -79,7 +79,7 @@ function getMethodBody(content, method) {
79
79
  /**
80
80
  * Maps a TypeORM driver type to a `node-sql-parser` dialect name.
81
81
  *
82
- * @param type - TypeORM data source type (e.g. `postgres`, `mysql`).
82
+ * @param type - TypeORM data source type (`postgres`, `mysql` or `mariadb`).
83
83
  * @returns SQL parser dialect; defaults to `postgresql` when unknown.
84
84
  */
85
85
  function getParserDialect(type) {
@@ -89,11 +89,6 @@ function getParserDialect(type) {
89
89
  case 'mysql':
90
90
  case 'mariadb':
91
91
  return 'mysql';
92
- case 'sqlite':
93
- case 'better-sqlite3':
94
- return 'sqlite';
95
- case 'mssql':
96
- return 'transactsql';
97
92
  default:
98
93
  return 'postgresql';
99
94
  }
@@ -120,11 +115,18 @@ function sortObjectKeys(value) {
120
115
  }
121
116
  /**
122
117
  * Parses SQL into an AST and returns a canonical JSON representation.
118
+ * Falls back to a whitespace-normalized copy of the raw SQL when the parser
119
+ * can't handle a construct (e.g. a schema-qualified custom type such as
120
+ * `"public"."foo_enum"` in a column-type position, which `node-sql-parser`
121
+ * doesn't support even though it's valid Postgres DDL that TypeORM emits for
122
+ * every enum column). This keeps duplicate-detection working instead of
123
+ * failing the whole migration on constructs the parser doesn't cover; it
124
+ * only loses AST-level insensitivity to formatting/ordering for the specific
125
+ * statements that fail to parse.
123
126
  *
124
127
  * @param sql - Raw SQL string from a migration query.
125
128
  * @param dialect - Parser dialect for the target database.
126
- * @returns Normalized AST as a JSON string.
127
- * @throws When the SQL cannot be parsed.
129
+ * @returns Normalized AST as a JSON string, or a normalized SQL string when parsing fails.
128
130
  */
129
131
  function normalizeSqlAst(sql, dialect) {
130
132
  try {
@@ -133,9 +135,8 @@ function normalizeSqlAst(sql, dialect) {
133
135
  const normalized = sortObjectKeys(ast);
134
136
  return JSON.stringify(normalized);
135
137
  }
136
- catch (e) {
137
- const msg = e instanceof Error ? e.message : JSON.stringify(e);
138
- throw new Error(`Error parsing sql: ${msg}`);
138
+ catch (_a) {
139
+ return sql.replace(/\s+/g, ' ').trim();
139
140
  }
140
141
  }
141
142
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"compare-mig.js","sourceRoot":"","sources":["../../../src/libs/compare-mig.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8MS,gCAAU;AAAE,4CAAgB;AA7MrC,qDAAyC;AACzC,8DAAiC;AACjC,4CAA8B;AAiB9B;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,OAAe,EAAE,MAAqB;IAC3D,kBAAkB;IAClB,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,0DAA0D,MAAM,yCAAyC,CAAC,CAAC;IACtI,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,IAAI,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;QAC7B,IAAI,IAAI,KAAK,GAAG;YAAE,KAAK,IAAI,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU;YACb,OAAO,YAAY,CAAC;QACtB,KAAK,OAAO,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC;QACjB,KAAK,QAAQ,CAAC;QACd,KAAK,gBAAgB;YACnB,OAAO,QAAQ,CAAC;QAClB,KAAK,OAAO;YACV,OAAO,aAAa,CAAC;QACvB;YACE,OAAO,YAAY,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC;aACjD,IAAI,EAAE;aACN,MAAM,CACL,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACP,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,CAAE,KAAiC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,OAAO,CAAC,CAAC;QACX,CAAC,EACD,EAA6B,CAC9B,CAAC;IACN,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,GAAW,EAAE,OAAmB;IACvD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,wBAAM,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,sBAAsB,GAAG,EAAE,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,OAAe;IACpC,kBAAkB;IAClB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,4DAA4D,CAAC,CAAC;IACvF,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,GAAG;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,OAAe,EAAE,OAAmB;IAC/D,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;;;;GAKG;AACH,SAAS,IAAI,CAAC,KAAa;IACzB,OAAO,qBAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CACtB,OAAe,EACf,OAAmB;IAEnB,MAAM,GAAG,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAEpD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;GAQG;AACH,SAAe,UAAU,CACvB,OAAe,EACf,QAAyB,EACzB,OAAmB;;QAEnB,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAElD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,eAAe,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACpE,MAAM,YAAY,GAAG,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;YAE/D,IAAI,YAAY,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC;gBAC7C,uBACE,IAAI,EAAE,CAAC,CAAC,IAAI,EACZ,IAAI,EAAE,CAAC,CAAC,IAAI,IACT,YAAY,EACf;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CAAA"}
1
+ {"version":3,"file":"compare-mig.js","sourceRoot":"","sources":["../../../src/libs/compare-mig.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,22 @@
1
1
  import { DataSourceOptions, DataSource } from 'typeorm';
2
+ /**
3
+ * Builds the TLS options for SSL connections.
4
+ * - `light`: encrypts the connection.
5
+ * - `heavy`: also supplies `DATABASE_CA_CERT` as the trusted CA.
6
+ *
7
+ * In both modes `rejectUnauthorized` comes from `SSL_REJECT_UNAUTHORIZED` and
8
+ * defaults to `false` (the previous behaviour). Set it to `true` to have the
9
+ * driver reject servers whose certificate does not verify.
10
+ *
11
+ * @returns TLS options passed to the database driver.
12
+ */
13
+ declare const getSslOptions: () => {
14
+ rejectUnauthorized: boolean;
15
+ ca: NonSharedBuffer;
16
+ } | {
17
+ rejectUnauthorized: boolean;
18
+ ca?: never;
19
+ };
2
20
  /**
3
21
  * Builds a TypeORM `DataSource` from app config, with optional overrides.
4
22
  *
@@ -6,5 +24,5 @@ import { DataSourceOptions, DataSource } from 'typeorm';
6
24
  * @returns A configured, uninitialized TypeORM data source.
7
25
  */
8
26
  declare const createDataSource: (opt?: Partial<DataSourceOptions>) => DataSource;
9
- export { createDataSource };
27
+ export { createDataSource, getSslOptions };
10
28
  //# sourceMappingURL=create-ds.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-ds.d.ts","sourceRoot":"","sources":["../../../src/libs/create-ds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAIxD;;;;;GAKG;AACH,QAAA,MAAM,gBAAgB,GAAI,MAAK,OAAO,CAAC,iBAAiB,CAAM,eAyB7D,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"create-ds.d.ts","sourceRoot":"","sources":["../../../src/libs/create-ds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAoBxD;;;;;;;;;;GAUG;AACH,QAAA,MAAM,aAAa;;;;;;CAMlB,CAAC;AAEF;;;;;GAKG;AACH,QAAA,MAAM,gBAAgB,GAAI,MAAK,OAAO,CAAC,iBAAiB,CAAM,eAgB7D,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC"}
@@ -33,10 +33,43 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.createDataSource = void 0;
36
+ exports.getSslOptions = exports.createDataSource = void 0;
37
37
  const typeorm_1 = require("typeorm");
38
38
  const config_1 = require("../config");
39
39
  const fs = __importStar(require("fs"));
40
+ /**
41
+ * Reads the CA certificate used for `SSL_TYPE: 'heavy'`, with a clear message
42
+ * when the configured path is missing or points at a directory.
43
+ *
44
+ * @param file - Path from `DATABASE_CA_CERT`.
45
+ * @returns The certificate contents.
46
+ */
47
+ const readCaCert = (file) => {
48
+ if (!fs.existsSync(file) || !fs.statSync(file).isFile()) {
49
+ throw new Error(`SSL_TYPE is 'heavy' but DATABASE_CA_CERT ('${file}') is not a certificate file. Set DATABASE_CA_CERT to the path of your CA certificate.`);
50
+ }
51
+ return fs.readFileSync(file);
52
+ };
53
+ /**
54
+ * Builds the TLS options for SSL connections.
55
+ * - `light`: encrypts the connection.
56
+ * - `heavy`: also supplies `DATABASE_CA_CERT` as the trusted CA.
57
+ *
58
+ * In both modes `rejectUnauthorized` comes from `SSL_REJECT_UNAUTHORIZED` and
59
+ * defaults to `false` (the previous behaviour). Set it to `true` to have the
60
+ * driver reject servers whose certificate does not verify.
61
+ *
62
+ * @returns TLS options passed to the database driver.
63
+ */
64
+ const getSslOptions = () => {
65
+ var _a;
66
+ const rejectUnauthorized = (_a = config_1.cfg.SSL_REJECT_UNAUTHORIZED) !== null && _a !== void 0 ? _a : false;
67
+ if (config_1.cfg.SSL_TYPE === 'heavy') {
68
+ return { rejectUnauthorized, ca: readCaCert(config_1.cfg.DATABASE_CA_CERT) };
69
+ }
70
+ return { rejectUnauthorized };
71
+ };
72
+ exports.getSslOptions = getSslOptions;
40
73
  /**
41
74
  * Builds a TypeORM `DataSource` from app config, with optional overrides.
42
75
  *
@@ -44,13 +77,7 @@ const fs = __importStar(require("fs"));
44
77
  * @returns A configured, uninitialized TypeORM data source.
45
78
  */
46
79
  const createDataSource = (opt = {}) => {
47
- return new typeorm_1.DataSource(Object.assign({ username: config_1.cfg.DATABASE_USERNAME, password: config_1.cfg.DATABASE_PASSWORD, host: config_1.cfg.DATABASE_HOST, port: config_1.cfg.DATABASE_PORT, type: config_1.cfg.TYPE, database: config_1.cfg.INITIAL_DATABASE, entities: config_1.cfg.ENTITIES, migrations: config_1.cfg.MIGRATIONS, ssl: config_1.cfg.SSL_MODE, extra: config_1.cfg.SSL_MODE
48
- ? {
49
- ssl: Object.assign({ rejectUnauthorized: false }, (config_1.cfg.SSL_TYPE === 'heavy'
50
- ? { ca: fs.readFileSync(config_1.cfg.DATABASE_CA_CERT) }
51
- : {})),
52
- }
53
- : undefined, synchronize: config_1.cfg.SYNCHRONIZE, logging: config_1.cfg.LOGGING }, opt));
80
+ return new typeorm_1.DataSource(Object.assign({ username: config_1.cfg.DATABASE_USERNAME, password: config_1.cfg.DATABASE_PASSWORD, host: config_1.cfg.DATABASE_HOST, port: config_1.cfg.DATABASE_PORT, type: config_1.cfg.TYPE, database: config_1.cfg.INITIAL_DATABASE, entities: config_1.cfg.ENTITIES, migrations: config_1.cfg.MIGRATIONS, ssl: config_1.cfg.SSL_MODE, extra: config_1.cfg.SSL_MODE ? { ssl: getSslOptions() } : undefined, synchronize: config_1.cfg.SYNCHRONIZE, logging: config_1.cfg.LOGGING }, opt));
54
81
  };
55
82
  exports.createDataSource = createDataSource;
56
83
  //# sourceMappingURL=create-ds.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-ds.js","sourceRoot":"","sources":["../../../src/libs/create-ds.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAwD;AACxD,qCAA+B;AAC/B,uCAAyB;AAEzB;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG,CAAC,MAAkC,EAAE,EAAE,EAAE;IAChE,OAAO,IAAI,oBAAU,iBACnB,QAAQ,EAAE,YAAG,CAAC,iBAAiB,EAC/B,QAAQ,EAAE,YAAG,CAAC,iBAAiB,EAC/B,IAAI,EAAE,YAAG,CAAC,aAAa,EACvB,IAAI,EAAE,YAAG,CAAC,aAAa,EACvB,IAAI,EAAE,YAAG,CAAC,IAAW,EACrB,QAAQ,EAAE,YAAG,CAAC,gBAAgB,EAC9B,QAAQ,EAAE,YAAG,CAAC,QAAQ,EACtB,UAAU,EAAE,YAAG,CAAC,UAAU,EAC1B,GAAG,EAAE,YAAG,CAAC,QAAQ,EACjB,KAAK,EAAE,YAAG,CAAC,QAAQ;YACjB,CAAC,CAAC;gBACE,GAAG,kBACD,kBAAkB,EAAE,KAAK,IACtB,CAAC,YAAG,CAAC,QAAQ,KAAK,OAAO;oBAC1B,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,YAAY,CAAC,YAAG,CAAC,gBAAgB,CAAC,EAAE;oBAC/C,CAAC,CAAC,EAAE,CAAC,CACR;aACF;YACH,CAAC,CAAC,SAAS,EACb,WAAW,EAAE,YAAG,CAAC,WAAW,EAC5B,OAAO,EAAE,YAAG,CAAC,OAAO,IAChB,GAAW,EACf,CAAC;AACL,CAAC,CAAC;AAEO,4CAAgB"}
1
+ {"version":3,"file":"create-ds.js","sourceRoot":"","sources":["../../../src/libs/create-ds.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAAwD;AACxD,qCAA+B;AAC/B,uCAAyB;AAEzB;;;;;;GAMG;AACH,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;IAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CACb,8CAA8C,IAAI,wFAAwF,CAC3I,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC/B,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,aAAa,GAAG,GAAG,EAAE;;IACzB,MAAM,kBAAkB,GAAG,MAAA,YAAG,CAAC,uBAAuB,mCAAI,KAAK,CAAC;IAChE,IAAI,YAAG,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC7B,OAAO,EAAE,kBAAkB,EAAE,EAAE,EAAE,UAAU,CAAC,YAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;IACtE,CAAC;IACD,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAChC,CAAC,CAAC;AA0ByB,sCAAa;AAxBxC;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG,CAAC,MAAkC,EAAE,EAAE,EAAE;IAChE,OAAO,IAAI,oBAAU,iBACnB,QAAQ,EAAE,YAAG,CAAC,iBAAiB,EAC/B,QAAQ,EAAE,YAAG,CAAC,iBAAiB,EAC/B,IAAI,EAAE,YAAG,CAAC,aAAa,EACvB,IAAI,EAAE,YAAG,CAAC,aAAa,EACvB,IAAI,EAAE,YAAG,CAAC,IAAW,EACrB,QAAQ,EAAE,YAAG,CAAC,gBAAgB,EAC9B,QAAQ,EAAE,YAAG,CAAC,QAAQ,EACtB,UAAU,EAAE,YAAG,CAAC,UAAU,EAC1B,GAAG,EAAE,YAAG,CAAC,QAAQ,EACjB,KAAK,EAAE,YAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAC1D,WAAW,EAAE,YAAG,CAAC,WAAW,EAC5B,OAAO,EAAE,YAAG,CAAC,OAAO,IAChB,GAAW,EACf,CAAC;AACL,CAAC,CAAC;AAEO,4CAAgB"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Turns any thrown value into a non-empty, human-readable message.
3
+ * Handles errors with empty messages (e.g. Node's `AggregateError` raised when
4
+ * every address for `localhost` refuses the connection), error codes, causes,
5
+ * and non-`Error` values that cannot be JSON-serialized.
6
+ *
7
+ * @param e - The thrown value.
8
+ * @returns A message that is never empty.
9
+ */
10
+ declare function formatError(e: unknown): string;
11
+ export { formatError };
12
+ //# sourceMappingURL=format-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-error.d.ts","sourceRoot":"","sources":["../../../src/libs/format-error.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,iBAAS,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAEvC;AAqCD,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatError = formatError;
4
+ const HINTS = {
5
+ ECONNREFUSED: 'is the database server running and reachable?',
6
+ ENOTFOUND: 'check DATABASE_HOST in your purplekit config.',
7
+ ETIMEDOUT: 'the database did not respond in time.',
8
+ };
9
+ /**
10
+ * Turns any thrown value into a non-empty, human-readable message.
11
+ * Handles errors with empty messages (e.g. Node's `AggregateError` raised when
12
+ * every address for `localhost` refuses the connection), error codes, causes,
13
+ * and non-`Error` values that cannot be JSON-serialized.
14
+ *
15
+ * @param e - The thrown value.
16
+ * @returns A message that is never empty.
17
+ */
18
+ function formatError(e) {
19
+ return describe(e, 0) || 'An unknown error occurred.';
20
+ }
21
+ function describe(e, depth) {
22
+ if (depth > 3 || e === null || e === undefined)
23
+ return '';
24
+ if (typeof e === 'string')
25
+ return e.trim();
26
+ if (e instanceof Error) {
27
+ const code = e.code;
28
+ let msg = e.message.trim();
29
+ // AggregateError (and similar) keep the useful details in `errors`
30
+ const nested = e.errors;
31
+ if (Array.isArray(nested) && nested.length > 0) {
32
+ const inner = Array.from(new Set(nested.map((n) => describe(n, depth + 1)).filter(Boolean))).join('; ');
33
+ if (inner)
34
+ msg = msg ? `${msg} (${inner})` : inner;
35
+ }
36
+ if (!msg)
37
+ msg = describe(e.cause, depth + 1);
38
+ if (!msg && code)
39
+ msg = code;
40
+ if (!msg)
41
+ msg = e.name && e.name !== 'Error' ? e.name : '';
42
+ const hint = depth === 0 && typeof code === 'string' ? HINTS[code] : '';
43
+ return hint && msg ? `${msg} — ${hint}` : msg;
44
+ }
45
+ try {
46
+ const json = JSON.stringify(e);
47
+ if (json && json !== '{}')
48
+ return json;
49
+ }
50
+ catch (_a) {
51
+ // circular or otherwise unserializable; fall through
52
+ }
53
+ const str = String(e);
54
+ return str === '[object Object]' ? '' : str;
55
+ }
56
+ //# sourceMappingURL=format-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-error.js","sourceRoot":"","sources":["../../../src/libs/format-error.ts"],"names":[],"mappings":";;AAsDS,kCAAW;AAtDpB,MAAM,KAAK,GAA2B;IACpC,YAAY,EAAE,+CAA+C;IAC7D,SAAS,EAAE,+CAA+C;IAC1D,SAAS,EAAE,uCAAuC;CACnD,CAAC;AAEF;;;;;;;;GAQG;AACH,SAAS,WAAW,CAAC,CAAU;IAC7B,OAAO,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,4BAA4B,CAAC;AACxD,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU,EAAE,KAAa;IACzC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAC1D,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAE3C,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;QACvB,MAAM,IAAI,GAAI,CAA2B,CAAC,IAAI,CAAC;QAC/C,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAE3B,mEAAmE;QACnE,MAAM,MAAM,GAAI,CAA0B,CAAC,MAAM,CAAC;QAClD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CACtB,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CACnE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACb,IAAI,KAAK;gBAAE,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,GAAG;YAAE,GAAG,GAAG,QAAQ,CAAE,CAAyB,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,GAAG,IAAI,IAAI;YAAE,GAAG,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,GAAG;YAAE,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAE3D,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,OAAO,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAChD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;IACzC,CAAC;IAAC,WAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACtB,OAAO,GAAG,KAAK,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC9C,CAAC"}
@@ -1,29 +1,29 @@
1
- import { DataSourceOptions } from 'typeorm';
2
- type Params = DataSourceOptions['type'];
1
+ import { SupportedType } from '../types';
3
2
  /**
4
3
  * Returns the SQL used to list user/base tables for the given DB type.
5
4
  *
6
5
  * @param type - Database driver type; defaults to `cfg.TYPE`.
7
6
  * @returns Parameter-free SQL query string.
7
+ * @throws When the type is unsupported.
8
8
  */
9
- declare const getDbTablesCommand: (type?: Params) => "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE'" | "SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE'" | "SELECT name FROM sqlite_master WHERE type = 'table'" | "SELECT table_name FROM user_tables" | "SELECT TABLE_NAME AS table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'";
9
+ declare const getDbTablesCommand: (type?: SupportedType) => "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public' AND table_type = 'BASE TABLE'" | "SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE'";
10
10
  /**
11
11
  * Returns the parameterized SQL used to check whether a database exists.
12
12
  *
13
13
  * @param type - Database driver type; defaults to `cfg.TYPE`.
14
14
  * @returns Parameterized SQL query string.
15
- * @throws When the type is unsupported (e.g. SQLite uses filesystem checks).
15
+ * @throws When the type is unsupported.
16
16
  */
17
- declare const getDbCheckCommand: (type?: Params) => "SELECT 1 FROM pg_database WHERE DATNAME = $1" | "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?" | "SELECT name FROM sys.databases WHERE name = @0" | "SELECT username FROM all_users WHERE username = :1";
17
+ declare const getDbCheckCommand: (type?: SupportedType) => "SELECT 1 FROM pg_database WHERE DATNAME = $1" | "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?";
18
18
  /**
19
19
  * Returns the SQL used to drop a database for the given DB type.
20
20
  *
21
21
  * @param name - Database name to drop.
22
22
  * @param type - Database driver type; defaults to `cfg.TYPE`.
23
- * @returns Parameterized or literal SQL query string.
23
+ * @returns Literal SQL query string.
24
24
  * @throws When the type is unsupported.
25
25
  */
26
- declare const getDropDbCommand: (name: string, type?: Params) => string;
26
+ declare const getDropDbCommand: (name: string, type?: SupportedType) => string;
27
27
  /**
28
28
  * Returns the SQL used to create a database for the given DB type.
29
29
  *
@@ -32,7 +32,7 @@ declare const getDropDbCommand: (name: string, type?: Params) => string;
32
32
  * @returns Literal SQL query string for creating the database.
33
33
  * @throws When the type is unsupported.
34
34
  */
35
- declare const getCreateDbCommand: (name: string, type?: Params) => string;
35
+ declare const getCreateDbCommand: (name: string, type?: SupportedType) => string;
36
36
  /**
37
37
  * Returns the parameterized SQL used to check if a migration has been applied.
38
38
  *
@@ -40,6 +40,6 @@ declare const getCreateDbCommand: (name: string, type?: Params) => string;
40
40
  * @returns Parameterized SQL query string for TypeORM's `migrations` table.
41
41
  * @throws When the type is unsupported.
42
42
  */
43
- declare const getCheckMigrationCommand: (type?: Params) => "SELECT 1 FROM migrations WHERE name = $1 LIMIT 1" | "SELECT 1 FROM migrations WHERE name = ? LIMIT 1" | "SELECT TOP 1 1 FROM migrations WHERE name = @0";
43
+ declare const getCheckMigrationCommand: (type?: SupportedType) => "SELECT 1 FROM migrations WHERE name = $1 LIMIT 1" | "SELECT 1 FROM migrations WHERE name = ? LIMIT 1";
44
44
  export { getDbTablesCommand, getDbCheckCommand, getDropDbCommand, getCreateDbCommand, getCheckMigrationCommand, };
45
45
  //# sourceMappingURL=get-commands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-commands.d.ts","sourceRoot":"","sources":["../../../src/libs/get-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAG5C,KAAK,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAExC;;;;;GAKG;AACH,QAAA,MAAM,kBAAkB,GAAI,OAAM,MAAiB,waAsBlD,CAAC;AAEF;;;;;;GAMG;AACH,QAAA,MAAM,iBAAiB,GAAI,OAAM,MAAiB,2OAwBjD,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,gBAAgB,GAAI,MAAM,MAAM,EAAE,OAAM,MAAiB,WAwB9D,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,OAAM,MAAiB,WAqBhE,CAAC;AAEF;;;;;;GAMG;AACH,QAAA,MAAM,wBAAwB,GAAI,OAAM,MAAiB,8JAcxD,CAAC;AAEF,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,GACzB,CAAC"}
1
+ {"version":3,"file":"get-commands.d.ts","sourceRoot":"","sources":["../../../src/libs/get-commands.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAOxC;;;;;;GAMG;AACH,QAAA,MAAM,kBAAkB,GAAI,OAAM,aAAwB,sOAYzD,CAAC;AAEF;;;;;;GAMG;AACH,QAAA,MAAM,iBAAiB,GAAI,OAAM,aAAwB,iIAYxD,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,gBAAgB,GAAI,MAAM,MAAM,EAAE,OAAM,aAAwB,WAYrE,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,OAAM,aAAwB,WAYvE,CAAC;AAEF;;;;;;GAMG;AACH,QAAA,MAAM,wBAAwB,GAAI,OAAM,aAAwB,2GAY/D,CAAC;AAEF,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,GACzB,CAAC"}
@@ -2,11 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getCheckMigrationCommand = exports.getCreateDbCommand = exports.getDropDbCommand = exports.getDbCheckCommand = exports.getDbTablesCommand = void 0;
4
4
  const config_1 = require("../config");
5
+ const unsupported = (type) => new Error(`Unsupported database type: '${type}'. Supported types: postgres, mysql, mariadb.`);
5
6
  /**
6
7
  * Returns the SQL used to list user/base tables for the given DB type.
7
8
  *
8
9
  * @param type - Database driver type; defaults to `cfg.TYPE`.
9
10
  * @returns Parameter-free SQL query string.
11
+ * @throws When the type is unsupported.
10
12
  */
11
13
  const getDbTablesCommand = (type = config_1.cfg.TYPE) => {
12
14
  switch (type) {
@@ -15,15 +17,8 @@ const getDbTablesCommand = (type = config_1.cfg.TYPE) => {
15
17
  case 'mysql':
16
18
  case 'mariadb':
17
19
  return `SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_type = 'BASE TABLE'`;
18
- case 'sqlite':
19
- case 'better-sqlite3':
20
- return `SELECT name FROM sqlite_master WHERE type = 'table'`;
21
- case 'oracle':
22
- return `SELECT table_name FROM user_tables`;
23
- case 'mssql':
24
- return `SELECT TABLE_NAME AS table_name FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'`;
25
20
  default:
26
- throw new Error('Unsupported database type');
21
+ throw unsupported(type);
27
22
  }
28
23
  };
29
24
  exports.getDbTablesCommand = getDbTablesCommand;
@@ -32,7 +27,7 @@ exports.getDbTablesCommand = getDbTablesCommand;
32
27
  *
33
28
  * @param type - Database driver type; defaults to `cfg.TYPE`.
34
29
  * @returns Parameterized SQL query string.
35
- * @throws When the type is unsupported (e.g. SQLite uses filesystem checks).
30
+ * @throws When the type is unsupported.
36
31
  */
37
32
  const getDbCheckCommand = (type = config_1.cfg.TYPE) => {
38
33
  switch (type) {
@@ -41,15 +36,8 @@ const getDbCheckCommand = (type = config_1.cfg.TYPE) => {
41
36
  case 'mysql':
42
37
  case 'mariadb':
43
38
  return 'SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ?';
44
- case 'mssql':
45
- return `SELECT name FROM sys.databases WHERE name = @0`;
46
- case 'oracle':
47
- return `SELECT username FROM all_users WHERE username = :1`;
48
- case 'sqlite':
49
- case 'better-sqlite3':
50
- throw new Error('SQLite database existence should be checked via filesystem');
51
39
  default:
52
- throw new Error('Unsupported database type');
40
+ throw unsupported(type);
53
41
  }
54
42
  };
55
43
  exports.getDbCheckCommand = getDbCheckCommand;
@@ -58,7 +46,7 @@ exports.getDbCheckCommand = getDbCheckCommand;
58
46
  *
59
47
  * @param name - Database name to drop.
60
48
  * @param type - Database driver type; defaults to `cfg.TYPE`.
61
- * @returns Parameterized or literal SQL query string.
49
+ * @returns Literal SQL query string.
62
50
  * @throws When the type is unsupported.
63
51
  */
64
52
  const getDropDbCommand = (name, type = config_1.cfg.TYPE) => {
@@ -68,15 +56,8 @@ const getDropDbCommand = (name, type = config_1.cfg.TYPE) => {
68
56
  return `DROP DATABASE IF EXISTS \`${name}\``;
69
57
  case 'postgres':
70
58
  return `DROP DATABASE IF EXISTS "${name}"`;
71
- case 'mssql':
72
- return `DROP DATABASE [${name}]`;
73
- case 'oracle':
74
- return `DROP USER "${name}" CASCADE`;
75
- case 'better-sqlite3':
76
- case 'sqlite':
77
- throw new Error('SQLite databases should be dropped by deleting the file');
78
59
  default:
79
- throw new Error('Unsupported database type');
60
+ throw unsupported(type);
80
61
  }
81
62
  };
82
63
  exports.getDropDbCommand = getDropDbCommand;
@@ -95,13 +76,8 @@ const getCreateDbCommand = (name, type = config_1.cfg.TYPE) => {
95
76
  case 'mysql':
96
77
  case 'mariadb':
97
78
  return `CREATE DATABASE \`${name}\``;
98
- case 'mssql':
99
- return `CREATE DATABASE [${name}]`;
100
- case 'sqlite':
101
- case 'better-sqlite3':
102
- throw new Error('SQLite databases are created by opening/creating the file');
103
79
  default:
104
- throw new Error('Unsupported database type');
80
+ throw unsupported(type);
105
81
  }
106
82
  };
107
83
  exports.getCreateDbCommand = getCreateDbCommand;
@@ -117,11 +93,10 @@ const getCheckMigrationCommand = (type = config_1.cfg.TYPE) => {
117
93
  case 'postgres':
118
94
  return `SELECT 1 FROM migrations WHERE name = $1 LIMIT 1`;
119
95
  case 'mysql':
96
+ case 'mariadb':
120
97
  return `SELECT 1 FROM migrations WHERE name = ? LIMIT 1`;
121
- case 'mssql':
122
- return `SELECT TOP 1 1 FROM migrations WHERE name = @0`;
123
98
  default:
124
- throw new Error('Unsupported database type');
99
+ throw unsupported(type);
125
100
  }
126
101
  };
127
102
  exports.getCheckMigrationCommand = getCheckMigrationCommand;
@@ -1 +1 @@
1
- {"version":3,"file":"get-commands.js","sourceRoot":"","sources":["../../../src/libs/get-commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-commands.js","sourceRoot":"","sources":["../../../src/libs/get-commands.ts"],"names":[],"mappings":";;;AAAA,qCAA+B;AAG/B,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CACnC,IAAI,KAAK,CACP,+BAA+B,IAAI,+CAA+C,CACnF,CAAC;AAEJ;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG,CAAC,OAAsB,YAAG,CAAC,IAAI,EAAE,EAAE;IAC5D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU;YACb,OAAO,8GAA8G,CAAC;QAExH,KAAK,OAAO,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,gHAAgH,CAAC;QAE1H;YACE,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC;AAyFA,gDAAkB;AAvFpB;;;;;;GAMG;AACH,MAAM,iBAAiB,GAAG,CAAC,OAAsB,YAAG,CAAC,IAAI,EAAE,EAAE;IAC3D,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU;YACb,OAAO,8CAA8C,CAAC;QAExD,KAAK,OAAO,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,2EAA2E,CAAC;QAErF;YACE,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC;AAqEA,8CAAiB;AAnEnB;;;;;;;GAOG;AACH,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,OAAsB,YAAG,CAAC,IAAI,EAAE,EAAE;IACxE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,SAAS,CAAC;QACf,KAAK,OAAO;YACV,OAAO,6BAA6B,IAAI,IAAI,CAAC;QAE/C,KAAK,UAAU;YACb,OAAO,4BAA4B,IAAI,GAAG,CAAC;QAE7C;YACE,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC;AAgDA,4CAAgB;AA9ClB;;;;;;;GAOG;AACH,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,OAAsB,YAAG,CAAC,IAAI,EAAE,EAAE;IAC1E,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU;YACb,OAAO,oBAAoB,IAAI,GAAG,CAAC;QAErC,KAAK,OAAO,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,qBAAqB,IAAI,IAAI,CAAC;QAEvC;YACE,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC;AA2BA,gDAAkB;AAzBpB;;;;;;GAMG;AACH,MAAM,wBAAwB,GAAG,CAAC,OAAsB,YAAG,CAAC,IAAI,EAAE,EAAE;IAClE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU;YACb,OAAO,kDAAkD,CAAC;QAE5D,KAAK,OAAO,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,iDAAiD,CAAC;QAE3D;YACE,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC,CAAC;AAOA,4DAAwB"}
@@ -1,5 +1,5 @@
1
1
  /** Logs a cyan info message to stdout. */
2
2
  export declare const print: (...args: string[]) => void;
3
- /** Logs a red error message to stdout. */
3
+ /** Logs a red error message to stderr. */
4
4
  export declare const printf: (...args: string[]) => void;
5
5
  //# sourceMappingURL=print.d.ts.map
@@ -10,9 +10,9 @@ const print = (...args) => {
10
10
  return console.log(picocolors_1.default.cyanBright(args.join(' ')));
11
11
  };
12
12
  exports.print = print;
13
- /** Logs a red error message to stdout. */
13
+ /** Logs a red error message to stderr. */
14
14
  const printf = (...args) => {
15
- return console.log(picocolors_1.default.redBright(args.join(' ')));
15
+ return console.error(picocolors_1.default.redBright(args.join(' ')));
16
16
  };
17
17
  exports.printf = printf;
18
18
  //# sourceMappingURL=print.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"print.js","sourceRoot":"","sources":["../../../src/libs/print.ts"],"names":[],"mappings":";;;;;;AAAA,4DAA4B;AAE5B,0CAA0C;AACnC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAc,EAAE,EAAE;IACzC,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAFW,QAAA,KAAK,SAEhB;AAEF,0CAA0C;AACnC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAc,EAAE,EAAE;IAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC;AAFW,QAAA,MAAM,UAEjB"}
1
+ {"version":3,"file":"print.js","sourceRoot":"","sources":["../../../src/libs/print.ts"],"names":[],"mappings":";;;;;;AAAA,4DAA4B;AAE5B,0CAA0C;AACnC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAc,EAAE,EAAE;IACzC,OAAO,OAAO,CAAC,GAAG,CAAC,oBAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAFW,QAAA,KAAK,SAEhB;AAEF,0CAA0C;AACnC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAc,EAAE,EAAE;IAC1C,OAAO,OAAO,CAAC,KAAK,CAAC,oBAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC,CAAC;AAFW,QAAA,MAAM,UAEjB"}
@@ -1,10 +1,14 @@
1
1
  /**
2
- * Validates that `value` contains only letters, numbers, and underscores.
2
+ * Validates that `value` is a string that starts with a letter and contains
3
+ * only letters, numbers, and underscores. This keeps database names safe to
4
+ * interpolate into SQL and migration names valid as TypeScript class names.
3
5
  *
4
- * @param value - String to validate.
6
+ * @param value - Value to validate.
7
+ * @param label - What the value is (e.g. `database name`), used in the error message.
5
8
  * @returns The original value when valid.
6
- * @throws When the value contains disallowed characters.
9
+ * @throws When the value is not a string, is empty, starts with a non-letter,
10
+ * or contains disallowed characters.
7
11
  */
8
- declare const sanitize: (value: string) => string;
12
+ declare const sanitize: (value: unknown, label?: string) => string;
9
13
  export { sanitize };
10
14
  //# sourceMappingURL=sanitize.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/libs/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,QAAA,MAAM,QAAQ,GAAI,OAAO,MAAM,KAAG,MAKjC,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/libs/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,QAAA,MAAM,QAAQ,GAAI,OAAO,OAAO,EAAE,QAAO,MAAgB,KAAG,MAgB3D,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -2,18 +2,28 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.sanitize = void 0;
4
4
  /**
5
- * Validates that `value` contains only letters, numbers, and underscores.
5
+ * Validates that `value` is a string that starts with a letter and contains
6
+ * only letters, numbers, and underscores. This keeps database names safe to
7
+ * interpolate into SQL and migration names valid as TypeScript class names.
6
8
  *
7
- * @param value - String to validate.
9
+ * @param value - Value to validate.
10
+ * @param label - What the value is (e.g. `database name`), used in the error message.
8
11
  * @returns The original value when valid.
9
- * @throws When the value contains disallowed characters.
12
+ * @throws When the value is not a string, is empty, starts with a non-letter,
13
+ * or contains disallowed characters.
10
14
  */
11
- const sanitize = (value) => {
12
- const regex = new RegExp('^[A-Za-z0-9_]+$');
13
- const check = regex.test(value);
14
- if (check)
15
- return value;
16
- throw new Error('Only numbers, letters and underscores allowed');
15
+ const sanitize = (value, label = 'value') => {
16
+ if (typeof value !== 'string') {
17
+ const got = value === null ? 'null' : typeof value;
18
+ throw new Error(`Invalid ${label}: expected a string, received ${got}.`);
19
+ }
20
+ if (!/^[A-Za-z]/.test(value)) {
21
+ throw new Error(`Invalid ${label} '${value}'. It must start with a letter.`);
22
+ }
23
+ if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(value)) {
24
+ throw new Error(`Invalid ${label} '${value}'. Only numbers, letters and underscores allowed.`);
25
+ }
26
+ return value;
17
27
  };
18
28
  exports.sanitize = sanitize;
19
29
  //# sourceMappingURL=sanitize.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../../src/libs/sanitize.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACH,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAU,EAAE;IACzC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;AACnE,CAAC,CAAC;AAEO,4BAAQ"}
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../../../src/libs/sanitize.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;GAUG;AACH,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAE,QAAgB,OAAO,EAAU,EAAE;IACnE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,iCAAiC,GAAG,GAAG,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,WAAW,KAAK,KAAK,KAAK,iCAAiC,CAC5D,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,WAAW,KAAK,KAAK,KAAK,mDAAmD,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEO,4BAAQ"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Reads the purplekit version from its own `package.json`.
3
+ * Walks up from this file so it works from both `src/` (dev via tsx) and
4
+ * `build/src/` (published package).
5
+ *
6
+ * @returns The package version, or `'unknown'` if it cannot be found.
7
+ */
8
+ declare function getVersion(): string;
9
+ export { getVersion };
10
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/libs/version.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,iBAAS,UAAU,IAAI,MAAM,CAkB5B;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}