@epic-web/workshop-presence 6.16.8 → 6.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.test.d.ts","sourceRoot":"","sources":["../../src/presence.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { test, expect } from 'vitest';
|
|
2
|
+
import { UserSchema, MessageSchema, PresenceSchema, } from './presence.js';
|
|
3
|
+
test('UserSchema should validate a valid user object', () => {
|
|
4
|
+
const validUser = {
|
|
5
|
+
id: 'user123',
|
|
6
|
+
hasAccess: true,
|
|
7
|
+
name: 'John Doe',
|
|
8
|
+
imageUrlSmall: 'https://example.com/small.jpg',
|
|
9
|
+
imageUrlLarge: 'https://example.com/large.jpg',
|
|
10
|
+
location: {
|
|
11
|
+
workshopTitle: 'React Workshop',
|
|
12
|
+
origin: 'https://workshop.example.com',
|
|
13
|
+
exercise: {
|
|
14
|
+
type: 'problem',
|
|
15
|
+
exerciseNumber: 1,
|
|
16
|
+
stepNumber: 2,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
const result = UserSchema.safeParse(validUser);
|
|
21
|
+
expect(result.success).toBe(true);
|
|
22
|
+
if (result.success) {
|
|
23
|
+
expect(result.data).toEqual(validUser);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
test('UserSchema should validate minimal user object', () => {
|
|
27
|
+
const minimalUser = {
|
|
28
|
+
id: 'user123',
|
|
29
|
+
};
|
|
30
|
+
const result = UserSchema.safeParse(minimalUser);
|
|
31
|
+
expect(result.success).toBe(true);
|
|
32
|
+
if (result.success) {
|
|
33
|
+
expect(result.data).toEqual(minimalUser);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
test('UserSchema should reject user without id', () => {
|
|
37
|
+
const invalidUser = {
|
|
38
|
+
name: 'John Doe',
|
|
39
|
+
hasAccess: true,
|
|
40
|
+
};
|
|
41
|
+
const result = UserSchema.safeParse(invalidUser);
|
|
42
|
+
expect(result.success).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
test('MessageSchema should validate add-user message', () => {
|
|
45
|
+
const addUserMessage = {
|
|
46
|
+
type: 'add-user',
|
|
47
|
+
payload: {
|
|
48
|
+
id: 'user123',
|
|
49
|
+
name: 'John Doe',
|
|
50
|
+
hasAccess: true,
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
const result = MessageSchema.safeParse(addUserMessage);
|
|
54
|
+
expect(result.success).toBe(true);
|
|
55
|
+
if (result.success) {
|
|
56
|
+
expect(result.data).toEqual(addUserMessage);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
test('MessageSchema should validate remove-user message', () => {
|
|
60
|
+
const removeUserMessage = {
|
|
61
|
+
type: 'remove-user',
|
|
62
|
+
payload: {
|
|
63
|
+
id: 'user123',
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
const result = MessageSchema.safeParse(removeUserMessage);
|
|
67
|
+
expect(result.success).toBe(true);
|
|
68
|
+
if (result.success) {
|
|
69
|
+
expect(result.data).toEqual(removeUserMessage);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
test('MessageSchema should validate presence message', () => {
|
|
73
|
+
const presenceMessage = {
|
|
74
|
+
type: 'presence',
|
|
75
|
+
payload: {
|
|
76
|
+
users: [
|
|
77
|
+
{ id: 'user1', name: 'User 1' },
|
|
78
|
+
{ id: 'user2', name: 'User 2' },
|
|
79
|
+
],
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
const result = MessageSchema.safeParse(presenceMessage);
|
|
83
|
+
expect(result.success).toBe(true);
|
|
84
|
+
if (result.success) {
|
|
85
|
+
expect(result.data).toEqual(presenceMessage);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
test('MessageSchema should reject invalid message type', () => {
|
|
89
|
+
const invalidMessage = {
|
|
90
|
+
type: 'invalid-type',
|
|
91
|
+
payload: { id: 'user123' },
|
|
92
|
+
};
|
|
93
|
+
const result = MessageSchema.safeParse(invalidMessage);
|
|
94
|
+
expect(result.success).toBe(false);
|
|
95
|
+
});
|
|
96
|
+
test('PresenceSchema should validate presence object', () => {
|
|
97
|
+
const presence = {
|
|
98
|
+
users: [
|
|
99
|
+
{ id: 'user1', name: 'User 1' },
|
|
100
|
+
{ id: 'user2', name: 'User 2' },
|
|
101
|
+
],
|
|
102
|
+
};
|
|
103
|
+
const result = PresenceSchema.safeParse(presence);
|
|
104
|
+
expect(result.success).toBe(true);
|
|
105
|
+
if (result.success) {
|
|
106
|
+
expect(result.data).toEqual(presence);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
test('PresenceSchema should validate empty users array', () => {
|
|
110
|
+
const presence = {
|
|
111
|
+
users: [],
|
|
112
|
+
};
|
|
113
|
+
const result = PresenceSchema.safeParse(presence);
|
|
114
|
+
expect(result.success).toBe(true);
|
|
115
|
+
if (result.success) {
|
|
116
|
+
expect(result.data).toEqual(presence);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
test('User type should be correctly inferred', () => {
|
|
120
|
+
const user = {
|
|
121
|
+
id: 'user123',
|
|
122
|
+
name: 'Test User',
|
|
123
|
+
hasAccess: true,
|
|
124
|
+
};
|
|
125
|
+
expect(user.id).toBe('user123');
|
|
126
|
+
expect(user.name).toBe('Test User');
|
|
127
|
+
expect(user.hasAccess).toBe(true);
|
|
128
|
+
});
|
|
129
|
+
test('Message type should be correctly inferred', () => {
|
|
130
|
+
const message = {
|
|
131
|
+
type: 'add-user',
|
|
132
|
+
payload: {
|
|
133
|
+
id: 'user123',
|
|
134
|
+
name: 'Test User',
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
expect(message.type).toBe('add-user');
|
|
138
|
+
expect(message.payload.id).toBe('user123');
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=presence.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.test.js","sourceRoot":"","sources":["../../src/presence.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { test, expect } from 'vitest'\nimport {\n\tUserSchema,\n\tMessageSchema,\n\tPresenceSchema,\n\ttype User,\n\ttype Message,\n} from './presence.js'\n\ntest('UserSchema should validate a valid user object', () => {\n\tconst validUser = {\n\t\tid: 'user123',\n\t\thasAccess: true,\n\t\tname: 'John Doe',\n\t\timageUrlSmall: 'https://example.com/small.jpg',\n\t\timageUrlLarge: 'https://example.com/large.jpg',\n\t\tlocation: {\n\t\t\tworkshopTitle: 'React Workshop',\n\t\t\torigin: 'https://workshop.example.com',\n\t\t\texercise: {\n\t\t\t\ttype: 'problem' as const,\n\t\t\t\texerciseNumber: 1,\n\t\t\t\tstepNumber: 2,\n\t\t\t},\n\t\t},\n\t}\n\n\tconst result = UserSchema.safeParse(validUser)\n\texpect(result.success).toBe(true)\n\tif (result.success) {\n\t\texpect(result.data).toEqual(validUser)\n\t}\n})\n\ntest('UserSchema should validate minimal user object', () => {\n\tconst minimalUser = {\n\t\tid: 'user123',\n\t}\n\n\tconst result = UserSchema.safeParse(minimalUser)\n\texpect(result.success).toBe(true)\n\tif (result.success) {\n\t\texpect(result.data).toEqual(minimalUser)\n\t}\n})\n\ntest('UserSchema should reject user without id', () => {\n\tconst invalidUser = {\n\t\tname: 'John Doe',\n\t\thasAccess: true,\n\t}\n\n\tconst result = UserSchema.safeParse(invalidUser)\n\texpect(result.success).toBe(false)\n})\n\ntest('MessageSchema should validate add-user message', () => {\n\tconst addUserMessage = {\n\t\ttype: 'add-user' as const,\n\t\tpayload: {\n\t\t\tid: 'user123',\n\t\t\tname: 'John Doe',\n\t\t\thasAccess: true,\n\t\t},\n\t}\n\n\tconst result = MessageSchema.safeParse(addUserMessage)\n\texpect(result.success).toBe(true)\n\tif (result.success) {\n\t\texpect(result.data).toEqual(addUserMessage)\n\t}\n})\n\ntest('MessageSchema should validate remove-user message', () => {\n\tconst removeUserMessage = {\n\t\ttype: 'remove-user' as const,\n\t\tpayload: {\n\t\t\tid: 'user123',\n\t\t},\n\t}\n\n\tconst result = MessageSchema.safeParse(removeUserMessage)\n\texpect(result.success).toBe(true)\n\tif (result.success) {\n\t\texpect(result.data).toEqual(removeUserMessage)\n\t}\n})\n\ntest('MessageSchema should validate presence message', () => {\n\tconst presenceMessage = {\n\t\ttype: 'presence' as const,\n\t\tpayload: {\n\t\t\tusers: [\n\t\t\t\t{ id: 'user1', name: 'User 1' },\n\t\t\t\t{ id: 'user2', name: 'User 2' },\n\t\t\t],\n\t\t},\n\t}\n\n\tconst result = MessageSchema.safeParse(presenceMessage)\n\texpect(result.success).toBe(true)\n\tif (result.success) {\n\t\texpect(result.data).toEqual(presenceMessage)\n\t}\n})\n\ntest('MessageSchema should reject invalid message type', () => {\n\tconst invalidMessage = {\n\t\ttype: 'invalid-type',\n\t\tpayload: { id: 'user123' },\n\t}\n\n\tconst result = MessageSchema.safeParse(invalidMessage)\n\texpect(result.success).toBe(false)\n})\n\ntest('PresenceSchema should validate presence object', () => {\n\tconst presence = {\n\t\tusers: [\n\t\t\t{ id: 'user1', name: 'User 1' },\n\t\t\t{ id: 'user2', name: 'User 2' },\n\t\t],\n\t}\n\n\tconst result = PresenceSchema.safeParse(presence)\n\texpect(result.success).toBe(true)\n\tif (result.success) {\n\t\texpect(result.data).toEqual(presence)\n\t}\n})\n\ntest('PresenceSchema should validate empty users array', () => {\n\tconst presence = {\n\t\tusers: [],\n\t}\n\n\tconst result = PresenceSchema.safeParse(presence)\n\texpect(result.success).toBe(true)\n\tif (result.success) {\n\t\texpect(result.data).toEqual(presence)\n\t}\n})\n\ntest('User type should be correctly inferred', () => {\n\tconst user: User = {\n\t\tid: 'user123',\n\t\tname: 'Test User',\n\t\thasAccess: true,\n\t}\n\n\texpect(user.id).toBe('user123')\n\texpect(user.name).toBe('Test User')\n\texpect(user.hasAccess).toBe(true)\n})\n\ntest('Message type should be correctly inferred', () => {\n\tconst message: Message = {\n\t\ttype: 'add-user',\n\t\tpayload: {\n\t\t\tid: 'user123',\n\t\t\tname: 'Test User',\n\t\t},\n\t}\n\n\texpect(message.type).toBe('add-user')\n\texpect(message.payload.id).toBe('user123')\n})\n"]}
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@epic-web/workshop-presence","version":"6.
|
|
1
|
+
{"name":"@epic-web/workshop-presence","version":"6.18.0","publishConfig":{"access":"public"},"type":"module","scripts":{"test":"vitest","typecheck":"tsc --noEmit","build":"tshy","dev":"partykit dev","deploy":"partykit deploy"},"dependencies":{"@epic-web/workshop-utils":"6.18.0","zod":"^3.25.71"},"devDependencies":{"partykit":"0.0.115","typescript":"^5.8.3","tshy":"^3.0.2","vitest":"^3.2.4"},"files":["dist"],"tshy":{"project":"./tsconfig.build.json","dialects":["esm"],"exports":{"./package.json":"./package.json","./presence.server":"./src/presence.server.ts","./presence":"./src/presence.ts"}},"repository":{"type":"git","url":"https://github.com/epicweb-dev/epicshop.git","directory":"packages/presence"},"exports":{"./package.json":"./package.json","./presence.server":{"import":{"types":"./dist/esm/presence.server.d.ts","default":"./dist/esm/presence.server.js"}},"./presence":{"import":{"types":"./dist/esm/presence.d.ts","default":"./dist/esm/presence.js"}}}}
|