53 lines
1.6 KiB
JavaScript
53 lines
1.6 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
const noop = () => {}; // eslint-disable-line no-empty-function
|
||
|
const methods = ['get', 'post', 'delete', 'patch', 'put'];
|
||
|
const reflectors = [
|
||
|
'toString',
|
||
|
'valueOf',
|
||
|
'inspect',
|
||
|
'constructor',
|
||
|
Symbol.toPrimitive,
|
||
|
Symbol.for('nodejs.util.inspect.custom'),
|
||
|
];
|
||
|
|
||
|
function buildRoute(manager) {
|
||
|
const route = [''];
|
||
|
const handler = {
|
||
|
get(target, name) {
|
||
|
if (reflectors.includes(name)) return () => route.join('/');
|
||
|
if (methods.includes(name)) {
|
||
|
const routeBucket = [];
|
||
|
for (let i = 0; i < route.length; i++) {
|
||
|
// Reactions routes and sub-routes all share the same bucket
|
||
|
if (route[i - 1] === 'reactions') break;
|
||
|
// Literal ids should only be taken account if they are the Major id (the Channel/Guild id)
|
||
|
if (/\d{16,19}/g.test(route[i]) && !/channels|guilds/.test(route[i - 1])) routeBucket.push(':id');
|
||
|
// All other parts of the route should be considered as part of the bucket identifier
|
||
|
else routeBucket.push(route[i]);
|
||
|
}
|
||
|
return options =>
|
||
|
manager.request(
|
||
|
name,
|
||
|
route.join('/'),
|
||
|
Object.assign(
|
||
|
{
|
||
|
versioned: manager.versioned,
|
||
|
route: routeBucket.join('/'),
|
||
|
},
|
||
|
options,
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
route.push(name);
|
||
|
return new Proxy(noop, handler);
|
||
|
},
|
||
|
apply(target, _, args) {
|
||
|
route.push(...args.filter(x => x != null)); // eslint-disable-line eqeqeq
|
||
|
return new Proxy(noop, handler);
|
||
|
},
|
||
|
};
|
||
|
return new Proxy(noop, handler);
|
||
|
}
|
||
|
|
||
|
module.exports = buildRoute;
|