Skip to content

Commit

Permalink
feat!: add options as parameter to constraints (#1667)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonaslagoni authored Dec 26, 2023
1 parent 3cdb662 commit 396dd69
Show file tree
Hide file tree
Showing 115 changed files with 888 additions and 448 deletions.
6 changes: 3 additions & 3 deletions .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
"security",
"github",
"jest",
"prettier"
"prettier",
"unused-imports"
],
"extends": [
"eslint:recommended",
Expand Down Expand Up @@ -55,7 +56,7 @@
"no-empty-character-class": 2,
"no-self-compare": 2,
"valid-typeof": 2,
"no-unused-vars": 0,
"unused-imports/no-unused-imports": 2,
"handle-callback-err": 2,
"no-shadow-restricted-names": 2,
"no-new-require": 2,
Expand Down Expand Up @@ -138,7 +139,6 @@
"prefer-const": 2,
"prefer-spread": 2,
"prefer-template": 2,
"@typescript-eslint/no-unused-vars": 2,
"prettier/prettier": 2,
"sonarjs/no-identical-functions": "off",
"sonarjs/prefer-single-boolean-return": "off",
Expand Down
10 changes: 10 additions & 0 deletions docs/migrations/version-2-to-3.md
Original file line number Diff line number Diff line change
Expand Up @@ -282,3 +282,13 @@ Is not affected by this change.
### C++
Is not affected by this change.
### Options in constraints
As part of https://github.com/asyncapi/modelina/issues/1475 we had the need to access options in the constraint logic, therefore all constraints now have direct access to the provided options.
To make it easier we now expose types for each of the constraints in each language to make it easier to re-use in TS integrations. They can be accessed as following:
```ts
import { <language>ConstantConstraint, <language>EnumKeyConstraint, <language>EnumValueConstraint, <language>ModelNameConstraint, <language>PropertyKeyConstraint } from @asyncapi/modelina
```
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@
exports[`Should be able to render models with custom constrain logic and should log expected output to console 1`] = `
Array [
"class MyOwnCustomModelName {
private _email?: string;
private _MyCustomPropertyKey?: string;
constructor(input: {
email?: string,
MyCustomPropertyKey?: string,
}) {
this._email = input.email;
this._MyCustomPropertyKey = input.MyCustomPropertyKey;
}
get email(): string | undefined { return this._email; }
set email(email: string | undefined) { this._email = email; }
get MyCustomPropertyKey(): string | undefined { return this._MyCustomPropertyKey; }
set MyCustomPropertyKey(MyCustomPropertyKey: string | undefined) { this._MyCustomPropertyKey = MyCustomPropertyKey; }
}",
]
`;
21 changes: 19 additions & 2 deletions examples/overwrite-default-constraint/index.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,27 @@
import { TypeScriptGenerator } from '../../src';
import { pascalCase } from 'change-case';

const generator = new TypeScriptGenerator({
constraints: {
modelName: ({ modelName }) => {
modelName: ({ modelName, options }) => {
return 'MyOwnCustomModelName';
},
constant: ({ constrainedMetaModel, options }) => {
return 'MyCustomConst';
},
enumKey: ({ constrainedEnumModel, enumKey, enumModel, options }) => {
return 'MyCustomKey';
},
enumValue: ({ constrainedEnumModel, enumValue, enumModel, options }) => {
return 'MyCustomValue';
},
propertyKey: ({
constrainedObjectModel,
constrainedObjectPropertyModel,
objectModel,
objectPropertyModel,
options
}) => {
return 'MyCustomPropertyKey';
}
}
});
Expand Down
1 change: 1 addition & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@
"dependencies": {
"@apidevtools/json-schema-ref-parser": "^9.0.9",
"@apidevtools/swagger-parser": "^10.0.3",
"@smoya/multi-parser": "^4.0.0",
"@asyncapi/parser": "3.0.0-next-major-spec.8",
"@smoya/multi-parser": "^4.0.0",
"@swc/core": "^1.3.5",
"@swc/jest": "^0.2.23",
"@types/node": "^20.3.3",
Expand All @@ -62,6 +62,7 @@
"eslint-plugin-prettier": "^5.0.1",
"eslint-plugin-security": "^1.7.1",
"eslint-plugin-sonarjs": "^0.19.0",
"eslint-plugin-unused-imports": "^3.0.0",
"jest": "^27.2.5",
"markdown-toc": "^1.2.0",
"ts-jest": "^27.0.5",
Expand Down
18 changes: 16 additions & 2 deletions src/generators/cplusplus/CplusplusGenerator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,13 @@ import { EnumRenderer } from './renderers/EnumRenderer';
import { isReservedCplusplusKeyword } from './Constants';
import { Logger } from '../..';
import {
ConstantConstraint,
constrainMetaModel,
Constraints
Constraints,
EnumKeyConstraint,
EnumValueConstraint,
ModelNameConstraint,
PropertyKeyConstraint
} from '../../helpers/ConstrainHelpers';
import {
CplusplusDefaultConstraints,
Expand All @@ -33,9 +38,18 @@ import { CplusplusDependencyManager } from './CplusplusDependencyManager';
export interface CplusplusOptions
extends CommonGeneratorOptions<CplusplusPreset> {
typeMapping: TypeMapping<CplusplusOptions, CplusplusDependencyManager>;
constraints: Constraints;
constraints: Constraints<CplusplusOptions>;
namespace: string;
}
export type CplusplusConstantConstraint = ConstantConstraint<CplusplusOptions>;
export type CplusplusEnumKeyConstraint = EnumKeyConstraint<CplusplusOptions>;
export type CplusplusEnumValueConstraint =
EnumValueConstraint<CplusplusOptions>;
export type CplusplusModelNameConstraint =
ModelNameConstraint<CplusplusOptions>;
export type CplusplusPropertyKeyConstraint =
PropertyKeyConstraint<CplusplusOptions>;

// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface CplusplusRenderCompleteModelOptions {}
export class CplusplusGenerator extends AbstractGenerator<
Expand Down
3 changes: 2 additions & 1 deletion src/generators/cplusplus/constrainer/ConstantConstrainer.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { ConstantConstraint } from '../../../helpers';
import { CplusplusOptions } from '../CplusplusGenerator';

export function defaultConstantConstraints(): ConstantConstraint {
export function defaultConstantConstraints(): ConstantConstraint<CplusplusOptions> {
return () => {
return undefined;
};
Expand Down
14 changes: 7 additions & 7 deletions src/generators/cplusplus/constrainer/EnumConstrainer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ import {
NO_EMPTY_VALUE,
NO_RESERVED_KEYWORDS
} from '../../../helpers/Constraints';
import {
FormatHelpers,
EnumKeyConstraint,
EnumValueConstraint
} from '../../../helpers';
import { FormatHelpers } from '../../../helpers';
import { isReservedCplusplusKeyword } from '../Constants';
import {
CplusplusEnumKeyConstraint,
CplusplusEnumValueConstraint
} from '../CplusplusGenerator';

export type ModelEnumKeyConstraints = {
NO_SPECIAL_CHAR: (value: string) => string;
Expand Down Expand Up @@ -50,7 +50,7 @@ export const DefaultEnumKeyConstraints: ModelEnumKeyConstraints = {
*/
export function defaultEnumKeyConstraints(
customConstraints?: Partial<ModelEnumKeyConstraints>
): EnumKeyConstraint {
): CplusplusEnumKeyConstraint {
const constraints = { ...DefaultEnumKeyConstraints, ...customConstraints };

return ({ enumKey, enumModel, constrainedEnumModel }) => {
Expand All @@ -76,7 +76,7 @@ export function defaultEnumKeyConstraints(
/**
* Convert the enum value to a value that is compatible with Cplusplus
*/
export function defaultEnumValueConstraints(): EnumValueConstraint {
export function defaultEnumValueConstraints(): CplusplusEnumValueConstraint {
return ({ enumValue }) => {
let constrainedEnumValue;
switch (typeof enumValue) {
Expand Down
5 changes: 3 additions & 2 deletions src/generators/cplusplus/constrainer/ModelNameConstrainer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ import {
NO_EMPTY_VALUE,
NO_RESERVED_KEYWORDS
} from '../../../helpers/Constraints';
import { FormatHelpers, ModelNameConstraint } from '../../../helpers';
import { FormatHelpers } from '../../../helpers';
import { isReservedCplusplusKeyword } from '../Constants';
import { CplusplusModelNameConstraint } from '../CplusplusGenerator';

export type ModelNameConstraints = {
NO_SPECIAL_CHAR: (value: string) => string;
Expand Down Expand Up @@ -36,7 +37,7 @@ export const DefaultModelNameConstraints: ModelNameConstraints = {
*/
export function defaultModelNameConstraints(
customConstraints?: Partial<ModelNameConstraints>
): ModelNameConstraint {
): CplusplusModelNameConstraint {
const constraints = { ...DefaultModelNameConstraints, ...customConstraints };

return ({ modelName }) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ import {
NO_DUPLICATE_PROPERTIES,
NO_EMPTY_VALUE
} from '../../../helpers/Constraints';
import { FormatHelpers, PropertyKeyConstraint } from '../../../helpers';
import { FormatHelpers } from '../../../helpers';
import { isReservedCplusplusKeyword } from '../Constants';
import { CplusplusPropertyKeyConstraint } from '../CplusplusGenerator';

export type PropertyKeyConstraintOptions = {
NO_SPECIAL_CHAR: (value: string) => string;
Expand Down Expand Up @@ -46,7 +47,7 @@ export const DefaultPropertyKeyConstraints: PropertyKeyConstraintOptions = {
*/
export function defaultPropertyKeyConstraints(
customConstraints?: Partial<PropertyKeyConstraintOptions>
): PropertyKeyConstraint {
): CplusplusPropertyKeyConstraint {
const constraints = {
...DefaultPropertyKeyConstraints,
...customConstraints
Expand Down
3 changes: 1 addition & 2 deletions src/generators/csharp/CSharpConstrainer.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { Constraints } from '../../helpers';
import {
ConstrainedEnumValueModel,
ConstrainedObjectPropertyModel
Expand Down Expand Up @@ -113,7 +112,7 @@ export const CSharpDefaultTypeMapping: CSharpTypeMapping = {
}
};

export const CSharpDefaultConstraints: Constraints = {
export const CSharpDefaultConstraints = {
enumKey: defaultEnumKeyConstraints(),
enumValue: defaultEnumValueConstraints(),
modelName: defaultModelNameConstraints(),
Expand Down
14 changes: 12 additions & 2 deletions src/generators/csharp/CSharpGenerator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,12 @@ import {
Constraints,
constrainMetaModel,
split,
SplitOptions
SplitOptions,
ConstantConstraint,
EnumKeyConstraint,
EnumValueConstraint,
ModelNameConstraint,
PropertyKeyConstraint
} from '../../helpers';
import { CSharpPreset, CSHARP_DEFAULT_PRESET } from './CSharpPreset';
import { EnumRenderer } from './renderers/EnumRenderer';
Expand All @@ -37,11 +42,16 @@ import { CSharpDependencyManager } from './CSharpDependencyManager';
export interface CSharpOptions extends CommonGeneratorOptions<CSharpPreset> {
collectionType: 'List' | 'Array';
typeMapping: TypeMapping<CSharpOptions, CSharpDependencyManager>;
constraints: Constraints;
constraints: Constraints<CSharpOptions>;
autoImplementedProperties: boolean;
modelType: 'class' | 'record';
handleNullable: boolean;
}
export type CSharpConstantConstraint = ConstantConstraint<CSharpOptions>;
export type CSharpEnumKeyConstraint = EnumKeyConstraint<CSharpOptions>;
export type CSharpEnumValueConstraint = EnumValueConstraint<CSharpOptions>;
export type CSharpModelNameConstraint = ModelNameConstraint<CSharpOptions>;
export type CSharpPropertyKeyConstraint = PropertyKeyConstraint<CSharpOptions>;
export type CSharpTypeMapping = TypeMapping<
CSharpOptions,
CSharpDependencyManager
Expand Down
4 changes: 2 additions & 2 deletions src/generators/csharp/constrainer/ConstantConstrainer.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ConstantConstraint } from '../../../helpers';
import { CSharpConstantConstraint } from '../CSharpGenerator';

export function defaultConstantConstraints(): ConstantConstraint {
export function defaultConstantConstraints(): CSharpConstantConstraint {
return () => {
return undefined;
};
Expand Down
14 changes: 7 additions & 7 deletions src/generators/csharp/constrainer/EnumConstrainer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import {
NO_EMPTY_VALUE,
NO_RESERVED_KEYWORDS
} from '../../../helpers/Constraints';
import {
EnumKeyConstraint,
EnumValueConstraint,
FormatHelpers
} from '../../../helpers';
import { FormatHelpers } from '../../../helpers';
import { isReservedCSharpKeyword } from '../Constants';
import {
CSharpEnumKeyConstraint,
CSharpEnumValueConstraint
} from '../CSharpGenerator';

export type ModelEnumKeyConstraints = {
NO_SPECIAL_CHAR: (value: string) => string;
Expand Down Expand Up @@ -49,7 +49,7 @@ export const DefaultEnumKeyConstraints: ModelEnumKeyConstraints = {

export function defaultEnumKeyConstraints(
customConstraints?: Partial<ModelEnumKeyConstraints>
): EnumKeyConstraint {
): CSharpEnumKeyConstraint {
const constraints = { ...DefaultEnumKeyConstraints, ...customConstraints };

return ({ enumKey, enumModel, constrainedEnumModel }) => {
Expand All @@ -72,7 +72,7 @@ export function defaultEnumKeyConstraints(
};
}

export function defaultEnumValueConstraints(): EnumValueConstraint {
export function defaultEnumValueConstraints(): CSharpEnumValueConstraint {
return ({ enumValue }) => {
let normalizedEnumValue;
switch (typeof enumValue) {
Expand Down
5 changes: 3 additions & 2 deletions src/generators/csharp/constrainer/ModelNameConstrainer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ import {
NO_EMPTY_VALUE,
NO_RESERVED_KEYWORDS
} from '../../../helpers/Constraints';
import { FormatHelpers, ModelNameConstraint } from '../../../helpers';
import { FormatHelpers } from '../../../helpers';
import { isReservedCSharpKeyword } from '../Constants';
import { CSharpModelNameConstraint } from '../CSharpGenerator';

export type ModelNameConstraints = {
NO_SPECIAL_CHAR: (value: string) => string;
Expand Down Expand Up @@ -35,7 +36,7 @@ export const DefaultModelNameConstraints: ModelNameConstraints = {
};
export function defaultModelNameConstraints(
customConstraints?: Partial<ModelNameConstraints>
): ModelNameConstraint {
): CSharpModelNameConstraint {
const constraints = { ...DefaultModelNameConstraints, ...customConstraints };

return ({ modelName }) => {
Expand Down
5 changes: 3 additions & 2 deletions src/generators/csharp/constrainer/PropertyKeyConstrainer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ import {
NO_EMPTY_VALUE,
NO_RESERVED_KEYWORDS
} from '../../../helpers/Constraints';
import { FormatHelpers, PropertyKeyConstraint } from '../../../helpers';
import { FormatHelpers } from '../../../helpers';
import { isReservedCSharpKeyword } from '../Constants';
import { CSharpPropertyKeyConstraint } from '../CSharpGenerator';

export type PropertyKeyConstraintOptions = {
NO_SPECIAL_CHAR: (value: string) => string;
Expand Down Expand Up @@ -51,7 +52,7 @@ export const DefaultPropertyKeyConstraints: PropertyKeyConstraintOptions = {

export function defaultPropertyKeyConstraints(
customConstraints?: Partial<PropertyKeyConstraintOptions>
): PropertyKeyConstraint {
): CSharpPropertyKeyConstraint {
const constraints = {
...DefaultPropertyKeyConstraints,
...customConstraints
Expand Down
3 changes: 1 addition & 2 deletions src/generators/dart/DartConstrainer.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { Constraints } from '../../helpers';
import {
defaultEnumKeyConstraints,
defaultEnumValueConstraints
Expand Down Expand Up @@ -71,7 +70,7 @@ export const DartDefaultTypeMapping: DartTypeMapping = {
}
};

export const DartDefaultConstraints: Constraints = {
export const DartDefaultConstraints = {
enumKey: defaultEnumKeyConstraints(),
enumValue: defaultEnumValueConstraints(),
modelName: defaultModelNameConstraints(),
Expand Down
Loading

0 comments on commit 396dd69

Please sign in to comment.