@kattebak/openapi-generator-ts 1.0.0
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/LICENSE +21 -0
- package/README.md +189 -0
- package/dist/cli/commands/generate.d.ts +23 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +116 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/list.d.ts +2 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +26 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +6 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +80 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/convert-template.d.ts +31 -0
- package/dist/cli/convert-template.d.ts.map +1 -0
- package/dist/cli/convert-template.js +204 -0
- package/dist/cli/convert-template.js.map +1 -0
- package/dist/cli/convert-template.test.d.ts +2 -0
- package/dist/cli/convert-template.test.d.ts.map +1 -0
- package/dist/cli/convert-template.test.js +74 -0
- package/dist/cli/convert-template.test.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +246 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/config.d.ts +252 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +31 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/generator.d.ts +99 -0
- package/dist/core/generator.d.ts.map +1 -0
- package/dist/core/generator.js +492 -0
- package/dist/core/generator.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/types.d.ts +47 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/generators/generators.test.d.ts +6 -0
- package/dist/generators/generators.test.d.ts.map +1 -0
- package/dist/generators/generators.test.js +247 -0
- package/dist/generators/generators.test.js.map +1 -0
- package/dist/generators/go.d.ts +10 -0
- package/dist/generators/go.d.ts.map +1 -0
- package/dist/generators/go.js +327 -0
- package/dist/generators/go.js.map +1 -0
- package/dist/generators/index.d.ts +29 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +58 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/php.d.ts +14 -0
- package/dist/generators/php.d.ts.map +1 -0
- package/dist/generators/php.js +241 -0
- package/dist/generators/php.js.map +1 -0
- package/dist/generators/python.d.ts +10 -0
- package/dist/generators/python.d.ts.map +1 -0
- package/dist/generators/python.js +273 -0
- package/dist/generators/python.js.map +1 -0
- package/dist/generators/typescript-fetch.d.ts +14 -0
- package/dist/generators/typescript-fetch.d.ts.map +1 -0
- package/dist/generators/typescript-fetch.js +217 -0
- package/dist/generators/typescript-fetch.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/models/codegen-model.d.ts +123 -0
- package/dist/models/codegen-model.d.ts.map +1 -0
- package/dist/models/codegen-model.js +64 -0
- package/dist/models/codegen-model.js.map +1 -0
- package/dist/models/codegen-model.test.d.ts +6 -0
- package/dist/models/codegen-model.test.d.ts.map +1 -0
- package/dist/models/codegen-model.test.js +143 -0
- package/dist/models/codegen-model.test.js.map +1 -0
- package/dist/models/codegen-operation.d.ts +95 -0
- package/dist/models/codegen-operation.d.ts.map +1 -0
- package/dist/models/codegen-operation.js +54 -0
- package/dist/models/codegen-operation.js.map +1 -0
- package/dist/models/codegen-parameter.d.ts +86 -0
- package/dist/models/codegen-parameter.d.ts.map +1 -0
- package/dist/models/codegen-parameter.js +47 -0
- package/dist/models/codegen-parameter.js.map +1 -0
- package/dist/models/codegen-property.d.ts +95 -0
- package/dist/models/codegen-property.d.ts.map +1 -0
- package/dist/models/codegen-property.js +47 -0
- package/dist/models/codegen-property.js.map +1 -0
- package/dist/models/codegen-response.d.ts +64 -0
- package/dist/models/codegen-response.d.ts.map +1 -0
- package/dist/models/codegen-response.js +42 -0
- package/dist/models/codegen-response.js.map +1 -0
- package/dist/models/codegen-security.d.ts +34 -0
- package/dist/models/codegen-security.d.ts.map +1 -0
- package/dist/models/codegen-security.js +18 -0
- package/dist/models/codegen-security.js.map +1 -0
- package/dist/models/index.d.ts +8 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +7 -0
- package/dist/models/index.js.map +1 -0
- package/dist/parser/index.d.ts +4 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +4 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/openapi-parser.d.ts +71 -0
- package/dist/parser/openapi-parser.d.ts.map +1 -0
- package/dist/parser/openapi-parser.js +195 -0
- package/dist/parser/openapi-parser.js.map +1 -0
- package/dist/parser/openapi-parser.test.d.ts +6 -0
- package/dist/parser/openapi-parser.test.d.ts.map +1 -0
- package/dist/parser/openapi-parser.test.js +238 -0
- package/dist/parser/openapi-parser.test.js.map +1 -0
- package/dist/parser/operation-transformer.d.ts +95 -0
- package/dist/parser/operation-transformer.d.ts.map +1 -0
- package/dist/parser/operation-transformer.js +634 -0
- package/dist/parser/operation-transformer.js.map +1 -0
- package/dist/parser/schema-transformer.d.ts +134 -0
- package/dist/parser/schema-transformer.d.ts.map +1 -0
- package/dist/parser/schema-transformer.js +557 -0
- package/dist/parser/schema-transformer.js.map +1 -0
- package/dist/template/engine-adapter.d.ts +55 -0
- package/dist/template/engine-adapter.d.ts.map +1 -0
- package/dist/template/engine-adapter.js +178 -0
- package/dist/template/engine-adapter.js.map +1 -0
- package/dist/template/engine-adapter.test.d.ts +6 -0
- package/dist/template/engine-adapter.test.d.ts.map +1 -0
- package/dist/template/engine-adapter.test.js +186 -0
- package/dist/template/engine-adapter.test.js.map +1 -0
- package/dist/template/index.d.ts +5 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js +5 -0
- package/dist/template/index.js.map +1 -0
- package/dist/template/lambdas/indent-lambdas.d.ts +40 -0
- package/dist/template/lambdas/indent-lambdas.d.ts.map +1 -0
- package/dist/template/lambdas/indent-lambdas.js +98 -0
- package/dist/template/lambdas/indent-lambdas.js.map +1 -0
- package/dist/template/lambdas/index.d.ts +44 -0
- package/dist/template/lambdas/index.d.ts.map +1 -0
- package/dist/template/lambdas/index.js +79 -0
- package/dist/template/lambdas/index.js.map +1 -0
- package/dist/template/lambdas/string-lambdas.d.ts +78 -0
- package/dist/template/lambdas/string-lambdas.d.ts.map +1 -0
- package/dist/template/lambdas/string-lambdas.js +148 -0
- package/dist/template/lambdas/string-lambdas.js.map +1 -0
- package/dist/template/lambdas/string-lambdas.test.d.ts +6 -0
- package/dist/template/lambdas/string-lambdas.test.d.ts.map +1 -0
- package/dist/template/lambdas/string-lambdas.test.js +158 -0
- package/dist/template/lambdas/string-lambdas.test.js.map +1 -0
- package/dist/template/template-locator.d.ts +72 -0
- package/dist/template/template-locator.d.ts.map +1 -0
- package/dist/template/template-locator.js +173 -0
- package/dist/template/template-locator.js.map +1 -0
- package/dist/template/template-manager.d.ts +65 -0
- package/dist/template/template-manager.d.ts.map +1 -0
- package/dist/template/template-manager.js +185 -0
- package/dist/template/template-manager.js.map +1 -0
- package/package.json +67 -0
- package/templates/go/.travis.yml +8 -0
- package/templates/go/README.mustache +236 -0
- package/templates/go/api.mustache +452 -0
- package/templates/go/api_doc.mustache +92 -0
- package/templates/go/api_test.mustache +59 -0
- package/templates/go/client.mustache +761 -0
- package/templates/go/configuration.mustache +332 -0
- package/templates/go/git_push.sh.mustache +57 -0
- package/templates/go/gitignore.mustache +24 -0
- package/templates/go/go.mod.mustache +16 -0
- package/templates/go/go.sum.mustache +19 -0
- package/templates/go/model.mustache +21 -0
- package/templates/go/model_anyof.mustache +93 -0
- package/templates/go/model_doc.mustache +97 -0
- package/templates/go/model_enum.mustache +101 -0
- package/templates/go/model_oneof.mustache +160 -0
- package/templates/go/model_simple.mustache +572 -0
- package/templates/go/nullable_model.mustache +35 -0
- package/templates/go/openapi.mustache +1 -0
- package/templates/go/partial_header.mustache +18 -0
- package/templates/go/response.mustache +38 -0
- package/templates/go/signing.mustache +453 -0
- package/templates/go/utils.mustache +352 -0
- package/templates/php/.php-cs-fixer.dist.php +29 -0
- package/templates/php/.travis.yml +8 -0
- package/templates/php/ApiException.mustache +111 -0
- package/templates/php/Configuration.mustache +606 -0
- package/templates/php/FormDataProcessor.mustache +238 -0
- package/templates/php/HeaderSelector.mustache +265 -0
- package/templates/php/ModelInterface.mustache +103 -0
- package/templates/php/ObjectSerializer.mustache +591 -0
- package/templates/php/README.mustache +151 -0
- package/templates/php/api.mustache +891 -0
- package/templates/php/api_doc.mustache +105 -0
- package/templates/php/api_test.mustache +80 -0
- package/templates/php/composer.mustache +44 -0
- package/templates/php/git_push.sh.mustache +57 -0
- package/templates/php/gitignore +15 -0
- package/templates/php/libraries/psr-18/ApiException.mustache +114 -0
- package/templates/php/libraries/psr-18/DebugPlugin.mustache +93 -0
- package/templates/php/libraries/psr-18/README.mustache +161 -0
- package/templates/php/libraries/psr-18/api.mustache +833 -0
- package/templates/php/libraries/psr-18/api_doc.mustache +79 -0
- package/templates/php/libraries/psr-18/composer.mustache +56 -0
- package/templates/php/model.mustache +47 -0
- package/templates/php/model_doc.mustache +10 -0
- package/templates/php/model_enum.mustache +33 -0
- package/templates/php/model_generic.mustache +565 -0
- package/templates/php/model_test.mustache +88 -0
- package/templates/php/partial_header.mustache +18 -0
- package/templates/php/php_doc_auth_partial.mustache +23 -0
- package/templates/php/phpunit.xml.mustache +18 -0
- package/templates/python/README.mustache +60 -0
- package/templates/python/README_onlypackage.mustache +50 -0
- package/templates/python/__init__.mustache +1 -0
- package/templates/python/__init__api.mustache +19 -0
- package/templates/python/__init__model.mustache +22 -0
- package/templates/python/__init__package.mustache +49 -0
- package/templates/python/api.mustache +244 -0
- package/templates/python/api_client.mustache +822 -0
- package/templates/python/api_doc.mustache +81 -0
- package/templates/python/api_doc_example.mustache +38 -0
- package/templates/python/api_response.mustache +21 -0
- package/templates/python/api_test.mustache +48 -0
- package/templates/python/asyncio/rest.mustache +209 -0
- package/templates/python/common_README.mustache +85 -0
- package/templates/python/configuration.mustache +806 -0
- package/templates/python/exceptions.mustache +210 -0
- package/templates/python/exports_api.mustache +3 -0
- package/templates/python/exports_model.mustache +3 -0
- package/templates/python/exports_package.mustache +20 -0
- package/templates/python/git_push.sh.mustache +57 -0
- package/templates/python/github-workflow.mustache +35 -0
- package/templates/python/gitignore.mustache +66 -0
- package/templates/python/gitlab-ci.mustache +31 -0
- package/templates/python/httpx/rest.mustache +190 -0
- package/templates/python/model.mustache +16 -0
- package/templates/python/model_anyof.mustache +182 -0
- package/templates/python/model_doc.mustache +40 -0
- package/templates/python/model_enum.mustache +36 -0
- package/templates/python/model_generic.mustache +403 -0
- package/templates/python/model_oneof.mustache +209 -0
- package/templates/python/model_test.mustache +60 -0
- package/templates/python/partial_api.mustache +52 -0
- package/templates/python/partial_api_args.mustache +18 -0
- package/templates/python/partial_header.mustache +19 -0
- package/templates/python/py.typed.mustache +1 -0
- package/templates/python/pyproject.mustache +172 -0
- package/templates/python/python_doc_auth_partial.mustache +108 -0
- package/templates/python/requirements.mustache +23 -0
- package/templates/python/rest.mustache +254 -0
- package/templates/python/setup.mustache +60 -0
- package/templates/python/setup_cfg.mustache +2 -0
- package/templates/python/signing.mustache +422 -0
- package/templates/python/test-requirements.mustache +6 -0
- package/templates/python/tornado/rest.mustache +148 -0
- package/templates/python/tox.mustache +9 -0
- package/templates/python/travis.mustache +17 -0
- package/templates/typescript-fetch/ApiEntitiesRecord.mustache +26 -0
- package/templates/typescript-fetch/ApiEntitiesReducer.mustache +21 -0
- package/templates/typescript-fetch/ApiEntitiesSelectors.mustache +5 -0
- package/templates/typescript-fetch/README.mustache +127 -0
- package/templates/typescript-fetch/allSagas.mustache +19 -0
- package/templates/typescript-fetch/api_doc.mustache +63 -0
- package/templates/typescript-fetch/api_example.mustache +44 -0
- package/templates/typescript-fetch/apis.index.mustache +16 -0
- package/templates/typescript-fetch/apis.mustache +483 -0
- package/templates/typescript-fetch/apisAssignQueryParam.mustache +12 -0
- package/templates/typescript-fetch/gitignore +4 -0
- package/templates/typescript-fetch/index.mustache +17 -0
- package/templates/typescript-fetch/licenseInfo.mustache +11 -0
- package/templates/typescript-fetch/modelEnum.mustache +28 -0
- package/templates/typescript-fetch/modelEnumInterfaces.mustache +37 -0
- package/templates/typescript-fetch/modelGeneric.mustache +261 -0
- package/templates/typescript-fetch/modelGenericInterfaces.mustache +50 -0
- package/templates/typescript-fetch/modelOneOf.mustache +255 -0
- package/templates/typescript-fetch/modelOneOfInterfaces.mustache +6 -0
- package/templates/typescript-fetch/model_doc.mustache +41 -0
- package/templates/typescript-fetch/models.index.mustache +32 -0
- package/templates/typescript-fetch/models.mustache +24 -0
- package/templates/typescript-fetch/npmignore.mustache +1 -0
- package/templates/typescript-fetch/package.mustache +43 -0
- package/templates/typescript-fetch/recordGeneric.mustache +295 -0
- package/templates/typescript-fetch/records.mustache +17 -0
- package/templates/typescript-fetch/runtime.mustache +424 -0
- package/templates/typescript-fetch/runtimeSagasAndRecords.mustache +120 -0
- package/templates/typescript-fetch/sagaApiManager.mustache +28 -0
- package/templates/typescript-fetch/sagas.mustache +245 -0
- package/templates/typescript-fetch/sourceLibraryIndex.mustache +1 -0
- package/templates/typescript-fetch/tsconfig.esm.mustache +7 -0
- package/templates/typescript-fetch/tsconfig.mustache +25 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Mustache to Handlebars Template Converter
|
|
4
|
+
*
|
|
5
|
+
* Converts OpenAPI Generator Mustache templates to Handlebars-compatible format.
|
|
6
|
+
*
|
|
7
|
+
* Handlebars is largely compatible with Mustache, but there are a few key differences:
|
|
8
|
+
*
|
|
9
|
+
* 1. Delimiter changes ({{=<% %>=}}) are NOT supported in Handlebars
|
|
10
|
+
* - These are converted to helper calls or removed
|
|
11
|
+
*
|
|
12
|
+
* 2. The {{#lambda.xxx}}...{{/lambda.xxx}} pattern becomes {{#xxx}}...{{/xxx}}
|
|
13
|
+
* - Lambda helpers are registered in the engine adapter
|
|
14
|
+
*
|
|
15
|
+
* 3. Array index access like foo.0.bar needs bracket notation: foo.[0].bar
|
|
16
|
+
* - Handlebars requires this for numeric keys
|
|
17
|
+
*
|
|
18
|
+
* Most other Mustache syntax works identically in Handlebars:
|
|
19
|
+
* - {{var}} - escaped output
|
|
20
|
+
* - {{{var}}} - unescaped output
|
|
21
|
+
* - {{#section}}...{{/section}} - block sections
|
|
22
|
+
* - {{^inverted}}...{{/inverted}} - inverted sections
|
|
23
|
+
* - {{>partial}} - partials
|
|
24
|
+
* - {{!comment}} - comments
|
|
25
|
+
*/
|
|
26
|
+
import { readFileSync } from "node:fs";
|
|
27
|
+
/**
|
|
28
|
+
* Convert a Mustache template to Handlebars-compatible format
|
|
29
|
+
* Uses simple regex-based transformations for reliability
|
|
30
|
+
*/
|
|
31
|
+
export function convertTemplate(content) {
|
|
32
|
+
let result = content;
|
|
33
|
+
// 1. Handle delimiter-change pattern for JSDoc types
|
|
34
|
+
// Pattern: {{=<% %>=}}{<%&varname%>}<%={{ }}=%>
|
|
35
|
+
// This outputs literal { } around a variable value
|
|
36
|
+
// Convert to: {{braceWrap varname}}
|
|
37
|
+
result = result.replace(/\{\{=<% %>=\}\}\{<%&(\w+)%>\}<%=\{\{ \}\}=%>/g, "{{braceWrap $1}}");
|
|
38
|
+
// 2. Handle delimiter-change pattern for @param tags (similar but with different context)
|
|
39
|
+
// Pattern: {{=<% %>=}}{<%&dataType%>}<%={{ }}=%>
|
|
40
|
+
// Already covered by the above regex
|
|
41
|
+
// 3. Remove any remaining standalone delimiter changes
|
|
42
|
+
// These switch delimiters but the tokenizer should handle them
|
|
43
|
+
// {{=<% %>=}} or <%={{ }}=%>
|
|
44
|
+
result = result.replace(/\{\{=<% %>=\}\}/g, "");
|
|
45
|
+
result = result.replace(/<%=\{\{ \}\}=%>/g, "");
|
|
46
|
+
// 4. Handle any remaining alternate delimiter variables that weren't part of the pattern
|
|
47
|
+
// <%varname%> -> {{varname}}
|
|
48
|
+
result = result.replace(/<%(\w+)%>/g, "{{$1}}");
|
|
49
|
+
// <%&varname%> -> {{{varname}}}
|
|
50
|
+
result = result.replace(/<%&(\w+)%>/g, "{{{$1}}}");
|
|
51
|
+
// Handle alternate delimiter block helpers
|
|
52
|
+
// <%#section%> -> {{#section}}
|
|
53
|
+
result = result.replace(/<%#([\w-]+)%>/g, "{{#$1}}");
|
|
54
|
+
// <%/section%> -> {{/$1}}
|
|
55
|
+
result = result.replace(/<%\/([\w-]+)%>/g, "{{/$1}}");
|
|
56
|
+
// <%^inverted%> -> {{^inverted}}
|
|
57
|
+
result = result.replace(/<%\^([\w-]+)%>/g, "{{^$1}}");
|
|
58
|
+
// 5. Convert lambda block helpers: {{#lambda.xxx}} -> {{#xxx}}
|
|
59
|
+
result = result.replace(/\{\{#lambda\.(\w+)\}\}/g, "{{#$1}}");
|
|
60
|
+
result = result.replace(/\{\{\/lambda\.(\w+)\}\}/g, "{{/$1}}");
|
|
61
|
+
// 6. Convert lambda inline helpers: {{lambda.xxx arg}} -> {{xxx arg}}
|
|
62
|
+
// This handles cases like {{lambda.lowercase name}}
|
|
63
|
+
result = result.replace(/\{\{lambda\.(\w+)\s+/g, "{{$1 ");
|
|
64
|
+
// 7. Convert array index access: foo.0.bar -> foo.[0].bar
|
|
65
|
+
// Look for patterns like .0. or .0}} or .0}}}
|
|
66
|
+
result = result.replace(/\.(\d+)\./g, ".[$1].");
|
|
67
|
+
result = result.replace(/\.(\d+)\}\}/g, ".[$1]}}");
|
|
68
|
+
result = result.replace(/\.(\d+)\}\}\}/g, ".[$1]}}}");
|
|
69
|
+
// 8. Convert array-as-boolean check: {{#varname.[0]}}...{{/varname.[0]}}
|
|
70
|
+
// In Mustache, this enters a block if the first element exists but context is still parent.
|
|
71
|
+
// In Handlebars, the context changes to the first element, breaking inner {{#varname}} refs.
|
|
72
|
+
// Convert to {{#if varname}}...{{/if}} which preserves context and checks array truthiness.
|
|
73
|
+
// Also handle the inverted version {{^varname.[0]}}...{{/varname.[0]}}
|
|
74
|
+
result = result.replace(/\{\{#(\w+)\.\[0\]\}\}/g, "{{#if $1}}");
|
|
75
|
+
result = result.replace(/\{\{\/(\w+)\.\[0\]\}\}/g, "{{/if}}");
|
|
76
|
+
result = result.replace(/\{\{\^(\w+)\.\[0\]\}\}/g, "{{#unless $1}}");
|
|
77
|
+
// 9. Convert string-as-boolean sections to {{#if}} blocks
|
|
78
|
+
// In Mustache, {{#stringVar}}...{{/stringVar}} checks truthiness but keeps parent context.
|
|
79
|
+
// In Handlebars, it changes context to the string value, breaking sibling variable access.
|
|
80
|
+
// Convert known string variables to {{#if}} to preserve context.
|
|
81
|
+
//
|
|
82
|
+
// Note: Both {{#var}} and {{^var}} use {{/var}} as closing in Mustache.
|
|
83
|
+
// In Handlebars, we need {{/if}} for {{#if}} and {{/unless}} for {{#unless}}.
|
|
84
|
+
// So we process inverted sections first as complete pairs, then process normal sections.
|
|
85
|
+
const stringVars = [
|
|
86
|
+
"returnType",
|
|
87
|
+
"returnBaseType",
|
|
88
|
+
"summary",
|
|
89
|
+
"notes",
|
|
90
|
+
"description",
|
|
91
|
+
"unescapedDescription",
|
|
92
|
+
"externalDocsDescription",
|
|
93
|
+
"externalDocsUrl",
|
|
94
|
+
"basePath",
|
|
95
|
+
"host",
|
|
96
|
+
"title",
|
|
97
|
+
"appDescription",
|
|
98
|
+
"appDescriptionWithNewLines",
|
|
99
|
+
"appName",
|
|
100
|
+
"infoUrl",
|
|
101
|
+
"infoEmail",
|
|
102
|
+
"version",
|
|
103
|
+
"termsOfService",
|
|
104
|
+
"licenseName",
|
|
105
|
+
"licenseUrl",
|
|
106
|
+
"licenseInfo",
|
|
107
|
+
"appContact",
|
|
108
|
+
"returnContainer",
|
|
109
|
+
"defaultValue",
|
|
110
|
+
"dataFormat",
|
|
111
|
+
"example",
|
|
112
|
+
"exampleValue",
|
|
113
|
+
// Note: bodyParam is an object, NOT a string - do not add here
|
|
114
|
+
// Note: vendorExtensions is also an object
|
|
115
|
+
"pattern",
|
|
116
|
+
"minimum",
|
|
117
|
+
"maximum",
|
|
118
|
+
"minLength",
|
|
119
|
+
"maxLength",
|
|
120
|
+
];
|
|
121
|
+
for (const varName of stringVars) {
|
|
122
|
+
// First, handle the special case where {{{.}}} or {{.}} is used inside the block
|
|
123
|
+
// This pattern is common in Mustache: {{#varName}}{{{.}}}{{/varName}}
|
|
124
|
+
// The . refers to the current context (the varName value)
|
|
125
|
+
// Convert to: {{{varName}}} directly
|
|
126
|
+
result = result.replace(new RegExp(`\\{\\{#${varName}\\}\\}\\{\\{\\{\\.\\}\\}\\}\\{\\{/${varName}\\}\\}`, "g"), `{{{${varName}}}}`);
|
|
127
|
+
result = result.replace(new RegExp(`\\{\\{#${varName}\\}\\}\\{\\{\\.\\}\\}\\{\\{/${varName}\\}\\}`, "g"), `{{${varName}}}`);
|
|
128
|
+
// Handle patterns with surrounding text: {{#varName}}prefix {{{.}}} suffix{{/varName}}
|
|
129
|
+
// Convert to: {{#if varName}}prefix {{{varName}}} suffix{{/if}}
|
|
130
|
+
result = result.replace(new RegExp(`\\{\\{#${varName}\\}\\}([^{]*)\\{\\{\\{\\.\\}\\}\\}([^{]*)\\{\\{/${varName}\\}\\}`, "g"), `{{#if ${varName}}}$1{{{${varName}}}}$2{{/if}}`);
|
|
131
|
+
result = result.replace(new RegExp(`\\{\\{#${varName}\\}\\}([^{]*)\\{\\{\\.\\}\\}([^{]*)\\{\\{/${varName}\\}\\}`, "g"), `{{#if ${varName}}}$1{{${varName}}}$2{{/if}}`);
|
|
132
|
+
// Then convert inverted sections as complete pairs
|
|
133
|
+
// {{^varName}}...{{/varName}} -> {{#unless varName}}...{{/unless}}
|
|
134
|
+
// Use non-greedy match to handle nested sections correctly
|
|
135
|
+
result = result.replace(new RegExp(`\\{\\{\\^${varName}\\}\\}([\\s\\S]*?)\\{\\{/${varName}\\}\\}`, "g"), `{{#unless ${varName}}}$1{{/unless}}`);
|
|
136
|
+
// Then convert remaining normal sections with dot reference replacement
|
|
137
|
+
// {{#varName}}...{{{.}}}...{{/varName}} -> {{#if varName}}...{{{varName}}}...{{/if}}
|
|
138
|
+
// We need to replace {{{.}}} and {{.}} with the varName inside the block
|
|
139
|
+
// Run iteratively because nested blocks need multiple passes
|
|
140
|
+
let prevResult = "";
|
|
141
|
+
while (prevResult !== result) {
|
|
142
|
+
prevResult = result;
|
|
143
|
+
result = result.replace(new RegExp(`\\{\\{#${varName}\\}\\}([\\s\\S]*?)\\{\\{/${varName}\\}\\}`, "g"), (_, content) => {
|
|
144
|
+
// Replace dot references with the variable name inside the block
|
|
145
|
+
const replaced = content
|
|
146
|
+
.replace(/\{\{\{\.\}\}\}/g, `{{{${varName}}}}`)
|
|
147
|
+
.replace(/\{\{\.\}\}/g, `{{${varName}}}`);
|
|
148
|
+
return `{{#if ${varName}}}${replaced}{{/if}}`;
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// 10. Handle -first and -last in iteration contexts
|
|
153
|
+
// Process inverted sections FIRST as complete pairs (they use {{/-first}} as close tag too)
|
|
154
|
+
// {{^-first}}...{{/-first}} -> {{#unless @first}}...{{/unless}}
|
|
155
|
+
result = result.replace(/\{\{\^-first\}\}([\s\S]*?)\{\{\/-first\}\}/g, "{{#unless @first}}$1{{/unless}}");
|
|
156
|
+
result = result.replace(/\{\{\^-last\}\}([\s\S]*?)\{\{\/-last\}\}/g, "{{#unless @last}}$1{{/unless}}");
|
|
157
|
+
// Then process regular sections
|
|
158
|
+
// {{#-first}}...{{/-first}} -> {{#if @first}}...{{/if}}
|
|
159
|
+
result = result.replace(/\{\{#-first\}\}/g, "{{#if @first}}");
|
|
160
|
+
result = result.replace(/\{\{\/-first\}\}/g, "{{/if}}");
|
|
161
|
+
result = result.replace(/\{\{#-last\}\}/g, "{{#if @last}}");
|
|
162
|
+
result = result.replace(/\{\{\/-last\}\}/g, "{{/if}}");
|
|
163
|
+
// 11. Fix ambiguous }}} sequences after block tags that could confuse Handlebars
|
|
164
|
+
// When a block tag like {{#if ...}} or {{/if}} is followed immediately by }
|
|
165
|
+
// (which is code output, not template), Handlebars parser may get confused.
|
|
166
|
+
// Add whitespace to disambiguate: {{#if foo}}} -> {{#if foo}} }
|
|
167
|
+
// Pattern: Match {{...}} where ... doesn't start with { (not unescaped output)
|
|
168
|
+
// followed by } that isn't part of another tag
|
|
169
|
+
result = result.replace(/(\{\{[#^/][\w@\s]+\}\})\}([^}])/g, "$1 }$2");
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Process a single file - reads from path, outputs converted content to stdout
|
|
174
|
+
*/
|
|
175
|
+
function processFile(inputPath) {
|
|
176
|
+
const content = readFileSync(inputPath, "utf-8");
|
|
177
|
+
const converted = convertTemplate(content);
|
|
178
|
+
process.stdout.write(converted);
|
|
179
|
+
}
|
|
180
|
+
// CLI handling
|
|
181
|
+
function main() {
|
|
182
|
+
const args = process.argv.slice(2);
|
|
183
|
+
if (args.length === 0 || args.includes("--help") || args.includes("-h")) {
|
|
184
|
+
console.log(`
|
|
185
|
+
Mustache to Handlebars Template Converter
|
|
186
|
+
|
|
187
|
+
Usage:
|
|
188
|
+
npx tsx src/cli/convert-template.ts <input-file>
|
|
189
|
+
|
|
190
|
+
The converted template is written to stdout.
|
|
191
|
+
|
|
192
|
+
Examples:
|
|
193
|
+
npx tsx src/cli/convert-template.ts template.mustache
|
|
194
|
+
npx tsx src/cli/convert-template.ts template.mustache > output.mustache
|
|
195
|
+
`);
|
|
196
|
+
process.exit(0);
|
|
197
|
+
}
|
|
198
|
+
processFile(args[0]);
|
|
199
|
+
}
|
|
200
|
+
// Run if called directly
|
|
201
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
202
|
+
main();
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=convert-template.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-template.js","sourceRoot":"","sources":["../../src/cli/convert-template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-template.test.d.ts","sourceRoot":"","sources":["../../src/cli/convert-template.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import { convertTemplate } from "./convert-template.js";
|
|
4
|
+
describe("Template Converter", () => {
|
|
5
|
+
describe("convertTemplate", () => {
|
|
6
|
+
it("should pass through simple variables", () => {
|
|
7
|
+
const result = convertTemplate("{{name}}");
|
|
8
|
+
assert.strictEqual(result, "{{name}}");
|
|
9
|
+
});
|
|
10
|
+
it("should pass through triple mustache", () => {
|
|
11
|
+
const result = convertTemplate("{{{html}}}");
|
|
12
|
+
assert.strictEqual(result, "{{{html}}}");
|
|
13
|
+
});
|
|
14
|
+
it("should pass through sections", () => {
|
|
15
|
+
const result = convertTemplate("{{#items}}{{name}}{{/items}}");
|
|
16
|
+
assert.strictEqual(result, "{{#items}}{{name}}{{/items}}");
|
|
17
|
+
});
|
|
18
|
+
it("should convert delimiter-change JSDoc pattern", () => {
|
|
19
|
+
const input = "* @type {{=<% %>=}}{<%&datatype%>}<%={{ }}=%>";
|
|
20
|
+
const result = convertTemplate(input);
|
|
21
|
+
assert.strictEqual(result, "* @type {{braceWrap datatype}}");
|
|
22
|
+
});
|
|
23
|
+
it("should convert lambda block helpers", () => {
|
|
24
|
+
const input = "{{#lambda.camelcase}}someName{{/lambda.camelcase}}";
|
|
25
|
+
const result = convertTemplate(input);
|
|
26
|
+
assert.strictEqual(result, "{{#camelcase}}someName{{/camelcase}}");
|
|
27
|
+
});
|
|
28
|
+
it("should convert lambda inline helpers", () => {
|
|
29
|
+
const input = "{{lambda.lowercase name}}";
|
|
30
|
+
const result = convertTemplate(input);
|
|
31
|
+
assert.strictEqual(result, "{{lowercase name}}");
|
|
32
|
+
});
|
|
33
|
+
it("should convert array index access", () => {
|
|
34
|
+
const input = "{{items.0.name}}";
|
|
35
|
+
const result = convertTemplate(input);
|
|
36
|
+
assert.strictEqual(result, "{{items.[0].name}}");
|
|
37
|
+
});
|
|
38
|
+
it("should handle -first and -last in iterations", () => {
|
|
39
|
+
const input = "{{#-first}}First{{/-first}}{{#-last}}Last{{/-last}}";
|
|
40
|
+
const result = convertTemplate(input);
|
|
41
|
+
assert.strictEqual(result, "{{#if @first}}First{{/if}}{{#if @last}}Last{{/if}}");
|
|
42
|
+
});
|
|
43
|
+
it("should handle inverted -first", () => {
|
|
44
|
+
const input = "{{^-first}}, {{/-first}}";
|
|
45
|
+
const result = convertTemplate(input);
|
|
46
|
+
assert.strictEqual(result, "{{#unless @first}}, {{/unless}}");
|
|
47
|
+
});
|
|
48
|
+
it("should remove standalone delimiter changes", () => {
|
|
49
|
+
const input = "before{{=<% %>=}}after";
|
|
50
|
+
const result = convertTemplate(input);
|
|
51
|
+
assert.strictEqual(result, "beforeafter");
|
|
52
|
+
});
|
|
53
|
+
it("should convert remaining alternate delimiter variables", () => {
|
|
54
|
+
const input = "{{=<% %>=}}<%name%><%={{ }}=%>";
|
|
55
|
+
const result = convertTemplate(input);
|
|
56
|
+
assert.strictEqual(result, "{{name}}");
|
|
57
|
+
});
|
|
58
|
+
it("should convert remaining alternate delimiter unescaped", () => {
|
|
59
|
+
const input = "{{=<% %>=}}<%&html%><%={{ }}=%>";
|
|
60
|
+
const result = convertTemplate(input);
|
|
61
|
+
assert.strictEqual(result, "{{{html}}}");
|
|
62
|
+
});
|
|
63
|
+
it("should handle complex real-world template", () => {
|
|
64
|
+
const input = `/**
|
|
65
|
+
* @param {{=<% %>=}}{<%&dataType%>}<%={{ }}=%> {{paramName}} {{description}}
|
|
66
|
+
*/`;
|
|
67
|
+
const result = convertTemplate(input);
|
|
68
|
+
assert.strictEqual(result, `/**
|
|
69
|
+
* @param {{braceWrap dataType}} {{paramName}} {{description}}
|
|
70
|
+
*/`);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=convert-template.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert-template.test.js","sourceRoot":"","sources":["../../src/cli/convert-template.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* OpenAPI Generator CLI
|
|
4
|
+
* Uses Node's native parseArgs for argument parsing (Node 18.3+)
|
|
5
|
+
*/
|
|
6
|
+
import { parseArgs } from "node:util";
|
|
7
|
+
import { generateCommand } from "./commands/generate.js";
|
|
8
|
+
import { listCommand } from "./commands/list.js";
|
|
9
|
+
import { validateCommand } from "./commands/validate.js";
|
|
10
|
+
const VERSION = "0.1.0";
|
|
11
|
+
const USAGE = `
|
|
12
|
+
OpenAPI Generator - Generate code from OpenAPI specifications
|
|
13
|
+
|
|
14
|
+
Usage:
|
|
15
|
+
openapi-generator <command> [options]
|
|
16
|
+
|
|
17
|
+
Commands:
|
|
18
|
+
generate Generate code from an OpenAPI specification
|
|
19
|
+
validate Validate an OpenAPI specification
|
|
20
|
+
list List available generators
|
|
21
|
+
|
|
22
|
+
Options:
|
|
23
|
+
-h, --help Show this help message
|
|
24
|
+
-v, --version Show version number
|
|
25
|
+
|
|
26
|
+
Examples:
|
|
27
|
+
openapi-generator generate -i petstore.json -g typescript-fetch -o ./generated
|
|
28
|
+
openapi-generator validate -i petstore.yaml
|
|
29
|
+
openapi-generator list
|
|
30
|
+
|
|
31
|
+
For more information about a command:
|
|
32
|
+
openapi-generator <command> --help
|
|
33
|
+
`;
|
|
34
|
+
const GENERATE_USAGE = `
|
|
35
|
+
Usage: openapi-generator generate [options]
|
|
36
|
+
|
|
37
|
+
Generate code from an OpenAPI specification
|
|
38
|
+
|
|
39
|
+
Required Options:
|
|
40
|
+
-i, --input <file> Path to OpenAPI spec file (JSON or YAML)
|
|
41
|
+
-g, --generator <name> Generator name (e.g., typescript-fetch)
|
|
42
|
+
|
|
43
|
+
Output Options:
|
|
44
|
+
-o, --output <dir> Output directory (default: ./generated)
|
|
45
|
+
-t, --templates <dir> Custom templates directory
|
|
46
|
+
--library <name> Library/variant to use
|
|
47
|
+
|
|
48
|
+
Package Options:
|
|
49
|
+
-p, --package <name> Package name
|
|
50
|
+
--api-package <name> API package name
|
|
51
|
+
--model-package <name> Model package name
|
|
52
|
+
|
|
53
|
+
Generation Options:
|
|
54
|
+
--skip-models Skip model generation
|
|
55
|
+
--skip-apis Skip API generation
|
|
56
|
+
--skip-supporting Skip supporting files
|
|
57
|
+
--skip-overwrite Don't overwrite existing files
|
|
58
|
+
--minimal-update Only write if content changed
|
|
59
|
+
--dry-run Don't write files, show what would be generated
|
|
60
|
+
|
|
61
|
+
Additional Options:
|
|
62
|
+
--additional-properties <props> Additional properties as key=value,key2=value2
|
|
63
|
+
--type-mappings <mappings> Type mappings as openApiType=targetType,...
|
|
64
|
+
--import-mappings <mappings> Import mappings as type=import,...
|
|
65
|
+
|
|
66
|
+
Other:
|
|
67
|
+
-v, --verbose Enable verbose output
|
|
68
|
+
--debug Enable debug output
|
|
69
|
+
-h, --help Show this help message
|
|
70
|
+
`;
|
|
71
|
+
const VALIDATE_USAGE = `
|
|
72
|
+
Usage: openapi-generator validate [options]
|
|
73
|
+
|
|
74
|
+
Validate an OpenAPI specification
|
|
75
|
+
|
|
76
|
+
Options:
|
|
77
|
+
-i, --input <file> Path to OpenAPI spec file (JSON or YAML)
|
|
78
|
+
--strict Enable strict validation
|
|
79
|
+
-h, --help Show this help message
|
|
80
|
+
`;
|
|
81
|
+
const LIST_USAGE = `
|
|
82
|
+
Usage: openapi-generator list
|
|
83
|
+
|
|
84
|
+
List all available generators
|
|
85
|
+
`;
|
|
86
|
+
async function main() {
|
|
87
|
+
const args = process.argv.slice(2);
|
|
88
|
+
// Handle no args or top-level help
|
|
89
|
+
if (args.length === 0 || args[0] === "-h" || args[0] === "--help") {
|
|
90
|
+
console.log(USAGE);
|
|
91
|
+
process.exit(0);
|
|
92
|
+
}
|
|
93
|
+
// Handle version
|
|
94
|
+
if (args[0] === "-v" || args[0] === "--version") {
|
|
95
|
+
console.log(VERSION);
|
|
96
|
+
process.exit(0);
|
|
97
|
+
}
|
|
98
|
+
const command = args[0];
|
|
99
|
+
const commandArgs = args.slice(1);
|
|
100
|
+
try {
|
|
101
|
+
switch (command) {
|
|
102
|
+
case "generate":
|
|
103
|
+
await handleGenerate(commandArgs);
|
|
104
|
+
break;
|
|
105
|
+
case "validate":
|
|
106
|
+
await handleValidate(commandArgs);
|
|
107
|
+
break;
|
|
108
|
+
case "list":
|
|
109
|
+
handleList(commandArgs);
|
|
110
|
+
break;
|
|
111
|
+
default:
|
|
112
|
+
console.error(`Unknown command: ${command}`);
|
|
113
|
+
console.log(USAGE);
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
console.error("Error:", error instanceof Error ? error.message : error);
|
|
119
|
+
if (process.env.DEBUG) {
|
|
120
|
+
console.error(error);
|
|
121
|
+
}
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
async function handleGenerate(args) {
|
|
126
|
+
// Check for help
|
|
127
|
+
if (args.includes("-h") || args.includes("--help")) {
|
|
128
|
+
console.log(GENERATE_USAGE);
|
|
129
|
+
process.exit(0);
|
|
130
|
+
}
|
|
131
|
+
const { values } = parseArgs({
|
|
132
|
+
args,
|
|
133
|
+
options: {
|
|
134
|
+
input: { type: "string", short: "i" },
|
|
135
|
+
generator: { type: "string", short: "g" },
|
|
136
|
+
output: { type: "string", short: "o", default: "./generated" },
|
|
137
|
+
templates: { type: "string", short: "t" },
|
|
138
|
+
library: { type: "string" },
|
|
139
|
+
package: { type: "string", short: "p" },
|
|
140
|
+
"api-package": { type: "string" },
|
|
141
|
+
"model-package": { type: "string" },
|
|
142
|
+
"skip-models": { type: "boolean", default: false },
|
|
143
|
+
"skip-apis": { type: "boolean", default: false },
|
|
144
|
+
"skip-supporting": { type: "boolean", default: false },
|
|
145
|
+
"skip-overwrite": { type: "boolean", default: false },
|
|
146
|
+
"minimal-update": { type: "boolean", default: true },
|
|
147
|
+
"dry-run": { type: "boolean", default: false },
|
|
148
|
+
"additional-properties": { type: "string" },
|
|
149
|
+
"type-mappings": { type: "string" },
|
|
150
|
+
"import-mappings": { type: "string" },
|
|
151
|
+
verbose: { type: "boolean", short: "v", default: false },
|
|
152
|
+
debug: { type: "boolean", default: false },
|
|
153
|
+
},
|
|
154
|
+
strict: true,
|
|
155
|
+
});
|
|
156
|
+
// Validate required options
|
|
157
|
+
if (!values.input) {
|
|
158
|
+
console.error("Error: --input (-i) is required");
|
|
159
|
+
console.log(GENERATE_USAGE);
|
|
160
|
+
process.exit(1);
|
|
161
|
+
}
|
|
162
|
+
if (!values.generator) {
|
|
163
|
+
console.error("Error: --generator (-g) is required");
|
|
164
|
+
console.log(GENERATE_USAGE);
|
|
165
|
+
process.exit(1);
|
|
166
|
+
}
|
|
167
|
+
// Parse additional properties
|
|
168
|
+
const additionalProperties = parseKeyValuePairs(values["additional-properties"]);
|
|
169
|
+
const typeMappings = parseKeyValuePairs(values["type-mappings"]);
|
|
170
|
+
const importMappings = parseKeyValuePairs(values["import-mappings"]);
|
|
171
|
+
await generateCommand({
|
|
172
|
+
inputSpec: values.input,
|
|
173
|
+
generatorName: values.generator,
|
|
174
|
+
outputDir: values.output,
|
|
175
|
+
templateDir: values.templates,
|
|
176
|
+
library: values.library,
|
|
177
|
+
packageName: values.package,
|
|
178
|
+
apiPackage: values["api-package"],
|
|
179
|
+
modelPackage: values["model-package"],
|
|
180
|
+
generateModels: !values["skip-models"],
|
|
181
|
+
generateApis: !values["skip-apis"],
|
|
182
|
+
generateSupportingFiles: !values["skip-supporting"],
|
|
183
|
+
skipOverwrite: values["skip-overwrite"],
|
|
184
|
+
minimalUpdate: values["minimal-update"],
|
|
185
|
+
dryRun: values["dry-run"],
|
|
186
|
+
additionalProperties,
|
|
187
|
+
typeMappings,
|
|
188
|
+
importMappings,
|
|
189
|
+
verbose: values.verbose,
|
|
190
|
+
debug: values.debug,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
async function handleValidate(args) {
|
|
194
|
+
// Check for help
|
|
195
|
+
if (args.includes("-h") || args.includes("--help")) {
|
|
196
|
+
console.log(VALIDATE_USAGE);
|
|
197
|
+
process.exit(0);
|
|
198
|
+
}
|
|
199
|
+
const { values } = parseArgs({
|
|
200
|
+
args,
|
|
201
|
+
options: {
|
|
202
|
+
input: { type: "string", short: "i" },
|
|
203
|
+
strict: { type: "boolean", default: false },
|
|
204
|
+
},
|
|
205
|
+
strict: true,
|
|
206
|
+
});
|
|
207
|
+
if (!values.input) {
|
|
208
|
+
console.error("Error: --input (-i) is required");
|
|
209
|
+
console.log(VALIDATE_USAGE);
|
|
210
|
+
process.exit(1);
|
|
211
|
+
}
|
|
212
|
+
await validateCommand({
|
|
213
|
+
inputSpec: values.input,
|
|
214
|
+
strict: values.strict,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
function handleList(args) {
|
|
218
|
+
// Check for help
|
|
219
|
+
if (args.includes("-h") || args.includes("--help")) {
|
|
220
|
+
console.log(LIST_USAGE);
|
|
221
|
+
process.exit(0);
|
|
222
|
+
}
|
|
223
|
+
listCommand();
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Parse comma-separated key=value pairs
|
|
227
|
+
*/
|
|
228
|
+
function parseKeyValuePairs(input) {
|
|
229
|
+
if (!input)
|
|
230
|
+
return {};
|
|
231
|
+
const result = {};
|
|
232
|
+
const pairs = input.split(",");
|
|
233
|
+
for (const pair of pairs) {
|
|
234
|
+
const [key, ...valueParts] = pair.split("=");
|
|
235
|
+
if (key && valueParts.length > 0) {
|
|
236
|
+
result[key.trim()] = valueParts.join("=").trim();
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return result;
|
|
240
|
+
}
|
|
241
|
+
// Run the CLI
|
|
242
|
+
main().catch((error) => {
|
|
243
|
+
console.error("Fatal error:", error);
|
|
244
|
+
process.exit(1);
|
|
245
|
+
});
|
|
246
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|