@atproto/bsky 0.0.174 → 0.0.176

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/api/app/bsky/unspecced/initAgeAssurance.d.ts.map +1 -1
  3. package/dist/api/app/bsky/unspecced/initAgeAssurance.js +0 -6
  4. package/dist/api/app/bsky/unspecced/initAgeAssurance.js.map +1 -1
  5. package/dist/api/index.d.ts.map +1 -1
  6. package/dist/api/index.js +0 -2
  7. package/dist/api/index.js.map +1 -1
  8. package/dist/feature-gates.d.ts +1 -2
  9. package/dist/feature-gates.d.ts.map +1 -1
  10. package/dist/feature-gates.js +0 -1
  11. package/dist/feature-gates.js.map +1 -1
  12. package/dist/lexicon/index.d.ts +4 -4
  13. package/dist/lexicon/index.d.ts.map +1 -1
  14. package/dist/lexicon/index.js +8 -8
  15. package/dist/lexicon/index.js.map +1 -1
  16. package/dist/lexicon/lexicons.d.ts +254 -254
  17. package/dist/lexicon/lexicons.js +134 -134
  18. package/dist/lexicon/lexicons.js.map +1 -1
  19. package/dist/lexicon/types/{app/bsky/unspecced → com/atproto/temp}/checkHandleAvailability.d.ts +6 -6
  20. package/dist/lexicon/types/com/atproto/temp/checkHandleAvailability.d.ts.map +1 -0
  21. package/dist/lexicon/types/{app/bsky/unspecced → com/atproto/temp}/checkHandleAvailability.js +1 -1
  22. package/dist/lexicon/types/com/atproto/temp/checkHandleAvailability.js.map +1 -0
  23. package/dist/views/index.d.ts.map +1 -1
  24. package/dist/views/index.js +1 -0
  25. package/dist/views/index.js.map +1 -1
  26. package/package.json +9 -9
  27. package/src/api/app/bsky/unspecced/initAgeAssurance.ts +0 -8
  28. package/src/api/index.ts +0 -2
  29. package/src/feature-gates.ts +0 -1
  30. package/src/lexicon/index.ts +24 -24
  31. package/src/lexicon/lexicons.ts +143 -143
  32. package/src/lexicon/types/{app/bsky/unspecced → com/atproto/temp}/checkHandleAvailability.ts +4 -4
  33. package/src/views/index.ts +1 -0
  34. package/tests/__snapshots__/feed-generation.test.ts.snap +115 -12
  35. package/tests/feed-generation.test.ts +53 -10
  36. package/tests/views/actor-search.test.ts +3 -1
  37. package/tests/views/age-assurance.test.ts +0 -3
  38. package/tests/views/author-feed.test.ts +3 -1
  39. package/tests/views/follows.test.ts +6 -2
  40. package/tests/views/likes.test.ts +3 -1
  41. package/tests/views/list-feed.test.ts +3 -1
  42. package/tests/views/mutes.test.ts +3 -1
  43. package/tests/views/notifications.test.ts +14 -7
  44. package/tests/views/reposts.test.ts +3 -1
  45. package/tests/views/timeline.test.ts +3 -1
  46. package/tsconfig.build.tsbuildinfo +1 -1
  47. package/tsconfig.tests.tsbuildinfo +1 -1
  48. package/dist/api/app/bsky/unspecced/checkHandleAvailability.d.ts +0 -4
  49. package/dist/api/app/bsky/unspecced/checkHandleAvailability.d.ts.map +0 -1
  50. package/dist/api/app/bsky/unspecced/checkHandleAvailability.js +0 -238
  51. package/dist/api/app/bsky/unspecced/checkHandleAvailability.js.map +0 -1
  52. package/dist/lexicon/types/app/bsky/unspecced/checkHandleAvailability.d.ts.map +0 -1
  53. package/dist/lexicon/types/app/bsky/unspecced/checkHandleAvailability.js.map +0 -1
  54. package/src/api/app/bsky/unspecced/checkHandleAvailability.ts +0 -291
  55. package/tests/views/handle-availability.test.ts +0 -294
