Nuanced Pterodactyl Monk

    @ovotech/avro-ts-cli
    TypeScript icon, indicating that this package has built-in type declarations

    3.4.9 • Public • Published

    Avro Typecript CLI

    Command line tool to convert Avro Schemas into typescript files. More precicely it generates the typescript that would describe the objects that avsc produces.

    Usage Example

    Usage

    yarn global add @ovotech/avro-ts-cli
    
    avro-ts --help
    avro-ts avro-schema-file.json
    avro-ts avro-dir/*.json
    avro-ts avro-dir/*.json --output-dir src/__generated__/
    avro-ts avro-dir/*.json --logical-type date=string

    Options:

    • -h, --help - output usage information
    • -e, --defaults-as-optional - Fields with defaults as optional
    • -O, --output-dir <outputDir> - Directory to write typescript files to
    • --logical-type <logicalType> - Logical type, example: date=string (default: {})
    • --logical-type-import <logicalType> - Logical type import custom module, example: date=Decimal:decimal.js (default: {})
    • --logical-type-import-all <logicalType>- Logical type import custom module as *, example: date=Decimal:decimal.js (default: {})
    • --logical-type-import-default <logicalType>- Logical type import custom module as default, example: date=Decimal:decimal.js (default: {})
    • -h, --help - output usage information

    Logical Types

    Avro has logical types. In their docs:

    The built-in types provided by Avro are sufficient for many use-cases, but it can often be much more convenient to work with native JavaScript objects.

    To support them we need to modify the typescript generation to use the typescript type instead of the logical type. If we don't avro-ts will fall back on the original underlying type.

    If we had this json avro schema:

    examples/event-1.json

    {
      "type": "record",
      "name": "Event",
      "fields": [
        { "name": "id", "type": "int" },
        { "name": "createdAt", "type": { "type": "int", "logicalType": "date" } }
      ]
    }
    avro-ts examples/event-1.json --logical-type date=string

    THis would output this file. Notice that the type of createdAt is not int but string. This is the logical types in action.

    examples/event-1.json.ts

    export type AvroType = Event;
    
    export interface Event {
      id: number;
      createdAt: number;
    }

    Custom logical types

    We can also use custom classes for our logical types. It will also add the code to import the module.

    examples/event-2.json

    {
      "type": "record",
      "name": "Event",
      "fields": [
        { "name": "id", "type": "int" },
        { "name": "decimalValue", "type": { "type": "long", "logicalType": "decimal" } },
        { "name": "anotherDecimal", "type": { "type": "long", "logicalType": "decimal" } }
      ]
    }
    avro-ts examples/event-2.json --logical-type-import decimal=Decimal:decimal.js

    examples/event-2.json.ts

    export type AvroType = Event;
    
    export interface Event {
      id: number;
      decimalValue: number;
      anotherDecimal: number;
    }

    If you need to use a default import you can use --logical-type-import-default

    avro-ts examples/event-2.json --logical-type-import-default decimal=Decimal:decimal.js
    import Decimal from 'decimal.js';

    And ``--logical-type-import-all` for a synthetic default import

    avro-ts examples/event-2.json --logical-type-import-all decimal=Decimal:decimal.js
    import * as Decimal from 'decimal.js';

    Running the tests

    You can run the tests with:

    yarn test

    Coding style (linting, etc) tests

    Style is maintained with prettier and eslint

    yarn lint
    

    Screencasting

    We use termtosvg to generate the docs svg aniamtion.

    termtosvg record -g 100x35 docs/avro-ts.cast
    ...
    termtosvg render docs/avro-ts.cast docs/avro-ts.svg -D 5000 -M 150 -t docs/template.svg

    First we record the cast, then we modify it as necessary (remove exit at the end) then we render it to an svg.

    Deployment

    Deployment is preferment by lerna automatically on merge / push to main, but you'll need to bump the package version numbers yourself. Only updated packages with newer versions will be pushed to the npm registry.

    Contributing

    Have a bug? File an issue with a simple example that reproduces this so we can take a look & confirm.

    Want to make a change? Submit a PR, explain why it's useful, and make sure you've updated the docs (this file) and the tests (see test folder).

    License

    This project is licensed under Apache 2 - see the LICENSE file for details

    Keywords

    none

    Install

    npm i @ovotech/avro-ts-cli

    DownloadsWeekly Downloads

    1,098

    Version

    3.4.9

    License

    Apache-2.0

    Unpacked Size

    94.8 kB

    Total Files

    15

    Last publish

    Collaborators

    • rtsarykcorgi
    • ylukomskyi-corgi
    • david.regula.ovo
    • vitalii_khudenko
    • samuelnyamukapa
    • ishanfernando-ovo
    • radhika-bijibilla
    • mbartish-ovo
    • kaluzajianzu
    • a.skomarovskyi
    • grahamdawson-ovo
    • pkari
    • srinivasdudam2
    • shatchardovo
    • tigrago
    • ronald.nsabiyera
    • marcopie_at_kaluza
    • clueless_benefactee
    • michaelwheeler
    • prtn-ovo
    • rafolo78
    • tc-kaluza
    • lutza
    • dmytro.kubatko
    • bucabug
    • thomas.finch
    • v.kolesnyk
    • mykola.p
    • s.slotskyi-ovo
    • hantastico
    • joemaher
    • tanjil-hussain
    • adam.vile
    • raluza
    • ipa-bot
    • luigi94
    • anthony_tonev
    • simonarcher999
    • dominicboston-kaluza
    • iblamefish
    • robert-smith-01
    • katebee-kaluza
    • gideoncaspi
    • coderdanuk
    • kawbot
    • markberesford301
    • ovo-homeplan
    • rupson
    • oeptariffs
    • tony.ross
    • bvjones
    • data.discovery.ovo
    • ralitsa
    • fraserhamiltonovo
    • accrecovo
    • luigi.riefolo
    • andy-heywood-ovo
    • rmcnovo
    • ggerikp
    • xnejp03
    • emmapr123
    • andrew-brook-rad
    • a.calderwood
    • sulgee.kim
    • sseccombe
    • samcooper720x
    • lughino
    • amayuk
    • jagreenwood1
    • radek_tomasek
    • clarencedglee
    • ovocms
    • ovotech-sme-team
    • gjain-npm-ovo
    • kenneth-gray
    • nevenablagoeva
    • pete-woodland
    • orion-migration-team
    • ovotech-sg
    • chanex
    • ovotech-qs
    • ovotech-paym
    • ovotech-payments
    • ovotech-live
    • ovotech-payg
    • freddybushboy
    • sarahlikeshiny
    • ovotech-boost
    • agaovo
    • filose
    • props
    • yesdaveovo
    • rob-ovo
    • ellafutkowska
    • ikerin
    • mwidurek
    • andreaborsos
    • tomshawovo
    • ovotech-identity
    • iuna4e
    • lcatallo
    • orex-team
    • ahvargas
    • cwkaluza
    • smart-heat-uat
    • smart-heat-prod
    • potsec
    • rosario-ovo
    • tech.international
    • jvmovo
    • boost-smile
    • nicolasov
    • ovo.cms.devs
    • mkohlmyr
    • sketchingdev
    • mrkiplin
    • ovo-devices
    • sophiepoole
    • joepurnell-ovo
    • vkobyletskyi_ovo
    • richardday-ovo
    • rparkhomchuk
    • daumenta
    • benoitovo
    • v.vasylets
    • enza252
    • lewisunsworthkaluza
    • t.vytrykush
    • vslepkan
    • jubril
    • petro.shevchuk.corgi
    • melcbuckov
    • kir_exp
    • zyurii
    • vlavrynenko-nix
    • timmy.antonio
    • brettburman-code
    • vzahakailo
    • petro.pavlenko
    • goncalogarcia
    • chris.dickson.kaluza
    • muigui
    • k-fernandez
    • alonabarabash
    • manojkakarla
    • nelsma
    • jadamiec-ovo
    • georgi.krastev
    • marknreynolds
    • m_heald
    • gregshielkaluza
    • gordonmartin
    • ovo-data-science-engineering-bot
    • jonnyleakaluza
    • stephen.harris
    • alex-wilson-ovo
    • scdf
    • xenjke
    • rob.straughan
    • molbalazs
    • joewhittles
    • sampennington64
    • marcusgriff
    • amelia.ovo
    • juliabutterly
    • chris.smith
    • sophiesillmanovo
    • marcesquerra
    • pedoublety
    • ovo-engagement
    • marcuskielly
    • david.chellapah.ovo
    • kupxc
    • harrisonbaxter
    • apjm
    • shnist
    • mikemchugh
    • sarahbeharry
    • ursularodgers
    • inlustra
    • andrewjtn
    • tarlingovo
    • troyb95
    • david.ovo
    • ovoenergyapps
    • marina-ovo
    • tom-g-dane
    • homemoves
    • samwest
    • sophiefield
    • simonmclean-ovo
    • jamesbaum
    • robert-g-j
    • paceteamkaluza
    • ovo-oot-bot
    • stuharv-ovo
    • eddiec86
    • csherwin
    • g-tibbs
    • puzzledbytheweb
    • lewright
    • pedro.caldeira
    • aidenscott2016
    • keirlawson
    • dwfullerton
    • gordok
    • darrenthomas-sse
    • seagullmouse
    • markwood23
    • timsteeleovo
    • jacktreble
    • gordon-rennie-ovo
    • adam-mcdevitt
    • jkiely
    • ovo-dc
    • orion-digital-support-experience
    • ovotech-smart-thermostat
    • yahmad
    • kelemensanyi
    • wtaylor-ovo
    • jrdavenport
    • dleyland-ovo
    • rob.desbois
    • sicrossley
    • lewisdick-ovo
    • sjmann
    • stevemossovo
    • eduardolaranjo
    • unibozu
    • cp-ui-tooling
    • lenardprattovo
    • dieman89
    • jensraaby-ovo
    • anthonysmithovo
    • tom.sherman
    • tomlloyd
    • matyas-ovo
    • jamesnoble1
    • phil-pinkowski
    • ovo-aarongibbison
    • nebuladesignsystem
    • ovo-matt-hodges
    • luke-adams-ovo
    • j_kapella
    • mike.walters
    • bgzstephen
    • matthewbursteinovo
    • kslat3r
    • mtardugno-ovo
    • zoelanham
    • jchoskins
    • tom.mottram.kaluza
    • ewan-m
    • mishabruml
    • maciek-kaluza
    • vmary
    • mugishau
    • peterh-ovo
    • dvidg
    • nickfitton-ovo
    • dave.allison
    • oep-accounts-bot
    • cbousie
    • j.okeefe
    • ursula_rodgers
    • jgarciapaj
    • petegrace
    • retrojetpacks
    • benaston13
    • ovo-bit-tech
    • fulvio.ovo
    • blair.calderwood.radically
    • pedromss
    • simonlewissse
    • joolskaluza
    • jifarra-kaluza
    • jameswelshkaluza
    • kimnil
    • carolinelywood
    • mike-gregory-kaluza
    • vasil.dininski
    • sir_hiss
    • csillabarna
    • luca.sale
    • friendigo
    • oroberts221
    • pedro.costa.kaluza
    • annebeth-ovo
    • quartin
    • georgexcollins
    • kapikaluza
    • iovana.pavlovici
    • filosganga
    • chris.brindley
    • engagement-insights
    • hentielouw
    • jaws-bot
    • leaski
    • elliekempster91
    • zoejm
    • rekaelek-ovo
    • nathanmarshovo
    • robturnerovo
    • dsingh07
    • ovo-james
    • jthomasovo