@open-norantec/herbal 1.0.2-alpha.3 → 1.0.2-alpha.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/create.js DELETED
@@ -1,154 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.create = void 0;
4
- require("reflect-metadata");
5
- var _ = require("lodash");
6
- var nest_util_class_1 = require("./utilities/nest-util.class");
7
- var string_util_class_1 = require("@open-norantec/utilities/dist/string-util.class");
8
- var reflect_declaration_1 = require("./transformers/reflect-declaration");
9
- var client_groups_decorator_1 = require("./decorators/client-groups.decorator");
10
- var controller_util_class_1 = require("./utilities/controller-util.class");
11
- function create(options) {
12
- return {
13
- options: options,
14
- generateClientSourceFile: function () {
15
- if (!(options === null || options === void 0 ? void 0 : options.Module))
16
- throw new Error("Parameter 'Module' must be specified");
17
- var METHOD_TYPE_MAP_NAME = 'MethodTypeMap';
18
- var METHOD_TYPE_MAP_KEYS_NAME = 'MethodTypeMapKeys';
19
- var RESPONSE_CALLBACK_DATA_NAME = 'ResponseCallbackData';
20
- var REQUEST_OPTIONS_NAME = 'RequestOptions';
21
- var RESULT_TYPE_NAME = 'Result';
22
- var HTTP_RESPONSE_BODY_TYPE_NAME = 'HttpResponseBody';
23
- var REQUEST_METHOD_MAP_NAME = 'REQUEST_METHOD_MAP';
24
- var RESPONSE_CACHE_MAP_NAME = 'RESPONSE_CACHE_MAP';
25
- var REQUEST_BODY_TYPE_ANNOTATION = "".concat(METHOD_TYPE_MAP_NAME, "[T]['request']");
26
- var RESULT_TYPE_ANNOTATION = "".concat(RESULT_TYPE_NAME, "<").concat(HTTP_RESPONSE_BODY_TYPE_NAME, "<").concat(METHOD_TYPE_MAP_NAME, "[T]['response']>>");
27
- var methodTypeMapCodeLines = nest_util_class_1.NestUtil.getControllerClasses(options.Module)
28
- .reduce(function (result, Class) {
29
- if (string_util_class_1.StringUtil.isFalsyString(Class === null || Class === void 0 ? void 0 : Class.name))
30
- return result;
31
- var controllerName = _.camelCase(Class.name.replace(/Controller$/g, ''));
32
- if (string_util_class_1.StringUtil.isFalsyString(controllerName) || !(0, controller_util_class_1.isHerbalController)(Class)) {
33
- return result;
34
- }
35
- var metadataNames = Reflect.getMetadataKeys(Class.prototype).filter(function (metadataName) { return !string_util_class_1.StringUtil.isFalsyString(metadataName); });
36
- return result.concat(metadataNames.reduce(function (result, metadataName) {
37
- var methodName = metadataName.slice(reflect_declaration_1.DECORATOR_NAME_PREFIX.length);
38
- if (string_util_class_1.StringUtil.isFalsyString(metadataName) ||
39
- !metadataName.startsWith(reflect_declaration_1.DECORATOR_NAME_PREFIX) ||
40
- !client_groups_decorator_1.ClientGroups.shouldShowInClient(Class, methodName, options === null || options === void 0 ? void 0 : options.allowedClientGroupsFactory)) {
41
- return result;
42
- }
43
- var scopeIdentifier = "/".concat(controllerName, "/").concat(methodName);
44
- return result.concat(["'".concat(scopeIdentifier, "'"), "".concat(Reflect.getMetadata(metadataName, Class.prototype), ";")].join(': '));
45
- }, []));
46
- }, [])
47
- .map(function (line) { return " ".concat(line); });
48
- methodTypeMapCodeLines.unshift("export interface ".concat(METHOD_TYPE_MAP_NAME, " {"));
49
- methodTypeMapCodeLines.push('}');
50
- return [
51
- "import * as hash from 'object-hash';",
52
- "import * as _ from 'lodash';",
53
- "\n".concat(methodTypeMapCodeLines.join('\n')),
54
- "\ntype ".concat(METHOD_TYPE_MAP_KEYS_NAME, " = keyof ").concat(METHOD_TYPE_MAP_NAME, ";"),
55
- "\ntype ".concat(RESPONSE_CALLBACK_DATA_NAME, "<K extends ").concat(METHOD_TYPE_MAP_KEYS_NAME, "> = {"),
56
- ' url: K;',
57
- " result: ".concat(RESULT_TYPE_NAME, "<").concat(HTTP_RESPONSE_BODY_TYPE_NAME, "<").concat(METHOD_TYPE_MAP_NAME, "[K]['response']>>;"),
58
- '};',
59
- "\nexport type ".concat(HTTP_RESPONSE_BODY_TYPE_NAME, "<T> = {"),
60
- ' data: T;',
61
- ' token: string | null;',
62
- '};',
63
- "\nexport interface ".concat(REQUEST_OPTIONS_NAME, " extends RequestInit {"),
64
- ' headers?: Record<string, any>;',
65
- ' ignoreCache?: boolean;',
66
- ' prefix?: string;',
67
- ' timeout?: number;',
68
- ' getAuthorizationCredential?: () => string;',
69
- " onRequest?: (context: { cached: boolean; id: string; options: Omit<".concat(REQUEST_OPTIONS_NAME, ", 'getAuthorizationCredential' | 'onRequest' | 'onResponse'>; prefix: string | undefined; requestBody: string; url: string; }) => void | Promise<void>;"),
70
- " onResponse?: <K extends ".concat(METHOD_TYPE_MAP_KEYS_NAME, ">(response: ").concat(RESPONSE_CALLBACK_DATA_NAME, "<K>, id: string) => void | Promise<void>;"),
71
- '}',
72
- "\nexport interface ".concat(RESULT_TYPE_NAME, "<T> {"),
73
- ' error: Error | null;',
74
- " response: T | null;",
75
- ' status: number;',
76
- ' statusText: string;',
77
- ' headers?: Record<string, any>;',
78
- '}',
79
- '\nexport class Client {',
80
- " public constructor(private readonly options: ".concat(REQUEST_OPTIONS_NAME, " = {}) {}"),
81
- "\n protected readonly ".concat(REQUEST_METHOD_MAP_NAME, " = new Map<keyof ").concat(METHOD_TYPE_MAP_NAME, ", (...params: any[]) => Promise<unknown>>();"),
82
- "\n protected readonly ".concat(RESPONSE_CACHE_MAP_NAME, " = new Map<string, ").concat(RESULT_TYPE_NAME, "<unknown>>();"),
83
- "\n public createRequest<T extends keyof ".concat(METHOD_TYPE_MAP_NAME, ">(url: T): (requestBody?: ").concat(REQUEST_BODY_TYPE_ANNOTATION, ", options?: ").concat(REQUEST_OPTIONS_NAME, ") => Promise<").concat(RESULT_TYPE_ANNOTATION, "> {"),
84
- " if (typeof this.".concat(REQUEST_METHOD_MAP_NAME, ".get(url) !== 'function') {"),
85
- " this.".concat(REQUEST_METHOD_MAP_NAME, ".set(url, (requestBody?: ").concat(REQUEST_BODY_TYPE_ANNOTATION, ", options?: ").concat(REQUEST_OPTIONS_NAME, ") => this.request.call(this, url, requestBody, options));"),
86
- ' }',
87
- " return this.".concat(REQUEST_METHOD_MAP_NAME, ".get(url) as (requestBody?: ").concat(REQUEST_BODY_TYPE_ANNOTATION, ", options?: ").concat(REQUEST_OPTIONS_NAME, ") => Promise<").concat(RESULT_TYPE_ANNOTATION, ">;"),
88
- ' }',
89
- "\n public async request<T extends keyof ".concat(METHOD_TYPE_MAP_NAME, ">(url: T, requestBody?: ").concat(REQUEST_BODY_TYPE_ANNOTATION, ", options?: Omit<").concat(REQUEST_OPTIONS_NAME, ", 'getAuthorizationCredential' | 'onRequest' | 'onResponse'>): Promise<").concat(RESULT_TYPE_ANNOTATION, "> {"),
90
- ' const id = `${Math.random().toString(32).slice(2)}${Date.now().toString(16)}`;',
91
- ' const requestHash = hash(requestBody ?? null);',
92
- ' const requestBodyString = JSON.stringify(requestBody);',
93
- " const finalOptions = _.merge({}, this?.options, _.omit(options, ['getAuthorizationCredential', 'onRequest', 'onResponse']));",
94
- " const onRequestOptions = _.omit(finalOptions, ['getAuthorizationCredential', 'onRequest', 'onResponse']);",
95
- ' const { getAuthorizationCredential, onResponse, onRequest, ignoreCache, timeout, prefix, ...requestOptions } = finalOptions;',
96
- " if (this.".concat(RESPONSE_CACHE_MAP_NAME, ".has(requestHash) && !ignoreCache) {"),
97
- ' onRequest?.({',
98
- ' prefix,',
99
- ' url,',
100
- ' requestBody: requestBodyString,',
101
- ' cached: true,',
102
- ' options: onRequestOptions,',
103
- ' id,',
104
- ' });',
105
- " return this.".concat(RESPONSE_CACHE_MAP_NAME, ".get(requestHash) as ").concat(RESULT_TYPE_ANNOTATION, ";"),
106
- ' }',
107
- ' onRequest?.({',
108
- ' prefix,',
109
- ' url,',
110
- ' id,',
111
- ' requestBody: requestBodyString,',
112
- ' cached: false,',
113
- ' options: onRequestOptions,',
114
- ' });',
115
- ' const credential = getAuthorizationCredential?.();',
116
- ' const abortController = new AbortController();',
117
- ' if (timeout! > 0) {',
118
- ' setTimeout(() => {',
119
- ' abortController.abort();',
120
- ' }, timeout);',
121
- ' }',
122
- " const result: ".concat(RESULT_TYPE_ANNOTATION, " = await fetch((prefix ?? '') + url, {"),
123
- ' ...requestOptions,',
124
- ' body: JSON.stringify(requestBody),',
125
- " method: 'POST',",
126
- ' signal: abortController.signal,',
127
- ' headers: {',
128
- ' ...requestOptions?.headers,',
129
- " 'Content-Type': 'application/json',",
130
- " Authorization: (typeof credential === 'string' && credential.length > 0) ? credential : finalOptions?.headers?.Authorization,",
131
- ' },',
132
- ' }).then((response) => {',
133
- ' const status = response?.status;',
134
- ' const statusText = response?.statusText;',
135
- ' const headers = Array.from(response?.headers?.entries?.() ?? []).reduce((result, [key, value]) => {',
136
- " if (typeof key !== 'string' || key.length === 0) return result;",
137
- ' result[key] = value;',
138
- ' return result;',
139
- ' }, {});',
140
- ' if (!response?.ok) {',
141
- ' return response.text().then((errorText) => ({ error: new Error(errorText), response: null, headers, status, statusText }));',
142
- ' }',
143
- " return response.json().then((response) => ({ error: null, response, headers, status, statusText } as ".concat(RESULT_TYPE_ANNOTATION, "));"),
144
- " }).catch((error) => Promise.resolve({ error, response: null, headers: {}, status: 0, statusText: '' }));",
145
- " onResponse?.({ url, result }, id);",
146
- " this.".concat(RESPONSE_CACHE_MAP_NAME, ".set(requestHash, result);"),
147
- ' return result;',
148
- ' }',
149
- '}\n',
150
- ].join('\n');
151
- },
152
- };
153
- }
154
- exports.create = create;
@@ -1,3 +0,0 @@
1
- import * as ts from 'typescript';
2
- export declare const DECORATOR_NAME_PREFIX = "\u03A6nt:method:";
3
- export default function transformer(program: ts.Program): ts.TransformerFactory<ts.SourceFile>;
@@ -1,63 +0,0 @@
1
- "use strict";
2
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
3
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4
- if (ar || !(i in from)) {
5
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6
- ar[i] = from[i];
7
- }
8
- }
9
- return to.concat(ar || Array.prototype.slice.call(from));
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.DECORATOR_NAME_PREFIX = void 0;
13
- var ts = require("typescript");
14
- exports.DECORATOR_NAME_PREFIX = 'Φnt:method:';
15
- function transformer(program) {
16
- var checker = program.getTypeChecker();
17
- return function () {
18
- return function (sourceFile) {
19
- var newStatements = [];
20
- var visitNode = function (node) {
21
- var _a;
22
- if (ts.isClassDeclaration(node) && node.name) {
23
- var className = node.name.text;
24
- for (var _i = 0, _b = node.members; _i < _b.length; _i++) {
25
- var member = _b[_i];
26
- if (!ts.isPropertyDeclaration(member) || !member.name)
27
- continue;
28
- if (!ts.isIdentifier(member.name))
29
- continue;
30
- var propName = member.name.text;
31
- var symbol = checker.getSymbolAtLocation(member.name);
32
- if (!symbol)
33
- continue;
34
- var type = checker.getTypeOfSymbolAtLocation(symbol, member);
35
- var callSignatures = type.getCallSignatures();
36
- if (callSignatures.length === 0)
37
- continue;
38
- var returnType = callSignatures[0].getReturnType();
39
- var actualType = returnType;
40
- if (((_a = returnType.symbol) === null || _a === void 0 ? void 0 : _a.getName()) === 'Promise') {
41
- var typeArgs = returnType.typeArguments;
42
- if (typeArgs && typeArgs.length > 0) {
43
- actualType = typeArgs[0];
44
- }
45
- }
46
- var actualTypeStr = checker.typeToString(actualType, undefined, ts.TypeFormatFlags.NoTruncation | ts.TypeFormatFlags.UseFullyQualifiedType);
47
- if (!actualTypeStr || actualTypeStr === 'void' || actualTypeStr === 'any')
48
- continue;
49
- newStatements.push(ts.factory.createExpressionStatement(ts.factory.createCallExpression(ts.factory.createIdentifier('Reflect.defineMetadata'), undefined, [
50
- ts.factory.createStringLiteral("".concat(exports.DECORATOR_NAME_PREFIX).concat(propName)),
51
- ts.factory.createStringLiteral(actualTypeStr),
52
- ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier(className), ts.factory.createIdentifier('prototype')),
53
- ])));
54
- }
55
- }
56
- ts.forEachChild(node, visitNode);
57
- };
58
- ts.forEachChild(sourceFile, visitNode);
59
- return ts.factory.updateSourceFile(sourceFile, __spreadArray(__spreadArray([], sourceFile.statements, true), newStatements, true));
60
- };
61
- };
62
- }
63
- exports.default = transformer;