klasik 1.0.28 → 1.0.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.
@@ -19,7 +19,13 @@
19
19
  "WebFetch(domain:json.schemastore.org)",
20
20
  "Bash(node dist/cli.js:*)",
21
21
  "Bash(curl:*)",
22
- "Bash(node --input-type=module -e:*)"
22
+ "Bash(node --input-type=module -e:*)",
23
+ "Bash(while read f)",
24
+ "Bash(do if grep -q '\"\"\"\"vendorExtensions\"\"\"\": {}$' $f)",
25
+ "Bash(then echo $f)",
26
+ "Bash(fi)",
27
+ "Bash(done)",
28
+ "Bash(node -e:*)"
23
29
  ]
24
30
  }
25
31
  }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Fixes malformed attributeTypeMap arrays in generated TypeScript files
3
+ *
4
+ * openapi-class-transformer sometimes generates attributeTypeMap arrays
5
+ * with missing closing braces, especially when there's only a single entry.
6
+ *
7
+ * This utility fixes:
8
+ * - "vendorExtensions": {}\n]; -> "vendorExtensions": {}\n}\n];
9
+ */
10
+ export declare class AttributeTypeMapFixer {
11
+ /**
12
+ * Fix all TypeScript files in a directory recursively
13
+ */
14
+ fixDirectory(directory: string): Promise<void>;
15
+ /**
16
+ * Fix a single file
17
+ * @returns true if file was modified, false otherwise
18
+ */
19
+ private fixFile;
20
+ /**
21
+ * Fix missing closing braces in attributeTypeMap arrays
22
+ *
23
+ * Pattern to fix:
24
+ * "vendorExtensions": {}
25
+ * ]; // ❌ Missing }
26
+ *
27
+ * Should be:
28
+ * "vendorExtensions": {}
29
+ * } // ✅ Added closing brace
30
+ * ];
31
+ */
32
+ private fixMissingClosingBraces;
33
+ /**
34
+ * Get all TypeScript files in a directory recursively
35
+ */
36
+ private getAllTsFiles;
37
+ }
@@ -0,0 +1,135 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.AttributeTypeMapFixer = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ /**
40
+ * Fixes malformed attributeTypeMap arrays in generated TypeScript files
41
+ *
42
+ * openapi-class-transformer sometimes generates attributeTypeMap arrays
43
+ * with missing closing braces, especially when there's only a single entry.
44
+ *
45
+ * This utility fixes:
46
+ * - "vendorExtensions": {}\n]; -> "vendorExtensions": {}\n}\n];
47
+ */
48
+ class AttributeTypeMapFixer {
49
+ /**
50
+ * Fix all TypeScript files in a directory recursively
51
+ */
52
+ async fixDirectory(directory) {
53
+ console.log('Fixing attributeTypeMap arrays...');
54
+ const files = this.getAllTsFiles(directory);
55
+ let fixedCount = 0;
56
+ for (const file of files) {
57
+ const fixed = await this.fixFile(file);
58
+ if (fixed) {
59
+ fixedCount++;
60
+ }
61
+ }
62
+ console.log(`✅ Fixed attributeTypeMap in ${fixedCount} file(s)`);
63
+ }
64
+ /**
65
+ * Fix a single file
66
+ * @returns true if file was modified, false otherwise
67
+ */
68
+ async fixFile(filePath) {
69
+ try {
70
+ let content = fs.readFileSync(filePath, 'utf8');
71
+ const originalContent = content;
72
+ // Fix missing closing braces in attributeTypeMap
73
+ content = this.fixMissingClosingBraces(content);
74
+ // Only write if content changed
75
+ if (content !== originalContent) {
76
+ fs.writeFileSync(filePath, content, 'utf8');
77
+ return true;
78
+ }
79
+ return false;
80
+ }
81
+ catch (error) {
82
+ console.warn(`Warning: Failed to process ${filePath}:`, error);
83
+ return false;
84
+ }
85
+ }
86
+ /**
87
+ * Fix missing closing braces in attributeTypeMap arrays
88
+ *
89
+ * Pattern to fix:
90
+ * "vendorExtensions": {}
91
+ * ]; // ❌ Missing }
92
+ *
93
+ * Should be:
94
+ * "vendorExtensions": {}
95
+ * } // ✅ Added closing brace
96
+ * ];
97
+ */
98
+ fixMissingClosingBraces(content) {
99
+ // Look for: "vendorExtensions": {} followed by whitespace and ];
100
+ // Replace with: "vendorExtensions": {} followed by }, then ];
101
+ // Pattern explanation:
102
+ // - ("vendorExtensions":\s*\{\}) - match "vendorExtensions": {}
103
+ // - (\s*) - capture whitespace after vendorExtensions
104
+ // - (?=\];) - positive lookahead for ]; (don't consume it)
105
+ return content.replace(/("vendorExtensions":\s*\{\})(\s*)(?=\];)/g, (match, vendorExtensions, whitespace) => {
106
+ // Add closing brace before the ];
107
+ // Keep the whitespace, add }, then the whitespace before ];
108
+ return `${vendorExtensions}\n }`;
109
+ });
110
+ }
111
+ /**
112
+ * Get all TypeScript files in a directory recursively
113
+ */
114
+ getAllTsFiles(directory) {
115
+ const files = [];
116
+ const walk = (dir) => {
117
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
118
+ for (const entry of entries) {
119
+ const fullPath = path.join(dir, entry.name);
120
+ if (entry.isDirectory()) {
121
+ // Skip node_modules and hidden directories
122
+ if (entry.name !== 'node_modules' && !entry.name.startsWith('.')) {
123
+ walk(fullPath);
124
+ }
125
+ }
126
+ else if (entry.isFile() && entry.name.endsWith('.ts')) {
127
+ files.push(fullPath);
128
+ }
129
+ }
130
+ };
131
+ walk(directory);
132
+ return files;
133
+ }
134
+ }
135
+ exports.AttributeTypeMapFixer = AttributeTypeMapFixer;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export { OpenAPIClientGenerator, OpenAPIClientGeneratorOptions, GenerationMode } from './openapi-client-generator';
2
2
  export { SpecDownloader, DownloadOptions } from './spec-downloader';
