UNPKG

breeze-entity-generator

Version:

Generate TypeScript modules for entities from Breeze metadata

131 lines (87 loc) 6.59 kB
# Breeze Entity Generator This tool generates TypeScript classes from Breeze metadata. The generated classes match the server-side classes and the query responses, so you can develop your application with typed entities. Breeze metadata can be generated from [EntityFramework](https://github.com/Breeze/northwind-demo/blob/master/server/STEPS-Server-NET5.md#configure-the-program-class-to-generate-metadata), [NHibernate](https://github.com/Breeze/breeze.server.net/blob/master/AspNet/Breeze.ContextProvider.NH/NHMetadataBuilder.cs), [POCO classes](https://github.com/Breeze/breeze.tooling/tree/master/PocoMetadata), or [handwritten](http://breeze.github.io/doc-js/metadata-by-hand-details.html). **Usage**: Write your JavaScript file, `generate-entities.js`: ``` const tsGen = require('node_modules/breeze-entity-generator/tsgen-core'); tsGen.generate({ inputFileName: 'MyProject.metadata.json', outputFolder: './src/app/model/entities/', camelCase: true, kebabCaseFileNames: true, baseClassName: 'BaseEntity', baseComplexName: 'BaseComplex', codePrefix: 'MyProject', useEnumTypes: true, propertyComments: true }); ``` Then run `node[.exe] generate-entities.js` **Input(s)**: A file containing CSDL or Breeze native metadata **Output(s)**: - One TypeScript module file per entity and complex type, with the corresponding class export. - A helper class (RegistrationHelper.ts) to register all constructors with Breeze. - A TypeScript barrel (EntityModel.ts) exporting all of the entity classes, for easy import when several classes are required. - A helper class (Metadata.ts) that exports the Breeze metadata as a static value, so it can be used by Breeze at runtime. ## Config Parameters `inputFileName`: Specifies the file containing the metadata `outputFolder`: Optionally specifies the location for the generated TypeScript files. If not specified, the current directory is used as the location `sourceFilesFolder`: Optionally specifies the location to find existing TypeScript files. The `<code>` blocks from these files will be preserved in the corresponding output files. If not specified, the outputFolder will be used. `baseClassName`: Optionally specifies a TypeScript base class for all the generated entity classes. The generated entity classes will directly or indirectly inherit from this class. The file must contain a single module and exported class. `baseComplexName`: Optionally specifies a TypeScript base class for all the generated complex type (value type) classes. The generated classes will directly or indirectly inherit from this class. The file must contain a single module and exported class. `camelCase`: Optionally generates the property names using camel case. This parameter has no effect if the input file contains Breeze native metadata. (See [NamingConvention](http://breeze.github.io/doc-js/api-docs/classes/namingconvention.html#camelcase)) `codePrefix`: Name to put in front of the generated Metadata class and the RegistrationHelper class `kebabCaseFileNames`: Optionally generate kebab-case-file-names instead of PascalCaseFileNames. `useEnumTypes`: Optionally generate an Enums.ts file containing enums defined in the metadata. Only effective if input metadata contains an "enumTypes" section. `propertyComments`: Optionally include metadata comments on data properties, indicating original datatype and key relationships, e.g.: ```ts /** String(50) */ productName!: string; /** Int32 FK supplier */ supplierId!: number; ``` ## Description At the core of the typescript generator sits [handlebars](http://handlebarsjs.com/) which is responsible for generating the actual TypeScript source code. The output that handlebars generate can be customized by modifying the templates. Note: [node.js](http://nodejs.org/) must be installed and node must be part of the PATH. ### Custom code and imports The typescript generator preserves three special sections for each class when regenerating the code. Those sections are `<code-import>`, `<code>` and `<module-code>`. The `<code-import>` section is for custom imports, the `<code>` section is for custom methods, etc and `<module-code>` section is for module level code eg functions. Following is an example of a class after it got generated showing the three sections. Everything between the opening and closing tags is preserved. ``` import { EntityBase } from './EntityBase'; import { Order } from './Order'; /// <code-import> Place custom imports between <code-import> tags /// </code-import> /// <module-code> Place module level code between <module-code> tags /// </module-code> export class InternationalOrder extends EntityBase { /// <code> Place custom code between <code> tags /// </code> // Generated code. Do not place code below this line. orderID: number; customsDescription: string; exciseTax: number; rowVersion: number; order: Order; } ``` ## Files `node_modules` (Directory containing the third-party node libraries including Breeze) `entity.template.txt` (Handlebars template for an entity class) `entityModel.template.txt` (Handlebars template for the barrel exporting all entities) `register.template.txt` (Handlebars template for the ctor registration helper class) `enum.template.txt` (Handlebars template for the file containing the enum classes) `metadata.template.txt` (Handlebars template for the static metadata) `tsgen-core.js` (The typescript generator node script) ## Release Notes 1.0.0 - Initial release as an npm package 1.1.0 - Work with breeze-client .mjs modules (as well as older CJS bundles) 1.2.0 - Add support for Complex Type base class and not-null (!) assertions. Breaking change: entity.template.txt now imports baseClassName from the parent directory. 1.2.1 - Fix enum type references 1.3.0 - Use TypeScript enum types instead of string unions for enums. 1.3.1 - Use ordinal values instead of strings for enum definitions, e.g. `Green = 2`. Template change only. 1.3.2 - Include './enums' in entity-model.ts. Template change only. 1.3.3 - Proper handling of abstract base classes: write 'abstract' modifier, correct include path, exclude from RegistrationHelper 1.3.4 - Fix class name of RegistrationHelper; Fix include path to base complex type 1.4.0 - Add property comments indicating type, maxlength, key, and fk 1.4.1 - Add handling for string or number enums, based on how they are defined in metadata.enumTypes