@kubb/plugin-faker 5.0.0-alpha.9 → 5.0.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/LICENSE +17 -10
  2. package/README.md +25 -7
  3. package/dist/Faker-BMgoFj8b.d.ts +27 -0
  4. package/dist/Faker-CWtonujy.js +334 -0
  5. package/dist/Faker-CWtonujy.js.map +1 -0
  6. package/dist/Faker-D39THFJ-.cjs +418 -0
  7. package/dist/Faker-D39THFJ-.cjs.map +1 -0
  8. package/dist/components.cjs +2 -2
  9. package/dist/components.d.ts +2 -31
  10. package/dist/components.js +1 -1
  11. package/dist/fakerGenerator-B-QnVz9o.d.ts +9 -0
  12. package/dist/fakerGenerator-B-XuVREg.cjs +570 -0
  13. package/dist/fakerGenerator-B-XuVREg.cjs.map +1 -0
  14. package/dist/fakerGenerator-DH6hN3yb.js +560 -0
  15. package/dist/fakerGenerator-DH6hN3yb.js.map +1 -0
  16. package/dist/generators.cjs +1 -1
  17. package/dist/generators.d.ts +2 -505
  18. package/dist/generators.js +1 -1
  19. package/dist/index.cjs +237 -84
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.ts +28 -4
  22. package/dist/index.js +229 -83
  23. package/dist/index.js.map +1 -1
  24. package/dist/printerFaker-W0pLunAj.d.ts +213 -0
  25. package/extension.yaml +357 -0
  26. package/package.json +48 -51
  27. package/src/components/Faker.tsx +124 -78
  28. package/src/generators/fakerGenerator.tsx +233 -134
  29. package/src/index.ts +7 -2
  30. package/src/plugin.ts +60 -121
  31. package/src/printers/printerFaker.ts +341 -0
  32. package/src/resolvers/resolverFaker.ts +85 -0
  33. package/src/types.ts +134 -81
  34. package/src/utils.ts +268 -0
  35. package/dist/components-BkBIov4R.js +0 -419
  36. package/dist/components-BkBIov4R.js.map +0 -1
  37. package/dist/components-IdP8GXXX.cjs +0 -461
  38. package/dist/components-IdP8GXXX.cjs.map +0 -1
  39. package/dist/fakerGenerator-CYUCNH3Q.cjs +0 -204
  40. package/dist/fakerGenerator-CYUCNH3Q.cjs.map +0 -1
  41. package/dist/fakerGenerator-M5oCrPmy.js +0 -200
  42. package/dist/fakerGenerator-M5oCrPmy.js.map +0 -1
  43. package/dist/types-r7BubMLO.d.ts +0 -132
  44. package/src/parser.ts +0 -453
@@ -1,107 +1,153 @@
1
1
  import { jsStringEscape } from '@internals/utils'
2
- import type { Schema } from '@kubb/plugin-oas'
3
- import { isKeyword, schemaKeywords } from '@kubb/plugin-oas'
4
- import { File, Function, FunctionParams } from '@kubb/react-fabric'
5
- import type { FabricReactNode } from '@kubb/react-fabric/types'
6
- import * as parserFaker from '../parser.ts'
2
+ import { ast } from '@kubb/core'
3
+ import { functionPrinter } from '@kubb/plugin-ts'
4
+ import { File, Function } from '@kubb/renderer-jsx'
5
+ import type { KubbReactNode } from '@kubb/renderer-jsx/types'
6
+ import type { PrinterFakerFactory } from '../printers/printerFaker.ts'
7
7
  import type { PluginFaker } from '../types.ts'
8
+ import { resolveFakerTypeUsage } from '../utils.ts'
8
9
 
