mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-03-11 17:46:41 -05:00
Move faker plugin from external to bundled
This commit is contained in:
76
plugins/template-function-faker/README.md
Normal file
76
plugins/template-function-faker/README.md
Normal file
@@ -0,0 +1,76 @@
|
||||
# Yaak Faker Plugin
|
||||
|
||||
This is a template function that generates realistic fake data
|
||||
for testing and development using [FakerJS](https://fakerjs.dev).
|
||||
|
||||

|
||||
|
||||
## Example JSON Body
|
||||
|
||||
Here's an example JSON body that uses fake data:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "${[ faker.string.uuid() ]}",
|
||||
"name": "${[ faker.person.fullName() ]}",
|
||||
"email": "${[ faker.internet.email() ]}",
|
||||
"phone": "${[ faker.phone.number() ]}",
|
||||
"address": {
|
||||
"street": "${[ faker.location.streetAddress() ]}",
|
||||
"city": "${[ faker.location.city() ]}",
|
||||
"country": "${[ faker.location.country() ]}",
|
||||
"zipCode": "${[ faker.location.zipCode() ]}"
|
||||
},
|
||||
"company": "${[ faker.company.name() ]}",
|
||||
"website": "${[ faker.internet.url() ]}"
|
||||
}
|
||||
```
|
||||
|
||||
This will generate a random JSON body on every request:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "589f0aec-7310-4bf2-81c4-0b1bb7f1c3c1",
|
||||
"name": "Lucy Gottlieb-Weissnat",
|
||||
"email": "Destiny_Herzog@gmail.com",
|
||||
"phone": "411.805.2871 x699",
|
||||
"address": {
|
||||
"street": "846 Christ Mills",
|
||||
"city": "Spencerfurt",
|
||||
"country": "United Kingdom",
|
||||
"zipCode": "20354"
|
||||
},
|
||||
"company": "Emard, Kohler and Rutherford",
|
||||
"website": "https://watery-detective.org"
|
||||
}
|
||||
```
|
||||
|
||||
## Available Categories
|
||||
|
||||
The plugin provides access to all FakerJS modules and their methods:
|
||||
|
||||
| Category | Description | Example Methods |
|
||||
|------------|---------------------------|--------------------------------------------|
|
||||
| `airline` | Airline-related data | `aircraftType`, `airline`, `airplane` |
|
||||
| `animal` | Animal names and types | `bear`, `bird`, `cat`, `dog`, `fish` |
|
||||
| `color` | Colors in various formats | `human`, `rgb`, `hex`, `hsl` |
|
||||
| `commerce` | E-commerce data | `department`, `product`, `price` |
|
||||
| `company` | Company information | `name`, `catchPhrase`, `bs` |
|
||||
| `database` | Database-related data | `column`, `type`, `collation` |
|
||||
| `date` | Date and time values | `recent`, `future`, `past`, `between` |
|
||||
| `finance` | Financial data | `account`, `amount`, `currency` |
|
||||
| `git` | Git-related data | `branch`, `commitEntry`, `commitSha` |
|
||||
| `hacker` | Tech/hacker terminology | `abbreviation`, `noun`, `phrase` |
|
||||
| `image` | Image URLs and data | `avatar`, `url`, `dataUri` |
|
||||
| `internet` | Internet-related data | `email`, `url`, `ip`, `userAgent` |
|
||||
| `location` | Geographic data | `city`, `country`, `latitude`, `longitude` |
|
||||
| `lorem` | Lorem ipsum text | `word`, `sentence`, `paragraph` |
|
||||
| `person` | Personal information | `firstName`, `lastName`, `fullName` |
|
||||
| `music` | Music-related data | `genre`, `songName`, `artist` |
|
||||
| `number` | Numeric data | `int`, `float`, `binary`, `hex` |
|
||||
| `phone` | Phone numbers | `number`, `imei` |
|
||||
| `science` | Scientific data | `chemicalElement`, `unit` |
|
||||
| `string` | String utilities | `uuid`, `alpha`, `alphanumeric` |
|
||||
| `system` | System-related data | `fileName`, `mimeType`, `fileExt` |
|
||||
| `vehicle` | Vehicle information | `vehicle`, `manufacturer`, `model` |
|
||||
| `word` | Word generation | `adjective`, `adverb`, `conjunction` |
|
||||
24
plugins/template-function-faker/package.json
Executable file
24
plugins/template-function-faker/package.json
Executable file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name": "@yaak/faker",
|
||||
"private": true,
|
||||
"version": "1.1.1",
|
||||
"displayName": "Faker",
|
||||
"description": "Template functions for generating fake data using FakerJS",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/mountain-loop/yaak.git",
|
||||
"directory": "plugins/template-function-faker"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "yaakcli build",
|
||||
"dev": "yaakcli dev",
|
||||
"test": "vitest --run tests"
|
||||
},
|
||||
"dependencies": {
|
||||
"@faker-js/faker": "^10.1.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^25.0.3",
|
||||
"typescript": "^5.9.3"
|
||||
}
|
||||
}
|
||||
105
plugins/template-function-faker/src/index.ts
Executable file
105
plugins/template-function-faker/src/index.ts
Executable file
@@ -0,0 +1,105 @@
|
||||
import { faker } from '@faker-js/faker';
|
||||
import type { DynamicTemplateFunctionArg, PluginDefinition } from '@yaakapp/api';
|
||||
|
||||
const modules = [
|
||||
'airline',
|
||||
'animal',
|
||||
'color',
|
||||
'commerce',
|
||||
'company',
|
||||
'database',
|
||||
'date',
|
||||
'finance',
|
||||
'git',
|
||||
'hacker',
|
||||
'image',
|
||||
'internet',
|
||||
'location',
|
||||
'lorem',
|
||||
'person',
|
||||
'music',
|
||||
'number',
|
||||
'phone',
|
||||
'science',
|
||||
'string',
|
||||
'system',
|
||||
'vehicle',
|
||||
'word',
|
||||
];
|
||||
|
||||
function normalizeResult(result: unknown): string {
|
||||
if (typeof result === 'string') return result;
|
||||
return JSON.stringify(result);
|
||||
}
|
||||
|
||||
// Whatever Yaak’s arg type shape is – rough example
|
||||
function args(modName: string, fnName: string): DynamicTemplateFunctionArg[] {
|
||||
return [
|
||||
{
|
||||
type: 'banner',
|
||||
color: 'info',
|
||||
inputs: [
|
||||
{
|
||||
type: 'markdown',
|
||||
content: `Need help? View documentation for [\`${modName}.${fnName}(…)\`](https://fakerjs.dev/api/${encodeURIComponent(modName)}.html#${encodeURIComponent(fnName)})`,
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: 'options',
|
||||
label: 'Arguments',
|
||||
type: 'editor',
|
||||
language: 'json',
|
||||
optional: true,
|
||||
placeholder: 'e.g. { "min": 1, "max": 10 } or 10 or ["en","US"]',
|
||||
},
|
||||
];
|
||||
}
|
||||
|
||||
export const plugin: PluginDefinition = {
|
||||
templateFunctions: modules.flatMap((modName) => {
|
||||
const mod = faker[modName as keyof typeof faker];
|
||||
return Object.keys(mod)
|
||||
.filter((n) => n !== 'faker')
|
||||
.map((fnName) => ({
|
||||
name: ['faker', modName, fnName].join('.'),
|
||||
args: args(modName, fnName),
|
||||
async onRender(_ctx, args) {
|
||||
const fn = mod[fnName as keyof typeof mod] as (...a: unknown[]) => unknown;
|
||||
const options = args.values.options;
|
||||
|
||||
// No options supplied
|
||||
if (options == null || options === '') {
|
||||
return normalizeResult(fn());
|
||||
}
|
||||
|
||||
// Try JSON first
|
||||
let parsed: unknown = options;
|
||||
if (typeof options === 'string') {
|
||||
try {
|
||||
parsed = JSON.parse(options);
|
||||
} catch {
|
||||
// Not valid JSON – maybe just a scalar
|
||||
const n = Number(options);
|
||||
if (!Number.isNaN(n)) {
|
||||
parsed = n;
|
||||
} else {
|
||||
parsed = options;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let result: unknown;
|
||||
if (Array.isArray(parsed)) {
|
||||
// Treat as positional arguments
|
||||
result = fn(...parsed);
|
||||
} else {
|
||||
// Treat as a single argument (option object or scalar)
|
||||
result = fn(parsed);
|
||||
}
|
||||
|
||||
return normalizeResult(result);
|
||||
},
|
||||
}));
|
||||
}),
|
||||
};
|
||||
9
plugins/template-function-faker/tests/init.test.ts
Normal file
9
plugins/template-function-faker/tests/init.test.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
describe('formatDatetime', () => {
|
||||
it('returns formatted current date', async () => {
|
||||
// Ensure the plugin imports properly
|
||||
const faker = await import('../src/index');
|
||||
expect(faker.plugin.templateFunctions?.length).toBe(226);
|
||||
});
|
||||
});
|
||||
3
plugins/template-function-faker/tsconfig.json
Executable file
3
plugins/template-function-faker/tsconfig.json
Executable file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"extends": "../../tsconfig.json"
|
||||
}
|
||||
Reference in New Issue
Block a user