npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

inde-ts-models-generator

v2.4.1

Published

script used to generate *.model.ts class files starting from instant developer $metadata xml descriptor

Downloads

41

Readme

Inde-ts-models-generator

Single-command script to generate angular-style model files (*.model.ts), or SQL table structure creation query, starting from Instant developer api $metadata descriptor

Installation

If you want to use the functions in your code, you can install the package locally

    npm i --save inde-ts-models-generator 

If you want to use the script direcly from terminal, install it globally istead

    npm i -g inde-ts-models-generator

Usage

Single command usage

to generate model files, simply run

    inde-ts generate-models -u https://my-application.aspx/$metadata 

to generate sql files instead, run

    inde-ts generate-sql -u https://my-application.aspx/$metadata 

where "-u" option is the url of your Instant Developer application where $metadata informations are exposed.

Alternatively, you can provide a filesystem path of a xml file containing the $metadata infos

    inde-ts-models generate -f ./my-metadata-file.xml

Optionally, you can provide a configuration file path, where you can specify more config options (see "Configuration" section below for more infos)

    inde-ts-models generate -u https://my-application.aspx/$metadata  -c ./configuration.json

Please note: all options supplied via command line will take precedence of options in config file

Code usage

If you want, it is possible to use the prebuild functions to generate models programmatically

import * as IndeGenerator from 'inde-ts-models-generator'

async function main(){

    //this follow the pattern of the config json file
    //Not all these properties will be used;

    const CONFIG: IndeGenerator.CustomConfigInterface.CustomConfig = {
        entitiesWhiteList: ["*"],
        componentsWhiteList: ["*"],
        outDir: "./",
        verbose: false,
        saveJsonToFile: false,
    
    
        initProperties: true, 
        initPropertiesMode: "normal",
        getFactoryMethod: true,
        getClassNameMethod: true,
        getRemoteEntityNameMethod: true,
        propertiesGetMethods: false,
        propertiesSetMethods: false,
        propertiesAccessibility: "private",
        propertiesCustomPrefix: "",
        normalizeClassNames: true,
        normalizeClassFilesNames: true,
        importsPathExtension: true,
        regionAnnotations: true,
        extendClass: null,
        extendInterfaces: [],
        getInitAllMethods: false,
        getKeyDescriptorMethod: false,
        
        compAsDbName: false,
        ifNotExistCondition: true,
        generateRowId: null,
        outputSingleFile: false
        
    }


    //Get the xml metadata
    const xmlMetadata: string = await IndeGenerator.loadMetadata('https://api.xxxx.com/$metadata')

    //Convert in JSON and clean, obtaining an array representing Instant Developer Project Components
    const arIndeComponents: Record<string, any>[] = await IndeGenerator.getComponentsArrayFromXml(xmlMetadata)

    //OPTIONALLY you can filter picking only components included in the filter array (this follow the config file sintax) 
    const filteredComponents: Record<string, any>[] = IndeGenerator.filterComponentsFromList(arIndeComponents, CONFIG.componentsWhiteList)

    //Getting Model Generator Objects; You have to make this for all components in "filteredComponents" Array
    const arTsClassesGenerators: IndeGenerator.ClassGenerator.ClassGenerator[] = IndeGenerator.createArTsClassesFromArEntityType(filteredComponents[0].EntityType, CONFIG)
    
    //Getting Enum Generator Object; You have to make this for all components in "filteredComponents" Array
    const enumGenerator: IndeGenerator.EnumGenerator.EnumListGenerator = IndeGenerator.createTsEnumGeneratorFromArEnumType(filteredComponents[0].EnumType, CONFIG)


    //Now you can get the result string representation
    const finalModelStrings: string [] = arTsClassesGenerators.map(el => el.getFileContentString())
    const finalEnumsString: string = await enumGenerator.getFinalStringRepresentation('');


    //...Or save them directly to files
    const PATH = './'
    Promise.all(arTsClassesGenerators.map(el => el.saveOnFileSystem(PATH)))
    .then(() => {console.log('Model files correctly created')})


    enumGenerator.saveToFile(PATH)
    .then(() => {console.log('Enum file correctly created')})

}


main()

It is also possible to use the IndeGenerator.ClassGenerator.ClassGenerator to generate arbitrary ts class files

   async function createArbitraryClass() {

    //Create the configuration object
    //Not all these properties will be used;
    const CONFIG: IndeGenerator.CustomConfigInterface.CustomConfig = {
        entitiesWhiteList: ["*"],
        componentsWhiteList: ["*"],
        outDir: "./",
        verbose: false,
        saveJsonToFile: false,
    
    
        initProperties: true, 
        initPropertiesMode: "normal",
        getFactoryMethod: true,
        getClassNameMethod: true,
        getRemoteEntityNameMethod: true,
        propertiesGetMethods: false,
        propertiesSetMethods: false,
        propertiesAccessibility: "private",
        propertiesCustomPrefix: "",
        normalizeClassNames: true,
        normalizeClassFilesNames: true,
        importsPathExtension: true,
        regionAnnotations: true,
        extendClass: null,
        extendInterfaces: [],
        getInitAllMethods: false,
        getKeyDescriptorMethod: false,
        
        compAsDbName: false,
        ifNotExistCondition: true,
        generateRowId: null,
        outputSingleFile: false

    }


    //Create the object
    const classFactory = new IndeGenerator.ClassGenerator.ClassGenerator('ClassName', CONFIG)


    //add properties
    classFactory.addProperty('propName', 'string', true, "private");

    // add imports
    classFactory.addImport('MY_ENUM', './my-enum.js')

    
    // get data string
    classFactory.getFileContentString();
    //save to file
    await classFactory.saveOnFileSystem('./path');
}


