diff --git a/lib/class/Container.js b/lib/class/Container.js index 132428e891309bea2eedc85cd55a1706e234a0df..be1c2403964a17ea4560da369a2a97da6c389027 100644 Binary files a/lib/class/Container.js and b/lib/class/Container.js differ diff --git a/lib/core/traverse.js b/lib/core/traverse.js index 4de3ba68dc256c93aa77ac30cff3495e4fab30fa..379910ec781847cd02fc9f6f035c95bd558a5a3d 100644 Binary files a/lib/core/traverse.js and b/lib/core/traverse.js differ diff --git a/lib/core/utils.js b/lib/core/utils.js index 461c71797777577aa9fb31393d6b154fa87a4974..8e4d201d5459edbe5a85f5161de783dcf3badb9e 100644 Binary files a/lib/core/utils.js and b/lib/core/utils.js differ diff --git a/lib/types/external.js b/lib/types/external.js index 937ea305cd6d5ad7e3afcefede58df96ea97be49..78d1ab2aae1f162492216e6d4dce4192ab0e38ee 100644 Binary files a/lib/types/external.js and b/lib/types/external.js differ diff --git a/package.json b/package.json index 9d6d0e405861b2bd97c30f82c7bd3646e897e825..a79e131999d6f6202a41605ef791c9a4de531421 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ }, "devDependencies": { "browserify": "^13.1.1", + "casual": "^1.5.8", "clone": "^2.1.0", "codecov": "^1.0.1", "eslint": "^3.10.2", diff --git a/spec/schema/core/issues/chance-and-faker.json b/spec/schema/core/issues/chance-and-faker.json index 5345e144d0b3042bae566d5bd1de18578eea1d69..8e7d19fa07766aeac8f07392c59632cc53bf39c2 100644 --- a/spec/schema/core/issues/chance-and-faker.json +++ b/spec/schema/core/issues/chance-and-faker.json @@ -8,7 +8,7 @@ "chance": "url", "faker": "internet.email" }, - "throws": "ambiguous generator when using both faker and chance: .+?" + "throws": "ambiguous generator .+: .+?" } ] } diff --git a/ts/class/Container.ts b/ts/class/Container.ts index 8323c1851668268390ba32aef34e2cb4ec835874..af41152ebf4eed7ed1a59b2d0d4d6002270f6847 100644 --- a/ts/class/Container.ts +++ b/ts/class/Container.ts @@ -14,7 +14,7 @@ type Registry = { }; /** - * Container is used to wrap external libraries (faker, chance, randexp) that are used among the whole codebase. These + * Container is used to wrap external libraries (faker, chance, casual, randexp) that are used among the whole codebase. These * libraries might be configured, customized, etc. and each internal JSF module needs to access those instances instead * of pure npm module instances. This class supports consistent access to these instances. */ @@ -27,6 +27,7 @@ class Container { this.registry = { faker: null, chance: null, + casual: null, // randexp is required for "pattern" values randexp: RandExp }; @@ -77,7 +78,8 @@ class Container { return { faker: this.get('faker'), chance: this.get('chance'), - randexp: this.get('randexp') + randexp: this.get('randexp'), + casual: this.get('casual') }; } } diff --git a/ts/core/traverse.ts b/ts/core/traverse.ts index 9a9888156dda2166a810a9e2a077c0a4b4c15a5b..4883f0f9496a2b01e4a64c62ab8230664843edc5 100644 --- a/ts/core/traverse.ts +++ b/ts/core/traverse.ts @@ -6,7 +6,7 @@ import types = require('../types/index'); import option = require('../api/option'); function isExternal(schema: IGeneratorSchema): boolean { - return schema.faker || schema.chance; + return schema.faker || schema.chance || schema.casual; } function reduceExternal(schema: IGeneratorSchema, path: SchemaPath): IGeneratorSchema { @@ -16,11 +16,17 @@ function reduceExternal(schema: IGeneratorSchema, path: SchemaPath): IGeneratorS if (schema['x-chance']) { schema.chance = schema['x-chance']; } + if (schema['x-casual']) { + schema.casual = schema['x-casual']; + } + + var count: number = // sum and test later + (schema.faker !== undefined ? 1 : 0) + + (schema.chance !== undefined ? 1 : 0) + + (schema.casual !== undefined ? 1 : 0); - var fakerUsed: boolean = schema.faker !== undefined, - chanceUsed: boolean = schema.chance !== undefined; - if (fakerUsed && chanceUsed) { - throw new ParseError('ambiguous generator when using both faker and chance: ' + JSON.stringify(schema), path); + if (count > 1) { + throw new ParseError('ambiguous generator mixing faker, chance or casual: ' + JSON.stringify(schema), path); } return schema; diff --git a/ts/core/utils.ts b/ts/core/utils.ts index 8b843738679bfd7585c81205daa2d9bd930726f0..36365fd981939e494708da70201f3a158a2f2e0d 100644 --- a/ts/core/utils.ts +++ b/ts/core/utils.ts @@ -28,7 +28,7 @@ function hasProperties(obj: Object, ...properties: string[]): boolean { /** * Returns typecasted value. - * External generators (faker, chance) may return data in non-expected formats, such as string, when you might expect an + * External generators (faker, chance, casual) may return data in non-expected formats, such as string, when you might expect an * integer. This function is used to force the typecast. * * @param value diff --git a/ts/index.d.ts b/ts/index.d.ts index 814694d4e06d04970dd22d8aefa33dcd70d1db7d..de8297238a442b5b56b69658438874b2478b3079 100644 --- a/ts/index.d.ts +++ b/ts/index.d.ts @@ -6,6 +6,8 @@ interface IGeneratorSchema { 'x-faker'?: any; chance?: any; 'x-chance'?: any; + casual?: any; + 'x-casual'?: any; } interface IStringSchema extends IGeneratorSchema { diff --git a/ts/types/external.ts b/ts/types/external.ts index 46e52e16893607fb1ff46d4b40e8cd48c42fbf57..f3c5258f901e1574bf6eb1f8b3358e190ff4ef52 100644 --- a/ts/types/external.ts +++ b/ts/types/external.ts @@ -5,9 +5,9 @@ import container = require('../class/Container'); type ExternalParameters = any[]; var externalType: FTypeGenerator = function externalType(value: JsonSchema, path: string|any): string|any { - var libraryName: string = value.faker ? 'faker' : 'chance', - libraryModule = value.faker ? container.get('faker') : container.get('chance'), - key = value.faker || value.chance, + var libraryName: string = value.faker ? 'faker' : (value.chance ? 'chance' : 'casual'), + libraryModule = container.get(libraryName), + key = value.faker || value.chance || value.casual, path = key, args: ExternalParameters = []; @@ -42,6 +42,10 @@ var externalType: FTypeGenerator = function externalType(value: JsonSchema, path } if (typeof genFunction !== 'function') { + if (libraryName === 'casual') { + return utils.typecast(genFunction, value.type); + } + throw new Error('unknown ' + libraryName + '-generator for ' + JSON.stringify(key)); } diff --git a/yarn.lock b/yarn.lock index ea927d8507abcfaaf460777fa7321b1442bdba0d..8f3c45b7d7b076204f50dad87dd754c569b6de1c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -417,6 +417,13 @@ caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" +casual: + version "1.5.8" + resolved "https://registry.yarnpkg.com/casual/-/casual-1.5.8.tgz#82009d3cd39b79e7ec8db7a6245699fcfbcb3691" + dependencies: + mersenne-twister "^1.0.1" + moment "^2.15.2" + center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" @@ -1625,6 +1632,10 @@ marked@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" +mersenne-twister@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mersenne-twister/-/mersenne-twister-1.1.0.tgz#f916618ee43d7179efcf641bec4531eb9670978a" + miller-rabin@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" @@ -1701,6 +1712,10 @@ module-deps@^4.0.8: through2 "^2.0.0" xtend "^4.0.0" +moment@^2.15.2: + version "2.17.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.17.0.tgz#a4c292e02aac5ddefb29a6eed24f51938dd3b74f" + ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"