UNPKG

@sidekick-coder/db

Version:

Cli Tool to manipulate data from diferent sources

311 lines (299 loc) 8.6 kB
'use strict'; var dateFns = require('date-fns'); var valibot = require('valibot'); var path = require('path'); var fs = require('fs'); require('url'); var yaml = require('yaml'); var qs = require('qs'); var inquirer = require('@inquirer/prompts'); var crypto = require('crypto'); function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } function _interopNamespace(e) { if (e && e.__esModule) return e; var n = Object.create(null); if (e) { Object.keys(e).forEach(function (k) { if (k !== 'default') { var d = Object.getOwnPropertyDescriptor(e, k); Object.defineProperty(n, k, d.get ? d : { enumerable: true, get: function () { return e[k]; } }); } }); } n.default = e; return Object.freeze(n); } var valibot__namespace = /*#__PURE__*/_interopNamespace(valibot); var path__default = /*#__PURE__*/_interopDefault(path); var fs__default = /*#__PURE__*/_interopDefault(fs); var qs__default = /*#__PURE__*/_interopDefault(qs); var inquirer__namespace = /*#__PURE__*/_interopNamespace(inquirer); var crypto__default = /*#__PURE__*/_interopDefault(crypto); // src/core/idStrategy/createDate.ts function createDate() { return { name: "date", async create(config) { const pattern = config.pattern || "yyyy-MM-dd"; return dateFns.format(/* @__PURE__ */ new Date(), pattern); } }; } // src/utils/tryCatch.ts async function tryCatch(tryer) { try { const result = await tryer(); return [result, null]; } catch (error) { return [null, error]; } } tryCatch.sync = function(tryer) { try { const result = tryer(); return [result, null]; } catch (error) { return [null, error]; } }; var parse = yaml.parse; var stringify = yaml.stringify; var YAML = { parse, stringify }; function readFileSync(path4) { const [content, error] = tryCatch.sync(() => fs__default.default.readFileSync(path4)); if (error) { return null; } return new Uint8Array(content); } readFileSync.text = function(filepath, defaultValue = "") { const content = readFileSync(filepath); if (!content) { return defaultValue; } return new TextDecoder().decode(content); }; readFileSync.json = function(path4, options) { const content = readFileSync.text(path4); if (!content) { return (options == null ? void 0 : options.default) || null; } const [json, error] = tryCatch.sync(() => JSON.parse(content, options == null ? void 0 : options.reviver)); return error ? (options == null ? void 0 : options.default) || null : json; }; readFileSync.yaml = function(path4, options) { const content = readFileSync.text(path4); if (!content) { return (options == null ? void 0 : options.default) || null; } const [yml, error] = tryCatch.sync(() => YAML.parse(content, options == null ? void 0 : options.parseOptions)); return error ? (options == null ? void 0 : options.default) || null : yml; }; var filesystem = { readSync: readFileSync}; function createReviver(folder) { return (_, value) => { if (typeof value == "string" && value.startsWith("./")) { return path.resolve(path.dirname(folder), value); } return value; }; } var schema = valibot__namespace.optional( valibot__namespace.pipe( valibot__namespace.any(), valibot__namespace.transform((value) => { if (typeof value == "object") { return value; } if (/\.yml$/.test(value)) { const file = value.replace(/^@/, ""); const folder = path.dirname(file); return filesystem.readSync.yaml(value.replace(/^@/, ""), { reviver: createReviver(folder) }); } if (typeof value == "string" && value.includes("=")) { const result = qs__default.default.parse(value, { allowEmptyArrays: true }); return result; } if (typeof value == "string" && value.startsWith("{")) { return JSON.parse(value); } if (typeof value == "string" && value.startsWith("[")) { return JSON.parse(value); } return value; }), valibot__namespace.record(valibot__namespace.string(), valibot__namespace.any()) ) ); function createPathNode() { return { resolve: (...args) => path__default.default.resolve(...args), join: (...args) => path__default.default.join(...args), dirname: (args) => path__default.default.dirname(args), basename: (args) => path__default.default.basename(args) }; } // src/core/validator/valibot.ts var stringList = valibot__namespace.pipe( valibot__namespace.any(), valibot__namespace.transform((value) => { if (typeof value === "string") { return value.split(","); } if (Array.isArray(value)) { return value; } }), valibot__namespace.array(valibot__namespace.string()) ); function array2(s) { return valibot__namespace.pipe( v2.union([v2.array(s), s]), valibot__namespace.transform((value) => Array.isArray(value) ? value : [value]), valibot__namespace.array(s) ); } function path3(dirname2, path4 = createPathNode()) { return valibot__namespace.pipe( valibot__namespace.string(), valibot__namespace.transform((value) => path4.resolve(dirname2, value)) ); } function uint8() { return valibot__namespace.pipe( valibot__namespace.any(), valibot__namespace.check((value) => value instanceof Uint8Array), valibot__namespace.transform((value) => value) ); } var prompts = { password: (options) => valibot__namespace.optionalAsync(valibot__namespace.string(), () => { return inquirer__namespace.password({ message: "Enter password", ...options }); }) }; var extras = { array: array2, vars: schema, stringList, path: path3, uint8, number: valibot__namespace.pipe( valibot__namespace.any(), valibot__namespace.transform(Number), valibot__namespace.check((n) => !isNaN(n)), valibot__namespace.number() ) }; var vWithExtras = { ...valibot__namespace, extras, prompts }; var v2 = vWithExtras; // src/core/validator/validate.ts function validate(cb, payload) { const schema2 = typeof cb === "function" ? cb(v2) : cb; const { output, issues, success } = v2.safeParse(schema2, payload); if (!success) { const flatten = v2.flatten(issues); const messages = []; if (flatten.root) { messages.push(...flatten.root); } if (flatten.nested) { Object.entries(flatten.nested).forEach((entry) => { const [key, value] = entry; messages.push(...value.map((v3) => `${key}: ${v3}`)); }); } const message = messages.length ? messages.join(", ") : "Validation failed"; const error = new Error(message); error.name = "ValidationError"; Object.assign(error, { messages }); throw error; } return output; } validate.async = async function(cb, payload) { let schema2; if (typeof cb === "function") { schema2 = cb(v2); } else { schema2 = cb; } const { output, issues, success } = await v2.safeParseAsync(schema2, payload); if (!success) { const error = new Error("Validation failed"); const flatten = v2.flatten(issues); const details = { ...flatten.root, ...flatten.nested }; Object.assign(error, { details }); throw error; } return output; }; // src/core/idStrategy/createIncremental.ts function pad(value, size) { return value.toString().padStart(size, "0"); } function createIncremental(filesystem2, filename) { async function create(payload = {}) { const options = validate( (v3) => v3.object({ padding: v3.optional(v3.number(), 2) }), payload ); if (!filesystem2.existsSync(filename)) { filesystem2.writeSync.json(filename, { last_id: 0 }, { recursive: true }); } const content = filesystem2.readSync.json(filename, { schema: (v3) => v3.object({ last_id: v3.number() }) }); const id = content.last_id + 1; filesystem2.writeSync.json(filename, { last_id: id }); return pad(id, options.padding); } return { name: "incremental", create }; } function createUuid() { return { name: "uuid", async create() { return crypto__default.default.randomUUID(); } }; } // src/core/idStrategy/createStrategies.ts function createStrategies(options) { const { filesystem: filesystem2, root } = options; return [ createIncremental(filesystem2, filesystem2.path.resolve(root, ".db", "incremental.json")), createDate(), createUuid() ]; } exports.createStrategies = createStrategies;