Skip to content

Commit 7379488

Browse files
committed
Typings Improved
1 parent 7d9d00a commit 7379488

File tree

2 files changed

+56
-6
lines changed

2 files changed

+56
-6
lines changed

src/__tests__/index.test.ts

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,30 @@
11
import { jest } from "@jest/globals";
22

33
import { PrismaClient } from "@prisma/client";
4-
import { createPrefixedIdsExtension, extendPrismaClient } from "../index";
4+
import {
5+
createPrefixedIdsExtension,
6+
extendPrismaClient,
7+
PrefixConfig,
8+
} from "../index";
9+
10+
type MockUser = {
11+
id: string;
12+
name: string;
13+
};
14+
15+
type CreateArgs = {
16+
data: Record<string, unknown>;
17+
};
518

619
// Mock PrismaClient
720
jest.mock("@prisma/client", () => {
821
return {
922
PrismaClient: jest.fn().mockImplementation(() => ({
1023
$extends: jest.fn(),
24+
user: {
25+
create: jest.fn(),
26+
findUnique: jest.fn(),
27+
},
1128
})),
1229
};
1330
});
@@ -18,12 +35,12 @@ jest.mock("nanoid", () => ({
1835
}));
1936

2037
describe("PrefixedIdsExtension", () => {
21-
let prisma: PrismaClient;
38+
let prisma: jest.Mocked<PrismaClient>;
2239
const mockQuery = jest.fn((args: any) => Promise.resolve(args));
2340

2441
beforeEach(() => {
2542
jest.clearAllMocks();
26-
prisma = new PrismaClient();
43+
prisma = new PrismaClient() as jest.Mocked<PrismaClient>;
2744
});
2845

2946
describe("createPrefixedIdsExtension", () => {
@@ -115,6 +132,36 @@ describe("PrefixedIdsExtension", () => {
115132
expect(result.data[0]).toHaveProperty("id");
116133
expect(result.data[1]).toHaveProperty("id");
117134
});
135+
136+
it("should generate IDs with uppercase letters", async (): Promise<void> => {
137+
const prefixConfig: PrefixConfig<"User"> = {
138+
prefixes: {
139+
User: "usr",
140+
},
141+
// Force an ID with uppercase for testing
142+
idGenerator: (prefix: string): string => {
143+
return `${prefix}_ABC123DEF`;
144+
},
145+
};
146+
147+
const extension = createPrefixedIdsExtension(prefixConfig);
148+
prisma.$extends(extension);
149+
150+
// Mock the create operation
151+
prisma.user.create.mockResolvedValueOnce({
152+
id: "usr_ABC123DEF",
153+
name: "Test User",
154+
});
155+
156+
const user = await prisma.user.create({
157+
data: {
158+
name: "Test User",
159+
},
160+
});
161+
162+
// Test that the ID matches our pattern including uppercase
163+
expect(user.id).toMatch(/^usr_[A-Z0-9]+$/);
164+
});
118165
});
119166

120167
describe("extendPrismaClient", () => {

src/index.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@ import { customAlphabet } from "nanoid";
55
type ModelName = string;
66

77
export type PrefixConfig<ModelName extends string> = {
8-
prefixes: Record<ModelName, string>;
8+
prefixes: Partial<Record<ModelName, string>>;
99
idGenerator?: (prefix: string) => string;
1010
};
1111

1212
const defaultIdGenerator = (prefix: string): string => {
13-
const nanoid = customAlphabet("0123456789abcdefghijklmnopqrstuvwxyz", 24);
13+
const nanoid = customAlphabet(
14+
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ",
15+
24,
16+
);
1417
return `${prefix}_${nanoid()}`;
1518
};
1619

@@ -35,7 +38,7 @@ export function createPrefixedIdsExtension<ModelName extends string>(
3538

3639
const prefixedId = (modelName: ModelName): string | null => {
3740
if (modelName in prefixes) {
38-
return idGenerator(prefixes[modelName]);
41+
return idGenerator(prefixes[modelName] as string);
3942
}
4043
return null;
4144
};

0 commit comments

Comments
 (0)