Sql files generation follow the model generator pattern; simply substitute ClassGenerator with SqlGenerator

Configuration

Optionally, when executing the script from the CLI, with "-c" option you can provide a configuration file in json format, which allow you to customize the script behavior.

NOTE: In any case, remember that the options provided via command line will take precedence over those in the configuration file

Here you can see the expected config file structure:

    {
        //#region GENERICS
        
        //whitelist of components to use ( null => only main app, [*] => all, ["comp1", "comp2"] => only specified )
        componentsWhiteList: string[] | null;
        //whitelist of entities to use ( [*] => all, ["comp1", "comp2"] => only specified )
        entitiesWhiteList: string[] 
        //directory where to create the "model" or "sql" folder
        outDir: string;
        //enable verbose mode
        verbose: boolean;
        //save InDe generated json descriptor to file (used for test purposes)
        saveJsonToFile: boolean;
        //Url from which to retrieve the metadata (Warning: any url passed with the -u parameter takes precedence)
        sourceUrl: string | null;
        //FilePath from which to retrieve the metadata (Warning: any path passed with the -f parameter takes precedence)
        sourceFilePath: string | null;
    
        //#endregion
    
        //#region MODELS
    
        //Set true if you want all the non primitive properties initialized
        initProperties: boolean;
        //set if you want the properties inizialized at declaration, inside the constructor, or in a specific method ("initProperties" must be true)
        initPropertiesMode: 'normal' | 'constructor' | 'initMethod';
        //generate a method which inits all properties to null;
        getInitAllMethods: boolean;
        //generate a method which returns a string array containing the names of primary Key properties
        getKeyDescriptorMethod: boolean
        //set true if you want to generatye a getFactory method which returns the prototype of the class 
        getFactoryMethod: boolean;
        //set true if you want to generatye a getClassName method which returns the name of the class
        getClassNameMethod: boolean;
        //set true if you want to generatye a getRemoteEntityName method which returns the name of the entity incoming from instant developer
        getRemoteEntityNameMethod: boolean;
        //set true if you want to generate get methods for all properties
        propertiesGetMethods: boolean,
        //set true if you want to generate set methods for all properties
        propertiesSetMethods: boolean,
        // set the default accessibility for the generated properties (Private and protected properties will be automatically prefixed with a '_')
        propertiesAccessibility: 'private' | 'public' | 'protected';
        // add a custom string prefix to all generated properties names
        propertiesCustomPrefix: string;
        // transform generated class names in a Camelized Way
        normalizeClassNames: boolean;
        // fix generated files names in a "- separated" way
        normalizeClassFilesNames: boolean;
        // set true if you want to add ".js" at the end of generated import paths
        importsPathExtension: boolean;
        // generate region annotations (in form of //#region <...>    //endregion) to better divide generated code
        regionAnnotations: boolean;
        // a class from which models must inherit
        extendClass: {name: string, importPath: string} | null;
        // a list of interfaces which models must implements
        extendInterfaces: {name: string, importPath: string}[]
    
    
        //#endregion
    
    
        //#region SQL
    
        //add "if not exist" statement to table creation command
        ifNotExistCondition: boolean;
        //choose if you want to insert the "without rowid" statement to table creation command: FALSE => statement NOT inserted; true => statement INSERTED; null => statement inserted only if no primary key available
        generateRowId: boolean | null;
        //set true if you want to prefix the table name with the component name as db name, following syntax "CREATE TABLE {{comp name}}.{{entity name}}..."
        compAsDbName: boolean;
        //generate all table creation instructions in one single file per component (every instruction separated by ';')
        outputSingleFile: boolean
    
        //#endregion
    }
NOTE: the names of getter and setter method will automatically truncate the first letter to avoid duplicates names. To get the correct behavior, please prefix properties names with a character using the option "propertiesCustomPrefix"

and this is an example containing the default config. You can supply all, or only some properties; the others will get values below:

{
    "$schema": "./config-schema.json",
    "entitiesWhiteList": ["*"],
    "componentsWhiteList": ["*"],
    "outDir": "./",
    "verbose": false,
    "saveJsonToFile": false,
    "sourceUrl": null,
    "sourceFilePath": null,


    "initProperties": true, 
    "initPropertiesMode": "normal",
    "getFactoryMethod": true,
    "getClassNameMethod": true,
    "getRemoteEntityNameMethod": true,
    "propertiesGetMethods": false,
    "propertiesSetMethods": false,
    "propertiesAccessibility": "private",
    "propertiesCustomPrefix": "",
    "normalizeClassNames": true,
    "normalizeClassFilesNames": true,
    "importsPathExtension": true,
    "regionAnnotations": true,
    "extendClass": null,
    "extendInterfaces": [],
    "getInitAllMethods": false,
    "getKeyDescriptorMethod": false,
    
    "compAsDbName": false,
    "ifNotExistCondition": true,
    "generateRowId": null,
    "outputSingleFile": false

}

if you want the intellisense when compiling the config json, simply first add "$schema" property, linking the config-schema.json file (you can find it in you local user node modules folder)