UNPKG

baqend

Version:

Baqend JavaScript SDK

216 lines 18.2 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.deploy = void 0; /* eslint-disable no-await-in-loop, no-return-await, @typescript-eslint/return-await */ const fs_1 = __importDefault(require("fs")); const glob_1 = __importDefault(require("glob")); const path_1 = require("path"); const readline_1 = __importDefault(require("readline")); const baqend_1 = require("baqend"); const account = __importStar(require("./account")); const schema_1 = require("./schema"); const helper_1 = require("./helper"); const handlerTypes = ['update', 'insert', 'delete', 'validate']; function deploy(args) { return account.login(args).then((db) => { const promises = []; if ((!args.code && !args.files) || (args.code && args.files)) { promises.push(deployFiles(db, args.bucketPath, args.fileDir, args.fileGlob, args.createBucket)); promises.push(deployCode(db, args.codeDir)); } else if (args.code) { promises.push(deployCode(db, args.codeDir)); } else if (args.files) { promises.push(deployFiles(db, args.bucketPath, args.fileDir, args.fileGlob, args.createBucket)); } if (args.schema) { promises.push((0, schema_1.uploadSchema)(db)); } return Promise.all(promises); }); } exports.deploy = deploy; function deployFiles(db, path, cwd, pattern, createBucket) { return __awaiter(this, void 0, void 0, function* () { let bucket = path; while (bucket.length && bucket.charAt(0) === '/') bucket = bucket.substring(1); while (bucket.length && bucket.charAt(bucket.length - 1) === '/') bucket = bucket.substring(0, bucket.length - 1); if (!bucket.length) { throw new Error(`Invalid bucket-path ${bucket}`); } if (createBucket) { yield ensureRootBucket(db, bucket); } const files = yield (new Promise((resolve, reject) => { (0, glob_1.default)(pattern, { nodir: true, cwd }, (er, fileList) => { if (er) reject(er); else resolve(fileList); }); })); const result = yield uploadFiles(db, bucket, files, cwd); if (result && result.length > 0) { console.log('File deployment completed.'); } else { console.warn('Your specified upload folder is empty, no files were uploaded.'); } }); } function deployCode(db, codePath) { return (0, helper_1.readDir)(codePath) .catch(() => { throw new Error(`Your specified backend code folder ${codePath} is empty, no backend code was deployed.`); }) .then((fileNames) => Promise.all(fileNames .map((fileName) => (0, helper_1.stat)((0, path_1.join)(codePath, fileName)) .then((st) => { if (st.isDirectory()) { return uploadHandler(db, fileName, codePath); } return uploadCode(db, fileName, codePath); }))) .then(() => { console.log('Code deployment completed.'); }) .catch((e) => { throw new Error(`Failed to deploy code: ${e.message}`); })); } function uploadHandler(db, directoryName, codePath) { const bucket = directoryName; if (!db[bucket]) return Promise.resolve(); return (0, helper_1.readDir)((0, path_1.join)(codePath, directoryName)).then((fileNames) => Promise.all(fileNames .filter((fileName) => !fileName.startsWith('.')) .map((fileName) => { const handlerType = fileName.replace(/\.(js|es\d*)$/, ''); if (handlerTypes.indexOf(handlerType) === -1) return Promise.resolve(); return (0, helper_1.readFile)((0, path_1.join)(codePath, directoryName, fileName), 'utf-8') .then((file) => db.code.saveCode(bucket, handlerType, file)) .then(() => console.log(`${handlerType} handler for ${bucket} deployed.`)); }))); } function uploadCode(db, name, codePath) { if (name.startsWith('.')) return Promise.resolve(); const moduleName = name.replace(/\.(js|es\d*)$/, ''); return (0, helper_1.readFile)((0, path_1.join)(codePath, name), 'utf-8').then((file) => db.code.saveCode(moduleName, 'module', file)).then(() => { console.log(`Module ${moduleName} deployed.`); }); } function uploadFiles(db, bucket, files, cwd) { const isTty = process.stdout.isTTY; let index = 0; const uploads = []; for (let i = 0; i < 10 && i < files.length; i += 1) { uploads.push(upload()); } if (!isTty) { console.log(`Uploading ${files.length} files.`); } return Promise.all(uploads); function upload() { return __awaiter(this, void 0, void 0, function* () { while (index < files.length) { if (isTty) { if (index > 0) { readline_1.default.clearLine(process.stdout, 0); readline_1.default.cursorTo(process.stdout, 0); } process.stdout.write(`Uploading file ${(index + 1)} of ${files.length}`); } const file = files[index]; index += 1; if (isTty && index === files.length) { console.log(''); // add a final linebreak } yield uploadFile(db, bucket, file, cwd); } }); } } function uploadFile(db, bucket, filePath, cwd) { return __awaiter(this, void 0, void 0, function* () { const fullFilePath = (0, path_1.join)(cwd, filePath); const st = yield (0, helper_1.stat)(fullFilePath); if (!st || st.isDirectory()) { return null; } for (let retires = 3;; retires -= 1) { try { const file = new db.File({ path: `/${bucket}/${filePath}`, data: fs_1.default.createReadStream(fullFilePath), size: st.size, type: 'stream', }); return yield file.upload({ force: true }); } catch (e) { if (retires <= 0) { console.warn(`Failed to upload file ${filePath}. ${retires} retries left.`); throw new Error(`Failed to upload file ${filePath}: ${e.message}`); } } } }); } function ensureRootBucket(db, name) { return __awaiter(this, void 0, void 0, function* () { try { yield db.File.loadMetadata(name); return; } catch (e) { // ignored } const adminPermission = new baqend_1.intersection.Permission().allowAccess('/db/Role/1'); const publicPermission = new baqend_1.intersection.Permission(); yield db.File.saveMetadata(name, { load: publicPermission, insert: adminPermission, update: adminPermission, delete: adminPermission, query: adminPermission, }); }); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZGVwbG95LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdUZBQXVGO0FBQ3ZGLDRDQUFvQjtBQUNwQixnREFBd0I7QUFDeEIsK0JBQXdDO0FBQ3hDLHdEQUFnQztBQUNoQyxtQ0FBcUQ7QUFDckQsbURBQXFDO0FBQ3JDLHFDQUF3QztBQUV4QyxxQ0FBbUQ7QUFFbkQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztBQWFoRSxTQUFnQixNQUFNLENBQUMsSUFBOEI7SUFDbkQsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFO1FBQ3JDLE1BQU0sUUFBUSxHQUFtQixFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzVELFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNoRyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDN0M7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDcEIsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFD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