UNPKG

mongo-seeding-cli

Version:

The ultimate command line tool for populating your MongoDB database.

229 lines 8.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DB_OPTIONS_KEY_VALUE_SEPARATOR = exports.DB_OPTIONS_SEPARATOR = exports.createConfigFromOptions = exports.validateOptions = exports.cliOptions = exports.DEFAULT_EXTENSIONS = exports.DEFAULT_INPUT_PATH = void 0; exports.convertEmptyObjectToUndefined = convertEmptyObjectToUndefined; const extend = require("extend"); const validators_1 = require("./validators"); const mongo_seeding_1 = require("mongo-seeding"); exports.DEFAULT_INPUT_PATH = './'; exports.DEFAULT_EXTENSIONS = ['ts', 'js', 'cjs', 'json']; exports.cliOptions = [ { name: 'data', alias: 'd', description: 'Path to directory containing import data; default: {bold current directory}', type: String, defaultOption: true, }, { name: 'db-protocol', description: 'MongoDB database connection protocol; default: {bold mongodb}', type: String, }, { name: 'db-host', description: 'MongoDB database host; default: {bold 127.0.0.1}', type: String, }, { name: 'db-port', description: 'MongoDB database port; default: {bold 27017}', type: Number, }, { name: 'db-name', description: 'MongoDB database name; default: {bold database}', type: String, }, { name: 'db-username', description: 'Username for connecting with database that requires authentication', type: String, }, { name: 'db-password', description: 'Password for connecting with database that requires authentication', type: String, }, { name: 'db-options', description: 'MongoDB connection options (https://docs.mongodb.com/manual/reference/connection-string/) in a form of multiple `KEY=VALUE` entries, separated by semicolon, e.g.: `ssl=true;maxPoolSize=50`; default: {bold undefined}', type: String, }, { name: 'db-uri', alias: 'u', description: 'If defined, the URI will be used for establishing connection to database, ignoring values defined via other `db-*` parameters, e.g. `db-name`, `db-host`, etc.; default: {bold undefined}', type: String, }, { name: 'reconnect-timeout', description: 'Maximum time in seconds, in which app should keep trying connecting to database; default: {bold 10}', type: Number, }, { name: 'drop-database', description: 'Drops database before import', type: Boolean, }, { name: 'drop-collections', description: 'Drops every collection that is being imported', type: Boolean, }, { name: 'remove-all-documents', description: 'Delete all documents from every collection that is being imported', type: Boolean, }, { name: 'replace-id', description: 'Replaces `id` property with `_id` for every document before import', type: Boolean, }, { name: 'set-timestamps', description: 'Sets `createdAt` and `updatedAt` timestamps for every document before import', type: Boolean, }, { name: 'transpile-only', alias: 't', description: 'Disables type checking on TypeScript files import. This option vastly improves performance of TypeScript data import; default: {bold false}', type: Boolean, }, { name: 'silent', alias: 's', description: 'Disables printing logging of Mongo Seeding status to standard output', type: Boolean, }, { name: 'help', alias: 'h', description: 'Shows this help info', type: Boolean, }, ]; const validateOptions = (options) => { (0, validators_1.throwOnNegativeNumber)(options['db-port'], 'db-port'); (0, validators_1.throwOnNegativeNumber)(options['reconnect-timeout'], 'reconnect-timeout'); }; exports.validateOptions = validateOptions; const createConfigFromOptions = (cmdArgs) => { const commandLineConfig = populateCommandLineOptions(cmdArgs); const envConfig = populateEnvOptions(); const config = {}; const defaultConfig = { cli: { dataPath: exports.DEFAULT_INPUT_PATH, }, }; const mergedConfig = extend(true, config, defaultConfig, envConfig, commandLineConfig); mergedConfig.collectionReading = getCollectionReadingConfig(mergedConfig); return mergedConfig; }; exports.createConfigFromOptions = createConfigFromOptions; function getCollectionReadingConfig(opts) { var _a, _b, _c; const transformers = []; if ((_a = opts === null || opts === void 0 ? void 0 : opts.cli) === null || _a === void 0 ? void 0 : _a.replaceId) { transformers.push(mongo_seeding_1.Seeder.Transformers.replaceDocumentIdWithUnderscoreId); } if ((_b = opts === null || opts === void 0 ? void 0 : opts.cli) === null || _b === void 0 ? void 0 : _b.setTimestamps) { transformers.push(mongo_seeding_1.Seeder.Transformers.setCreatedAtTimestamp, mongo_seeding_1.Seeder.Transformers.setUpdatedAtTimestamp); } const ejsonCanonicalMode = ((_c = opts.cli) === null || _c === void 0 ? void 0 : _c.ejsonParseCanonicalMode) || false; return { extensions: exports.DEFAULT_EXTENSIONS, ejsonParseOptions: { relaxed: !ejsonCanonicalMode, }, transformers, }; } function populateCommandLineOptions(options) { return { seeder: { database: options['db-uri'] ? options['db-uri'] : convertEmptyObjectToUndefined({ protocol: options['db-protocol'], host: options['db-host'], port: options['db-port'], name: options['db-name'], username: options['db-username'], password: options['db-password'], options: readDbOptions(options['db-options']), }), databaseReconnectTimeout: options['reconnect-timeout'], dropDatabase: options['drop-database'], dropCollections: options['drop-collections'], removeAllDocuments: options['remove-all-documents'], }, cli: { dataPath: options['data'], ejsonParseCanonicalMode: options['ejson-parse-canonical-mode'], replaceId: options['replace-id'], setTimestamps: options['set-timestamps'], transpileOnly: options['transpile-only'], silent: options['silent'], }, }; } exports.DB_OPTIONS_SEPARATOR = ';'; exports.DB_OPTIONS_KEY_VALUE_SEPARATOR = '='; function readDbOptions(optsStr) { if (!optsStr) { return undefined; } return optsStr.split(exports.DB_OPTIONS_SEPARATOR).reduce((prev, current = '') => { const [key, value] = current.split(exports.DB_OPTIONS_KEY_VALUE_SEPARATOR); if (typeof value === 'undefined') { return prev; } return Object.assign(Object.assign({}, prev), { [key]: value }); }, {}); } function populateEnvOptions() { const env = process.env; return { seeder: { database: env.DB_URI ? String(env.DB_URI) : convertEmptyObjectToUndefined({ protocol: env.DB_PROTOCOL ? String(env.DB_PROTOCOL) : undefined, host: env.DB_HOST ? String(env.DB_HOST) : undefined, port: env.DB_PORT ? Number(env.DB_PORT) : undefined, name: env.DB_NAME ? String(env.DB_NAME) : undefined, username: env.DB_USERNAME ? String(env.DB_USERNAME) : undefined, password: env.DB_PASSWORD ? String(env.DB_PASSWORD) : undefined, options: env.DB_OPTIONS ? readDbOptions(String(env.DB_OPTIONS)) : undefined, }), databaseReconnectTimeout: env.RECONNECT_TIMEOUT ? Number(env.RECONNECT_TIMEOUT) : undefined, dropDatabase: env.DROP_DATABASE === 'true', dropCollections: env.DROP_COLLECTIONS === 'true', removeAllDocuments: env.REMOVE_ALL_DOCUMENTS === 'true', }, cli: { ejsonParseCanonicalMode: process.env.EJSON_PARSE_CANONICAL_MODE === 'true', replaceId: process.env.REPLACE_ID === 'true', setTimestamps: process.env.SET_TIMESTAMPS === 'true', transpileOnly: env.TRANSPILE_ONLY === 'true', silent: env.SILENT === 'true', }, }; } function convertEmptyObjectToUndefined(obj) { for (const key in obj) { if (typeof obj[key] !== 'undefined') { return obj; } } return undefined; } //# sourceMappingURL=options.js.map