Compare commits
955 Commits
jazz-bette
...
jazz-bette
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4c2e60ab51 | ||
|
|
1830171930 | ||
|
|
6574090402 | ||
|
|
a6f65472a7 | ||
|
|
109952aa6a | ||
|
|
556bdf977b | ||
|
|
0213b4e5b9 | ||
|
|
01c195756c | ||
|
|
9c69917d24 | ||
|
|
b4d68f0a32 | ||
|
|
fbc3839777 | ||
|
|
296464b282 | ||
|
|
c463654970 | ||
|
|
debc052bdc | ||
|
|
3c7846153d | ||
|
|
e410fedda7 | ||
|
|
52ea0c7a9b | ||
|
|
b91c93caed | ||
|
|
7586c3bac5 | ||
|
|
9b96cd4a65 | ||
|
|
2e66ea8e56 | ||
|
|
336cc1f0fe | ||
|
|
cc2ca5c23c | ||
|
|
3664385113 | ||
|
|
2b2ecdaf3d | ||
|
|
6dbb05320a | ||
|
|
0160a188fa | ||
|
|
ac3e694f4e | ||
|
|
a7dca75955 | ||
|
|
143156cd6a | ||
|
|
1a182f07de | ||
|
|
7e7e7ebb51 | ||
|
|
0966a90f3d | ||
|
|
76f142b70d | ||
|
|
cd2f0846db | ||
|
|
c2e411d056 | ||
|
|
0167153da2 | ||
|
|
be5211d088 | ||
|
|
747f73d168 | ||
|
|
7501702f7b | ||
|
|
16fb9fab5f | ||
|
|
82de51c93d | ||
|
|
5d96991981 | ||
|
|
694b168fb4 | ||
|
|
feaa69ebdd | ||
|
|
d5fa172b17 | ||
|
|
96de15593b | ||
|
|
5ba03ebc70 | ||
|
|
4609cebed6 | ||
|
|
06d21b9529 | ||
|
|
f3426beaf5 | ||
|
|
8b3e038a98 | ||
|
|
4002d6afb9 | ||
|
|
7dd128962d | ||
|
|
d8ae47c4d1 | ||
|
|
8fb1748433 | ||
|
|
c8644bf678 | ||
|
|
269ee94338 | ||
|
|
dae80eeba8 | ||
|
|
ce54667b4d | ||
|
|
5963658e28 | ||
|
|
71c1411bbd | ||
|
|
71b221dc79 | ||
|
|
2d11d448dc | ||
|
|
2d42fc9b34 | ||
|
|
c9bda7e1e3 | ||
|
|
476f2d7eee | ||
|
|
1ba3a2ca34 | ||
|
|
7dd3d005a3 | ||
|
|
2c2dfb52d4 | ||
|
|
d33917fbaa | ||
|
|
f0c73d9cc6 | ||
|
|
d9324a9809 | ||
|
|
f7b5454cc6 | ||
|
|
5de338bdaf | ||
|
|
e67d44d47a | ||
|
|
a310293346 | ||
|
|
716d770258 | ||
|
|
4e85b50e1b | ||
|
|
643297b42e | ||
|
|
261efd99be | ||
|
|
f75f4f9b2d | ||
|
|
a0021f060c | ||
|
|
86bd87e6d0 | ||
|
|
ae55e80801 | ||
|
|
e830caf966 | ||
|
|
2f7240121d | ||
|
|
97699a6d5b | ||
|
|
5f8a2ba8df | ||
|
|
fe06e12b85 | ||
|
|
5b2b16a5c6 | ||
|
|
a966912c8a | ||
|
|
b63b70fb80 | ||
|
|
6b3e02920a | ||
|
|
f566961390 | ||
|
|
265b265365 | ||
|
|
83fc22f39a | ||
|
|
794681a8bb | ||
|
|
899bb0d2a1 | ||
|
|
92c0048984 | ||
|
|
33cfc4cc25 | ||
|
|
42c60c99fe | ||
|
|
e42518ed29 | ||
|
|
5b7ef3cd89 | ||
|
|
fc02fc0608 | ||
|
|
ceaa555e83 | ||
|
|
03229b2ea9 | ||
|
|
e2737d44b6 | ||
|
|
4b73834883 | ||
|
|
1b3d43d5f4 | ||
|
|
9c9a689879 | ||
|
|
60b5288042 | ||
|
|
2fd88b938c | ||
|
|
d1f955006f | ||
|
|
bb3d5f1f87 | ||
|
|
26ce61ab78 | ||
|
|
1f300114d5 | ||
|
|
da69f812f8 | ||
|
|
0bcbf551ca | ||
|
|
6b3d5b5560 | ||
|
|
d1bdbf5d49 | ||
|
|
621e809fad | ||
|
|
d6600d9322 | ||
|
|
2b08bd77c1 | ||
|
|
c1c6e31711 | ||
|
|
0b16085f3c | ||
|
|
e53db2e96a | ||
|
|
384f0e23c0 | ||
|
|
daaf1789d9 | ||
|
|
1f9e20e753 | ||
|
|
ce9ca54f5c | ||
|
|
67e0968809 | ||
|
|
96a922cceb | ||
|
|
9b22fc74cd | ||
|
|
1bebe3c6c8 | ||
|
|
0a98b826f1 | ||
|
|
e1bd16d08b | ||
|
|
0967c2ee5a | ||
|
|
62a3854c41 | ||
|
|
f22ef4e646 | ||
|
|
6c35d0031d | ||
|
|
7bdb6f4279 | ||
|
|
93f3fb231b | ||
|
|
01d13d5df2 | ||
|
|
944e725b95 | ||
|
|
16024fec8e | ||
|
|
f90414ab95 | ||
|
|
492eecb46a | ||
|
|
51144ec832 | ||
|
|
fcaf4b9c30 | ||
|
|
afae2649f5 | ||
|
|
b5b0284c61 | ||
|
|
bf1475a143 | ||
|
|
e82cb80ca4 | ||
|
|
32c2a617d6 | ||
|
|
d3c2a41c81 | ||
|
|
4b99ff1fe3 | ||
|
|
3ebf8258a0 | ||
|
|
4809d14f6d | ||
|
|
5ae1f33127 | ||
|
|
ca5d84f6a9 | ||
|
|
6e6acc3404 | ||
|
|
b17b7b6481 | ||
|
|
5341646301 | ||
|
|
5416165d28 | ||
|
|
b5a9f681c5 | ||
|
|
7dffc006eb | ||
|
|
cd3cc5b0ab | ||
|
|
ceab75eb4d | ||
|
|
103d1b41f7 | ||
|
|
b87cc6973e | ||
|
|
3d541ca241 | ||
|
|
e72bfec884 | ||
|
|
19c7ad27d9 | ||
|
|
0bc7bfc5cc | ||
|
|
2c8120d46f | ||
|
|
c936c8c611 | ||
|
|
58c6013770 | ||
|
|
3eb3291a97 | ||
|
|
6b659f2df3 | ||
|
|
dcc9c9a5ec | ||
|
|
fe9a244363 | ||
|
|
9440bbc058 | ||
|
|
1c92cc2997 | ||
|
|
33ebbf0bdd | ||
|
|
d630b5bde5 | ||
|
|
8c56445882 | ||
|
|
1c6ae12cd9 | ||
|
|
ac5d20d159 | ||
|
|
21bcaabd5a | ||
|
|
17b4d5b668 | ||
|
|
3cd15862d5 | ||
|
|
b3d1ad7201 | ||
|
|
d87df11795 | ||
|
|
82c2a62b2a | ||
|
|
0a9112506e | ||
|
|
d9c9b5f099 | ||
|
|
fbc29f2f17 | ||
|
|
3915bbbf3c | ||
|
|
0b471c4e89 | ||
|
|
09077d37ef | ||
|
|
afe06b4fa6 | ||
|
|
d89b6e488a | ||
|
|
f6361ee43b | ||
|
|
726dbfb6df | ||
|
|
267f689f10 | ||
|
|
893ad3ae23 | ||
|
|
f5590b1be8 | ||
|
|
17a01f57e8 | ||
|
|
7318d86f52 | ||
|
|
1c8403e87a | ||
|
|
dd747c068a | ||
|
|
1f0f230fe2 | ||
|
|
da655cbff5 | ||
|
|
02f6c6220e | ||
|
|
0755cd198e | ||
|
|
c4a8227b66 | ||
|
|
86f0302233 | ||
|
|
72b5542130 | ||
|
|
5fd9225a54 | ||
|
|
9138d30208 | ||
|
|
a5ece15797 | ||
|
|
9f8877202e | ||
|
|
d190097ed9 | ||
|
|
9841617c66 | ||
|
|
165a6170cd | ||
|
|
5148419df9 | ||
|
|
fc0ecb0968 | ||
|
|
802b5a3060 | ||
|
|
e47af262b3 | ||
|
|
688a4850a4 | ||
|
|
e87fef751e | ||
|
|
8f714440f8 | ||
|
|
70cd09170e | ||
|
|
e98b610fd0 | ||
|
|
b554983558 | ||
|
|
4c63334299 | ||
|
|
4aef7cdac5 | ||
|
|
76adeb0d53 | ||
|
|
d95dcbe7db | ||
|
|
f9d538f049 | ||
|
|
40c7336c09 | ||
|
|
e0d2723615 | ||
|
|
93e68c62f5 | ||
|
|
dadee9dcc5 | ||
|
|
6724c4bd83 | ||
|
|
1942bd5de4 | ||
|
|
16764f6365 | ||
|
|
b56cfc2e1f | ||
|
|
7091bcf9c0 | ||
|
|
436cbfa095 | ||
|
|
c19a25f928 | ||
|
|
104e664bbb | ||
|
|
f199b451eb | ||
|
|
70bc48458e | ||
|
|
f28b2a6135 | ||
|
|
55b770b7c9 | ||
|
|
e6838dfb98 | ||
|
|
5e34061fdc | ||
|
|
6d9b77195a | ||
|
|
9bf7946ee6 | ||
|
|
acecffaeb2 | ||
|
|
0a98d6aaf2 | ||
|
|
4ea1a63a0a | ||
|
|
41a4c3bc95 | ||
|
|
60d0027f9d | ||
|
|
748c2ff751 | ||
|
|
cc291b590a | ||
|
|
1f144e89bf | ||
|
|
70938b0ab3 | ||
|
|
f2f5b55dbf | ||
|
|
3c3acae803 | ||
|
|
896ee3460f | ||
|
|
9b9bf44e2b | ||
|
|
8e9acb37f8 | ||
|
|
392aa88d95 | ||
|
|
7ce82cd934 | ||
|
|
0c8158b91c | ||
|
|
5a48c9c44c | ||
|
|
25c56146f5 | ||
|
|
8115e194d3 | ||
|
|
c564fbb02e | ||
|
|
12481e14c2 | ||
|
|
fd2d247ff5 | ||
|
|
9e9ea029b2 | ||
|
|
a0da272dcd | ||
|
|
72fbcc3262 | ||
|
|
f4c8cc858b | ||
|
|
0ab4d7a20d | ||
|
|
5c98ff4e4f | ||
|
|
4cbda689c4 | ||
|
|
771b0ed914 | ||
|
|
79913c3136 | ||
|
|
43d3511d15 | ||
|
|
928ef14086 | ||
|
|
048dd7def0 | ||
|
|
51fcb8a44b | ||
|
|
c5888c39f5 | ||
|
|
2defcfae67 | ||
|
|
873b146d15 | ||
|
|
213de11c3b | ||
|
|
2f24d35471 | ||
|
|
42667c81bb | ||
|
|
1b881cc89f | ||
|
|
af295d816a | ||
|
|
fe8d3497c0 | ||
|
|
c2899e94ca | ||
|
|
f4be67e9b6 | ||
|
|
ba9ad295b6 | ||
|
|
9ed5a96ef8 | ||
|
|
4272ea9019 | ||
|
|
9509307ed1 | ||
|
|
be08921bc5 | ||
|
|
77e3c21cbd | ||
|
|
ab1798c7bd | ||
|
|
26ae69a242 | ||
|
|
25be055a51 | ||
|
|
21ad3767b9 | ||
|
|
a9383516c1 | ||
|
|
bffc516c68 | ||
|
|
9e7c0d9887 | ||
|
|
99b44d5780 | ||
|
|
02db5f3b1d | ||
|
|
1949a5fcd9 | ||
|
|
dcd3b022cc | ||
|
|
a7b837c7e1 | ||
|
|
88ebcf58ab | ||
|
|
b173e0884a | ||
|
|
f379a168be | ||
|
|
bde6ac7d45 | ||
|
|
231947c97a | ||
|
|
d1609cdd55 | ||
|
|
d5b57ad1fc | ||
|
|
b71ab3168a | ||
|
|
0c8f6e5039 | ||
|
|
0bf5c53bec | ||
|
|
e7b1550003 | ||
|
|
6a93a1b8a3 | ||
|
|
9f654a2603 | ||
|
|
dbf735d9e1 | ||
|
|
c62abefb66 | ||
|
|
1453869a46 | ||
|
|
f5039cefc1 | ||
|
|
239da90c9f | ||
|
|
972791e7a8 | ||
|
|
6540893caf | ||
|
|
bfc85c4573 | ||
|
|
e9076313ab | ||
|
|
c6afd8ae36 | ||
|
|
370f20d13d | ||
|
|
0c0178764e | ||
|
|
928350b821 | ||
|
|
be3fd9c696 | ||
|
|
269c028df0 | ||
|
|
e4df837138 | ||
|
|
54fe6d93ba | ||
|
|
979689c6d8 | ||
|
|
859a37868f | ||
|
|
57bd32d77e | ||
|
|
f9b3116deb | ||
|
|
352d34979f | ||
|
|
7ff736ace4 | ||
|
|
5bab466fd0 | ||
|
|
329b8c3d6a | ||
|
|
e21cbccd4b | ||
|
|
a66ab7d174 | ||
|
|
78e91f4030 | ||
|
|
7a915c198e | ||
|
|
c9b0420746 | ||
|
|
2303f3e70a | ||
|
|
a7bc9569a3 | ||
|
|
f351ba0fcd | ||
|
|
d3e554f491 | ||
|
|
b5e31456ad | ||
|
|
c0aeb7baf9 | ||
|
|
8a14de10d7 | ||
|
|
b585b39a86 | ||
|
|
42d07ba7b4 | ||
|
|
b81b6ba69b | ||
|
|
1bc1759bb4 | ||
|
|
225bc1f63f | ||
|
|
5d94564f99 | ||
|
|
9633d0187f | ||
|
|
b82ecaa3ca | ||
|
|
111ec8d351 | ||
|
|
512aacdbc2 | ||
|
|
7ad843aa3e | ||
|
|
071128339b | ||
|
|
688ced499d | ||
|
|
ac91c8e7c2 | ||
|
|
c3b303c310 | ||
|
|
fc027a56db | ||
|
|
959a7a3927 | ||
|
|
2548085b59 | ||
|
|
b27bb3e65b | ||
|
|
937284f7e9 | ||
|
|
e999727c70 | ||
|
|
2197766624 | ||
|
|
d1efde468f | ||
|
|
4d4fd0beaa | ||
|
|
2b61e853a7 | ||
|
|
6f79b45544 | ||
|
|
2e1ff99579 | ||
|
|
7361854ee4 | ||
|
|
4a775fada3 | ||
|
|
3fe53a3a4a | ||
|
|
fe37516786 | ||
|
|
4beafb7cf3 | ||
|
|
82a592e08a | ||
|
|
4c6926153a | ||
|
|
c51b088243 | ||
|
|
867cb6b7a5 | ||
|
|
3a1fdd7600 | ||
|
|
3fdbb43b54 | ||
|
|
02969ee89b | ||
|
|
e9b2860e74 | ||
|
|
9b4988a514 | ||
|
|
6327d74f68 | ||
|
|
8aa4b59d49 | ||
|
|
ac782674de | ||
|
|
bedbabdcb4 | ||
|
|
5eb406d54d | ||
|
|
a3be832414 | ||
|
|
7ca8dd960e | ||
|
|
62c8aff73f | ||
|
|
7731109a28 | ||
|
|
0401fcf2a8 | ||
|
|
139a649279 | ||
|
|
9acccb5df2 | ||
|
|
fd90cdb49a | ||
|
|
4a29999c6a | ||
|
|
df487d5335 | ||
|
|
1efe84c691 | ||
|
|
73b99c6c1a | ||
|
|
039b92c839 | ||
|
|
618af5f1e3 | ||
|
|
dfc4286694 | ||
|
|
970ff0d813 | ||
|
|
65eee0ef01 | ||
|
|
eee221f563 | ||
|
|
063553090e | ||
|
|
97f6bcedbd | ||
|
|
7c63e6bb0f | ||
|
|
08aedcf517 | ||
|
|
3e12ee127f | ||
|
|
2283d375ef | ||
|
|
202e763380 | ||
|
|
52bbdb37a9 | ||
|
|
c2c223f22a | ||
|
|
96f743b2f4 | ||
|
|
f5c47feeb6 | ||
|
|
6dffe73bd2 | ||
|
|
6f9ee31179 | ||
|
|
52f324ffc4 | ||
|
|
2d86f53575 | ||
|
|
68cb357a94 | ||
|
|
56ccf9ab9d | ||
|
|
b8b0851433 | ||
|
|
2bbb07b0bf | ||
|
|
4f7bc91502 | ||
|
|
d3053955d8 | ||
|
|
f61a120560 | ||
|
|
2f1307a0ba | ||
|
|
fa15ea56d1 | ||
|
|
1e58ecb3ac | ||
|
|
ceeabfaf89 | ||
|
|
70ce7c5736 | ||
|
|
f40484eca9 | ||
|
|
d581a59aa1 | ||
|
|
0ca09f75c1 | ||
|
|
e8fcd101f2 | ||
|
|
cf43fa7529 | ||
|
|
df1cdda4e8 | ||
|
|
be46042cdc | ||
|
|
6afdb16739 | ||
|
|
7a60d7bb76 | ||
|
|
f8263a8358 | ||
|
|
f6da966922 | ||
|
|
b0b2b85a6f | ||
|
|
8a2ab51543 | ||
|
|
28c19c134f | ||
|
|
0924c9baaa | ||
|
|
8bfaa0a18b | ||
|
|
b2712e18a2 | ||
|
|
66894b63d7 | ||
|
|
147be76399 | ||
|
|
36770bed52 | ||
|
|
466e6c44ee | ||
|
|
5bd8277161 | ||
|
|
b1a05143e3 | ||
|
|
fb761ce66d | ||
|
|
07a6c340dc | ||
|
|
8b4261f7d8 | ||
|
|
0ec917e453 | ||
|
|
6326d0fc45 | ||
|
|
d746b1279a | ||
|
|
0fea904dd0 | ||
|
|
373aef313f | ||
|
|
c09dcdfc76 | ||
|
|
a584590ed8 | ||
|
|
0a830e29a9 | ||
|
|
4402c553b6 | ||
|
|
e76fe343da | ||
|
|
dc183a19b2 | ||
|
|
fef55a4cd6 | ||
|
|
ddef54048f | ||
|
|
a2626a0f38 | ||
|
|
ec579bcaf7 | ||
|
|
8aa2d2a789 | ||
|
|
a39d009b87 | ||
|
|
6b662b0efe | ||
|
|
efff4d0f4f | ||
|
|
ea2b01d8a2 | ||
|
|
e9af90c841 | ||
|
|
2b7c6f5aa7 | ||
|
|
d73a3d9d46 | ||
|
|
8af39077a3 | ||
|
|
54bd487818 | ||
|
|
f01dab5c8f | ||
|
|
a8b3ec7bb0 | ||
|
|
a7f6870048 | ||
|
|
3b294f6994 | ||
|
|
a420b43029 | ||
|
|
a57268de32 | ||
|
|
6b2c4ed280 | ||
|
|
8d4e0027be | ||
|
|
a4141da1b7 | ||
|
|
c9ca5202f9 | ||
|
|
7b50a2e06d | ||
|
|
43dabccb57 | ||
|
|
b6d04f56ef | ||
|
|
628195b678 | ||
|
|
9a5d769717 | ||
|
|
e30a3f66bf | ||
|
|
6327fce933 | ||
|
|
a650da4184 | ||
|
|
6e4a94f6ce | ||
|
|
b73bec64bc | ||
|
|
50ae2f47c2 | ||
|
|
724d8e7f30 | ||
|
|
7b285ab110 | ||
|
|
01ac9b8c4c | ||
|
|
4e2e1ac73e | ||
|
|
94960c1f65 | ||
|
|
b5af58347b | ||
|
|
46a84558c5 | ||
|
|
f93566c045 | ||
|
|
d97ed603a3 | ||
|
|
8d33103182 | ||
|
|
aaa1ff978b | ||
|
|
82655ea7a7 | ||
|
|
8afe3a2e02 | ||
|
|
ae2adcbd15 | ||
|
|
eb0460d330 | ||
|
|
55cb83e6e0 | ||
|
|
6290088fec | ||
|
|
b9c17b37db | ||
|
|
6c76ff8fbf | ||
|
|
3c6a2a6092 | ||
|
|
e8a950e61a | ||
|
|
e2cbf035de | ||
|
|
47599b6307 | ||
|
|
901d0762ee | ||
|
|
d1c1b0c5cc | ||
|
|
cf4ad7285d | ||
|
|
255a947ea6 | ||
|
|
530a263d35 | ||
|
|
2983c7bd58 | ||
|
|
d60e345b4d | ||
|
|
745020b7a8 | ||
|
|
be47d866bc | ||
|
|
ab6328f767 | ||
|
|
e0555debde | ||
|
|
247f4556e7 | ||
|
|
7903c737f4 | ||
|
|
6145da5525 | ||
|
|
fc0a2e77a3 | ||
|
|
334fbbbb7f | ||
|
|
eaac1e6580 | ||
|
|
114898d8a9 | ||
|
|
991aebf7a7 | ||
|
|
cbc3f0cc65 | ||
|
|
29c487e288 | ||
|
|
0b0590a364 | ||
|
|
1eb01997d8 | ||
|
|
0dc8d511a1 | ||
|
|
9b75880b10 | ||
|
|
962213c712 | ||
|
|
427df8fcbb | ||
|
|
98fe72ed42 | ||
|
|
1f5c81c2ea | ||
|
|
c40aad55dc | ||
|
|
fc41aa165b | ||
|
|
dfca5926de | ||
|
|
9815ec61f0 | ||
|
|
fca60d213e | ||
|
|
b4fdab475b | ||
|
|
2b043abffa | ||
|
|
958c122c36 | ||
|
|
5842838371 | ||
|
|
e136e1b696 | ||
|
|
2475a46578 | ||
|
|
41466ea399 | ||
|
|
44f653a64b | ||
|
|
f8437042a6 | ||
|
|
3b91594d10 | ||
|
|
ac88bdcb98 | ||
|
|
30704bcaf7 | ||
|
|
acd908fbc2 | ||
|
|
4e61d1d191 | ||
|
|
db23582b4c | ||
|
|
4b0b6d8a69 | ||
|
|
d450b394fa | ||
|
|
0abc96e400 | ||
|
|
7562354b29 | ||
|
|
6c085a3919 | ||
|
|
6afff848bc | ||
|
|
47059845cc | ||
|
|
a1735a8232 | ||
|
|
1f5750d8c4 | ||
|
|
f756ce26b5 | ||
|
|
84f5bdda74 | ||
|
|
ee7aefa97c | ||
|
|
b0895981ba | ||
|
|
94f636b2ee | ||
|
|
331ab070f6 | ||
|
|
13e73adfb9 | ||
|
|
265a6405af | ||
|
|
9f6079b6c6 | ||
|
|
4033d78fa6 | ||
|
|
83af94c850 | ||
|
|
70fe856713 | ||
|
|
42e4afc42b | ||
|
|
0e6797b222 | ||
|
|
3634eaf8e9 | ||
|
|
58dfda3d0f | ||
|
|
d304b0bcb5 | ||
|
|
44f5a3f5a2 | ||
|
|
ebb3ce1c25 | ||
|
|
a67bba0dcf | ||
|
|
4a72c26e42 | ||
|
|
084cb5936d | ||
|
|
f1552b8262 | ||
|
|
6826ad8e45 | ||
|
|
7c1b757b62 | ||
|
|
326e1734a4 | ||
|
|
0cf027c91b | ||
|
|
e358881b76 | ||
|
|
cee8010918 | ||
|
|
cc877139ef | ||
|
|
56a9b89538 | ||
|
|
199c463e28 | ||
|
|
50e523d19c | ||
|
|
796ea24288 | ||
|
|
c8be86e823 | ||
|
|
41b7054aab | ||
|
|
101adcd024 | ||
|
|
a2854aeec9 | ||
|
|
bdc9aee689 | ||
|
|
2f53ae0ab8 | ||
|
|
f76c05448c | ||
|
|
585e7e8177 | ||
|
|
82d8d1d873 | ||
|
|
2c523c86ff | ||
|
|
6616668d4a | ||
|
|
a4d23d527b | ||
|
|
8a3be85e97 | ||
|
|
1a7f2b7379 | ||
|
|
caac82dffd | ||
|
|
27b48378e5 | ||
|
|
cfd3c3ca5c | ||
|
|
41f26b7a4f | ||
|
|
c57ebb1cea | ||
|
|
259aded5cc | ||
|
|
1f5e091dd7 | ||
|
|
bbb1c44977 | ||
|
|
4327ecbfdf | ||
|
|
114c10bc77 | ||
|
|
cecdf29721 | ||
|
|
bd717fc0d7 | ||
|
|
739fff68b3 | ||
|
|
d49cab0afa | ||
|
|
ffebb4fdaf | ||
|
|
32565f0e53 | ||
|
|
61a5889bea | ||
|
|
82bd3e1ea6 | ||
|
|
b800a6fba2 | ||
|
|
1b6dbfdfff | ||
|
|
061a70f1b3 | ||
|
|
f1c1e0dafd | ||
|
|
c3912fdb37 | ||
|
|
356bfa4860 | ||
|
|
38446668c4 | ||
|
|
e2bb3b8015 | ||
|
|
11dcfd703d | ||
|
|
0b09d23bd1 | ||
|
|
879b726537 | ||
|
|
66bbd03262 | ||
|
|
c09b63698f | ||
|
|
bed7db0a33 | ||
|
|
8ff3e234c1 | ||
|
|
296da5a5c4 | ||
|
|
700a4f1ba1 | ||
|
|
6f6663d825 | ||
|
|
844cdc907f | ||
|
|
9e32d4cb92 | ||
|
|
85dc6ba148 | ||
|
|
16c4d27e00 | ||
|
|
69170fe0e0 | ||
|
|
a646ba54b3 | ||
|
|
45d60fc3c8 | ||
|
|
6f0c399ccd | ||
|
|
40e1ca7cb1 | ||
|
|
80cf21e453 | ||
|
|
48c8a3d219 | ||
|
|
31bb1201fc | ||
|
|
08d1b05607 | ||
|
|
d64a14210d | ||
|
|
7e53d33e9b | ||
|
|
ea2b39cc30 | ||
|
|
6b835f95cf | ||
|
|
a229ae5f70 | ||
|
|
84fdc1d8fd | ||
|
|
9b1d52d183 | ||
|
|
14a8b32522 | ||
|
|
ddc09a0d6b | ||
|
|
3b45a3f2fd | ||
|
|
9034a45da0 | ||
|
|
6247fac6c5 | ||
|
|
a5ceaffb0c | ||
|
|
dcee2f9b4e | ||
|
|
f27a2c541e | ||
|
|
83fdc504ff | ||
|
|
2317a23fd4 | ||
|
|
a34c0675cd | ||
|
|
5a8a62b4a3 | ||
|
|
325a554bd1 | ||
|
|
7422943e83 | ||
|
|
23bfea5861 | ||
|
|
605a54eb11 | ||
|
|
a7aaee51e6 | ||
|
|
4b8983858a | ||
|
|
8a8c4d11e1 | ||
|
|
26994684d7 | ||
|
|
14a5e036a4 | ||
|
|
5b1c1ca522 | ||
|
|
a9c8458c51 | ||
|
|
5f31d6cbe1 | ||
|
|
b774bb345d | ||
|
|
7fd891d7b9 | ||
|
|
27cac4a6d7 | ||
|
|
2b71ef1181 | ||
|
|
ae169c7b3a | ||
|
|
d888c99d9a | ||
|
|
0b54917f19 | ||
|
|
c87b215b75 | ||
|
|
e4ba23cbef | ||
|
|
98c005a6e0 | ||
|
|
477fd8a62d | ||
|
|
90999ee709 | ||
|
|
38065f0cdf | ||
|
|
c77d16cdb3 | ||
|
|
9410084e6a | ||
|
|
8528db4de4 | ||
|
|
e0fe5a20b7 | ||
|
|
e16e4d53d1 | ||
|
|
d904fae506 | ||
|
|
f67c0b3db3 | ||
|
|
283d7c6bf0 | ||
|
|
e67c5838a9 | ||
|
|
0e7a7dbbc0 | ||
|
|
63c69b6b95 | ||
|
|
a141cbc7f7 | ||
|
|
6a5352cf3a | ||
|
|
27762637ee | ||
|
|
03108871e9 | ||
|
|
dcebe34891 | ||
|
|
99d510815f | ||
|
|
928962c08b | ||
|
|
cdadd6db1d | ||
|
|
d45b8ae70b | ||
|
|
445a58c864 | ||
|
|
1895b474ea | ||
|
|
fd02627069 | ||
|
|
827adc991d | ||
|
|
651b69e5af | ||
|
|
277e4d49e8 | ||
|
|
8990ff39a5 | ||
|
|
71e4c97255 | ||
|
|
577e960e28 | ||
|
|
f232f75d40 | ||
|
|
cfa44f32eb | ||
|
|
ef920435e9 | ||
|
|
87d05404dd | ||
|
|
535c460f5a | ||
|
|
e1a7f829b4 | ||
|
|
fa1b302474 | ||
|
|
45f73a774c | ||
|
|
2a9e271dc3 | ||
|
|
3d96d9c829 | ||
|
|
844051405d | ||
|
|
625eff2333 | ||
|
|
59e2871065 | ||
|
|
acdc88fb91 | ||
|
|
05eab4e2a9 | ||
|
|
efcd65ae38 | ||
|
|
f82177b9da | ||
|
|
ad60fa942a | ||
|
|
c1c553bad0 | ||
|
|
5272d3cd2a | ||
|
|
588ea02f63 | ||
|
|
d837811813 | ||
|
|
2b4aba2d1b | ||
|
|
50b4da18d9 | ||
|
|
df22f2617e | ||
|
|
ddc69f2268 | ||
|
|
7c62689319 | ||
|
|
280495c533 | ||
|
|
d5c6fbdc3c | ||
|
|
57776a1400 | ||
|
|
156c45aa0e | ||
|
|
2d0dba6bbc | ||
|
|
7241d2ad95 | ||
|
|
4a9eeace00 | ||
|
|
4f9c91f6ff | ||
|
|
7ff13a8f55 | ||
|
|
5741d7f09c | ||
|
|
766d2c8846 | ||
|
|
70a43d0c39 | ||
|
|
cf44258848 | ||
|
|
4db5ec2dd8 | ||
|
|
4983e57e62 | ||
|
|
5b2fc70ca1 | ||
|
|
53af54570c | ||
|
|
e0b4626c22 | ||
|
|
a273a0db58 | ||
|
|
277104ebba | ||
|
|
434e59d5c4 | ||
|
|
bb20907774 | ||
|
|
282425575f | ||
|
|
75501a9051 | ||
|
|
c114cf4029 | ||
|
|
03da7dc994 | ||
|
|
12d5c68f98 | ||
|
|
ec1e359621 | ||
|
|
44fb13ddd7 | ||
|
|
4fd4c5bbed | ||
|
|
a1d31566ed | ||
|
|
dcde3aa811 | ||
|
|
a621141d76 | ||
|
|
0e1fbd7dfc | ||
|
|
27efdf9b8e | ||
|
|
83068b33e9 | ||
|
|
769d9b0517 | ||
|
|
b0ffe5ed7e | ||
|
|
c67a0cd3ce | ||
|
|
48e11a243f | ||
|
|
de904698d8 | ||
|
|
7c8180dcb4 | ||
|
|
da3e101c50 | ||
|
|
7605d228f2 | ||
|
|
3063d74ab9 | ||
|
|
2a4e3fc0cd | ||
|
|
7cc6d63d40 | ||
|
|
d574bbc521 | ||
|
|
6388a7272b | ||
|
|
cd358888d8 | ||
|
|
f427f2324b | ||
|
|
d0e2041b10 | ||
|
|
edce59d238 | ||
|
|
7f75d852c1 | ||
|
|
2683af7d28 | ||
|
|
4223720010 | ||
|
|
1b4508fea7 | ||
|
|
776fa09279 | ||
|
|
5c200aa60d | ||
|
|
9fc6c5f6c8 | ||
|
|
7e06cd4a77 | ||
|
|
c43191d97b | ||
|
|
5706b5eb81 | ||
|
|
5eed930997 | ||
|
|
35e5e50508 | ||
|
|
e88a3d0712 | ||
|
|
13b64af5b2 | ||
|
|
9804c6a729 | ||
|
|
937d415cc2 | ||
|
|
9196154207 | ||
|
|
c907b2aac2 | ||
|
|
b5a9dfa7ec | ||
|
|
113c77b416 | ||
|
|
cad5444400 | ||
|
|
b2b350e4d0 | ||
|
|
80d5d62852 | ||
|
|
75f8833c1a | ||
|
|
99d1f3f28b | ||
|
|
4066cfe011 | ||
|
|
e5f8b06af1 | ||
|
|
485b5a238d | ||
|
|
c42ee6d6e2 | ||
|
|
1fb2fd0f50 | ||
|
|
0fce4adfc5 | ||
|
|
b59086c808 | ||
|
|
fe91463652 | ||
|
|
b9065db109 | ||
|
|
d13da295ed | ||
|
|
0291389c3b | ||
|
|
f417f518cb | ||
|
|
f69f99a209 | ||
|
|
31c4fd7c07 | ||
|
|
613aadd775 | ||
|
|
0f969b4be4 | ||
|
|
f7ac1015b2 | ||
|
|
d7c5d4a03d | ||
|
|
8384c55cce | ||
|
|
be947d1086 | ||
|
|
3924bb2ede | ||
|
|
2e3003c2fc | ||
|
|
5ec15ba0a2 | ||
|
|
c7ccf5c5d7 | ||
|
|
9e8c81a1a6 | ||
|
|
c563e2547f | ||
|
|
00cb697bc7 | ||
|
|
a6a0560059 | ||
|
|
55fa5977c2 | ||
|
|
8b4bc1bc97 | ||
|
|
df403ccbc6 | ||
|
|
1f490d2aae | ||
|
|
1b766b6369 | ||
|
|
3f54da98f8 | ||
|
|
05b98c0f8b | ||
|
|
928e63620b | ||
|
|
ea9b1eb88e | ||
|
|
83a88252e2 | ||
|
|
7a61c19135 | ||
|
|
a2f87f304c | ||
|
|
f9f24d2ad2 | ||
|
|
ed3197a7fd | ||
|
|
772a88e98f | ||
|
|
e22a7f46ad | ||
|
|
f890f2f460 | ||
|
|
e9c17e12dc | ||
|
|
4b908e3024 | ||
|
|
90fd2b5da0 | ||
|
|
d7b4360f11 | ||
|
|
df7011167c | ||
|
|
28a785acb0 | ||
|
|
3ee557bfbe | ||
|
|
af94255166 | ||
|
|
4a0dea3f75 | ||
|
|
6a42bc9655 | ||
|
|
c6c8a7f6b7 | ||
|
|
133dd0e26d | ||
|
|
815339272f | ||
|
|
9c1f340029 | ||
|
|
b72ea9608d |
@@ -6,7 +6,6 @@
|
|||||||
"fixed": [
|
"fixed": [
|
||||||
[
|
[
|
||||||
"cojson",
|
"cojson",
|
||||||
"cojson-storage",
|
|
||||||
"cojson-storage-indexeddb",
|
"cojson-storage-indexeddb",
|
||||||
"cojson-storage-sqlite",
|
"cojson-storage-sqlite",
|
||||||
"cojson-transport-ws",
|
"cojson-transport-ws",
|
||||||
@@ -15,7 +14,8 @@
|
|||||||
"jazz-betterauth-server-plugin",
|
"jazz-betterauth-server-plugin",
|
||||||
"jazz-react-auth-betterauth",
|
"jazz-react-auth-betterauth",
|
||||||
"jazz-run",
|
"jazz-run",
|
||||||
"jazz-tools"
|
"jazz-tools",
|
||||||
|
"community-jazz-vue"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
"access": "public",
|
"access": "public",
|
||||||
|
|||||||
8
.github/CODEOWNERS
vendored
Normal file
8
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
./packages @garden-co/framework
|
||||||
|
./tests @garden-co/framework
|
||||||
|
./packages/quint-ui @garden-co/ui
|
||||||
|
|
||||||
|
./homepage @garden-co/ui
|
||||||
|
./homepage/homepage/content/docs @garden-co/docs
|
||||||
|
./starters @garden-co/docs
|
||||||
|
./examples @garden-co/docs @garden-co/ui
|
||||||
23
.github/pull_request_template.md
vendored
Normal file
23
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Description
|
||||||
|
<!-- Please include a summary of the change and which issue is fixed -->
|
||||||
|
<!-- Please also include relevant motivation and context -->
|
||||||
|
<!-- Include any links to documentation like RFC’s if necessary -->
|
||||||
|
<!-- Add a link to to relevant preview environments or anything that would simplify visual review process -->
|
||||||
|
<!-- Supplemental screenshots and video are encouraged, but the primary description should be in text -->
|
||||||
|
|
||||||
|
## Manual testing instructions
|
||||||
|
|
||||||
|
<!-- Add any actions required to manually test the changes -->
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
- [ ] Tests have been added and/or updated
|
||||||
|
- [ ] Tests have not been updated, because: <!-- Insert reason for not updating tests here -->
|
||||||
|
- [ ] I need help with writing tests
|
||||||
|
|
||||||
|
|
||||||
|
## Checklist
|
||||||
|
|
||||||
|
- [ ] I've updated the part of the docs that are affected the PR changes
|
||||||
|
- [ ] I've generated a changeset, if a version bump is required
|
||||||
|
- [ ] I've updated the jsDoc comments to the public APIs I've modified, or added them when missing
|
||||||
11
.github/workflows/code-quality.yml
vendored
11
.github/workflows/code-quality.yml
vendored
@@ -1,5 +1,11 @@
|
|||||||
name: Code quality
|
name: Code quality
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# For pushes, this lets concurrent runs happen, so each push gets a result.
|
||||||
|
# But for other events (e.g. PRs), we can cancel the previous runs.
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
@@ -16,9 +22,6 @@ jobs:
|
|||||||
- name: Setup Biome
|
- name: Setup Biome
|
||||||
uses: biomejs/setup-biome@v2
|
uses: biomejs/setup-biome@v2
|
||||||
with:
|
with:
|
||||||
version: 1.9.4
|
version: 2.1.3
|
||||||
- name: Run Biome
|
- name: Run Biome
|
||||||
run: biome ci .
|
run: biome ci .
|
||||||
|
|
||||||
- name: Check Catalog Dependencies
|
|
||||||
run: node scripts/check-catalog-deps.js
|
|
||||||
|
|||||||
8
.github/workflows/e2e-rn-test.yml
vendored
8
.github/workflows/e2e-rn-test.yml
vendored
@@ -1,5 +1,11 @@
|
|||||||
name: End-to-End Tests for React Native
|
name: End-to-End Tests for React Native
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# For pushes, this lets concurrent runs happen, so each push gets a result.
|
||||||
|
# But for other events (e.g. PRs), we can cancel the previous runs.
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
types: [opened, synchronize, reopened]
|
types: [opened, synchronize, reopened]
|
||||||
@@ -61,7 +67,7 @@ jobs:
|
|||||||
disable-animations: true
|
disable-animations: true
|
||||||
working-directory: ./examples/chat-rn-expo/
|
working-directory: ./examples/chat-rn-expo/
|
||||||
# killall due to this issue: https://github.com/ReactiveCircus/android-emulator-runner/issues/385
|
# killall due to this issue: https://github.com/ReactiveCircus/android-emulator-runner/issues/385
|
||||||
script: ./test/e2e/run.sh && killall -INT crashpad_handler || true
|
script: ./test/e2e/run.sh && ( killall -INT crashpad_handler || true )
|
||||||
|
|
||||||
- name: Copy Maestro Output
|
- name: Copy Maestro Output
|
||||||
if: steps.e2e_test.outcome != 'success'
|
if: steps.e2e_test.outcome != 'success'
|
||||||
|
|||||||
6
.github/workflows/jazz-run.yml
vendored
6
.github/workflows/jazz-run.yml
vendored
@@ -1,5 +1,11 @@
|
|||||||
name: Jazz Run Tests
|
name: Jazz Run Tests
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# For pushes, this lets concurrent runs happen, so each push gets a result.
|
||||||
|
# But for other events (e.g. PRs), we can cancel the previous runs.
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: ["main"]
|
branches: ["main"]
|
||||||
|
|||||||
46
.github/workflows/playwright-homepage.yml
vendored
46
.github/workflows/playwright-homepage.yml
vendored
@@ -1,46 +0,0 @@
|
|||||||
name: Playwright Tests
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: ["main"]
|
|
||||||
pull_request:
|
|
||||||
types: [opened, synchronize, reopened]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
timeout-minutes: 60
|
|
||||||
runs-on: blacksmith-4vcpu-ubuntu-2404
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
|
|
||||||
- name: Setup Source Code
|
|
||||||
uses: ./.github/actions/source-code/
|
|
||||||
|
|
||||||
- name: Install root dependencies
|
|
||||||
run: pnpm install && pnpm exec turbo build --filter="./packages/*"
|
|
||||||
|
|
||||||
- name: Install project dependencies
|
|
||||||
run: pnpm install
|
|
||||||
working-directory: ./homepage/homepage
|
|
||||||
|
|
||||||
- name: Pnpm Build
|
|
||||||
run: pnpm exec turbo build
|
|
||||||
working-directory: ./homepage/homepage
|
|
||||||
|
|
||||||
- name: Install Playwright Browsers
|
|
||||||
run: pnpm exec playwright install
|
|
||||||
working-directory: ./homepage/homepage
|
|
||||||
|
|
||||||
- name: Run Playwright tests
|
|
||||||
run: pnpm exec playwright test
|
|
||||||
working-directory: ./homepage/homepage
|
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v4
|
|
||||||
if: failure()
|
|
||||||
with:
|
|
||||||
name: homepage-playwright-report
|
|
||||||
path: ./homepage/homepage/playwright-report/
|
|
||||||
retention-days: 30
|
|
||||||
166
.github/workflows/playwright.yml
vendored
166
.github/workflows/playwright.yml
vendored
@@ -1,5 +1,11 @@
|
|||||||
name: Playwright Tests
|
name: Playwright Tests
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# For pushes, this lets concurrent runs happen, so each push gets a result.
|
||||||
|
# But for other events (e.g. PRs), we can cancel the previous runs.
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: ["main"]
|
branches: ["main"]
|
||||||
@@ -13,21 +19,7 @@ jobs:
|
|||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
project: [
|
shard: ["1/2", "2/2"]
|
||||||
"tests/e2e",
|
|
||||||
"examples/chat",
|
|
||||||
"examples/chat-svelte",
|
|
||||||
"examples/clerk",
|
|
||||||
"examples/betterauth",
|
|
||||||
"examples/file-share-svelte",
|
|
||||||
"examples/form",
|
|
||||||
"examples/inspector",
|
|
||||||
"examples/music-player",
|
|
||||||
"examples/organization",
|
|
||||||
"starters/react-passkey-auth",
|
|
||||||
"starters/svelte-passkey-auth",
|
|
||||||
"tests/jazz-svelte"
|
|
||||||
]
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
@@ -37,25 +29,131 @@ jobs:
|
|||||||
- name: Setup Source Code
|
- name: Setup Source Code
|
||||||
uses: ./.github/actions/source-code/
|
uses: ./.github/actions/source-code/
|
||||||
|
|
||||||
- name: Pnpm Build
|
|
||||||
run: |
|
|
||||||
if [ -f .env.test ]; then
|
|
||||||
cp .env.test .env
|
|
||||||
fi
|
|
||||||
pnpm turbo build
|
|
||||||
working-directory: ./${{ matrix.project }}
|
|
||||||
|
|
||||||
- name: Install Playwright Browsers
|
- name: Install Playwright Browsers
|
||||||
run: pnpm exec playwright install
|
run: pnpm exec playwright install
|
||||||
working-directory: ./${{ matrix.project }}
|
|
||||||
|
|
||||||
- name: Run Playwright tests
|
- name: Run Playwright tests for shard ${{ matrix.shard }}
|
||||||
run: pnpm exec playwright test
|
run: |
|
||||||
working-directory: ./${{ matrix.project }}
|
# Parse shard information (e.g., "1/2" -> shard_num=1, total_shards=2)
|
||||||
|
IFS='/' read -r shard_num total_shards <<< "${{ matrix.shard }}"
|
||||||
- uses: actions/upload-artifact@v4
|
shard_index=$((shard_num - 1)) # Convert to 0-based index
|
||||||
if: failure()
|
|
||||||
with:
|
# Debug: Print parsed values
|
||||||
name: ${{ hashFiles(format('{0}/package.json', matrix.project)) }}-playwright-report
|
echo "Parsed shard_num: $shard_num"
|
||||||
path: ./${{ matrix.project }}/playwright-report/
|
echo "Parsed total_shards: $total_shards"
|
||||||
retention-days: 30
|
echo "Calculated shard_index: $shard_index"
|
||||||
|
|
||||||
|
# Define all projects to test
|
||||||
|
all_projects=(
|
||||||
|
"tests/e2e"
|
||||||
|
"examples/chat"
|
||||||
|
"examples/chat-svelte"
|
||||||
|
"examples/community-clerk-vue"
|
||||||
|
"examples/clerk"
|
||||||
|
"examples/betterauth"
|
||||||
|
"examples/file-share-svelte"
|
||||||
|
"examples/form"
|
||||||
|
"examples/inspector"
|
||||||
|
"examples/music-player"
|
||||||
|
"examples/organization"
|
||||||
|
"examples/server-worker-http"
|
||||||
|
"starters/react-passkey-auth"
|
||||||
|
"starters/svelte-passkey-auth"
|
||||||
|
"tests/jazz-svelte"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Calculate which projects this shard should run
|
||||||
|
shard_projects=()
|
||||||
|
for i in "${!all_projects[@]}"; do
|
||||||
|
if [ $((i % total_shards)) -eq $shard_index ]; then
|
||||||
|
shard_projects+=("${all_projects[i]}")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Track project results
|
||||||
|
overall_exit_code=0
|
||||||
|
failed_projects=()
|
||||||
|
passed_projects=()
|
||||||
|
|
||||||
|
echo "=== Running tests for shard ${{ matrix.shard }} ==="
|
||||||
|
echo "Projects in this shard:"
|
||||||
|
printf '%s\n' "${shard_projects[@]}"
|
||||||
|
echo
|
||||||
|
|
||||||
|
# Run tests for each project
|
||||||
|
for project in "${shard_projects[@]}"; do
|
||||||
|
echo "=== Testing project: $project ==="
|
||||||
|
|
||||||
|
# Check if project directory exists
|
||||||
|
if [ ! -d "$project" ]; then
|
||||||
|
echo "❌ FAILED: Project directory $project does not exist"
|
||||||
|
failed_projects+=("$project (directory not found)")
|
||||||
|
overall_exit_code=1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if project has package.json
|
||||||
|
if [ ! -f "$project/package.json" ]; then
|
||||||
|
echo "❌ FAILED: No package.json found in $project"
|
||||||
|
failed_projects+=("$project (no package.json)")
|
||||||
|
overall_exit_code=1
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build the project
|
||||||
|
echo "🔨 Building $project..."
|
||||||
|
cd "$project"
|
||||||
|
|
||||||
|
if [ -f .env.test ]; then
|
||||||
|
cp .env.test .env
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! pnpm turbo build; then
|
||||||
|
echo "❌ BUILD FAILED: $project"
|
||||||
|
failed_projects+=("$project (build failed)")
|
||||||
|
overall_exit_code=1
|
||||||
|
cd - > /dev/null
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Run Playwright tests
|
||||||
|
echo "🧪 Running Playwright tests for $project..."
|
||||||
|
if ! pnpm exec playwright test; then
|
||||||
|
echo "❌ TESTS FAILED: $project"
|
||||||
|
failed_projects+=("$project (tests failed)")
|
||||||
|
overall_exit_code=1
|
||||||
|
else
|
||||||
|
echo "✅ TESTS PASSED: $project"
|
||||||
|
passed_projects+=("$project")
|
||||||
|
fi
|
||||||
|
|
||||||
|
cd - > /dev/null
|
||||||
|
echo "=== Finished testing $project ==="
|
||||||
|
echo
|
||||||
|
done
|
||||||
|
|
||||||
|
# Print summary report
|
||||||
|
echo "=========================================="
|
||||||
|
echo "📊 TEST SUMMARY FOR SHARD ${{ matrix.shard }}"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
if [ ${#passed_projects[@]} -gt 0 ]; then
|
||||||
|
echo "✅ PASSED (${#passed_projects[@]}):"
|
||||||
|
printf ' - %s\n' "${passed_projects[@]}"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${#failed_projects[@]} -gt 0 ]; then
|
||||||
|
echo "❌ FAILED (${#failed_projects[@]}):"
|
||||||
|
printf ' - %s\n' "${failed_projects[@]}"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
echo "Total projects in shard: ${#shard_projects[@]}"
|
||||||
|
echo "Passed: ${#passed_projects[@]}"
|
||||||
|
echo "Failed: ${#failed_projects[@]}"
|
||||||
|
echo "=========================================="
|
||||||
|
|
||||||
|
# Exit with overall status
|
||||||
|
exit $overall_exit_code
|
||||||
|
|||||||
7
.github/workflows/pre-release.yml
vendored
7
.github/workflows/pre-release.yml
vendored
@@ -1,4 +1,11 @@
|
|||||||
name: Pre-Publish tagged Pull Requests
|
name: Pre-Publish tagged Pull Requests
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# For pushes, this lets concurrent runs happen, so each push gets a result.
|
||||||
|
# But for other events (e.g. PRs), we can cancel the previous runs.
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
types: [opened, synchronize, reopened, labeled]
|
types: [opened, synchronize, reopened, labeled]
|
||||||
|
|||||||
6
.github/workflows/unit-test.yml
vendored
6
.github/workflows/unit-test.yml
vendored
@@ -1,5 +1,11 @@
|
|||||||
name: Unit Tests
|
name: Unit Tests
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
# For pushes, this lets concurrent runs happen, so each push gets a result.
|
||||||
|
# But for other events (e.g. PRs), we can cancel the previous runs.
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
types: [opened, synchronize, reopened]
|
types: [opened, synchronize, reopened]
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ You'll need Node.js 22.x installed (we're working on support for 23.x), and pnpm
|
|||||||
4. **Build the packages**:
|
4. **Build the packages**:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pnpm build
|
pnpm build:packages
|
||||||
```
|
```
|
||||||
|
|
||||||
5. **Run tests** to verify everything is working:
|
5. **Run tests** to verify everything is working:
|
||||||
|
|||||||
72
biome.json
72
biome.json
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://biomejs.dev/schemas/1.9.4/schema.json",
|
"$schema": "https://biomejs.dev/schemas/2.1.3/schema.json",
|
||||||
"vcs": {
|
"vcs": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"clientKind": "git",
|
"clientKind": "git",
|
||||||
@@ -7,39 +7,35 @@
|
|||||||
},
|
},
|
||||||
"files": {
|
"files": {
|
||||||
"ignoreUnknown": false,
|
"ignoreUnknown": false,
|
||||||
"ignore": [
|
"includes": [
|
||||||
"jazz-tools.json",
|
"**",
|
||||||
"**/ios/**",
|
"!**/jazz-tools.json",
|
||||||
"**/android/**",
|
"!**/ios/**",
|
||||||
"tests/jazz-svelte/src/**",
|
"!**/android/**",
|
||||||
"examples/*svelte*/**",
|
"!**/tests/jazz-svelte/src/**",
|
||||||
"starters/*svelte*/**",
|
"!**/examples/**/*svelte*/**",
|
||||||
"examples/jazz-paper-scissors/src/routeTree.gen.ts",
|
"!**/starters/**/*svelte*/**",
|
||||||
"homepage/homepage/**",
|
"!**/examples/server-worker-inbox/src/routeTree.gen.ts",
|
||||||
"**/package.json"
|
"!**/homepage/homepage/**",
|
||||||
|
"!**/package.json",
|
||||||
|
"!**/*svelte*/**"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"formatter": {
|
"formatter": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"indentStyle": "space"
|
"indentStyle": "space"
|
||||||
},
|
},
|
||||||
"organizeImports": {
|
"assist": { "actions": { "source": { "organizeImports": "off" } } },
|
||||||
"enabled": true
|
|
||||||
},
|
|
||||||
"linter": {
|
"linter": {
|
||||||
"enabled": false,
|
"enabled": false,
|
||||||
"rules": {
|
"rules": {
|
||||||
"recommended": true,
|
"recommended": true,
|
||||||
"correctness": {
|
"correctness": {
|
||||||
|
"useExhaustiveDependencies": "off",
|
||||||
"useImportExtensions": {
|
"useImportExtensions": {
|
||||||
"level": "error",
|
"level": "error",
|
||||||
"options": {
|
"options": {
|
||||||
"suggestedExtensions": {
|
"forceJsExtensions": true
|
||||||
"ts": {
|
|
||||||
"module": "js",
|
|
||||||
"component": "jsx"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -47,16 +43,7 @@
|
|||||||
},
|
},
|
||||||
"overrides": [
|
"overrides": [
|
||||||
{
|
{
|
||||||
"include": ["packages/**/src/**"],
|
"includes": ["packages/community-jazz-vue/src/**"],
|
||||||
"linter": {
|
|
||||||
"enabled": true,
|
|
||||||
"rules": {
|
|
||||||
"recommended": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"include": ["packages/cojson-storage*/**", "cojson-transport-ws/**"],
|
|
||||||
"linter": {
|
"linter": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"rules": {
|
"rules": {
|
||||||
@@ -65,7 +52,28 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"include": ["**/tests/**"],
|
"includes": ["**/packages/**/src/**"],
|
||||||
|
"linter": {
|
||||||
|
"enabled": true,
|
||||||
|
"rules": {
|
||||||
|
"recommended": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"includes": [
|
||||||
|
"**/packages/cojson/src/storage/**/*/**",
|
||||||
|
"**/cojson-transport-ws/**"
|
||||||
|
],
|
||||||
|
"linter": {
|
||||||
|
"enabled": true,
|
||||||
|
"rules": {
|
||||||
|
"recommended": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"includes": ["**/tests/**"],
|
||||||
"linter": {
|
"linter": {
|
||||||
"rules": {
|
"rules": {
|
||||||
"correctness": {
|
"correctness": {
|
||||||
@@ -75,7 +83,7 @@
|
|||||||
"noNonNullAssertion": "off"
|
"noNonNullAssertion": "off"
|
||||||
},
|
},
|
||||||
"suspicious": {
|
"suspicious": {
|
||||||
"noExplicitAny": "info"
|
"noExplicitAny": "off"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,48 +1,48 @@
|
|||||||
{
|
{
|
||||||
"name": "betterauth",
|
"name": "betterauth",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev --turbopack",
|
"dev": "next dev --turbopack",
|
||||||
"build": "next build",
|
"build": "next build",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "next lint",
|
"lint": "next lint",
|
||||||
"format-and-lint": "biome check .",
|
"format-and-lint": "biome check .",
|
||||||
"format-and-lint:fix": "biome check . --write",
|
"format-and-lint:fix": "biome check . --write",
|
||||||
"test:e2e": "playwright test",
|
"test:e2e": "playwright test",
|
||||||
"test:e2e:ui": "playwright test --ui",
|
"test:e2e:ui": "playwright test --ui",
|
||||||
"email": "email dev --dir src/components/emails"
|
"email": "email dev --dir src/components/emails"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@icons-pack/react-simple-icons": "^12.8.0",
|
"@icons-pack/react-simple-icons": "^12.8.0",
|
||||||
"@radix-ui/react-label": "^2.1.6",
|
"@radix-ui/react-label": "^2.1.6",
|
||||||
"@radix-ui/react-slot": "^1.2.2",
|
"@radix-ui/react-slot": "^1.2.2",
|
||||||
"better-auth": "^1.2.4",
|
"better-auth": "^1.2.4",
|
||||||
"better-sqlite3": "^11.9.1",
|
"better-sqlite3": "^11.9.1",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "^2.1.1",
|
"clsx": "^2.1.1",
|
||||||
"jazz-react-auth-betterauth": "workspace:*",
|
"jazz-react-auth-betterauth": "workspace:*",
|
||||||
"jazz-betterauth-client-plugin": "workspace:*",
|
"jazz-betterauth-client-plugin": "workspace:*",
|
||||||
"jazz-betterauth-server-plugin": "workspace:*",
|
"jazz-betterauth-server-plugin": "workspace:*",
|
||||||
"jazz-tools": "workspace:*",
|
"jazz-tools": "workspace:*",
|
||||||
"lucide-react": "^0.510.0",
|
"lucide-react": "^0.510.0",
|
||||||
"next": "15.3.2",
|
"next": "15.3.2",
|
||||||
"react": "^18.0.0",
|
"react": "19.1.0",
|
||||||
"react-dom": "^18.0.0",
|
"react-dom": "19.1.0",
|
||||||
"sonner": "^2.0.3",
|
"sonner": "^2.0.3",
|
||||||
"tailwind-merge": "^3.3.0",
|
"tailwind-merge": "^3.3.0",
|
||||||
"tw-animate-css": "^1.2.5"
|
"tw-animate-css": "^1.2.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@biomejs/biome": "1.9.4",
|
"@biomejs/biome": "2.1.3",
|
||||||
"@playwright/test": "^1.50.1",
|
"@playwright/test": "^1.50.1",
|
||||||
"@tailwindcss/postcss": "^4",
|
"@tailwindcss/postcss": "^4",
|
||||||
"@types/better-sqlite3": "^7.6.12",
|
"@types/better-sqlite3": "^7.6.12",
|
||||||
"@types/node": "^20",
|
"@types/node": "^20",
|
||||||
"@types/react": "^18",
|
"@types/react": "19.1.0",
|
||||||
"@types/react-dom": "^18",
|
"@types/react-dom": "19.1.0",
|
||||||
"react-email": "^4.0.11",
|
"react-email": "^4.0.11",
|
||||||
"tailwindcss": "^4",
|
"tailwindcss": "^4",
|
||||||
"typescript": "^5"
|
"typescript": "5.6.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,13 +13,13 @@
|
|||||||
"@bacons/text-decoder": "^0.0.0",
|
"@bacons/text-decoder": "^0.0.0",
|
||||||
"@bam.tech/react-native-image-resizer": "^3.0.11",
|
"@bam.tech/react-native-image-resizer": "^3.0.11",
|
||||||
"@react-native-community/netinfo": "11.4.1",
|
"@react-native-community/netinfo": "11.4.1",
|
||||||
"expo": "~53.0.9",
|
"expo": "54.0.0-canary-20250701-6a945c5",
|
||||||
"expo-clipboard": "^7.1.4",
|
"expo-clipboard": "^7.1.4",
|
||||||
"expo-secure-store": "~14.2.3",
|
"expo-secure-store": "~14.2.3",
|
||||||
"expo-sqlite": "~15.2.10",
|
"expo-sqlite": "~15.2.10",
|
||||||
"jazz-tools": "workspace:*",
|
"jazz-tools": "workspace:*",
|
||||||
"react": "19.0.0",
|
"react": "19.1.0",
|
||||||
"react-native": "0.79.2",
|
"react-native": "0.80.0",
|
||||||
"react-native-get-random-values": "^1.11.0",
|
"react-native-get-random-values": "^1.11.0",
|
||||||
"readable-stream": "^4.7.0"
|
"readable-stream": "^4.7.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ react {
|
|||||||
// The root of your project, i.e. where "package.json" lives. Default is '../..'
|
// The root of your project, i.e. where "package.json" lives. Default is '../..'
|
||||||
// root = file("../../")
|
// root = file("../../")
|
||||||
// The folder where the react-native NPM package is. Default is ../../node_modules/react-native
|
// The folder where the react-native NPM package is. Default is ../../node_modules/react-native
|
||||||
// reactNativeDir = file("../../node_modules/react-native")
|
reactNativeDir = file("../../../../node_modules/react-native")
|
||||||
// The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen
|
// The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen
|
||||||
// codegenDir = file("../../node_modules/@react-native/codegen")
|
codegenDir = file("../../../../node_modules/@react-native/codegen")
|
||||||
// The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js
|
// The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js
|
||||||
// cliFile = file("../../node_modules/react-native/cli.js")
|
cliFile = file("../../../../node_modules/react-native/cli.js")
|
||||||
|
|
||||||
/* Variants */
|
/* Variants */
|
||||||
// The list of variants to that are debuggable. For those we're going to
|
// The list of variants to that are debuggable. For those we're going to
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") }
|
pluginManagement { includeBuild("../../../node_modules/@react-native/gradle-plugin") }
|
||||||
plugins { id("com.facebook.react.settings") }
|
plugins { id("com.facebook.react.settings") }
|
||||||
extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() }
|
extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() }
|
||||||
rootProject.name = 'ChatRN'
|
rootProject.name = 'ChatRN'
|
||||||
include ':app'
|
include ':app'
|
||||||
includeBuild('../node_modules/@react-native/gradle-plugin')
|
includeBuild('../../../node_modules/@react-native/gradle-plugin')
|
||||||
|
|||||||
@@ -380,7 +380,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
" ",
|
" ",
|
||||||
);
|
);
|
||||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/react-native";
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
|
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
|
||||||
USE_HERMES = true;
|
USE_HERMES = true;
|
||||||
@@ -452,7 +452,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
" ",
|
" ",
|
||||||
);
|
);
|
||||||
REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native";
|
REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/react-native";
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
USE_HERMES = true;
|
USE_HERMES = true;
|
||||||
VALIDATE_PRODUCT = YES;
|
VALIDATE_PRODUCT = YES;
|
||||||
|
|||||||
@@ -2370,87 +2370,87 @@ PODS:
|
|||||||
- Yoga (0.0.0)
|
- Yoga (0.0.0)
|
||||||
|
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- boost (from `../node_modules/react-native/third-party-podspecs/boost.podspec`)
|
- boost (from `../../../node_modules/react-native/third-party-podspecs/boost.podspec`)
|
||||||
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
|
- DoubleConversion (from `../../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
|
||||||
- fast_float (from `../node_modules/react-native/third-party-podspecs/fast_float.podspec`)
|
- fast_float (from `../../../node_modules/react-native/third-party-podspecs/fast_float.podspec`)
|
||||||
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
|
- FBLazyVector (from `../../../node_modules/react-native/Libraries/FBLazyVector`)
|
||||||
- fmt (from `../node_modules/react-native/third-party-podspecs/fmt.podspec`)
|
- fmt (from `../../../node_modules/react-native/third-party-podspecs/fmt.podspec`)
|
||||||
- glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`)
|
- glog (from `../../../node_modules/react-native/third-party-podspecs/glog.podspec`)
|
||||||
- hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`)
|
- hermes-engine (from `../../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`)
|
||||||
- "op-sqlite (from `../../../node_modules/@op-engineering/op-sqlite`)"
|
- "op-sqlite (from `../../../node_modules/@op-engineering/op-sqlite`)"
|
||||||
- RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
|
- RCT-Folly (from `../../../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`)
|
||||||
- RCTDeprecation (from `../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`)
|
- RCTDeprecation (from `../../../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation`)
|
||||||
- RCTRequired (from `../node_modules/react-native/Libraries/Required`)
|
- RCTRequired (from `../../../node_modules/react-native/Libraries/Required`)
|
||||||
- RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`)
|
- RCTTypeSafety (from `../../../node_modules/react-native/Libraries/TypeSafety`)
|
||||||
- React (from `../node_modules/react-native/`)
|
- React (from `../../../node_modules/react-native/`)
|
||||||
- React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`)
|
- React-callinvoker (from `../../../node_modules/react-native/ReactCommon/callinvoker`)
|
||||||
- React-Core (from `../node_modules/react-native/`)
|
- React-Core (from `../../../node_modules/react-native/`)
|
||||||
- React-Core/RCTWebSocket (from `../node_modules/react-native/`)
|
- React-Core/RCTWebSocket (from `../../../node_modules/react-native/`)
|
||||||
- React-CoreModules (from `../node_modules/react-native/React/CoreModules`)
|
- React-CoreModules (from `../../../node_modules/react-native/React/CoreModules`)
|
||||||
- React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`)
|
- React-cxxreact (from `../../../node_modules/react-native/ReactCommon/cxxreact`)
|
||||||
- React-debug (from `../node_modules/react-native/ReactCommon/react/debug`)
|
- React-debug (from `../../../node_modules/react-native/ReactCommon/react/debug`)
|
||||||
- React-defaultsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/defaults`)
|
- React-defaultsnativemodule (from `../../../node_modules/react-native/ReactCommon/react/nativemodule/defaults`)
|
||||||
- React-domnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/dom`)
|
- React-domnativemodule (from `../../../node_modules/react-native/ReactCommon/react/nativemodule/dom`)
|
||||||
- React-Fabric (from `../node_modules/react-native/ReactCommon`)
|
- React-Fabric (from `../../../node_modules/react-native/ReactCommon`)
|
||||||
- React-FabricComponents (from `../node_modules/react-native/ReactCommon`)
|
- React-FabricComponents (from `../../../node_modules/react-native/ReactCommon`)
|
||||||
- React-FabricImage (from `../node_modules/react-native/ReactCommon`)
|
- React-FabricImage (from `../../../node_modules/react-native/ReactCommon`)
|
||||||
- React-featureflags (from `../node_modules/react-native/ReactCommon/react/featureflags`)
|
- React-featureflags (from `../../../node_modules/react-native/ReactCommon/react/featureflags`)
|
||||||
- React-featureflagsnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`)
|
- React-featureflagsnativemodule (from `../../../node_modules/react-native/ReactCommon/react/nativemodule/featureflags`)
|
||||||
- React-graphics (from `../node_modules/react-native/ReactCommon/react/renderer/graphics`)
|
- React-graphics (from `../../../node_modules/react-native/ReactCommon/react/renderer/graphics`)
|
||||||
- React-hermes (from `../node_modules/react-native/ReactCommon/hermes`)
|
- React-hermes (from `../../../node_modules/react-native/ReactCommon/hermes`)
|
||||||
- React-idlecallbacksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`)
|
- React-idlecallbacksnativemodule (from `../../../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks`)
|
||||||
- React-ImageManager (from `../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`)
|
- React-ImageManager (from `../../../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios`)
|
||||||
- React-jserrorhandler (from `../node_modules/react-native/ReactCommon/jserrorhandler`)
|
- React-jserrorhandler (from `../../../node_modules/react-native/ReactCommon/jserrorhandler`)
|
||||||
- React-jsi (from `../node_modules/react-native/ReactCommon/jsi`)
|
- React-jsi (from `../../../node_modules/react-native/ReactCommon/jsi`)
|
||||||
- React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
|
- React-jsiexecutor (from `../../../node_modules/react-native/ReactCommon/jsiexecutor`)
|
||||||
- React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector-modern`)
|
- React-jsinspector (from `../../../node_modules/react-native/ReactCommon/jsinspector-modern`)
|
||||||
- React-jsinspectorcdp (from `../node_modules/react-native/ReactCommon/jsinspector-modern/cdp`)
|
- React-jsinspectorcdp (from `../../../node_modules/react-native/ReactCommon/jsinspector-modern/cdp`)
|
||||||
- React-jsinspectornetwork (from `../node_modules/react-native/ReactCommon/jsinspector-modern/network`)
|
- React-jsinspectornetwork (from `../../../node_modules/react-native/ReactCommon/jsinspector-modern/network`)
|
||||||
- React-jsinspectortracing (from `../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`)
|
- React-jsinspectortracing (from `../../../node_modules/react-native/ReactCommon/jsinspector-modern/tracing`)
|
||||||
- React-jsitooling (from `../node_modules/react-native/ReactCommon/jsitooling`)
|
- React-jsitooling (from `../../../node_modules/react-native/ReactCommon/jsitooling`)
|
||||||
- React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`)
|
- React-jsitracing (from `../../../node_modules/react-native/ReactCommon/hermes/executor/`)
|
||||||
- React-logger (from `../node_modules/react-native/ReactCommon/logger`)
|
- React-logger (from `../../../node_modules/react-native/ReactCommon/logger`)
|
||||||
- React-Mapbuffer (from `../node_modules/react-native/ReactCommon`)
|
- React-Mapbuffer (from `../../../node_modules/react-native/ReactCommon`)
|
||||||
- React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`)
|
- React-microtasksnativemodule (from `../../../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`)
|
||||||
- react-native-get-random-values (from `../../../node_modules/react-native-get-random-values`)
|
- react-native-get-random-values (from `../../../node_modules/react-native-get-random-values`)
|
||||||
- react-native-mmkv (from `../../../node_modules/react-native-mmkv`)
|
- react-native-mmkv (from `../../../node_modules/react-native-mmkv`)
|
||||||
- "react-native-netinfo (from `../../../node_modules/@react-native-community/netinfo`)"
|
- "react-native-netinfo (from `../../../node_modules/@react-native-community/netinfo`)"
|
||||||
- react-native-safe-area-context (from `../node_modules/react-native-safe-area-context`)
|
- react-native-safe-area-context (from `../../../node_modules/react-native-safe-area-context`)
|
||||||
- React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`)
|
- React-NativeModulesApple (from `../../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`)
|
||||||
- React-oscompat (from `../node_modules/react-native/ReactCommon/oscompat`)
|
- React-oscompat (from `../../../node_modules/react-native/ReactCommon/oscompat`)
|
||||||
- React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`)
|
- React-perflogger (from `../../../node_modules/react-native/ReactCommon/reactperflogger`)
|
||||||
- React-performancetimeline (from `../node_modules/react-native/ReactCommon/react/performance/timeline`)
|
- React-performancetimeline (from `../../../node_modules/react-native/ReactCommon/react/performance/timeline`)
|
||||||
- React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`)
|
- React-RCTActionSheet (from `../../../node_modules/react-native/Libraries/ActionSheetIOS`)
|
||||||
- React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`)
|
- React-RCTAnimation (from `../../../node_modules/react-native/Libraries/NativeAnimation`)
|
||||||
- React-RCTAppDelegate (from `../node_modules/react-native/Libraries/AppDelegate`)
|
- React-RCTAppDelegate (from `../../../node_modules/react-native/Libraries/AppDelegate`)
|
||||||
- React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`)
|
- React-RCTBlob (from `../../../node_modules/react-native/Libraries/Blob`)
|
||||||
- React-RCTFabric (from `../node_modules/react-native/React`)
|
- React-RCTFabric (from `../../../node_modules/react-native/React`)
|
||||||
- React-RCTFBReactNativeSpec (from `../node_modules/react-native/React`)
|
- React-RCTFBReactNativeSpec (from `../../../node_modules/react-native/React`)
|
||||||
- React-RCTImage (from `../node_modules/react-native/Libraries/Image`)
|
- React-RCTImage (from `../../../node_modules/react-native/Libraries/Image`)
|
||||||
- React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`)
|
- React-RCTLinking (from `../../../node_modules/react-native/Libraries/LinkingIOS`)
|
||||||
- React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`)
|
- React-RCTNetwork (from `../../../node_modules/react-native/Libraries/Network`)
|
||||||
- React-RCTRuntime (from `../node_modules/react-native/React/Runtime`)
|
- React-RCTRuntime (from `../../../node_modules/react-native/React/Runtime`)
|
||||||
- React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`)
|
- React-RCTSettings (from `../../../node_modules/react-native/Libraries/Settings`)
|
||||||
- React-RCTText (from `../node_modules/react-native/Libraries/Text`)
|
- React-RCTText (from `../../../node_modules/react-native/Libraries/Text`)
|
||||||
- React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`)
|
- React-RCTVibration (from `../../../node_modules/react-native/Libraries/Vibration`)
|
||||||
- React-rendererconsistency (from `../node_modules/react-native/ReactCommon/react/renderer/consistency`)
|
- React-rendererconsistency (from `../../../node_modules/react-native/ReactCommon/react/renderer/consistency`)
|
||||||
- React-renderercss (from `../node_modules/react-native/ReactCommon/react/renderer/css`)
|
- React-renderercss (from `../../../node_modules/react-native/ReactCommon/react/renderer/css`)
|
||||||
- React-rendererdebug (from `../node_modules/react-native/ReactCommon/react/renderer/debug`)
|
- React-rendererdebug (from `../../../node_modules/react-native/ReactCommon/react/renderer/debug`)
|
||||||
- React-rncore (from `../node_modules/react-native/ReactCommon`)
|
- React-rncore (from `../../../node_modules/react-native/ReactCommon`)
|
||||||
- React-RuntimeApple (from `../node_modules/react-native/ReactCommon/react/runtime/platform/ios`)
|
- React-RuntimeApple (from `../../../node_modules/react-native/ReactCommon/react/runtime/platform/ios`)
|
||||||
- React-RuntimeCore (from `../node_modules/react-native/ReactCommon/react/runtime`)
|
- React-RuntimeCore (from `../../../node_modules/react-native/ReactCommon/react/runtime`)
|
||||||
- React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`)
|
- React-runtimeexecutor (from `../../../node_modules/react-native/ReactCommon/runtimeexecutor`)
|
||||||
- React-RuntimeHermes (from `../node_modules/react-native/ReactCommon/react/runtime`)
|
- React-RuntimeHermes (from `../../../node_modules/react-native/ReactCommon/react/runtime`)
|
||||||
- React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`)
|
- React-runtimescheduler (from `../../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`)
|
||||||
- React-timing (from `../node_modules/react-native/ReactCommon/react/timing`)
|
- React-timing (from `../../../node_modules/react-native/ReactCommon/react/timing`)
|
||||||
- React-utils (from `../node_modules/react-native/ReactCommon/react/utils`)
|
- React-utils (from `../../../node_modules/react-native/ReactCommon/react/utils`)
|
||||||
- ReactAppDependencyProvider (from `build/generated/ios`)
|
- ReactAppDependencyProvider (from `build/generated/ios`)
|
||||||
- ReactCodegen (from `build/generated/ios`)
|
- ReactCodegen (from `build/generated/ios`)
|
||||||
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
|
- ReactCommon/turbomodule/core (from `../../../node_modules/react-native/ReactCommon`)
|
||||||
- "RNCClipboard (from `../../../node_modules/@react-native-clipboard/clipboard`)"
|
- "RNCClipboard (from `../../../node_modules/@react-native-clipboard/clipboard`)"
|
||||||
- RNScreens (from `../node_modules/react-native-screens`)
|
- RNScreens (from `../../../node_modules/react-native-screens`)
|
||||||
- SocketRocket (~> 0.7.1)
|
- SocketRocket (~> 0.7.1)
|
||||||
- Yoga (from `../node_modules/react-native/ReactCommon/yoga`)
|
- Yoga (from `../../../node_modules/react-native/ReactCommon/yoga`)
|
||||||
|
|
||||||
SPEC REPOS:
|
SPEC REPOS:
|
||||||
trunk:
|
trunk:
|
||||||
@@ -2458,88 +2458,88 @@ SPEC REPOS:
|
|||||||
|
|
||||||
EXTERNAL SOURCES:
|
EXTERNAL SOURCES:
|
||||||
boost:
|
boost:
|
||||||
:podspec: "../node_modules/react-native/third-party-podspecs/boost.podspec"
|
:podspec: "../../../node_modules/react-native/third-party-podspecs/boost.podspec"
|
||||||
DoubleConversion:
|
DoubleConversion:
|
||||||
:podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
|
:podspec: "../../../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec"
|
||||||
fast_float:
|
fast_float:
|
||||||
:podspec: "../node_modules/react-native/third-party-podspecs/fast_float.podspec"
|
:podspec: "../../../node_modules/react-native/third-party-podspecs/fast_float.podspec"
|
||||||
FBLazyVector:
|
FBLazyVector:
|
||||||
:path: "../node_modules/react-native/Libraries/FBLazyVector"
|
:path: "../../../node_modules/react-native/Libraries/FBLazyVector"
|
||||||
fmt:
|
fmt:
|
||||||
:podspec: "../node_modules/react-native/third-party-podspecs/fmt.podspec"
|
:podspec: "../../../node_modules/react-native/third-party-podspecs/fmt.podspec"
|
||||||
glog:
|
glog:
|
||||||
:podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec"
|
:podspec: "../../../node_modules/react-native/third-party-podspecs/glog.podspec"
|
||||||
hermes-engine:
|
hermes-engine:
|
||||||
:podspec: "../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec"
|
:podspec: "../../../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec"
|
||||||
:tag: hermes-2025-05-06-RNv0.80.0-4eb6132a5bf0450bf4c6c91987675381d7ac8bca
|
:tag: hermes-2025-05-06-RNv0.80.0-4eb6132a5bf0450bf4c6c91987675381d7ac8bca
|
||||||
op-sqlite:
|
op-sqlite:
|
||||||
:path: "../../../node_modules/@op-engineering/op-sqlite"
|
:path: "../../../node_modules/@op-engineering/op-sqlite"
|
||||||
RCT-Folly:
|
RCT-Folly:
|
||||||
:podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec"
|
:podspec: "../../../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec"
|
||||||
RCTDeprecation:
|
RCTDeprecation:
|
||||||
:path: "../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation"
|
:path: "../../../node_modules/react-native/ReactApple/Libraries/RCTFoundation/RCTDeprecation"
|
||||||
RCTRequired:
|
RCTRequired:
|
||||||
:path: "../node_modules/react-native/Libraries/Required"
|
:path: "../../../node_modules/react-native/Libraries/Required"
|
||||||
RCTTypeSafety:
|
RCTTypeSafety:
|
||||||
:path: "../node_modules/react-native/Libraries/TypeSafety"
|
:path: "../../../node_modules/react-native/Libraries/TypeSafety"
|
||||||
React:
|
React:
|
||||||
:path: "../node_modules/react-native/"
|
:path: "../../../node_modules/react-native/"
|
||||||
React-callinvoker:
|
React-callinvoker:
|
||||||
:path: "../node_modules/react-native/ReactCommon/callinvoker"
|
:path: "../../../node_modules/react-native/ReactCommon/callinvoker"
|
||||||
React-Core:
|
React-Core:
|
||||||
:path: "../node_modules/react-native/"
|
:path: "../../../node_modules/react-native/"
|
||||||
React-CoreModules:
|
React-CoreModules:
|
||||||
:path: "../node_modules/react-native/React/CoreModules"
|
:path: "../../../node_modules/react-native/React/CoreModules"
|
||||||
React-cxxreact:
|
React-cxxreact:
|
||||||
:path: "../node_modules/react-native/ReactCommon/cxxreact"
|
:path: "../../../node_modules/react-native/ReactCommon/cxxreact"
|
||||||
React-debug:
|
React-debug:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/debug"
|
:path: "../../../node_modules/react-native/ReactCommon/react/debug"
|
||||||
React-defaultsnativemodule:
|
React-defaultsnativemodule:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/nativemodule/defaults"
|
:path: "../../../node_modules/react-native/ReactCommon/react/nativemodule/defaults"
|
||||||
React-domnativemodule:
|
React-domnativemodule:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/nativemodule/dom"
|
:path: "../../../node_modules/react-native/ReactCommon/react/nativemodule/dom"
|
||||||
React-Fabric:
|
React-Fabric:
|
||||||
:path: "../node_modules/react-native/ReactCommon"
|
:path: "../../../node_modules/react-native/ReactCommon"
|
||||||
React-FabricComponents:
|
React-FabricComponents:
|
||||||
:path: "../node_modules/react-native/ReactCommon"
|
:path: "../../../node_modules/react-native/ReactCommon"
|
||||||
React-FabricImage:
|
React-FabricImage:
|
||||||
:path: "../node_modules/react-native/ReactCommon"
|
:path: "../../../node_modules/react-native/ReactCommon"
|
||||||
React-featureflags:
|
React-featureflags:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/featureflags"
|
:path: "../../../node_modules/react-native/ReactCommon/react/featureflags"
|
||||||
React-featureflagsnativemodule:
|
React-featureflagsnativemodule:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/nativemodule/featureflags"
|
:path: "../../../node_modules/react-native/ReactCommon/react/nativemodule/featureflags"
|
||||||
React-graphics:
|
React-graphics:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/renderer/graphics"
|
:path: "../../../node_modules/react-native/ReactCommon/react/renderer/graphics"
|
||||||
React-hermes:
|
React-hermes:
|
||||||
:path: "../node_modules/react-native/ReactCommon/hermes"
|
:path: "../../../node_modules/react-native/ReactCommon/hermes"
|
||||||
React-idlecallbacksnativemodule:
|
React-idlecallbacksnativemodule:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks"
|
:path: "../../../node_modules/react-native/ReactCommon/react/nativemodule/idlecallbacks"
|
||||||
React-ImageManager:
|
React-ImageManager:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios"
|
:path: "../../../node_modules/react-native/ReactCommon/react/renderer/imagemanager/platform/ios"
|
||||||
React-jserrorhandler:
|
React-jserrorhandler:
|
||||||
:path: "../node_modules/react-native/ReactCommon/jserrorhandler"
|
:path: "../../../node_modules/react-native/ReactCommon/jserrorhandler"
|
||||||
React-jsi:
|
React-jsi:
|
||||||
:path: "../node_modules/react-native/ReactCommon/jsi"
|
:path: "../../../node_modules/react-native/ReactCommon/jsi"
|
||||||
React-jsiexecutor:
|
React-jsiexecutor:
|
||||||
:path: "../node_modules/react-native/ReactCommon/jsiexecutor"
|
:path: "../../../node_modules/react-native/ReactCommon/jsiexecutor"
|
||||||
React-jsinspector:
|
React-jsinspector:
|
||||||
:path: "../node_modules/react-native/ReactCommon/jsinspector-modern"
|
:path: "../../../node_modules/react-native/ReactCommon/jsinspector-modern"
|
||||||
React-jsinspectorcdp:
|
React-jsinspectorcdp:
|
||||||
:path: "../node_modules/react-native/ReactCommon/jsinspector-modern/cdp"
|
:path: "../../../node_modules/react-native/ReactCommon/jsinspector-modern/cdp"
|
||||||
React-jsinspectornetwork:
|
React-jsinspectornetwork:
|
||||||
:path: "../node_modules/react-native/ReactCommon/jsinspector-modern/network"
|
:path: "../../../node_modules/react-native/ReactCommon/jsinspector-modern/network"
|
||||||
React-jsinspectortracing:
|
React-jsinspectortracing:
|
||||||
:path: "../node_modules/react-native/ReactCommon/jsinspector-modern/tracing"
|
:path: "../../../node_modules/react-native/ReactCommon/jsinspector-modern/tracing"
|
||||||
React-jsitooling:
|
React-jsitooling:
|
||||||
:path: "../node_modules/react-native/ReactCommon/jsitooling"
|
:path: "../../../node_modules/react-native/ReactCommon/jsitooling"
|
||||||
React-jsitracing:
|
React-jsitracing:
|
||||||
:path: "../node_modules/react-native/ReactCommon/hermes/executor/"
|
:path: "../../../node_modules/react-native/ReactCommon/hermes/executor/"
|
||||||
React-logger:
|
React-logger:
|
||||||
:path: "../node_modules/react-native/ReactCommon/logger"
|
:path: "../../../node_modules/react-native/ReactCommon/logger"
|
||||||
React-Mapbuffer:
|
React-Mapbuffer:
|
||||||
:path: "../node_modules/react-native/ReactCommon"
|
:path: "../../../node_modules/react-native/ReactCommon"
|
||||||
React-microtasksnativemodule:
|
React-microtasksnativemodule:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks"
|
:path: "../../../node_modules/react-native/ReactCommon/react/nativemodule/microtasks"
|
||||||
react-native-get-random-values:
|
react-native-get-random-values:
|
||||||
:path: "../../../node_modules/react-native-get-random-values"
|
:path: "../../../node_modules/react-native-get-random-values"
|
||||||
react-native-mmkv:
|
react-native-mmkv:
|
||||||
@@ -2547,75 +2547,75 @@ EXTERNAL SOURCES:
|
|||||||
react-native-netinfo:
|
react-native-netinfo:
|
||||||
:path: "../../../node_modules/@react-native-community/netinfo"
|
:path: "../../../node_modules/@react-native-community/netinfo"
|
||||||
react-native-safe-area-context:
|
react-native-safe-area-context:
|
||||||
:path: "../node_modules/react-native-safe-area-context"
|
:path: "../../../node_modules/react-native-safe-area-context"
|
||||||
React-NativeModulesApple:
|
React-NativeModulesApple:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios"
|
:path: "../../../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios"
|
||||||
React-oscompat:
|
React-oscompat:
|
||||||
:path: "../node_modules/react-native/ReactCommon/oscompat"
|
:path: "../../../node_modules/react-native/ReactCommon/oscompat"
|
||||||
React-perflogger:
|
React-perflogger:
|
||||||
:path: "../node_modules/react-native/ReactCommon/reactperflogger"
|
:path: "../../../node_modules/react-native/ReactCommon/reactperflogger"
|
||||||
React-performancetimeline:
|
React-performancetimeline:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/performance/timeline"
|
:path: "../../../node_modules/react-native/ReactCommon/react/performance/timeline"
|
||||||
React-RCTActionSheet:
|
React-RCTActionSheet:
|
||||||
:path: "../node_modules/react-native/Libraries/ActionSheetIOS"
|
:path: "../../../node_modules/react-native/Libraries/ActionSheetIOS"
|
||||||
React-RCTAnimation:
|
React-RCTAnimation:
|
||||||
:path: "../node_modules/react-native/Libraries/NativeAnimation"
|
:path: "../../../node_modules/react-native/Libraries/NativeAnimation"
|
||||||
React-RCTAppDelegate:
|
React-RCTAppDelegate:
|
||||||
:path: "../node_modules/react-native/Libraries/AppDelegate"
|
:path: "../../../node_modules/react-native/Libraries/AppDelegate"
|
||||||
React-RCTBlob:
|
React-RCTBlob:
|
||||||
:path: "../node_modules/react-native/Libraries/Blob"
|
:path: "../../../node_modules/react-native/Libraries/Blob"
|
||||||
React-RCTFabric:
|
React-RCTFabric:
|
||||||
:path: "../node_modules/react-native/React"
|
:path: "../../../node_modules/react-native/React"
|
||||||
React-RCTFBReactNativeSpec:
|
React-RCTFBReactNativeSpec:
|
||||||
:path: "../node_modules/react-native/React"
|
:path: "../../../node_modules/react-native/React"
|
||||||
React-RCTImage:
|
React-RCTImage:
|
||||||
:path: "../node_modules/react-native/Libraries/Image"
|
:path: "../../../node_modules/react-native/Libraries/Image"
|
||||||
React-RCTLinking:
|
React-RCTLinking:
|
||||||
:path: "../node_modules/react-native/Libraries/LinkingIOS"
|
:path: "../../../node_modules/react-native/Libraries/LinkingIOS"
|
||||||
React-RCTNetwork:
|
React-RCTNetwork:
|
||||||
:path: "../node_modules/react-native/Libraries/Network"
|
:path: "../../../node_modules/react-native/Libraries/Network"
|
||||||
React-RCTRuntime:
|
React-RCTRuntime:
|
||||||
:path: "../node_modules/react-native/React/Runtime"
|
:path: "../../../node_modules/react-native/React/Runtime"
|
||||||
React-RCTSettings:
|
React-RCTSettings:
|
||||||
:path: "../node_modules/react-native/Libraries/Settings"
|
:path: "../../../node_modules/react-native/Libraries/Settings"
|
||||||
React-RCTText:
|
React-RCTText:
|
||||||
:path: "../node_modules/react-native/Libraries/Text"
|
:path: "../../../node_modules/react-native/Libraries/Text"
|
||||||
React-RCTVibration:
|
React-RCTVibration:
|
||||||
:path: "../node_modules/react-native/Libraries/Vibration"
|
:path: "../../../node_modules/react-native/Libraries/Vibration"
|
||||||
React-rendererconsistency:
|
React-rendererconsistency:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/renderer/consistency"
|
:path: "../../../node_modules/react-native/ReactCommon/react/renderer/consistency"
|
||||||
React-renderercss:
|
React-renderercss:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/renderer/css"
|
:path: "../../../node_modules/react-native/ReactCommon/react/renderer/css"
|
||||||
React-rendererdebug:
|
React-rendererdebug:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/renderer/debug"
|
:path: "../../../node_modules/react-native/ReactCommon/react/renderer/debug"
|
||||||
React-rncore:
|
React-rncore:
|
||||||
:path: "../node_modules/react-native/ReactCommon"
|
:path: "../../../node_modules/react-native/ReactCommon"
|
||||||
React-RuntimeApple:
|
React-RuntimeApple:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/runtime/platform/ios"
|
:path: "../../../node_modules/react-native/ReactCommon/react/runtime/platform/ios"
|
||||||
React-RuntimeCore:
|
React-RuntimeCore:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/runtime"
|
:path: "../../../node_modules/react-native/ReactCommon/react/runtime"
|
||||||
React-runtimeexecutor:
|
React-runtimeexecutor:
|
||||||
:path: "../node_modules/react-native/ReactCommon/runtimeexecutor"
|
:path: "../../../node_modules/react-native/ReactCommon/runtimeexecutor"
|
||||||
React-RuntimeHermes:
|
React-RuntimeHermes:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/runtime"
|
:path: "../../../node_modules/react-native/ReactCommon/react/runtime"
|
||||||
React-runtimescheduler:
|
React-runtimescheduler:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler"
|
:path: "../../../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler"
|
||||||
React-timing:
|
React-timing:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/timing"
|
:path: "../../../node_modules/react-native/ReactCommon/react/timing"
|
||||||
React-utils:
|
React-utils:
|
||||||
:path: "../node_modules/react-native/ReactCommon/react/utils"
|
:path: "../../../node_modules/react-native/ReactCommon/react/utils"
|
||||||
ReactAppDependencyProvider:
|
ReactAppDependencyProvider:
|
||||||
:path: build/generated/ios
|
:path: build/generated/ios
|
||||||
ReactCodegen:
|
ReactCodegen:
|
||||||
:path: build/generated/ios
|
:path: build/generated/ios
|
||||||
ReactCommon:
|
ReactCommon:
|
||||||
:path: "../node_modules/react-native/ReactCommon"
|
:path: "../../../node_modules/react-native/ReactCommon"
|
||||||
RNCClipboard:
|
RNCClipboard:
|
||||||
:path: "../../../node_modules/@react-native-clipboard/clipboard"
|
:path: "../../../node_modules/@react-native-clipboard/clipboard"
|
||||||
RNScreens:
|
RNScreens:
|
||||||
:path: "../node_modules/react-native-screens"
|
:path: "../../../node_modules/react-native-screens"
|
||||||
Yoga:
|
Yoga:
|
||||||
:path: "../node_modules/react-native/ReactCommon/yoga"
|
:path: "../../../node_modules/react-native/ReactCommon/yoga"
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90
|
boost: 7e761d76ca2ce687f7cc98e698152abd03a18f90
|
||||||
@@ -2692,7 +2692,7 @@ SPEC CHECKSUMS:
|
|||||||
React-timing: a275a1c2e6112dba17f8f7dd496d439213bbea0d
|
React-timing: a275a1c2e6112dba17f8f7dd496d439213bbea0d
|
||||||
React-utils: 449a6e1fd53886510e284e80bdbb1b1c6db29452
|
React-utils: 449a6e1fd53886510e284e80bdbb1b1c6db29452
|
||||||
ReactAppDependencyProvider: 3267432b637c9b38e86961b287f784ee1b08dde0
|
ReactAppDependencyProvider: 3267432b637c9b38e86961b287f784ee1b08dde0
|
||||||
ReactCodegen: 5d41e1df061200130dd326e55cdfdf94b0289c6e
|
ReactCodegen: d82f538f70f00484d418803f74b5a0ea09cc8689
|
||||||
ReactCommon: b028d09a66e60ebd83ca59d8cc9a1216360db147
|
ReactCommon: b028d09a66e60ebd83ca59d8cc9a1216360db147
|
||||||
RNCClipboard: 54ff19965d7c816febbafe5f520c2c3e7b677a49
|
RNCClipboard: 54ff19965d7c816febbafe5f520c2c3e7b677a49
|
||||||
RNScreens: ee2abe7e0c548eed14e92742e81ed991165c56aa
|
RNScreens: ee2abe7e0c548eed14e92742e81ed991165c56aa
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
"@azure/core-asynciterator-polyfill": "^1.0.2",
|
"@azure/core-asynciterator-polyfill": "^1.0.2",
|
||||||
"@bacons/text-decoder": "0.0.0",
|
"@bacons/text-decoder": "0.0.0",
|
||||||
"@op-engineering/op-sqlite": "14.1.0",
|
"@op-engineering/op-sqlite": "14.1.0",
|
||||||
"@react-native-clipboard/clipboard": "1.16.2",
|
"@react-native-clipboard/clipboard": "1.16.3",
|
||||||
"@react-native-community/netinfo": "11.4.1",
|
"@react-native-community/netinfo": "11.4.1",
|
||||||
"@react-navigation/native": "7.1.14",
|
"@react-navigation/native": "7.1.14",
|
||||||
"@react-navigation/native-stack": "7.3.19",
|
"@react-navigation/native-stack": "7.3.19",
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
"@react-native/typescript-config": "0.80.0",
|
"@react-native/typescript-config": "0.80.0",
|
||||||
"@rnx-kit/metro-config": "^2.0.1",
|
"@rnx-kit/metro-config": "^2.0.1",
|
||||||
"@rnx-kit/metro-resolver-symlinks": "^0.2.5",
|
"@rnx-kit/metro-resolver-symlinks": "^0.2.5",
|
||||||
"@types/react": "19.1.0",
|
"@types/react": "^19.1.0",
|
||||||
"eslint": "^8.19.0",
|
"eslint": "^8.19.0",
|
||||||
"pod-install": "^0.3.5",
|
"pod-install": "^0.3.5",
|
||||||
"prettier": "2.8.8",
|
"prettier": "2.8.8",
|
||||||
|
|||||||
@@ -76,7 +76,9 @@ export function ChatScreen({ navigation }: { navigation: any }) {
|
|||||||
|
|
||||||
const renderMessageItem = ({
|
const renderMessageItem = ({
|
||||||
item,
|
item,
|
||||||
}: { item: Loaded<typeof Message, { text: true }> }) => {
|
}: {
|
||||||
|
item: Loaded<typeof Message, { text: true }>;
|
||||||
|
}) => {
|
||||||
const isMe = item._edits?.text?.by?.isMe;
|
const isMe = item._edits?.text?.by?.isMe;
|
||||||
return (
|
return (
|
||||||
<View
|
<View
|
||||||
|
|||||||
@@ -3,11 +3,7 @@ import React from "react";
|
|||||||
import { Text } from "react-native";
|
import { Text } from "react-native";
|
||||||
import { Chat } from "./schema";
|
import { Chat } from "./schema";
|
||||||
|
|
||||||
export function HandleInviteScreen({
|
export function HandleInviteScreen({ navigation }: { navigation: any }) {
|
||||||
navigation,
|
|
||||||
}: {
|
|
||||||
navigation: any;
|
|
||||||
}) {
|
|
||||||
useAcceptInviteNative({
|
useAcceptInviteNative({
|
||||||
invitedObjectSchema: Chat,
|
invitedObjectSchema: Chat,
|
||||||
onAccept: async (chatId) => {
|
onAccept: async (chatId) => {
|
||||||
|
|||||||
@@ -1,5 +1,242 @@
|
|||||||
# passkey-svelte
|
# passkey-svelte
|
||||||
|
|
||||||
|
## 0.0.122
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [52ea0c7]
|
||||||
|
- jazz-tools@0.17.9
|
||||||
|
|
||||||
|
## 0.0.121
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [ac3e694]
|
||||||
|
- Updated dependencies [6dbb053]
|
||||||
|
- Updated dependencies [1a182f0]
|
||||||
|
- jazz-tools@0.17.8
|
||||||
|
|
||||||
|
## 0.0.120
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- jazz-tools@0.17.7
|
||||||
|
|
||||||
|
## 0.0.119
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [82de51c]
|
||||||
|
- Updated dependencies [694b168]
|
||||||
|
- jazz-tools@0.17.6
|
||||||
|
|
||||||
|
## 0.0.118
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [5963658]
|
||||||
|
- jazz-tools@0.17.5
|
||||||
|
|
||||||
|
## 0.0.117
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [7dd3d00]
|
||||||
|
- jazz-tools@0.17.4
|
||||||
|
|
||||||
|
## 0.0.116
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- jazz-tools@0.17.3
|
||||||
|
|
||||||
|
## 0.0.115
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [794681a]
|
||||||
|
- Updated dependencies [83fc22f]
|
||||||
|
- jazz-tools@0.17.2
|
||||||
|
|
||||||
|
## 0.0.114
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [0bcbf55]
|
||||||
|
- Updated dependencies [d1bdbf5]
|
||||||
|
- Updated dependencies [4b73834]
|
||||||
|
- jazz-tools@0.17.1
|
||||||
|
|
||||||
|
## 0.0.113
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [fcaf4b9]
|
||||||
|
- jazz-tools@0.17.0
|
||||||
|
|
||||||
|
## 0.0.112
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [67e0968]
|
||||||
|
- Updated dependencies [2c8120d]
|
||||||
|
- jazz-tools@0.16.6
|
||||||
|
|
||||||
|
## 0.0.111
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [3cd1586]
|
||||||
|
- Updated dependencies [33ebbf0]
|
||||||
|
- jazz-tools@0.16.5
|
||||||
|
|
||||||
|
## 0.0.110
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [16764f6]
|
||||||
|
- jazz-tools@0.16.4
|
||||||
|
|
||||||
|
## 0.0.109
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [43d3511]
|
||||||
|
- jazz-tools@0.16.3
|
||||||
|
|
||||||
|
## 0.0.108
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- jazz-tools@0.16.2
|
||||||
|
|
||||||
|
## 0.0.107
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [c62abef]
|
||||||
|
- jazz-tools@0.16.1
|
||||||
|
|
||||||
|
## 0.0.106
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- 2bbb07b: Introduce a cleaner separation between Zod and CoValue schemas:
|
||||||
|
- Zod schemas and CoValue schemas are fully separated. Zod schemas can only be composed with other Zod schemas. CoValue schemas can be composed with either Zod or other CoValue schemas.
|
||||||
|
- `z.optional()` and `z.discriminatedUnion()` no longer work with CoValue schemas. Use `co.optional()` and `co.discriminatedUnion()` instead.
|
||||||
|
- Internal schema access is now simpler. You no longer need to use Zod’s `.def` to access internals. Use properties like `CoMapSchema.shape`, `CoListSchema.element`, and `CoOptionalSchema.innerType` directly.
|
||||||
|
- CoValue schema types are now namespaced under `co.`. Non-namespaced exports have been removed
|
||||||
|
- CoMap schemas no longer incorrectly inherit from Zod. Previously, methods like `.extend()` and `.partial()` appeared available but could cause unexpected behavior. These methods are now disabled. In their place, `.optional()` has been added, and more Zod-like methods will be introduced in future releases.
|
||||||
|
- Upgraded Zod from `3.25.28` to `3.25.76`.
|
||||||
|
- Removed deprecated `withHelpers` method from CoValue schemas
|
||||||
|
- Removed deprecated `createCoValueObservable` function
|
||||||
|
- Updated dependencies [c09dcdf]
|
||||||
|
- Updated dependencies [2bbb07b]
|
||||||
|
- jazz-tools@0.16.0
|
||||||
|
|
||||||
|
## 0.0.105
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [9633d01]
|
||||||
|
- Updated dependencies [4beafb7]
|
||||||
|
- jazz-tools@0.15.16
|
||||||
|
|
||||||
|
## 0.0.104
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [3fe53a3]
|
||||||
|
- jazz-tools@0.15.15
|
||||||
|
|
||||||
|
## 0.0.103
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [a584590]
|
||||||
|
- Updated dependencies [9acccb5]
|
||||||
|
- jazz-tools@0.15.14
|
||||||
|
|
||||||
|
## 0.0.102
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [6c76ff8]
|
||||||
|
- jazz-tools@0.15.13
|
||||||
|
|
||||||
|
## 0.0.101
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [d1c1b0c]
|
||||||
|
- Updated dependencies [cf4ad72]
|
||||||
|
- jazz-tools@0.15.12
|
||||||
|
|
||||||
|
## 0.0.100
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [bdc9aee]
|
||||||
|
- jazz-tools@0.15.11
|
||||||
|
|
||||||
|
## 0.0.99
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [9815ec6]
|
||||||
|
- Updated dependencies [b4fdab4]
|
||||||
|
- jazz-tools@0.15.10
|
||||||
|
|
||||||
|
## 0.0.98
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [27b4837]
|
||||||
|
- jazz-tools@0.15.9
|
||||||
|
|
||||||
|
## 0.0.97
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [3844666]
|
||||||
|
- jazz-tools@0.15.8
|
||||||
|
|
||||||
|
## 0.0.96
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [c09b636]
|
||||||
|
- jazz-tools@0.15.7
|
||||||
|
|
||||||
|
## 0.0.95
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [a5ceaff]
|
||||||
|
- jazz-tools@0.15.6
|
||||||
|
|
||||||
|
## 0.0.94
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [23bfea5]
|
||||||
|
- Updated dependencies [e4ba23c]
|
||||||
|
- Updated dependencies [4b89838]
|
||||||
|
- jazz-tools@0.15.5
|
||||||
|
|
||||||
|
## 0.0.93
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- jazz-tools@0.15.4
|
||||||
|
|
||||||
|
## 0.0.92
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies [45f73a7]
|
||||||
|
- jazz-tools@0.15.3
|
||||||
|
|
||||||
## 0.0.91
|
## 0.0.91
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "chat-svelte",
|
"name": "chat-svelte",
|
||||||
"version": "0.0.91",
|
"version": "0.0.122",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { ImageDefinition, type Loaded } from 'jazz-tools';
|
import { ImageDefinition, type Loaded } from 'jazz-tools';
|
||||||
import { useProgressiveImg } from '$lib/utils/useProgressiveImage.svelte';
|
import { Image } from 'jazz-tools/svelte';
|
||||||
let { image }: { image: Loaded<typeof ImageDefinition> } = $props();
|
let { image }: { image: Loaded<typeof ImageDefinition> } = $props();
|
||||||
const { src } = $derived(
|
|
||||||
useProgressiveImg({
|
|
||||||
image
|
|
||||||
})
|
|
||||||
);
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<img class="h-auto max-h-[20rem] max-w-full rounded-t-xl mb-1" {src} alt="" />
|
<Image
|
||||||
|
imageId={image.id}
|
||||||
|
alt=""
|
||||||
|
class="h-auto max-h-[20rem] max-w-full rounded-t-xl mb-1"
|
||||||
|
/>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { co, z } from 'jazz-tools';
|
import { co } from 'jazz-tools';
|
||||||
|
|
||||||
export const Message = co.map({
|
export const Message = co.map({
|
||||||
text: co.plainText(),
|
text: co.plainText(),
|
||||||
image: z.optional(co.image())
|
image: co.optional(co.image())
|
||||||
});
|
});
|
||||||
|
|
||||||
export const Chat = co.list(Message);
|
export const Chat = co.list(Message);
|
||||||
|
|||||||
@@ -1,53 +0,0 @@
|
|||||||
import { ImageDefinition, type Loaded } from 'jazz-tools';
|
|
||||||
import { onDestroy } from 'svelte';
|
|
||||||
|
|
||||||
export function useProgressiveImg({
|
|
||||||
image,
|
|
||||||
maxWidth,
|
|
||||||
targetWidth
|
|
||||||
}: {
|
|
||||||
image: Loaded<typeof ImageDefinition> | null | undefined;
|
|
||||||
maxWidth?: number;
|
|
||||||
targetWidth?: number;
|
|
||||||
}) {
|
|
||||||
let current = $state<{
|
|
||||||
src?: string;
|
|
||||||
res?: `${number}x${number}` | 'placeholder';
|
|
||||||
}>();
|
|
||||||
const originalSize = $state(image?.originalSize);
|
|
||||||
|
|
||||||
const unsubscribe = image?.subscribe({}, (update: Loaded<typeof ImageDefinition>) => {
|
|
||||||
const highestRes = ImageDefinition.highestResAvailable(update, { maxWidth, targetWidth });
|
|
||||||
if (highestRes) {
|
|
||||||
if (highestRes.res !== current?.res) {
|
|
||||||
const blob = highestRes.stream.toBlob();
|
|
||||||
if (blob) {
|
|
||||||
const blobURI = URL.createObjectURL(blob);
|
|
||||||
current = { src: blobURI, res: highestRes.res };
|
|
||||||
|
|
||||||
setTimeout(() => URL.revokeObjectURL(blobURI), 200);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
current = {
|
|
||||||
src: update?.placeholderDataURL,
|
|
||||||
res: 'placeholder'
|
|
||||||
};
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
onDestroy(() => () => {
|
|
||||||
unsubscribe?.();
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
get src() {
|
|
||||||
return current?.src;
|
|
||||||
},
|
|
||||||
get res() {
|
|
||||||
return current?.res;
|
|
||||||
},
|
|
||||||
|
|
||||||
originalSize
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { createImage } from 'jazz-tools/browser-media-images';
|
import { createImage } from 'jazz-tools/media';
|
||||||
import { AccountCoState, CoState } from 'jazz-tools/svelte';
|
import { AccountCoState, CoState } from 'jazz-tools/svelte';
|
||||||
import { Account, CoPlainText, type ID } from 'jazz-tools';
|
import { Account, CoPlainText, type ID } from 'jazz-tools';
|
||||||
|
|
||||||
|
|||||||
@@ -15,21 +15,21 @@
|
|||||||
"clsx": "^2.0.0",
|
"clsx": "^2.0.0",
|
||||||
"hash-slash": "workspace:*",
|
"hash-slash": "workspace:*",
|
||||||
"jazz-tools": "workspace:*",
|
"jazz-tools": "workspace:*",
|
||||||
"lucide-react": "^0.274.0",
|
"lucide-react": "^0.536.0",
|
||||||
"react": "19.0.0",
|
"react": "19.1.0",
|
||||||
"react-dom": "19.0.0",
|
"react-dom": "19.1.0",
|
||||||
"zod": "3.25.28"
|
"zod": "3.25.76"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@playwright/test": "^1.50.1",
|
"@playwright/test": "^1.50.1",
|
||||||
"@tailwindcss/postcss": "^4.1.10",
|
"@tailwindcss/postcss": "^4.1.10",
|
||||||
"@types/react": "19.0.0",
|
"@types/react": "19.1.0",
|
||||||
"@types/react-dom": "19.0.0",
|
"@types/react-dom": "19.1.0",
|
||||||
"@vitejs/plugin-react-swc": "^3.10.1",
|
"@vitejs/plugin-react-swc": "^3.10.1",
|
||||||
"is-ci": "^3.0.1",
|
"is-ci": "^3.0.1",
|
||||||
"postcss": "^8.4.40",
|
"postcss": "^8.4.40",
|
||||||
"tailwindcss": "^4.1.10",
|
"tailwindcss": "^4.1.10",
|
||||||
"typescript": "5.6.2",
|
"typescript": "5.6.2",
|
||||||
"vite": "^6.3.5"
|
"vite": "6.3.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { Account, co } from "jazz-tools";
|
import { Account } from "jazz-tools";
|
||||||
import { createImage, useAccount, useCoState } from "jazz-tools/react";
|
import { createImage } from "jazz-tools/media";
|
||||||
import { useState } from "react";
|
import { useAccount, useCoState } from "jazz-tools/react";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
import { Chat, Message } from "./schema.ts";
|
import { Chat, Message } from "./schema.ts";
|
||||||
import {
|
import {
|
||||||
BubbleBody,
|
BubbleBody,
|
||||||
@@ -15,14 +16,17 @@ import {
|
|||||||
TextInput,
|
TextInput,
|
||||||
} from "./ui.tsx";
|
} from "./ui.tsx";
|
||||||
|
|
||||||
export function ChatScreen(props: { chatID: string }) {
|
const INITIAL_MESSAGES_TO_SHOW = 30;
|
||||||
const chat = useCoState(Chat, props.chatID, {
|
|
||||||
resolve: { $each: { text: true } },
|
|
||||||
});
|
|
||||||
const { me } = useAccount();
|
|
||||||
const [showNLastMessages, setShowNLastMessages] = useState(30);
|
|
||||||
|
|
||||||
if (!chat)
|
export function ChatScreen(props: { chatID: string }) {
|
||||||
|
const chat = useCoState(Chat, props.chatID);
|
||||||
|
const { me } = useAccount();
|
||||||
|
const [showNLastMessages, setShowNLastMessages] = useState(
|
||||||
|
INITIAL_MESSAGES_TO_SHOW,
|
||||||
|
);
|
||||||
|
const isLoading = useMessagesPreload(props.chatID);
|
||||||
|
|
||||||
|
if (!chat || isLoading)
|
||||||
return (
|
return (
|
||||||
<div className="flex-1 flex justify-center items-center">Loading...</div>
|
<div className="flex-1 flex justify-center items-center">Loading...</div>
|
||||||
);
|
);
|
||||||
@@ -37,11 +41,15 @@ export function ChatScreen(props: { chatID: string }) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
createImage(file, { owner: chat._owner }).then((image) => {
|
createImage(file, {
|
||||||
|
owner: chat._owner,
|
||||||
|
progressive: true,
|
||||||
|
placeholder: "blur",
|
||||||
|
}).then((image) => {
|
||||||
chat.push(
|
chat.push(
|
||||||
Message.create(
|
Message.create(
|
||||||
{
|
{
|
||||||
text: co.plainText().create(file.name, chat._owner),
|
text: file.name,
|
||||||
image: image,
|
image: image,
|
||||||
},
|
},
|
||||||
chat._owner,
|
chat._owner,
|
||||||
@@ -59,9 +67,14 @@ export function ChatScreen(props: { chatID: string }) {
|
|||||||
<ChatBody>
|
<ChatBody>
|
||||||
{chat.length > 0 ? (
|
{chat.length > 0 ? (
|
||||||
chat
|
chat
|
||||||
|
// We call slice before reverse to avoid mutating the original array
|
||||||
.slice(-showNLastMessages)
|
.slice(-showNLastMessages)
|
||||||
.reverse() // this plus flex-col-reverse on ChatBody gives us scroll-to-bottom behavior
|
// Reverse plus flex-col-reverse on ChatBody gives us scroll-to-bottom behavior
|
||||||
.map((msg) => <ChatBubble me={me} msg={msg} key={msg.id} />)
|
.reverse()
|
||||||
|
.map(
|
||||||
|
(msg) =>
|
||||||
|
msg?.text && <ChatBubble me={me} msg={msg} key={msg.id} />,
|
||||||
|
)
|
||||||
) : (
|
) : (
|
||||||
<EmptyChatMessage />
|
<EmptyChatMessage />
|
||||||
)}
|
)}
|
||||||
@@ -80,12 +93,7 @@ export function ChatScreen(props: { chatID: string }) {
|
|||||||
|
|
||||||
<TextInput
|
<TextInput
|
||||||
onSubmit={(text) => {
|
onSubmit={(text) => {
|
||||||
chat.push(
|
chat.push(Message.create({ text }, chat._owner));
|
||||||
Message.create(
|
|
||||||
{ text: co.plainText().create(text, chat._owner) },
|
|
||||||
chat._owner,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</InputBar>
|
</InputBar>
|
||||||
@@ -93,10 +101,7 @@ export function ChatScreen(props: { chatID: string }) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function ChatBubble(props: {
|
function ChatBubble(props: { me: Account; msg: Message }) {
|
||||||
me: Account;
|
|
||||||
msg: co.loaded<typeof Message, { text: true }>;
|
|
||||||
}) {
|
|
||||||
if (!props.me.canRead(props.msg) || !props.msg.text?.toString()) {
|
if (!props.me.canRead(props.msg) || !props.msg.text?.toString()) {
|
||||||
return (
|
return (
|
||||||
<BubbleContainer fromMe={false}>
|
<BubbleContainer fromMe={false}>
|
||||||
@@ -126,3 +131,35 @@ function ChatBubble(props: {
|
|||||||
</BubbleContainer>
|
</BubbleContainer>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Warms the local cache with the initial messages to load only the initial messages
|
||||||
|
* and avoid flickering
|
||||||
|
*/
|
||||||
|
function useMessagesPreload(chatID: string) {
|
||||||
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
preloadChatMessages(chatID).finally(() => {
|
||||||
|
setIsLoading(false);
|
||||||
|
});
|
||||||
|
}, [chatID]);
|
||||||
|
|
||||||
|
return isLoading;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function preloadChatMessages(chatID: string) {
|
||||||
|
const chat = await Chat.load(chatID);
|
||||||
|
|
||||||
|
if (!chat?._refs) return;
|
||||||
|
|
||||||
|
const promises = [];
|
||||||
|
|
||||||
|
for (const msg of Array.from(chat._refs)
|
||||||
|
.reverse()
|
||||||
|
.slice(0, INITIAL_MESSAGES_TO_SHOW)) {
|
||||||
|
promises.push(Message.load(msg.id, { resolve: { text: true } }));
|
||||||
|
}
|
||||||
|
|
||||||
|
await Promise.all(promises);
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { co, z } from "jazz-tools";
|
import { co } from "jazz-tools";
|
||||||
|
|
||||||
export const Message = co.map({
|
export const Message = co.map({
|
||||||
text: co.plainText(),
|
text: co.plainText(),
|
||||||
image: z.optional(co.image()),
|
image: co.optional(co.image()),
|
||||||
});
|
});
|
||||||
export type Message = co.loaded<typeof Message>;
|
export type Message = co.loaded<typeof Message>;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import clsx from "clsx";
|
import clsx from "clsx";
|
||||||
import { CoPlainText, ImageDefinition } from "jazz-tools";
|
import { CoPlainText, ImageDefinition } from "jazz-tools";
|
||||||
import { ProgressiveImg } from "jazz-tools/react";
|
import { Image } from "jazz-tools/react";
|
||||||
import { ImageIcon } from "lucide-react";
|
import { ImageIcon } from "lucide-react";
|
||||||
import { useId, useRef } from "react";
|
import { useId, useRef } from "react";
|
||||||
|
|
||||||
@@ -83,14 +83,12 @@ export function BubbleText(props: {
|
|||||||
|
|
||||||
export function BubbleImage(props: { image: ImageDefinition }) {
|
export function BubbleImage(props: { image: ImageDefinition }) {
|
||||||
return (
|
return (
|
||||||
<ProgressiveImg image={props.image}>
|
<Image
|
||||||
{({ src }) => (
|
imageId={props.image.id}
|
||||||
<img
|
className="h-auto max-h-80 max-w-full rounded-t-xl mb-1"
|
||||||
className="h-auto max-h-80 max-w-full rounded-t-xl mb-1"
|
height="original"
|
||||||
src={src}
|
width="original"
|
||||||
/>
|
/>
|
||||||
)}
|
|
||||||
</ProgressiveImg>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,7 +110,9 @@ export function InputBar(props: { children: React.ReactNode }) {
|
|||||||
|
|
||||||
export function ImageInput({
|
export function ImageInput({
|
||||||
onImageChange,
|
onImageChange,
|
||||||
}: { onImageChange?: (event: React.ChangeEvent<HTMLInputElement>) => void }) {
|
}: {
|
||||||
|
onImageChange?: (event: React.ChangeEvent<HTMLInputElement>) => void;
|
||||||
|
}) {
|
||||||
const inputRef = useRef<HTMLInputElement>(null);
|
const inputRef = useRef<HTMLInputElement>(null);
|
||||||
|
|
||||||
const onUploadClick = () => {
|
const onUploadClick = () => {
|
||||||
|
|||||||
@@ -14,21 +14,21 @@
|
|||||||
"@bam.tech/react-native-image-resizer": "^3.0.11",
|
"@bam.tech/react-native-image-resizer": "^3.0.11",
|
||||||
"@clerk/clerk-expo": "^2.13.1",
|
"@clerk/clerk-expo": "^2.13.1",
|
||||||
"@react-native-community/netinfo": "11.4.1",
|
"@react-native-community/netinfo": "11.4.1",
|
||||||
"expo": "~53.0.9",
|
"expo": "54.0.0-canary-20250701-6a945c5",
|
||||||
"expo-crypto": "~14.1.5",
|
"expo-crypto": "~14.1.5",
|
||||||
"expo-linking": "~7.1.5",
|
"expo-linking": "~7.1.5",
|
||||||
"expo-secure-store": "~14.2.3",
|
"expo-secure-store": "~14.2.3",
|
||||||
"expo-sqlite": "~15.2.10",
|
"expo-sqlite": "~15.2.10",
|
||||||
"expo-web-browser": "~14.2.0",
|
"expo-web-browser": "~14.2.0",
|
||||||
"jazz-tools": "workspace:*",
|
"jazz-tools": "workspace:*",
|
||||||
"react": "19.0.0",
|
"react": "19.1.0",
|
||||||
"react-native": "0.79.2",
|
"react-native": "0.80.0",
|
||||||
"react-native-get-random-values": "^1.11.0",
|
"react-native-get-random-values": "^1.11.0",
|
||||||
"readable-stream": "^4.7.0"
|
"readable-stream": "^4.7.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.25.2",
|
"@babel/core": "^7.25.2",
|
||||||
"@types/react": "~19.0.10",
|
"@types/react": "^19.0.10",
|
||||||
"typescript": "~5.8.3"
|
"typescript": "~5.8.3"
|
||||||
},
|
},
|
||||||
"private": true
|
"private": true
|
||||||
|
|||||||
@@ -10,7 +10,9 @@ import {
|
|||||||
|
|
||||||
export function SignInScreen({
|
export function SignInScreen({
|
||||||
setPage,
|
setPage,
|
||||||
}: { setPage: (page: "sign-in" | "sign-up") => void }) {
|
}: {
|
||||||
|
setPage: (page: "sign-in" | "sign-up") => void;
|
||||||
|
}) {
|
||||||
const { signIn, setActive, isLoaded } = useSignIn();
|
const { signIn, setActive, isLoaded } = useSignIn();
|
||||||
|
|
||||||
const [emailAddress, setEmailAddress] = useState("");
|
const [emailAddress, setEmailAddress] = useState("");
|
||||||
|
|||||||
@@ -10,7 +10,9 @@ import {
|
|||||||
|
|
||||||
export function SignUpScreen({
|
export function SignUpScreen({
|
||||||
setPage,
|
setPage,
|
||||||
}: { setPage: (page: "sign-in" | "sign-up") => void }) {
|
}: {
|
||||||
|
setPage: (page: "sign-in" | "sign-up") => void;
|
||||||
|
}) {
|
||||||
const { isLoaded, signUp, setActive } = useSignUp();
|
const { isLoaded, signUp, setActive } = useSignUp();
|
||||||
|
|
||||||
const [emailAddress, setEmailAddress] = React.useState("");
|
const [emailAddress, setEmailAddress] = React.useState("");
|
||||||
|
|||||||
@@ -9,8 +9,10 @@
|
|||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div id="root"></div>
|
<div id="root">
|
||||||
|
<p>Loading...</p>
|
||||||
|
</div>
|
||||||
<script type="module" src="/src/main.tsx"></script>
|
<script type="module" src="/src/main.tsx"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -14,17 +14,17 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@clerk/clerk-react": "^5.4.1",
|
"@clerk/clerk-react": "^5.4.1",
|
||||||
"jazz-tools": "workspace:*",
|
"jazz-tools": "workspace:*",
|
||||||
"react": "19.0.0",
|
"react": "19.1.0",
|
||||||
"react-dom": "19.0.0"
|
"react-dom": "19.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@playwright/test": "^1.50.1",
|
"@playwright/test": "^1.50.1",
|
||||||
"@biomejs/biome": "1.9.4",
|
"@biomejs/biome": "2.1.3",
|
||||||
"@types/react": "19.0.0",
|
"@types/react": "19.1.0",
|
||||||
"@types/react-dom": "19.0.0",
|
"@types/react-dom": "19.1.0",
|
||||||
"@vitejs/plugin-react": "^4.5.1",
|
"@vitejs/plugin-react": "^4.5.1",
|
||||||
"globals": "^15.11.0",
|
"globals": "^15.11.0",
|
||||||
"typescript": "5.6.2",
|
"typescript": "5.6.2",
|
||||||
"vite": "^6.3.5"
|
"vite": "6.3.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ function JazzProvider({ children }: { children: ReactNode }) {
|
|||||||
sync={{
|
sync={{
|
||||||
peer: `wss://cloud.jazz.tools/?key=${apiKey}`,
|
peer: `wss://cloud.jazz.tools/?key=${apiKey}`,
|
||||||
}}
|
}}
|
||||||
|
fallback={<p>Loading...</p>}
|
||||||
>
|
>
|
||||||
{children}
|
{children}
|
||||||
</JazzReactProviderWithClerk>
|
</JazzReactProviderWithClerk>
|
||||||
|
|||||||
6
examples/community-chat-vue/.gitignore
vendored
Normal file
6
examples/community-chat-vue/.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
dist
|
||||||
|
# env files
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
!.env.test
|
||||||
7
examples/community-chat-vue/CHANGELOG.md
Normal file
7
examples/community-chat-vue/CHANGELOG.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# community-chat-vue
|
||||||
|
|
||||||
|
## 0.15.4
|
||||||
|
|
||||||
|
- rewrite from React to Vue
|
||||||
|
- jazz-tools@0.15.4
|
||||||
|
- community-jazz-vue@0.15.4
|
||||||
60
examples/community-chat-vue/README.md
Normal file
60
examples/community-chat-vue/README.md
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
# Chat example with Jazz and Vue
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
|
||||||
|
You can either
|
||||||
|
1. Clone the jazz repository, and run the app within the monorepo.
|
||||||
|
2. Or create a new Jazz project using this example as a template.
|
||||||
|
|
||||||
|
### Using the example as a template
|
||||||
|
|
||||||
|
Create a new Jazz project, and use this example as a template.
|
||||||
|
```bash
|
||||||
|
npx create-jazz-app@latest chat-vue-app --example community-chat-vue
|
||||||
|
```
|
||||||
|
|
||||||
|
Go to the new project directory.
|
||||||
|
```bash
|
||||||
|
cd chat-vue-app
|
||||||
|
```
|
||||||
|
|
||||||
|
Run the dev server.
|
||||||
|
```bash
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using the monorepo
|
||||||
|
|
||||||
|
This requires `pnpm` to be installed, see [https://pnpm.io/installation](https://pnpm.io/installation).
|
||||||
|
|
||||||
|
Clone the jazz repository.
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/garden-co/jazz.git
|
||||||
|
```
|
||||||
|
|
||||||
|
Install and build dependencies.
|
||||||
|
```bash
|
||||||
|
pnpm i && npx turbo build
|
||||||
|
```
|
||||||
|
|
||||||
|
Go to the example directory.
|
||||||
|
```bash
|
||||||
|
cd jazz/examples/community-chat-vue/
|
||||||
|
```
|
||||||
|
|
||||||
|
Start the dev server.
|
||||||
|
```bash
|
||||||
|
pnpm dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Open [http://localhost:5173](http://localhost:5173) with your browser to see the result.
|
||||||
|
|
||||||
|
## Questions / problems / feedback
|
||||||
|
|
||||||
|
If you have feedback, let us know on [Discord](https://discord.gg/utDMjHYg42) or open an issue or PR to fix something that seems wrong.
|
||||||
|
|
||||||
|
## Configuration: sync server
|
||||||
|
|
||||||
|
By default, the example app uses [Jazz Cloud](https://jazz.tools/cloud) (`wss://cloud.jazz.tools`) - so cross-device use, invites and collaboration should just work.
|
||||||
|
|
||||||
|
You can also run a local sync server by running `npx jazz-run sync`, and setting the `sync` parameter of `JazzProvider` in [./src/main.ts](./src/main.ts) to `{ peer: "ws://localhost:4200" }`.
|
||||||
1
examples/community-chat-vue/env.d.ts
vendored
Normal file
1
examples/community-chat-vue/env.d.ts
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/// <reference types="vite/client" />
|
||||||
13
examples/community-chat-vue/index.html
Normal file
13
examples/community-chat-vue/index.html
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Jazz Chat Vue Example</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/src/main.ts"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
37
examples/community-chat-vue/package.json
Normal file
37
examples/community-chat-vue/package.json
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"name": "community-chat-vue",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build-type-check": "run-p type-check \"build {@}\" --",
|
||||||
|
"preview": "vite preview",
|
||||||
|
"build": "vite build",
|
||||||
|
"type-check": "vue-tsc --build --force",
|
||||||
|
"format-and-lint": "biome check .",
|
||||||
|
"format-and-lint:fix": "biome check . --write"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"jazz-tools": "workspace:*",
|
||||||
|
"community-jazz-vue": "workspace:*",
|
||||||
|
"vue": "^3.5.11",
|
||||||
|
"vue-router": "^4.4.5"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@tsconfig/node20": "^20.1.4",
|
||||||
|
"@types/node": "^22.5.1",
|
||||||
|
"@vitejs/plugin-vue": "^5.1.4",
|
||||||
|
"@vitejs/plugin-vue-jsx": "^4.0.1",
|
||||||
|
"@vue/tsconfig": "^0.5.1",
|
||||||
|
"eslint": "^9.7.0",
|
||||||
|
"eslint-plugin-vue": "^9.28.0",
|
||||||
|
"npm-run-all2": "^6.2.3",
|
||||||
|
"postcss": "^8.4.40",
|
||||||
|
"@tailwindcss/postcss": "^4.1.10",
|
||||||
|
"tailwindcss": "^4.1.10",
|
||||||
|
"typescript": "5.6.2",
|
||||||
|
"vite": "6.3.5",
|
||||||
|
"vite-plugin-vue-devtools": "^7.4.6",
|
||||||
|
"vue-tsc": "^2.1.6"
|
||||||
|
}
|
||||||
|
}
|
||||||
5
examples/community-chat-vue/postcss.config.js
Normal file
5
examples/community-chat-vue/postcss.config.js
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
export default {
|
||||||
|
plugins: {
|
||||||
|
"@tailwindcss/postcss": {},
|
||||||
|
},
|
||||||
|
};
|
||||||
BIN
examples/community-chat-vue/public/favicon.ico
Normal file
BIN
examples/community-chat-vue/public/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
24
examples/community-chat-vue/src/App.vue
Normal file
24
examples/community-chat-vue/src/App.vue
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<template>
|
||||||
|
<AppContainer>
|
||||||
|
<TopBar v-if="me">
|
||||||
|
<p>{{ me.profile?.name }}</p>
|
||||||
|
<button @click="logoutHandler">Log out</button>
|
||||||
|
</TopBar>
|
||||||
|
<router-view />
|
||||||
|
</AppContainer>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { useAccount } from "community-jazz-vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
import AppContainer from "./components/AppContainer.vue";
|
||||||
|
import TopBar from "./components/TopBar.vue";
|
||||||
|
|
||||||
|
const { me, logOut } = useAccount();
|
||||||
|
const router = useRouter();
|
||||||
|
|
||||||
|
async function logoutHandler() {
|
||||||
|
await logOut();
|
||||||
|
router.push("/");
|
||||||
|
}
|
||||||
|
</script>
|
||||||
24
examples/community-chat-vue/src/RootApp.vue
Normal file
24
examples/community-chat-vue/src/RootApp.vue
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { JazzVueProvider, PasskeyAuthBasicUI } from "community-jazz-vue";
|
||||||
|
import { h } from "vue";
|
||||||
|
import "jazz-tools/inspector/register-custom-element";
|
||||||
|
import App from "./App.vue";
|
||||||
|
import { apiKey } from "./apiKey";
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<JazzVueProvider
|
||||||
|
:sync="{
|
||||||
|
peer: `wss://cloud.jazz.tools/?key=${apiKey}`,
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<PasskeyAuthBasicUI appName="Jazz Vue Chat">
|
||||||
|
<App />
|
||||||
|
</PasskeyAuthBasicUI>
|
||||||
|
<component
|
||||||
|
:is="h('jazz-inspector', {
|
||||||
|
style: { position: 'fixed', left: '20px', bottom: '20px', zIndex: 9999 }
|
||||||
|
})"
|
||||||
|
/>
|
||||||
|
</JazzVueProvider>
|
||||||
|
</template>
|
||||||
1
examples/community-chat-vue/src/apiKey.ts
Normal file
1
examples/community-chat-vue/src/apiKey.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export const apiKey = "chat-example-jazz@garden.co";
|
||||||
76
examples/community-chat-vue/src/assets/base.css
Normal file
76
examples/community-chat-vue/src/assets/base.css
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/* color palette from <https://github.com/vuejs/theme> */
|
||||||
|
:root {
|
||||||
|
--vt-c-white: #ffffff;
|
||||||
|
--vt-c-white-soft: #f8f8f8;
|
||||||
|
--vt-c-white-mute: #f2f2f2;
|
||||||
|
|
||||||
|
--vt-c-black: #181818;
|
||||||
|
--vt-c-black-soft: #222222;
|
||||||
|
--vt-c-black-mute: #282828;
|
||||||
|
|
||||||
|
--vt-c-indigo: #2c3e50;
|
||||||
|
|
||||||
|
--vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
|
||||||
|
--vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
|
||||||
|
--vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);
|
||||||
|
--vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
|
||||||
|
|
||||||
|
--vt-c-text-light-1: var(--vt-c-indigo);
|
||||||
|
--vt-c-text-light-2: rgba(60, 60, 60, 0.66);
|
||||||
|
--vt-c-text-dark-1: var(--vt-c-white);
|
||||||
|
--vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* semantic color variables for this project */
|
||||||
|
:root {
|
||||||
|
--color-background: var(--vt-c-white);
|
||||||
|
--color-background-soft: var(--vt-c-white-soft);
|
||||||
|
--color-background-mute: var(--vt-c-white-mute);
|
||||||
|
|
||||||
|
--color-border: var(--vt-c-divider-light-2);
|
||||||
|
--color-border-hover: var(--vt-c-divider-light-1);
|
||||||
|
|
||||||
|
--color-heading: var(--vt-c-text-light-1);
|
||||||
|
--color-text: var(--vt-c-text-light-1);
|
||||||
|
|
||||||
|
--section-gap: 160px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root {
|
||||||
|
--color-background: var(--vt-c-black);
|
||||||
|
--color-background-soft: var(--vt-c-black-soft);
|
||||||
|
--color-background-mute: var(--vt-c-black-mute);
|
||||||
|
|
||||||
|
--color-border: var(--vt-c-divider-dark-2);
|
||||||
|
--color-border-hover: var(--vt-c-divider-dark-1);
|
||||||
|
|
||||||
|
--color-heading: var(--vt-c-text-dark-1);
|
||||||
|
--color-text: var(--vt-c-text-dark-2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*,
|
||||||
|
*::before,
|
||||||
|
*::after {
|
||||||
|
box-sizing: border-box;
|
||||||
|
margin: 0;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
min-height: 100vh;
|
||||||
|
color: var(--color-text);
|
||||||
|
background: var(--color-background);
|
||||||
|
transition:
|
||||||
|
color 0.5s,
|
||||||
|
background-color 0.5s;
|
||||||
|
line-height: 1.6;
|
||||||
|
font-family:
|
||||||
|
Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu,
|
||||||
|
Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
|
||||||
|
font-size: 15px;
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
1
examples/community-chat-vue/src/assets/logo.svg
Normal file
1
examples/community-chat-vue/src/assets/logo.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg>
|
||||||
|
After Width: | Height: | Size: 276 B |
35
examples/community-chat-vue/src/assets/main.css
Normal file
35
examples/community-chat-vue/src/assets/main.css
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
@import "./base.css";
|
||||||
|
|
||||||
|
#app {
|
||||||
|
max-width: 1280px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 2rem;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
a,
|
||||||
|
.green {
|
||||||
|
text-decoration: none;
|
||||||
|
color: hsla(160, 100%, 37%, 1);
|
||||||
|
transition: 0.4s;
|
||||||
|
padding: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (hover: hover) {
|
||||||
|
a:hover {
|
||||||
|
background-color: hsla(160, 100%, 37%, 0.2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 1024px) {
|
||||||
|
body {
|
||||||
|
display: flex;
|
||||||
|
place-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#app {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
padding: 0 2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
13
examples/community-chat-vue/src/components/AppContainer.vue
Normal file
13
examples/community-chat-vue/src/components/AppContainer.vue
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="flex flex-col justify-between w-screen h-screen bg-stone-50 dark:bg-black dark:text-white"
|
||||||
|
>
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
export default {
|
||||||
|
name: "AppContainer",
|
||||||
|
};
|
||||||
|
</script>
|
||||||
13
examples/community-chat-vue/src/components/BubbleBody.vue
Normal file
13
examples/community-chat-vue/src/components/BubbleBody.vue
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="rounded-2xl text-sm line-clamp-10 text-ellipsis bg-white max-w-full whitespace-pre-wrap dark:bg-stone-700 dark:text-white py-1 px-3 shadow-sm"
|
||||||
|
>
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
export default {
|
||||||
|
name: "BubbleBody",
|
||||||
|
};
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<template>
|
||||||
|
<div :class="[alignClass, 'flex flex-col m-2']" role="row">
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
export default {
|
||||||
|
name: "BubbleContainer",
|
||||||
|
props: {
|
||||||
|
fromMe: {
|
||||||
|
type: Boolean,
|
||||||
|
default: undefined,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
alignClass() {
|
||||||
|
return this.fromMe ? "items-end" : "items-start";
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
30
examples/community-chat-vue/src/components/BubbleImage.vue
Normal file
30
examples/community-chat-vue/src/components/BubbleImage.vue
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
<template>
|
||||||
|
<div class="h-auto max-w-full rounded-t-xl mb-1">
|
||||||
|
<Image
|
||||||
|
:image-id="image.id"
|
||||||
|
alt="Uploaded image"
|
||||||
|
class-names="h-full rounded-t-xl"
|
||||||
|
width="original"
|
||||||
|
height="original"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from "vue";
|
||||||
|
import { type ImageDefinition } from "jazz-tools";
|
||||||
|
import { Image } from "community-jazz-vue";
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: "BubbleImage",
|
||||||
|
components: {
|
||||||
|
Image,
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
image: {
|
||||||
|
type: Object as () => ImageDefinition,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
29
examples/community-chat-vue/src/components/BubbleInfo.vue
Normal file
29
examples/community-chat-vue/src/components/BubbleInfo.vue
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<template>
|
||||||
|
<div class="text-xs text-neutral-500 mt-1.5">
|
||||||
|
{{ by }} · {{ formattedTime }}
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { computed, defineComponent } from "vue";
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: "BubbleInfo",
|
||||||
|
props: {
|
||||||
|
by: {
|
||||||
|
type: String,
|
||||||
|
default: "",
|
||||||
|
},
|
||||||
|
madeAt: {
|
||||||
|
type: Date,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup(props) {
|
||||||
|
const formattedTime = computed(() => props.madeAt.toLocaleTimeString());
|
||||||
|
return {
|
||||||
|
formattedTime,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
11
examples/community-chat-vue/src/components/ChatBody.vue
Normal file
11
examples/community-chat-vue/src/components/ChatBody.vue
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<template>
|
||||||
|
<div class="flex-1 overflow-y-auto flex flex-col-reverse" role="application">
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
export default {
|
||||||
|
name: "ChatBody",
|
||||||
|
};
|
||||||
|
</script>
|
||||||
40
examples/community-chat-vue/src/components/ChatBubble.vue
Normal file
40
examples/community-chat-vue/src/components/ChatBubble.vue
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
<template>
|
||||||
|
<BubbleContainer :fromMe="lastEdit.by?.isMe">
|
||||||
|
<BubbleBody>
|
||||||
|
<BubbleImage v-if="msg.image" :image="msg.image" />
|
||||||
|
{{ msg.text }}
|
||||||
|
</BubbleBody>
|
||||||
|
<BubbleInfo :by="lastEdit.by?.profile?.name" :madeAt="lastEdit.madeAt" />
|
||||||
|
</BubbleContainer>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { computed, defineComponent } from "vue";
|
||||||
|
import BubbleBody from "./BubbleBody.vue";
|
||||||
|
import BubbleContainer from "./BubbleContainer.vue";
|
||||||
|
import BubbleInfo from "./BubbleInfo.vue";
|
||||||
|
import BubbleImage from "./BubbleImage.vue";
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: "ChatBubble",
|
||||||
|
components: {
|
||||||
|
BubbleContainer,
|
||||||
|
BubbleBody,
|
||||||
|
BubbleInfo,
|
||||||
|
BubbleImage,
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
msg: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup(props) {
|
||||||
|
const lastEdit = computed(() => props.msg._edits.text);
|
||||||
|
return {
|
||||||
|
lastEdit,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
55
examples/community-chat-vue/src/components/ChatInput.vue
Normal file
55
examples/community-chat-vue/src/components/ChatInput.vue
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="p-3 bg-white border-t shadow-2xl mt-auto dark:bg-transparent dark:border-stone-800 flex gap-1"
|
||||||
|
>
|
||||||
|
<ImageInput @image-change="handleImageChange" />
|
||||||
|
|
||||||
|
<div class="flex-1">
|
||||||
|
<label class="sr-only" :for="inputId">Type a message and press Enter</label>
|
||||||
|
<input
|
||||||
|
:id="inputId"
|
||||||
|
v-model="inputValue"
|
||||||
|
class="rounded-full py-2 px-4 text-sm border block w-full dark:bg-black dark:text-white dark:border-stone-700"
|
||||||
|
placeholder="Type a message and press Enter"
|
||||||
|
maxlength="2048"
|
||||||
|
@keydown.enter.prevent="submitMessage"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, ref } from "vue";
|
||||||
|
import ImageInput from "./ImageInput.vue";
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: "ChatInput",
|
||||||
|
components: {
|
||||||
|
ImageInput,
|
||||||
|
},
|
||||||
|
emits: ["submit", "imageSubmit"],
|
||||||
|
setup(_, { emit }) {
|
||||||
|
const inputId = `input-${Math.random().toString(36).substr(2, 9)}`;
|
||||||
|
const inputValue = ref("");
|
||||||
|
|
||||||
|
function submitMessage() {
|
||||||
|
if (!inputValue.value) return;
|
||||||
|
emit("submit", inputValue.value);
|
||||||
|
inputValue.value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleImageChange(file: File | undefined) {
|
||||||
|
if (file) {
|
||||||
|
emit("imageSubmit", file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
inputId,
|
||||||
|
inputValue,
|
||||||
|
submitMessage,
|
||||||
|
handleImageChange,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="h-full text-base text-stone-500 flex items-center justify-center px-3 md:text-xl"
|
||||||
|
>
|
||||||
|
Start a conversation below.
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
export default {
|
||||||
|
name: "EmptyChatMessage",
|
||||||
|
};
|
||||||
|
</script>
|
||||||
63
examples/community-chat-vue/src/components/ImageInput.vue
Normal file
63
examples/community-chat-vue/src/components/ImageInput.vue
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
aria-label="Send image"
|
||||||
|
title="Send image"
|
||||||
|
@click="onUploadClick"
|
||||||
|
class="text-stone-500 p-1.5 rounded-full hover:bg-stone-100 hover:text-stone-800 dark:hover:bg-stone-800 dark:hover:text-stone-200 transition-colors"
|
||||||
|
>
|
||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
stroke="currentColor"
|
||||||
|
stroke-width="1.5"
|
||||||
|
stroke-linecap="round"
|
||||||
|
stroke-linejoin="round"
|
||||||
|
>
|
||||||
|
<rect width="18" height="18" x="3" y="3" rx="2" ry="2" />
|
||||||
|
<circle cx="9" cy="9" r="2" />
|
||||||
|
<path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<label class="sr-only">
|
||||||
|
Image
|
||||||
|
<input
|
||||||
|
ref="inputRef"
|
||||||
|
type="file"
|
||||||
|
accept="image/png, image/jpeg, image/gif"
|
||||||
|
@change="onImageChange"
|
||||||
|
/>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent, ref } from "vue";
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: "ImageInput",
|
||||||
|
emits: ["imageChange"],
|
||||||
|
setup(_, { emit }) {
|
||||||
|
const inputRef = ref<HTMLInputElement>();
|
||||||
|
|
||||||
|
function onUploadClick() {
|
||||||
|
inputRef.value?.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
function onImageChange(event: Event) {
|
||||||
|
const target = event.target as HTMLInputElement;
|
||||||
|
emit("imageChange", target.files?.[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
inputRef,
|
||||||
|
onUploadClick,
|
||||||
|
onImageChange,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
13
examples/community-chat-vue/src/components/TopBar.vue
Normal file
13
examples/community-chat-vue/src/components/TopBar.vue
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
class="p-3 bg-white w-full flex justify-end gap-1 text-xs border-b dark:bg-transparent dark:border-stone-800"
|
||||||
|
>
|
||||||
|
<slot></slot>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
export default {
|
||||||
|
name: "TopBar",
|
||||||
|
};
|
||||||
|
</script>
|
||||||
1
examples/community-chat-vue/src/index.css
Normal file
1
examples/community-chat-vue/src/index.css
Normal file
@@ -0,0 +1 @@
|
|||||||
|
@import "tailwindcss";
|
||||||
8
examples/community-chat-vue/src/main.ts
Normal file
8
examples/community-chat-vue/src/main.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import { createApp } from "vue";
|
||||||
|
import RootApp from "./RootApp.vue";
|
||||||
|
import "./index.css";
|
||||||
|
import router from "./router";
|
||||||
|
|
||||||
|
const app = createApp(RootApp);
|
||||||
|
app.use(router);
|
||||||
|
app.mount("#app");
|
||||||
17
examples/community-chat-vue/src/router.ts
Normal file
17
examples/community-chat-vue/src/router.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
import { createRouter, createWebHistory } from "vue-router";
|
||||||
|
import Chat from "./views/ChatView.vue";
|
||||||
|
import Home from "./views/HomeView.vue";
|
||||||
|
|
||||||
|
const router = createRouter({
|
||||||
|
history: createWebHistory(import.meta.env.BASE_URL),
|
||||||
|
routes: [
|
||||||
|
{
|
||||||
|
path: "/",
|
||||||
|
name: "Home",
|
||||||
|
component: Home,
|
||||||
|
},
|
||||||
|
{ path: "/chat/:chatId", name: "Chat", component: Chat, props: true },
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
export default router;
|
||||||
8
examples/community-chat-vue/src/schema.ts
Normal file
8
examples/community-chat-vue/src/schema.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
import { co } from "jazz-tools";
|
||||||
|
|
||||||
|
export const Message = co.map({
|
||||||
|
text: co.plainText(),
|
||||||
|
image: co.optional(co.image()),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const Chat = co.list(Message);
|
||||||
108
examples/community-chat-vue/src/views/ChatView.vue
Normal file
108
examples/community-chat-vue/src/views/ChatView.vue
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
<template>
|
||||||
|
<div v-if="chat">
|
||||||
|
<ChatBody>
|
||||||
|
<template v-if="chat.length > 0">
|
||||||
|
<ChatBubble v-for="msg in displayedMessages" :key="msg.id" :msg="msg" />
|
||||||
|
</template>
|
||||||
|
<EmptyChatMessage v-else />
|
||||||
|
<button
|
||||||
|
v-if="chat.length > showNLastMessages"
|
||||||
|
class="px-4 py-1 block mx-auto my-2 border rounded"
|
||||||
|
@click="showMoreMessages"
|
||||||
|
>
|
||||||
|
Show more
|
||||||
|
</button>
|
||||||
|
</ChatBody>
|
||||||
|
<ChatInput @submit="handleSubmit" @image-submit="handleImageSubmit" />
|
||||||
|
</div>
|
||||||
|
<div v-else class="flex-1 flex justify-center items-center">Loading...</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { useCoState, createImage } from "community-jazz-vue";
|
||||||
|
import { CoPlainText, type ID } from "jazz-tools";
|
||||||
|
import { type PropType, computed, defineComponent, ref } from "vue";
|
||||||
|
import ChatBody from "../components/ChatBody.vue";
|
||||||
|
import ChatBubble from "../components/ChatBubble.vue";
|
||||||
|
import ChatInput from "../components/ChatInput.vue";
|
||||||
|
import EmptyChatMessage from "../components/EmptyChatMessage.vue";
|
||||||
|
import { Chat, Message } from "../schema";
|
||||||
|
|
||||||
|
export default defineComponent({
|
||||||
|
name: "ChatView",
|
||||||
|
components: {
|
||||||
|
ChatBody,
|
||||||
|
ChatInput,
|
||||||
|
EmptyChatMessage,
|
||||||
|
ChatBubble,
|
||||||
|
},
|
||||||
|
props: {
|
||||||
|
chatId: {
|
||||||
|
type: String as unknown as PropType<ID<Chat>>,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
setup(props) {
|
||||||
|
const chat = useCoState(Chat, props.chatId, { resolve: { $each: true } });
|
||||||
|
const showNLastMessages = ref(30);
|
||||||
|
|
||||||
|
const displayedMessages = computed(() => {
|
||||||
|
return chat.value?.slice(-showNLastMessages.value).reverse();
|
||||||
|
});
|
||||||
|
|
||||||
|
function showMoreMessages() {
|
||||||
|
showNLastMessages.value += 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleSubmit(text: string) {
|
||||||
|
if (chat.value) {
|
||||||
|
chat.value.push(
|
||||||
|
Message.create(
|
||||||
|
{ text: CoPlainText.create(text, chat.value._owner) },
|
||||||
|
chat.value._owner,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleImageSubmit(file: File) {
|
||||||
|
if (!chat.value) return;
|
||||||
|
|
||||||
|
if (file.size > 5000000) {
|
||||||
|
alert("Please upload an image less than 5MB.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const image = await createImage(file, {
|
||||||
|
owner: chat.value._owner,
|
||||||
|
progressive: true,
|
||||||
|
placeholder: "blur",
|
||||||
|
});
|
||||||
|
|
||||||
|
chat.value.push(
|
||||||
|
Message.create(
|
||||||
|
{
|
||||||
|
text: CoPlainText.create(file.name, chat.value._owner),
|
||||||
|
image: image,
|
||||||
|
},
|
||||||
|
chat.value._owner,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Failed to upload image:", error);
|
||||||
|
alert("Failed to upload image. Please try again.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
chat,
|
||||||
|
showNLastMessages,
|
||||||
|
displayedMessages,
|
||||||
|
showMoreMessages,
|
||||||
|
handleSubmit,
|
||||||
|
handleImageSubmit,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
33
examples/community-chat-vue/src/views/HomeView.vue
Normal file
33
examples/community-chat-vue/src/views/HomeView.vue
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<template>
|
||||||
|
<div v-if="!me">Loading...</div>
|
||||||
|
<div v-else>Creating a new chat...</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { useAccount, useIsAuthenticated } from "community-jazz-vue";
|
||||||
|
import { Group } from "jazz-tools";
|
||||||
|
import { watch } from "vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
import { Chat } from "../schema";
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
const { me } = useAccount();
|
||||||
|
const isAuthenticated = useIsAuthenticated();
|
||||||
|
|
||||||
|
watch(
|
||||||
|
[me, isAuthenticated],
|
||||||
|
([currentMe, authenticated]) => {
|
||||||
|
if (currentMe && authenticated) {
|
||||||
|
try {
|
||||||
|
const group = Group.create({ owner: currentMe });
|
||||||
|
group.addMember("everyone", "writer");
|
||||||
|
const chat = Chat.create([], { owner: group });
|
||||||
|
router.push(`/chat/${chat.id}`);
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Failed to create chat:", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{ immediate: true },
|
||||||
|
);
|
||||||
|
</script>
|
||||||
14
examples/community-chat-vue/tsconfig.app.json
Normal file
14
examples/community-chat-vue/tsconfig.app.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"extends": "@vue/tsconfig/tsconfig.dom.json",
|
||||||
|
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
|
||||||
|
"exclude": ["src/**/__tests__/*"],
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
|
|
||||||
|
"baseUrl": ".",
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["./src/*"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
examples/community-chat-vue/tsconfig.json
Normal file
11
examples/community-chat-vue/tsconfig.json
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"files": [],
|
||||||
|
"references": [
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.node.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.app.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
19
examples/community-chat-vue/tsconfig.node.json
Normal file
19
examples/community-chat-vue/tsconfig.node.json
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"extends": "@tsconfig/node20/tsconfig.json",
|
||||||
|
"include": [
|
||||||
|
"vite.config.*",
|
||||||
|
"vitest.config.*",
|
||||||
|
"cypress.config.*",
|
||||||
|
"nightwatch.conf.*",
|
||||||
|
"playwright.config.*"
|
||||||
|
],
|
||||||
|
"compilerOptions": {
|
||||||
|
"composite": true,
|
||||||
|
"noEmit": true,
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
||||||
|
|
||||||
|
"module": "ESNext",
|
||||||
|
"moduleResolution": "Bundler",
|
||||||
|
"types": ["node"]
|
||||||
|
}
|
||||||
|
}
|
||||||
16
examples/community-chat-vue/vite.config.ts
Normal file
16
examples/community-chat-vue/vite.config.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { URL, fileURLToPath } from "node:url";
|
||||||
|
|
||||||
|
import vue from "@vitejs/plugin-vue";
|
||||||
|
import vueJsx from "@vitejs/plugin-vue-jsx";
|
||||||
|
import { defineConfig } from "vite";
|
||||||
|
import vueDevTools from "vite-plugin-vue-devtools";
|
||||||
|
|
||||||
|
// https://vite.dev/config/
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [vue(), vueJsx(), vueDevTools()],
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
"@": fileURLToPath(new URL("./src", import.meta.url)),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
1
examples/community-clerk-vue/.env.example
Normal file
1
examples/community-clerk-vue/.env.example
Normal file
@@ -0,0 +1 @@
|
|||||||
|
VITE_CLERK_PUBLISHABLE_KEY=
|
||||||
1
examples/community-clerk-vue/.env.test
Normal file
1
examples/community-clerk-vue/.env.test
Normal file
@@ -0,0 +1 @@
|
|||||||
|
VITE_CLERK_PUBLISHABLE_KEY=pk_test_ZXZpZGVudC1kYW5lLTg5LmNsZXJrLmFjY291bnRzLmRldiQ
|
||||||
32
examples/community-clerk-vue/.gitignore
vendored
Normal file
32
examples/community-clerk-vue/.gitignore
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.idea
|
||||||
|
.DS_Store
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
|
|
||||||
|
playwright-report
|
||||||
|
|
||||||
|
# Env
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
!.env.test
|
||||||
7
examples/community-clerk-vue/CHANGELOG.md
Normal file
7
examples/community-clerk-vue/CHANGELOG.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
# community-clerk-vue
|
||||||
|
|
||||||
|
## 0.15.4
|
||||||
|
|
||||||
|
- rewrite from React to Vue
|
||||||
|
- jazz-tools@0.15.4
|
||||||
|
- community-jazz-vue@0.15.4
|
||||||
82
examples/community-clerk-vue/README.md
Normal file
82
examples/community-clerk-vue/README.md
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
# Clerk authentication example with Jazz and Vue
|
||||||
|
|
||||||
|
This is an example of how to use clerk authentication with Jazz in a Vue.js application.
|
||||||
|
|
||||||
|
Live version: [](Todo)
|
||||||
|
|
||||||
|
## Getting started
|
||||||
|
|
||||||
|
You can either
|
||||||
|
|
||||||
|
1. Clone the jazz repository, and run the app within the monorepo.
|
||||||
|
2. Or create a new Jazz project using this example as a template.
|
||||||
|
|
||||||
|
### Using the example as a template
|
||||||
|
|
||||||
|
Create a new Jazz project, and use this example as a template.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npx create-jazz-app@latest clerk-vue-app --example community-clerk-vue
|
||||||
|
```
|
||||||
|
|
||||||
|
Go to the new project directory.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd clerk-vue-app
|
||||||
|
```
|
||||||
|
|
||||||
|
Rename .env.example to .env
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mv .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
Update `VITE_CLERK_PUBLISHABLE_KEY` with your [Publishable Key](https://clerk.com/docs/deployments/clerk-environment-variables#clerk-publishable-and-secret-keys) from Clerk.
|
||||||
|
|
||||||
|
Run the dev server.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using the monorepo
|
||||||
|
|
||||||
|
This requires `pnpm` to be installed, see [https://pnpm.io/installation](https://pnpm.io/installation).
|
||||||
|
|
||||||
|
Clone the jazz repository.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/garden-co/jazz.git
|
||||||
|
```
|
||||||
|
|
||||||
|
Install and build dependencies.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm i && npx turbo build
|
||||||
|
```
|
||||||
|
|
||||||
|
Go to the example directory.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd jazz/examples/community-clerk-vue/
|
||||||
|
```
|
||||||
|
|
||||||
|
Rename .env.example to .env
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mv .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
Update `VITE_CLERK_PUBLISHABLE_KEY` with your [Publishable Key](https://clerk.com/docs/deployments/clerk-environment-variables#clerk-publishable-and-secret-keys) from Clerk.
|
||||||
|
|
||||||
|
Start the dev server.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Open [http://localhost:5173](http://localhost:5173) with your browser to see the result.
|
||||||
|
|
||||||
|
## Questions / problems / feedback
|
||||||
|
|
||||||
|
If you have feedback, let us know on [Discord](https://discord.gg/utDMjHYg42) or open an issue or PR to fix something that seems wrong.
|
||||||
16
examples/community-clerk-vue/index.html
Normal file
16
examples/community-clerk-vue/index.html
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Minimal Vue Auth Clerk Example | Jazz</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/src/main.ts"></script>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
30
examples/community-clerk-vue/package.json
Normal file
30
examples/community-clerk-vue/package.json
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"name": "community-clerk-vue",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "tsc -b && vite build",
|
||||||
|
"preview": "vite preview",
|
||||||
|
"format-and-lint": "biome check .",
|
||||||
|
"format-and-lint:fix": "biome check . --write",
|
||||||
|
"test:e2e": "playwright test",
|
||||||
|
"test:e2e:ui": "playwright test --ui"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@clerk/vue": "^1.8.10",
|
||||||
|
"community-jazz-vue": "workspace:*",
|
||||||
|
"jazz-tools": "workspace:*",
|
||||||
|
"vue": "^3.5.13",
|
||||||
|
"vue-router": "^4.5.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@biomejs/biome": "1.9.4",
|
||||||
|
"@clerk/testing": "^1.10.8",
|
||||||
|
"@playwright/test": "^1.50.1",
|
||||||
|
"@vitejs/plugin-vue": "^5.2.1",
|
||||||
|
"globals": "^15.11.0",
|
||||||
|
"typescript": "5.6.2",
|
||||||
|
"vite": "^6.3.5"
|
||||||
|
}
|
||||||
|
}
|
||||||
53
examples/community-clerk-vue/playwright.config.ts
Normal file
53
examples/community-clerk-vue/playwright.config.ts
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
import { defineConfig, devices } from "@playwright/test";
|
||||||
|
import isCI from "is-ci";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read environment variables from file.
|
||||||
|
* https://github.com/motdotla/dotenv
|
||||||
|
*/
|
||||||
|
// import dotenv from 'dotenv';
|
||||||
|
// dotenv.config({ path: path.resolve(__dirname, '.env') });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See https://playwright.dev/docs/test-configuration.
|
||||||
|
*/
|
||||||
|
export default defineConfig({
|
||||||
|
testDir: "./tests",
|
||||||
|
/* Run tests in files in parallel */
|
||||||
|
fullyParallel: true,
|
||||||
|
/* Fail the build on CI if you accidentally left test.only in the source code. */
|
||||||
|
forbidOnly: isCI,
|
||||||
|
/* Retry on CI only */
|
||||||
|
retries: isCI ? 2 : 0,
|
||||||
|
/* Opt out of parallel tests on CI. */
|
||||||
|
workers: isCI ? 1 : undefined,
|
||||||
|
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
||||||
|
reporter: "html",
|
||||||
|
|
||||||
|
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
||||||
|
use: {
|
||||||
|
/* Base URL to use in actions like `await page.goto('/')`. */
|
||||||
|
baseURL: "http://localhost:5173/",
|
||||||
|
|
||||||
|
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
||||||
|
trace: "on-first-retry",
|
||||||
|
permissions: ["clipboard-read", "clipboard-write"],
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Configure projects for major browsers */
|
||||||
|
projects: [
|
||||||
|
{
|
||||||
|
name: "chromium",
|
||||||
|
use: { ...devices["Desktop Chrome"] },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
/* Run your local dev server before starting the tests */
|
||||||
|
webServer: [
|
||||||
|
{
|
||||||
|
command: "pnpm preview --port 5173",
|
||||||
|
url: "http://localhost:5173/",
|
||||||
|
reuseExistingServer: !isCI,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
BIN
examples/community-clerk-vue/public/favicon.ico
Normal file
BIN
examples/community-clerk-vue/public/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
37
examples/community-clerk-vue/src/App.vue
Normal file
37
examples/community-clerk-vue/src/App.vue
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { SignInButton, SignOutButton } from "@clerk/vue";
|
||||||
|
import { useIsAuthenticated, useJazzContext } from "community-jazz-vue";
|
||||||
|
import { Account } from "jazz-tools";
|
||||||
|
import { computed } from "vue";
|
||||||
|
|
||||||
|
const context = useJazzContext<Account>();
|
||||||
|
const isAuthenticated = useIsAuthenticated();
|
||||||
|
|
||||||
|
const me = computed(() => {
|
||||||
|
const ctx = context.value;
|
||||||
|
console.log("[App] me computed:", { hasContext: !!ctx, ctx });
|
||||||
|
if (!ctx) return null;
|
||||||
|
return "me" in ctx ? ctx.me : null;
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div v-if="isAuthenticated" class="container">
|
||||||
|
<h1>You're logged in</h1>
|
||||||
|
<p>Welcome back, {{ me?.profile?.name || "User" }}</p>
|
||||||
|
<SignOutButton>Logout</SignOutButton>
|
||||||
|
</div>
|
||||||
|
<div v-else class="container">
|
||||||
|
<h1>You're not logged in</h1>
|
||||||
|
<SignInButton />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.container {
|
||||||
|
max-width: 600px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
1
examples/community-clerk-vue/src/apiKey.ts
Normal file
1
examples/community-clerk-vue/src/apiKey.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export const apiKey = "minimal-auth-clerk-example@garden.co";
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { SignOutButton } from "@clerk/vue";
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<SignOutButton>Simulate expiration</SignOutButton>
|
||||||
|
</template>
|
||||||
31
examples/community-clerk-vue/src/components/JazzProvider.vue
Normal file
31
examples/community-clerk-vue/src/components/JazzProvider.vue
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { useClerk } from "@clerk/vue";
|
||||||
|
import { JazzVueProviderWithClerk } from "community-jazz-vue";
|
||||||
|
import { h } from "vue";
|
||||||
|
|
||||||
|
import { apiKey } from "../apiKey";
|
||||||
|
|
||||||
|
const clerk = useClerk();
|
||||||
|
|
||||||
|
import "jazz-tools/inspector/register-custom-element";
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<JazzVueProviderWithClerk
|
||||||
|
v-if="clerk"
|
||||||
|
:clerk="clerk"
|
||||||
|
:sync="{
|
||||||
|
peer: `wss://cloud.jazz.tools/?key=${apiKey}`,
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
<slot />
|
||||||
|
<component
|
||||||
|
:is="h('jazz-inspector', {
|
||||||
|
style: { position: 'fixed', bottom: '20px', left: '20px', zIndex: 9999 }
|
||||||
|
})"
|
||||||
|
/>
|
||||||
|
</JazzVueProviderWithClerk>
|
||||||
|
<div v-else>
|
||||||
|
<p>Loading Clerk...</p>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
17
examples/community-clerk-vue/src/components/RootApp.vue
Normal file
17
examples/community-clerk-vue/src/components/RootApp.vue
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { computed } from "vue";
|
||||||
|
import App from "../App.vue";
|
||||||
|
import ExpirationTest from "./ExpirationTest.vue";
|
||||||
|
import JazzProvider from "./JazzProvider.vue";
|
||||||
|
|
||||||
|
const isExpirationTest = computed(() =>
|
||||||
|
location.search.includes("expirationTest"),
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<ExpirationTest v-if="isExpirationTest" />
|
||||||
|
<JazzProvider v-else>
|
||||||
|
<App />
|
||||||
|
</JazzProvider>
|
||||||
|
</template>
|
||||||
72
examples/community-clerk-vue/src/index.css
Normal file
72
examples/community-clerk-vue/src/index.css
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
:root {
|
||||||
|
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
|
||||||
|
line-height: 1.5;
|
||||||
|
font-weight: 400;
|
||||||
|
|
||||||
|
color-scheme: light dark;
|
||||||
|
color: rgba(255, 255, 255, 0.87);
|
||||||
|
background-color: #242424;
|
||||||
|
|
||||||
|
font-synthesis: none;
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
font-weight: 500;
|
||||||
|
color: #646cff;
|
||||||
|
text-decoration: inherit;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
color: #535bf2;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
display: flex;
|
||||||
|
place-items: center;
|
||||||
|
min-width: 320px;
|
||||||
|
min-height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
#root {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 3.2em;
|
||||||
|
line-height: 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
border-radius: 8px;
|
||||||
|
border: 0;
|
||||||
|
padding: 0.6em 1.2em;
|
||||||
|
font-weight: 500;
|
||||||
|
background-color: #1a1a1a;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: light) {
|
||||||
|
:root {
|
||||||
|
color: #213547;
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
color: #747bff;
|
||||||
|
}
|
||||||
|
button {
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: 400px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 0 1rem;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: center;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
20
examples/community-clerk-vue/src/main.ts
Normal file
20
examples/community-clerk-vue/src/main.ts
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import { clerkPlugin } from "@clerk/vue";
|
||||||
|
import { createApp } from "vue";
|
||||||
|
import RootApp from "./components/RootApp.vue";
|
||||||
|
import "./index.css";
|
||||||
|
|
||||||
|
// Import your publishable key
|
||||||
|
const PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY;
|
||||||
|
|
||||||
|
if (!PUBLISHABLE_KEY) {
|
||||||
|
throw new Error("Add your Clerk publishable key to the .env.local file");
|
||||||
|
}
|
||||||
|
|
||||||
|
const app = createApp(RootApp);
|
||||||
|
|
||||||
|
app.use(clerkPlugin, {
|
||||||
|
publishableKey: PUBLISHABLE_KEY,
|
||||||
|
afterSignOutUrl: "/",
|
||||||
|
});
|
||||||
|
|
||||||
|
app.mount("#app");
|
||||||
15
examples/community-clerk-vue/src/vite-env.d.ts
vendored
Normal file
15
examples/community-clerk-vue/src/vite-env.d.ts
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/// <reference types="vite/client" />
|
||||||
|
|
||||||
|
declare module "*.vue" {
|
||||||
|
import type { DefineComponent } from "vue";
|
||||||
|
const component: DefineComponent<{}, {}, any>;
|
||||||
|
export default component;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ImportMetaEnv {
|
||||||
|
readonly VITE_CLERK_PUBLISHABLE_KEY: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ImportMeta {
|
||||||
|
readonly env: ImportMetaEnv;
|
||||||
|
}
|
||||||
122
examples/community-clerk-vue/tests/clerk-integration.spec.ts
Normal file
122
examples/community-clerk-vue/tests/clerk-integration.spec.ts
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
import { expect, test } from "@playwright/test";
|
||||||
|
|
||||||
|
test("clerk integration - complete sign in flow", async ({ page }) => {
|
||||||
|
await page.goto("/");
|
||||||
|
|
||||||
|
// Wait for page to load
|
||||||
|
await page.waitForTimeout(3000);
|
||||||
|
|
||||||
|
console.log("=== INITIAL PAGE STATE ===");
|
||||||
|
const pageText = await page.textContent("body");
|
||||||
|
console.log("Full page text:", pageText);
|
||||||
|
console.log(
|
||||||
|
'Page contains "You\'re not logged in":',
|
||||||
|
pageText?.includes("You're not logged in"),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Check if Clerk is loaded
|
||||||
|
const clerkLoaded = await page.evaluate(() => {
|
||||||
|
return typeof (window as any).Clerk !== "undefined";
|
||||||
|
});
|
||||||
|
console.log("Clerk loaded:", clerkLoaded);
|
||||||
|
|
||||||
|
// Check if Clerk publishable key is available in the page
|
||||||
|
const hasClerkKey = await page.evaluate(() => {
|
||||||
|
return document.querySelector('script[src*="clerk"]') !== null;
|
||||||
|
});
|
||||||
|
console.log("Clerk scripts loaded:", hasClerkKey);
|
||||||
|
|
||||||
|
// Check for any Vue app errors
|
||||||
|
const vueErrors = await page.evaluate(() => {
|
||||||
|
return (
|
||||||
|
(window as any).__VUE_DEVTOOLS_GLOBAL_HOOK__?.Vue?.config?.errorHandler ||
|
||||||
|
null
|
||||||
|
);
|
||||||
|
});
|
||||||
|
console.log("Vue errors:", vueErrors);
|
||||||
|
|
||||||
|
console.log("=== CLICKING SIGN IN ===");
|
||||||
|
const signInButton = page.getByRole("button", { name: "Sign in" });
|
||||||
|
const signInExists = await signInButton.isVisible();
|
||||||
|
console.log("Sign in button exists:", signInExists);
|
||||||
|
|
||||||
|
if (!signInExists) {
|
||||||
|
console.log("Sign in button not found, taking screenshot");
|
||||||
|
await page.screenshot({ path: "debug-no-signin-button.png" });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await signInButton.click();
|
||||||
|
console.log("Clicked sign in button");
|
||||||
|
|
||||||
|
// Wait and check what happens
|
||||||
|
await page.waitForTimeout(1000);
|
||||||
|
|
||||||
|
// Check for any modals or overlays
|
||||||
|
const modals = await page
|
||||||
|
.locator(
|
||||||
|
'[role="dialog"], .cl-modal, .clerk-modal, [data-testid*="modal"], [class*="modal"]',
|
||||||
|
)
|
||||||
|
.all();
|
||||||
|
console.log("Found modals/dialogs:", modals.length);
|
||||||
|
|
||||||
|
for (let i = 0; i < modals.length; i++) {
|
||||||
|
const modal = modals[i];
|
||||||
|
const isVisible = await modal.isVisible();
|
||||||
|
const className = await modal.getAttribute("class");
|
||||||
|
console.log(`Modal ${i}: visible=${isVisible}, class="${className}"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for any iframes (Clerk might use iframes)
|
||||||
|
const iframes = await page.locator("iframe").all();
|
||||||
|
console.log("Found iframes:", iframes.length);
|
||||||
|
|
||||||
|
for (let i = 0; i < iframes.length; i++) {
|
||||||
|
const iframe = iframes[i];
|
||||||
|
const src = await iframe.getAttribute("src");
|
||||||
|
const isVisible = await iframe.isVisible();
|
||||||
|
console.log(`Iframe ${i}: visible=${isVisible}, src="${src}"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for any new elements that appeared
|
||||||
|
await page.waitForTimeout(2000);
|
||||||
|
const allInputs = await page.locator("input").all();
|
||||||
|
console.log("Total inputs on page:", allInputs.length);
|
||||||
|
|
||||||
|
for (let i = 0; i < allInputs.length; i++) {
|
||||||
|
const input = allInputs[i];
|
||||||
|
const type = await input.getAttribute("type");
|
||||||
|
const name = await input.getAttribute("name");
|
||||||
|
const placeholder = await input.getAttribute("placeholder");
|
||||||
|
const isVisible = await input.isVisible();
|
||||||
|
console.log(
|
||||||
|
`Input ${i}: type="${type}" name="${name}" placeholder="${placeholder}" visible=${isVisible}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for any error messages
|
||||||
|
const errorElements = await page
|
||||||
|
.locator('[class*="error"], [role="alert"], .cl-formFieldErrorText')
|
||||||
|
.all();
|
||||||
|
console.log("Found error elements:", errorElements.length);
|
||||||
|
|
||||||
|
for (let i = 0; i < errorElements.length; i++) {
|
||||||
|
const error = errorElements[i];
|
||||||
|
const text = await error.textContent();
|
||||||
|
const isVisible = await error.isVisible();
|
||||||
|
console.log(`Error ${i}: visible=${isVisible}, text="${text}"`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check console errors
|
||||||
|
const logs: string[] = [];
|
||||||
|
page.on("console", (msg) => {
|
||||||
|
if (msg.type() === "error") {
|
||||||
|
logs.push(msg.text());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await page.waitForTimeout(1000);
|
||||||
|
if (logs.length > 0) {
|
||||||
|
console.log("Console errors:", logs);
|
||||||
|
}
|
||||||
|
});
|
||||||
69
examples/community-clerk-vue/tests/expiration.spec.ts
Normal file
69
examples/community-clerk-vue/tests/expiration.spec.ts
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
import { clerk } from "@clerk/testing/playwright";
|
||||||
|
import { expect, test } from "@playwright/test";
|
||||||
|
|
||||||
|
// Flaky on CI
|
||||||
|
test.skip("login & expiration", async ({ page, context }) => {
|
||||||
|
// Clear cookies first
|
||||||
|
await context.clearCookies();
|
||||||
|
|
||||||
|
await page.goto("/");
|
||||||
|
|
||||||
|
// Clear storage after page loads to avoid security errors
|
||||||
|
await page.evaluate(() => {
|
||||||
|
try {
|
||||||
|
localStorage.clear();
|
||||||
|
sessionStorage.clear();
|
||||||
|
// Clear IndexedDB
|
||||||
|
if ("indexedDB" in window) {
|
||||||
|
indexedDB.databases().then((databases) => {
|
||||||
|
databases.forEach((db) => {
|
||||||
|
if (db.name) indexedDB.deleteDatabase(db.name);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log("Storage clear failed:", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Wait for page to load completely
|
||||||
|
await page.waitForTimeout(3000);
|
||||||
|
|
||||||
|
// Verify initial logged out state
|
||||||
|
await expect(page.getByText("You're not logged in")).toBeVisible();
|
||||||
|
|
||||||
|
// Manual login (works in our test environment)
|
||||||
|
await page.getByRole("button", { name: "Sign in" }).click();
|
||||||
|
await page.waitForTimeout(5000);
|
||||||
|
|
||||||
|
await page
|
||||||
|
.getByPlaceholder("Enter your email address")
|
||||||
|
.waitFor({ timeout: 30000 });
|
||||||
|
|
||||||
|
await page
|
||||||
|
.getByPlaceholder("Enter your email address")
|
||||||
|
.fill("guido+clerk-test@garden.co");
|
||||||
|
|
||||||
|
await page.keyboard.press("Enter");
|
||||||
|
|
||||||
|
await page
|
||||||
|
.getByPlaceholder("Enter your password")
|
||||||
|
.fill("guido+clerk-test@garden.co");
|
||||||
|
|
||||||
|
await page.keyboard.press("Enter");
|
||||||
|
|
||||||
|
await page.waitForURL("/");
|
||||||
|
|
||||||
|
// Verify user is logged in
|
||||||
|
await page.getByText("You're logged in").waitFor({ state: "visible" });
|
||||||
|
expect(page.getByText("You're logged in")).toBeVisible();
|
||||||
|
|
||||||
|
// Simulate expiration using clerk.signOut (ignore the warning about missing setup)
|
||||||
|
await clerk.signOut({ page });
|
||||||
|
|
||||||
|
// Navigate to home page to check logout state
|
||||||
|
await page.goto("/");
|
||||||
|
|
||||||
|
// Wait for logout to be processed and UI to update
|
||||||
|
await page.getByText("You're not logged in").waitFor({ state: "visible" });
|
||||||
|
});
|
||||||
62
examples/community-clerk-vue/tests/logout.spec.ts
Normal file
62
examples/community-clerk-vue/tests/logout.spec.ts
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
import { expect, test } from "@playwright/test";
|
||||||
|
|
||||||
|
test("login & logout", async ({ page }) => {
|
||||||
|
// Capture console messages
|
||||||
|
page.on("console", (msg) => {
|
||||||
|
console.log(`[BROWSER ${msg.type().toUpperCase()}]:`, msg.text());
|
||||||
|
});
|
||||||
|
|
||||||
|
// Capture network failures
|
||||||
|
page.on("requestfailed", (request) => {
|
||||||
|
console.log(
|
||||||
|
`[NETWORK FAILED]:`,
|
||||||
|
request.url(),
|
||||||
|
request.failure()?.errorText,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
await page.goto("/");
|
||||||
|
|
||||||
|
// Wait for page to load completely
|
||||||
|
await page.waitForTimeout(3000);
|
||||||
|
|
||||||
|
// Wait for the page to load and show the logged out state
|
||||||
|
await expect(page.getByText("You're not logged in")).toBeVisible();
|
||||||
|
|
||||||
|
// Click sign in and wait for Clerk modal to appear
|
||||||
|
await page.getByRole("button", { name: "Sign in" }).click();
|
||||||
|
|
||||||
|
// Wait a bit for Clerk to initialize and show the form
|
||||||
|
await page.waitForTimeout(5000);
|
||||||
|
|
||||||
|
// Wait for Clerk to load and show the email input with a longer timeout
|
||||||
|
await page
|
||||||
|
.getByPlaceholder("Enter your email address")
|
||||||
|
.waitFor({ timeout: 15000 });
|
||||||
|
|
||||||
|
await page
|
||||||
|
.getByPlaceholder("Enter your email address")
|
||||||
|
.fill("guido+clerk-test@garden.co");
|
||||||
|
|
||||||
|
await page.keyboard.press("Enter");
|
||||||
|
|
||||||
|
await page
|
||||||
|
.getByPlaceholder("Enter your password")
|
||||||
|
.fill("guido+clerk-test@garden.co");
|
||||||
|
|
||||||
|
console.log("Pressing Enter to submit password...");
|
||||||
|
await page.keyboard.press("Enter");
|
||||||
|
|
||||||
|
console.log("Waiting for navigation to /...");
|
||||||
|
await page.waitForURL("/", { timeout: 60000 });
|
||||||
|
|
||||||
|
await page.getByText("You're logged in").waitFor({ state: "visible" });
|
||||||
|
|
||||||
|
expect(page.getByText("You're logged in")).toBeVisible();
|
||||||
|
|
||||||
|
await page.getByRole("button", { name: "Logout" }).click();
|
||||||
|
|
||||||
|
await page.getByText("You're not logged in").waitFor({ state: "visible" });
|
||||||
|
|
||||||
|
expect(page.getByText("You're not logged in")).toBeVisible();
|
||||||
|
});
|
||||||
67
examples/community-clerk-vue/tests/reload.spec.ts
Normal file
67
examples/community-clerk-vue/tests/reload.spec.ts
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
import { expect, test } from "@playwright/test";
|
||||||
|
|
||||||
|
test("login & reload", async ({ page, context }) => {
|
||||||
|
// Clear cookies first
|
||||||
|
await context.clearCookies();
|
||||||
|
|
||||||
|
await page.goto("/");
|
||||||
|
|
||||||
|
// Clear storage after page loads to avoid security errors
|
||||||
|
await page.evaluate(() => {
|
||||||
|
try {
|
||||||
|
localStorage.clear();
|
||||||
|
sessionStorage.clear();
|
||||||
|
// Clear IndexedDB
|
||||||
|
if ("indexedDB" in window) {
|
||||||
|
indexedDB.databases().then((databases) => {
|
||||||
|
databases.forEach((db) => {
|
||||||
|
if (db.name) indexedDB.deleteDatabase(db.name);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log("Storage clear failed:", e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Wait for page to load completely (like the working tests)
|
||||||
|
await page.waitForTimeout(3000);
|
||||||
|
|
||||||
|
// Wait for the page to load and show the logged out state
|
||||||
|
await expect(page.getByText("You're not logged in")).toBeVisible();
|
||||||
|
|
||||||
|
// Click sign in and wait for Clerk modal to appear
|
||||||
|
await page.getByRole("button", { name: "Sign in" }).click();
|
||||||
|
|
||||||
|
// Wait a bit for Clerk to initialize and show the form
|
||||||
|
await page.waitForTimeout(5000);
|
||||||
|
|
||||||
|
// Wait for Clerk to load and show the email input with a longer timeout
|
||||||
|
await page
|
||||||
|
.getByPlaceholder("Enter your email address")
|
||||||
|
.waitFor({ timeout: 30000 });
|
||||||
|
|
||||||
|
await page
|
||||||
|
.getByPlaceholder("Enter your email address")
|
||||||
|
.fill("guido+clerk-test@garden.co");
|
||||||
|
|
||||||
|
await page.keyboard.press("Enter");
|
||||||
|
|
||||||
|
await page
|
||||||
|
.getByPlaceholder("Enter your password")
|
||||||
|
.fill("guido+clerk-test@garden.co");
|
||||||
|
|
||||||
|
await page.keyboard.press("Enter");
|
||||||
|
|
||||||
|
await page.waitForURL("/");
|
||||||
|
|
||||||
|
await page.getByText("You're logged in").waitFor({ state: "visible" });
|
||||||
|
|
||||||
|
expect(page.getByText("You're logged in")).toBeVisible();
|
||||||
|
|
||||||
|
await page.reload();
|
||||||
|
|
||||||
|
await page.getByText("You're logged in").waitFor({ state: "visible" });
|
||||||
|
|
||||||
|
expect(page.getByText("You're logged in")).toBeVisible();
|
||||||
|
});
|
||||||
24
examples/community-clerk-vue/tsconfig.app.json
Normal file
24
examples/community-clerk-vue/tsconfig.app.json
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
|
"target": "ES2020",
|
||||||
|
"useDefineForClassFields": true,
|
||||||
|
"lib": ["ES2023", "DOM", "DOM.Iterable"],
|
||||||
|
"module": "ESNext",
|
||||||
|
"skipLibCheck": true,
|
||||||
|
|
||||||
|
"moduleResolution": "Bundler",
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"moduleDetection": "force",
|
||||||
|
"noEmit": true,
|
||||||
|
"jsx": "react-jsx",
|
||||||
|
|
||||||
|
"strict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUncheckedSideEffectImports": true
|
||||||
|
},
|
||||||
|
"include": ["src"]
|
||||||
|
}
|
||||||
7
examples/community-clerk-vue/tsconfig.json
Normal file
7
examples/community-clerk-vue/tsconfig.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"files": [],
|
||||||
|
"references": [
|
||||||
|
{ "path": "./tsconfig.app.json" },
|
||||||
|
{ "path": "./tsconfig.node.json" }
|
||||||
|
]
|
||||||
|
}
|
||||||
22
examples/community-clerk-vue/tsconfig.node.json
Normal file
22
examples/community-clerk-vue/tsconfig.node.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
||||||
|
"target": "ES2022",
|
||||||
|
"lib": ["ES2023"],
|
||||||
|
"module": "ESNext",
|
||||||
|
"skipLibCheck": true,
|
||||||
|
|
||||||
|
"moduleResolution": "Bundler",
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
|
"isolatedModules": true,
|
||||||
|
"moduleDetection": "force",
|
||||||
|
"noEmit": true,
|
||||||
|
|
||||||
|
"strict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUncheckedSideEffectImports": true
|
||||||
|
},
|
||||||
|
"include": ["vite.config.ts"]
|
||||||
|
}
|
||||||
7
examples/community-clerk-vue/vite.config.ts
Normal file
7
examples/community-clerk-vue/vite.config.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import vue from "@vitejs/plugin-vue";
|
||||||
|
import { defineConfig } from "vite";
|
||||||
|
|
||||||
|
// https://vite.dev/config/
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [vue()],
|
||||||
|
});
|
||||||
1024
examples/community-todo-vue/CHANGELOG.md
Normal file
1024
examples/community-todo-vue/CHANGELOG.md
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user