UNPKG

parse-server-schema-manager

Version:
269 lines 26.7 kB
"use strict"; 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.manageSchema = exports.getAllSchemas = exports.diffingCLP = exports.diffingIndexes = exports.diffingFields = void 0; const object_1 = require("../object"); const sync_1 = require("./sync"); const node_1 = __importDefault(require("parse/node")); const checkSecondProperties = ['type']; const checkOptions = ['targetClass', 'required', 'defaultValue']; const diffingFields = (obj1, obj2, schemaOptions) => { var _a, _b, _c, _d, _e, _f, _g, _h, _j; let add = {}; let remove = {}; let change = {}; for (let key in obj2) { if ((_a = schemaOptions === null || schemaOptions === void 0 ? void 0 : schemaOptions.ignoreAttributes) === null || _a === void 0 ? void 0 : _a.includes(key)) continue; if (!obj1[key]) add[key] = obj2[key]; else { const obj1Field = obj1[key]; const obj2Field = obj2[key]; for (const prop of checkSecondProperties) { if (prop in obj1Field && prop in obj2Field) { if ((obj1Field === null || obj1Field === void 0 ? void 0 : obj1Field[prop]) !== (obj2Field === null || obj2Field === void 0 ? void 0 : obj2Field[prop])) { change[key] = (_b = change[key]) !== null && _b !== void 0 ? _b : []; change[key].push(`${prop}: ${obj1Field[prop]} -> ${obj2Field[prop]}`); } } } for (let pr of checkSecondProperties) { if ((obj1Field === null || obj1Field === void 0 ? void 0 : obj1Field[pr]) !== (obj2Field === null || obj2Field === void 0 ? void 0 : obj2Field[pr])) { change[key] = (_c = change[key]) !== null && _c !== void 0 ? _c : []; change[key].push(`${pr}: ${obj1Field[pr]} -> ${obj2Field[pr]}`); } } for (let pr of checkOptions) if (!(0, object_1.checkSame)(obj1Field === null || obj1Field === void 0 ? void 0 : obj1Field[pr], obj2Field === null || obj2Field === void 0 ? void 0 : obj2Field[pr])) { if (pr === 'required' && ((_d = obj1[key]) === null || _d === void 0 ? void 0 : _d[pr]) === false && !((_e = obj2[key]) === null || _e === void 0 ? void 0 : _e[pr])) continue; if (pr === 'defaultValue' && ((_f = obj1[key]) === null || _f === void 0 ? void 0 : _f[pr]) === false && !((_g = obj2[key]) === null || _g === void 0 ? void 0 : _g[pr])) continue; change[key] = (_h = change[key]) !== null && _h !== void 0 ? _h : []; change[key].push(`${pr}: ${JSON.stringify(obj1Field[pr])} -> ${JSON.stringify(obj2Field === null || obj2Field === void 0 ? void 0 : obj2Field[pr])}`); } } } for (let key in obj1) { if ((_j = schemaOptions === null || schemaOptions === void 0 ? void 0 : schemaOptions.ignoreAttributes) === null || _j === void 0 ? void 0 : _j.includes(key)) continue; if (!obj2[key]) remove[key] = obj1[key]; } const output = {}; if (Object.keys(add).length) output.add = add; if (Object.keys(remove).length) output.remove = remove; if (Object.keys(change).length) output.change = change; return output; }; exports.diffingFields = diffingFields; const diffingIndexes = (obj1, obj2) => { const change = {}; const add = {}; const remove = {}; for (let key in obj1) if (!obj2[key]) remove[key] = obj1[key]; for (let key in obj2) { if (!(obj1 === null || obj1 === void 0 ? void 0 : obj1[key])) { add[key] = obj2[key]; continue; } const allKeys = [ ...new Set([...Object.keys(obj1[key]), ...Object.keys(obj2[key])]), ]; if (allKeys.some((key2) => { var _a, _b; return !(0, object_1.checkSame)((_a = obj1[key]) === null || _a === void 0 ? void 0 : _a[key2], (_b = obj2[key]) === null || _b === void 0 ? void 0 : _b[key2]); })) { change[key] = { from: obj1[key], to: obj2[key], }; } } const output = {}; if (Object.keys(add).length) output.add = add; if (Object.keys(remove).length) output.remove = remove; if (Object.keys(change).length) output.change = change; return output; }; exports.diffingIndexes = diffingIndexes; const diffingCLP = (obj1, obj2) => { const change = {}; for (let key in obj2) { const allKeys = [...Object.keys(obj1[key])]; if (allKeys.some((key2) => { var _a, _b; return !(0, object_1.checkSame)((_a = obj1[key]) === null || _a === void 0 ? void 0 : _a[key2], (_b = obj2[key]) === null || _b === void 0 ? void 0 : _b[key2]); })) { change[key] = { from: obj1[key], to: obj2[key], }; } } return change; }; exports.diffingCLP = diffingCLP; const sanitizeSchemaParts = (parts) => { return Object.assign({ fields: true, indexes: true, classLevelPermissions: true, }, parts); }; const sanitizeSchemaOptions = (outputOptions) => { return Object.assign({ ignoreClasses: ['_Session'], ignoreAttributes: [ 'ACL', 'password', 'authData', 'emailVerified', 'email', ], }, outputOptions); }; const wait = (t) => new Promise((r) => setTimeout(r, t)); const getAllParseSchema = () => __awaiter(void 0, void 0, void 0, function* () { return yield node_1.default.Schema.all(); }); const getAllSchemas = (...args_1) => __awaiter(void 0, [...args_1], void 0, function* (parts = {}, outputOptions = {}) { var _a; const schemaParts = sanitizeSchemaParts(parts); const options = sanitizeSchemaOptions(outputOptions); const { ignoreClasses, ignoreAttributes } = options; const list = yield getAllParseSchema(); const clone = structuredClone(list).filter((c) => !ignoreClasses.includes(c.className)); const returnList = []; for (let cls of clone) { let obj = { className: cls.className, fields: {} }; if (schemaParts.fields) { obj.fields = cls.fields; for (let atr of ignoreAttributes !== null && ignoreAttributes !== void 0 ? ignoreAttributes : []) if ((_a = obj.fields) === null || _a === void 0 ? void 0 : _a[atr]) delete obj.fields[atr]; } if (schemaParts.indexes) obj.indexes = cls.indexes; if (schemaParts.classLevelPermissions) obj.classLevelPermissions = cls.classLevelPermissions; returnList.push(obj); } return returnList; }); exports.getAllSchemas = getAllSchemas; const diffSchemaChanges = (existingSchema, schema, part, schemaOptions) => { var _a; const change = {}; for (let cls of schema) { const className = cls.className; if ((_a = schemaOptions === null || schemaOptions === void 0 ? void 0 : schemaOptions.ignoreClasses) === null || _a === void 0 ? void 0 : _a.includes(className)) continue; const existingCls = existingSchema.find((c) => c.className === className); if (!(existingCls === null || existingCls === void 0 ? void 0 : existingCls.fields) || !cls.fields) continue; const diff = part === 'fields' ? (0, exports.diffingFields)(existingCls.fields, cls.fields, schemaOptions) : part === 'indexes' ? (0, exports.diffingIndexes)(existingCls.indexes, cls.indexes) : (0, exports.diffingCLP)(existingCls.classLevelPermissions, cls.classLevelPermissions); if (Object.keys(diff).length) change[className] = diff; } return change; }; const addRemoveSchemaChanges = (existingSchema, schema, schemaOptions) => { var _a, _b; const add = {}; const remove = {}; for (let cls of schema) { const className = cls.className; if ((_a = schemaOptions === null || schemaOptions === void 0 ? void 0 : schemaOptions.ignoreClasses) === null || _a === void 0 ? void 0 : _a.includes(className)) continue; const existingCls = existingSchema.find((c) => c.className === className); if (existingCls) continue; add[className] = cls; } for (let cls of existingSchema) { const className = cls.className; if ((_b = schemaOptions === null || schemaOptions === void 0 ? void 0 : schemaOptions.ignoreClasses) === null || _b === void 0 ? void 0 : _b.includes(className)) continue; const newCls = schema.find((c) => c.className === className); if (newCls) continue; remove[className] = cls; } const output = {}; if (Object.keys(add).length) output.add = add; if (Object.keys(remove).length) output.remove = remove; return output; }; const manageSchema = (schema_1, _a, ...args_1) => __awaiter(void 0, [schema_1, _a, ...args_1], void 0, function* (schema, { commit = false, remove = false, purge = false }, actionParts = {}, schemaOptions = {}) { var _b, _c, _d, _e, _f, _g; const schemaParts = sanitizeSchemaParts(actionParts); const options = sanitizeSchemaOptions(schemaOptions); const existingSchema = yield (0, exports.getAllSchemas)(actionParts, options); const addRemove = addRemoveSchemaChanges(existingSchema, schema, options); const changesDiff = {}; for (let key in schemaParts) if (schemaParts[key]) changesDiff[key] = diffSchemaChanges(existingSchema, schema, key, options); let log = 'Nothing changed!'; if (commit) { for (let key in (_b = addRemove.add) !== null && _b !== void 0 ? _b : {}) yield (0, sync_1.syncSchemaWithObject)(key, (_c = addRemove.add) === null || _c === void 0 ? void 0 : _c[key], options.ignoreAttributes); let keysToSync = new Set(); for (let classKey in (_d = changesDiff.fields) !== null && _d !== void 0 ? _d : {}) keysToSync.add(classKey); for (let classKey in (_e = changesDiff.indexes) !== null && _e !== void 0 ? _e : {}) keysToSync.add(classKey); keysToSync = [...keysToSync]; for (let key of keysToSync) { const cls = schema.find((t) => t.className === key); yield (0, sync_1.syncSchemaWithObject)(key, cls, options.ignoreAttributes); } log = 'Schema synced!'; } if (remove) for (let key in (_f = addRemove.remove) !== null && _f !== void 0 ? _f : {}) { const mySchema = new node_1.default.Schema(key); if (purge) yield mySchema.purge(); yield mySchema.delete(); log = 'Schema synced!'; } const output = Object.assign(Object.assign({}, addRemove), { log }); if (Object.keys(changesDiff).length) { let tempChanges = {}; for (let key in changesDiff) { if (Object.keys((_g = changesDiff[key]) !== null && _g !== void 0 ? _g : {}).length) tempChanges[key] = changesDiff[key]; } if (Object.keys(tempChanges).length) output.changes = tempChanges; } return output; }); exports.manageSchema = manageSchema; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2Z1bmN0aW9ucy9zY2hlbWEvc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUNBLHNDQUFvQztBQUNwQyxpQ0FBNEM7QUFDNUMsc0RBQStCO0FBRS9CLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUV2QyxNQUFNLFlBQVksR0FBRyxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFjMUQsTUFBTSxhQUFhLEdBQUcsQ0FDM0IsSUFBaUIsRUFDakIsSUFBaUIsRUFDakIsYUFBa0MsRUFDaEIsRUFBRTs7SUFDcEIsSUFBSSxHQUFHLEdBQWdCLEVBQUUsQ0FBQztJQUMxQixJQUFJLE1BQU0sR0FBZ0IsRUFBRSxDQUFDO0lBQzdCLElBQUksTUFBTSxHQUFrQyxFQUFFLENBQUM7SUFDL0MsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLE1BQUEsYUFBYSxhQUFiLGFBQWEsdUJBQWIsYUFBYSxDQUFFLGdCQUFnQiwwQ0FBRSxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQUUsU0FBUztRQUU3RCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDaEMsQ0FBQztZQUNKLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQXdCLENBQUM7WUFDbkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBd0IsQ0FBQztZQUVuRCxLQUFLLE1BQU0sSUFBSSxJQUFJLHFCQUFxQixFQUFFLENBQUM7Z0JBQ3pDLElBQUksSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLElBQUksU0FBUyxFQUFFLENBQUM7b0JBQzNDLElBQUksQ0FBQSxTQUFTLGFBQVQs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