@kubb/plugin-faker 5.0.0-beta.56 → 5.0.0-beta.64

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 (37) hide show
  1. package/dist/{Faker-A5UuxwJj.d.ts → Faker-BA4l8DTe.d.ts} +2 -2
  2. package/dist/{Faker-CHh0JtBG.js → Faker-DUx7jvCo.js} +8 -11
  3. package/dist/Faker-DUx7jvCo.js.map +1 -0
  4. package/dist/{Faker-CcGjn5ZM.cjs → Faker-Ds2xP2-k.cjs} +7 -10
  5. package/dist/Faker-Ds2xP2-k.cjs.map +1 -0
  6. package/dist/components.cjs +1 -1
  7. package/dist/components.d.ts +1 -1
  8. package/dist/components.js +1 -1
  9. package/dist/{fakerGenerator-KKVr-CA2.d.ts → fakerGenerator-BNysC6rh.d.ts} +2 -2
  10. package/dist/{fakerGenerator-DrwGWYwv.cjs → fakerGenerator-BeKRKYuy.cjs} +11 -11
  11. package/dist/fakerGenerator-BeKRKYuy.cjs.map +1 -0
  12. package/dist/{fakerGenerator-DDNsdbH2.js → fakerGenerator-D5Bcy5WY.js} +12 -12
  13. package/dist/fakerGenerator-D5Bcy5WY.js.map +1 -0
  14. package/dist/generators.cjs +1 -1
  15. package/dist/generators.d.ts +1 -1
  16. package/dist/generators.js +1 -1
  17. package/dist/index.cjs +4 -4
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.ts +3 -3
  20. package/dist/index.js +4 -4
  21. package/dist/index.js.map +1 -1
  22. package/dist/{printerFaker-CMCJT3FB.d.ts → printerFaker-BzEB43Jz.d.ts} +3 -3
  23. package/package.json +6 -7
  24. package/dist/Faker-CHh0JtBG.js.map +0 -1
  25. package/dist/Faker-CcGjn5ZM.cjs.map +0 -1
  26. package/dist/fakerGenerator-DDNsdbH2.js.map +0 -1
  27. package/dist/fakerGenerator-DrwGWYwv.cjs.map +0 -1
  28. package/src/components/Faker.tsx +0 -139
  29. package/src/components/index.ts +0 -1
  30. package/src/generators/fakerGenerator.tsx +0 -307
  31. package/src/generators/index.ts +0 -1
  32. package/src/index.ts +0 -7
  33. package/src/plugin.ts +0 -92
  34. package/src/printers/printerFaker.ts +0 -403
  35. package/src/resolvers/resolverFaker.ts +0 -84
  36. package/src/types.ts +0 -181
  37. package/src/utils.ts +0 -257