9
10
  type Props = {
10
11
  name: string
11
12
  typeName: string
12
- tree: Array<Schema>
13
+ node: ast.SchemaNode
14
+ printer: ast.Printer<PrinterFakerFactory>
13
15
  seed?: PluginFaker['options']['seed']
14
16
  description?: string
15
- regexGenerator?: PluginFaker['options']['regexGenerator']
16
- mapper?: PluginFaker['options']['mapper']
17
- dateParser?: PluginFaker['options']['dateParser']
18
17
  canOverride: boolean
19
18
  }
20
19
 
21
- export function Faker({ tree, description, name, typeName, seed, regexGenerator, canOverride, mapper, dateParser }: Props): FabricReactNode {
22
- const fakerText = parserFaker.joinItems(
23
- tree
24
- .map((schema, _index, siblings) =>
25
- parserFaker.parse(
26
- { name, schema, parent: undefined, current: schema, siblings },
27
- {
28
- typeName,
29
- rootTypeName: name,
30
- regexGenerator,
31
- mapper,
32
- canOverride,
33
- dateParser,
34
- },
35
- ),
36
- )
37
- .filter((x): x is string => Boolean(x)),
38
- )
39
-
40
- const isArray = fakerText.startsWith('faker.helpers.arrayElements') || fakerText.startsWith('faker.helpers.multiple')
41
- const isRefToArray = tree.some((s) => isKeyword(s, schemaKeywords.schema) && s.args.type === 'array')
42
- const isObject = fakerText.startsWith('{')
43
- const isTuple = fakerText.startsWith('faker.helpers.arrayElement')
44
-
45
- const isSimpleString = name === 'string'
46
- const isSimpleInt = name === 'integer'
47
- const isSimpleFloat = name === 'float'
20
+ const OBJECT_TYPES = new Set<ast.SchemaNode['type']>(['object', 'intersection'])
21
+ const ARRAY_TYPES = new Set<ast.SchemaNode['type']>(['array'])
22
+ const SCALAR_TYPES = new Set<ast.SchemaNode['type']>([
23
+ 'string',
24
+ 'email',
25
+ 'url',
26
+ 'uuid',
27
+ 'number',
28
+ 'integer',
29
+ 'bigint',
30
+ 'boolean',
31
+ 'date',
32
+ 'time',
33
+ 'datetime',
34
+ 'blob',
35
+ 'enum',
36
+ ])
37
+ const declarationPrinter = functionPrinter({ mode: 'declaration' })
38
+
39
+ export function Faker({ node, description, name, typeName, printer, seed, canOverride }: Props): KubbReactNode {
40
+ const fakerText = printer.print(node) ?? 'undefined'
41
+
42
+ const isArray = ARRAY_TYPES.has(node.type)
43
+ const isObject = OBJECT_TYPES.has(node.type)
44
+ const isTuple = node.type === 'tuple'
45
+ const isScalar = SCALAR_TYPES.has(node.type)
48
46
 
49
47
  let fakerTextWithOverride = fakerText
48
+ let useGenericOverride = false
50
49
 
51
50
  if (canOverride && isObject) {
52
- fakerTextWithOverride = `{
53
- ...${fakerText},
54
- ...data || {}
55
- }`
51
+ useGenericOverride = true
56
52
  }
57
53
 
58
- if (canOverride && isTuple) fakerTextWithOverride = `data || ${fakerText}`
54
+ if (canOverride && isTuple) {
55
+ fakerTextWithOverride = `data || ${fakerText}`
56
+ }
59
57
 
60
58
  if (canOverride && isArray) {
61
59
  fakerTextWithOverride = `[
62
- ...${fakerText},
63
- ...data || []
64
- ]`
60
+ ...${fakerText},
61
+ ...(data || [])
62
+ ]`
65
63
  }
66
64
 
67
- if (canOverride && isSimpleString) fakerTextWithOverride = 'data ?? faker.string.alpha()'
68
-
69
- if (canOverride && isSimpleInt) fakerTextWithOverride = 'data ?? faker.number.int()'
70
-
71
- if (canOverride && isSimpleFloat) fakerTextWithOverride = 'data ?? faker.number.float()'
72
-
73
- let type = `Partial<${typeName}>`
74
-
75
- if (isArray) type = typeName
76
- if (isRefToArray) type = typeName
77
- if (isSimpleString) type = name
78
- if (isSimpleInt || isSimpleFloat) type = 'number'
79
-
80
- const params = FunctionParams.factory({
81
- data: {
82
- // making a partial out of an array does not make sense
83
- type,
84
- optional: true,
85
- },
86
- })
87
-
88
- let returnType = canOverride ? typeName : undefined
65
+ if (canOverride && isScalar) {
66
+ fakerTextWithOverride = `data ?? ${fakerText}`
67
+ }
89
68
 
90
- if (isSimpleString || isSimpleInt || isSimpleFloat) returnType = type
69
+ const { dataType, returnType: resolvedReturnType } = resolveFakerTypeUsage(node, typeName, canOverride)
70
+
71
+ let functionSignature = ''
72
+ let functionBody = ''
73
+
74
+ if (useGenericOverride) {
75
+ // Generate function with defaultFakeData structure
76
+ const jsdoc = description ? `/**\n * @description ${jsStringEscape(description)}\n */\n ` : ''
77
+ functionSignature = `${jsdoc}export function ${name}(data?: Partial<${typeName}>): Required<${typeName}>`
78
+
79
+ const seedCode = seed ? `faker.seed(${JSON.stringify(seed)})\n ` : ''
80
+
81
+ // When the object node has properties that transitively reference a cyclic schema,
82
+ // the printer emits memoizing getters for those properties. Spreading the object
83
+ // literal would immediately invoke those getters, triggering recursive faker calls
84
+ // and causing a stack overflow. Detect this upfront via ast helpers so we can
85
+ // use Object.defineProperty-based merging instead of spread.
86
+ const { cyclicSchemas, schemaName } = printer.options
87
+ const hasGetters =
88
+ node.type === 'object' &&
89
+ !!cyclicSchemas &&
90
+ (node.properties ?? []).some((p) => ast.containsCircularRef(p.schema, { circularSchemas: cyclicSchemas, excludeName: schemaName }))
91
+
92
+ if (hasGetters) {
93
+ functionBody = `{
94
+ ${seedCode}const defaultFakeData = ${fakerText}
95
+ if (data) {
96
+ for (const [key, value] of Object.entries(data)) {
97
+ Object.defineProperty(defaultFakeData, key, { value, configurable: true, writable: true, enumerable: true })
98
+ }
99
+ }
100
+ return defaultFakeData as Required<${typeName}>
101
+ }`
102
+ } else {
103
+ functionBody = `{
104
+ ${seedCode}const defaultFakeData = ${fakerText}
105
+ return {
106
+ ...defaultFakeData,
107
+ ...(data || {}),
108
+ } as Required<${typeName}>
109
+ }`
110
+ }
111
+ } else {
112
+ const usesData = /\bdata\b/.test(fakerTextWithOverride)
113
+ const dataParamName = usesData ? 'data' : '_data'
114
+ const params = ast.createFunctionParameters({
115
+ params: [
116
+ ast.createFunctionParameter({
117
+ name: dataParamName,
118
+ type: ast.createParamsType({ variant: 'reference', name: dataType }),
119
+ optional: true,
120
+ }),
121
+ ],
122
+ })
123
+ const paramsSignature = declarationPrinter.print(params) ?? ''
124
+ const returnType = resolvedReturnType
125
+
126
+ return (
127
+ <File.Source name={name} isExportable isIndexable>
128
+ <Function
129
+ export
130
+ name={name}
131
+ JSDoc={{ comments: description ? [`@description ${jsStringEscape(description)}`] : [] }}
132
+ params={canOverride ? paramsSignature : undefined}
133
+ returnType={returnType}
134
+ >
135
+ {seed ? (
136
+ <>
137
+ {`faker.seed(${JSON.stringify(seed)})`}
138
+ <br />
139
+ </>
140
+ ) : undefined}
141
+ {`return ${fakerTextWithOverride}`}
142
+ </Function>
143
+ </File.Source>
144
+ )
145
+ }
91
146
 
92
147
  return (
93
148
  <File.Source name={name} isExportable isIndexable>
94
- <Function
95
- export
96
- name={name}
97
- JSDoc={{ comments: [description ? `@description ${jsStringEscape(description)}` : undefined].filter(Boolean) }}
98
- params={canOverride ? params.toConstructor() : undefined}
99
- returnType={returnType}
100
- >
101
- {seed ? `faker.seed(${JSON.stringify(seed)})` : undefined}
102
- <br />
103
- {`return ${fakerTextWithOverride}`}
104
- </Function>
149
+ {functionSignature}
150
+ {functionBody}
105
151
  </File.Source>
106
152
  )
107
153
  }
@@ -1,87 +1,221 @@
1
- import { useMode, usePluginDriver } from '@kubb/core/hooks'
2
- import { type OperationSchema as OperationSchemaType, SchemaGenerator, schemaKeywords } from '@kubb/plugin-oas'
3
- import { createReactGenerator } from '@kubb/plugin-oas/generators'
4
- import { useOas, useOperationManager, useSchemaManager } from '@kubb/plugin-oas/hooks'
5
- import { applyParamsCasing, getBanner, getFooter, getImports, isParameterSchema } from '@kubb/plugin-oas/utils'
1
+ import { aliasConflictingImports, filterUsedImports, rewriteAliasedImports } from '@internals/utils'
2
+ import { ast, defineGenerator } from '@kubb/core'
6
3
  import { pluginTsName } from '@kubb/plugin-ts'
7
- import { File } from '@kubb/react-fabric'
8
- import { Faker } from '../components'
9
- import type { PluginFaker } from '../types'
4
+ import { File, jsxRenderer } from '@kubb/renderer-jsx'
5
+ import { Faker } from '../components/Faker.tsx'
6
+ import { printerFaker } from '../printers/printerFaker.ts'
7
+ import type { PluginFaker } from '../types.ts'
8
+ import {
9
+ buildResponseUnionSchema,
10
+ canOverrideSchema,
11
+ localeToFakerImport,
12
+ resolveParamNameByLocation,
13
+ resolveSchemaRef,
14
+ resolveTypeReference,
15
+ } from '../utils.ts'
10
16
 
11
- export const fakerGenerator = createReactGenerator<PluginFaker>({
17
+ export const fakerGenerator = defineGenerator<PluginFaker>({
12
18
  name: 'faker',
13
- Operation({ operation, generator, plugin }) {
14
- const {
15
- options,
16
- options: { dateParser, regexGenerator, seed, mapper },
17
- } = plugin
18
- const mode = useMode()
19
- const driver = usePluginDriver()
19
+ renderer: jsxRenderer,
20
+ schema(node, ctx) {
21
+ const { adapter, config, resolver, root } = ctx
22
+ const { output, group, dateParser, regexGenerator, mapper, seed, locale, printer } = ctx.options
23
+ const pluginTs = ctx.driver.getPlugin(pluginTsName)
20
24
 
21
- const oas = useOas()
22
- const { getSchemas, getFile, getGroup } = useOperationManager(generator)
23
- const schemaManager = useSchemaManager()
25
+ if (!node.name || !pluginTs || !adapter.inputNode) {
26
+ return
27
+ }
28
+
29
+ const tsResolver = ctx.driver.getResolver(pluginTsName)
24
30
 
25
- const file = getFile(operation)
26
- const schemas = getSchemas(operation)
27
- const schemaGenerator = new SchemaGenerator(options, {
28
- fabric: generator.context.fabric,
29
- oas,
30
- plugin,
31
- events: generator.context.events,
32
- driver,
33
- mode,
34
- override: options.override,
31
+ const schemaNode = resolveSchemaRef(node, adapter.inputNode.schemas)
32
+ const schemaName = schemaNode.name ?? node.name
33
+ const mode = ctx.getMode(output)
34
+ const meta = {
35
+ name: resolver.resolveName(schemaName),
36
+ file: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group }),
37
+ typeName: tsResolver.resolveTypeName(schemaName),
38
+ typeFile: tsResolver.resolveFile(
39
+ { name: schemaName, extname: '.ts' },
40
+ { root, output: pluginTs.options?.output ?? output, group: pluginTs.options?.group },
41
+ ),
42
+ } as const
43
+ const canOverride = canOverrideSchema(schemaNode)
44
+ const cyclicSchemas = adapter.inputNode ? ast.findCircularSchemas(adapter.inputNode.schemas) : undefined
45
+ const printerInstance = printerFaker({
46
+ resolver,
47
+ schemaName,
48
+ typeName: meta.typeName,
49
+ dateParser,
50
+ regexGenerator,
51
+ mapper,
52
+ nodes: printer?.nodes,
53
+ cyclicSchemas,
54
+ })
55
+ const fakerText = printerInstance.print(schemaNode) ?? 'undefined'
56
+ const typeReference = resolveTypeReference({
57
+ node: schemaNode,
58
+ canOverride,
59
+ name: meta.name,
60
+ typeName: meta.typeName,
61
+ filePath: meta.file.path,
62
+ typeFilePath: meta.typeFile.path,
35
63
  })
36
64
 
37
- const operationSchemas = [schemas.pathParams, schemas.queryParams, schemas.headerParams, schemas.statusCodes, schemas.request, schemas.response]
38
- .flat()
39
- .filter((x): x is OperationSchemaType => Boolean(x))
65
+ const imports = adapter
66
+ .getImports(schemaNode, (schemaName) => ({
67
+ name: resolver.resolveName(schemaName),
68
+ path: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group }).path,
69
+ }))
70
+ .filter((entry) => entry.path !== meta.file.path)
71
+ const usedImports = filterUsedImports(imports, fakerText)
40
72
 
41
- const mapOperationSchema = ({ name, schema, description, ...options }: OperationSchemaType) => {
42
- // Apply paramsCasing transformation if enabled and this is a parameter schema
43
- const shouldTransform = isParameterSchema(name) && plugin.options.paramsCasing
44
- const transformedSchema = shouldTransform ? applyParamsCasing(schema, plugin.options.paramsCasing) : schema
73
+ return (
74
+ <File
75
+ baseName={meta.file.baseName}
76
+ path={meta.file.path}
77
+ meta={meta.file.meta}
78
+ banner={resolver.resolveBanner(adapter.inputNode, { output, config })}
79
+ footer={resolver.resolveFooter(adapter.inputNode, { output, config })}
80
+ >
81
+ <File.Import name={locale ? [{ propertyName: localeToFakerImport(locale), name: 'faker' }] : ['faker']} path="@faker-js/faker" />
82
+ {regexGenerator === 'randexp' && <File.Import name={'RandExp'} path={'randexp'} />}
83
+ {dateParser !== 'faker' && <File.Import path={dateParser} name={dateParser} />}
84
+ {typeReference.importPath && <File.Import isTypeOnly root={meta.file.path} path={typeReference.importPath} name={[meta.typeName]} />}
85
+ {mode === 'split' &&
86
+ usedImports.map((imp) => <File.Import key={[schemaName, imp.path, imp.name].join('-')} root={meta.file.path} path={imp.path} name={imp.name} />)}
87
+ <Faker
88
+ name={meta.name}
89
+ typeName={typeReference.typeName}
90
+ description={schemaNode.description}
91
+ node={schemaNode}
92
+ printer={printerInstance}
93
+ seed={seed}
94
+ canOverride={canOverride}
95
+ />
96
+ </File>
97
+ )
98
+ },
99
+ operation(node, ctx) {
100
+ const { adapter, config, resolver, root } = ctx
101
+ const { output, group, paramsCasing, dateParser, regexGenerator, mapper, seed, locale, printer } = ctx.options
102
+ const pluginTs = ctx.driver.getPlugin(pluginTsName)
103
+
104
+ if (!pluginTs) {
105
+ return
106
+ }
45
107
 
46
- const tree = schemaGenerator.parse({ schema: transformedSchema, name, parentName: null })
47
- const imports = getImports(tree)
48
- const group = options.operation ? getGroup(options.operation) : undefined
108
+ const tsResolver = ctx.driver.getResolver(pluginTsName)
49
109
 
50
- const faker = {
51
- name: schemaManager.getName(name, { type: 'function' }),
52
- file: schemaManager.getFile(name),
53
- }
110
+ const params = ast.caseParams(node.parameters, paramsCasing)
111
+ const paramEntries = params.map((param) => ({
112
+ param,
113
+ name: resolveParamNameByLocation(resolver, node, param),
114
+ typeName: resolveParamNameByLocation(tsResolver, node, param),
115
+ }))
116
+ const responseEntries = node.responses.map((response) => ({
117
+ response,
118
+ name: resolver.resolveResponseStatusName(node, response.statusCode),
119
+ typeName: tsResolver.resolveResponseStatusName(node, response.statusCode),
120
+ }))
121
+ const dataEntry = node.requestBody?.content?.[0]?.schema
122
+ ? {
123
+ schema: {
124
+ ...node.requestBody.content![0]!.schema!,
125
+ description: node.requestBody.description ?? node.requestBody.content![0]!.schema!.description,
126
+ },
127
+ name: resolver.resolveDataName(node),
128
+ typeName: tsResolver.resolveDataName(node),
129
+ description: node.requestBody.description ?? node.requestBody.content![0]!.schema!.description,
130
+ }
131
+ : null
132
+ const responseName = resolver.resolveResponseName(node)
133
+ const localHelperNames = new Set([
134
+ ...paramEntries.map((entry) => entry.name),
135
+ ...responseEntries.map((entry) => entry.name),
136
+ ...(dataEntry ? [dataEntry.name] : []),
137
+ responseName,
138
+ ])
139
+ const meta = {
140
+ file: resolver.resolveFile({ name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path }, { root, output, group }),
141
+ typeFile: tsResolver.resolveFile(
142
+ {
143
+ name: node.operationId,
144
+ extname: '.ts',
145
+ tag: node.tags[0] ?? 'default',
146
+ path: node.path,
147
+ },
148
+ {
149
+ root,
150
+ output: pluginTs.options?.output ?? output,
151
+ group: pluginTs.options?.group,
152
+ },
153
+ ),
154
+ } as const
54
155
 
55
- const type = {
56
- name: schemaManager.getName(name, { type: 'type', pluginName: pluginTsName }),
57
- file: schemaManager.getFile(options.operationName || name, { pluginName: pluginTsName, group }),
156
+ function resolveMockImports(schema: ast.SchemaNode) {
157
+ return adapter
158
+ .getImports(schema, (schemaName) => ({
159
+ name: resolver.resolveName(schemaName),
160
+ path: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group }).path,
161
+ }))
162
+ .filter((entry) => entry.path !== meta.file.path)
163
+ }
164
+
165
+ function renderEntry({
166
+ schema,
167
+ name,
168
+ typeName,
169
+ description,
170
+ skipImportNames = [],
171
+ }: {
172
+ schema: ast.SchemaNode | null
173
+ name: string
174
+ typeName: string
175
+ description?: string
176
+ skipImportNames?: Array<string>
177
+ }) {
178
+ if (!schema) {
179
+ return null
58
180
  }
59
181
 
60
- const canOverride = tree.some(
61
- ({ keyword }) =>
62
- keyword === schemaKeywords.array ||
63
- keyword === schemaKeywords.and ||
64
- keyword === schemaKeywords.object ||
65
- keyword === schemaKeywords.union ||
66
- keyword === schemaKeywords.tuple ||
67
- keyword === schemaKeywords.enum ||
68
- keyword === schemaKeywords.ref,
69
- )
182
+ const canOverride = canOverrideSchema(schema)
183
+ const cyclicSchemas = adapter.inputNode ? ast.findCircularSchemas(adapter.inputNode.schemas) : undefined
184
+ const printerInstance = printerFaker({
185
+ resolver,
186
+ schemaName: name,
187
+ typeName,
188
+ dateParser,
189
+ regexGenerator,
190
+ mapper,
191
+ nodes: printer?.nodes,
192
+ cyclicSchemas,
193
+ })
194
+ const fakerText = printerInstance.print(schema) ?? 'undefined'
195
+ const usedImports = filterUsedImports(resolveMockImports(schema), fakerText, skipImportNames)
196
+ const { imports, aliases } = aliasConflictingImports(usedImports, localHelperNames)
197
+ const rewrittenFakerText = rewriteAliasedImports(fakerText, aliases)
198
+ const typeReference = resolveTypeReference({
199
+ node: schema,
200
+ canOverride,
201
+ name,
202
+ typeName,
203
+ filePath: meta.file.path,
204
+ typeFilePath: meta.typeFile.path,
205
+ })
70
206
 
71
207
  return (
72
208
  <>
73
- {canOverride && <File.Import isTypeOnly root={file.path} path={type.file.path} name={[type.name]} />}
209
+ {typeReference.importPath && <File.Import isTypeOnly root={meta.file.path} path={typeReference.importPath} name={[typeName]} />}
74
210
  {imports.map((imp) => (
75
- <File.Import key={[imp.path, imp.name, imp.isTypeOnly].join('-')} root={file.path} path={imp.path} name={imp.name} />
211
+ <File.Import key={[name, imp.path, imp.name].join('-')} root={meta.file.path} path={imp.path} name={imp.name} />
76
212
  ))}
77
213
  <Faker
78
- name={faker.name}
79
- typeName={type.name}
214
+ name={name}
215
+ typeName={typeReference.typeName}
80
216
  description={description}
81
- tree={tree}
82
- regexGenerator={regexGenerator}
83
- dateParser={dateParser}
84
- mapper={mapper}
217
+ node={schema}
218
+ printer={{ ...printerInstance, print: () => rewrittenFakerText }}
85
219
  seed={seed}
86
220
  canOverride={canOverride}
87
221
  />
@@ -91,79 +225,44 @@ export const fakerGenerator = createReactGenerator<PluginFaker>({
91
225
 
92
226
  return (
93
227
  <File
94
- baseName={file.baseName}
95
- path={file.path}
96
- meta={file.meta}
97
- banner={getBanner({ oas, output: plugin.options.output, config: driver.config })}
98
- footer={getFooter({ oas, output: plugin.options.output })}
228
+ baseName={meta.file.baseName}
229
+ path={meta.file.path}
230
+ meta={meta.file.meta}
231
+ banner={resolver.resolveBanner(adapter.inputNode, { output, config })}
232
+ footer={resolver.resolveFooter(adapter.inputNode, { output, config })}
99
233
  >
100
- <File.Import name={['faker']} path="@faker-js/faker" />
234
+ <File.Import name={locale ? [{ propertyName: localeToFakerImport(locale), name: 'faker' }] : ['faker']} path="@faker-js/faker" />
101
235
  {regexGenerator === 'randexp' && <File.Import name={'RandExp'} path={'randexp'} />}
102
236
  {dateParser !== 'faker' && <File.Import path={dateParser} name={dateParser} />}
103
- {operationSchemas.map(mapOperationSchema)}
104
- </File>
105
- )
106
- },
107
- Schema({ schema, plugin }) {
108
- const { getName, getFile } = useSchemaManager()
109
- const {
110
- options: { output, dateParser, regexGenerator, seed, mapper },
111
- } = plugin
112
- const driver = usePluginDriver()
113
- const oas = useOas()
114
- const imports = getImports(schema.tree)
115
-
116
- const faker = {
117
- name: getName(schema.name, { type: 'function' }),
118
- file: getFile(schema.name),
119
- }
120
-
121
- const type = {
122
- name: getName(schema.name, { type: 'type', pluginName: pluginTsName }),
123
- file: getFile(schema.name, { pluginName: pluginTsName }),
124
- }
125
-
126
- const canOverride = schema.tree.some(
127
- ({ keyword }) =>
128
- keyword === schemaKeywords.array ||
129
- keyword === schemaKeywords.and ||
130
- keyword === schemaKeywords.object ||
131
- keyword === schemaKeywords.union ||
132
- keyword === schemaKeywords.tuple ||
133
- keyword === schemaKeywords.ref ||
134
- keyword === schemaKeywords.enum ||
135
- keyword === schemaKeywords.string ||
136
- keyword === schemaKeywords.integer ||
137
- keyword === schemaKeywords.number,
138
- )
139
-
140
- return (
141
- <File
142
- baseName={faker.file.baseName}
143
- path={faker.file.path}
144
- meta={faker.file.meta}
145
- banner={getBanner({ oas, output, config: driver.config })}
146
- footer={getFooter({ oas, output })}
147
- >
148
- <File.Import name={['faker']} path="@faker-js/faker" />
149
- {regexGenerator === 'randexp' && <File.Import name={'RandExp'} path={'randexp'} />}
150
- {dateParser !== 'faker' && <File.Import path={dateParser} name={dateParser} />}
151
- <File.Import isTypeOnly root={faker.file.path} path={type.file.path} name={[type.name]} />
152
- {imports.map((imp) => (
153
- <File.Import key={[imp.path, imp.name, imp.isTypeOnly].join('-')} root={faker.file.path} path={imp.path} name={imp.name} />
154
- ))}
155
-
156
- <Faker
157
- name={faker.name}
158
- typeName={type.name}
159
- description={schema.value.description}
160
- tree={schema.tree}
161
- regexGenerator={regexGenerator}
162
- dateParser={dateParser}
163
- mapper={mapper}
164
- seed={seed}
165
- canOverride={canOverride}
166
- />
237
+ {paramEntries.map(({ param, name, typeName }) =>
238
+ renderEntry({
239
+ schema: param.schema,
240
+ name,
241
+ typeName,
242
+ }),
243
+ )}
244
+ {responseEntries.map(({ response, name, typeName }) =>
245
+ renderEntry({
246
+ schema: response.schema,
247
+ name,
248
+ typeName,
249
+ description: response.description,
250
+ }),
251
+ )}
252
+ {dataEntry
253
+ ? renderEntry({
254
+ schema: dataEntry.schema,
255
+ name: dataEntry.name,
256
+ typeName: dataEntry.typeName,
257
+ description: dataEntry.description,
258
+ })
259
+ : null}
260
+ {renderEntry({
261
+ schema: buildResponseUnionSchema(node, resolver),
262
+ name: responseName,
263
+ typeName: tsResolver.resolveResponseName(node),
264
+ skipImportNames: responseEntries.map(({ name }) => name),
265
+ })}
167
266
  </File>
168
267
  )
169
268
  },
package/src/index.ts CHANGED
@@ -1,2 +1,7 @@
1
- export { pluginFaker, pluginFakerName } from './plugin.ts'
2
- export type { PluginFaker } from './types.ts'
1
+ export { Faker } from './components/Faker.tsx'
2
+ export { fakerGenerator } from './generators/fakerGenerator.tsx'
3
+ export { default, pluginFaker, pluginFakerName } from './plugin.ts'
4
+ export type { PrinterFakerFactory, PrinterFakerNodes, PrinterFakerOptions } from './printers/printerFaker.ts'
5
+ export { printerFaker } from './printers/printerFaker.ts'
6
+ export { resolverFaker } from './resolvers/resolverFaker.ts'
7
+ export type { PluginFaker, ResolverFaker } from './types.ts'