@httpc/kit
Version:
httpc toolbox for building function-based API with minimal code and end-to-end type safety
41 lines (40 loc) • 1.52 kB
JavaScript
import { Authenticated } from "../auth";
function assertReflectMetadata() {
if (typeof Reflect.defineMetadata === "undefined") {
throw new Error("Missing 'reflect-metadata' dependency");
}
}
function metadataSet(key, value) {
return (target, property) => {
assertReflectMetadata();
return property
? Reflect.defineMetadata(key, value, target, property)
: Reflect.defineMetadata(key, value, target);
};
}
function metadataPush(key, item) {
return (target, property) => {
assertReflectMetadata();
const metadata = (property
? Reflect.getMetadata(key, target, property)
: Reflect.getMetadata(key, target)) || [];
metadata.push(item);
return property
? Reflect.defineMetadata(key, metadata, target, property)
: Reflect.defineMetadata(key, metadata, target);
};
}
export function decoratorMiddleware(factory) {
return (...args) => metadataPush("CALL_MIDDLEWARE", factory(...args));
}
export function decoratorMetadata(key, value) {
return (...args) => {
if (typeof key === "function") {
({ key, value } = key(...args));
}
return metadataSet(key, value);
};
}
export const call = decoratorMetadata((access = "write") => ({ key: "CALL_ACCESS", value: access }));
export const noCall = decoratorMetadata("CALL_ACCESS", false);
export const authenticated = decoratorMiddleware(Authenticated);