Skip to content

Commit cd47f54

Browse files
committed
feat(class-mock): add seed,setLocale function, add Fake decorator
1 parent 982c087 commit cd47f54

File tree

11 files changed

+65
-37
lines changed

11 files changed

+65
-37
lines changed

packages/class-mock/package.json

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,13 @@
4949
"url": "https://github.com/2214962083/vue-superman/issues"
5050
},
5151
"homepage": "https://github.com/2214962083/vue-superman#readme",
52-
"peerDependencies": {
53-
"reflect-metadata": "*"
54-
},
5552
"devDependencies": {
5653
"@types/node": "^17.0.24",
5754
"@types/rimraf": "^3.0.2",
5855
"conventional-changelog-cli": "^2.2.2",
5956
"cross-env": "^7.0.3",
6057
"esno": "^0.14.1",
6158
"jsdom": "^19.0.0",
62-
"reflect-metadata": "^0.1.13",
6359
"rimraf": "^3.0.2",
6460
"superman-shared": "workspace:*",
6561
"typescript": "4.6.3",

packages/class-mock/src/decorators/config.decorator.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import {mergeConfig, getTarget} from '@/utils/common'
33
import {MetadataStorage} from '@/utils/meta-storage'
44
import {
5+
Nil,
56
MockPropertyDecoratorConfig,
67
MockPropertyMetadata,
78
MockPropertyDecorator,
@@ -82,7 +83,7 @@ export function ConfigDecorator<
8283
...(typeof arrayConfig === 'number' ? {length: arrayConfig} : arrayConfig)
8384
}),
8485
isNotArray: () => createMergeConfigDecorator(<T>{array: false}),
85-
groups: (groups: string[]) => createMergeConfigDecorator(<T>{groups})
86+
groups: (groups: string[] | Nil) => createMergeConfigDecorator(<T>{groups})
8687
}
8788

