Skip to content

FizzyElt/fakerator

Repository files navigation

假資料結構產生器

Wrapping fakerjs Functions

  • Airline
  • Animal
  • Color
  • Commerce
  • Company
  • Database
  • Datatype
  • Date(Datetime)
  • Finance
  • Food
  • Git
  • Hacker
  • Image
  • Internet
  • Location
  • Lorem
  • Music
  • Number
  • Person
  • Phone
  • Science
  • String
  • System
  • Vehicle

用途

使用 faker js 時是單一純值不能產生結構,需要自己手動組合結構,此專案利用撰寫設定檔的方式來產生一個特定的假資料函數,減少手動組合結構的麻煩。

import { StructConfig } from 'struct-fakerator'

const scheme = StructConfig.object({
  name: StructConfig.value(() => 'hello'),
  enum: StructConfig.select([1, 2, 3]),
  list: StructConfig.array(StructConfig.value(() => 10), 5),
  tuple: StructConfig.tuple([StructConfig.value(() => 'tuple1'), StructConfig.value(() => '100')])
})

// or
import {
  createObjectConfig,
  createArrayConfig,
  createValueConfig,
  createTupleConfig,
  createSelectionConfig
} from 'struct-fakerator';


const scheme = createObjectConfig({
  name: createValueConfig(() => 'hello'),
  enum: createSelectionConfig([1, 2, 3]),
  list: createArrayConfig(
    createValueConfig(() => 10),
    5
  ),
  tuple: createTupleConfig([
    createValueConfig(() => 'tuple1'),
    createValueConfig(() => 100),
    createValueConfig(() => false),
  ])
});

// or
const scheme = {
  type: 'obj',
  content: {
    name: {
      type: 'value',
      generateFn: () => 'hello',
    },
    enum: {
      type: 'select',
      items: [1, 2, 3],
    },
    list: {
      type: 'arr',
      item: {
        type: 'value',
        generateFn: () => 10,
      },
      len: 5,
    },
    tuple: {
      type: 'tuple',
      configItems: [
        {
          type: 'value',
          generateFn: () => 'tuple1',
        },
        {
          type: 'value',
          generateFn: () => 100,
        },
        {
          type: 'value',
          generateFn: () => false,
        },
      ],
    },
  },
};
import { StructGenerator } from 'struct-fakerator';

const result = StructGenerator.genFn(scheme)()

console.log(result);
// {
//   name: 'hello',
//   enum: 1, // or 2 or 3
//   list: [10, 10, 10, 10, 10],
//   tuple: ['tuple1', 100, false]
// }

Value

const generateFn = StructGenerator.genFn(StructConfig.value(() => 10));

console.log(generateFn());
// 10

Selection

const generateFn = StructGenerator.genFn(StructConfig.select([1, 2, 3, 4, 5]))

console.log(generateFn());
// 1 or 2 or 3 or 4 or 5

Object

const generateFn = StructGenerator.genFn(StructConfig.object({
  name: StructConfig.value(() => 'hello'),
  list: StructConfig.array(StructConfig.value(() => 10), 5),
}));

console.log(generateFn());
// {
//   name: 'hello',
//   list: [10, 10, 10, 10, 10]
// }

// with transformer function
const generateFn = StructGenerator.genFn(
  StructConfig.object(
    {
      name: StructConfig.value(() => 'hello'),
      list: StructConfig.array(
        StructConfig.value(() => 10),
        5
      ),
    },
    ({ name, list }) => list.map((item) => `${name} ${item}`)
  )
);

console.log(generateFn());
// ["hello 10", "hello 10", "hello 10", "hello 10", "hello 10"]

Array

const generateFn = StructGenerator.genFn(
  StructConfig.array(
    StructConfig.value(() => 10),
    5
  )
);

console.log(generateFn());
// [10, 10, 10, 10, 10]

// with next function
const generateFn = StructGenerator.genFn(
  StructConfig.array(
    StructConfig.value(() => 10),
    5,
    (prev, current) => prev + 1 + current
  )
);

console.log(generateFn());
// [21, 32, 43, 54, 65]

Tuple

const generateFn = StructGenerator.genFn(
  StructConfig.tuple([
    StructConfig.value(() => 'tuple1'),
    StructConfig.value(() => 100),
    StructConfig.value(() => false),
  ])
);

console.log(generateFn());
// ['tuple1', 100, false]

BoundedSeries

const generateFn = StructGenerator.genFn(
  StructConfig.boundedSeries({
    upperLimit: 1.1,
    lowerLimit: 0.9,
    createInitValue: () => 100,
    count: 20,
  })
);

console.log(generateFn());
// [100 * 0.9 <= num <= 100 * 1.1, 
//  prev * 0.9 <= num <= prev * 1.1,
//  prev * 0.9 <= num <= prev * 1.1,
//  ...] 

擴充

一切的值皆由 value 產生,可以自己創建各種不同亂數函數

flowchart TB
 value --> int
 value --> float
 value --> string
 value --> email
 value --> other[...]
Loading

但並不是所有人情況都能自己手動建立函數,有可能是開放給別人使用的服務,沒辦法在使用方建立函數,這時 createGeneratorByType 第二個可以讓製作服務的人帶入自己的擴充,這樣這個函數就能接受更多種型態。

const createIntValueConfig = (option) => createValueConfig(() => faker.number.int(option));
const createEmailValueConfig = (option) => createValueConfig(() => faker.internet.email(option));

const customTypeMatch = (config) => {
  if (config.type === "int") {
    return createIntValueConfig(config.option);
  }
  if (config.type === "email") {
    return createEmailValueConfig(config.option);
  }

  throw Error("error");
};

const config = {
  type: "obj",
  content: {
    name: { type: "value", generateFn: () => "John" },
    age: { type: "int" },
    email: { type: "email" },
  },
};

const result = createGeneratorByType(config, customTypeMatch)();

console.log(result);

/*
  {
    name: "John",
    age: 50,
    email: "xxx@example.com",
  }
*/

Releases

No releases published

Packages

No packages published