rake-db 2.0.8 → 2.0.9

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
@@ -190,149 +190,6 @@ const quoteTable = (table) => {
190
190
  }
191
191
  };
192
192
 
193
- const execute = async (options, sql) => {
194
- const db = new pqb.Adapter(options);
195
- try {
196
- await db.query(sql);
197
- return "ok";
198
- } catch (error) {
199
- const err = error;
200
- if (err.code === "42P04" || err.code === "3D000") {
201
- return "already";
202
- } else if (err.code === "42501") {
203
- return "forbidden";
204
- } else {
205
- return { error };
206
- }
207
- } finally {
208
- await db.destroy();
209
- }
210
- };
211
- const createOrDrop = async (options, adminOptions, config, args) => {
212
- const params = getDatabaseAndUserFromOptions(options);
213
- const result = await execute(
214
- setAdapterOptions(adminOptions, { database: "postgres" }),
215
- args.sql(params)
216
- );
217
- if (result === "ok") {
218
- console.log(args.successMessage(params));
219
- } else if (result === "already") {
220
- console.log(args.alreadyMessage(params));
221
- } else if (result === "forbidden") {
222
- await createOrDrop(
223
- options,
224
- await setAdminCredentialsToOptions(options),
225
- config,
226
- args
227
- );
228
- return;
229
- } else {
230
- throw result.error;
231
- }
232
- if (!args.createVersionsTable)
233
- return;
234
- const db = new pqb.Adapter(options);
235
- await createSchemaMigrations(db, config);
236
- await db.destroy();
237
- };
238
- const createDb = async (arg, config) => {
239
- for (const options of pqb.toArray(arg)) {
240
- await createOrDrop(options, options, config, {
241
- sql({ database, user }) {
242
- return `CREATE DATABASE "${database}" OWNER "${user}"`;
243
- },
244
- successMessage({ database }) {
245
- return `Database ${database} successfully created`;
246
- },
247
- alreadyMessage({ database }) {
248
- return `Database ${database} already exists`;
249
- },
250
- createVersionsTable: true
251
- });
252
- }
253
- };
254
- const dropDb = async (arg) => {
255
- for (const options of pqb.toArray(arg)) {
256
- await createOrDrop(options, options, migrationConfigDefaults, {
257
- sql({ database }) {
258
- return `DROP DATABASE "${database}"`;
259
- },
260
- successMessage({ database }) {
261
- return `Database ${database} was successfully dropped`;
262
- },
263
- alreadyMessage({ database }) {
264
- return `Database ${database} does not exist`;
265
- }
266
- });
267
- }
268
- };
269
-
270
- const generate = async (config, args) => {
271
- const name = args[0];
272
- if (!name)
273
- throw new Error("Migration name is missing");
274
- await promises.mkdir(config.migrationsPath, { recursive: true });
275
- const filePath = path__default["default"].resolve(
276
- config.migrationsPath,
277
- `${makeFileTimeStamp()}_${name}.ts`
278
- );
279
- await promises.writeFile(filePath, makeContent(name, args.slice(1)));
280
- console.log(`Created ${filePath}`);
281
- };
282
- const makeFileTimeStamp = () => {
283
- const now = new Date();
284
- return [
285
- now.getUTCFullYear(),
286
- now.getUTCMonth() + 1,
287
- now.getUTCDate(),
288
- now.getUTCHours(),
289
- now.getUTCMinutes(),
290
- now.getUTCSeconds()
291
- ].map((value) => value < 10 ? `0${value}` : value).join("");
292
- };
293
- const makeContent = (name, args) => {
294
- let content = `import { change } from 'rake-db';
295
-
296
- change(async (db) => {`;
297
- const [first, rest] = getFirstWordAndRest(name);
298
- if (rest) {
299
- if (first === "create" || first === "drop") {
300
- content += `
301
- await db.${first === "create" ? "createTable" : "dropTable"}('${rest}', (t) => ({`;
302
- content += makeColumnsContent(args);
303
- content += "\n }));";
304
- } else if (first === "change") {
305
- content += `
306
- await db.changeTable('${rest}', (t) => ({`;
307
- content += "\n }));";
308
- } else if (first === "add" || first === "remove") {
309
- const table = first === "add" ? getTextAfterTo(rest) : getTextAfterFrom(rest);
310
- content += `
311
- await db.changeTable(${table ? `'${table}'` : "tableName"}, (t) => ({`;
312
- content += makeColumnsContent(args, first);
313
- content += "\n }));";
314
- }
315
- }
316
- return content + "\n});\n";
317
- };
318
- const makeColumnsContent = (args, method) => {
319
- let content = "";
320
- const prepend = method ? `t.${method}(` : "";
321
- const append = method ? ")" : "";
322
- for (const arg of args) {
323
- const [name, def] = arg.split(":");
324
- if (!def) {
325
- throw new Error(
326
- `Column argument should be similar to name:type, name:type.method1.method2, name:type(arg).method(arg). Example: name:varchar(20).nullable. Received: ${arg}`
327
- );
328
- }
329
- const methods = def.split(".").map((method2) => method2.endsWith(")") ? `.${method2}` : `.${method2}()`);
330
- content += `
331
- ${name}: ${prepend}t${methods.join("")}${append},`;
332
- }
333
- return content;
334
- };
335
-
336
193
  let currentMigration;