3
3
  export { EsmFixer } from './esm-fixer';
4
+ export { AttributeTypeMapFixer } from './attribute-typemap-fixer';
4
5
  export { CRDGenerator, CRDGeneratorOptions } from './crd/crd-generator';
5
6
  export { CRDParser } from './crd/crd-parser';
6
7
  export { CRDToOpenAPIConverter, ConversionOptions } from './crd/crd-to-openapi';
package/dist/index.js CHANGED
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.JSONSchemaToOpenAPIConverter = exports.JSONSchemaParser = exports.JSONSchemaGenerator = exports.CRDToOpenAPIConverter = exports.CRDParser = exports.CRDGenerator = exports.EsmFixer = exports.SpecDownloader = exports.OpenAPIClientGenerator = void 0;
3
+ exports.JSONSchemaToOpenAPIConverter = exports.JSONSchemaParser = exports.JSONSchemaGenerator = exports.CRDToOpenAPIConverter = exports.CRDParser = exports.CRDGenerator = exports.AttributeTypeMapFixer = exports.EsmFixer = exports.SpecDownloader = exports.OpenAPIClientGenerator = void 0;
4
4
  var openapi_client_generator_1 = require("./openapi-client-generator");
5
5
  Object.defineProperty(exports, "OpenAPIClientGenerator", { enumerable: true, get: function () { return openapi_client_generator_1.OpenAPIClientGenerator; } });
6
6
  var spec_downloader_1 = require("./spec-downloader");
7
7
  Object.defineProperty(exports, "SpecDownloader", { enumerable: true, get: function () { return spec_downloader_1.SpecDownloader; } });
8
8
  var esm_fixer_1 = require("./esm-fixer");
9
9
  Object.defineProperty(exports, "EsmFixer", { enumerable: true, get: function () { return esm_fixer_1.EsmFixer; } });
