From 650b69c0ba8e1be548d7b17d79ffb6dae797ef82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20Saint-F=C3=A9lix?= Date: Mon, 24 Jun 2024 16:11:16 +0200 Subject: [PATCH 1/2] wrap ts-morph errors to provide helpful error --- compiler/src/model/build-model.ts | 21 +++++++++++++-------- compiler/src/model/utils.ts | 13 +++++++++---- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/compiler/src/model/build-model.ts b/compiler/src/model/build-model.ts index 303499c87a..ea8b6979f1 100644 --- a/compiler/src/model/build-model.ts +++ b/compiler/src/model/build-model.ts @@ -479,15 +479,20 @@ function compileClassOrInterfaceDeclaration (declaration: ClassDeclaration | Int Node.isPropertyDeclaration(member) || Node.isPropertySignature(member), 'Class and interfaces can only have property declarations or signatures' ) - const property = modelProperty(member) - if (type.variants?.kind === 'container' && property.containerProperty == null) { - assert( - member, - !property.required, - 'All @variants container properties must be optional' - ) + try { + const property = modelProperty(member) + if (type.variants?.kind === 'container' && property.containerProperty == null) { + assert( + member, + !property.required, + 'All @variants container properties must be optional' + ) + } + type.properties.push(property) + } catch(e) { + console.log(`failed to parse ${declaration.getName()}, reason:`, e.message) + process.exit(1) } - type.properties.push(property) } // The class or interface is extended, an extended class or interface could diff --git a/compiler/src/model/utils.ts b/compiler/src/model/utils.ts index 01c60023ca..9f6d953957 100644 --- a/compiler/src/model/utils.ts +++ b/compiler/src/model/utils.ts @@ -532,10 +532,15 @@ export function modelProperty (declaration: PropertySignature | PropertyDeclarat // names that contains `.` or `-` will be wrapped inside single quotes const name = declaration.getName().replace(/'/g, '') - const property = { - name, - required: !declaration.hasQuestionToken(), - type: modelType(type) + let property: model.Property + try { + property = { + name, + required: !declaration.hasQuestionToken(), + type: modelType(type) + } + } catch (e) { + throw new Error(`cannot determine type of ${name}, got:${type.getFullText()}`) } hoistPropertyAnnotations(property, declaration.getJsDocs()) return property From ba88f511df36a223fe5ceaa7dabb5aeec84699ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20Saint-F=C3=A9lix?= Date: Mon, 24 Jun 2024 16:20:56 +0200 Subject: [PATCH 2/2] improve after lint --- compiler/src/model/build-model.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/compiler/src/model/build-model.ts b/compiler/src/model/build-model.ts index ea8b6979f1..b450125768 100644 --- a/compiler/src/model/build-model.ts +++ b/compiler/src/model/build-model.ts @@ -483,14 +483,19 @@ function compileClassOrInterfaceDeclaration (declaration: ClassDeclaration | Int const property = modelProperty(member) if (type.variants?.kind === 'container' && property.containerProperty == null) { assert( - member, - !property.required, - 'All @variants container properties must be optional' + member, + !property.required, + 'All @variants container properties must be optional' ) } type.properties.push(property) - } catch(e) { - console.log(`failed to parse ${declaration.getName()}, reason:`, e.message) + } catch (e) { + const name = declaration.getName() + if (name !== undefined) { + console.log(`failed to parse ${name}, reason:`, e.message) + } else { + console.log('failed to parse field, reason:', e.message) + } process.exit(1) } }