@@ -1,307 +0,0 @@
1
- import { getPerContentTypeName, resolveContentTypeVariants } from '@internals/shared'
2
- import { aliasConflictingImports, filterUsedImports, rewriteAliasedImports } from '@internals/utils'
3
- import { ast, defineGenerator } from '@kubb/core'
4
- import { pluginTsName } from '@kubb/plugin-ts'
5
- import { File, jsxRenderer } from '@kubb/renderer-jsx'
6
- import { Faker } from '../components/Faker.tsx'
7
- import { printerFaker } from '../printers/printerFaker.ts'
8
- import type { PluginFaker } from '../types.ts'
9
- import { buildResponseUnionSchema, canOverrideSchema, localeToFakerImport, resolveParamNameByLocation, resolveTypeReference } from '../utils.ts'
10
-
11
- /**
12
- * Built-in generator for `@kubb/plugin-faker`. Emits one `createX` factory
13
- * per schema in the spec plus per-operation request/response factories. Each
14
- * factory returns a value matching the corresponding TypeScript type from
15
- * `@kubb/plugin-ts`.
16
- */
17
- export const fakerGenerator = defineGenerator<PluginFaker>({
18
- name: 'faker',
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)
24
-
25
- if (!node.name || !pluginTs) {
26
- return
27
- }
28
-
29
- const tsResolver = ctx.driver.getResolver(pluginTsName)
30
-
31
- const schemaName = node.name
32
- const isEnumSchema = !!ast.narrowSchema(node, ast.schemaTypes.enum)
33
- const tsEnumType = pluginTs.options?.enum?.type
34
- const tsEnumTypeSuffix = pluginTs.options?.enum?.typeSuffix ?? 'Key'
35
- const schemaTypeName =
36
- isEnumSchema && tsEnumType === 'asConst' ? tsResolver.resolveEnumKeyName({ name: schemaName }, tsEnumTypeSuffix) : tsResolver.resolveTypeName(schemaName)
37
- const meta = {
38
- name: resolver.resolveName(schemaName),
39
- file: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group: group ?? undefined }),
40
- typeName: schemaTypeName,
41
- typeFile: tsResolver.resolveFile(
42
- { name: schemaName, extname: '.ts' },
43
- { root, output: pluginTs.options?.output ?? output, group: pluginTs.options?.group ?? undefined },
44
- ),
45
- } as const
46
- const canOverride = canOverrideSchema(node)
47
- const cyclicSchemas = new Set<string>(ctx.meta.circularNames)
48
- const printerInstance = printerFaker({
49
- resolver,
50
- schemaName,
51
- typeName: meta.typeName,
52
- dateParser,
53
- regexGenerator,
54
- mapper,
55
- nodes: printer?.nodes,
56
- cyclicSchemas,
57
- })
58
- const fakerText = printerInstance.print(node) ?? 'undefined'
59
- const typeReference = resolveTypeReference({
60
- node,
61
- canOverride,
62
- name: meta.name,
63
- typeName: meta.typeName,
64
- filePath: meta.file.path,
65
- typeFilePath: meta.typeFile.path,
66
- })
67
-
68
- const imports = adapter.getImports(node, (schemaName) => ({
69
- name: resolver.resolveName(schemaName),
70
- path: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group: group ?? undefined }).path,
71
- }))
72
- const usedImports = filterUsedImports(imports, fakerText)
73
-
74
- return (
75
- <File
76
- baseName={meta.file.baseName}
77
- path={meta.file.path}
78
- meta={meta.file.meta}
79
- banner={resolver.resolveBanner(ctx.meta, { output, config, file: { path: meta.file.path, baseName: meta.file.baseName } })}
80
- footer={resolver.resolveFooter(ctx.meta, { output, config, file: { path: meta.file.path, baseName: meta.file.baseName } })}
81
- >
82
- <File.Import name={locale ? [{ propertyName: localeToFakerImport(locale), name: 'faker' }] : ['faker']} path="@faker-js/faker" />
83
- {regexGenerator === 'randexp' && <File.Import name={'RandExp'} path={'randexp'} />}
84
- {dateParser !== 'faker' && <File.Import path={dateParser} name={dateParser} />}
85
- {typeReference.importPath && <File.Import isTypeOnly root={meta.file.path} path={typeReference.importPath} name={[meta.typeName]} />}
86
- {usedImports.map((imp) => (
87
- <File.Import key={[schemaName, imp.path, imp.name].join('-')} root={meta.file.path} path={imp.path} name={imp.name} />
88
- ))}
89
- <Faker
90
- name={meta.name}
91
- typeName={typeReference.typeName}
92
- description={node.description}
93
- node={node}
94
- printer={printerInstance}
95
- seed={seed}
96
- canOverride={canOverride}
97
- />
98
- </File>
99
- )
100
- },
101
- operation(node, ctx) {
102
- const { adapter, config, resolver, root } = ctx
103
- const { output, group, paramsCasing, dateParser, regexGenerator, mapper, seed, locale, printer } = ctx.options
104
- const pluginTs = ctx.driver.getPlugin(pluginTsName)
105
-
106
- if (!pluginTs) {
107
- return
108
- }
109
-
110
- const tsResolver = ctx.driver.getResolver(pluginTsName)
111
-
112
- const params = ast.caseParams(node.parameters, paramsCasing)
113
- const paramEntries = params.map((param) => ({
114
- param,
115
- name: resolveParamNameByLocation(resolver, node, param),
116
- typeName: resolveParamNameByLocation(tsResolver, node, param),
117
- }))
118
- type RenderUnit = { schema: ast.SchemaNode | null; name: string; typeName: string; description?: string; skipImportNames: Array<string> }
119
-
120
- // Expands a content array into render units: one faker per content type plus a union faker
121
- // (named `baseName`) when more than one content type carries a schema, else a single faker.
122
- function expandContentUnits(
123
- entries: Array<{ contentType: string; schema?: ast.SchemaNode | null }>,
124
- baseName: string,
125
- tsBaseName: string,
126
- description: string | undefined,
127
- decorate?: (schema: ast.SchemaNode) => ast.SchemaNode,
128
- ): Array<RenderUnit> {
129
- const withSchema = entries.filter((entry) => entry.schema)
130
- if (withSchema.length <= 1) {
131
- const primary = withSchema[0] ?? entries[0]
132
- if (!primary?.schema) return []
133
- return [{ schema: decorate ? decorate(primary.schema) : primary.schema, name: baseName, typeName: tsBaseName, description, skipImportNames: [] }]
134
- }
135
- const variants = resolveContentTypeVariants(entries, baseName)
136
- const unionSchema = ast.createSchema({ type: 'union', members: variants.map((variant) => ast.createSchema({ type: 'ref', name: variant.name })) })
137
- return [
138
- ...variants.map((variant) => ({
139
- schema: decorate ? decorate(variant.schema) : variant.schema,
140
- name: variant.name,
141
- typeName: getPerContentTypeName(tsBaseName, variant.suffix),
142
- description,
143
- skipImportNames: [],
144
- })),
145
- { schema: unionSchema, name: baseName, typeName: tsBaseName, description, skipImportNames: variants.map((variant) => variant.name) },
146
- ]
147
- }
148
-
149
- const responseUnits = node.responses.flatMap((response) =>
150
- expandContentUnits(
151
- response.content ?? [],
152
- resolver.resolveResponseStatusName(node, response.statusCode),
153
- tsResolver.resolveResponseStatusName(node, response.statusCode),
154
- response.description,
155
- ),
156
- )
157
- const dataUnits = expandContentUnits(
158
- node.requestBody?.content ?? [],
159
- resolver.resolveDataName(node),
160
- tsResolver.resolveDataName(node),
161
- node.requestBody?.description,
162
- (schema) => ({ ...schema, description: node.requestBody?.description ?? schema.description }),
163
- )
164
- const responseName = resolver.resolveResponseName(node)
165
- const localHelperNames = new Set([
166
- ...paramEntries.map((entry) => entry.name),
167
- ...responseUnits.map((unit) => unit.name),
168
- ...dataUnits.map((unit) => unit.name),
169
- responseName,
170
- ])
171
- const cyclicSchemas = new Set<string>(ctx.meta.circularNames)
172
-
173
- const meta = {
174
- file: resolver.resolveFile(
175
- { name: node.operationId, extname: '.ts', tag: node.tags[0] ?? 'default', path: node.path },
176
- { root, output, group: group ?? undefined },
177
- ),
178
- typeFile: tsResolver.resolveFile(
179
- {
180
- name: node.operationId,
181
- extname: '.ts',
182
- tag: node.tags[0] ?? 'default',
183
- path: node.path,
184
- },
185
- {
186
- root,
187
- output: pluginTs.options?.output ?? output,
188
- group: pluginTs.options?.group ?? undefined,
189
- },
190
- ),
191
- } as const
192
-
193
- function resolveMockImports(schema: ast.SchemaNode) {
194
- return adapter
195
- .getImports(schema, (schemaName) => ({
196
- name: resolver.resolveName(schemaName),
197
- path: resolver.resolveFile({ name: schemaName, extname: '.ts' }, { root, output, group: group ?? undefined }).path,
198
- }))
199
- .filter((entry) => entry.path !== meta.file.path)
200
- }
201
-
202
- function renderEntry({
203
- schema,
204
- name,
205
- typeName,
206
- description,
207
- skipImportNames = [],
208
- }: {
209
- schema: ast.SchemaNode | null
210
- name: string
211
- typeName: string
212
- description?: string
213
- skipImportNames?: Array<string>
214
- }) {
215
- if (!schema) {
216
- return null
217
- }
218
-
219
- const canOverride = canOverrideSchema(schema)
220
- const printerInstance = printerFaker({
221
- resolver,
222
- schemaName: name,
223
- typeName,
224
- dateParser,
225
- regexGenerator,
226
- mapper,
227
- nodes: printer?.nodes,
228
- cyclicSchemas,
229
- })
230
- const fakerText = printerInstance.print(schema) ?? 'undefined'
231
- const usedImports = filterUsedImports(resolveMockImports(schema), fakerText, skipImportNames)
232
- const { imports, aliases } = aliasConflictingImports(usedImports, localHelperNames)
233
- const rewrittenFakerText = rewriteAliasedImports(fakerText, aliases)
234
- const typeReference = resolveTypeReference({
235
- node: schema,
236
- canOverride,
237
- name,
238
- typeName,
239
- filePath: meta.file.path,
240
- typeFilePath: meta.typeFile.path,
241
- })
242
-
243
- return (
244
- <>
245
- {typeReference.importPath && <File.Import isTypeOnly root={meta.file.path} path={typeReference.importPath} name={[typeName]} />}
246
- {imports.map((imp) => (
247
- <File.Import key={[name, imp.path, imp.name].join('-')} root={meta.file.path} path={imp.path} name={imp.name} />
248
- ))}
249
- <Faker
250
- name={name}
251
- typeName={typeReference.typeName}
252
- description={description}
253
- node={schema}
254
- printer={{ ...printerInstance, print: () => rewrittenFakerText }}
255
- seed={seed}
256
- canOverride={canOverride}
257
- />
258
- </>
259
- )
260
- }
261
-
262
- return (
263
- <File
264
- baseName={meta.file.baseName}
265
- path={meta.file.path}
266
- meta={meta.file.meta}
267
- banner={resolver.resolveBanner(ctx.meta, { output, config, file: { path: meta.file.path, baseName: meta.file.baseName } })}
268
- footer={resolver.resolveFooter(ctx.meta, { output, config, file: { path: meta.file.path, baseName: meta.file.baseName } })}
269
- >
270
- <File.Import name={locale ? [{ propertyName: localeToFakerImport(locale), name: 'faker' }] : ['faker']} path="@faker-js/faker" />
271
- {regexGenerator === 'randexp' && <File.Import name={'RandExp'} path={'randexp'} />}
272
- {dateParser !== 'faker' && <File.Import path={dateParser} name={dateParser} />}
273
- {paramEntries.map(({ param, name, typeName }) =>
274
- renderEntry({
275
- schema: param.schema,
276
- name,
277
- typeName,
278
- }),
279
- )}
280
- {responseUnits.map((unit) =>
281
- renderEntry({
282
- schema: unit.schema,
283
- name: unit.name,
284
- typeName: unit.typeName,
285
- description: unit.description,
286
- skipImportNames: unit.skipImportNames,
287
- }),
288
- )}
289
- {dataUnits.map((unit) =>
290
- renderEntry({
291
- schema: unit.schema,
292
- name: unit.name,
293
- typeName: unit.typeName,
294
- description: unit.description,
295
- skipImportNames: unit.skipImportNames,
296
- }),
297
- )}
298
- {renderEntry({
299
- schema: buildResponseUnionSchema(node, resolver),
300
- name: responseName,
301
- typeName: tsResolver.resolveResponseName(node),
302
- skipImportNames: responseUnits.map((unit) => unit.name),
303
- })}
304
- </File>
305
- )
306
- },
307
- })
@@ -1 +0,0 @@
1
- export { fakerGenerator } from './fakerGenerator.tsx'
package/src/index.ts DELETED
@@ -1,7 +0,0 @@
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'
package/src/plugin.ts DELETED
@@ -1,92 +0,0 @@
1
- import { createGroupConfig } from '@internals/shared'
2
- import { definePlugin } from '@kubb/core'
3
- import { pluginTsName } from '@kubb/plugin-ts'
4
- import { fakerGenerator } from './generators/fakerGenerator.tsx'
5
- import { resolverFaker } from './resolvers/resolverFaker.ts'
6
- import type { PluginFaker } from './types.ts'
7
-
8
- /**
9
- * Canonical plugin name for `@kubb/plugin-faker`. Used for driver lookups and
10
- * cross-plugin dependency references.
11
- */
12
- export const pluginFakerName = 'plugin-faker' satisfies PluginFaker['name']
13
-
14
- /**
15
- * Generates one mock-data factory per OpenAPI schema using Faker.js. Call
16
- * `createPet()` to get a realistic `Pet` object. Useful for tests, Storybook,
17
- * and local development without a running backend.
18
- *
19
- * @example
20
- * ```ts
21
- * import { defineConfig } from 'kubb'
22
- * import { pluginTs } from '@kubb/plugin-ts'
23
- * import { pluginFaker } from '@kubb/plugin-faker'
24
- *
25
- * export default defineConfig({
26
- * input: { path: './petStore.yaml' },
27
- * output: { path: './src/gen' },
28
- * plugins: [
29
- * pluginTs(),
30
- * pluginFaker({
31
- * output: { path: './mocks' },
32
- * seed: [100],
33
- * }),
34
- * ],
35
- * })
36
- * ```
37
- */
38
- export const pluginFaker = definePlugin<PluginFaker>((options) => {
39
- const {
40
- output = { path: 'mocks', barrel: { type: 'named' } },
41
- seed,
42
- locale = 'en',
43
- group,
44
- exclude = [],
45
- include,
46
- override = [],
47
- mapper = {},
48
- dateParser = 'faker',
49
- generators: userGenerators = [],
50
- regexGenerator = 'faker',
51
- paramsCasing,
52
- printer,
53
- resolver: userResolver,
54
- transformer: userTransformer,
55
- } = options
56
-
57
- const groupConfig = createGroupConfig(group)
58
-
59
- return {
60
- name: pluginFakerName,
61
- options,
62
- dependencies: [pluginTsName],
63
- hooks: {
64
- 'kubb:plugin:setup'(ctx) {
65
- ctx.setOptions({
66
- output,
67
- seed,
68
- locale,
69
- exclude,
70
- include,
71
- override,
72
- group: groupConfig,
73
- mapper,
74
- dateParser,
75
- regexGenerator,
76
- paramsCasing,
77
- printer,
78
- })
79
- ctx.setResolver(userResolver ? { ...resolverFaker, ...userResolver } : resolverFaker)
80
- if (userTransformer) {
81
- ctx.setTransformer(userTransformer)
82
- }
83
- ctx.addGenerator(fakerGenerator)
84
- for (const generator of userGenerators) {
85
- ctx.addGenerator(generator)
86
- }
87
- },
88
- },
89
- }
90
- })
91
-
92
- export default pluginFaker