baqend
Version:
Baqend JavaScript SDK
216 lines • 18.2 kB
JavaScript
;
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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