From c12517eec6995992cd9d3ace035d5061fd934ae5 Mon Sep 17 00:00:00 2001 From: Jonas Lagoni Date: Sun, 7 Jan 2024 12:39:41 -1000 Subject: [PATCH 1/3] update --- docs/languages/TypeScript.md | 9 ++++++- examples/README.md | 1 + .../README.md | 17 +++++++++++++ .../__snapshots__/index.spec.ts.snap | 9 +++++++ .../index.spec.ts | 15 ++++++++++++ .../index.ts | 24 +++++++++++++++++++ .../package-lock.json | 10 ++++++++ .../package.json | 10 ++++++++ .../typescript/TypeScriptObjectRenderer.ts | 11 ++++++--- .../constrainer/PropertyKeyConstrainer.ts | 6 ++++- 10 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 examples/typescript-generate-raw-properties/README.md create mode 100644 examples/typescript-generate-raw-properties/__snapshots__/index.spec.ts.snap create mode 100644 examples/typescript-generate-raw-properties/index.spec.ts create mode 100644 examples/typescript-generate-raw-properties/index.ts create mode 100644 examples/typescript-generate-raw-properties/package-lock.json create mode 100644 examples/typescript-generate-raw-properties/package.json diff --git a/docs/languages/TypeScript.md b/docs/languages/TypeScript.md index 1f9ff191f9..97e7c66953 100644 --- a/docs/languages/TypeScript.md +++ b/docs/languages/TypeScript.md @@ -17,6 +17,7 @@ There are special use-cases that each language supports; this document pertains - [Generate example data function](#generate-example-data-function) - [Rendering complete models to a specific module system](#rendering-complete-models-to-a-specific-module-system) - [Rendering comments from description and example fields](#rendering-comments-from-description-and-example-fields) +- [Rendering raw properties for interface](#rendering-raw-properties-for-interface) @@ -101,4 +102,10 @@ Check out this [example for a live demonstration how to generate the complete Ty ## Rendering comments from description and example fields You can use the `TS_DESCRIPTION_PRESET` to generate JSDoc style comments from description and example fields in your model. -See [this example](../../examples/typescript-generate-comments) for how this can be used. \ No newline at end of file +See [this example](../../examples/typescript-generate-comments) for how this can be used. + +## Rendering raw properties for interface + +You can use the `rawPropertyNames: true` and `modelType: 'interface'` together to generate models that use raw properties. + +See [this example](../../examples/typescript-generate-raw-properties) for how this can be used. diff --git a/examples/README.md b/examples/README.md index 67911e0fc1..62b71f5ebd 100644 --- a/examples/README.md +++ b/examples/README.md @@ -117,6 +117,7 @@ These are all specific examples only relevant to the TypeScript generator: - [typescript-use-esm](./typescript-use-esm) - A basic example that generate the models to use ESM module system. - [typescript-use-cjs](./typescript-use-cjs) - A basic example that generate the models to use CJS module system. - [typescript-generate-jsonbinpack](./typescript-generate-jsonbinpack) - A basic example showing how to generate models that include [jsonbinpack](https://github.com/sourcemeta/jsonbinpack) functionality. +- [typescript-generate-raw-properties](./typescript-generate-raw-properties) - A basic example showing how to generate models that use raw properties for interface. ## Kotlin These are all specific examples only relevant to the Kotlin generator: diff --git a/examples/typescript-generate-raw-properties/README.md b/examples/typescript-generate-raw-properties/README.md new file mode 100644 index 0000000000..6bdd08ad4a --- /dev/null +++ b/examples/typescript-generate-raw-properties/README.md @@ -0,0 +1,17 @@ +# TypeScript generate with raw properties + +A basic example of how to use Modelina and output a TypeScript models that only use raw properties for interfaces. + +## How to run this example + +Run this example using: + +```sh +npm i && npm run start +``` + +If you are on Windows, use the `start:windows` script instead: + +```sh +npm i && npm run start:windows +``` diff --git a/examples/typescript-generate-raw-properties/__snapshots__/index.spec.ts.snap b/examples/typescript-generate-raw-properties/__snapshots__/index.spec.ts.snap new file mode 100644 index 0000000000..6ce9c32053 --- /dev/null +++ b/examples/typescript-generate-raw-properties/__snapshots__/index.spec.ts.snap @@ -0,0 +1,9 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Should be able to render raw properties and should log expected output to console 1`] = ` +Array [ + "interface Root { + 'weird name'?: string; +}", +] +`; diff --git a/examples/typescript-generate-raw-properties/index.spec.ts b/examples/typescript-generate-raw-properties/index.spec.ts new file mode 100644 index 0000000000..5b12322270 --- /dev/null +++ b/examples/typescript-generate-raw-properties/index.spec.ts @@ -0,0 +1,15 @@ +const spy = jest.spyOn(global.console, 'log').mockImplementation(() => { + return; +}); +import { generate } from './index'; + +describe('Should be able to render raw properties', () => { + afterAll(() => { + jest.restoreAllMocks(); + }); + test('and should log expected output to console', async () => { + await generate(); + expect(spy.mock.calls.length).toEqual(1); + expect(spy.mock.calls[0]).toMatchSnapshot(); + }); +}); diff --git a/examples/typescript-generate-raw-properties/index.ts b/examples/typescript-generate-raw-properties/index.ts new file mode 100644 index 0000000000..3e1e60ccf6 --- /dev/null +++ b/examples/typescript-generate-raw-properties/index.ts @@ -0,0 +1,24 @@ +import { TypeScriptGenerator } from '../../src'; + +const generator = new TypeScriptGenerator({ rawPropertyNames: true, modelType: 'interface'}); +const jsonSchemaDraft7 = { + $schema: 'http://json-schema.org/draft-07/schema#', + type: 'object', + additionalProperties: false, + properties: { + 'weird name': { + type: 'string', + format: 'email' + } + } +}; + +export async function generate(): Promise { + const models = await generator.generate(jsonSchemaDraft7); + for (const model of models) { + console.log(model.result); + } +} +if (require.main === module) { + generate(); +} diff --git a/examples/typescript-generate-raw-properties/package-lock.json b/examples/typescript-generate-raw-properties/package-lock.json new file mode 100644 index 0000000000..33b77abbfd --- /dev/null +++ b/examples/typescript-generate-raw-properties/package-lock.json @@ -0,0 +1,10 @@ +{ + "name": "typescript-generate-raw-properties", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "hasInstallScript": true + } + } +} diff --git a/examples/typescript-generate-raw-properties/package.json b/examples/typescript-generate-raw-properties/package.json new file mode 100644 index 0000000000..1901d99872 --- /dev/null +++ b/examples/typescript-generate-raw-properties/package.json @@ -0,0 +1,10 @@ +{ + "config" : { "example_name" : "typescript-generate-raw-properties" }, + "scripts": { + "install": "cd ../.. && npm i", + "start": "../../node_modules/.bin/ts-node --cwd ../../ ./examples/$npm_package_config_example_name/index.ts", + "start:windows": "..\\..\\node_modules\\.bin\\ts-node --cwd ..\\..\\ .\\examples\\%npm_package_config_example_name%\\index.ts", + "test": "../../node_modules/.bin/jest --config=../../jest.config.js ./examples/$npm_package_config_example_name/index.spec.ts", + "test:windows": "..\\..\\node_modules\\.bin\\jest --config=..\\..\\jest.config.js examples/%npm_package_config_example_name%/index.spec.ts" + } +} diff --git a/src/generators/typescript/TypeScriptObjectRenderer.ts b/src/generators/typescript/TypeScriptObjectRenderer.ts index be0eab12d0..c2be8c4679 100644 --- a/src/generators/typescript/TypeScriptObjectRenderer.ts +++ b/src/generators/typescript/TypeScriptObjectRenderer.ts @@ -26,9 +26,14 @@ export abstract class TypeScriptObjectRenderer extends TypeScriptRenderer { + return ({ + objectPropertyModel, + constrainedObjectModel, + objectModel + }) => { let constrainedPropertyKey = objectPropertyModel.propertyName; constrainedPropertyKey = constraints.NO_SPECIAL_CHAR( From f0d7645707f10cae28107733ae51dc6d21260a7d Mon Sep 17 00:00:00 2001 From: Jonas Lagoni Date: Mon, 8 Jan 2024 08:47:54 -1000 Subject: [PATCH 2/3] update docs --- src/generators/typescript/TypeScriptGenerator.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/generators/typescript/TypeScriptGenerator.ts b/src/generators/typescript/TypeScriptGenerator.ts index e2a43e2ed8..5cb6f0a209 100644 --- a/src/generators/typescript/TypeScriptGenerator.ts +++ b/src/generators/typescript/TypeScriptGenerator.ts @@ -52,8 +52,7 @@ export interface TypeScriptOptions constraints: Constraints; moduleSystem: TypeScriptModuleSystemType; /** - * Use raw property names instead of constrained ones, - * where you most likely need to access them with obj["propertyName"] instead of obj.propertyName + * Use raw property names instead of constrained ones for interfaces. */ rawPropertyNames: boolean; } From 85fa1841b8d05b599e316080c497b72199f7f164 Mon Sep 17 00:00:00 2001 From: Jonas Lagoni Date: Mon, 15 Jan 2024 09:49:18 -1000 Subject: [PATCH 3/3] lint files --- examples/typescript-generate-raw-properties/index.ts | 5 ++++- src/generators/typescript/TypeScriptObjectRenderer.ts | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/examples/typescript-generate-raw-properties/index.ts b/examples/typescript-generate-raw-properties/index.ts index 3e1e60ccf6..a275064f78 100644 --- a/examples/typescript-generate-raw-properties/index.ts +++ b/examples/typescript-generate-raw-properties/index.ts @@ -1,6 +1,9 @@ import { TypeScriptGenerator } from '../../src'; -const generator = new TypeScriptGenerator({ rawPropertyNames: true, modelType: 'interface'}); +const generator = new TypeScriptGenerator({ + rawPropertyNames: true, + modelType: 'interface' +}); const jsonSchemaDraft7 = { $schema: 'http://json-schema.org/draft-07/schema#', type: 'object', diff --git a/src/generators/typescript/TypeScriptObjectRenderer.ts b/src/generators/typescript/TypeScriptObjectRenderer.ts index c2be8c4679..2adc74de29 100644 --- a/src/generators/typescript/TypeScriptObjectRenderer.ts +++ b/src/generators/typescript/TypeScriptObjectRenderer.ts @@ -28,7 +28,10 @@ export abstract class TypeScriptObjectRenderer extends TypeScriptRenderer