@httpc/kit
Version:
httpc toolbox for building function-based API with minimal code and end-to-end type safety
76 lines (75 loc) • 2.89 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.optional = exports.options = exports.optionsOf = exports.env = exports.initializer = exports.alias = exports.noInject = exports.combine = void 0;
const assert_1 = __importDefault(require("assert"));
const tsyringe_1 = require("tsyringe");
const keys_1 = require("./keys");
function combine(...decorators) {
return function () {
for (const d of decorators) {
//@ts-ignore
d.apply(this, arguments);
}
};
}
exports.combine = combine;
function noInject() {
return (0, tsyringe_1.injectWithTransform)(keys_1.CONTAINER_KEY, NoInjectTransform);
}
exports.noInject = noInject;
class NoInjectTransform {
transform(container) {
return undefined;
}
}
function alias(token) {
return (target) => (0, tsyringe_1.registry)([{ token, useFactory: container => container.resolve(target) }])(target);
}
exports.alias = alias;
function initializer() {
return alias((0, keys_1.KEY)("IInitialize"));
}
exports.initializer = initializer;
function env(variableName, defaultValue) {
const key = (0, keys_1.KEY)("ENV", variableName);
const isOptional = arguments.length === 2;
if (!tsyringe_1.container.isRegistered(key)) {
tsyringe_1.container.register(key, {
useFactory: () => {
const value = process.env[variableName] ?? defaultValue;
if (typeof value === "undefined" && !isOptional) {
throw new Error(`Missing ENV variable '${variableName}'`);
}
return value;
}
});
}
return (0, tsyringe_1.inject)(key);
}
exports.env = env;
function optionsOf(target) {
return alias((0, keys_1.KEY)("OPTIONS", target));
}
exports.optionsOf = optionsOf;
function options(defaultValue) {
const isOptional = arguments.length === 1;
return (target, property, index) => {
(0, assert_1.default)(typeof target === "function", "options decorator must be used on a class constructor parameter");
const token = (0, keys_1.KEY)("OPTIONS", target);
const decorator = isOptional ? optional(token, defaultValue) : (0, tsyringe_1.inject)(token);
return decorator(target, property, index);
};
}
exports.options = options;
function optional(token, defaultValue) {
return (0, tsyringe_1.injectWithTransform)(keys_1.CONTAINER_KEY, OptionalTransform, token, defaultValue);
}
exports.optional = optional;
class OptionalTransform {
transform(container, token, defaultValue) {
return container.isRegistered(token, true) ? container.resolve(token) : defaultValue;
}
}