10
+ var attribute_typemap_fixer_1 = require("./attribute-typemap-fixer");
11
+ Object.defineProperty(exports, "AttributeTypeMapFixer", { enumerable: true, get: function () { return attribute_typemap_fixer_1.AttributeTypeMapFixer; } });
10
12
  // CRD generation exports
11
13
  var crd_generator_1 = require("./crd/crd-generator");
12
14
  Object.defineProperty(exports, "CRDGenerator", { enumerable: true, get: function () { return crd_generator_1.CRDGenerator; } });
@@ -10,6 +10,8 @@
10
10
  * backticks within the text
11
11
  * 3. Undefined descriptions: Some decorators have description: undefined
12
12
  * instead of empty strings
13
+ * 4. Invalid complex object types: Uses invalid arrow function syntax for
14
+ * dictionary types (type: () => [{ [key: string]: any; }])
13
15
  *
14
16
  * This utility transforms:
15
17
  * - type: 'string' -> type: String
@@ -18,6 +20,7 @@
18
20
  * - type: () => [string] -> type: [String]
19
21
  * - type: () => [number] -> type: [Number]
20
22
  * - type: () => [boolean] -> type: [Boolean]
23
+ * - type: () => [{ [key: string]: any; }] -> type: 'object'
21
24
  * - description: `text `code` here` -> description: `text \`code\` here`
22
25
  * - description: undefined -> description: ''
23
26
  *
@@ -48,6 +48,8 @@ const path = __importStar(require("path"));
48
48
  * backticks within the text
49
49
  * 3. Undefined descriptions: Some decorators have description: undefined
50
50
  * instead of empty strings
51
+ * 4. Invalid complex object types: Uses invalid arrow function syntax for
52
+ * dictionary types (type: () => [{ [key: string]: any; }])
51
53
  *
52
54
  * This utility transforms:
53
55
  * - type: 'string' -> type: String
@@ -56,6 +58,7 @@ const path = __importStar(require("path"));
56
58
  * - type: () => [string] -> type: [String]
57
59
  * - type: () => [number] -> type: [Number]
58
60
  * - type: () => [boolean] -> type: [Boolean]
61
+ * - type: () => [{ [key: string]: any; }] -> type: 'object'
59
62
  * - description: `text `code` here` -> description: `text \`code\` here`
60
63
  * - description: undefined -> description: ''
61
64
  *
@@ -137,6 +140,9 @@ class NestJsTypeFixer {
137
140
  const capitalized = primitive.charAt(0).toUpperCase() + primitive.slice(1);
138
141
  return `type: [${capitalized}]`;
139
142
  });
143
+ // Fix invalid complex object types with index signatures
144
+ // type: () => [{ [key: string]: any; }] -> type: 'object'
145
+ content = content.replace(/type:\s*\(\)\s*=>\s*\[\{[^\]]*\[key:\s*string\][^\]]*\}\]/g, "type: 'object'");
140
146
  // Fix unescaped backticks in description strings
141
147
  content = this.escapeBackticksInDescriptions(content);
142
148
  // Fix undefined descriptions
@@ -102,6 +102,13 @@ class OpenAPIClientGenerator {
102
102
  const typeFixer = new NestJsTypeFixer();
103
103
  await typeFixer.fixDirectory(outputDir);
104
104
  }
105
+ // Step 4.6: Fix malformed attributeTypeMap arrays
106
+ if (nestJsSwagger) {
107
+ console.log('Step 4.6: Fixing attributeTypeMap arrays...');
108
+ const { AttributeTypeMapFixer } = await Promise.resolve().then(() => __importStar(require('./attribute-typemap-fixer')));
109
+ const attrFixer = new AttributeTypeMapFixer();
110
+ await attrFixer.fixDirectory(outputDir);
111
+ }
105
112
  // Step 5: Fix ESM imports if requested
106
113
  if (fixEsmImports) {
107
114
  console.log('Step 5: Fixing ESM imports...');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "klasik",
3
- "version": "1.0.28",
3
+ "version": "1.0.30",
4
4
  "description": "Download OpenAPI specs from remote URLs and generate TypeScript clients with class-transformer support - support yaml, json, CustomResourceDefinition formats",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",