337
194
  let currentPromise;
338
195
  let currentUp = true;
@@ -1149,8 +1006,156 @@ const getMigratedVersionsMap = async (db, config) => {
1149
1006
  throw err;
1150
1007
  }
1151
1008
  };
1152
- const migrate = (options, config, args) => migrateOrRollback(options, config, args, true);
1153
- const rollback = (options, config, args) => migrateOrRollback(options, config, args, false);
1009
+ const migrate = (options, config, args = []) => migrateOrRollback(options, config, args, true);
1010
+ const rollback = (options, config, args = []) => migrateOrRollback(options, config, args, false);
1011
+
1012
+ const execute = async (options, sql) => {
1013
+ const db = new pqb.Adapter(options);
1014
+ try {
1015
+ await db.query(sql);
1016
+ return "ok";
1017
+ } catch (error) {
1018
+ const err = error;
1019
+ if (err.code === "42P04" || err.code === "3D000") {
1020
+ return "already";
1021
+ } else if (err.code === "42501") {
1022
+ return "forbidden";
1023
+ } else {
1024
+ return { error };
1025
+ }
1026
+ } finally {
1027
+ await db.destroy();
1028
+ }
1029
+ };
1030
+ const createOrDrop = async (options, adminOptions, config, args) => {
1031
+ const params = getDatabaseAndUserFromOptions(options);
1032
+ const result = await execute(
1033
+ setAdapterOptions(adminOptions, { database: "postgres" }),
1034
+ args.sql(params)
1035
+ );
1036
+ if (result === "ok") {
1037
+ console.log(args.successMessage(params));
1038
+ } else if (result === "already") {
1039
+ console.log(args.alreadyMessage(params));
1040
+ } else if (result === "forbidden") {
1041
+ await createOrDrop(
1042
+ options,
1043
+ await setAdminCredentialsToOptions(options),
1044
+ config,
1045
+ args
1046
+ );
1047
+ return;
1048
+ } else {
1049
+ throw result.error;
1050
+ }
1051
+ if (!args.createVersionsTable)
1052
+ return;
1053
+ const db = new pqb.Adapter(options);
1054
+ await createSchemaMigrations(db, config);
1055
+ await db.destroy();
1056
+ };
1057
+ const createDb = async (arg, config) => {
1058
+ for (const options of pqb.toArray(arg)) {
1059
+ await createOrDrop(options, options, config, {
1060
+ sql({ database, user }) {
1061
+ return `CREATE DATABASE "${database}" OWNER "${user}"`;
1062
+ },
1063
+ successMessage({ database }) {
1064
+ return `Database ${database} successfully created`;
1065
+ },
1066
+ alreadyMessage({ database }) {
1067
+ return `Database ${database} already exists`;
1068
+ },
1069
+ createVersionsTable: true
1070
+ });
1071
+ }
1072
+ };
1073
+ const dropDb = async (arg) => {
1074
+ for (const options of pqb.toArray(arg)) {
1075
+ await createOrDrop(options, options, migrationConfigDefaults, {
1076
+ sql({ database }) {
1077
+ return `DROP DATABASE "${database}"`;
1078
+ },
1079
+ successMessage({ database }) {
1080
+ return `Database ${database} was successfully dropped`;
1081
+ },
1082
+ alreadyMessage({ database }) {
1083
+ return `Database ${database} does not exist`;
1084
+ }
1085
+ });
1086
+ }
1087
+ };
1088
+ const resetDb = async (arg, config) => {
1089
+ await dropDb(arg);
1090
+ await createDb(arg, config);
1091
+ await migrate(arg, config);
1092
+ };
1093
+
1094
+ const generate = async (config, args) => {
1095
+ const name = args[0];
1096
+ if (!name)
1097
+ throw new Error("Migration name is missing");
1098
+ await promises.mkdir(config.migrationsPath, { recursive: true });
1099
+ const filePath = path__default["default"].resolve(
1100
+ config.migrationsPath,
1101
+ `${makeFileTimeStamp()}_${name}.ts`
1102
+ );
1103
+ await promises.writeFile(filePath, makeContent(name, args.slice(1)));
1104
+ console.log(`Created ${filePath}`);
1105
+ };
1106
+ const makeFileTimeStamp = () => {
1107
+ const now = new Date();
1108
+ return [
1109
+ now.getUTCFullYear(),
1110
+ now.getUTCMonth() + 1,
1111
+ now.getUTCDate(),
1112
+ now.getUTCHours(),
1113
+ now.getUTCMinutes(),
1114
+ now.getUTCSeconds()
1115
+ ].map((value) => value < 10 ? `0${value}` : value).join("");
1116
+ };
1117
+ const makeContent = (name, args) => {
1118
+ let content = `import { change } from 'rake-db';
1119
+
1120
+ change(async (db) => {`;
1121
+ const [first, rest] = getFirstWordAndRest(name);
1122
+ if (rest) {
1123
+ if (first === "create" || first === "drop") {
1124
+ content += `
1125
+ await db.${first === "create" ? "createTable" : "dropTable"}('${rest}', (t) => ({`;
1126
+ content += makeColumnsContent(args);
1127
+ content += "\n }));";
1128
+ } else if (first === "change") {
1129
+ content += `
1130
+ await db.changeTable('${rest}', (t) => ({`;
1131
+ content += "\n }));";
1132
+ } else if (first === "add" || first === "remove") {
1133
+ const table = first === "add" ? getTextAfterTo(rest) : getTextAfterFrom(rest);
1134
+ content += `
1135
+ await db.changeTable(${table ? `'${table}'` : "tableName"}, (t) => ({`;
1136
+ content += makeColumnsContent(args, first);
1137
+ content += "\n }));";
1138
+ }
1139
+ }
1140
+ return content + "\n});\n";
1141
+ };
1142
+ const makeColumnsContent = (args, method) => {
1143
+ let content = "";
1144
+ const prepend = method ? `t.${method}(` : "";
1145
+ const append = method ? ")" : "";
1146
+ for (const arg of args) {
1147
+ const [name, def] = arg.split(":");
1148
+ if (!def) {
1149
+ throw new Error(
1150
+ `Column argument should be similar to name:type, name:type.method1.method2, name:type(arg).method(arg). Example: name:varchar(20).nullable. Received: ${arg}`
1151
+ );
1152
+ }
1153
+ const methods = def.split(".").map((method2) => method2.endsWith(")") ? `.${method2}` : `.${method2}()`);
1154
+ content += `
1155
+ ${name}: ${prepend}t${methods.join("")}${append},`;
1156
+ }
1157
+ return content;
1158
+ };
1154
1159
 
