@ioka-technologies/asyncapi-ts-client-template 0.0.21 → 0.0.22
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/common/index.js +2004 -0
- package/examples/test-sanitization/asyncapi.yaml +142 -0
- package/package.json +10 -3
- package/template/dist/common/index.js +2004 -0
- package/template/helpers/security.js +20 -73
- package/template/helpers/security.js.dev +84 -0
- package/template/index.js +4 -4
- package/template/src/client.ts.js +2 -2
- package/template/src/index.ts.js +1 -1
- package/template/src/models.ts.js +2 -2
- package/template/src/runtime/auth/headers.ts.js +2 -2
- package/template/src/runtime/auth/index.ts.js +2 -2
- package/template/src/runtime/auth/types.ts.js +2 -2
- package/template/src/runtime/errors.ts.js +1 -1
- package/template/src/runtime/retry/index.ts.js +2 -2
- package/template/src/runtime/retry/manager.ts.js +2 -2
- package/template/src/runtime/retry/presets.ts.js +2 -2
- package/template/src/runtime/retry/types.ts.js +2 -2
- package/template/src/runtime/transports/factory.ts.js +1 -1
- package/template/src/runtime/transports/http.ts.js +2 -2
- package/template/src/runtime/transports/websocket.ts.js +2 -2
- package/template/src/runtime/types.ts.js +2 -2
|
@@ -1,78 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Security analysis helper functions for TypeScript client template
|
|
3
|
-
*
|
|
3
|
+
* Most common security utilities have been moved to the shared @common package.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
*/
|
|
12
|
-
export function analyzeOperationSecurity(operation) {
|
|
13
|
-
try {
|
|
14
|
-
// Check AsyncAPI security field
|
|
15
|
-
const security = operation.security && operation.security();
|
|
16
|
-
if (security && Array.isArray(security) && security.length > 0) {
|
|
17
|
-
return {
|
|
18
|
-
hasSecurityRequirements: true,
|
|
19
|
-
securitySchemes: security,
|
|
20
|
-
requiresAuthentication: true
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// Check if operation has security defined in AsyncAPI spec
|
|
25
|
-
const operationJson = operation._json || operation;
|
|
26
|
-
if (operationJson.security && Array.isArray(operationJson.security) && operationJson.security.length > 0) {
|
|
27
|
-
return {
|
|
28
|
-
hasSecurityRequirements: true,
|
|
29
|
-
securitySchemes: operationJson.security,
|
|
30
|
-
requiresAuthentication: true
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return {
|
|
35
|
-
hasSecurityRequirements: false,
|
|
36
|
-
securitySchemes: [],
|
|
37
|
-
requiresAuthentication: false
|
|
38
|
-
};
|
|
39
|
-
} catch (e) {
|
|
40
|
-
return {
|
|
41
|
-
hasSecurityRequirements: false,
|
|
42
|
-
securitySchemes: [],
|
|
43
|
-
requiresAuthentication: false
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Checks if an operation has security requirements
|
|
50
|
-
*
|
|
51
|
-
* @param {object} operation - AsyncAPI operation object
|
|
52
|
-
* @returns {boolean} True if operation has security requirements
|
|
53
|
-
*/
|
|
54
|
-
export function operationRequiresAuth(operation) {
|
|
55
|
-
const analysis = analyzeOperationSecurity(operation);
|
|
56
|
-
return analysis.hasSecurityRequirements;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Checks if the AsyncAPI specification has security schemes defined
|
|
61
|
-
*
|
|
62
|
-
* @param {object} asyncapi - AsyncAPI specification object
|
|
63
|
-
* @returns {boolean} True if security schemes are present
|
|
64
|
-
*/
|
|
65
|
-
export function hasSecuritySchemes(asyncapi) {
|
|
66
|
-
try {
|
|
67
|
-
const components = asyncapi.components();
|
|
68
|
-
if (!components) return false;
|
|
69
|
-
|
|
70
|
-
const securitySchemes = components.securitySchemes();
|
|
71
|
-
return securitySchemes && Object.keys(securitySchemes).length > 0;
|
|
72
|
-
} catch (e) {
|
|
73
|
-
return false;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
6
|
+
import {
|
|
7
|
+
analyzeOperationSecurity,
|
|
8
|
+
operationHasSecurity,
|
|
9
|
+
hasSecuritySchemes
|
|
10
|
+
} from '../dist/common/index.js';
|
|
76
11
|
|
|
77
12
|
/**
|
|
78
13
|
* Get security scheme type from AsyncAPI security scheme definition
|
|
@@ -80,7 +15,7 @@ export function hasSecuritySchemes(asyncapi) {
|
|
|
80
15
|
* @param {object} securityScheme - AsyncAPI security scheme object
|
|
81
16
|
* @returns {string} Security scheme type ('jwt', 'basic', 'apikey', etc.)
|
|
82
17
|
*/
|
|
83
|
-
|
|
18
|
+
function getSecuritySchemeType(securityScheme) {
|
|
84
19
|
try {
|
|
85
20
|
if (securityScheme.type && typeof securityScheme.type === 'function') {
|
|
86
21
|
return securityScheme.type();
|
|
@@ -103,7 +38,7 @@ export function getSecuritySchemeType(securityScheme) {
|
|
|
103
38
|
* @param {object} asyncapi - AsyncAPI specification object
|
|
104
39
|
* @returns {object} Map of operation names to their security requirements
|
|
105
40
|
*/
|
|
106
|
-
|
|
41
|
+
function extractOperationSecurityMap(asyncapi) {
|
|
107
42
|
const securityMap = {};
|
|
108
43
|
|
|
109
44
|
try {
|
|
@@ -135,3 +70,15 @@ export function extractOperationSecurityMap(asyncapi) {
|
|
|
135
70
|
|
|
136
71
|
return securityMap;
|
|
137
72
|
}
|
|
73
|
+
|
|
74
|
+
// Export all functions
|
|
75
|
+
export {
|
|
76
|
+
// Re-export common security utilities for backward compatibility
|
|
77
|
+
analyzeOperationSecurity,
|
|
78
|
+
operationHasSecurity as operationRequiresAuth,
|
|
79
|
+
hasSecuritySchemes,
|
|
80
|
+
|
|
81
|
+
// TypeScript client specific functions
|
|
82
|
+
getSecuritySchemeType,
|
|
83
|
+
extractOperationSecurityMap
|
|
84
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security analysis helper functions for TypeScript client template
|
|
3
|
+
* Most common security utilities have been moved to the shared @common package.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
analyzeOperationSecurity,
|
|
8
|
+
operationHasSecurity,
|
|
9
|
+
hasSecuritySchemes
|
|
10
|
+
} from '../../../common/src/index.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Get security scheme type from AsyncAPI security scheme definition
|
|
14
|
+
*
|
|
15
|
+
* @param {object} securityScheme - AsyncAPI security scheme object
|
|
16
|
+
* @returns {string} Security scheme type ('jwt', 'basic', 'apikey', etc.)
|
|
17
|
+
*/
|
|
18
|
+
function getSecuritySchemeType(securityScheme) {
|
|
19
|
+
try {
|
|
20
|
+
if (securityScheme.type && typeof securityScheme.type === 'function') {
|
|
21
|
+
return securityScheme.type();
|
|
22
|
+
}
|
|
23
|
+
if (securityScheme.type) {
|
|
24
|
+
return securityScheme.type;
|
|
25
|
+
}
|
|
26
|
+
if (securityScheme._json && securityScheme._json.type) {
|
|
27
|
+
return securityScheme._json.type;
|
|
28
|
+
}
|
|
29
|
+
return 'unknown';
|
|
30
|
+
} catch (e) {
|
|
31
|
+
return 'unknown';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Extract security requirements for all operations in the AsyncAPI spec
|
|
37
|
+
*
|
|
38
|
+
* @param {object} asyncapi - AsyncAPI specification object
|
|
39
|
+
* @returns {object} Map of operation names to their security requirements
|
|
40
|
+
*/
|
|
41
|
+
function extractOperationSecurityMap(asyncapi) {
|
|
42
|
+
const securityMap = {};
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
const operations = asyncapi.operations && asyncapi.operations();
|
|
46
|
+
if (operations) {
|
|
47
|
+
// Handle AsyncAPI parser collection - use .all() method to get array
|
|
48
|
+
const operationArray = operations.all ? operations.all() : Object.values(operations);
|
|
49
|
+
|
|
50
|
+
operationArray.forEach((operation) => {
|
|
51
|
+
// Get operation ID
|
|
52
|
+
let operationId = null;
|
|
53
|
+
if (operation._meta && operation._meta.id) {
|
|
54
|
+
operationId = operation._meta.id;
|
|
55
|
+
} else if (operation.id && typeof operation.id === 'function') {
|
|
56
|
+
operationId = operation.id();
|
|
57
|
+
} else if (operation.id) {
|
|
58
|
+
operationId = operation.id;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (operationId) {
|
|
62
|
+
const securityAnalysis = analyzeOperationSecurity(operation);
|
|
63
|
+
securityMap[operationId] = securityAnalysis;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
} catch (e) {
|
|
68
|
+
console.warn('Error extracting operation security map:', e.message);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return securityMap;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Export all functions
|
|
75
|
+
export {
|
|
76
|
+
// Re-export common security utilities for backward compatibility
|
|
77
|
+
analyzeOperationSecurity,
|
|
78
|
+
operationHasSecurity as operationRequiresAuth,
|
|
79
|
+
hasSecuritySchemes,
|
|
80
|
+
|
|
81
|
+
// TypeScript client specific functions
|
|
82
|
+
getSecuritySchemeType,
|
|
83
|
+
extractOperationSecurityMap
|
|
84
|
+
};
|
package/template/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { File } from '@asyncapi/generator-react-sdk';
|
|
2
|
+
import React from 'react';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export default function ({ asyncapi, params }) {
|
|
5
5
|
// Extract info from AsyncAPI spec
|
|
6
6
|
let title, version, description;
|
|
7
7
|
try {
|
|
@@ -272,4 +272,4 @@ ${params.license || 'Apache-2.0'}
|
|
|
272
272
|
`
|
|
273
273
|
)
|
|
274
274
|
];
|
|
275
|
-
}
|
|
275
|
+
}
|
|
@@ -806,7 +806,7 @@ export default ${clientName};
|
|
|
806
806
|
return content;
|
|
807
807
|
}
|
|
808
808
|
|
|
809
|
-
|
|
809
|
+
export default function ({ asyncapi, params }) {
|
|
810
810
|
const title = asyncapi.info().title();
|
|
811
811
|
|
|
812
812
|
// Always use the processed title, ignore params.clientName if it contains template variables
|
|
@@ -824,4 +824,4 @@ module.exports = function ({ asyncapi, params }) {
|
|
|
824
824
|
{generatedContent}
|
|
825
825
|
</File>
|
|
826
826
|
);
|
|
827
|
-
}
|
|
827
|
+
}
|
package/template/src/index.ts.js
CHANGED
|
@@ -369,10 +369,10 @@ function generateModels(asyncapi) {
|
|
|
369
369
|
return content;
|
|
370
370
|
}
|
|
371
371
|
|
|
372
|
-
|
|
372
|
+
export default function ({ asyncapi, params }) {
|
|
373
373
|
return (
|
|
374
374
|
<File name="models.ts">
|
|
375
375
|
{generateModels(asyncapi)}
|
|
376
376
|
</File>
|
|
377
377
|
);
|
|
378
|
-
}
|
|
378
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
|
2
2
|
import { File } from '@asyncapi/generator-react-sdk';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export default function ({ asyncapi, params }) {
|
|
5
5
|
return (
|
|
6
6
|
<File name="headers.ts">
|
|
7
7
|
{`import { AuthCredentials, AuthError } from './types';
|
|
@@ -92,4 +92,4 @@ export function getAuthType(auth: AuthCredentials): string | null {
|
|
|
92
92
|
`}
|
|
93
93
|
</File>
|
|
94
94
|
);
|
|
95
|
-
}
|
|
95
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
|
2
2
|
import { File } from '@asyncapi/generator-react-sdk';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export default function ({ asyncapi, params }) {
|
|
5
5
|
return (
|
|
6
6
|
<File name="index.ts">
|
|
7
7
|
{`// Auth types and interfaces
|
|
@@ -12,4 +12,4 @@ export * from './headers';
|
|
|
12
12
|
`}
|
|
13
13
|
</File>
|
|
14
14
|
);
|
|
15
|
-
}
|
|
15
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
|
2
2
|
import { File } from '@asyncapi/generator-react-sdk';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export default function ({ asyncapi, params }) {
|
|
5
5
|
return (
|
|
6
6
|
<File name="types.ts">
|
|
7
7
|
{`/**
|
|
@@ -71,4 +71,4 @@ export interface SecurityRequirement {
|
|
|
71
71
|
`}
|
|
72
72
|
</File>
|
|
73
73
|
);
|
|
74
|
-
}
|
|
74
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
|
2
2
|
import { File } from '@asyncapi/generator-react-sdk';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export default function ({ asyncapi, params }) {
|
|
5
5
|
return (
|
|
6
6
|
<File name="errors.ts">
|
|
7
7
|
{`export class TransportError extends Error {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
|
2
2
|
import { File } from '@asyncapi/generator-react-sdk';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export default function ({ asyncapi, params }) {
|
|
5
5
|
return (
|
|
6
6
|
<File name="index.ts">
|
|
7
7
|
{`// Retry types and interfaces
|
|
@@ -15,4 +15,4 @@ export * from './manager';
|
|
|
15
15
|
`}
|
|
16
16
|
</File>
|
|
17
17
|
);
|
|
18
|
-
}
|
|
18
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
|
2
2
|
import { File } from '@asyncapi/generator-react-sdk';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export default function ({ asyncapi, params }) {
|
|
5
5
|
return (
|
|
6
6
|
<File name="manager.ts">
|
|
7
7
|
{`import { RetryConfig, RetryEventCallbacks, MaxRetriesExceededError } from './types';
|
|
@@ -147,4 +147,4 @@ export function createRetryManager(
|
|
|
147
147
|
`}
|
|
148
148
|
</File>
|
|
149
149
|
);
|
|
150
|
-
}
|
|
150
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
|
2
2
|
import { File } from '@asyncapi/generator-react-sdk';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export default function ({ asyncapi, params }) {
|
|
5
5
|
return (
|
|
6
6
|
<File name="presets.ts">
|
|
7
7
|
{`import { RetryConfig, RetryPreset } from './types';
|
|
@@ -78,4 +78,4 @@ export function mergeRetryConfig(preset: RetryPreset, overrides: Partial<RetryCo
|
|
|
78
78
|
`}
|
|
79
79
|
</File>
|
|
80
80
|
);
|
|
81
|
-
}
|
|
81
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
|
2
2
|
import { File } from '@asyncapi/generator-react-sdk';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export default function ({ asyncapi, params }) {
|
|
5
5
|
return (
|
|
6
6
|
<File name="types.ts">
|
|
7
7
|
{`/**
|
|
@@ -57,4 +57,4 @@ export class MaxRetriesExceededError extends RetryError {
|
|
|
57
57
|
`}
|
|
58
58
|
</File>
|
|
59
59
|
);
|
|
60
|
-
}
|
|
60
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
|
2
2
|
import { File } from '@asyncapi/generator-react-sdk';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export default function ({ asyncapi, params }) {
|
|
5
5
|
const transports = (params.transports || 'websocket,http').split(',').map(t => t.trim());
|
|
6
6
|
|
|
7
7
|
let imports = `import { Transport, TransportConfig } from '../types';\n`;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
|
2
2
|
import { File } from '@asyncapi/generator-react-sdk';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export default function ({ asyncapi, params }) {
|
|
5
5
|
const transports = (params.transports || 'websocket,http').split(',').map(t => t.trim());
|
|
6
6
|
|
|
7
7
|
if (!transports.includes('http')) {
|
|
@@ -214,4 +214,4 @@ export class HttpTransport implements Transport {
|
|
|
214
214
|
}`}
|
|
215
215
|
</File>
|
|
216
216
|
);
|
|
217
|
-
}
|
|
217
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
|
2
2
|
import { File } from '@asyncapi/generator-react-sdk';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export default function ({ asyncapi, params }) {
|
|
5
5
|
const transports = (params.transports || 'websocket,http').split(',').map(t => t.trim());
|
|
6
6
|
|
|
7
7
|
if (!transports.includes('websocket')) {
|
|
@@ -402,4 +402,4 @@ export class WebSocketTransport implements Transport {
|
|
|
402
402
|
}`}
|
|
403
403
|
</File>
|
|
404
404
|
);
|
|
405
|
-
}
|
|
405
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable no-unused-vars */
|
|
2
2
|
import { File } from '@asyncapi/generator-react-sdk';
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
export default function ({ asyncapi, params }) {
|
|
5
5
|
return (
|
|
6
6
|
<File name="types.ts">
|
|
7
7
|
{`import { AuthCredentials, AuthEventCallbacks } from './auth';
|
|
@@ -81,4 +81,4 @@ export type UnsubscribeFunction = () => void;
|
|
|
81
81
|
export type EnvelopeCallback = (envelope: MessageEnvelope) => void;`}
|
|
82
82
|
</File>
|
|
83
83
|
);
|
|
84
|
-
}
|
|
84
|
+
}
|