ag-common 0.0.239 → 0.0.240

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.
@@ -1,3 +1,4 @@
1
+ import { TGetAndValidateToken } from './validations';
1
2
  import { User } from '../../ui/helpers/jwt';
2
3
  import { TLang } from '../../common/helpers/i18n';
3
4
  import { APIGatewayEvent, APIGatewayProxyResult } from '../types';
@@ -8,7 +9,8 @@ export declare type NextType<T> = ({ event, body, params, userProfile, lang, }:
8
9
  userProfile?: User;
9
10
  lang: TLang;
10
11
  }) => Promise<APIGatewayProxyResult>;
11
- export declare function validateOpenApi<T>({ event, next, authorized, schema, COGNITO_USER_POOL_ID, jwksRegion, }: {
12
+ export declare function validateOpenApi<T>({ event, next, authorized, schema, COGNITO_USER_POOL_ID, jwksRegion, getAndValidateTokenOverride, }: {
13
+ getAndValidateTokenOverride?: TGetAndValidateToken;
12
14
  COGNITO_USER_POOL_ID: string;
13
15
  schema: any;
14
16
  event: APIGatewayEvent;
@@ -43,7 +43,7 @@ const getOperation = ({ path, method, resource, schema, }) => {
43
43
  const pathParams = (re === null || re === void 0 ? void 0 : re.groups) && JSON.parse(JSON.stringify(re === null || re === void 0 ? void 0 : re.groups));
44
44
  return { operation, pathParams };
45
45
  };
46
- function validateOpenApi({ event, next, authorized, schema, COGNITO_USER_POOL_ID, jwksRegion = 'ap-southeast-2', }) {
46
+ function validateOpenApi({ event, next, authorized, schema, COGNITO_USER_POOL_ID, jwksRegion = 'ap-southeast-2', getAndValidateTokenOverride, }) {
47
47
  var _a, _b, _c, _d, _e;
48
48
  return __awaiter(this, void 0, void 0, function* () {
49
49
  if (!schema) {
@@ -104,7 +104,8 @@ function validateOpenApi({ event, next, authorized, schema, COGNITO_USER_POOL_ID
104
104
  let error;
105
105
  const authHeader = ((_c = event.headers) === null || _c === void 0 ? void 0 : _c.Authorization) || ((_d = event.headers) === null || _d === void 0 ? void 0 : _d.authorization);
106
106
  if (authorized === true || (authorized === 'optional' && authHeader)) {
107
- ({ error, userProfile } = yield (0, validations_1.getAndValidateToken)({
107
+ const vf = getAndValidateTokenOverride !== null && getAndValidateTokenOverride !== void 0 ? getAndValidateTokenOverride : validations_1.getAndValidateToken;
108
+ ({ error, userProfile } = yield vf({
108
109
  tokenRaw: authHeader,
109
110
  COGNITO_USER_POOL_ID,
110
111
  jwksRegion,
@@ -1,15 +1,16 @@
1
- import { error } from '../../common/helpers/log';
2
1
  import { User } from '../../ui/helpers/jwt';
3
2
  import { APIGatewayProxyResult } from '../types';
4
- export declare const getAndValidateToken: ({ tokenRaw, jwksRegion, COGNITO_USER_POOL_ID, }: {
3
+ export interface IGetAndValidateToken {
5
4
  /**
6
5
  * default ap-southeast-2
7
6
  */
8
- jwksRegion?: string | undefined;
9
- tokenRaw?: string | undefined;
7
+ jwksRegion?: string;
8
+ tokenRaw?: string;
10
9
  COGNITO_USER_POOL_ID: string;
11
- }) => Promise<{
12
- error?: APIGatewayProxyResult | undefined;
13
- token?: string | undefined;
14
- userProfile?: User | undefined;
10
+ }
11
+ export declare type TGetAndValidateToken = (p: IGetAndValidateToken) => Promise<{
12
+ error?: APIGatewayProxyResult;
13
+ token?: string;
14
+ userProfile?: User;
15
15
  }>;
16
+ export declare const getAndValidateToken: TGetAndValidateToken;
@@ -60,3 +60,4 @@ export declare const chunkString: (str: string, length: number) => string[];
60
60
  * @param splitKeys eg &
61
61
  */
62
62
  export declare function stringToObject(raw: string, splitKeyValue: string, splitKeys: string): Record<string, string>;
63
+ export declare const indexOfNumber: (str: string, char: string, num?: number) => number | undefined;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.stringToObject = exports.chunkString = exports.safeStringify = exports.containsInsensitive = exports.containsInsensitiveIndex = exports.replaceRemove = exports.toTitleCase = exports.niceUrl = exports.truncate = exports.trim = exports.trimSide = exports.csvJSON = exports.fromBase64 = exports.toBase64 = void 0;
3
+ exports.indexOfNumber = exports.stringToObject = exports.chunkString = exports.safeStringify = exports.containsInsensitive = exports.containsInsensitiveIndex = exports.replaceRemove = exports.toTitleCase = exports.niceUrl = exports.truncate = exports.trim = exports.trimSide = exports.csvJSON = exports.fromBase64 = exports.toBase64 = void 0;
4
4
  const toBase64 = (str) => Buffer.from(str).toString('base64');
5
5
  exports.toBase64 = toBase64;
6
6
  const fromBase64 = (str) => Buffer.from(decodeURIComponent(str), 'base64').toString();
@@ -186,3 +186,14 @@ function stringToObject(raw, splitKeyValue, splitKeys) {
186
186
  return ret;
187
187
  }
188
188
  exports.stringToObject = stringToObject;
189
+ const indexOfNumber = (str, char, num = 0) => {
190
+ let ret = -1;
191
+ for (let c = 0; c <= num; c += 1) {
192
+ ret = str.indexOf(char, ret + 1);
193
+ }
194
+ if (ret === -1) {
195
+ return undefined;
196
+ }
197
+ return ret;
198
+ };
199
+ exports.indexOfNumber = indexOfNumber;
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import { ICodeBlock } from './types';
3
+ export declare const CodeBlock: <TDefaultApi>(p: ICodeBlock<TDefaultApi>) => JSX.Element;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CodeBlock = void 0;
7
+ const common_1 = require("./helpers/common");
8
+ const FlexRow_1 = require("../FlexRow");
9
+ const react_1 = __importDefault(require("react"));
10
+ const styled_components_1 = __importDefault(require("styled-components"));
11
+ const Base = styled_components_1.default.div `
12
+ display: flex;
13
+ flex-flow: column;
14
+ width: 100%;
15
+ flex-grow: 1;
16
+ border: solid 1px #333;
17
+ margin: 1rem;
18
+ padding: 1rem;
19
+ `;
20
+ const Verb = styled_components_1.default.div `
21
+ background-color: #333;
22
+ color: white;
23
+ margin-right: 0.5rem;
24
+ padding: 0.25rem;
25
+ font-size: 0.8rem;
26
+ `;
27
+ const ApiName = styled_components_1.default.div `
28
+ font-weight: bold;
29
+ font-size: 1.5rem;
30
+ `;
31
+ const BlockTitle = styled_components_1.default.div `
32
+ color: #333;
33
+ font-size: 1.2rem;
34
+ margin-top: 2rem;
35
+ `;
36
+ const Block = styled_components_1.default.div `
37
+ background-color: rgba(0, 0, 0, 0.1);
38
+ padding: 1rem;
39
+ margin-top: 0.5rem;
40
+ `;
41
+ const Curl = styled_components_1.default.div `
42
+ white-space: pre;
43
+ `;
44
+ const CodeBlock = (p) => {
45
+ var _a;
46
+ const { path, verb, error, headerLines, fullApiUrl, bodyLine, operation } = (0, common_1.getLines)(p);
47
+ if (error || !verb) {
48
+ return react_1.default.createElement(Base, null, error);
49
+ }
50
+ return (react_1.default.createElement(Base, null,
51
+ react_1.default.createElement(FlexRow_1.FlexRow, { center: true },
52
+ react_1.default.createElement(Verb, null, verb),
53
+ react_1.default.createElement(ApiName, null, (_a = operation.description) !== null && _a !== void 0 ? _a : path)),
54
+ react_1.default.createElement(BlockTitle, null, "Definition"),
55
+ react_1.default.createElement(Block, null,
56
+ verb.toUpperCase(),
57
+ " ",
58
+ path),
59
+ react_1.default.createElement(BlockTitle, null, "Example Request"),
60
+ react_1.default.createElement(Block, null,
61
+ react_1.default.createElement(Curl, null,
62
+ "curl --request ",
63
+ verb.toUpperCase(),
64
+ "\u00A0\\",
65
+ react_1.default.createElement("br", null),
66
+ "--url ",
67
+ react_1.default.createElement(common_1.Highlight, null,
68
+ "'",
69
+ fullApiUrl,
70
+ "'"),
71
+ "\u00A0\\",
72
+ react_1.default.createElement("br", null),
73
+ react_1.default.createElement(react_1.default.Fragment, null, headerLines),
74
+ react_1.default.createElement("br", null),
75
+ bodyLine))));
76
+ };
77
+ exports.CodeBlock = CodeBlock;
@@ -0,0 +1,21 @@
1
+ /// <reference types="react" />
2
+ import { ICodeBlock } from '../types';
3
+ export declare const Highlight: import("styled-components").StyledComponent<"span", any, {}, never>;
4
+ export declare const Highlight2: import("styled-components").StyledComponent<"span", any, {}, never>;
5
+ export declare const getLines: <TDefaultApi>(p: ICodeBlock<TDefaultApi>) => {
6
+ error: string;
7
+ verb?: undefined;
8
+ path?: undefined;
9
+ headerLines?: undefined;
10
+ fullApiUrl?: undefined;
11
+ bodyLine?: undefined;
12
+ operation?: undefined;
13
+ } | {
14
+ verb: string | undefined;
15
+ path: string | undefined;
16
+ error: undefined;
17
+ headerLines: JSX.Element[];
18
+ fullApiUrl: any;
19
+ bodyLine: JSX.Element;
20
+ operation: any;
21
+ };
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getLines = exports.Highlight2 = exports.Highlight = void 0;
7
+ const security_1 = require("./security");
8
+ const string_1 = require("../../../../common/helpers/string");
9
+ const styled_components_1 = __importDefault(require("styled-components"));
10
+ const react_1 = __importDefault(require("react"));
11
+ exports.Highlight = styled_components_1.default.span `
12
+ color: green;
13
+ `;
14
+ exports.Highlight2 = styled_components_1.default.span `
15
+ color: indianred;
16
+ `;
17
+ const getApiUrl = (p) => {
18
+ return p.schema.servers[0].url;
19
+ };
20
+ const getFunctionName = (p) => {
21
+ let ret = p.funcF.toString();
22
+ const i1 = ret.indexOf('.') + 1;
23
+ const i2 = (0, string_1.indexOfNumber)(ret, '(', 1);
24
+ ret = ret.substring(i1, i2);
25
+ return ret;
26
+ };
27
+ const getOperation = (p) => {
28
+ let path;
29
+ let verb;
30
+ const func = getFunctionName(p);
31
+ Object.entries(p.schema.paths).forEach(([pathN, ops]) =>
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ Object.entries(ops).forEach(([verbN, op]) => {
34
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
+ if (op.operationId === func) {
36
+ path = pathN;
37
+ verb = verbN;
38
+ }
39
+ }));
40
+ if (!path || !verb) {
41
+ return { error: 'operation not found' };
42
+ }
43
+ const operation = p.schema.paths[path][verb];
44
+ return { operation, verb, path };
45
+ };
46
+ const getBody = (p) => {
47
+ const body = p.funcF.toString();
48
+ const bstart = (0, string_1.indexOfNumber)(body, '(', 1);
49
+ const bend = !bstart ? undefined : body.lastIndexOf(')');
50
+ if (!bstart || !bend) {
51
+ return { content: react_1.default.createElement(react_1.default.Fragment, null), header: react_1.default.createElement(react_1.default.Fragment, null) };
52
+ }
53
+ const slice = body.substring(bstart + 1, bend);
54
+ const json = slice.replace(/([a-zA-Z0-9-]+[^"]):/gim, '"$1":');
55
+ const nice = JSON.stringify(JSON.parse(json), null, 2);
56
+ const content = (react_1.default.createElement(react_1.default.Fragment, null,
57
+ "-d @- <<'EOF'",
58
+ react_1.default.createElement("br", null),
59
+ react_1.default.createElement(exports.Highlight2, null, nice),
60
+ react_1.default.createElement("br", null),
61
+ "EOF"));
62
+ const header = (react_1.default.createElement(react_1.default.Fragment, null,
63
+ react_1.default.createElement("span", null, "--header "),
64
+ react_1.default.createElement(exports.Highlight, null,
65
+ react_1.default.createElement(exports.Highlight, null, "'Content-Type: application/json'"))));
66
+ return {
67
+ content,
68
+ header,
69
+ };
70
+ };
71
+ const getLines = (p) => {
72
+ var _a, _b;
73
+ const ops = getOperation(p);
74
+ if (ops.error) {
75
+ return { error: ops.error };
76
+ }
77
+ const { operation, path, verb } = ops;
78
+ const apiUrl = getApiUrl(p);
79
+ const fullApiUrl = apiUrl + path;
80
+ const secline = (0, security_1.getSecurityLine)(p, { operation });
81
+ if (secline.error) {
82
+ return { error: secline.error };
83
+ }
84
+ const bodyLines = (_a = getBody(p)) !== null && _a !== void 0 ? _a : undefined;
85
+ const headerLines = [];
86
+ if (secline.content) {
87
+ headerLines.push(secline.content);
88
+ headerLines.push(react_1.default.createElement(react_1.default.Fragment, null,
89
+ ' ',
90
+ "\\",
91
+ react_1.default.createElement("br", null)));
92
+ }
93
+ if (bodyLines.header) {
94
+ headerLines.push(bodyLines.header);
95
+ headerLines.push(react_1.default.createElement(react_1.default.Fragment, null, " \\"));
96
+ }
97
+ return {
98
+ verb,
99
+ path,
100
+ error: undefined,
101
+ headerLines,
102
+ fullApiUrl,
103
+ bodyLine: (_b = bodyLines === null || bodyLines === void 0 ? void 0 : bodyLines.content) !== null && _b !== void 0 ? _b : undefined,
104
+ operation,
105
+ };
106
+ };
107
+ exports.getLines = getLines;
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { ICodeBlock } from '../types';
3
+ export declare const getSecurityLine: <TDefaultApi>(p: ICodeBlock<TDefaultApi>, { operation }: {
4
+ operation: any;
5
+ }) => {
6
+ error?: string;
7
+ content: JSX.Element;
8
+ };
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getSecurityLine = void 0;
7
+ const common_1 = require("./common");
8
+ const string_1 = require("../../../../common/helpers/string");
9
+ const react_1 = __importDefault(require("react"));
10
+ const getSecurityLine = (p,
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ { operation }) => {
13
+ var _a;
14
+ const security1 = (_a = operation.security) === null || _a === void 0 ? void 0 : _a[0];
15
+ const security2 = !security1 ? undefined : Object.keys(security1)[0];
16
+ const security = !security2
17
+ ? undefined
18
+ : p.schema.components.securitySchemes[security2];
19
+ if (security) {
20
+ if (security.in !== 'header') {
21
+ return { error: 'not supported sec in', content: react_1.default.createElement(react_1.default.Fragment, null) };
22
+ }
23
+ return {
24
+ content: (react_1.default.createElement(react_1.default.Fragment, null,
25
+ react_1.default.createElement("span", null, "--header "),
26
+ react_1.default.createElement(common_1.Highlight, null,
27
+ "'",
28
+ (0, string_1.toTitleCase)(security.name),
29
+ ":",
30
+ ' ',
31
+ react_1.default.createElement(common_1.Highlight2, null, p.apiKey || '(API KEY)'),
32
+ "'"))),
33
+ };
34
+ }
35
+ return { content: react_1.default.createElement(react_1.default.Fragment, null) };
36
+ };
37
+ exports.getSecurityLine = getSecurityLine;
@@ -0,0 +1,2 @@
1
+ export * from './CodeBlock';
2
+ export * from './types';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./CodeBlock"), exports);
18
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,9 @@
1
+ export interface ICodeBlock<TDefaultApi> {
2
+ /**
3
+ * openapi schema. eg
4
+ * const schema: any = require('common/openapi.generated').default;
5
+ */
6
+ schema: any;
7
+ apiKey?: string;
8
+ funcF: (f: TDefaultApi) => Promise<any>;
9
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -2,12 +2,14 @@ export * from './BorderGradient';
2
2
  export * from './Button';
3
3
  export * from './Chevron';
4
4
  export * from './Close';
5
+ export * from './CodeBlock';
5
6
  export * from './Confirm/Dialog';
6
7
  export * from './DropdownList';
7
8
  export * from './FlexColumn';
8
9
  export * from './FlexRow';
9
10
  export * from './HeadersRaw';
10
11
  export * from './Icon';
12
+ export * from './KebabDots';
11
13
  export * from './Loader';
12
14
  export * from './LoginButton';
13
15
  export * from './LogoutButton';
@@ -18,12 +18,14 @@ __exportStar(require("./BorderGradient"), exports);
18
18
  __exportStar(require("./Button"), exports);
19
19
  __exportStar(require("./Chevron"), exports);
20
20
  __exportStar(require("./Close"), exports);
21
+ __exportStar(require("./CodeBlock"), exports);
21
22
  __exportStar(require("./Confirm/Dialog"), exports);
22
23
  __exportStar(require("./DropdownList"), exports);
23
24
  __exportStar(require("./FlexColumn"), exports);
24
25
  __exportStar(require("./FlexRow"), exports);
25
26
  __exportStar(require("./HeadersRaw"), exports);
26
27
  __exportStar(require("./Icon"), exports);
28
+ __exportStar(require("./KebabDots"), exports);
27
29
  __exportStar(require("./Loader"), exports);
28
30
  __exportStar(require("./LoginButton"), exports);
29
31
  __exportStar(require("./LogoutButton"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ag-common",
3
- "version": "0.0.239",
3
+ "version": "0.0.240",
4
4
  "main": "./dist/index.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "author": "Andrei Gec <@andreigec> (https://gec.dev/)",