1155
1160
  const rakeDb = async (options, partialConfig = {}, args = process.argv.slice(2)) => {
1156
1161
  const config = getMigrationConfigWithDefaults(partialConfig);
@@ -1159,6 +1164,8 @@ const rakeDb = async (options, partialConfig = {}, args = process.argv.slice(2))
1159
1164
  await createDb(options, config);
1160
1165
  } else if (command === "drop") {
1161
1166
  await dropDb(options);
1167
+ } else if (command === "reset") {
1168
+ await resetDb(options, config);
1162
1169
  } else if (command === "migrate") {
1163
1170
  await migrate(options, config, args.slice(1));
1164
1171
  } else if (command === "rollback") {
@@ -1173,9 +1180,10 @@ const printHelp = () => console.log(
1173
1180
  `Usage: rake-db [command] [arguments]
1174
1181
 
1175
1182
  Commands:
1176
- create creates databases
1177
- drop drops databases
1178
- g, generate generates migration file, see below
1183
+ create create databases
1184
+ drop drop databases
1185
+ reset drop, create and migrate databases
1186
+ g, generate generate migration file, see below
1179
1187
  migrate migrate all pending migrations
1180
1188
  rollback rollback the last migrated
1181
1189
  no or unknown command prints this message
@@ -1200,5 +1208,6 @@ exports.dropDb = dropDb;
1200
1208
  exports.generate = generate;
1201
1209
  exports.migrate = migrate;
1202
1210
  exports.rakeDb = rakeDb;
1211
+ exports.resetDb = resetDb;
1203
1212
  exports.rollback = rollback;
1204
1213
  //# sourceMappingURL=index.js.map