diff --git a/.gitignore b/.gitignore index 00cbbdf..469d3e6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ logs npm-debug.log* yarn-debug.log* yarn-error.log* +/lib +.idea # Runtime data pids diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..30ca328 --- /dev/null +++ b/.npmignore @@ -0,0 +1,4 @@ +/src +/test +/.vscode +tsconfig.json diff --git a/lib/index.d.ts b/lib/index.d.ts deleted file mode 100644 index 1f921c3..0000000 --- a/lib/index.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { RecordType } from "./model"; -export { RecordType, Field } from "./model"; -/** Converts an Avro record type to a TypeScript file */ -export declare function avroToTypeScript(recordType: RecordType): string; diff --git a/lib/index.js b/lib/index.js deleted file mode 100644 index 3c5c2fe..0000000 --- a/lib/index.js +++ /dev/null @@ -1,84 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.avroToTypeScript = void 0; -var model_1 = require("./model"); -/** Convert a primitive type from avro to TypeScript */ -function convertPrimitive(avroType) { - switch (avroType) { - case "long": - case "int": - case "double": - case "float": - return "number"; - case "bytes": - return "Buffer"; - case "null": - return "null | undefined"; - case "boolean": - return "boolean"; - default: - return null; - } -} -/** Converts an Avro record type to a TypeScript file */ -function avroToTypeScript(recordType) { - var output = []; - convertRecord(recordType, output); - return output.join("\n"); -} -exports.avroToTypeScript = avroToTypeScript; -/** Convert an Avro Record type. Return the name, but add the definition to the file */ -function convertRecord(recordType, fileBuffer) { - var buffer = "export interface " + recordType.name + " {\n"; - for (var _i = 0, _a = recordType.fields; _i < _a.length; _i++) { - var field = _a[_i]; - buffer += convertFieldDec(field, fileBuffer) + "\n"; - } - buffer += "}\n"; - fileBuffer.push(buffer); - return recordType.name; -} -/** Convert an Avro Enum type. Return the name, but add the definition to the file */ -function convertEnum(enumType, fileBuffer) { - var enumDef = "export enum " + enumType.name + " { " + enumType.symbols.join(", ") + " };\n"; - fileBuffer.push(enumDef); - return enumType.name; -} -function convertType(type, buffer) { - // if it's just a name, then use that - if (typeof type === "string") { - return convertPrimitive(type) || type; - } - else if (type instanceof Array) { - // array means a Union. Use the names and call recursively - return type.map(function (t) { return convertType(t, buffer); }).join(" | "); - } - else if (model_1.isRecordType(type)) { - //} type)) { - // record, use the name and add to the buffer - return convertRecord(type, buffer); - } - else if (model_1.isArrayType(type)) { - // array, call recursively for the array element type - return convertType(type.items, buffer) + "[]"; - } - else if (model_1.isMapType(type)) { - // Dictionary of types, string as key - return "{ [index:string]:" + convertType(type.values, buffer) + " }"; - } - else if (model_1.isEnumType(type)) { - // array, call recursively for the array element type - return convertEnum(type, buffer); - } - else if (model_1.isLogicalType(type)) { - return convertType(type.type, buffer); - } - else { - console.error("Cannot work out type", type); - return "UNKNOWN"; - } -} -function convertFieldDec(field, buffer) { - // Union Type - return "\t" + field.name + (model_1.isOptional(field.type) ? "?" : "") + ": " + convertType(field.type, buffer) + ";"; -} diff --git a/lib/model.d.ts b/lib/model.d.ts deleted file mode 100644 index c79fa61..0000000 --- a/lib/model.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -/**** Contains the Interfaces and Type Guards for Avro schema */ -export interface Schema { -} -export declare type Type = NameOrType | NameOrType[]; -export declare type NameOrType = TypeNames | RecordType | ArrayType | NamedType | LogicalType; -export declare type TypeNames = "record" | "array" | "null" | "map" | string; -export interface Field { - name: string; - type: Type; - default?: string | number | null | boolean; -} -export interface BaseType { - type: TypeNames; -} -export interface RecordType extends BaseType { - type: "record"; - name: string; - fields: Field[]; -} -export interface ArrayType extends BaseType { - type: "array"; - items: Type; -} -export interface MapType extends BaseType { - type: "map"; - values: Type; -} -export interface EnumType extends BaseType { - type: "enum"; - name: string; - symbols: string[]; -} -export interface NamedType extends BaseType { - type: string; -} -export interface LogicalType extends BaseType { - logicalType: string; -} -export declare function isRecordType(type: BaseType): type is RecordType; -export declare function isArrayType(type: BaseType): type is ArrayType; -export declare function isMapType(type: BaseType): type is MapType; -export declare function isEnumType(type: BaseType): type is EnumType; -export declare function isUnion(type: Type): type is NamedType[]; -export declare function isOptional(type: Type): boolean; -export declare function isLogicalType(type: Type): type is LogicalType; diff --git a/lib/model.js b/lib/model.js deleted file mode 100644 index f589e55..0000000 --- a/lib/model.js +++ /dev/null @@ -1,37 +0,0 @@ -"use strict"; -/**** Contains the Interfaces and Type Guards for Avro schema */ -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isLogicalType = exports.isOptional = exports.isUnion = exports.isEnumType = exports.isMapType = exports.isArrayType = exports.isRecordType = void 0; -function isRecordType(type) { - return type.type === "record"; -} -exports.isRecordType = isRecordType; -function isArrayType(type) { - return type.type === "array"; -} -exports.isArrayType = isArrayType; -function isMapType(type) { - return type.type === "map"; -} -exports.isMapType = isMapType; -function isEnumType(type) { - return type.type === "enum"; -} -exports.isEnumType = isEnumType; -function isUnion(type) { - return type instanceof Array; -} -exports.isUnion = isUnion; -function isOptional(type) { - if (isUnion(type)) { - var t1 = type[0]; - if (typeof t1 === "string") { - return t1 === "null"; - } - } -} -exports.isOptional = isOptional; -function isLogicalType(type) { - return typeof type !== "string" && "logicalType" in type; -} -exports.isLogicalType = isLogicalType; diff --git a/package.json b/package.json index 99ceccc..e2c00ff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "avro-typescript", - "version": "0.0.6", + "version": "1.0.0", "description": "TypeScript code generator for Apache Avro types", "main": "./lib/index.js", "typings": "lib/index.d.ts", diff --git a/src/index.ts b/src/index.ts index 534c1f7..32cfc4e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,18 +1,31 @@ -import { - Type, +export { + EnumType, Field, - isRecordType, isArrayType, isEnumType, isMapType, + isOptional, + isRecordType, RecordType, + Type, + isLogicalType, +} from "./model"; + +import { EnumType, + Field, + isArrayType, + isEnumType, + isMapType, isOptional, + isRecordType, + RecordType, + Type, isLogicalType, } from "./model"; -export { RecordType, Field } from "./model"; + /** Convert a primitive type from avro to TypeScript */ -function convertPrimitive(avroType: string): string { +export function convertPrimitive(avroType: string): string { switch (avroType) { case "long": case "int": @@ -38,7 +51,7 @@ export function avroToTypeScript(recordType: RecordType): string { } /** Convert an Avro Record type. Return the name, but add the definition to the file */ -function convertRecord(recordType: RecordType, fileBuffer: string[]): string { +export function convertRecord(recordType: RecordType, fileBuffer: string[]): string { let buffer = `export interface ${recordType.name} {\n`; for (let field of recordType.fields) { buffer += convertFieldDec(field, fileBuffer) + "\n"; @@ -49,13 +62,13 @@ function convertRecord(recordType: RecordType, fileBuffer: string[]): string { } /** Convert an Avro Enum type. Return the name, but add the definition to the file */ -function convertEnum(enumType: EnumType, fileBuffer: string[]): string { +export function convertEnum(enumType: EnumType, fileBuffer: string[]): string { const enumDef = `export enum ${enumType.name} { ${enumType.symbols.join(", ")} };\n`; fileBuffer.push(enumDef); return enumType.name; } -function convertType(type: Type, buffer: string[]): string { +export function convertType(type: Type, buffer: string[]): string { // if it's just a name, then use that if (typeof type === "string") { return convertPrimitive(type) || type; @@ -83,7 +96,7 @@ function convertType(type: Type, buffer: string[]): string { } } -function convertFieldDec(field: Field, buffer: string[]): string { +export function convertFieldDec(field: Field, buffer: string[]): string { // Union Type return `\t${field.name}${isOptional(field.type) ? "?" : ""}: ${convertType(field.type, buffer)};`; }