8889
const classDecoratorProto: MockClassDecoratorProps<T> = {

packages/class-mock/src/decorators/faker.decorator.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,5 @@ export const System = createFakeProxy('system')
4848
export const Time = createFakeProxy('time')
4949
export const Vehicle = createFakeProxy('vehicle')
5050
export const Word = createFakeProxy('word')
51+
52+
export const Fake = (...params: Parameters<typeof faker.fake>) => MockDecorator(faker.fake, ...params)

packages/class-mock/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export {
1313
// entity decorator
1414
Entity,
1515
// faker decorators
16+
Fake,
1617
Mersenne,
1718
Random,
1819
Helpers,
@@ -45,4 +46,5 @@ export {
4546
} from './decorators'
4647
export {createMock} from './utils/create-mock'
4748
export type {CreateMockOptions} from './utils/create-mock'
49+
export {setLocale, seed} from './utils/common'
4850
export * from './utils/types-helper'

packages/class-mock/src/playground.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
import 'reflect-metadata'
2-
import faker from '@faker-js/faker'
3-
import {Random, Name, Phone, Address, Datatype} from './decorators/faker.decorator'
1+
import {Random, Name, Phone, Address, Datatype, Fake} from './decorators/faker.decorator'
42
import {createMock} from './utils/create-mock'
5-
import {IsArray, IsExclude, IsNotAlwaysRandom, IsPartial} from './decorators/config.decorator'
3+
import {Groups, IsArray, IsExclude, IsNotAlwaysRandom} from './decorators/config.decorator'
64
import {DefaultAlwaysRandom} from './decorators/class.decorator'
75
import {Entity} from './decorators/entity.decorator'
86

9-
faker.setLocale('zh_CN')
7+
// setLocale('zh_CN')
108

119
@DefaultAlwaysRandom()
1210
class User {
@@ -19,6 +17,7 @@ class User {
1917
}
2018

2119
class Skill {
20+
@Groups(['user', 'people'])
2221
@Random.words(5)
2322
name!: string
2423
}
@@ -31,18 +30,21 @@ class Student extends User {
3130
@Phone.phoneNumber('188########')
3231
tel!: number
3332

34-
@IsPartial()
35-
@Entity(() => Skill)
33+
// @IsPartial()
34+
@Entity(() => Skill).groups(['aaa'])
3635
skills!: Skill[]
3736

37+
@Fake('Hi, my name is {{name.firstName}} {{name.lastName}}!')
38+
introduction!: string
39+
3840
@IsExclude()
3941
privateKey!: string
4042
}
4143

4244
const mockStudent = createMock(Student)
4345
console.log('mockStudent: ', mockStudent)
4446

45-
const mockStudentList = createMock(Student, {array: true, length: 3})
47+
const mockStudentList = createMock(Student, {array: true, length: 3, groups: ['user', 'aaa'], seed: 12})
4648
console.log('\n\nmockStudentList: ', mockStudentList)
4749

4850
// 比如提供一个 webpack 插件或者 vite 插件,配置一下,axios 或 fetch 访问该 url 就可以自动响应 mock 数据了

packages/class-mock/src/utils/common.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/* eslint-disable @typescript-eslint/no-explicit-any */
2+
import {Nil, ArrayConfig, BasePropertyConfig, MetadataTarget} from './types-helper'
23
import {DEFAULT_ARRAY_LENGTH, DEFAULT_ARRAY_MAX, DEFAULT_ARRAY_MIN} from '@/constants/meta.constants'
3-
import {ArrayConfig, BasePropertyConfig, MetadataTarget} from './types-helper'
4+
import faker, {UsableLocale} from '@faker-js/faker'
45

56
export function getTarget(target: any): MetadataTarget {
67
return target instanceof Function ? target : target.constructor
@@ -46,3 +47,18 @@ export function mergeConfig<Config extends BasePropertyConfig>(
4647
...(newMeta || {})
4748
} as Config
4849
}
50+
51+
export function IsGroupsIntersect(source: any[] | Nil, target: any[] | Nil) {
52+
if (!source && !target) return true
53+
if (!source) return false
54+
if (!target) return true
55+
return source?.some(item => target?.includes(item))
56+
}
57+
58+
export function setLocale(locale: UsableLocale) {
59+
return faker.setLocale(locale)
60+
}
61+
62+
export function seed(seed?: number | number[]) {
63+
return faker.seed(seed)
64+
}

packages/class-mock/src/utils/create-mock.ts

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,51 @@
11
/* eslint-disable @typescript-eslint/no-explicit-any */
22
import {CLASS_META_KEY} from '@/constants/meta.constants'
3-
import {getGenerateArrayLength, randomBoolean} from './common'
3+
import faker from '@faker-js/faker'
4+
import {getGenerateArrayLength, IsGroupsIntersect, randomBoolean} from './common'
45
import {MetadataStorage} from './meta-storage'
56
import {BaseClass, BasePropertyConfig, MockPropertyMetadata} from './types-helper'
67

7-
export interface CreateMockOptions<IsArray extends boolean = false> extends BasePropertyConfig {
8+
export interface CreateMockOptions<IsArray extends boolean = false> extends Omit<BasePropertyConfig, 'partial'> {
89
/**
910
* if true, will generate an array
1011
* @default false
1112
*/
1213
array?: IsArray
14+
15+
/**
16+
* seed for generating same random value
17+
*/
18+
seed?: number | number[]
1319
}
1420

1521
export function createMock<T extends BaseClass, IsArray extends boolean = false>(
1622
Entity: T,
1723
options: CreateMockOptions<IsArray> = {}
1824
): IsArray extends false ? T : T[] {
25+
if (options.seed) {
26+
faker.seed(options.seed)
27+
delete options.seed
28+
}
1929
if (!options.array) {
2030
const metas = MetadataStorage.instance.getClassMetadatas(Entity)
2131
const entity = new Entity()
2232
metas.map(meta => {
2333
const {
2434
target,
2535
propertyName,
26-
alwaysRandom = true,
36+
alwaysRandom: _alwaysRandom,
2737
randomResult,
2838
partialResult,
2939
partial,
30-
// groups = [],
40+
groups,
3141
array = false,
3242
mockFn,
3343
entityFn
3444
} = meta
3545
if (propertyName === CLASS_META_KEY) return
36-
const exclude = partial === 'exclude'
46+
const exclude = partial === 'exclude' || !IsGroupsIntersect(options.groups, groups)
3747
const maybePartial = partial === 'partial' || partial === true
48+
const alwaysRandom = options.alwaysRandom ?? _alwaysRandom ?? true
3849

3950
const updateMeta = (newMeta: Partial<MockPropertyMetadata>) => {
4051
MetadataStorage.instance.updateMockMetadata(target, propertyName, newMeta)
@@ -48,8 +59,8 @@ export function createMock<T extends BaseClass, IsArray extends boolean = false>
4859
} else if (typeof entityFn === 'function') {
4960
const PropertyEntity = entityFn()
5061
return createMock(PropertyEntity, {
51-
array: false,
52-
...otherOptions
62+
...otherOptions,
63+
array: false
5364
})
5465
}
5566
return undefined
@@ -64,11 +75,11 @@ export function createMock<T extends BaseClass, IsArray extends boolean = false>
6475
} else if (typeof entityFn === 'function') {
6576
const PropertyEntity = entityFn()
6677
return createMock(PropertyEntity, {
78+
...otherOptions,
6779
array: true,
6880
length,
6981
min,
70-
max,
71-
...otherOptions
82+
max
7283
})
7384
}
7485
return undefined
@@ -92,7 +103,12 @@ export function createMock<T extends BaseClass, IsArray extends boolean = false>
92103
if (!shouldCreate) return delete entity[propertyName]
93104
}
94105

95-
propertyValue = !array ? createSingleValue(meta) : createListValue(meta)
106+
const newMeta: MockPropertyMetadata = {
107+
...meta,
108+
groups: options.groups,
109+
alwaysRandom
110+
}
111+
propertyValue = !array ? createSingleValue(newMeta) : createListValue(newMeta)
96112
updateMeta({randomResult: propertyValue})
97113
entity[propertyName] = propertyValue
98114
})

packages/class-mock/src/utils/types-helper.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,10 @@ export interface BasePropertyConfig extends ArrayConfig {
4545
alwaysRandom?: boolean | undefined
4646

4747
/**
48-
* @TODO
4948
* property only generate in these groups, groups will provide by createMock
5049
* @default undefined
5150
*/
52-
groups?: string[] | undefined
51+
groups?: string[] | Nil
5352

5453
/**
5554
* if true, value will be an array
@@ -175,7 +174,7 @@ export interface MockPropertyDecoratorProps<T extends BasePropertyConfig> {
175174
* set metadata.groups to groups
176175
* @param groups property only generate in these groups, groups will provide by createMock
177176
*/
178-
groups(groups: string[]): MockPropertyDecorator<T>
177+
groups(groups: string[] | Nil): MockPropertyDecorator<T>
179178
}
180179
export interface MockPropertyDecorator<T extends BasePropertyConfig>
181180
extends PropertyDecorator,

packages/class-mock/vite.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ const createViteConfig = (options: CreateViteConfigOptions = {}): UserConfig =>
1616
externalMap: {
1717
'@faker-js/faker': ''
1818
},
19-
dedupe: ['reflect-metadata', '@faker-js/faker'] // use the same version
19+
dedupe: ['@faker-js/faker'] // use the same version
2020
})
2121
}
2222

packages/vue-xrender/src/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
export * from './hooks'
2-
export * from './components'
1+
export {useJsx} from './hooks'
2+
export {XJsx, XTpl} from './components'
33
export * from './utils/types-helper'

0 commit comments

Comments
 (0)