UNPKG

csr-controller

Version:
126 lines (125 loc) 4.06 kB
"use strict"; /* eslint-disable @typescript-eslint/no-empty-interface */ Object.defineProperty(exports, "__esModule", { value: true }); exports.createSubController = exports.createController = exports.CRUDFetchMethod = void 0; exports.CRUDFetchMethod = ['GET', 'POST', 'PATCH', 'DELETE']; /** * Create controller * * @param data {@link ControllerProps | Configuration object} for the controller * @returns Function to provide template */ const createController = (data) => { data.$base ??= 'custom'; data.$server ??= ''; data.$protected ??= true; /** * Function to provide template * * @param template Template to use for this controller * @param sc Array of subcontrollers * @returns Controller */ // TODO need to give proper generic type to create template return (template) => { return (config) => { // Default values config ??= {}; config.subcontrollers ??= {}; config.methods ??= {}; const subs = Object.keys(config.subcontrollers).reduce((p, c) => { p[c] = config.subcontrollers[c](template)(data); return p; }, {}); const mets = Object.keys(config.methods).reduce((p, c) => { p[c] = config.methods[c](template(data)); return p; }, {}); // Function to change server for controller and subcontrollers const $changeServer = (server) => { data.$server = server; // Change each subcontroller $server and update template methods Object.keys(subs).forEach(k => { subs[k] = { ...config.subcontrollers[k](template)(data), $server: server }; }); // Change each method template Object.keys(mets).forEach(k => { mets[k] = config.methods[k](template(data)); }); return { ...data, ...template(data), ...subs, ...mets, $changeServer, $clone, }; }; // Function to clone controller with new template const $clone = (t) => { template = t; // Change each subcontroller template Object.keys(subs).forEach(k => { subs[k] = { ...config.subcontrollers[k](t)(data) }; }); return { ...data, ...subs, ...mets, ...t(data), $changeServer, $clone, }; }; return { ...data, ...template(data), ...subs, ...mets, $changeServer, $clone, }; }; }; }; exports.createController = createController; /** * Create subcontroller * * @param data Configuration object for the subcontroller * @returns */ const createSubController = (data) => { /** * Function to provide template * * @param template Template to use for this subcontroller * @returns Function to provide parent controller props */ return (template) => { /** * Function to provide parent controller props * * @param c ControllerProps * @returns Subcontrollers */ return (c) => { const { $protected, $url: $parentUrl, $base } = c; const { read, index } = template({ ...c, $base, $protected, $parentUrl, ...data, }); return { ...c, $parentUrl, ...data, read, index, }; }; }; }; exports.createSubController = createSubController;