From bda6e9d7c2c984b5b33099ef84b912c5fd8dfead Mon Sep 17 00:00:00 2001 From: Hong Weng Date: Thu, 14 Mar 2024 14:11:30 +1300 Subject: [PATCH 1/2] feat:add ipaddress generator --- src/constants/enums.ts | 1 + src/core/generators/IpAddress/IpAddress.tsx | 96 +++++++++++++++++++++ src/core/generators/IpAddress/index.ts | 14 +++ src/core/generators/index.ts | 2 + src/locale/translations/en.ts | 8 ++ src/locale/translations/jaJP.ts | 4 + src/locale/translations/zhCN.ts | 8 ++ 7 files changed, 133 insertions(+) create mode 100644 src/core/generators/IpAddress/IpAddress.tsx create mode 100644 src/core/generators/IpAddress/index.ts diff --git a/src/constants/enums.ts b/src/constants/enums.ts index f5b2bc5..2b1bdaf 100644 --- a/src/constants/enums.ts +++ b/src/constants/enums.ts @@ -43,6 +43,7 @@ export enum DataTypeCategory { } export enum DataType { + IPADDRESS = "ipaddress", URL = "url", DOMAINSUFFIX = "domainsuffix", DOMAINNAME = "domainname", diff --git a/src/core/generators/IpAddress/IpAddress.tsx b/src/core/generators/IpAddress/IpAddress.tsx new file mode 100644 index 0000000..36050d1 --- /dev/null +++ b/src/core/generators/IpAddress/IpAddress.tsx @@ -0,0 +1,96 @@ +import React from "react"; +import {GenerateResult, GeneratorOptionsComponentInterface} from "@/types/generator"; +import {OptionsSelect, SelectOption} from "@/components/Utils"; +import {FormattedMessage} from "@/locale"; +import {faker} from "@faker-js/faker"; +// ------------------------------------------------------------------------------------------------------------- +// types + +export type IpType = + | 'ip' + | 'ip4' + | 'ip6' +export interface IpAddressGeneratorOptions { + type:IpType[] +} + + + +// ------------------------------------------------------------------------------------------------------------- +// default options +export const IpAddressGeneratorDefaultOptions:IpAddressGeneratorOptions = { + type: ['ip', 'ip4', 'ip6'] +} + + + +// ------------------------------------------------------------------------------------------------------------- +// generate method +export const generate = (options: any): GenerateResult => { + + + let ips: string[] = []; + options.type.forEach((type) => { + switch (type) { + case 'ip4': + ips.push(faker.internet.ip()); + break; + case 'ip6': + ips.push(faker.internet.ipv6()); + break; + case 'ip': + ips.push(Math.random() < 0.5 ? faker.internet.ip() : faker.internet.ipv6()); + break; + default: + break; + } + }); + + // Joining the IP addresses with a newline character to ensure each is on its own line + const stringValue = ips.join('\n'); + + return { + value: ips, // This is now an array of IPs, one per selected type + stringValue: stringValue, // IPs separated by newline for display + }; +} + +// ------------------------------------------------------------------------------------------------------------- +// options component +export const IpAddressGeneratorOptionsComponent: React.FunctionComponent = ({...props}) => { + const {options, handleOptionValueChange} = props as { + options: IpAddressGeneratorOptions, + handleOptionValueChange: typeof props.handleOptionValueChange + }; + + // TODO: implement your own options component here + return ( +
+ } + selectOptions={IpTypeSelectOptions} + value={options.type} + onChange={(v) => handleOptionValueChange("type", v)} + style={{width: '200px'}} + /> +
+ ); +} + + +export const IpTypeSelectOptions: SelectOption[] = [ + { + label: , + value: "ip", + }, + { + label: , + value: "ip4" + }, + { + label: , + value: "ip6" + } +] \ No newline at end of file diff --git a/src/core/generators/IpAddress/index.ts b/src/core/generators/IpAddress/index.ts new file mode 100644 index 0000000..01e77c6 --- /dev/null +++ b/src/core/generators/IpAddress/index.ts @@ -0,0 +1,14 @@ +import {Generator} from "@/types/generator"; +import {DataType, DataTypeCategory, ValueType} from "@/constants/enums"; +import {IpAddressGeneratorDefaultOptions, IpAddressGeneratorOptionsComponent, generate} from "./IpAddress"; + +export const IpAddressGenerator: Generator = { + type: DataType.IPADDRESS, + category: DataTypeCategory.NETWORK, + generate: generate, + optionsComponent: IpAddressGeneratorOptionsComponent, + defaultOptions: IpAddressGeneratorDefaultOptions, + defaultValueType: ValueType.STRING, + exampleLines: ["245.108.222.0", "64.239.253.171", "246.18.59.18"] +} + \ No newline at end of file diff --git a/src/core/generators/index.ts b/src/core/generators/index.ts index 8d6ffd1..6ad7052 100644 --- a/src/core/generators/index.ts +++ b/src/core/generators/index.ts @@ -1,3 +1,4 @@ +import {IpAddressGenerator} from "@/core/generators/IpAddress"; import {UrlGenerator} from "@/core/generators/Url"; import {DomainSuffixGenerator} from "@/core/generators/DomainSuffix"; import {DomainNameGenerator} from "@/core/generators/DomainName"; @@ -19,6 +20,7 @@ import {CompanyNameGenerator} from "@/core/generators/CompanyName"; import {DataType} from "@/constants/enums"; export const generators = { + [DataType.IPADDRESS]: IpAddressGenerator, [DataType.URL]: UrlGenerator, [DataType.DOMAINSUFFIX]: DomainSuffixGenerator, [DataType.DOMAINNAME]: DomainNameGenerator, diff --git a/src/locale/translations/en.ts b/src/locale/translations/en.ts index 3241d1e..2d59750 100644 --- a/src/locale/translations/en.ts +++ b/src/locale/translations/en.ts @@ -80,6 +80,14 @@ export const en = { // data types + + // ipaddress + "dataType.ipaddress": "IpAddress", + "dataType.ipaddress.type":"Type", + "dataType.ipaddress.type.ip": "Ip", + "dataType.ipaddress.type.ip4": "Ip4", + "dataType.ipaddress.type.ip6": "Ip6", + // url "dataType.url": "Url", "dataType.url.appendSlash.label": "Slash", diff --git a/src/locale/translations/jaJP.ts b/src/locale/translations/jaJP.ts index 3653901..f9f524d 100644 --- a/src/locale/translations/jaJP.ts +++ b/src/locale/translations/jaJP.ts @@ -24,6 +24,10 @@ export const jaJP = { // data types + + // ipaddress + "dataType.ipaddress": "IpAddress", + // url "dataType.url": "Url", diff --git a/src/locale/translations/zhCN.ts b/src/locale/translations/zhCN.ts index c252c7c..60d622d 100644 --- a/src/locale/translations/zhCN.ts +++ b/src/locale/translations/zhCN.ts @@ -61,6 +61,14 @@ export const zhCN = { // data types + + // ipaddress + "dataType.ipaddress": "网络地址", + "dataType.ipaddress.type":"类型", + "dataType.ipaddress.type.ip": "Ip", + "dataType.ipaddress.type.ip4": "Ip4", + "dataType.ipaddress.type.ip6": "Ip6", + // url "dataType.url": "网址", "dataType.url.appendSlash.label":"斜线", From 0911e7e51bf3df520fcc2f57a40823deb2a22193 Mon Sep 17 00:00:00 2001 From: Zach Wang Date: Thu, 14 Mar 2024 14:33:19 +1300 Subject: [PATCH 2/2] refactor: ip address generator generation method (#261) Co-Authored-By: Gavin Weng <78581470+hwen554@users.noreply.github.com> --- src/core/generators/IpAddress/IpAddress.tsx | 73 +++++++-------------- src/core/generators/IpAddress/index.ts | 2 +- src/locale/translations/en.ts | 10 +-- src/locale/translations/zhCN.ts | 44 ++++++------- 4 files changed, 47 insertions(+), 82 deletions(-) diff --git a/src/core/generators/IpAddress/IpAddress.tsx b/src/core/generators/IpAddress/IpAddress.tsx index 36050d1..37dc75c 100644 --- a/src/core/generators/IpAddress/IpAddress.tsx +++ b/src/core/generators/IpAddress/IpAddress.tsx @@ -6,52 +6,36 @@ import {faker} from "@faker-js/faker"; // ------------------------------------------------------------------------------------------------------------- // types -export type IpType = - | 'ip' - | 'ip4' - | 'ip6' +export type IpType = 'IPv4' | 'IPv6' + export interface IpAddressGeneratorOptions { - type:IpType[] + types: IpType[] } - // ------------------------------------------------------------------------------------------------------------- // default options -export const IpAddressGeneratorDefaultOptions:IpAddressGeneratorOptions = { - type: ['ip', 'ip4', 'ip6'] +export const IpAddressGeneratorDefaultOptions: IpAddressGeneratorOptions = { + types: ["IPv4", "IPv6"] } - // ------------------------------------------------------------------------------------------------------------- // generate method -export const generate = (options: any): GenerateResult => { - - - let ips: string[] = []; - options.type.forEach((type) => { - switch (type) { - case 'ip4': - ips.push(faker.internet.ip()); - break; - case 'ip6': - ips.push(faker.internet.ipv6()); - break; - case 'ip': - ips.push(Math.random() < 0.5 ? faker.internet.ip() : faker.internet.ipv6()); - break; - default: - break; - } - }); +export const generate = (options: IpAddressGeneratorOptions): GenerateResult => { + let value: string; - // Joining the IP addresses with a newline character to ensure each is on its own line - const stringValue = ips.join('\n'); + if (options.types.length === 2) { + value = faker.internet.ip(); + } else if (options.types.includes("IPv4")) { + value = faker.internet.ipv4(); + } else if (options.types.includes("IPv6")){ + value = faker.internet.ipv6(); + } return { - value: ips, // This is now an array of IPs, one per selected type - stringValue: stringValue, // IPs separated by newline for display + value: value, + stringValue: value, }; } @@ -62,18 +46,17 @@ export const IpAddressGeneratorOptionsComponent: React.FunctionComponent } + label={} selectOptions={IpTypeSelectOptions} - value={options.type} - onChange={(v) => handleOptionValueChange("type", v)} - style={{width: '200px'}} + value={options.types} + onChange={(v) => handleOptionValueChange("types", v)} + style={{width: '160px'}} /> ); @@ -81,16 +64,6 @@ export const IpAddressGeneratorOptionsComponent: React.FunctionComponent, - value: "ip", - }, - { - label: , - value: "ip4" - }, - { - label: , - value: "ip6" - } + {label: "IPv4", value: "IPv4",}, + {label: "IPv6", value: "IPv6"} ] \ No newline at end of file diff --git a/src/core/generators/IpAddress/index.ts b/src/core/generators/IpAddress/index.ts index 01e77c6..5fbac02 100644 --- a/src/core/generators/IpAddress/index.ts +++ b/src/core/generators/IpAddress/index.ts @@ -9,6 +9,6 @@ export const IpAddressGenerator: Generator = { optionsComponent: IpAddressGeneratorOptionsComponent, defaultOptions: IpAddressGeneratorDefaultOptions, defaultValueType: ValueType.STRING, - exampleLines: ["245.108.222.0", "64.239.253.171", "246.18.59.18"] + exampleLines: ["245.108.222.0", "64.239.253.171", "e106:aa3c:59ac:6d0f:4c2c:bfef:86a3:62d7"] } \ No newline at end of file diff --git a/src/locale/translations/en.ts b/src/locale/translations/en.ts index 2d59750..b3bb870 100644 --- a/src/locale/translations/en.ts +++ b/src/locale/translations/en.ts @@ -79,14 +79,10 @@ export const en = { // ------------------------------------------------------------------------------------------------------------- // data types - - + // ipaddress - "dataType.ipaddress": "IpAddress", - "dataType.ipaddress.type":"Type", - "dataType.ipaddress.type.ip": "Ip", - "dataType.ipaddress.type.ip4": "Ip4", - "dataType.ipaddress.type.ip6": "Ip6", + "dataType.ipaddress": "IP Address", + "dataType.ipaddress.types":"Types", // url "dataType.url": "Url", diff --git a/src/locale/translations/zhCN.ts b/src/locale/translations/zhCN.ts index 60d622d..293aa09 100644 --- a/src/locale/translations/zhCN.ts +++ b/src/locale/translations/zhCN.ts @@ -4,7 +4,7 @@ export const zhCN = { // export category "export.category.fileTypes": "常见格式", - "export.category.databases" : "数据库", + "export.category.databases": "数据库", "export.category.programmingLanguages": "编程语言", // export format modal @@ -34,7 +34,7 @@ export const zhCN = { // csv "export.configurator.csv.delimiter": "分隔符", - "export.configurator.csv.delimiter.required" : "分隔符不可为空", + "export.configurator.csv.delimiter.required": "分隔符不可为空", "export.configurator.csv.includeHeader": "包含表头", "export.configurator.csv.endLineChar": "行结束符", @@ -59,20 +59,16 @@ export const zhCN = { // ------------------------------------------------------------------------------------------------------------- // data types - - - + + // ipaddress - "dataType.ipaddress": "网络地址", - "dataType.ipaddress.type":"类型", - "dataType.ipaddress.type.ip": "Ip", - "dataType.ipaddress.type.ip4": "Ip4", - "dataType.ipaddress.type.ip6": "Ip6", + "dataType.ipaddress": "IP地址", + "dataType.ipaddress.types": "类型", // url "dataType.url": "网址", - "dataType.url.appendSlash.label":"斜线", - "dataType.url.protocol.label":"传输协议", + "dataType.url.appendSlash.label": "斜线", + "dataType.url.protocol.label": "传输协议", // domainsuffix "dataType.domainsuffix": "域名后缀", @@ -91,7 +87,7 @@ export const zhCN = { // color "dataType.color": "颜色", "dataType.color.kind.label": "类型", - "dataType.color.format.humanWord":"词语", + "dataType.color.format.humanWord": "词语", "dataType.color.format.label": "格式", // phone @@ -104,15 +100,15 @@ export const zhCN = { "dataType.emoji.type": "类型", "dataType.emoji.type.all": "全部", "dataType.emoji.type.smiley": "笑脸", - "dataType.emoji.type.body" : "人体", - "dataType.emoji.type.person" : "人物", - "dataType.emoji.type.nature" : "自然", - "dataType.emoji.type.food" : "食物", - "dataType.emoji.type.travel" : "旅行", - "dataType.emoji.type.activity" : "活动", - "dataType.emoji.type.object" : "物品", - "dataType.emoji.type.symbol" : "符号", - "dataType.emoji.type.flag" : "国旗", + "dataType.emoji.type.body": "人体", + "dataType.emoji.type.person": "人物", + "dataType.emoji.type.nature": "自然", + "dataType.emoji.type.food": "食物", + "dataType.emoji.type.travel": "旅行", + "dataType.emoji.type.activity": "活动", + "dataType.emoji.type.object": "物品", + "dataType.emoji.type.symbol": "符号", + "dataType.emoji.type.flag": "国旗", // persontitle "dataType.persontitle": "人物称谓", @@ -134,11 +130,11 @@ export const zhCN = { "dataType.number.kind.label": "种类", "dataType.number.precision.label": "精度", "dataType.number.min.label": "最小值", - "dataType.number.min.tooltip":"生成数据的最小值", + "dataType.number.min.tooltip": "生成数据的最小值", "dataType.number.min.errorMessage.empty": "最小值不能为空", "dataType.number.min.errorMessage.greaterThanMax": "最小值不能大于最大值", "dataType.number.max.label": "最大值", - "dataType.number.max.tooltip":"生成数据的最大值", + "dataType.number.max.tooltip": "生成数据的最大值", "dataType.number.max.errorMessage.empty": "最大值不能为空", "dataType.number.max.errorMessage.lessThanMin": "最大值不能小于最小值",