castle icon indicating copy to clipboard operation
castle copied to clipboard

Incorrect Import Statement and Type Declaration in External Example

Open meirkeller opened this issue 1 year ago • 4 comments

I'm currently working with the external example in the repository.

Upon executing the script, I encountered the following output:

DeprecationWarning: 'createPropertySignature' has been deprecated since v4.0.0. Use the appropriate method on 'ts.factory' or the 'factory' supplied by your transformation context instead.
DeprecationWarning: 'createInterfaceDeclaration' has been deprecated since v4.8.0. Decorators are no longer supported for this function. Callers should switch to an overload that does not accept a 'decorators' parameter.
DeprecationWarning: 'createTypeAliasDeclaration' has been deprecated since v4.8.0. Decorators are no longer supported for this function. Callers should switch to an overload that does not accept a 'decorators' parameter.
DeprecationWarning: 'createModuleDeclaration' has been deprecated since v4.8.0. Decorators are no longer supported for this function. Callers should switch to an overload that does not accept a 'decorators' parameter.
DeprecationWarning: 'createImportClause' has been deprecated since v4.0.0. Use the appropriate method on 'ts.factory' or the 'factory' supplied by your transformation context instead.
DeprecationWarning: 'createImportDeclaration' has been deprecated since v4.8.0. Decorators are no longer supported for this function. Callers should switch to an overload that does not accept a 'decorators' parameter.

/* eslint-disable @typescript-eslint/no-namespace */

import { type MyNamespaceDataAddress as  } from "./external-Address";

export type CreateUser = MyNamespaceMessages.CreateUser;

export namespace MyNamespaceMessages {
    export const CreateUserSchema = "{\"type\":\"record\",\"name\":\"CreateUser\",\"namespace\":\"my.namespace.messages\",\"fields\":[{\"name\":\"userId\",\"type\":\"string\",\"logicalType\":\"uuid\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"my.namespace.data.Address\"}]}";
    export const CreateUserName = "my.namespace.messages.CreateUser";
    export interface CreateUser {
        userId: string;
        name: string;
        address: MyNamespaceDataAddress.Address;
    }
}

There are two issues identified in the output:

  1. The import statement import { type MyNamespaceDataAddress as } from "./external-Address"; is incorrect and should be replaced with import { type MyNamespaceData } from "./external-Address";.
  2. The type of address in the CreateUser interface is declared as MyNamespaceDataAddress.Address, but it should be MyNamespaceData.Address.
/* eslint-disable @typescript-eslint/no-namespace */

import { type MyNamespaceData } from "./external-Address";

export type CreateUser = MyNamespaceMessages.CreateUser;

export namespace MyNamespaceMessages {
    export const CreateUserSchema = "{\"type\":\"record\",\"name\":\"CreateUser\",\"namespace\":\"my.namespace.messages\",\"fields\":[{\"name\":\"userId\",\"type\":\"string\",\"logicalType\":\"uuid\"},{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"address\",\"type\":\"my.namespace.data.Address\"}]}";
    export const CreateUserName = "my.namespace.messages.CreateUser";
    export interface CreateUser {
        userId: string;
        name: string;
        address: MyNamespaceData.Address;
    }
}

These corrections would ensure the code functions as intended.

Node version: v18.19.0 Typescript version: 5.4.2 Using default tsconfig

meirkeller avatar Mar 19 '24 07:03 meirkeller

Reproduction Steps for the First Issue:

To reproduce the first issue regarding the incorrect import statement, follow these steps:

import { Node, printNode } from '@ovotech/ts-compose';

// Debugging the issue: These args represent the parameters passed down to the import function call
const args = {
    allAs: undefined,
    defaultAs: undefined,
    module: './external-Address',
    named: [
    {
      name: "MyNamespaceData",
      as: "MyNamespaceDataAddress",
    },
  ]
};

console.log(printNode(Node.Import(args)));

Expected output:

import { type MyNamespaceData as MyNamespaceDataAddress } from "./external-Address";

However, you will observe the following output along with deprecation warnings:

DeprecationWarning: 'createImportClause' has been deprecated since v4.0.0. Use the appropriate method on 'ts.factory' or the 'factory' supplied by your transformation context instead.
DeprecationWarning: 'createImportDeclaration' has been deprecated since v4.8.0. Decorators are no longer supported for this function. Callers should switch to an overload that does not accept a 'decorators' parameter.
import { type MyNamespaceDataAddress as  } from "./external-Address";

meirkeller avatar Mar 20 '24 07:03 meirkeller

Hi :) I've downgraded the package to version 5.1.0, and it seems to work fine.

orpilosof21 avatar Mar 23 '24 22:03 orpilosof21

@orpilosof21 Thanks!

meirkeller avatar Mar 24 '24 18:03 meirkeller

Hi! I face the same issue but with the avro-ts-cli:

DeprecationWarning: 'createPropertySignature' has been deprecated since v4.0.0. Use the appropriate method on 'ts.factory' or the 'factory' supplied by your transformation context instead.
DeprecationWarning: 'createInterfaceDeclaration' has been deprecated since v4.8.0. Decorators are no longer supported for this function. Callers should switch to an overload that does not accept a 'decorators' parameter.
DeprecationWarning: 'createParameterDeclaration' has been deprecated since v4.8.0. Decorators have been combined with modifiers. Callers should switch to an overload that does not accept a 'decorators' parameter.
import { type XtypeSnow_syncSnow_record_xusEventExternalV1DataUsRusBaseV1 as  } from "./us_rus_base.avsc";

Node version: v18.16.1 Typescript version: 5.3.3 @ovotech/avro-ts-cli: 3.6.0

elias-thok avatar Apr 14 '24 10:04 elias-thok