Skip to content

Commit

Permalink
fix typings
Browse files Browse the repository at this point in the history
  • Loading branch information
lukasoppermann committed Sep 30, 2024
1 parent 4fc38bb commit e763c28
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 19 deletions.
2 changes: 1 addition & 1 deletion src/data/enterprisedata.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export type EnterpriseData = typeof enterprisedata;
export type EnterpriseDataItems = (typeof enterprisedata)[number];
export type EnterpriseName = EnterpriseDataItems["login"];
export type EnterpriseNames = EnterpriseDataItems["login"];

export const enterprisedata = [
{ name: "ByteStream Technologies Inc", login: "bytestreaminc" },
Expand Down
2 changes: 1 addition & 1 deletion src/data/orgdata.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
export type OrgData = typeof orgdata;
export type OrgDataItems = (typeof orgdata)[number];
export type OrgName = OrgDataItems["login"];
export type OrgNames = OrgDataItems["login"];

export const orgdata = [
{ name: "App Architects", login: "app-architects" },
Expand Down
27 changes: 10 additions & 17 deletions src/generateData.ts
Original file line number Diff line number Diff line change
@@ -1,45 +1,38 @@
import { faker, fakerFR, fakerDE, fakerJA, fakerIT, fakerSV, Faker } from '@faker-js/faker'
import type { UserData, UserDataItems, Usernames } from './data/userdata.js'
import { OrgData, OrgDataItems, OrgName } from './data/orgdata.js'
import { OrgData, OrgDataItems, OrgNames } from './data/orgdata.js'
import { makeUser, User } from './makeUser.js'
import { makeOrg, Org } from './makeOrg.js'
import { EnterpriseData, EnterpriseDataItems, EnterpriseName } from './data/enterprisedata.js'
import { EnterpriseData, EnterpriseDataItems, EnterpriseNames } from './data/enterprisedata.js'
import { Enterprise, makeEnterprise } from './makeEnterprise.js'

const fakers = [faker,fakerFR, fakerDE, fakerJA, fakerIT, fakerSV]

type GenerateUser = (type: "user", data: UserData, login: Usernames) => User
type GenerateOrg = (type: "org", data: OrgData, login: OrgName) => Org
type GenerateEnterprise = (type: "enterprise", data: EnterpriseData, login: EnterpriseName) => Enterprise

type GenerateItem = GenerateUser | GenerateOrg | GenerateEnterprise

// @ts-ignore
const generateItem = <GenerateItem>(type, data, login) => {
function generateItem(type: 'user', data: UserData, login: Usernames): User
function generateItem(type: 'org', data: OrgData, login: OrgNames): Org
function generateItem(type: 'enterprise', data: EnterpriseData, login: EnterpriseNames): Enterprise
function generateItem(type: 'user' | 'org' | 'enterprise', data: UserData | OrgData | EnterpriseData, login: Usernames | OrgNames | EnterpriseNames): User | Org | Enterprise {
const fakerInstance = fakers[Math.floor(Math.random() * fakers.length)]
// get item by login
// @ts-ignore
const item = data.find((item) => item.login === login)

if (!item) {
throw new Error(`Item not found: ${login}`)
}

if(!type) {
throw new Error(`Invalid type: ${type}, must be "user", "org", or "enterprise"`)
}

switch (type) {
case "user":
return makeUser(item as UserDataItems, fakerInstance)
case "org":
return makeOrg(item as OrgDataItems, fakerInstance)
case "enterprise":
return makeEnterprise(item as EnterpriseDataItems, fakerInstance)
default:
throw new Error(`Unknown type: ${type}, must be "user", "org", or "enterprise"`)
}

}

export const generateUser = (data: UserData, login: Usernames) => generateItem("user", data, login)
export const generateOrg = (data: OrgData, login: OrgName) => generateItem("org", data, login)
export const generateEnterprise = (data: EnterpriseData, login: EnterpriseName) => generateItem("enterprise", data, login)
export const generateOrg = (data: OrgData, login: OrgNames) => generateItem("org", data, login)
export const generateEnterprise = (data: EnterpriseData, login: EnterpriseNames) => generateItem("enterprise", data, login)

0 comments on commit e763c28

Please sign in to comment.