UNPKG

@giancarl021/cli-core-vault-extension

Version:

Plain and secure storage extension for the @giancarl021/cli-core npm package

86 lines (62 loc) 2.21 kB
const fs = require('fs'); const path = require('path'); const objPath = require('object-path'); const keytar = require('keytar'); const locate = require('@giancarl021/locate'); const EXTENSION_NAME = 'vault'; const SERVICE_SUFFIX = '::vault'; module.exports = function ({ dataPath = 'data/extensions/vault/data.json', baseData = {} } = {}) { const _path = locate(dataPath); function builder() { async function setSecret(key, value) { await keytar.setPassword(this.appName + SERVICE_SUFFIX, key, value); } async function getSecret(key) { return await keytar.getPassword(this.appName + SERVICE_SUFFIX, key); } async function removeSecret(key) { const isSuccess = await keytar.deletePassword(this.appName + SERVICE_SUFFIX, key); if (!isSuccess) throw new Error('Failed to remove secret'); } function checkDataStorage() { if (fs.existsSync(_path) && fs.lstatSync(_path).isFile()) return; const dir = path.dirname(_path); if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); _setData(baseData); } function _getData() { checkDataStorage(); const data = fs.readFileSync(_path, 'utf8'); return JSON.parse(data); } function _setData(data) { fs.writeFileSync(_path, JSON.stringify(data)); } function setData(key, value) { const data = _getData(); objPath.set(data, key, value); _setData(data); } function getData(key) { const data = _getData(); return objPath.get(data, key); } function removeData(key) { const data = _getData(); objPath.del(data, key); _setData(data); } return { setSecret, getSecret, removeSecret, setData, getData, removeData }; } return { name: EXTENSION_NAME, builder }; }