From b80f6e07ca170db0eae2596e428ca3d834bb8f8d Mon Sep 17 00:00:00 2001 From: Moh <40035796+muhabdulkadir@users.noreply.github.com> Date: Sat, 30 May 2026 07:56:05 +0100 Subject: [PATCH] fix(*): resolve typeScript visitor imports for map types Signed-off-by: Moh <40035796+muhabdulkadir@users.noreply.github.com> --- .../fromcto/typescript/typescriptvisitor.js | 3 ++- test/codegen/__snapshots__/codegen.js.snap | 2 +- .../fromcto/typescript/typescriptvisitor.js | 17 ++++++++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lib/codegen/fromcto/typescript/typescriptvisitor.js b/lib/codegen/fromcto/typescript/typescriptvisitor.js index ea36feb1..7907c8e3 100644 --- a/lib/codegen/fromcto/typescript/typescriptvisitor.js +++ b/lib/codegen/fromcto/typescript/typescriptvisitor.js @@ -142,8 +142,9 @@ class TypescriptVisitor { if (!property.isPrimitive()) { const typeNamespace = ModelUtil.getNamespace(property.getFullyQualifiedTypeName()); const typeName = ModelUtil.getShortName(property.getFullyQualifiedTypeName()); + const isMapRef = declaration.getModelFile().getModelManager().getType(property.getFullyQualifiedTypeName?.()).isMapDeclaration?.(); addImport(typeNamespace, - property.isTypeEnum?.() || property.isTypeScalar?.() ? typeName : `I${typeName}`); + property.isTypeEnum?.() || property.isTypeScalar?.() || isMapRef ? typeName : `I${typeName}`); } }); diff --git a/test/codegen/__snapshots__/codegen.js.snap b/test/codegen/__snapshots__/codegen.js.snap index c73842a0..a1a77602 100644 --- a/test/codegen/__snapshots__/codegen.js.snap +++ b/test/codegen/__snapshots__/codegen.js.snap @@ -6997,7 +6997,7 @@ exports[`codegen #formats check we can convert all formats from namespace versio // Warning: Beware of circular dependencies when modifying these imports // Warning: Beware of circular dependencies when modifying these imports -import {Time,SSN,IAddress,IEmployeeTShirtSizes} from './org.acme.hr.base@1.0.0'; +import {Time,SSN,IAddress,EmployeeTShirtSizes} from './org.acme.hr.base@1.0.0'; import {IDecorator} from './concerto.decorator@1.0.0'; import {IConcept,IAsset,IParticipant,IEvent,ITransaction} from './concerto@1.0.0'; diff --git a/test/codegen/fromcto/typescript/typescriptvisitor.js b/test/codegen/fromcto/typescript/typescriptvisitor.js index 6eca3a02..bdc5d687 100644 --- a/test/codegen/fromcto/typescript/typescriptvisitor.js +++ b/test/codegen/fromcto/typescript/typescriptvisitor.js @@ -247,11 +247,15 @@ describe('TypescriptVisitor', function () { mockClassDeclaration.accept = acceptSpy; let mockClassDeclaration2 = sinon.createStubInstance(ClassDeclaration); - mockClassDeclaration.isEnum.returns(false); + mockClassDeclaration2.isEnum.returns(false); mockClassDeclaration2.getSuperType.returns('super.Parent'); mockClassDeclaration2.getProperties.returns([]); mockClassDeclaration2.accept = acceptSpy; + let mockModelManager = sinon.createStubInstance(ModelManager); + mockModelManager.isModelManager.returns(true); + mockModelManager.getType.returns({ isMapDeclaration: () => false }); + let mockModelFile = sinon.createStubInstance(ModelFile); mockModelFile.getNamespace.returns('org.acme'); mockModelFile.getAllDeclarations.returns([ @@ -266,6 +270,9 @@ describe('TypescriptVisitor', function () { 'super.Property3', 'super.Parent' ]); + mockModelFile.getModelManager.returns(mockModelManager); + mockClassDeclaration.getModelFile.returns(mockModelFile); + mockClassDeclaration2.getModelFile.returns(mockModelFile); mockModelFile.imports= []; typescriptVisitor.visitModelFile(mockModelFile, param); @@ -323,6 +330,7 @@ describe('TypescriptVisitor', function () { let mockModelManager = sinon.createStubInstance(ModelManager); mockModelManager.isModelManager.returns(true); + mockModelManager.getType.returns({ isMapDeclaration: () => false }); let mockModelFile = sinon.createStubInstance(ModelFile); mockModelFile.isModelFile.returns(true); @@ -337,6 +345,7 @@ describe('TypescriptVisitor', function () { 'org.org2.Import1' ]); mockModelFile.getModelManager.returns(mockModelManager); + mockClassDeclaration.getModelFile.returns(mockModelFile); mockModelFile.imports= []; typescriptVisitor.visitModelFile(mockModelFile, param); @@ -438,8 +447,14 @@ describe('TypescriptVisitor', function () { mockClassDeclaration.getDirectSubclasses.returns([]); + let mockModelManager = sinon.createStubInstance(ModelManager); + mockModelManager.isModelManager.returns(true); + mockModelManager.getType.returns({ isMapDeclaration: () => false }); + let mockModelFile = sinon.createStubInstance(ModelFile); mockModelFile.getNamespace.returns('org.test.collection'); + mockModelFile.getModelManager.returns(mockModelManager); + mockClassDeclaration.getModelFile.returns(mockModelFile); mockModelFile.imports = [ { '$class': 'concerto.metamodel@1.0.0.ImportTypes',