@alagoni97/cli 0.72.1
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 +201 -0
- package/README.md +336 -0
- package/bin/dev.cmd +3 -0
- package/bin/dev.mjs +3 -0
- package/bin/run.cmd +3 -0
- package/bin/run.mjs +4 -0
- package/dist/LoggingInterface.d.ts +123 -0
- package/dist/LoggingInterface.js +300 -0
- package/dist/PersistedConfig.d.ts +46 -0
- package/dist/PersistedConfig.js +94 -0
- package/dist/browser/adapters/output.d.ts +69 -0
- package/dist/browser/adapters/output.js +91 -0
- package/dist/browser/config.d.ts +18 -0
- package/dist/browser/config.js +59 -0
- package/dist/browser/generate.d.ts +20 -0
- package/dist/browser/generate.js +129 -0
- package/dist/browser/index.d.ts +17 -0
- package/dist/browser/index.js +26 -0
- package/dist/browser/parser.d.ts +9 -0
- package/dist/browser/parser.js +61 -0
- package/dist/browser/shims/asyncapi-parser.d.ts +30 -0
- package/dist/browser/shims/asyncapi-parser.js +52 -0
- package/dist/browser/shims/fs.d.ts +190 -0
- package/dist/browser/shims/fs.js +188 -0
- package/dist/browser/shims/json-schema-ref-parser.d.ts +73 -0
- package/dist/browser/shims/json-schema-ref-parser.js +246 -0
- package/dist/browser/shims/swagger-parser.d.ts +20 -0
- package/dist/browser/shims/swagger-parser.js +40 -0
- package/dist/codegen/configurationSchemaBuilder.d.ts +15 -0
- package/dist/codegen/configurationSchemaBuilder.js +48 -0
- package/dist/codegen/configurations.d.ts +29 -0
- package/dist/codegen/configurations.js +260 -0
- package/dist/codegen/detection.d.ts +19 -0
- package/dist/codegen/detection.js +174 -0
- package/dist/codegen/errors.d.ts +111 -0
- package/dist/codegen/errors.js +352 -0
- package/dist/codegen/generators/generic/custom.d.ts +75 -0
- package/dist/codegen/generators/generic/custom.js +66 -0
- package/dist/codegen/generators/index.d.ts +14 -0
- package/dist/codegen/generators/index.js +42 -0
- package/dist/codegen/generators/typescript/channels/asyncapi.d.ts +10 -0
- package/dist/codegen/generators/typescript/channels/asyncapi.js +131 -0
- package/dist/codegen/generators/typescript/channels/index.d.ts +8 -0
- package/dist/codegen/generators/typescript/channels/index.js +142 -0
- package/dist/codegen/generators/typescript/channels/openapi.d.ts +9 -0
- package/dist/codegen/generators/typescript/channels/openapi.js +168 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/index.d.ts +7 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/index.js +149 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/publishExchange.d.ts +5 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/publishExchange.js +106 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/publishQueue.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/publishQueue.js +102 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/subscribeQueue.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/amqp/subscribeQueue.js +133 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/express.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/express.js +100 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/fetch.d.ts +5 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/fetch.js +144 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/index.d.ts +6 -0
- package/dist/codegen/generators/typescript/channels/protocols/eventsource/index.js +132 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/client.d.ts +10 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/client.js +224 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/common-types.d.ts +14 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/common-types.js +800 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/index.d.ts +8 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/index.js +96 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/security.d.ts +48 -0
- package/dist/codegen/generators/typescript/channels/protocols/http/security.js +491 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/index.d.ts +6 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/index.js +127 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/publish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/publish.js +108 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/subscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/subscribe.js +154 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/utils.d.ts +11 -0
- package/dist/codegen/generators/typescript/channels/protocols/kafka/utils.js +58 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/index.d.ts +6 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/index.js +113 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/publish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/publish.js +99 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/subscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/mqtt/subscribe.js +186 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/corePublish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/corePublish.js +90 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreReply.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreReply.js +142 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreRequest.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreRequest.js +100 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreSubscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/coreSubscribe.js +143 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/index.d.ts +11 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/index.js +224 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPublish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPublish.js +89 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPullSubscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPullSubscribe.js +146 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPushSubscription.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/jetstreamPushSubscription.js +149 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/utils.d.ts +35 -0
- package/dist/codegen/generators/typescript/channels/protocols/nats/utils.js +120 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/index.d.ts +7 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/index.js +152 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/publish.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/publish.js +64 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/register.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/register.js +115 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/subscribe.d.ts +3 -0
- package/dist/codegen/generators/typescript/channels/protocols/websocket/subscribe.js +151 -0
- package/dist/codegen/generators/typescript/channels/types.d.ts +181 -0
- package/dist/codegen/generators/typescript/channels/types.js +131 -0
- package/dist/codegen/generators/typescript/channels/utils.d.ts +64 -0
- package/dist/codegen/generators/typescript/channels/utils.js +163 -0
- package/dist/codegen/generators/typescript/client/index.d.ts +8 -0
- package/dist/codegen/generators/typescript/client/index.js +61 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/corePublish.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/corePublish.js +53 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/coreSubscribe.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/coreSubscribe.js +90 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetStreamPullSubscription.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetStreamPullSubscription.js +83 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetstreamPublish.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetstreamPublish.js +54 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetstreamPushSubscription.d.ts +6 -0
- package/dist/codegen/generators/typescript/client/protocols/nats/jetstreamPushSubscription.js +82 -0
- package/dist/codegen/generators/typescript/client/protocols/nats.d.ts +2 -0
- package/dist/codegen/generators/typescript/client/protocols/nats.js +182 -0
- package/dist/codegen/generators/typescript/client/types.d.ts +49 -0
- package/dist/codegen/generators/typescript/client/types.js +37 -0
- package/dist/codegen/generators/typescript/headers.d.ts +54 -0
- package/dist/codegen/generators/typescript/headers.js +138 -0
- package/dist/codegen/generators/typescript/index.d.ts +7 -0
- package/dist/codegen/generators/typescript/index.js +38 -0
- package/dist/codegen/generators/typescript/models.d.ts +21761 -0
- package/dist/codegen/generators/typescript/models.js +64 -0
- package/dist/codegen/generators/typescript/parameters.d.ts +37 -0
- package/dist/codegen/generators/typescript/parameters.js +101 -0
- package/dist/codegen/generators/typescript/payloads.d.ts +73 -0
- package/dist/codegen/generators/typescript/payloads.js +250 -0
- package/dist/codegen/generators/typescript/types.d.ts +34 -0
- package/dist/codegen/generators/typescript/types.js +70 -0
- package/dist/codegen/generators/typescript/utils.d.ts +38 -0
- package/dist/codegen/generators/typescript/utils.js +195 -0
- package/dist/codegen/index.d.ts +7 -0
- package/dist/codegen/index.js +38 -0
- package/dist/codegen/inputs/asyncapi/generators/headers.d.ts +3 -0
- package/dist/codegen/inputs/asyncapi/generators/headers.js +41 -0
- package/dist/codegen/inputs/asyncapi/generators/parameters.d.ts +14 -0
- package/dist/codegen/inputs/asyncapi/generators/parameters.js +120 -0
- package/dist/codegen/inputs/asyncapi/generators/payloads.d.ts +16 -0
- package/dist/codegen/inputs/asyncapi/generators/payloads.js +124 -0
- package/dist/codegen/inputs/asyncapi/generators/types.d.ts +9 -0
- package/dist/codegen/inputs/asyncapi/generators/types.js +61 -0
- package/dist/codegen/inputs/asyncapi/index.d.ts +1 -0
- package/dist/codegen/inputs/asyncapi/index.js +7 -0
- package/dist/codegen/inputs/asyncapi/parser.d.ts +4 -0
- package/dist/codegen/inputs/asyncapi/parser.js +90 -0
- package/dist/codegen/inputs/index.d.ts +3 -0
- package/dist/codegen/inputs/index.js +19 -0
- package/dist/codegen/inputs/jsonschema/generators/index.d.ts +1 -0
- package/dist/codegen/inputs/jsonschema/generators/index.js +5 -0
- package/dist/codegen/inputs/jsonschema/generators/models.d.ts +7 -0
- package/dist/codegen/inputs/jsonschema/generators/models.js +26 -0
- package/dist/codegen/inputs/jsonschema/index.d.ts +1 -0
- package/dist/codegen/inputs/jsonschema/index.js +7 -0
- package/dist/codegen/inputs/jsonschema/parser.d.ts +31 -0
- package/dist/codegen/inputs/jsonschema/parser.js +128 -0
- package/dist/codegen/inputs/openapi/generators/headers.d.ts +3 -0
- package/dist/codegen/inputs/openapi/generators/headers.js +101 -0
- package/dist/codegen/inputs/openapi/generators/parameters.d.ts +10 -0
- package/dist/codegen/inputs/openapi/generators/parameters.js +852 -0
- package/dist/codegen/inputs/openapi/generators/payloads.d.ts +3 -0
- package/dist/codegen/inputs/openapi/generators/payloads.js +231 -0
- package/dist/codegen/inputs/openapi/generators/types.d.ts +9 -0
- package/dist/codegen/inputs/openapi/generators/types.js +86 -0
- package/dist/codegen/inputs/openapi/index.d.ts +2 -0
- package/dist/codegen/inputs/openapi/index.js +8 -0
- package/dist/codegen/inputs/openapi/parser.d.ts +4 -0
- package/dist/codegen/inputs/openapi/parser.js +115 -0
- package/dist/codegen/inputs/openapi/security.d.ts +56 -0
- package/dist/codegen/inputs/openapi/security.js +193 -0
- package/dist/codegen/modelina/index.d.ts +2 -0
- package/dist/codegen/modelina/index.js +20 -0
- package/dist/codegen/modelina/presets/index.d.ts +3 -0
- package/dist/codegen/modelina/presets/index.js +14 -0
- package/dist/codegen/modelina/presets/primitives.d.ts +34 -0
- package/dist/codegen/modelina/presets/primitives.js +211 -0
- package/dist/codegen/modelina/presets/union.d.ts +33 -0
- package/dist/codegen/modelina/presets/union.js +197 -0
- package/dist/codegen/modelina/presets/validation.d.ts +66 -0
- package/dist/codegen/modelina/presets/validation.js +183 -0
- package/dist/codegen/modelina/types.d.ts +61845 -0
- package/dist/codegen/modelina/types.js +412 -0
- package/dist/codegen/output/filesystem.d.ts +30 -0
- package/dist/codegen/output/filesystem.js +61 -0
- package/dist/codegen/output/index.d.ts +16 -0
- package/dist/codegen/output/index.js +57 -0
- package/dist/codegen/output/memory.d.ts +54 -0
- package/dist/codegen/output/memory.js +81 -0
- package/dist/codegen/output/modelina.d.ts +30 -0
- package/dist/codegen/output/modelina.js +30 -0
- package/dist/codegen/output/types.d.ts +47 -0
- package/dist/codegen/output/types.js +6 -0
- package/dist/codegen/renderer.d.ts +13 -0
- package/dist/codegen/renderer.js +309 -0
- package/dist/codegen/schemaPostProcess.d.ts +25 -0
- package/dist/codegen/schemaPostProcess.js +38 -0
- package/dist/codegen/types.d.ts +285187 -0
- package/dist/codegen/types.js +177 -0
- package/dist/codegen/utils.d.ts +126 -0
- package/dist/codegen/utils.js +373 -0
- package/dist/commands/base.d.ts +18 -0
- package/dist/commands/base.js +59 -0
- package/dist/commands/generate.d.ts +46 -0
- package/dist/commands/generate.js +305 -0
- package/dist/commands/init.d.ts +55 -0
- package/dist/commands/init.js +544 -0
- package/dist/commands/telemetry.d.ts +25 -0
- package/dist/commands/telemetry.js +115 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +35 -0
- package/dist/telemetry/anonymize.d.ts +19 -0
- package/dist/telemetry/anonymize.js +73 -0
- package/dist/telemetry/collector.d.ts +26 -0
- package/dist/telemetry/collector.js +57 -0
- package/dist/telemetry/config.d.ts +32 -0
- package/dist/telemetry/config.js +97 -0
- package/dist/telemetry/events.d.ts +72 -0
- package/dist/telemetry/events.js +5 -0
- package/dist/telemetry/index.d.ts +46 -0
- package/dist/telemetry/index.js +91 -0
- package/dist/telemetry/notice.d.ts +8 -0
- package/dist/telemetry/notice.js +50 -0
- package/dist/telemetry/sender.d.ts +14 -0
- package/dist/telemetry/sender.js +125 -0
- package/dist/utils/gitignore.d.ts +66 -0
- package/dist/utils/gitignore.js +111 -0
- package/dist/utils/inputSource.d.ts +3 -0
- package/dist/utils/inputSource.js +26 -0
- package/dist/utils/refResolvers.d.ts +29 -0
- package/dist/utils/refResolvers.js +83 -0
- package/dist/utils/remoteFetch.d.ts +18 -0
- package/dist/utils/remoteFetch.js +64 -0
- package/oclif.manifest.json +510 -0
- package/package.json +155 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser shim for @apidevtools/swagger-parser.
|
|
3
|
+
* We don't actually use swagger-parser in the browser - we use @readme/openapi-parser.
|
|
4
|
+
* This shim prevents bundling issues from transitive dependencies.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Stub SwaggerParser that does nothing
|
|
8
|
+
*/
|
|
9
|
+
export declare function SwaggerParser(): void;
|
|
10
|
+
export declare namespace SwaggerParser {
|
|
11
|
+
var parse: (schema: any) => Promise<any>;
|
|
12
|
+
var resolve: (schema: any) => Promise<{
|
|
13
|
+
schema: any;
|
|
14
|
+
$refs: {};
|
|
15
|
+
}>;
|
|
16
|
+
var bundle: (schema: any) => Promise<any>;
|
|
17
|
+
var dereference: (schema: any) => Promise<any>;
|
|
18
|
+
var validate: (schema: any) => Promise<any>;
|
|
19
|
+
}
|
|
20
|
+
export default SwaggerParser;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Browser shim for @apidevtools/swagger-parser.
|
|
4
|
+
* We don't actually use swagger-parser in the browser - we use @readme/openapi-parser.
|
|
5
|
+
* This shim prevents bundling issues from transitive dependencies.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.SwaggerParser = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Stub SwaggerParser that does nothing
|
|
11
|
+
*/
|
|
12
|
+
function SwaggerParser() {
|
|
13
|
+
// Empty constructor
|
|
14
|
+
}
|
|
15
|
+
exports.SwaggerParser = SwaggerParser;
|
|
16
|
+
SwaggerParser.prototype = {
|
|
17
|
+
schema: {},
|
|
18
|
+
api: {},
|
|
19
|
+
$refs: {
|
|
20
|
+
circular: false,
|
|
21
|
+
paths: () => [],
|
|
22
|
+
values: () => ({}),
|
|
23
|
+
get: () => undefined
|
|
24
|
+
},
|
|
25
|
+
parse: async (schema) => schema,
|
|
26
|
+
async resolve() {
|
|
27
|
+
return this;
|
|
28
|
+
},
|
|
29
|
+
bundle: async (schema) => schema,
|
|
30
|
+
dereference: async (schema) => schema,
|
|
31
|
+
validate: async (schema) => schema
|
|
32
|
+
};
|
|
33
|
+
// Static methods
|
|
34
|
+
SwaggerParser.parse = async (schema) => schema;
|
|
35
|
+
SwaggerParser.resolve = async (schema) => ({ schema, $refs: {} });
|
|
36
|
+
SwaggerParser.bundle = async (schema) => schema;
|
|
37
|
+
SwaggerParser.dereference = async (schema) => schema;
|
|
38
|
+
SwaggerParser.validate = async (schema) => schema;
|
|
39
|
+
// Default export
|
|
40
|
+
exports.default = SwaggerParser;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the public configuration JSON Schema from the Zod source of truth.
|
|
3
|
+
* Filters disabled presets out of every top-level configuration branch and
|
|
4
|
+
* keeps the schema's $ref graph internally consistent.
|
|
5
|
+
*/
|
|
6
|
+
import { type PostProcessCallback } from 'zod-to-json-schema';
|
|
7
|
+
/**
|
|
8
|
+
* Note: removing entries from a `anyOf` array shifts the indices of the
|
|
9
|
+
* remaining entries, which would invalidate any sibling `$ref` that points to
|
|
10
|
+
* a later index. The current default `disabledPresets = ['custom']` is safe
|
|
11
|
+
* because `custom` sits at the highest index in every union (AsyncAPI 7,
|
|
12
|
+
* OpenAPI 6, JSON Schema 1) — there are no later indices to break. A future
|
|
13
|
+
* maintainer disabling a non-last preset must add index renumbering here.
|
|
14
|
+
*/
|
|
15
|
+
export declare function buildConfigurationSchema(postProcess: PostProcessCallback, disabledPresets?: readonly string[]): Record<string, unknown>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildConfigurationSchema = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Builds the public configuration JSON Schema from the Zod source of truth.
|
|
6
|
+
* Filters disabled presets out of every top-level configuration branch and
|
|
7
|
+
* keeps the schema's $ref graph internally consistent.
|
|
8
|
+
*/
|
|
9
|
+
const zod_to_json_schema_1 = require("zod-to-json-schema");
|
|
10
|
+
const types_1 = require("./types");
|
|
11
|
+
const DEFAULT_DISABLED_PRESETS = ['custom'];
|
|
12
|
+
const ASYNCAPI_REF_PREFIX = '#/definitions/AsyncAPICodegenConfiguration/properties/generators/items/anyOf/';
|
|
13
|
+
/**
|
|
14
|
+
* Note: removing entries from a `anyOf` array shifts the indices of the
|
|
15
|
+
* remaining entries, which would invalidate any sibling `$ref` that points to
|
|
16
|
+
* a later index. The current default `disabledPresets = ['custom']` is safe
|
|
17
|
+
* because `custom` sits at the highest index in every union (AsyncAPI 7,
|
|
18
|
+
* OpenAPI 6, JSON Schema 1) — there are no later indices to break. A future
|
|
19
|
+
* maintainer disabling a non-last preset must add index renumbering here.
|
|
20
|
+
*/
|
|
21
|
+
function buildConfigurationSchema(postProcess, disabledPresets = DEFAULT_DISABLED_PRESETS) {
|
|
22
|
+
const schema = (0, zod_to_json_schema_1.zodToJsonSchema)(types_1.zodTheCodegenConfiguration, {
|
|
23
|
+
definitions: {
|
|
24
|
+
AsyncAPICodegenConfiguration: types_1.zodAsyncAPICodegenConfiguration
|
|
25
|
+
},
|
|
26
|
+
postProcess
|
|
27
|
+
});
|
|
28
|
+
const asyncapiAnyOf = schema.definitions.AsyncAPICodegenConfiguration.properties.generators.items
|
|
29
|
+
.anyOf;
|
|
30
|
+
const disabledRefs = new Set();
|
|
31
|
+
asyncapiAnyOf.forEach((entry, i) => {
|
|
32
|
+
if (disabledPresets.includes(entry?.properties?.preset?.const)) {
|
|
33
|
+
disabledRefs.add(`${ASYNCAPI_REF_PREFIX}${i}`);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
const isDisabled = (entry) => disabledPresets.includes(entry?.properties?.preset?.const) ||
|
|
37
|
+
(typeof entry?.$ref === 'string' && disabledRefs.has(entry.$ref));
|
|
38
|
+
for (const branch of schema.anyOf ?? []) {
|
|
39
|
+
const items = branch?.properties?.generators?.items;
|
|
40
|
+
if (Array.isArray(items?.anyOf)) {
|
|
41
|
+
items.anyOf = items.anyOf.filter((entry) => !isDisabled(entry));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
schema.definitions.AsyncAPICodegenConfiguration.properties.generators.items.anyOf =
|
|
45
|
+
asyncapiAnyOf.filter((entry) => !isDisabled(entry));
|
|
46
|
+
return schema;
|
|
47
|
+
}
|
|
48
|
+
exports.buildConfigurationSchema = buildConfigurationSchema;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { TheCodegenConfiguration, TheCodegenConfigurationInternal, RunGeneratorContext, PresetTypes, SupportedLanguages, GeneratorsInternal } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Load configuration from file.
|
|
4
|
+
*/
|
|
5
|
+
export declare function loadConfigFile(filePath?: string): Promise<{
|
|
6
|
+
config: TheCodegenConfiguration;
|
|
7
|
+
filePath: string;
|
|
8
|
+
}>;
|
|
9
|
+
/**
|
|
10
|
+
* Load the configuration file and realize it with default options if necessary.
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadAndRealizeConfigFile(filePath?: string): Promise<{
|
|
13
|
+
config: TheCodegenConfigurationInternal;
|
|
14
|
+
filePath: string;
|
|
15
|
+
}>;
|
|
16
|
+
/**
|
|
17
|
+
* Ensure that each generator has the default options along side custom properties
|
|
18
|
+
*/
|
|
19
|
+
export declare function realizeConfiguration(config: TheCodegenConfiguration): TheCodegenConfigurationInternal;
|
|
20
|
+
/**
|
|
21
|
+
* Returns the default generator for the preset of the language
|
|
22
|
+
*/
|
|
23
|
+
export declare function getDefaultConfiguration(preset: PresetTypes, language: SupportedLanguages): GeneratorsInternal | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Load configuration and input document to create generator context
|
|
26
|
+
*
|
|
27
|
+
* @param configFile
|
|
28
|
+
*/
|
|
29
|
+
export declare function realizeGeneratorContext(configFile: string | undefined): Promise<RunGeneratorContext>;
|
|
@@ -0,0 +1,260 @@
|
|
|
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.realizeGeneratorContext = exports.getDefaultConfiguration = exports.realizeConfiguration = exports.loadAndRealizeConfigFile = exports.loadConfigFile = void 0;
|
|
7
|
+
const types_1 = require("./types");
|
|
8
|
+
const generators_1 = require("./generators");
|
|
9
|
+
const LoggingInterface_1 = require("../LoggingInterface");
|
|
10
|
+
const channels_1 = require("./generators/typescript/channels");
|
|
11
|
+
const utils_1 = require("./utils");
|
|
12
|
+
const cosmiconfig_1 = require("cosmiconfig");
|
|
13
|
+
const client_1 = require("./generators/typescript/client");
|
|
14
|
+
const path_1 = __importDefault(require("path"));
|
|
15
|
+
const asyncapi_1 = require("./inputs/asyncapi");
|
|
16
|
+
const openapi_1 = require("./inputs/openapi");
|
|
17
|
+
const jsonschema_1 = require("./inputs/jsonschema");
|
|
18
|
+
const typescript_1 = require("./generators/typescript");
|
|
19
|
+
const models_1 = require("./generators/typescript/models");
|
|
20
|
+
const errors_1 = require("./errors");
|
|
21
|
+
const detection_1 = require("./detection");
|
|
22
|
+
const inputSource_1 = require("../utils/inputSource");
|
|
23
|
+
const moduleName = 'codegen';
|
|
24
|
+
const explorer = (0, cosmiconfig_1.cosmiconfig)(moduleName, {
|
|
25
|
+
searchPlaces: [
|
|
26
|
+
`${moduleName}.json`,
|
|
27
|
+
`${moduleName}.yaml`,
|
|
28
|
+
`${moduleName}.yml`,
|
|
29
|
+
`${moduleName}.js`,
|
|
30
|
+
`${moduleName}.ts`,
|
|
31
|
+
`${moduleName}.mjs`,
|
|
32
|
+
`${moduleName}.cjs`
|
|
33
|
+
],
|
|
34
|
+
mergeSearchPlaces: true
|
|
35
|
+
});
|
|
36
|
+
/**
|
|
37
|
+
* Load configuration from file.
|
|
38
|
+
*/
|
|
39
|
+
async function loadConfigFile(filePath) {
|
|
40
|
+
let cosmiConfig;
|
|
41
|
+
if (filePath) {
|
|
42
|
+
try {
|
|
43
|
+
cosmiConfig = await explorer.load(filePath);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
// Check if it's actually a file-not-found error
|
|
47
|
+
if (error.code === 'ENOENT' || error.message?.includes('ENOENT')) {
|
|
48
|
+
throw (0, errors_1.createConfigNotFoundError)({ filePath });
|
|
49
|
+
}
|
|
50
|
+
// For other errors (syntax, parse, permission, etc.), wrap in parse error
|
|
51
|
+
throw (0, errors_1.createConfigParseError)({ filePath, originalError: error });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
cosmiConfig = await explorer.search();
|
|
56
|
+
if (!cosmiConfig) {
|
|
57
|
+
const searchLocations = [
|
|
58
|
+
'codegen.json',
|
|
59
|
+
'codegen.yaml',
|
|
60
|
+
'codegen.yml',
|
|
61
|
+
'codegen.js',
|
|
62
|
+
'codegen.ts',
|
|
63
|
+
'codegen.mjs',
|
|
64
|
+
'codegen.cjs'
|
|
65
|
+
];
|
|
66
|
+
throw (0, errors_1.createConfigNotFoundError)({ searchLocations });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
let codegenConfig;
|
|
70
|
+
if (typeof cosmiConfig.config.default === 'function') {
|
|
71
|
+
codegenConfig = cosmiConfig.config.default();
|
|
72
|
+
}
|
|
73
|
+
else if (typeof cosmiConfig.config.default === 'object') {
|
|
74
|
+
codegenConfig = cosmiConfig.config.default;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
codegenConfig = cosmiConfig.config;
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
config: codegenConfig,
|
|
81
|
+
filePath: cosmiConfig.filepath
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
exports.loadConfigFile = loadConfigFile;
|
|
85
|
+
/**
|
|
86
|
+
* Load the configuration file and realize it with default options if necessary.
|
|
87
|
+
*/
|
|
88
|
+
async function loadAndRealizeConfigFile(filePath) {
|
|
89
|
+
const codegenConfig = await loadConfigFile(filePath);
|
|
90
|
+
const realizedConfiguration = realizeConfiguration(codegenConfig.config);
|
|
91
|
+
return {
|
|
92
|
+
config: realizedConfiguration,
|
|
93
|
+
filePath: codegenConfig.filePath
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
exports.loadAndRealizeConfigFile = loadAndRealizeConfigFile;
|
|
97
|
+
/**
|
|
98
|
+
* Ensure that each generator has the default options along side custom properties
|
|
99
|
+
*/
|
|
100
|
+
function realizeConfiguration(config) {
|
|
101
|
+
config.generators = config.generators ?? [];
|
|
102
|
+
const generatorIds = [];
|
|
103
|
+
for (const [index, generator] of config.generators.entries()) {
|
|
104
|
+
const language = generator.language ?? config.language ?? 'typescript';
|
|
105
|
+
if (!generator?.preset) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const defaultGenerator = getDefaultConfiguration(generator.preset, language);
|
|
109
|
+
if (!defaultGenerator) {
|
|
110
|
+
throw (0, errors_1.createInvalidPresetError)({ preset: generator.preset, language });
|
|
111
|
+
}
|
|
112
|
+
const generatorToUse = (0, utils_1.mergePartialAndDefault)(defaultGenerator, generator);
|
|
113
|
+
const oldId = generatorToUse.id;
|
|
114
|
+
// Make sure that each generator has unique ids if they dont explicit define one
|
|
115
|
+
if (generatorToUse.id === defaultGenerator.id) {
|
|
116
|
+
const duplicateGenerators = generatorIds.filter((generatorId) => generatorId === generatorToUse.id);
|
|
117
|
+
if (duplicateGenerators.length > 0) {
|
|
118
|
+
generatorToUse.id = `${generatorToUse.id}-${duplicateGenerators.length}`;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
generatorIds.push(oldId);
|
|
122
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
123
|
+
config.generators[index] = generatorToUse;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
types_1.zodTheCodegenConfiguration.parse(config);
|
|
127
|
+
}
|
|
128
|
+
catch (e) {
|
|
129
|
+
const errors = (0, errors_1.parseZodErrors)(e);
|
|
130
|
+
// Log each error for debugging
|
|
131
|
+
errors.forEach((error) => LoggingInterface_1.Logger.error(error));
|
|
132
|
+
throw (0, errors_1.createConfigValidationError)({ validationErrors: errors });
|
|
133
|
+
}
|
|
134
|
+
const newGenerators = ensureProperGenerators(config);
|
|
135
|
+
config.generators.push(...newGenerators);
|
|
136
|
+
return config;
|
|
137
|
+
}
|
|
138
|
+
exports.realizeConfiguration = realizeConfiguration;
|
|
139
|
+
/**
|
|
140
|
+
* Ensure that all generators have their dependency default generators.
|
|
141
|
+
*
|
|
142
|
+
* For example, for typescript channels, include default payload and parameter generators if not explicitly sat.
|
|
143
|
+
*
|
|
144
|
+
* This is done recursively.
|
|
145
|
+
*/
|
|
146
|
+
function ensureProperGenerators(config) {
|
|
147
|
+
const iterateGenerators = (generators) => {
|
|
148
|
+
const newGenerators = [];
|
|
149
|
+
for (const generator of generators) {
|
|
150
|
+
const language = generator.language ?? config.language;
|
|
151
|
+
if (generator.preset === 'channels' && language === 'typescript') {
|
|
152
|
+
newGenerators.push(...(0, channels_1.includeTypeScriptChannelDependencies)(config, generator));
|
|
153
|
+
}
|
|
154
|
+
if (generator.preset === 'client' && language === 'typescript') {
|
|
155
|
+
newGenerators.push(...(0, client_1.includeTypeScriptClientDependencies)(config, generator));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
if (newGenerators.length > 0) {
|
|
159
|
+
newGenerators.push(...iterateGenerators(newGenerators));
|
|
160
|
+
}
|
|
161
|
+
return newGenerators;
|
|
162
|
+
};
|
|
163
|
+
return iterateGenerators(Array.from(config.generators.values()));
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Returns the default generator for the preset of the language
|
|
167
|
+
*/
|
|
168
|
+
function getDefaultConfiguration(preset, language) {
|
|
169
|
+
switch (preset) {
|
|
170
|
+
case 'payloads':
|
|
171
|
+
switch (language) {
|
|
172
|
+
case 'typescript':
|
|
173
|
+
return generators_1.defaultTypeScriptPayloadGenerator;
|
|
174
|
+
}
|
|
175
|
+
break;
|
|
176
|
+
case 'headers':
|
|
177
|
+
switch (language) {
|
|
178
|
+
case 'typescript':
|
|
179
|
+
return typescript_1.defaultTypeScriptHeadersOptions;
|
|
180
|
+
}
|
|
181
|
+
break;
|
|
182
|
+
case 'types':
|
|
183
|
+
switch (language) {
|
|
184
|
+
case 'typescript':
|
|
185
|
+
return typescript_1.defaultTypeScriptTypesOptions;
|
|
186
|
+
}
|
|
187
|
+
break;
|
|
188
|
+
case 'models':
|
|
189
|
+
switch (language) {
|
|
190
|
+
case 'typescript':
|
|
191
|
+
return models_1.defaultTypeScriptModelsOptions;
|
|
192
|
+
}
|
|
193
|
+
break;
|
|
194
|
+
case 'channels':
|
|
195
|
+
switch (language) {
|
|
196
|
+
case 'typescript':
|
|
197
|
+
return channels_1.defaultTypeScriptChannelsGenerator;
|
|
198
|
+
}
|
|
199
|
+
break;
|
|
200
|
+
case 'client':
|
|
201
|
+
switch (language) {
|
|
202
|
+
case 'typescript':
|
|
203
|
+
return client_1.defaultTypeScriptClientGenerator;
|
|
204
|
+
}
|
|
205
|
+
break;
|
|
206
|
+
case 'custom':
|
|
207
|
+
return generators_1.defaultCustomGenerator;
|
|
208
|
+
case 'parameters':
|
|
209
|
+
switch (language) {
|
|
210
|
+
case 'typescript':
|
|
211
|
+
return generators_1.defaultTypeScriptParametersOptions;
|
|
212
|
+
}
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
return undefined;
|
|
216
|
+
}
|
|
217
|
+
exports.getDefaultConfiguration = getDefaultConfiguration;
|
|
218
|
+
/**
|
|
219
|
+
* Load configuration and input document to create generator context
|
|
220
|
+
*
|
|
221
|
+
* @param configFile
|
|
222
|
+
*/
|
|
223
|
+
async function realizeGeneratorContext(configFile) {
|
|
224
|
+
const { config, filePath } = await loadAndRealizeConfigFile(configFile);
|
|
225
|
+
// Apply automatic project detection if importExtension not explicitly set
|
|
226
|
+
if (config.importExtension === undefined) {
|
|
227
|
+
const projectDir = path_1.default.dirname(filePath);
|
|
228
|
+
const detected = await (0, detection_1.detectTypeScriptImportExtension)(projectDir);
|
|
229
|
+
if (detected !== null) {
|
|
230
|
+
config.importExtension = detected;
|
|
231
|
+
LoggingInterface_1.Logger.info(`Auto-detected importExtension: '${detected}'`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
LoggingInterface_1.Logger.debug(`Found configuration: ${JSON.stringify(config, null, 2)}`);
|
|
235
|
+
const documentPath = (0, inputSource_1.isRemoteUrl)(config.inputPath)
|
|
236
|
+
? config.inputPath
|
|
237
|
+
: path_1.default.resolve(path_1.default.dirname(filePath), config.inputPath);
|
|
238
|
+
LoggingInterface_1.Logger.verbose(`Document path: ${documentPath}`);
|
|
239
|
+
LoggingInterface_1.Logger.verbose(`Input type: ${config.inputType}`);
|
|
240
|
+
const context = {
|
|
241
|
+
configuration: config,
|
|
242
|
+
documentPath,
|
|
243
|
+
inputAuth: config.auth,
|
|
244
|
+
configFilePath: filePath
|
|
245
|
+
};
|
|
246
|
+
if (config.inputType === 'asyncapi') {
|
|
247
|
+
const document = await (0, asyncapi_1.loadAsyncapi)(context);
|
|
248
|
+
context.asyncapiDocument = document;
|
|
249
|
+
}
|
|
250
|
+
else if (config.inputType === 'openapi') {
|
|
251
|
+
const document = await (0, openapi_1.loadOpenapi)(context);
|
|
252
|
+
context.openapiDocument = document;
|
|
253
|
+
}
|
|
254
|
+
else if (config.inputType === 'jsonschema') {
|
|
255
|
+
const document = await (0, jsonschema_1.loadJsonSchema)(context);
|
|
256
|
+
context.jsonSchemaDocument = document;
|
|
257
|
+
}
|
|
258
|
+
return context;
|
|
259
|
+
}
|
|
260
|
+
exports.realizeGeneratorContext = realizeGeneratorContext;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ImportExtension } from './utils';
|
|
2
|
+
/**
|
|
3
|
+
* Detects appropriate import extension based on project configuration.
|
|
4
|
+
*
|
|
5
|
+
* Detection priority:
|
|
6
|
+
* 1. Bundler config files present → 'none'
|
|
7
|
+
* 2. Bundler in dependencies → 'none'
|
|
8
|
+
* 3. moduleResolution: 'bundler' → 'none'
|
|
9
|
+
* 4. moduleResolution: 'node16'/'nodenext' (or inferred from module) + allowImportingTsExtensions → '.ts'
|
|
10
|
+
* 5. moduleResolution: 'node16'/'nodenext' (or inferred from module) → '.js'
|
|
11
|
+
* 6. Otherwise → null (use default)
|
|
12
|
+
*
|
|
13
|
+
* Note: If moduleResolution is not set but module is 'Node16' or 'NodeNext',
|
|
14
|
+
* moduleResolution is inferred per TypeScript's behavior.
|
|
15
|
+
*
|
|
16
|
+
* @param projectDir - Directory to analyze (where package.json/tsconfig.json are)
|
|
17
|
+
* @returns Detected import extension or null if no detection could be made
|
|
18
|
+
*/
|
|
19
|
+
export declare function detectTypeScriptImportExtension(projectDir: string): Promise<ImportExtension | null>;
|
|
@@ -0,0 +1,174 @@
|
|
|
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.detectTypeScriptImportExtension = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Project settings detection for automatic configuration.
|
|
9
|
+
* Detects TypeScript module resolution settings and bundler presence
|
|
10
|
+
* to set intelligent defaults for importExtension.
|
|
11
|
+
*/
|
|
12
|
+
const fs_1 = require("fs");
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const comment_json_1 = require("comment-json");
|
|
15
|
+
const LoggingInterface_1 = require("../LoggingInterface");
|
|
16
|
+
/** Bundler packages that indicate no extension is needed */
|
|
17
|
+
const BUNDLER_DEPS = new Set([
|
|
18
|
+
'webpack',
|
|
19
|
+
'vite',
|
|
20
|
+
'esbuild',
|
|
21
|
+
'rollup',
|
|
22
|
+
'parcel',
|
|
23
|
+
'turbopack',
|
|
24
|
+
'next',
|
|
25
|
+
'@rspack/core'
|
|
26
|
+
]);
|
|
27
|
+
/** Bundler config files that indicate no extension is needed */
|
|
28
|
+
const BUNDLER_CONFIGS = [
|
|
29
|
+
'vite.config.ts',
|
|
30
|
+
'vite.config.js',
|
|
31
|
+
'vite.config.mjs',
|
|
32
|
+
'webpack.config.js',
|
|
33
|
+
'webpack.config.ts',
|
|
34
|
+
'webpack.config.mjs',
|
|
35
|
+
'rollup.config.js',
|
|
36
|
+
'rollup.config.ts',
|
|
37
|
+
'rollup.config.mjs',
|
|
38
|
+
'next.config.js',
|
|
39
|
+
'next.config.ts',
|
|
40
|
+
'next.config.mjs',
|
|
41
|
+
'esbuild.config.js',
|
|
42
|
+
'esbuild.config.mjs',
|
|
43
|
+
'rspack.config.js',
|
|
44
|
+
'rspack.config.ts',
|
|
45
|
+
'rspack.config.mjs'
|
|
46
|
+
];
|
|
47
|
+
/**
|
|
48
|
+
* Safely read and parse JSON file, returning null on any error.
|
|
49
|
+
* For tsconfig.json, uses JSONC parsing (via comment-json) to handle comments and trailing commas.
|
|
50
|
+
*/
|
|
51
|
+
function readJsonFile(filePath, allowJsonc = false) {
|
|
52
|
+
try {
|
|
53
|
+
const content = (0, fs_1.readFileSync)(filePath, 'utf8');
|
|
54
|
+
if (allowJsonc) {
|
|
55
|
+
return (0, comment_json_1.parse)(content);
|
|
56
|
+
}
|
|
57
|
+
return JSON.parse(content);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Check for bundler config files in the project directory.
|
|
65
|
+
*/
|
|
66
|
+
function detectBundlerConfigFile(projectDir) {
|
|
67
|
+
for (const configFile of BUNDLER_CONFIGS) {
|
|
68
|
+
const configPath = path_1.default.join(projectDir, configFile);
|
|
69
|
+
if ((0, fs_1.existsSync)(configPath)) {
|
|
70
|
+
return configFile;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Check for bundler dependencies in package.json.
|
|
77
|
+
*/
|
|
78
|
+
function detectBundlerDependency(packageJson) {
|
|
79
|
+
const allDeps = Object.keys({
|
|
80
|
+
...packageJson.dependencies,
|
|
81
|
+
...packageJson.devDependencies
|
|
82
|
+
});
|
|
83
|
+
for (const dep of allDeps) {
|
|
84
|
+
if (BUNDLER_DEPS.has(dep)) {
|
|
85
|
+
return dep;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Determine import extension from tsconfig moduleResolution setting.
|
|
92
|
+
* If moduleResolution is undefined, infers it from the module setting per TypeScript rules.
|
|
93
|
+
*/
|
|
94
|
+
function detectFromModuleResolution(moduleRes, module, allowTsExtensions) {
|
|
95
|
+
// Infer moduleResolution from module if not explicitly set
|
|
96
|
+
// TypeScript infers: "Node16" → "node16", "NodeNext" → "nodenext"
|
|
97
|
+
let resolution = moduleRes?.toLowerCase();
|
|
98
|
+
if (!resolution && module) {
|
|
99
|
+
const moduleLower = module.toLowerCase();
|
|
100
|
+
if (moduleLower === 'node16' || moduleLower === 'nodenext') {
|
|
101
|
+
resolution = moduleLower;
|
|
102
|
+
LoggingInterface_1.Logger.verbose(`Inferred moduleResolution: ${resolution} from module: ${module}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (resolution === 'bundler') {
|
|
106
|
+
LoggingInterface_1.Logger.verbose(`Auto-detected moduleResolution: bundler → importExtension: 'none'`);
|
|
107
|
+
return 'none';
|
|
108
|
+
}
|
|
109
|
+
if (resolution === 'node16' || resolution === 'nodenext') {
|
|
110
|
+
if (allowTsExtensions) {
|
|
111
|
+
LoggingInterface_1.Logger.verbose(`Auto-detected moduleResolution: ${resolution} with allowImportingTsExtensions → importExtension: '.ts'`);
|
|
112
|
+
return '.ts';
|
|
113
|
+
}
|
|
114
|
+
LoggingInterface_1.Logger.verbose(`Auto-detected moduleResolution: ${resolution} → importExtension: '.js'`);
|
|
115
|
+
return '.js';
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Detects appropriate import extension based on project configuration.
|
|
121
|
+
*
|
|
122
|
+
* Detection priority:
|
|
123
|
+
* 1. Bundler config files present → 'none'
|
|
124
|
+
* 2. Bundler in dependencies → 'none'
|
|
125
|
+
* 3. moduleResolution: 'bundler' → 'none'
|
|
126
|
+
* 4. moduleResolution: 'node16'/'nodenext' (or inferred from module) + allowImportingTsExtensions → '.ts'
|
|
127
|
+
* 5. moduleResolution: 'node16'/'nodenext' (or inferred from module) → '.js'
|
|
128
|
+
* 6. Otherwise → null (use default)
|
|
129
|
+
*
|
|
130
|
+
* Note: If moduleResolution is not set but module is 'Node16' or 'NodeNext',
|
|
131
|
+
* moduleResolution is inferred per TypeScript's behavior.
|
|
132
|
+
*
|
|
133
|
+
* @param projectDir - Directory to analyze (where package.json/tsconfig.json are)
|
|
134
|
+
* @returns Detected import extension or null if no detection could be made
|
|
135
|
+
*/
|
|
136
|
+
async function detectTypeScriptImportExtension(projectDir) {
|
|
137
|
+
try {
|
|
138
|
+
// Step 1: Check for bundler config files
|
|
139
|
+
const bundlerConfig = detectBundlerConfigFile(projectDir);
|
|
140
|
+
if (bundlerConfig) {
|
|
141
|
+
LoggingInterface_1.Logger.verbose(`Auto-detected bundler config: ${bundlerConfig} → importExtension: 'none'`);
|
|
142
|
+
return 'none';
|
|
143
|
+
}
|
|
144
|
+
// Step 2: Check package.json for bundler dependencies
|
|
145
|
+
const packageJsonPath = path_1.default.join(projectDir, 'package.json');
|
|
146
|
+
const packageJson = readJsonFile(packageJsonPath);
|
|
147
|
+
if (packageJson) {
|
|
148
|
+
const bundlerDep = detectBundlerDependency(packageJson);
|
|
149
|
+
if (bundlerDep) {
|
|
150
|
+
LoggingInterface_1.Logger.verbose(`Auto-detected bundler dependency: ${bundlerDep} → importExtension: 'none'`);
|
|
151
|
+
return 'none';
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Step 3: Read tsconfig.json for moduleResolution (use JSONC parser)
|
|
155
|
+
const tsconfigPath = path_1.default.join(projectDir, 'tsconfig.json');
|
|
156
|
+
const tsconfig = readJsonFile(tsconfigPath, true);
|
|
157
|
+
if (!tsconfig) {
|
|
158
|
+
LoggingInterface_1.Logger.verbose('Could not read tsconfig.json, skipping import extension detection');
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
const options = tsconfig.compilerOptions;
|
|
162
|
+
if (!options) {
|
|
163
|
+
LoggingInterface_1.Logger.verbose('No compilerOptions in tsconfig.json');
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
// Step 4: Check moduleResolution (with inference from module if needed)
|
|
167
|
+
return detectFromModuleResolution(options.moduleResolution, options.module, options.allowImportingTsExtensions);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
LoggingInterface_1.Logger.verbose(`Project detection failed: ${error}`);
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
exports.detectTypeScriptImportExtension = detectTypeScriptImportExtension;
|