@taskless-app/shared 0.1.9 → 0.1.11
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.
- package/dist/branding.d.ts +2 -2
- package/dist/callQuality.d.ts +1 -1
- package/dist/finishChip.js.map +1 -1
- package/dist/schemas.d.ts +323 -323
- package/dist/userHandle.d.ts +23 -2
- package/dist/userHandle.js +46 -6
- package/dist/userHandle.js.map +1 -1
- package/dist/weight.js.map +1 -1
- package/package.json +1 -5
package/dist/userHandle.d.ts
CHANGED
|
@@ -1,14 +1,35 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
export declare const HANDLE_MIN_LENGTH = 3;
|
|
3
|
+
export declare const HANDLE_MAX_LENGTH = 30;
|
|
2
4
|
export declare function userHandle(input: {
|
|
3
5
|
handle?: string | null | undefined;
|
|
4
6
|
email: string;
|
|
5
7
|
}): string;
|
|
6
8
|
export declare function isValidHandle(s: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Канонический вид введённого username. Регистронезависимость уникальности
|
|
11
|
+
* держится именно на этом: алфавит handle верхний регистр не допускает вообще,
|
|
12
|
+
* поэтому достаточно нормализовать ввод до записи — `Ilya` и `ilya` станут
|
|
13
|
+
* одним значением и упрутся в обычный UNIQUE, а не разъедутся в два аккаунта.
|
|
14
|
+
*/
|
|
15
|
+
export declare function normalizeHandle(s: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Кандидаты на замену занятому username: `ilya` → `ilya1`, `ilya2`, …
|
|
18
|
+
*
|
|
19
|
+
* Зачем: раньше «занято» было возможно только внутри воркспейса, где люди друг
|
|
20
|
+
* друга знают и договорятся; теперь username конкурирует со всей базой, и
|
|
21
|
+
* голый отказ оставляет человека угадывать. Суффикс числовой, а не случайные
|
|
22
|
+
* буквы — в подсказке должно узнаваться своё имя.
|
|
23
|
+
*
|
|
24
|
+
* Свободен ли кандидат, знает только БД: генератор отдаёт пул по порядку,
|
|
25
|
+
* вызывающий отбирает незанятые (см. api users/handle.ts).
|
|
26
|
+
*/
|
|
27
|
+
export declare function handleCandidates(desired: string, count: number): string[];
|
|
7
28
|
export declare const HandleInput: z.ZodObject<{
|
|
8
|
-
handle: z.ZodString
|
|
29
|
+
handle: z.ZodEffects<z.ZodString, string, unknown>;
|
|
9
30
|
}, "strip", z.ZodTypeAny, {
|
|
10
31
|
handle: string;
|
|
11
32
|
}, {
|
|
12
|
-
handle
|
|
33
|
+
handle?: unknown;
|
|
13
34
|
}>;
|
|
14
35
|
export declare const HANDLE_REGEX_SOURCE: string;
|
package/dist/userHandle.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
// @username
|
|
2
|
-
//
|
|
1
|
+
// @username юзера. PRJ4-64: ГЛОБАЛЬНЫЙ — живёт на User и уникален во всём
|
|
2
|
+
// Taskless (до этого лежал на WorkspaceMember и был уникален лишь
|
|
3
|
+
// per-workspace). Если не задан — фолбэк на email-local-part в lowercase:
|
|
4
|
+
// заставлять всех придумывать username ради переезда — плохой обмен.
|
|
3
5
|
//
|
|
4
6
|
// Используется во всех точках где UI/LLM пишет упоминания (агент,
|
|
5
7
|
// чат комнаты, TipTap-mentions в задачах/комментариях).
|
|
6
8
|
import { z } from "zod";
|
|
7
9
|
const HANDLE_RE = /^[a-z0-9][a-z0-9._-]{2,29}$/;
|
|
10
|
+
export const HANDLE_MIN_LENGTH = 3;
|
|
11
|
+
export const HANDLE_MAX_LENGTH = 30;
|
|
8
12
|
export function userHandle(input) {
|
|
9
13
|
if (input.handle && HANDLE_RE.test(input.handle))
|
|
10
14
|
return input.handle;
|
|
@@ -14,12 +18,48 @@ export function userHandle(input) {
|
|
|
14
18
|
export function isValidHandle(s) {
|
|
15
19
|
return HANDLE_RE.test(s);
|
|
16
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Канонический вид введённого username. Регистронезависимость уникальности
|
|
23
|
+
* держится именно на этом: алфавит handle верхний регистр не допускает вообще,
|
|
24
|
+
* поэтому достаточно нормализовать ввод до записи — `Ilya` и `ilya` станут
|
|
25
|
+
* одним значением и упрутся в обычный UNIQUE, а не разъедутся в два аккаунта.
|
|
26
|
+
*/
|
|
27
|
+
export function normalizeHandle(s) {
|
|
28
|
+
return s.trim().toLowerCase();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Кандидаты на замену занятому username: `ilya` → `ilya1`, `ilya2`, …
|
|
32
|
+
*
|
|
33
|
+
* Зачем: раньше «занято» было возможно только внутри воркспейса, где люди друг
|
|
34
|
+
* друга знают и договорятся; теперь username конкурирует со всей базой, и
|
|
35
|
+
* голый отказ оставляет человека угадывать. Суффикс числовой, а не случайные
|
|
36
|
+
* буквы — в подсказке должно узнаваться своё имя.
|
|
37
|
+
*
|
|
38
|
+
* Свободен ли кандидат, знает только БД: генератор отдаёт пул по порядку,
|
|
39
|
+
* вызывающий отбирает незанятые (см. api users/handle.ts).
|
|
40
|
+
*/
|
|
41
|
+
export function handleCandidates(desired, count) {
|
|
42
|
+
const base = normalizeHandle(desired);
|
|
43
|
+
const out = [];
|
|
44
|
+
for (let i = 1; out.length < count; i++) {
|
|
45
|
+
const suffix = String(i);
|
|
46
|
+
const candidate = base.slice(0, HANDLE_MAX_LENGTH - suffix.length) + suffix;
|
|
47
|
+
if (isValidHandle(candidate))
|
|
48
|
+
out.push(candidate);
|
|
49
|
+
else
|
|
50
|
+
break; // база нечитаемая (пустая/неверный первый символ) — суффикс не спасёт
|
|
51
|
+
}
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
// Нормализация ДО проверки регекспом, а не после: регексп верхний регистр не
|
|
55
|
+
// принимает, и без preprocess `Ilya` отбивался бы как «неверный символ» вместо
|
|
56
|
+
// того чтобы стать `ilya`.
|
|
17
57
|
export const HandleInput = z.object({
|
|
18
|
-
handle: z
|
|
58
|
+
handle: z.preprocess((v) => (typeof v === "string" ? normalizeHandle(v) : v), z
|
|
19
59
|
.string()
|
|
20
|
-
.min(
|
|
21
|
-
.max(
|
|
22
|
-
.regex(HANDLE_RE, "только латиница/цифры/. _ -, начинается с буквы или цифры"),
|
|
60
|
+
.min(HANDLE_MIN_LENGTH)
|
|
61
|
+
.max(HANDLE_MAX_LENGTH)
|
|
62
|
+
.regex(HANDLE_RE, "только латиница/цифры/. _ -, начинается с буквы или цифры")),
|
|
23
63
|
});
|
|
24
64
|
export const HANDLE_REGEX_SOURCE = HANDLE_RE.source;
|
|
25
65
|
//# sourceMappingURL=userHandle.js.map
|
package/dist/userHandle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userHandle.js","sourceRoot":"","sources":["../src/userHandle.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"userHandle.js","sourceRoot":"","sources":["../src/userHandle.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,kEAAkE;AAClE,0EAA0E;AAC1E,qEAAqE;AACrE,EAAE;AACF,kEAAkE;AAClE,wDAAwD;AAExD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,SAAS,GAAG,6BAA6B,CAAC;AAEhD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAEpC,MAAM,UAAU,UAAU,CAAC,KAA4D;IACrF,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IACtE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC7D,OAAO,KAAK,IAAI,MAAM,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,CAAS;IACvC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,KAAa;IAC7D,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;QAC5E,IAAI,aAAa,CAAC,SAAS,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;;YAC7C,MAAM,CAAC,sEAAsE;IACpF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,6EAA6E;AAC7E,+EAA+E;AAC/E,2BAA2B;AAC3B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,MAAM,EAAE,CAAC,CAAC,UAAU,CAClB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACvD,CAAC;SACE,MAAM,EAAE;SACR,GAAG,CAAC,iBAAiB,CAAC;SACtB,GAAG,CAAC,iBAAiB,CAAC;SACtB,KAAK,CAAC,SAAS,EAAE,2DAA2D,CAAC,CACjF;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,SAAS,CAAC,MAAM,CAAC"}
|
package/dist/weight.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weight.js","sourceRoot":"","sources":["../src/weight.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,6DAA6D;AAC7D,EAAE;AACF,WAAW;AACX,EAAE;AACF,6DAA6D;AAC7D,EAAE;AACF,6BAA6B;AAC7B,sCAAsC;AACtC,qEAAqE;AACrE,wEAAwE;AACxE,kEAAkE;AAClE,EAAE;AACF,2BAA2B;AAC3B,kEAAkE;AAClE,sCAAsC;AACtC,EAAE;AACF,YAAY;AACZ,uBAAuB;AACvB,2DAA2D;AAC3D,uEAAuE;AACvE,sCAAsC;AAUtC,SAAS,MAAM,CAAC,CAAgB;IAC9B,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,SAAS,CAAC,EAAU;IAC3B,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,UAAoC,EACpC,
|
|
1
|
+
{"version":3,"file":"weight.js","sourceRoot":"","sources":["../src/weight.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,6DAA6D;AAC7D,EAAE;AACF,WAAW;AACX,EAAE;AACF,6DAA6D;AAC7D,EAAE;AACF,6BAA6B;AAC7B,sCAAsC;AACtC,qEAAqE;AACrE,wEAAwE;AACxE,kEAAkE;AAClE,EAAE;AACF,2BAA2B;AAC3B,kEAAkE;AAClE,sCAAsC;AACtC,EAAE;AACF,YAAY;AACZ,uBAAuB;AACvB,2DAA2D;AAC3D,uEAAuE;AACvE,sCAAsC;AAUtC,SAAS,MAAM,CAAC,CAAgB;IAC9B,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,SAAS,CAAC,EAAU;IAC3B,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,UAAoC,EACpC,GAAG,GAAS,IAAI,IAAI,EAAE;IAEtB,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC9C,IAAI,EAAE,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,yEAAyE;AACzE,0EAA0E;AAC1E,yDAAyD;AACzD,MAAM,UAAU,sBAAsB,CACpC,aAA+C,EAC/C,gBAAkD;IAElD,IAAI,CAAC,gBAAgB;QAAE,OAAO,aAAa,IAAI,IAAI,CAAC;IACpD,IAAI,CAAC,aAAa;QAAE,OAAO,gBAAgB,CAAC;IAC5C,OAAO,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE;QACzE,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,aAAa,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,WAAsC,EACtC,GAAG,GAAS,IAAI,IAAI,EAAE;IAEtB,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAgB,EAAE,GAAG,GAAS,IAAI,IAAI,EAAE;IACxE,OAAO,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC;UACjC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,2EAA2E;AAC3E,0CAA0C;AAC1C,EAAE;AACF,qBAAqB;AACrB,yBAAyB;AACzB,MAAM,UAAU,WAAW,CAAC,IAAgB,EAAE,GAAG,GAAS,IAAI,IAAI,EAAE;IAClE,IAAI,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3E,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@taskless-app/shared",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Shared types, Zod schemas and design tokens for the Taskless API contract — consumed by @taskless/api, @taskless/web and the Taskless mobile app.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,10 +18,6 @@
|
|
|
18
18
|
"dependencies": {
|
|
19
19
|
"zod": "3.25.76"
|
|
20
20
|
},
|
|
21
|
-
"devDependencies": {
|
|
22
|
-
"typescript": "5.7.3",
|
|
23
|
-
"vitest": "2.1.8"
|
|
24
|
-
},
|
|
25
21
|
"scripts": {
|
|
26
22
|
"build": "tsc -p tsconfig.build.json",
|
|
27
23
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|