@@ -1,238 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.default = default_1;
40
- const address_1 = require("@hapi/address");
41
- const leo_profanity_1 = __importDefault(require("leo-profanity"));
42
- const ident = __importStar(require("@atproto/syntax"));
43
- const xrpc_server_1 = require("@atproto/xrpc-server");
44
- // THIS IS A TEMPORARY UNSPECCED ROUTE
45
- function default_1(server, ctx) {
46
- server.app.bsky.unspecced.checkHandleAvailability({
47
- handler: async ({ params }) => {
48
- const { birthDate, email, handle } = validateParams(params);
49
- if (isSlur(handle)) {
50
- return {
51
- encoding: 'application/json',
52
- body: {
53
- handle,
54
- result: {
55
- $type: 'app.bsky.unspecced.checkHandleAvailability#resultUnavailable',
56
- suggestions: [],
57
- },
58
- },
59
- };
60
- }
61
- const [did] = await ctx.hydrator.actor.getDids([handle], {
62
- lookupUnidirectional: true,
63
- });
64
- if (!did) {
65
- return {
66
- encoding: 'application/json',
67
- body: {
68
- handle,
69
- result: {
70
- $type: 'app.bsky.unspecced.checkHandleAvailability#resultAvailable',
71
- },
72
- },
73
- };
74
- }
75
- const suggestions = await getSuggestions(ctx, handle, email, birthDate);
76
- return {
77
- encoding: 'application/json',
78
- body: {
79
- handle,
80
- result: {
81
- $type: 'app.bsky.unspecced.checkHandleAvailability#resultUnavailable',
82
- suggestions,
83
- },
84
- },
85
- };
86
- },
87
- });
88
- }
89
- const validateParams = (params) => {
90
- const { email } = params;
91
- if (email && !(0, address_1.isEmailValid)(email)) {
92
- throw new xrpc_server_1.InvalidRequestError('Invalid email address.', 'InvalidEmail');
93
- }
94
- return {
95
- birthDate: params.birthDate,
96
- email,
97
- handle: ident.normalizeHandle(params.handle),
98
- };
99
- };
100
- const uniqueSuggestions = (suggestions) => suggestions.filter((s0, i, ss) => {
101
- return ss.findIndex((s1) => s0.handle === s1.handle) === i;
102
- });
103
- /** Gets the target number of suggestions, ensuring uniqueness and availability. */
104
- const getSuggestions = async (ctx, tentativeHandle, email, birthDate) => {
105
- const [subdomain, ...rest] = tentativeHandle.split('.');
106
- const domain = rest.join('.');
107
- let suggestions = [];
108
- const want = 5;
109
- let attempt = 0;
110
- const deterministic = await availableSuggestions(ctx, deterministicSuggestions(subdomain, email, birthDate), tentativeHandle, domain);
111
- suggestions.push(...deterministic);
112
- while (suggestions.length < want && attempt < 3) {
113
- const random = await availableSuggestions(ctx, randomSuggestions(subdomain), tentativeHandle, domain);
114
- suggestions.push(...random);
115
- suggestions = uniqueSuggestions([...suggestions, ...random]);
116
- attempt++;
117
- }
118
- return suggestions.slice(0, want);
119
- };
120
- const availableSuggestions = async (ctx, suggestions, tentativeHandle, domain) => {
121
- const join = (subdomain, domain) => `${subdomain}.${domain}`;
122
- const validSuggestions = suggestions
123
- .filter((s) => {
124
- // @TODO: from a magic number in the PDS code.
125
- if (s.subdomain.length < 3)
126
- return false;
127
- // @TODO: from a magic number in the PDS code.
128
- if (s.subdomain.length > 18)
129
- return false;
130
- const handle = join(s.subdomain, domain);
131
- // @TODO: from a magic number in the entryway code.
132
- if (handle.length > 30)
133
- return false;
134
- // Only valid, and not the tentative one.
135
- return ident.isValidHandle(handle) && handle !== tentativeHandle;
136
- })
137
- .map((s) => ({
138
- handle: join(s.subdomain, domain),
139
- method: s.method,
140
- }));
141
- const dids = await ctx.hydrator.actor.getDids(validSuggestions.map((s) => s.handle), {
142
- lookupUnidirectional: true,
143
- });
144
- return validSuggestions.filter((_, i) => !dids[i]);
145
- };
146
- const deterministicSuggestions = (subdomain, email, birthDate) => {
147
- const localPart = email
148
- ?.split('@')[0]
149
- .toLowerCase()
150
- .replace('.', '-')
151
- .replace(/[^a-zA-Z0-9-]/g, '');
152
- const year = getYear(birthDate);
153
- return [
154
- ...suggestAppendDigits('handle_yob', subdomain, year),
155
- ...suggestValue('email', localPart),
156
- ...suggestAppendDigits('email_yob', localPart, year),
157
- ];
158
- };
159
- const randomSuggestions = (subdomain) => [
160
- ...suggestHyphens('hyphen', subdomain),
161
- ...suggestAppendRandomDigits('random_digits', subdomain),
162
- ];
163
- const avoidDigits = ['69'];
164
- const getYear = (d) => {
165
- if (!d)
166
- return undefined;
167
- const date = new Date(d);
168
- if (isNaN(date.getTime()))
169
- return undefined;
170
- const year = date.getFullYear().toString().slice(-2);
171
- return avoidDigits.includes(year) ? undefined : year;
172
- };
173
- const suggestValue = (method, s) => {
174
- if (!s)
175
- return [];
176
- return [{ subdomain: `${s}`, method }];
177
- };
178
- const suggestAppendDigits = (method, s, d) => {
179
- if (!s || !d)
180
- return [];
181
- // If s already ends in digits, add an hyphen before appending the number.
182
- const separator = /\d$/.test(s) ? '-' : '';
183
- return [{ subdomain: `${s}${separator}${d}`, method }];
184
- };
185
- const suggestAppendRandomDigits = (method, s) => {
186
- const ss = [];
187
- const want = 2;
188
- let got = 0;
189
- while (got < want) {
190
- const randomDigits = Math.floor(Math.random() * 100).toString();
191
- if (avoidDigits.includes(randomDigits))
192
- continue;
193
- ss.push(...suggestAppendDigits(method, s, randomDigits));
194
- got++;
195
- }
196
- return ss;
197
- };
198
- const suggestHyphens = (method, s) => {
199
- const ss = [];
200
- // 2 suggestions or less, if the string is too short.
201
- const want = Math.min(Math.floor(s.length / 2), 2);
202
- let got = 0;
203
- while (got < want) {
204
- // Exclude first and last character to avoid leading/trailing hyphens.
205
- for (let i = 1; i < s.length && got < want; i++) {
206
- // Randomly skip some combinations.
207
- if (Math.random() > 0.5)
208
- continue;
209
- const left = s.slice(0, i);
210
- const right = s.slice(i);
211
- if (isSlur(left) || isSlur(right)) {
212
- // Skip but count to avoid infinite loop.
213
- got++;
214
- continue;
215
- }
216
- ss.push({ subdomain: `${left}-${right}`, method });
217
- got++;
218
- }
219
- }
220
- return ss;
221
- };
222
- // regexes taken from: https://github.com/Blank-Cheque/Slurs
223
- /* eslint-disable no-misleading-character-class */
224
- const explicitSlurRegexes = [
225
- /\b[cĆćĈĉČčĊċÇçḈḉȻȼꞒꞓꟄꞔƇƈɕ][hĤĥȞȟḦḧḢḣḨḩḤḥḪḫH̱ẖĦħⱧⱨꞪɦꞕΗНн][iÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLl][nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲŊŋꞐꞑꞤꞥᵰᶇɳȵꬻꬼИиПпNn][kḰḱǨǩĶķḲḳḴḵƘƙⱩⱪᶄꝀꝁꝂꝃꝄꝅꞢꞣ][sŚśṤṥŜŝŠšṦṧṠṡŞşṢṣṨṩȘșS̩s̩ꞨꞩⱾȿꟅʂᶊᵴ]?\b/,
226
- /\b[cĆćĈĉČčĊċÇçḈḉȻȼꞒꞓꟄꞔƇƈɕ][ÓóÒòŎŏÔôỐốỒồỖỗỔổǑǒÖöȪȫŐőÕõṌṍṎṏȬȭȮȯO͘o͘ȰȱØøǾǿǪǫǬǭŌōṒṓṐṑỎỏȌȍȎȏƠơỚớỜờỠỡỞởỢợỌọỘộO̩o̩Ò̩ò̩Ó̩ó̩ƟɵꝊꝋꝌꝍⱺOo0]{2}[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲŊŋꞐꞑꞤꞥᵰᶇɳȵꬻꬼИиПпNn][sŚśṤṥŜŝŠšṦṧṠṡŞşṢṣṨṩȘșS̩s̩ꞨꞩⱾȿꟅʂᶊᵴ]?\b/,
227
- /\b[fḞḟƑƒꞘꞙᵮᶂ][aÁáÀàĂăẮắẰằẴẵẲẳÂâẤấẦầẪẫẨẩǍǎÅåǺǻÄäǞǟÃãȦȧǠǡĄąĄ́ą́Ą̃ą̃ĀāĀ̀ā̀ẢảȀȁA̋a̋ȂȃẠạẶặẬậḀḁȺⱥꞺꞻᶏẚAa@4][gǴǵĞğĜĝǦǧĠġG̃g̃ĢģḠḡǤǥꞠꞡƓɠᶃꬶGgqꝖꝗꝘꝙɋʠ]{1,2}([ÓóÒòŎŏÔôỐốỒồỖỗỔổǑǒÖöȪȫŐőÕõṌṍṎṏȬȭȮȯO͘o͘ȰȱØøǾǿǪǫǬǭŌōṒṓṐṑỎỏȌȍȎȏƠơỚớỜờỠỡỞởỢợỌọỘộO̩o̩Ò̩ò̩Ó̩ó̩ƟɵꝊꝋꝌꝍⱺOo0e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEeiÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLl][tŤťṪṫŢţṬṭȚțṰṱṮṯŦŧȾⱦƬƭƮʈT̈ẗᵵƫȶ]{1,2}([rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ][yÝýỲỳŶŷY̊ẙŸÿỸỹẎẏȲȳỶỷỴỵɎɏƳƴỾỿ]|[rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ][iÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLl][e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe])?)?[sŚśṤṥŜŝŠšṦṧṠṡŞşṢṣṨṩȘșS̩s̩ꞨꞩⱾȿꟅʂᶊᵴ]?\b/,
228
- /\b[kḰḱǨǩĶķḲḳḴḵƘƙⱩⱪᶄꝀꝁꝂꝃꝄꝅꞢꞣ][iÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLlyÝýỲỳŶŷY̊ẙŸÿỸỹẎẏȲȳỶỷỴỵɎɏƳƴỾỿ][kḰḱǨǩĶķḲḳḴḵƘƙⱩⱪᶄꝀꝁꝂꝃꝄꝅꞢꞣ][e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe]([rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ][yÝýỲỳŶŷY̊ẙŸÿỸỹẎẏȲȳỶỷỴỵɎɏƳƴỾỿ]|[rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ][iÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLl][e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe])?[sŚśṤṥŜŝŠšṦṧṠṡŞşṢṣṨṩȘșS̩s̩ꞨꞩⱾȿꟅʂᶊᵴ]*\b/,
229
- /\b[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲŊŋꞐꞑꞤꞥᵰᶇɳȵꬻꬼИиПпNn][iÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLloÓóÒòŎŏÔôỐốỒồỖỗỔổǑǒÖöȪȫŐőÕõṌṍṎṏȬȭȮȯO͘o͘ȰȱØøǾǿǪǫǬǭŌōṒṓṐṑỎỏȌȍȎȏƠơỚớỜờỠỡỞởỢợỌọỘộO̩o̩Ò̩ò̩Ó̩ó̩ƟɵꝊꝋꝌꝍⱺOoІіa4ÁáÀàĂăẮắẰằẴẵẲẳÂâẤấẦầẪẫẨẩǍǎÅåǺǻÄäǞǟÃãȦȧǠǡĄąĄ́ą́Ą̃ą̃ĀāĀ̀ā̀ẢảȀȁA̋a̋ȂȃẠạẶặẬậḀḁȺⱥꞺꞻᶏẚAa][gǴǵĞğĜĝǦǧĠġG̃g̃ĢģḠḡǤǥꞠꞡƓɠᶃꬶGgqꝖꝗꝘꝙɋʠ]{2}(l[e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe]t|[e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEeaÁáÀàĂăẮắẰằẴẵẲẳÂâẤấẦầẪẫẨẩǍǎÅåǺǻÄäǞǟÃãȦȧǠǡĄąĄ́ą́Ą̃ą̃ĀāĀ̀ā̀ẢảȀȁA̋a̋ȂȃẠạẶặẬậḀḁȺⱥꞺꞻᶏẚAa][rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ]?|n[ÓóÒòŎŏÔôỐốỒồỖỗỔổǑǒÖöȪȫŐőÕõṌṍṎṏȬȭȮȯO͘o͘ȰȱØøǾǿǪǫǬǭŌōṒṓṐṑỎỏȌȍȎȏƠơỚớỜờỠỡỞởỢợỌọỘộO̩o̩Ò̩ò̩Ó̩ó̩ƟɵꝊꝋꝌꝍⱺOo0][gǴǵĞğĜĝǦǧĠġG̃g̃ĢģḠḡǤǥꞠꞡƓɠᶃꬶGgqꝖꝗꝘꝙɋʠ]|[a4ÁáÀàĂăẮắẰằẴẵẲẳÂâẤấẦầẪẫẨẩǍǎÅåǺǻÄäǞǟÃãȦȧǠǡĄąĄ́ą́Ą̃ą̃ĀāĀ̀ā̀ẢảȀȁA̋a̋ȂȃẠạẶặẬậḀḁȺⱥꞺꞻᶏẚAa]?)?[sŚśṤṥŜŝŠšṦṧṠṡŞşṢṣṨṩȘșS̩s̩ꞨꞩⱾȿꟅʂᶊᵴ]?\b/,
230
- /[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲŊŋꞐꞑꞤꞥᵰᶇɳȵꬻꬼИиПпNn][iÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLloÓóÒòŎŏÔôỐốỒồỖỗỔổǑǒÖöȪȫŐőÕõṌṍṎṏȬȭȮȯO͘o͘ȰȱØøǾǿǪǫǬǭŌōṒṓṐṑỎỏȌȍȎȏƠơỚớỜờỠỡỞởỢợỌọỘộO̩o̩Ò̩ò̩Ó̩ó̩ƟɵꝊꝋꝌꝍⱺOoІіa4ÁáÀàĂăẮắẰằẴẵẲẳÂâẤấẦầẪẫẨẩǍǎÅåǺǻÄäǞǟÃãȦȧǠǡĄąĄ́ą́Ą̃ą̃ĀāĀ̀ā̀ẢảȀȁA̋a̋ȂȃẠạẶặẬậḀḁȺⱥꞺꞻᶏẚAa][gǴǵĞğĜĝǦǧĠġG̃g̃ĢģḠḡǤǥꞠꞡƓɠᶃꬶGgqꝖꝗꝘꝙɋʠ]{2}(l[e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe]t|[e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe][rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ])[sŚśṤṥŜŝŠšṦṧṠṡŞşṢṣṨṩȘșS̩s̩ꞨꞩⱾȿꟅʂᶊᵴ]?/,
231
- /\b[tŤťṪṫŢţṬṭȚțṰṱṮṯŦŧȾⱦƬƭƮʈT̈ẗᵵƫȶ][rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ][aÁáÀàĂăẮắẰằẴẵẲẳÂâẤấẦầẪẫẨẩǍǎÅåǺǻÄäǞǟÃãȦȧǠǡĄąĄ́ą́Ą̃ą̃ĀāĀ̀ā̀ẢảȀȁA̋a̋ȂȃẠạẶặẬậḀḁȺⱥꞺꞻᶏẚAa4]+[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲŊŋꞐꞑꞤꞥᵰᶇɳȵꬻꬼИиПпNn]{1,2}([iÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLl][e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe]|[yÝýỲỳŶŷY̊ẙŸÿỸỹẎẏȲȳỶỷỴỵɎɏƳƴỾỿ]|[e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe][rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ])[sŚśṤṥŜŝŠšṦṧṠṡŞşṢṣṨṩȘșS̩s̩ꞨꞩⱾȿꟅʂᶊᵴ]?\b/,
232
- ];
233
- const isSlur = (handle) => {
234
- return (leo_profanity_1.default.check(handle) ||
235
- explicitSlurRegexes.some((reg) => reg.test(handle) ||
236
- reg.test(handle.replaceAll('.', '').replaceAll('-', '').replaceAll('_', ''))));
237
- };
238
- //# sourceMappingURL=checkHandleAvailability.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"checkHandleAvailability.js","sourceRoot":"","sources":["../../../../../src/api/app/bsky/unspecced/checkHandleAvailability.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"checkHandleAvailability.d.ts","sourceRoot":"","sources":["../../../../../../src/lexicon/types/app/bsky/unspecced/checkHandleAvailability.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,KAAK,gBAAgB,EAAW,MAAM,kBAAkB,CAAA;AAGjE,OAAO,EACL,KAAK,MAAM,EAGZ,MAAM,kBAAkB,CAAA;AAMzB,MAAM,MAAM,WAAW,GAAG;IACxB,8FAA8F;IAC9F,MAAM,EAAE,MAAM,CAAA;IACd,sEAAsE;IACtE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AACD,MAAM,MAAM,WAAW,GAAG,SAAS,CAAA;AAEnC,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EACF,MAAM,CAAC,eAAe,CAAC,GACvB,MAAM,CAAC,iBAAiB,CAAC,GACzB;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAA;CACtB;AAED,MAAM,MAAM,YAAY,GAAG,IAAI,CAAA;AAE/B,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,IAAI,EAAE,YAAY,CAAA;IAClB,OAAO,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,cAAc,CAAA;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,CAAA;AAEzD,kDAAkD;AAClD,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,4DAA4D,CAAA;CACrE;AAID,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,oHAExC;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,yCAE9C;AAED,+FAA+F;AAC/F,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,8DAA8D,CAAA;IACtE,8DAA8D;IAC9D,WAAW,EAAE,UAAU,EAAE,CAAA;CAC1B;AAID,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,sHAE1C;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,2CAEhD;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,uDAAuD,CAAA;IAC/D,MAAM,EAAE,MAAM,CAAA;IACd,6GAA6G;IAC7G,MAAM,EAAE,MAAM,CAAA;CACf;AAID,wBAAgB,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,+GAEnC;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,oCAEzC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"checkHandleAvailability.js","sourceRoot":"","sources":["../../../../../../src/lexicon/types/app/bsky/unspecced/checkHandleAvailability.ts"],"names":[],"mappings":";;AA0DA,8CAEC;AAED,0DAEC;AAWD,kDAEC;AAED,8DAEC;AAWD,oCAEC;AAED,gDAEC;AA7FD,mDAA4D;AAC5D,2CAIyB;AAEzB,MAAM,QAAQ,GAAG,eAAS,EACxB,QAAQ,GAAG,mBAAS,CAAA;AACtB,MAAM,EAAE,GAAG,4CAA4C,CAAA;AA0CvD,MAAM,mBAAmB,GAAG,iBAAiB,CAAA;AAE7C,SAAgB,iBAAiB,CAAI,CAAI;IACvC,OAAO,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,mBAAmB,CAAC,CAAA;AAC7C,CAAC;AAED,SAAgB,uBAAuB,CAAI,CAAI;IAC7C,OAAO,QAAQ,CAAsB,CAAC,EAAE,EAAE,EAAE,mBAAmB,CAAC,CAAA;AAClE,CAAC;AASD,MAAM,qBAAqB,GAAG,mBAAmB,CAAA;AAEjD,SAAgB,mBAAmB,CAAI,CAAI;IACzC,OAAO,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,qBAAqB,CAAC,CAAA;AAC/C,CAAC;AAED,SAAgB,yBAAyB,CAAI,CAAI;IAC/C,OAAO,QAAQ,CAAwB,CAAC,EAAE,EAAE,EAAE,qBAAqB,CAAC,CAAA;AACtE,CAAC;AASD,MAAM,cAAc,GAAG,YAAY,CAAA;AAEnC,SAAgB,YAAY,CAAI,CAAI;IAClC,OAAO,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,CAAA;AACxC,CAAC;AAED,SAAgB,kBAAkB,CAAI,CAAI;IACxC,OAAO,QAAQ,CAAiB,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,CAAA;AACxD,CAAC"}
@@ -1,291 +0,0 @@
1
- import { isEmailValid } from '@hapi/address'
2
- import filter from 'leo-profanity'
3
- import * as ident from '@atproto/syntax'
4
- import { InvalidRequestError } from '@atproto/xrpc-server'
5
- import { AppContext } from '../../../../context'
6
- import { Server } from '../../../../lexicon'
7
- import {
8
- QueryParams,
9
- Suggestion,
10
- } from '../../../../lexicon/types/app/bsky/unspecced/checkHandleAvailability'
11
-
12
- // THIS IS A TEMPORARY UNSPECCED ROUTE
13
- export default function (server: Server, ctx: AppContext) {
14
- server.app.bsky.unspecced.checkHandleAvailability({
15
- handler: async ({ params }) => {
16
- const { birthDate, email, handle } = validateParams(params)
17
-
18
- if (isSlur(handle)) {
19
- return {
20
- encoding: 'application/json',
21
- body: {
22
- handle,
23
- result: {
24
- $type:
25
- 'app.bsky.unspecced.checkHandleAvailability#resultUnavailable',
26
- suggestions: [],
27
- },
28
- },
29
- }
30
- }
31
-
32
- const [did] = await ctx.hydrator.actor.getDids([handle], {
33
- lookupUnidirectional: true,
34
- })
35
- if (!did) {
36
- return {
37
- encoding: 'application/json',
38
- body: {
39
- handle,
40
- result: {
41
- $type:
42
- 'app.bsky.unspecced.checkHandleAvailability#resultAvailable',
43
- },
44
- },
45
- }
46
- }
47
-
48
- const suggestions = await getSuggestions(ctx, handle, email, birthDate)
49
-
50
- return {
51
- encoding: 'application/json',
52
- body: {
53
- handle,
54
- result: {
55
- $type:
56
- 'app.bsky.unspecced.checkHandleAvailability#resultUnavailable',
57
- suggestions,
58
- },
59
- },
60
- }
61
- },
62
- })
63
- }
64
-
65
- const validateParams = (params: QueryParams) => {
66
- const { email } = params
67
- if (email && !isEmailValid(email)) {
68
- throw new InvalidRequestError('Invalid email address.', 'InvalidEmail')
69
- }
70
-
71
- return {
72
- birthDate: params.birthDate,
73
- email,
74
- handle: ident.normalizeHandle(params.handle),
75
- }
76
- }
77
-
78
- const uniqueSuggestions = (suggestions: Suggestion[]): Suggestion[] =>
79
- suggestions.filter((s0, i, ss) => {
80
- return ss.findIndex((s1) => s0.handle === s1.handle) === i
81
- })
82
-
83
- /** Gets the target number of suggestions, ensuring uniqueness and availability. */
84
- const getSuggestions = async (
85
- ctx: AppContext,
86
- tentativeHandle: string,
87
- email: string | undefined,
88
- birthDate: string | undefined,
89
- ): Promise<Suggestion[]> => {
90
- const [subdomain, ...rest] = tentativeHandle.split('.')
91
- const domain = rest.join('.')
92
-
93
- let suggestions: Suggestion[] = []
94
-
95
- const want = 5
96
- let attempt = 0
97
-
98
- const deterministic = await availableSuggestions(
99
- ctx,
100
- deterministicSuggestions(subdomain, email, birthDate),
101
- tentativeHandle,
102
- domain,
103
- )
104
- suggestions.push(...deterministic)
105
-
106
- while (suggestions.length < want && attempt < 3) {
107
- const random = await availableSuggestions(
108
- ctx,
109
- randomSuggestions(subdomain),
110
- tentativeHandle,
111
- domain,
112
- )
113
- suggestions.push(...random)
114
-
115
- suggestions = uniqueSuggestions([...suggestions, ...random])
116
- attempt++
117
- }
118
-
119
- return suggestions.slice(0, want)
120
- }
121
-
122
- type IntermediateSuggestion = {
123
- subdomain: string
124
- method: string
125
- }
126
-
127
- const availableSuggestions = async (
128
- ctx: AppContext,
129
- suggestions: IntermediateSuggestion[],
130
- tentativeHandle: string,
131
- domain: string,
132
- ): Promise<Suggestion[]> => {
133
- const join = (subdomain: string, domain: string) => `${subdomain}.${domain}`
134
-
135
- const validSuggestions = suggestions
136
- .filter((s) => {
137
- // @TODO: from a magic number in the PDS code.
138
- if (s.subdomain.length < 3) return false
139
-
140
- // @TODO: from a magic number in the PDS code.
141
- if (s.subdomain.length > 18) return false
142
-
143
- const handle = join(s.subdomain, domain)
144
- // @TODO: from a magic number in the entryway code.
145
- if (handle.length > 30) return false
146
-
147
- // Only valid, and not the tentative one.
148
- return ident.isValidHandle(handle) && handle !== tentativeHandle
149
- })
150
- .map(
151
- (s): Suggestion => ({
152
- handle: join(s.subdomain, domain),
153
- method: s.method,
154
- }),
155
- )
156
-
157
- const dids = await ctx.hydrator.actor.getDids(
158
- validSuggestions.map((s) => s.handle),
159
- {
160
- lookupUnidirectional: true,
161
- },
162
- )
163
- return validSuggestions.filter((_, i) => !dids[i])
164
- }
165
-
166
- const deterministicSuggestions = (
167
- subdomain: string,
168
- email: string | undefined,
169
- birthDate: string | undefined,
170
- ): IntermediateSuggestion[] => {
171
- const localPart = email
172
- ?.split('@')[0]
173
- .toLowerCase()
174
- .replace('.', '-')
175
- .replace(/[^a-zA-Z0-9-]/g, '')
176
- const year = getYear(birthDate)
177
-
178
- return [
179
- ...suggestAppendDigits('handle_yob', subdomain, year),
180
- ...suggestValue('email', localPart),
181
- ...suggestAppendDigits('email_yob', localPart, year),
182
- ]
183
- }
184
-
185
- const randomSuggestions = (subdomain: string): IntermediateSuggestion[] => [
186
- ...suggestHyphens('hyphen', subdomain),
187
- ...suggestAppendRandomDigits('random_digits', subdomain),
188
- ]
189
-
190
- const avoidDigits = ['69']
191
-
192
- const getYear = (d: string | undefined): string | undefined => {
193
- if (!d) return undefined
194
-
195
- const date = new Date(d)
196
- if (isNaN(date.getTime())) return undefined
197
-
198
- const year = date.getFullYear().toString().slice(-2)
199
- return avoidDigits.includes(year) ? undefined : year
200
- }
201
-
202
- const suggestValue = (
203
- method: string,
204
- s: string | undefined,
205
- ): IntermediateSuggestion[] => {
206
- if (!s) return []
207
- return [{ subdomain: `${s}`, method }]
208
- }
209
-
210
- const suggestAppendDigits = (
211
- method: string,
212
- s: string | undefined,
213
- d: string | undefined,
214
- ): IntermediateSuggestion[] => {
215
- if (!s || !d) return []
216
-
217
- // If s already ends in digits, add an hyphen before appending the number.
218
- const separator = /\d$/.test(s) ? '-' : ''
219
- return [{ subdomain: `${s}${separator}${d}`, method }]
220
- }
221
-
222
- const suggestAppendRandomDigits = (
223
- method: string,
224
- s: string,
225
- ): IntermediateSuggestion[] => {
226
- const ss: IntermediateSuggestion[] = []
227
- const want = 2
228
- let got = 0
229
- while (got < want) {
230
- const randomDigits = Math.floor(Math.random() * 100).toString()
231
- if (avoidDigits.includes(randomDigits)) continue
232
- ss.push(...suggestAppendDigits(method, s, randomDigits))
233
- got++
234
- }
235
- return ss
236
- }
237
-
238
- const suggestHyphens = (
239
- method: string,
240
- s: string,
241
- ): IntermediateSuggestion[] => {
242
- const ss: IntermediateSuggestion[] = []
243
- // 2 suggestions or less, if the string is too short.
244
- const want = Math.min(Math.floor(s.length / 2), 2)
245
- let got = 0
246
-
247
- while (got < want) {
248
- // Exclude first and last character to avoid leading/trailing hyphens.
249
- for (let i = 1; i < s.length && got < want; i++) {
250
- // Randomly skip some combinations.
251
- if (Math.random() > 0.5) continue
252
-
253
- const left = s.slice(0, i)
254
- const right = s.slice(i)
255
- if (isSlur(left) || isSlur(right)) {
256
- // Skip but count to avoid infinite loop.
257
- got++
258
- continue
259
- }
260
- ss.push({ subdomain: `${left}-${right}`, method })
261
- got++
262
- }
263
- }
264
-
265
- return ss
266
- }
267
-
268
- // regexes taken from: https://github.com/Blank-Cheque/Slurs
269
- /* eslint-disable no-misleading-character-class */
270
- const explicitSlurRegexes = [
271
- /\b[cĆćĈĉČčĊċÇçḈḉȻȼꞒꞓꟄꞔƇƈɕ][hĤĥȞȟḦḧḢḣḨḩḤḥḪḫH̱ẖĦħⱧⱨꞪɦꞕΗНн][iÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLl][nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲŊŋꞐꞑꞤꞥᵰᶇɳȵꬻꬼИиПпNn][kḰḱǨǩĶķḲḳḴḵƘƙⱩⱪᶄꝀꝁꝂꝃꝄꝅꞢꞣ][sŚśṤṥŜŝŠšṦṧṠṡŞşṢṣṨṩȘșS̩s̩ꞨꞩⱾȿꟅʂᶊᵴ]?\b/,
272
- /\b[cĆćĈĉČčĊċÇçḈḉȻȼꞒꞓꟄꞔƇƈɕ][ÓóÒòŎŏÔôỐốỒồỖỗỔổǑǒÖöȪȫŐőÕõṌṍṎṏȬȭȮȯO͘o͘ȰȱØøǾǿǪǫǬǭŌōṒṓṐṑỎỏȌȍȎȏƠơỚớỜờỠỡỞởỢợỌọỘộO̩o̩Ò̩ò̩Ó̩ó̩ƟɵꝊꝋꝌꝍⱺOo0]{2}[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲŊŋꞐꞑꞤꞥᵰᶇɳȵꬻꬼИиПпNn][sŚśṤṥŜŝŠšṦṧṠṡŞşṢṣṨṩȘșS̩s̩ꞨꞩⱾȿꟅʂᶊᵴ]?\b/,
273
- /\b[fḞḟƑƒꞘꞙᵮᶂ][aÁáÀàĂăẮắẰằẴẵẲẳÂâẤấẦầẪẫẨẩǍǎÅåǺǻÄäǞǟÃãȦȧǠǡĄąĄ́ą́Ą̃ą̃ĀāĀ̀ā̀ẢảȀȁA̋a̋ȂȃẠạẶặẬậḀḁȺⱥꞺꞻᶏẚAa@4][gǴǵĞğĜĝǦǧĠġG̃g̃ĢģḠḡǤǥꞠꞡƓɠᶃꬶGgqꝖꝗꝘꝙɋʠ]{1,2}([ÓóÒòŎŏÔôỐốỒồỖỗỔổǑǒÖöȪȫŐőÕõṌṍṎṏȬȭȮȯO͘o͘ȰȱØøǾǿǪǫǬǭŌōṒṓṐṑỎỏȌȍȎȏƠơỚớỜờỠỡỞởỢợỌọỘộO̩o̩Ò̩ò̩Ó̩ó̩ƟɵꝊꝋꝌꝍⱺOo0e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEeiÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLl][tŤťṪṫŢţṬṭȚțṰṱṮṯŦŧȾⱦƬƭƮʈT̈ẗᵵƫȶ]{1,2}([rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ][yÝýỲỳŶŷY̊ẙŸÿỸỹẎẏȲȳỶỷỴỵɎɏƳƴỾỿ]|[rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ][iÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLl][e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe])?)?[sŚśṤṥŜŝŠšṦṧṠṡŞşṢṣṨṩȘșS̩s̩ꞨꞩⱾȿꟅʂᶊᵴ]?\b/,
274
- /\b[kḰḱǨǩĶķḲḳḴḵƘƙⱩⱪᶄꝀꝁꝂꝃꝄꝅꞢꞣ][iÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLlyÝýỲỳŶŷY̊ẙŸÿỸỹẎẏȲȳỶỷỴỵɎɏƳƴỾỿ][kḰḱǨǩĶķḲḳḴḵƘƙⱩⱪᶄꝀꝁꝂꝃꝄꝅꞢꞣ][e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe]([rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ][yÝýỲỳŶŷY̊ẙŸÿỸỹẎẏȲȳỶỷỴỵɎɏƳƴỾỿ]|[rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ][iÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLl][e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe])?[sŚśṤṥŜŝŠšṦṧṠṡŞşṢṣṨṩȘșS̩s̩ꞨꞩⱾȿꟅʂᶊᵴ]*\b/,
275
- /\b[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲŊŋꞐꞑꞤꞥᵰᶇɳȵꬻꬼИиПпNn][iÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLloÓóÒòŎŏÔôỐốỒồỖỗỔổǑǒÖöȪȫŐőÕõṌṍṎṏȬȭȮȯO͘o͘ȰȱØøǾǿǪǫǬǭŌōṒṓṐṑỎỏȌȍȎȏƠơỚớỜờỠỡỞởỢợỌọỘộO̩o̩Ò̩ò̩Ó̩ó̩ƟɵꝊꝋꝌꝍⱺOoІіa4ÁáÀàĂăẮắẰằẴẵẲẳÂâẤấẦầẪẫẨẩǍǎÅåǺǻÄäǞǟÃãȦȧǠǡĄąĄ́ą́Ą̃ą̃ĀāĀ̀ā̀ẢảȀȁA̋a̋ȂȃẠạẶặẬậḀḁȺⱥꞺꞻᶏẚAa][gǴǵĞğĜĝǦǧĠġG̃g̃ĢģḠḡǤǥꞠꞡƓɠᶃꬶGgqꝖꝗꝘꝙɋʠ]{2}(l[e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe]t|[e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEeaÁáÀàĂăẮắẰằẴẵẲẳÂâẤấẦầẪẫẨẩǍǎÅåǺǻÄäǞǟÃãȦȧǠǡĄąĄ́ą́Ą̃ą̃ĀāĀ̀ā̀ẢảȀȁA̋a̋ȂȃẠạẶặẬậḀḁȺⱥꞺꞻᶏẚAa][rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ]?|n[ÓóÒòŎŏÔôỐốỒồỖỗỔổǑǒÖöȪȫŐőÕõṌṍṎṏȬȭȮȯO͘o͘ȰȱØøǾǿǪǫǬǭŌōṒṓṐṑỎỏȌȍȎȏƠơỚớỜờỠỡỞởỢợỌọỘộO̩o̩Ò̩ò̩Ó̩ó̩ƟɵꝊꝋꝌꝍⱺOo0][gǴǵĞğĜĝǦǧĠġG̃g̃ĢģḠḡǤǥꞠꞡƓɠᶃꬶGgqꝖꝗꝘꝙɋʠ]|[a4ÁáÀàĂăẮắẰằẴẵẲẳÂâẤấẦầẪẫẨẩǍǎÅåǺǻÄäǞǟÃãȦȧǠǡĄąĄ́ą́Ą̃ą̃ĀāĀ̀ā̀ẢảȀȁA̋a̋ȂȃẠạẶặẬậḀḁȺⱥꞺꞻᶏẚAa]?)?[sŚśṤṥŜŝŠšṦṧṠṡŞşṢṣṨṩȘșS̩s̩ꞨꞩⱾȿꟅʂᶊᵴ]?\b/,
276
- /[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲŊŋꞐꞑꞤꞥᵰᶇɳȵꬻꬼИиПпNn][iÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLloÓóÒòŎŏÔôỐốỒồỖỗỔổǑǒÖöȪȫŐőÕõṌṍṎṏȬȭȮȯO͘o͘ȰȱØøǾǿǪǫǬǭŌōṒṓṐṑỎỏȌȍȎȏƠơỚớỜờỠỡỞởỢợỌọỘộO̩o̩Ò̩ò̩Ó̩ó̩ƟɵꝊꝋꝌꝍⱺOoІіa4ÁáÀàĂăẮắẰằẴẵẲẳÂâẤấẦầẪẫẨẩǍǎÅåǺǻÄäǞǟÃãȦȧǠǡĄąĄ́ą́Ą̃ą̃ĀāĀ̀ā̀ẢảȀȁA̋a̋ȂȃẠạẶặẬậḀḁȺⱥꞺꞻᶏẚAa][gǴǵĞğĜĝǦǧĠġG̃g̃ĢģḠḡǤǥꞠꞡƓɠᶃꬶGgqꝖꝗꝘꝙɋʠ]{2}(l[e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe]t|[e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe][rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ])[sŚśṤṥŜŝŠšṦṧṠṡŞşṢṣṨṩȘșS̩s̩ꞨꞩⱾȿꟅʂᶊᵴ]?/,
277
- /\b[tŤťṪṫŢţṬṭȚțṰṱṮṯŦŧȾⱦƬƭƮʈT̈ẗᵵƫȶ][rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ][aÁáÀàĂăẮắẰằẴẵẲẳÂâẤấẦầẪẫẨẩǍǎÅåǺǻÄäǞǟÃãȦȧǠǡĄąĄ́ą́Ą̃ą̃ĀāĀ̀ā̀ẢảȀȁA̋a̋ȂȃẠạẶặẬậḀḁȺⱥꞺꞻᶏẚAa4]+[nŃńǸǹŇňÑñṄṅŅņṆṇṊṋṈṉN̈n̈ƝɲŊŋꞐꞑꞤꞥᵰᶇɳȵꬻꬼИиПпNn]{1,2}([iÍíi̇́Ììi̇̀ĬĭÎîǏǐÏïḮḯĨĩi̇̃ĮįĮ́į̇́Į̃į̇̃ĪīĪ̀ī̀ỈỉȈȉI̋i̋ȊȋỊịꞼꞽḬḭƗɨᶖİiIıIi1lĺľļḷḹl̃ḽḻłŀƚꝉⱡɫɬꞎꬷꬸꬹᶅɭȴLl][e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe]|[yÝýỲỳŶŷY̊ẙŸÿỸỹẎẏȲȳỶỷỴỵɎɏƳƴỾỿ]|[e3ЄєЕеÉéÈèĔĕÊêẾếỀềỄễỂểÊ̄ê̄Ê̌ê̌ĚěËëẼẽĖėĖ́ė́Ė̃ė̃ȨȩḜḝĘęĘ́ę́Ę̃ę̃ĒēḖḗḔḕẺẻȄȅE̋e̋ȆȇẸẹỆệḘḙḚḛɆɇE̩e̩È̩è̩É̩é̩ᶒⱸꬴꬳEe][rŔŕŘřṘṙŖŗȐȑȒȓṚṛṜṝṞṟR̃r̃ɌɍꞦꞧⱤɽᵲᶉꭉ])[sŚśṤṥŜŝŠšṦṧṠṡŞşṢṣṨṩȘșS̩s̩ꞨꞩⱾȿꟅʂᶊᵴ]?\b/,
278
- ]
279
-
280
- const isSlur = (handle: string): boolean => {
281
- return (
282
- filter.check(handle) ||
283
- explicitSlurRegexes.some(
284
- (reg) =>
285
- reg.test(handle) ||
286
- reg.test(
287
- handle.replaceAll('.', '').replaceAll('-', '').replaceAll('_', ''),
288
- ),
289
- )
290
- )
291
- }