UNPKG

@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
"use strict"; 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; } }