csr-controller
Version:
DB Controller for client side rendering
126 lines (125 loc) • 4.06 kB
JavaScript
;
/* 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;