UNPKG

feeles-ide

Version:

The hackable and serializable IDE to make learning material

561 lines (463 loc) 15.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.createProject = createProject; exports.readProject = readProject; exports.findProject = findProject; exports.updateProject = updateProject; exports.deleteProject = deleteProject; exports.putFile = putFile; exports.deleteFile = deleteFile; exports.getPrimaryUser = getPrimaryUser; exports.default = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread")); var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _dexie = _interopRequireDefault(require("dexie")); var _v = _interopRequireDefault(require("uuid/v1")); var _deepEqual = _interopRequireDefault(require("deep-equal")); var personalDB = new _dexie.default('personal'); // DB migrations personalDB.version(1).stores({ projects: '++id, &title, size, created, updated', files: '++id, [projectId+fileName]' }); personalDB.version(2).stores({ projects: '++id, &title, size, created, updated, url', files: '++id, [projectId+fileName]' }).upgrade(function () { personalDB.projects.toCollection().modify(function (project) { project.url = ''; }); }); personalDB.version(3).stores({ projects: '++id, &title, size, created, updated, url', files: '++id, [projectId+fileName]', users: '&uuid' }); var _default = personalDB; exports.default = _default; function createProject() { return _createProject.apply(this, arguments); } function _createProject() { _createProject = (0, _asyncToGenerator2.default)( /*#__PURE__*/ _regenerator.default.mark(function _callee() { var serializedFiles, timestamp, size, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, file, project, _args = arguments; return _regenerator.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: serializedFiles = _args.length > 0 && _args[0] !== undefined ? _args[0] : []; _context.next = 3; return 1; case 3: // Be async timestamp = Date.now(); size = 0; _iteratorNormalCompletion = true; _didIteratorError = false; _iteratorError = undefined; _context.prev = 8; for (_iterator = serializedFiles[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { file = _step.value; size += file.blob ? file.blob.size : file.text.length; } // Create project _context.next = 16; break; case 12: _context.prev = 12; _context.t0 = _context["catch"](8); _didIteratorError = true; _iteratorError = _context.t0; case 16: _context.prev = 16; _context.prev = 17; if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } case 19: _context.prev = 19; if (!_didIteratorError) { _context.next = 22; break; } throw _iteratorError; case 22: return _context.finish(19); case 23: return _context.finish(16); case 24: project = { title: null, size: size, created: timestamp, updated: timestamp, url: location.origin + location.pathname, CORE_VERSION: '', CORE_CDN_URL: 'https://unpkg.com/feeles-ide@latest/umd/index.js' }; _context.next = 27; return personalDB.projects.add(project); case 27: project.id = _context.sent; _context.next = 30; return personalDB.files.bulkAdd(serializedFiles.map(function (item) { return { projectId: project.id, fileName: item.name, serializedFile: item }; })); case 30: return _context.abrupt("return", project); case 31: case "end": return _context.stop(); } } }, _callee, this, [[8, 12, 16, 24], [17,, 19, 23]]); })); return _createProject.apply(this, arguments); } function readProject(_x) { return _readProject.apply(this, arguments); } function _readProject() { _readProject = (0, _asyncToGenerator2.default)( /*#__PURE__*/ _regenerator.default.mark(function _callee2(title) { var project, query; return _regenerator.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return personalDB.projects.where('title').equalsIgnoreCase(title).first(); case 2: project = _context2.sent; if (project) { _context2.next = 5; break; } return _context2.abrupt("return", null); case 5: // select * from files where projectId=project.id; query = personalDB.files.where('[projectId+fileName]').between([project.id, ''], [project.id, "\uFFFF"]); _context2.t0 = project; _context2.t1 = query; _context2.next = 10; return query.clone().count(); case 10: _context2.t2 = _context2.sent; return _context2.abrupt("return", { project: _context2.t0, query: _context2.t1, length: _context2.t2 }); case 12: case "end": return _context2.stop(); } } }, _callee2, this); })); return _readProject.apply(this, arguments); } function findProject(_x2) { return _findProject.apply(this, arguments); } function _findProject() { _findProject = (0, _asyncToGenerator2.default)( /*#__PURE__*/ _regenerator.default.mark(function _callee3(id) { var project, query; return _regenerator.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return personalDB.projects.get(id); case 2: project = _context3.sent; if (project) { _context3.next = 5; break; } return _context3.abrupt("return", null); case 5: // select * from files where projectId=project.id; query = personalDB.files.where('[projectId+fileName]').between([project.id, ''], [project.id, "\uFFFF"]); _context3.t0 = project; _context3.t1 = query; _context3.next = 10; return query.clone().count(); case 10: _context3.t2 = _context3.sent; return _context3.abrupt("return", { project: _context3.t0, query: _context3.t1, length: _context3.t2 }); case 12: case "end": return _context3.stop(); } } }, _callee3, this); })); return _findProject.apply(this, arguments); } function updateProject(_x3, _x4) { return _updateProject.apply(this, arguments); } function _updateProject() { _updateProject = (0, _asyncToGenerator2.default)( /*#__PURE__*/ _regenerator.default.mark(function _callee4(projectId, update) { var prevProject, nextProject, duplicated; return _regenerator.default.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return personalDB.projects.where(':id').equals(projectId).first(); case 2: prevProject = _context4.sent; nextProject = (0, _objectSpread2.default)({}, prevProject, update); if (!(0, _deepEqual.default)(prevProject, nextProject)) { _context4.next = 6; break; } return _context4.abrupt("return", nextProject); case 6: if (!(nextProject.title !== null)) { _context4.next = 12; break; } _context4.next = 9; return personalDB.projects.where('title').equalsIgnoreCase(nextProject.title).first(); case 9: _context4.t0 = _context4.sent; _context4.next = 13; break; case 12: _context4.t0 = null; case 13: duplicated = _context4.t0; if (!(duplicated && duplicated.id !== nextProject.id)) { _context4.next = 16; break; } throw 'failedToRename'; case 16: _context4.next = 18; return personalDB.projects.put(nextProject); case 18: return _context4.abrupt("return", nextProject); case 19: case "end": return _context4.stop(); } } }, _callee4, this); })); return _updateProject.apply(this, arguments); } function deleteProject(_x5) { return _deleteProject.apply(this, arguments); } // Create or Update file function _deleteProject() { _deleteProject = (0, _asyncToGenerator2.default)( /*#__PURE__*/ _regenerator.default.mark(function _callee5(projectId) { return _regenerator.default.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: _context5.next = 2; return personalDB.projects.delete(projectId); case 2: _context5.next = 4; return personalDB.files.where('[projectId+fileName]').between([projectId, ''], [projectId, "\uFFFF"]).delete(); case 4: case "end": return _context5.stop(); } } }, _callee5, this); })); return _deleteProject.apply(this, arguments); } function putFile(_x6, _x7) { return _putFile.apply(this, arguments); } function _putFile() { _putFile = (0, _asyncToGenerator2.default)( /*#__PURE__*/ _regenerator.default.mark(function _callee6(projectId, serializedFile) { var found, added; return _regenerator.default.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: _context6.next = 2; return personalDB.projects.where(':id').equals(projectId).modify({ updated: serializedFile.lastModified || Date.now() }); case 2: _context6.next = 4; return personalDB.files.where('[projectId+fileName]').equals([projectId, serializedFile.name]).first(); case 4: found = _context6.sent; if (found) { _context6.next = 13; break; } // Any files found, so create new. added = { projectId: projectId, fileName: serializedFile.name, serializedFile: serializedFile }; _context6.next = 9; return personalDB.files.add(added); case 9: added.id = _context6.sent; return _context6.abrupt("return", added); case 13: _context6.next = 15; return personalDB.files.where(':id').equals(found.id).modify({ serializedFile: serializedFile }); case 15: return _context6.abrupt("return", serializedFile); case 16: case "end": return _context6.stop(); } } }, _callee6, this); })); return _putFile.apply(this, arguments); } function deleteFile(_x8) { return _deleteFile.apply(this, arguments); } function _deleteFile() { _deleteFile = (0, _asyncToGenerator2.default)( /*#__PURE__*/ _regenerator.default.mark(function _callee7(projectId) { var _personalDB$files$whe; var project, _len, fileNames, _key, keys, _args7 = arguments; return _regenerator.default.wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: _context7.next = 2; return personalDB.projects.get(projectId); case 2: project = _context7.sent; if (!project) { project.modify({ updated: Date.now() }); } // Delete files included fileNames for (_len = _args7.length, fileNames = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { fileNames[_key - 1] = _args7[_key]; } keys = fileNames.map(function (fn) { return [projectId + '', fn]; }); _context7.next = 8; return (_personalDB$files$whe = personalDB.files.where('[projectId+fileName]')).anyOfIgnoreCase.apply(_personalDB$files$whe, (0, _toConsumableArray2.default)(keys)).delete(); case 8: case "end": return _context7.stop(); } } }, _callee7, this); })); return _deleteFile.apply(this, arguments); } function getPrimaryUser() { return _getPrimaryUser.apply(this, arguments); } function _getPrimaryUser() { _getPrimaryUser = (0, _asyncToGenerator2.default)( /*#__PURE__*/ _regenerator.default.mark(function _callee8() { return _regenerator.default.wrap(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: _context8.next = 2; return personalDB.users.toCollection().first(); case 2: _context8.t0 = _context8.sent; if (_context8.t0) { _context8.next = 7; break; } _context8.next = 6; return createUser(); case 6: _context8.t0 = _context8.sent; case 7: return _context8.abrupt("return", _context8.t0); case 8: case "end": return _context8.stop(); } } }, _callee8, this); })); return _getPrimaryUser.apply(this, arguments); } function createUser() { return _createUser.apply(this, arguments); } function _createUser() { _createUser = (0, _asyncToGenerator2.default)( /*#__PURE__*/ _regenerator.default.mark(function _callee9() { var user; return _regenerator.default.wrap(function _callee9$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: // Create new user with random id user = { uuid: (0, _v.default)() }; _context9.next = 3; return personalDB.users.add(user); case 3: return _context9.abrupt("return", user); case 4: case "end": return _context9.stop(); } } }, _callee9, this); })); return _createUser.apply(this, arguments); }