@m5kdev/commons 0.21.9 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,8 +2,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region src/modules/auth/auth.constants.ts
3
3
  const ADMIN_CREATE_VERIFIED_USER_HEADER = "Admin-Create-Verified-User";
4
4
  const ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE = "true";
5
+ const USER_LOCALE_HEADER = "User-Locale";
5
6
  //#endregion
6
7
  exports.ADMIN_CREATE_VERIFIED_USER_HEADER = ADMIN_CREATE_VERIFIED_USER_HEADER;
7
8
  exports.ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE = ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE;
9
+ exports.USER_LOCALE_HEADER = USER_LOCALE_HEADER;
8
10
 
9
11
  //# sourceMappingURL=auth.constants.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.constants.cjs","names":[],"sources":["../../../../src/modules/auth/auth.constants.ts"],"sourcesContent":["export const ADMIN_CREATE_VERIFIED_USER_HEADER = \"Admin-Create-Verified-User\" as const;\r\nexport const ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE = \"true\" as const;\r\n"],"mappings":";;AAAA,MAAa,oCAAoC;AACjD,MAAa,0CAA0C"}
1
+ {"version":3,"file":"auth.constants.cjs","names":[],"sources":["../../../../src/modules/auth/auth.constants.ts"],"sourcesContent":["export const ADMIN_CREATE_VERIFIED_USER_HEADER = \"Admin-Create-Verified-User\" as const;\r\nexport const ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE = \"true\" as const;\r\nexport const USER_LOCALE_HEADER = \"User-Locale\" as const;\r\n"],"mappings":";;AAAA,MAAa,oCAAoC;AACjD,MAAa,0CAA0C;AACvD,MAAa,qBAAqB"}
@@ -1,6 +1,7 @@
1
1
  //#region src/modules/auth/auth.constants.d.ts
2
2
  declare const ADMIN_CREATE_VERIFIED_USER_HEADER: "Admin-Create-Verified-User";
3
3
  declare const ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE: "true";
4
+ declare const USER_LOCALE_HEADER: "User-Locale";
4
5
  //#endregion
5
- export { ADMIN_CREATE_VERIFIED_USER_HEADER, ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE };
6
+ export { ADMIN_CREATE_VERIFIED_USER_HEADER, ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE, USER_LOCALE_HEADER };
6
7
  //# sourceMappingURL=auth.constants.d.cts.map
@@ -1,6 +1,7 @@
1
1
  //#region src/modules/auth/auth.constants.d.ts
2
2
  declare const ADMIN_CREATE_VERIFIED_USER_HEADER: "Admin-Create-Verified-User";
3
3
  declare const ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE: "true";
4
+ declare const USER_LOCALE_HEADER: "User-Locale";
4
5
  //#endregion
5
- export { ADMIN_CREATE_VERIFIED_USER_HEADER, ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE };
6
+ export { ADMIN_CREATE_VERIFIED_USER_HEADER, ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE, USER_LOCALE_HEADER };
6
7
  //# sourceMappingURL=auth.constants.d.mts.map
@@ -1,7 +1,8 @@
1
1
  //#region src/modules/auth/auth.constants.ts
2
2
  const ADMIN_CREATE_VERIFIED_USER_HEADER = "Admin-Create-Verified-User";
3
3
  const ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE = "true";
4
+ const USER_LOCALE_HEADER = "User-Locale";
4
5
  //#endregion
5
- export { ADMIN_CREATE_VERIFIED_USER_HEADER, ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE };
6
+ export { ADMIN_CREATE_VERIFIED_USER_HEADER, ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE, USER_LOCALE_HEADER };
6
7
 
7
8
  //# sourceMappingURL=auth.constants.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.constants.mjs","names":[],"sources":["../../../../src/modules/auth/auth.constants.ts"],"sourcesContent":["export const ADMIN_CREATE_VERIFIED_USER_HEADER = \"Admin-Create-Verified-User\" as const;\r\nexport const ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE = \"true\" as const;\r\n"],"mappings":";AAAA,MAAa,oCAAoC;AACjD,MAAa,0CAA0C"}
1
+ {"version":3,"file":"auth.constants.mjs","names":[],"sources":["../../../../src/modules/auth/auth.constants.ts"],"sourcesContent":["export const ADMIN_CREATE_VERIFIED_USER_HEADER = \"Admin-Create-Verified-User\" as const;\r\nexport const ADMIN_CREATE_VERIFIED_USER_HEADER_VALUE = \"true\" as const;\r\nexport const USER_LOCALE_HEADER = \"User-Locale\" as const;\r\n"],"mappings":";AAAA,MAAa,oCAAoC;AACjD,MAAa,0CAA0C;AACvD,MAAa,qBAAqB"}
@@ -0,0 +1,73 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let zod = require("zod");
3
+ //#region src/modules/auth/auth.locale.ts
4
+ function getAllowedLocaleCodes(config) {
5
+ return config.locales.map((locale) => locale.code);
6
+ }
7
+ function getLocaleDisplayName(config, code) {
8
+ return config.locales.find((locale) => locale.code === code)?.displayName ?? code;
9
+ }
10
+ function normalizeLocaleTag(tag) {
11
+ const trimmed = tag.trim();
12
+ if (!trimmed) return null;
13
+ const parts = trimmed.replace(/_/g, "-").split("-").filter(Boolean);
14
+ if (parts.length === 0) return null;
15
+ const language = parts[0].toLowerCase();
16
+ const region = parts.length > 1 ? parts[1].toUpperCase() : null;
17
+ return {
18
+ language,
19
+ region,
20
+ compareKey: region ? `${language}_${region}` : language
21
+ };
22
+ }
23
+ function buildCompareKeyFromCanonical(canonical) {
24
+ return normalizeLocaleTag(canonical)?.compareKey ?? canonical.toLowerCase();
25
+ }
26
+ function toCanonicalLocale(tag, allowedLocales) {
27
+ const normalized = normalizeLocaleTag(tag);
28
+ if (!normalized) return null;
29
+ const allowedByKey = /* @__PURE__ */ new Map();
30
+ for (const locale of allowedLocales) allowedByKey.set(buildCompareKeyFromCanonical(locale), locale);
31
+ if (normalized.region) {
32
+ const regionMatch = allowedByKey.get(`${normalized.language}_${normalized.region}`);
33
+ if (regionMatch) return regionMatch;
34
+ }
35
+ if (!normalized.region) {
36
+ const languageMatch = allowedByKey.get(normalized.language);
37
+ if (languageMatch) return languageMatch;
38
+ }
39
+ if (normalized.region) {
40
+ const languageMatch = allowedByKey.get(normalized.language);
41
+ if (languageMatch) return languageMatch;
42
+ }
43
+ return null;
44
+ }
45
+ function toI18nLanguageTag(canonical) {
46
+ const normalized = normalizeLocaleTag(canonical);
47
+ if (!normalized) return canonical;
48
+ if (normalized.region) return `${normalized.language}-${normalized.region}`;
49
+ return normalized.language;
50
+ }
51
+ function resolveAppLocale(requested, config) {
52
+ const allowedLocales = getAllowedLocaleCodes(config);
53
+ if (requested) {
54
+ const canonical = toCanonicalLocale(requested, allowedLocales);
55
+ if (canonical) return canonical;
56
+ }
57
+ return toCanonicalLocale(config.defaultLocale, allowedLocales) ?? allowedLocales[0] ?? config.defaultLocale;
58
+ }
59
+ function createLocaleValueSchema(config) {
60
+ const allowed = [...getAllowedLocaleCodes(config)];
61
+ if (allowed.length === 0) return zod.z.string();
62
+ return zod.z.enum(allowed);
63
+ }
64
+ //#endregion
65
+ exports.createLocaleValueSchema = createLocaleValueSchema;
66
+ exports.getAllowedLocaleCodes = getAllowedLocaleCodes;
67
+ exports.getLocaleDisplayName = getLocaleDisplayName;
68
+ exports.normalizeLocaleTag = normalizeLocaleTag;
69
+ exports.resolveAppLocale = resolveAppLocale;
70
+ exports.toCanonicalLocale = toCanonicalLocale;
71
+ exports.toI18nLanguageTag = toI18nLanguageTag;
72
+
73
+ //# sourceMappingURL=auth.locale.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.locale.cjs","names":["z"],"sources":["../../../../src/modules/auth/auth.locale.ts"],"sourcesContent":["import { z } from \"zod\";\r\n\r\nexport interface AuthLocaleDefinition {\r\n code: string;\r\n displayName: string;\r\n}\r\n\r\nexport interface AuthLocaleConfig {\r\n defaultLocale: string;\r\n locales: readonly AuthLocaleDefinition[];\r\n}\r\n\r\nexport function getAllowedLocaleCodes(config: AuthLocaleConfig): readonly string[] {\r\n return config.locales.map((locale) => locale.code);\r\n}\r\n\r\nexport function getLocaleDisplayName(config: AuthLocaleConfig, code: string): string {\r\n return config.locales.find((locale) => locale.code === code)?.displayName ?? code;\r\n}\r\n\r\nexport interface NormalizedLocaleTag {\r\n language: string;\r\n region: string | null;\r\n compareKey: string;\r\n}\r\n\r\nexport function normalizeLocaleTag(tag: string): NormalizedLocaleTag | null {\r\n const trimmed = tag.trim();\r\n if (!trimmed) return null;\r\n\r\n const parts = trimmed.replace(/_/g, \"-\").split(\"-\").filter(Boolean);\r\n if (parts.length === 0) return null;\r\n\r\n const language = parts[0].toLowerCase();\r\n const region = parts.length > 1 ? parts[1].toUpperCase() : null;\r\n const compareKey = region ? `${language}_${region}` : language;\r\n\r\n return { language, region, compareKey };\r\n}\r\n\r\nfunction buildCompareKeyFromCanonical(canonical: string): string {\r\n return normalizeLocaleTag(canonical)?.compareKey ?? canonical.toLowerCase();\r\n}\r\n\r\nexport function toCanonicalLocale(\r\n tag: string,\r\n allowedLocales: readonly string[]\r\n): string | null {\r\n const normalized = normalizeLocaleTag(tag);\r\n if (!normalized) return null;\r\n\r\n const allowedByKey = new Map<string, string>();\r\n for (const locale of allowedLocales) {\r\n allowedByKey.set(buildCompareKeyFromCanonical(locale), locale);\r\n }\r\n\r\n if (normalized.region) {\r\n const regionMatch = allowedByKey.get(`${normalized.language}_${normalized.region}`);\r\n if (regionMatch) return regionMatch;\r\n }\r\n\r\n if (!normalized.region) {\r\n const languageMatch = allowedByKey.get(normalized.language);\r\n if (languageMatch) return languageMatch;\r\n }\r\n\r\n if (normalized.region) {\r\n const languageMatch = allowedByKey.get(normalized.language);\r\n if (languageMatch) return languageMatch;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function toI18nLanguageTag(canonical: string): string {\r\n const normalized = normalizeLocaleTag(canonical);\r\n if (!normalized) return canonical;\r\n if (normalized.region) {\r\n return `${normalized.language}-${normalized.region}`;\r\n }\r\n return normalized.language;\r\n}\r\n\r\nexport function resolveAppLocale(\r\n requested: string | null | undefined,\r\n config: AuthLocaleConfig\r\n): string {\r\n const allowedLocales = getAllowedLocaleCodes(config);\r\n if (requested) {\r\n const canonical = toCanonicalLocale(requested, allowedLocales);\r\n if (canonical) return canonical;\r\n }\r\n\r\n const defaultCanonical = toCanonicalLocale(config.defaultLocale, allowedLocales);\r\n return defaultCanonical ?? allowedLocales[0] ?? config.defaultLocale;\r\n}\r\n\r\nexport function createLocaleValueSchema(config: AuthLocaleConfig) {\r\n const allowed = [...getAllowedLocaleCodes(config)];\r\n if (allowed.length === 0) {\r\n return z.string();\r\n }\r\n return z.enum(allowed as [string, ...string[]]);\r\n}\r\n"],"mappings":";;;AAYA,SAAgB,sBAAsB,QAA6C;AACjF,QAAO,OAAO,QAAQ,KAAK,WAAW,OAAO,KAAK;;AAGpD,SAAgB,qBAAqB,QAA0B,MAAsB;AACnF,QAAO,OAAO,QAAQ,MAAM,WAAW,OAAO,SAAS,KAAK,EAAE,eAAe;;AAS/E,SAAgB,mBAAmB,KAAyC;CAC1E,MAAM,UAAU,IAAI,MAAM;AAC1B,KAAI,CAAC,QAAS,QAAO;CAErB,MAAM,QAAQ,QAAQ,QAAQ,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,QAAQ;AACnE,KAAI,MAAM,WAAW,EAAG,QAAO;CAE/B,MAAM,WAAW,MAAM,GAAG,aAAa;CACvC,MAAM,SAAS,MAAM,SAAS,IAAI,MAAM,GAAG,aAAa,GAAG;AAG3D,QAAO;EAAE;EAAU;EAAQ,YAFR,SAAS,GAAG,SAAS,GAAG,WAAW;EAEf;;AAGzC,SAAS,6BAA6B,WAA2B;AAC/D,QAAO,mBAAmB,UAAU,EAAE,cAAc,UAAU,aAAa;;AAG7E,SAAgB,kBACd,KACA,gBACe;CACf,MAAM,aAAa,mBAAmB,IAAI;AAC1C,KAAI,CAAC,WAAY,QAAO;CAExB,MAAM,+BAAe,IAAI,KAAqB;AAC9C,MAAK,MAAM,UAAU,eACnB,cAAa,IAAI,6BAA6B,OAAO,EAAE,OAAO;AAGhE,KAAI,WAAW,QAAQ;EACrB,MAAM,cAAc,aAAa,IAAI,GAAG,WAAW,SAAS,GAAG,WAAW,SAAS;AACnF,MAAI,YAAa,QAAO;;AAG1B,KAAI,CAAC,WAAW,QAAQ;EACtB,MAAM,gBAAgB,aAAa,IAAI,WAAW,SAAS;AAC3D,MAAI,cAAe,QAAO;;AAG5B,KAAI,WAAW,QAAQ;EACrB,MAAM,gBAAgB,aAAa,IAAI,WAAW,SAAS;AAC3D,MAAI,cAAe,QAAO;;AAG5B,QAAO;;AAGT,SAAgB,kBAAkB,WAA2B;CAC3D,MAAM,aAAa,mBAAmB,UAAU;AAChD,KAAI,CAAC,WAAY,QAAO;AACxB,KAAI,WAAW,OACb,QAAO,GAAG,WAAW,SAAS,GAAG,WAAW;AAE9C,QAAO,WAAW;;AAGpB,SAAgB,iBACd,WACA,QACQ;CACR,MAAM,iBAAiB,sBAAsB,OAAO;AACpD,KAAI,WAAW;EACb,MAAM,YAAY,kBAAkB,WAAW,eAAe;AAC9D,MAAI,UAAW,QAAO;;AAIxB,QADyB,kBAAkB,OAAO,eAAe,eAAe,IACrD,eAAe,MAAM,OAAO;;AAGzD,SAAgB,wBAAwB,QAA0B;CAChE,MAAM,UAAU,CAAC,GAAG,sBAAsB,OAAO,CAAC;AAClD,KAAI,QAAQ,WAAW,EACrB,QAAOA,IAAAA,EAAE,QAAQ;AAEnB,QAAOA,IAAAA,EAAE,KAAK,QAAiC"}
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+
3
+ //#region src/modules/auth/auth.locale.d.ts
4
+ interface AuthLocaleDefinition {
5
+ code: string;
6
+ displayName: string;
7
+ }
8
+ interface AuthLocaleConfig {
9
+ defaultLocale: string;
10
+ locales: readonly AuthLocaleDefinition[];
11
+ }
12
+ declare function getAllowedLocaleCodes(config: AuthLocaleConfig): readonly string[];
13
+ declare function getLocaleDisplayName(config: AuthLocaleConfig, code: string): string;
14
+ interface NormalizedLocaleTag {
15
+ language: string;
16
+ region: string | null;
17
+ compareKey: string;
18
+ }
19
+ declare function normalizeLocaleTag(tag: string): NormalizedLocaleTag | null;
20
+ declare function toCanonicalLocale(tag: string, allowedLocales: readonly string[]): string | null;
21
+ declare function toI18nLanguageTag(canonical: string): string;
22
+ declare function resolveAppLocale(requested: string | null | undefined, config: AuthLocaleConfig): string;
23
+ declare function createLocaleValueSchema(config: AuthLocaleConfig): z.ZodString | z.ZodEnum<{
24
+ [x: string]: string;
25
+ }>;
26
+ //#endregion
27
+ export { AuthLocaleConfig, AuthLocaleDefinition, NormalizedLocaleTag, createLocaleValueSchema, getAllowedLocaleCodes, getLocaleDisplayName, normalizeLocaleTag, resolveAppLocale, toCanonicalLocale, toI18nLanguageTag };
28
+ //# sourceMappingURL=auth.locale.d.cts.map
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+
3
+ //#region src/modules/auth/auth.locale.d.ts
4
+ interface AuthLocaleDefinition {
5
+ code: string;
6
+ displayName: string;
7
+ }
8
+ interface AuthLocaleConfig {
9
+ defaultLocale: string;
10
+ locales: readonly AuthLocaleDefinition[];
11
+ }
12
+ declare function getAllowedLocaleCodes(config: AuthLocaleConfig): readonly string[];
13
+ declare function getLocaleDisplayName(config: AuthLocaleConfig, code: string): string;
14
+ interface NormalizedLocaleTag {
15
+ language: string;
16
+ region: string | null;
17
+ compareKey: string;
18
+ }
19
+ declare function normalizeLocaleTag(tag: string): NormalizedLocaleTag | null;
20
+ declare function toCanonicalLocale(tag: string, allowedLocales: readonly string[]): string | null;
21
+ declare function toI18nLanguageTag(canonical: string): string;
22
+ declare function resolveAppLocale(requested: string | null | undefined, config: AuthLocaleConfig): string;
23
+ declare function createLocaleValueSchema(config: AuthLocaleConfig): z.ZodString | z.ZodEnum<{
24
+ [x: string]: string;
25
+ }>;
26
+ //#endregion
27
+ export { AuthLocaleConfig, AuthLocaleDefinition, NormalizedLocaleTag, createLocaleValueSchema, getAllowedLocaleCodes, getLocaleDisplayName, normalizeLocaleTag, resolveAppLocale, toCanonicalLocale, toI18nLanguageTag };
28
+ //# sourceMappingURL=auth.locale.d.mts.map
@@ -0,0 +1,66 @@
1
+ import { z } from "zod";
2
+ //#region src/modules/auth/auth.locale.ts
3
+ function getAllowedLocaleCodes(config) {
4
+ return config.locales.map((locale) => locale.code);
5
+ }
6
+ function getLocaleDisplayName(config, code) {
7
+ return config.locales.find((locale) => locale.code === code)?.displayName ?? code;
8
+ }
9
+ function normalizeLocaleTag(tag) {
10
+ const trimmed = tag.trim();
11
+ if (!trimmed) return null;
12
+ const parts = trimmed.replace(/_/g, "-").split("-").filter(Boolean);
13
+ if (parts.length === 0) return null;
14
+ const language = parts[0].toLowerCase();
15
+ const region = parts.length > 1 ? parts[1].toUpperCase() : null;
16
+ return {
17
+ language,
18
+ region,
19
+ compareKey: region ? `${language}_${region}` : language
20
+ };
21
+ }
22
+ function buildCompareKeyFromCanonical(canonical) {
23
+ return normalizeLocaleTag(canonical)?.compareKey ?? canonical.toLowerCase();
24
+ }
25
+ function toCanonicalLocale(tag, allowedLocales) {
26
+ const normalized = normalizeLocaleTag(tag);
27
+ if (!normalized) return null;
28
+ const allowedByKey = /* @__PURE__ */ new Map();
29
+ for (const locale of allowedLocales) allowedByKey.set(buildCompareKeyFromCanonical(locale), locale);
30
+ if (normalized.region) {
31
+ const regionMatch = allowedByKey.get(`${normalized.language}_${normalized.region}`);
32
+ if (regionMatch) return regionMatch;
33
+ }
34
+ if (!normalized.region) {
35
+ const languageMatch = allowedByKey.get(normalized.language);
36
+ if (languageMatch) return languageMatch;
37
+ }
38
+ if (normalized.region) {
39
+ const languageMatch = allowedByKey.get(normalized.language);
40
+ if (languageMatch) return languageMatch;
41
+ }
42
+ return null;
43
+ }
44
+ function toI18nLanguageTag(canonical) {
45
+ const normalized = normalizeLocaleTag(canonical);
46
+ if (!normalized) return canonical;
47
+ if (normalized.region) return `${normalized.language}-${normalized.region}`;
48
+ return normalized.language;
49
+ }
50
+ function resolveAppLocale(requested, config) {
51
+ const allowedLocales = getAllowedLocaleCodes(config);
52
+ if (requested) {
53
+ const canonical = toCanonicalLocale(requested, allowedLocales);
54
+ if (canonical) return canonical;
55
+ }
56
+ return toCanonicalLocale(config.defaultLocale, allowedLocales) ?? allowedLocales[0] ?? config.defaultLocale;
57
+ }
58
+ function createLocaleValueSchema(config) {
59
+ const allowed = [...getAllowedLocaleCodes(config)];
60
+ if (allowed.length === 0) return z.string();
61
+ return z.enum(allowed);
62
+ }
63
+ //#endregion
64
+ export { createLocaleValueSchema, getAllowedLocaleCodes, getLocaleDisplayName, normalizeLocaleTag, resolveAppLocale, toCanonicalLocale, toI18nLanguageTag };
65
+
66
+ //# sourceMappingURL=auth.locale.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.locale.mjs","names":[],"sources":["../../../../src/modules/auth/auth.locale.ts"],"sourcesContent":["import { z } from \"zod\";\r\n\r\nexport interface AuthLocaleDefinition {\r\n code: string;\r\n displayName: string;\r\n}\r\n\r\nexport interface AuthLocaleConfig {\r\n defaultLocale: string;\r\n locales: readonly AuthLocaleDefinition[];\r\n}\r\n\r\nexport function getAllowedLocaleCodes(config: AuthLocaleConfig): readonly string[] {\r\n return config.locales.map((locale) => locale.code);\r\n}\r\n\r\nexport function getLocaleDisplayName(config: AuthLocaleConfig, code: string): string {\r\n return config.locales.find((locale) => locale.code === code)?.displayName ?? code;\r\n}\r\n\r\nexport interface NormalizedLocaleTag {\r\n language: string;\r\n region: string | null;\r\n compareKey: string;\r\n}\r\n\r\nexport function normalizeLocaleTag(tag: string): NormalizedLocaleTag | null {\r\n const trimmed = tag.trim();\r\n if (!trimmed) return null;\r\n\r\n const parts = trimmed.replace(/_/g, \"-\").split(\"-\").filter(Boolean);\r\n if (parts.length === 0) return null;\r\n\r\n const language = parts[0].toLowerCase();\r\n const region = parts.length > 1 ? parts[1].toUpperCase() : null;\r\n const compareKey = region ? `${language}_${region}` : language;\r\n\r\n return { language, region, compareKey };\r\n}\r\n\r\nfunction buildCompareKeyFromCanonical(canonical: string): string {\r\n return normalizeLocaleTag(canonical)?.compareKey ?? canonical.toLowerCase();\r\n}\r\n\r\nexport function toCanonicalLocale(\r\n tag: string,\r\n allowedLocales: readonly string[]\r\n): string | null {\r\n const normalized = normalizeLocaleTag(tag);\r\n if (!normalized) return null;\r\n\r\n const allowedByKey = new Map<string, string>();\r\n for (const locale of allowedLocales) {\r\n allowedByKey.set(buildCompareKeyFromCanonical(locale), locale);\r\n }\r\n\r\n if (normalized.region) {\r\n const regionMatch = allowedByKey.get(`${normalized.language}_${normalized.region}`);\r\n if (regionMatch) return regionMatch;\r\n }\r\n\r\n if (!normalized.region) {\r\n const languageMatch = allowedByKey.get(normalized.language);\r\n if (languageMatch) return languageMatch;\r\n }\r\n\r\n if (normalized.region) {\r\n const languageMatch = allowedByKey.get(normalized.language);\r\n if (languageMatch) return languageMatch;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function toI18nLanguageTag(canonical: string): string {\r\n const normalized = normalizeLocaleTag(canonical);\r\n if (!normalized) return canonical;\r\n if (normalized.region) {\r\n return `${normalized.language}-${normalized.region}`;\r\n }\r\n return normalized.language;\r\n}\r\n\r\nexport function resolveAppLocale(\r\n requested: string | null | undefined,\r\n config: AuthLocaleConfig\r\n): string {\r\n const allowedLocales = getAllowedLocaleCodes(config);\r\n if (requested) {\r\n const canonical = toCanonicalLocale(requested, allowedLocales);\r\n if (canonical) return canonical;\r\n }\r\n\r\n const defaultCanonical = toCanonicalLocale(config.defaultLocale, allowedLocales);\r\n return defaultCanonical ?? allowedLocales[0] ?? config.defaultLocale;\r\n}\r\n\r\nexport function createLocaleValueSchema(config: AuthLocaleConfig) {\r\n const allowed = [...getAllowedLocaleCodes(config)];\r\n if (allowed.length === 0) {\r\n return z.string();\r\n }\r\n return z.enum(allowed as [string, ...string[]]);\r\n}\r\n"],"mappings":";;AAYA,SAAgB,sBAAsB,QAA6C;AACjF,QAAO,OAAO,QAAQ,KAAK,WAAW,OAAO,KAAK;;AAGpD,SAAgB,qBAAqB,QAA0B,MAAsB;AACnF,QAAO,OAAO,QAAQ,MAAM,WAAW,OAAO,SAAS,KAAK,EAAE,eAAe;;AAS/E,SAAgB,mBAAmB,KAAyC;CAC1E,MAAM,UAAU,IAAI,MAAM;AAC1B,KAAI,CAAC,QAAS,QAAO;CAErB,MAAM,QAAQ,QAAQ,QAAQ,MAAM,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,QAAQ;AACnE,KAAI,MAAM,WAAW,EAAG,QAAO;CAE/B,MAAM,WAAW,MAAM,GAAG,aAAa;CACvC,MAAM,SAAS,MAAM,SAAS,IAAI,MAAM,GAAG,aAAa,GAAG;AAG3D,QAAO;EAAE;EAAU;EAAQ,YAFR,SAAS,GAAG,SAAS,GAAG,WAAW;EAEf;;AAGzC,SAAS,6BAA6B,WAA2B;AAC/D,QAAO,mBAAmB,UAAU,EAAE,cAAc,UAAU,aAAa;;AAG7E,SAAgB,kBACd,KACA,gBACe;CACf,MAAM,aAAa,mBAAmB,IAAI;AAC1C,KAAI,CAAC,WAAY,QAAO;CAExB,MAAM,+BAAe,IAAI,KAAqB;AAC9C,MAAK,MAAM,UAAU,eACnB,cAAa,IAAI,6BAA6B,OAAO,EAAE,OAAO;AAGhE,KAAI,WAAW,QAAQ;EACrB,MAAM,cAAc,aAAa,IAAI,GAAG,WAAW,SAAS,GAAG,WAAW,SAAS;AACnF,MAAI,YAAa,QAAO;;AAG1B,KAAI,CAAC,WAAW,QAAQ;EACtB,MAAM,gBAAgB,aAAa,IAAI,WAAW,SAAS;AAC3D,MAAI,cAAe,QAAO;;AAG5B,KAAI,WAAW,QAAQ;EACrB,MAAM,gBAAgB,aAAa,IAAI,WAAW,SAAS;AAC3D,MAAI,cAAe,QAAO;;AAG5B,QAAO;;AAGT,SAAgB,kBAAkB,WAA2B;CAC3D,MAAM,aAAa,mBAAmB,UAAU;AAChD,KAAI,CAAC,WAAY,QAAO;AACxB,KAAI,WAAW,OACb,QAAO,GAAG,WAAW,SAAS,GAAG,WAAW;AAE9C,QAAO,WAAW;;AAGpB,SAAgB,iBACd,WACA,QACQ;CACR,MAAM,iBAAiB,sBAAsB,OAAO;AACpD,KAAI,WAAW;EACb,MAAM,YAAY,kBAAkB,WAAW,eAAe;AAC9D,MAAI,UAAW,QAAO;;AAIxB,QADyB,kBAAkB,OAAO,eAAe,eAAe,IACrD,eAAe,MAAM,OAAO;;AAGzD,SAAgB,wBAAwB,QAA0B;CAChE,MAAM,UAAU,CAAC,GAAG,sBAAsB,OAAO,CAAC;AAClD,KAAI,QAAQ,WAAW,EACrB,QAAO,EAAE,QAAQ;AAEnB,QAAO,EAAE,KAAK,QAAiC"}
@@ -0,0 +1,85 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let zod = require("zod");
3
+ const DEFAULT_AUTH_ROLES = {
4
+ user: {
5
+ roles: ["user", "admin"],
6
+ managerRoles: ["admin"],
7
+ assignableRoles: ["user", "admin"],
8
+ defaultRole: "user"
9
+ },
10
+ organization: {
11
+ roles: [
12
+ "member",
13
+ "admin",
14
+ "owner"
15
+ ],
16
+ managerRoles: ["admin", "owner"],
17
+ assignableRoles: [
18
+ "member",
19
+ "admin",
20
+ "owner"
21
+ ],
22
+ defaultRole: "member"
23
+ },
24
+ team: {
25
+ roles: ["owner"],
26
+ managerRoles: ["owner"],
27
+ assignableRoles: ["owner"],
28
+ defaultRole: "owner"
29
+ }
30
+ };
31
+ function pickSubset(values, allowed, fallback) {
32
+ const allowedSet = new Set(allowed);
33
+ const picked = values.filter((value) => allowedSet.has(value));
34
+ if (picked.length > 0) return picked;
35
+ const fallbackPicked = fallback.filter((value) => allowedSet.has(value));
36
+ if (fallbackPicked.length > 0) return fallbackPicked;
37
+ return allowed.length > 0 ? [allowed[0]] : [];
38
+ }
39
+ function normalizeRoleScopeConfig(scope, defaults) {
40
+ const roles = scope.roles.length > 0 ? scope.roles : defaults.roles;
41
+ const roleSet = new Set(roles);
42
+ const defaultRole = scope.defaultRole && roleSet.has(scope.defaultRole) ? scope.defaultRole : defaults.defaultRole && roleSet.has(defaults.defaultRole) ? defaults.defaultRole : roles[0];
43
+ return {
44
+ roles,
45
+ managerRoles: pickSubset(scope.managerRoles ?? defaults.managerRoles, roles, defaults.managerRoles),
46
+ assignableRoles: pickSubset(scope.assignableRoles ?? roles, roles, roles),
47
+ defaultRole
48
+ };
49
+ }
50
+ function normalizeAuthRolesConfig(config) {
51
+ if (!config) return DEFAULT_AUTH_ROLES;
52
+ return {
53
+ user: normalizeRoleScopeConfig(config.user, DEFAULT_AUTH_ROLES.user),
54
+ organization: normalizeRoleScopeConfig(config.organization, DEFAULT_AUTH_ROLES.organization),
55
+ team: normalizeRoleScopeConfig(config.team, DEFAULT_AUTH_ROLES.team)
56
+ };
57
+ }
58
+ function defineAuthRoles(config) {
59
+ return normalizeAuthRolesConfig(config);
60
+ }
61
+ function getRoleKeys(config, scope) {
62
+ return config[scope].roles;
63
+ }
64
+ function isAllowedRole(config, scope, role) {
65
+ return getRoleKeys(config, scope).includes(role);
66
+ }
67
+ function createRoleValueSchema(scope) {
68
+ const allowed = [...scope.roles];
69
+ if (allowed.length === 0) return zod.z.string();
70
+ return zod.z.enum(allowed);
71
+ }
72
+ function getAppRoleTranslationKey(scope, role) {
73
+ return `${scope}.role.${role}`;
74
+ }
75
+ //#endregion
76
+ exports.DEFAULT_AUTH_ROLES = DEFAULT_AUTH_ROLES;
77
+ exports.createRoleValueSchema = createRoleValueSchema;
78
+ exports.defineAuthRoles = defineAuthRoles;
79
+ exports.getAppRoleTranslationKey = getAppRoleTranslationKey;
80
+ exports.getRoleKeys = getRoleKeys;
81
+ exports.isAllowedRole = isAllowedRole;
82
+ exports.normalizeAuthRolesConfig = normalizeAuthRolesConfig;
83
+ exports.normalizeRoleScopeConfig = normalizeRoleScopeConfig;
84
+
85
+ //# sourceMappingURL=auth.roles.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.roles.cjs","names":["z"],"sources":["../../../../src/modules/auth/auth.roles.ts"],"sourcesContent":["import { z } from \"zod\";\r\n\r\nexport type AuthRoleScope = \"user\" | \"organization\" | \"team\";\r\n\r\nexport interface AuthRoleScopeConfig {\r\n roles: readonly string[];\r\n managerRoles?: readonly string[];\r\n assignableRoles?: readonly string[];\r\n defaultRole?: string;\r\n}\r\n\r\nexport interface AuthRolesConfig {\r\n user: AuthRoleScopeConfig;\r\n organization: AuthRoleScopeConfig;\r\n team: AuthRoleScopeConfig;\r\n}\r\n\r\nexport interface NormalizedAuthRoleScopeConfig {\r\n roles: readonly string[];\r\n managerRoles: readonly string[];\r\n assignableRoles: readonly string[];\r\n defaultRole: string;\r\n}\r\n\r\nexport interface NormalizedAuthRolesConfig {\r\n user: NormalizedAuthRoleScopeConfig;\r\n organization: NormalizedAuthRoleScopeConfig;\r\n team: NormalizedAuthRoleScopeConfig;\r\n}\r\n\r\nconst DEFAULT_USER_SCOPE: NormalizedAuthRoleScopeConfig = {\r\n roles: [\"user\", \"admin\"],\r\n managerRoles: [\"admin\"],\r\n assignableRoles: [\"user\", \"admin\"],\r\n defaultRole: \"user\",\r\n};\r\n\r\nconst DEFAULT_ORGANIZATION_SCOPE: NormalizedAuthRoleScopeConfig = {\r\n roles: [\"member\", \"admin\", \"owner\"],\r\n managerRoles: [\"admin\", \"owner\"],\r\n assignableRoles: [\"member\", \"admin\", \"owner\"],\r\n defaultRole: \"member\",\r\n};\r\n\r\nconst DEFAULT_TEAM_SCOPE: NormalizedAuthRoleScopeConfig = {\r\n roles: [\"owner\"],\r\n managerRoles: [\"owner\"],\r\n assignableRoles: [\"owner\"],\r\n defaultRole: \"owner\",\r\n};\r\n\r\nexport const DEFAULT_AUTH_ROLES: NormalizedAuthRolesConfig = {\r\n user: DEFAULT_USER_SCOPE,\r\n organization: DEFAULT_ORGANIZATION_SCOPE,\r\n team: DEFAULT_TEAM_SCOPE,\r\n};\r\n\r\nfunction pickSubset(\r\n values: readonly string[],\r\n allowed: readonly string[],\r\n fallback: readonly string[]\r\n): readonly string[] {\r\n const allowedSet = new Set(allowed);\r\n const picked = values.filter((value) => allowedSet.has(value));\r\n if (picked.length > 0) {\r\n return picked;\r\n }\r\n\r\n const fallbackPicked = fallback.filter((value) => allowedSet.has(value));\r\n if (fallbackPicked.length > 0) {\r\n return fallbackPicked;\r\n }\r\n\r\n return allowed.length > 0 ? [allowed[0]] : [];\r\n}\r\n\r\nexport function normalizeRoleScopeConfig(\r\n scope: AuthRoleScopeConfig,\r\n defaults: NormalizedAuthRoleScopeConfig\r\n): NormalizedAuthRoleScopeConfig {\r\n const roles = scope.roles.length > 0 ? scope.roles : defaults.roles;\r\n const roleSet = new Set(roles);\r\n\r\n const defaultRole =\r\n scope.defaultRole && roleSet.has(scope.defaultRole)\r\n ? scope.defaultRole\r\n : defaults.defaultRole && roleSet.has(defaults.defaultRole)\r\n ? defaults.defaultRole\r\n : roles[0];\r\n\r\n const managerRoles = pickSubset(\r\n scope.managerRoles ?? defaults.managerRoles,\r\n roles,\r\n defaults.managerRoles\r\n );\r\n\r\n const assignableRoles = pickSubset(\r\n scope.assignableRoles ?? roles,\r\n roles,\r\n roles\r\n );\r\n\r\n return {\r\n roles,\r\n managerRoles,\r\n assignableRoles,\r\n defaultRole,\r\n };\r\n}\r\n\r\nexport function normalizeAuthRolesConfig(\r\n config?: AuthRolesConfig | null\r\n): NormalizedAuthRolesConfig {\r\n if (!config) {\r\n return DEFAULT_AUTH_ROLES;\r\n }\r\n\r\n return {\r\n user: normalizeRoleScopeConfig(config.user, DEFAULT_AUTH_ROLES.user),\r\n organization: normalizeRoleScopeConfig(config.organization, DEFAULT_AUTH_ROLES.organization),\r\n team: normalizeRoleScopeConfig(config.team, DEFAULT_AUTH_ROLES.team),\r\n };\r\n}\r\n\r\nexport function defineAuthRoles(config: AuthRolesConfig): NormalizedAuthRolesConfig {\r\n return normalizeAuthRolesConfig(config);\r\n}\r\n\r\nexport function getRoleKeys(\r\n config: NormalizedAuthRolesConfig,\r\n scope: AuthRoleScope\r\n): readonly string[] {\r\n return config[scope].roles;\r\n}\r\n\r\nexport function isAllowedRole(\r\n config: NormalizedAuthRolesConfig,\r\n scope: AuthRoleScope,\r\n role: string\r\n): boolean {\r\n return getRoleKeys(config, scope).includes(role);\r\n}\r\n\r\nexport function createRoleValueSchema(scope: NormalizedAuthRoleScopeConfig) {\r\n const allowed = [...scope.roles];\r\n if (allowed.length === 0) {\r\n return z.string();\r\n }\r\n return z.enum(allowed as [string, ...string[]]);\r\n}\r\n\r\nexport function getAppRoleTranslationKey(scope: AuthRoleScope, role: string): string {\r\n return `${scope}.role.${role}`;\r\n}\r\n"],"mappings":";;AAmDA,MAAa,qBAAgD;CAC3D,MAtBwD;EACxD,OAAO,CAAC,QAAQ,QAAQ;EACxB,cAAc,CAAC,QAAQ;EACvB,iBAAiB,CAAC,QAAQ,QAAQ;EAClC,aAAa;EACd;CAkBC,cAhBgE;EAChE,OAAO;GAAC;GAAU;GAAS;GAAQ;EACnC,cAAc,CAAC,SAAS,QAAQ;EAChC,iBAAiB;GAAC;GAAU;GAAS;GAAQ;EAC7C,aAAa;EACd;CAYC,MAVwD;EACxD,OAAO,CAAC,QAAQ;EAChB,cAAc,CAAC,QAAQ;EACvB,iBAAiB,CAAC,QAAQ;EAC1B,aAAa;EACd;CAMA;AAED,SAAS,WACP,QACA,SACA,UACmB;CACnB,MAAM,aAAa,IAAI,IAAI,QAAQ;CACnC,MAAM,SAAS,OAAO,QAAQ,UAAU,WAAW,IAAI,MAAM,CAAC;AAC9D,KAAI,OAAO,SAAS,EAClB,QAAO;CAGT,MAAM,iBAAiB,SAAS,QAAQ,UAAU,WAAW,IAAI,MAAM,CAAC;AACxE,KAAI,eAAe,SAAS,EAC1B,QAAO;AAGT,QAAO,QAAQ,SAAS,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE;;AAG/C,SAAgB,yBACd,OACA,UAC+B;CAC/B,MAAM,QAAQ,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ,SAAS;CAC9D,MAAM,UAAU,IAAI,IAAI,MAAM;CAE9B,MAAM,cACJ,MAAM,eAAe,QAAQ,IAAI,MAAM,YAAY,GAC/C,MAAM,cACN,SAAS,eAAe,QAAQ,IAAI,SAAS,YAAY,GACvD,SAAS,cACT,MAAM;AAcd,QAAO;EACL;EACA,cAdmB,WACnB,MAAM,gBAAgB,SAAS,cAC/B,OACA,SAAS,aACV;EAWC,iBATsB,WACtB,MAAM,mBAAmB,OACzB,OACA,MACD;EAMC;EACD;;AAGH,SAAgB,yBACd,QAC2B;AAC3B,KAAI,CAAC,OACH,QAAO;AAGT,QAAO;EACL,MAAM,yBAAyB,OAAO,MAAM,mBAAmB,KAAK;EACpE,cAAc,yBAAyB,OAAO,cAAc,mBAAmB,aAAa;EAC5F,MAAM,yBAAyB,OAAO,MAAM,mBAAmB,KAAK;EACrE;;AAGH,SAAgB,gBAAgB,QAAoD;AAClF,QAAO,yBAAyB,OAAO;;AAGzC,SAAgB,YACd,QACA,OACmB;AACnB,QAAO,OAAO,OAAO;;AAGvB,SAAgB,cACd,QACA,OACA,MACS;AACT,QAAO,YAAY,QAAQ,MAAM,CAAC,SAAS,KAAK;;AAGlD,SAAgB,sBAAsB,OAAsC;CAC1E,MAAM,UAAU,CAAC,GAAG,MAAM,MAAM;AAChC,KAAI,QAAQ,WAAW,EACrB,QAAOA,IAAAA,EAAE,QAAQ;AAEnB,QAAOA,IAAAA,EAAE,KAAK,QAAiC;;AAGjD,SAAgB,yBAAyB,OAAsB,MAAsB;AACnF,QAAO,GAAG,MAAM,QAAQ"}
@@ -0,0 +1,39 @@
1
+ import { z } from "zod";
2
+
3
+ //#region src/modules/auth/auth.roles.d.ts
4
+ type AuthRoleScope = "user" | "organization" | "team";
5
+ interface AuthRoleScopeConfig {
6
+ roles: readonly string[];
7
+ managerRoles?: readonly string[];
8
+ assignableRoles?: readonly string[];
9
+ defaultRole?: string;
10
+ }
11
+ interface AuthRolesConfig {
12
+ user: AuthRoleScopeConfig;
13
+ organization: AuthRoleScopeConfig;
14
+ team: AuthRoleScopeConfig;
15
+ }
16
+ interface NormalizedAuthRoleScopeConfig {
17
+ roles: readonly string[];
18
+ managerRoles: readonly string[];
19
+ assignableRoles: readonly string[];
20
+ defaultRole: string;
21
+ }
22
+ interface NormalizedAuthRolesConfig {
23
+ user: NormalizedAuthRoleScopeConfig;
24
+ organization: NormalizedAuthRoleScopeConfig;
25
+ team: NormalizedAuthRoleScopeConfig;
26
+ }
27
+ declare const DEFAULT_AUTH_ROLES: NormalizedAuthRolesConfig;
28
+ declare function normalizeRoleScopeConfig(scope: AuthRoleScopeConfig, defaults: NormalizedAuthRoleScopeConfig): NormalizedAuthRoleScopeConfig;
29
+ declare function normalizeAuthRolesConfig(config?: AuthRolesConfig | null): NormalizedAuthRolesConfig;
30
+ declare function defineAuthRoles(config: AuthRolesConfig): NormalizedAuthRolesConfig;
31
+ declare function getRoleKeys(config: NormalizedAuthRolesConfig, scope: AuthRoleScope): readonly string[];
32
+ declare function isAllowedRole(config: NormalizedAuthRolesConfig, scope: AuthRoleScope, role: string): boolean;
33
+ declare function createRoleValueSchema(scope: NormalizedAuthRoleScopeConfig): z.ZodString | z.ZodEnum<{
34
+ [x: string]: string;
35
+ }>;
36
+ declare function getAppRoleTranslationKey(scope: AuthRoleScope, role: string): string;
37
+ //#endregion
38
+ export { AuthRoleScope, AuthRoleScopeConfig, AuthRolesConfig, DEFAULT_AUTH_ROLES, NormalizedAuthRoleScopeConfig, NormalizedAuthRolesConfig, createRoleValueSchema, defineAuthRoles, getAppRoleTranslationKey, getRoleKeys, isAllowedRole, normalizeAuthRolesConfig, normalizeRoleScopeConfig };
39
+ //# sourceMappingURL=auth.roles.d.cts.map
@@ -0,0 +1,39 @@
1
+ import { z } from "zod";
2
+
3
+ //#region src/modules/auth/auth.roles.d.ts
4
+ type AuthRoleScope = "user" | "organization" | "team";
5
+ interface AuthRoleScopeConfig {
6
+ roles: readonly string[];
7
+ managerRoles?: readonly string[];
8
+ assignableRoles?: readonly string[];
9
+ defaultRole?: string;
10
+ }
11
+ interface AuthRolesConfig {
12
+ user: AuthRoleScopeConfig;
13
+ organization: AuthRoleScopeConfig;
14
+ team: AuthRoleScopeConfig;
15
+ }
16
+ interface NormalizedAuthRoleScopeConfig {
17
+ roles: readonly string[];
18
+ managerRoles: readonly string[];
19
+ assignableRoles: readonly string[];
20
+ defaultRole: string;
21
+ }
22
+ interface NormalizedAuthRolesConfig {
23
+ user: NormalizedAuthRoleScopeConfig;
24
+ organization: NormalizedAuthRoleScopeConfig;
25
+ team: NormalizedAuthRoleScopeConfig;
26
+ }
27
+ declare const DEFAULT_AUTH_ROLES: NormalizedAuthRolesConfig;
28
+ declare function normalizeRoleScopeConfig(scope: AuthRoleScopeConfig, defaults: NormalizedAuthRoleScopeConfig): NormalizedAuthRoleScopeConfig;
29
+ declare function normalizeAuthRolesConfig(config?: AuthRolesConfig | null): NormalizedAuthRolesConfig;
30
+ declare function defineAuthRoles(config: AuthRolesConfig): NormalizedAuthRolesConfig;
31
+ declare function getRoleKeys(config: NormalizedAuthRolesConfig, scope: AuthRoleScope): readonly string[];
32
+ declare function isAllowedRole(config: NormalizedAuthRolesConfig, scope: AuthRoleScope, role: string): boolean;
33
+ declare function createRoleValueSchema(scope: NormalizedAuthRoleScopeConfig): z.ZodString | z.ZodEnum<{
34
+ [x: string]: string;
35
+ }>;
36
+ declare function getAppRoleTranslationKey(scope: AuthRoleScope, role: string): string;
37
+ //#endregion
38
+ export { AuthRoleScope, AuthRoleScopeConfig, AuthRolesConfig, DEFAULT_AUTH_ROLES, NormalizedAuthRoleScopeConfig, NormalizedAuthRolesConfig, createRoleValueSchema, defineAuthRoles, getAppRoleTranslationKey, getRoleKeys, isAllowedRole, normalizeAuthRolesConfig, normalizeRoleScopeConfig };
39
+ //# sourceMappingURL=auth.roles.d.mts.map
@@ -0,0 +1,77 @@
1
+ import { z } from "zod";
2
+ const DEFAULT_AUTH_ROLES = {
3
+ user: {
4
+ roles: ["user", "admin"],
5
+ managerRoles: ["admin"],
6
+ assignableRoles: ["user", "admin"],
7
+ defaultRole: "user"
8
+ },
9
+ organization: {
10
+ roles: [
11
+ "member",
12
+ "admin",
13
+ "owner"
14
+ ],
15
+ managerRoles: ["admin", "owner"],
16
+ assignableRoles: [
17
+ "member",
18
+ "admin",
19
+ "owner"
20
+ ],
21
+ defaultRole: "member"
22
+ },
23
+ team: {
24
+ roles: ["owner"],
25
+ managerRoles: ["owner"],
26
+ assignableRoles: ["owner"],
27
+ defaultRole: "owner"
28
+ }
29
+ };
30
+ function pickSubset(values, allowed, fallback) {
31
+ const allowedSet = new Set(allowed);
32
+ const picked = values.filter((value) => allowedSet.has(value));
33
+ if (picked.length > 0) return picked;
34
+ const fallbackPicked = fallback.filter((value) => allowedSet.has(value));
35
+ if (fallbackPicked.length > 0) return fallbackPicked;
36
+ return allowed.length > 0 ? [allowed[0]] : [];
37
+ }
38
+ function normalizeRoleScopeConfig(scope, defaults) {
39
+ const roles = scope.roles.length > 0 ? scope.roles : defaults.roles;
40
+ const roleSet = new Set(roles);
41
+ const defaultRole = scope.defaultRole && roleSet.has(scope.defaultRole) ? scope.defaultRole : defaults.defaultRole && roleSet.has(defaults.defaultRole) ? defaults.defaultRole : roles[0];
42
+ return {
43
+ roles,
44
+ managerRoles: pickSubset(scope.managerRoles ?? defaults.managerRoles, roles, defaults.managerRoles),
45
+ assignableRoles: pickSubset(scope.assignableRoles ?? roles, roles, roles),
46
+ defaultRole
47
+ };
48
+ }
49
+ function normalizeAuthRolesConfig(config) {
50
+ if (!config) return DEFAULT_AUTH_ROLES;
51
+ return {
52
+ user: normalizeRoleScopeConfig(config.user, DEFAULT_AUTH_ROLES.user),
53
+ organization: normalizeRoleScopeConfig(config.organization, DEFAULT_AUTH_ROLES.organization),
54
+ team: normalizeRoleScopeConfig(config.team, DEFAULT_AUTH_ROLES.team)
55
+ };
56
+ }
57
+ function defineAuthRoles(config) {
58
+ return normalizeAuthRolesConfig(config);
59
+ }
60
+ function getRoleKeys(config, scope) {
61
+ return config[scope].roles;
62
+ }
63
+ function isAllowedRole(config, scope, role) {
64
+ return getRoleKeys(config, scope).includes(role);
65
+ }
66
+ function createRoleValueSchema(scope) {
67
+ const allowed = [...scope.roles];
68
+ if (allowed.length === 0) return z.string();
69
+ return z.enum(allowed);
70
+ }
71
+ function getAppRoleTranslationKey(scope, role) {
72
+ return `${scope}.role.${role}`;
73
+ }
74
+ //#endregion
75
+ export { DEFAULT_AUTH_ROLES, createRoleValueSchema, defineAuthRoles, getAppRoleTranslationKey, getRoleKeys, isAllowedRole, normalizeAuthRolesConfig, normalizeRoleScopeConfig };
76
+
77
+ //# sourceMappingURL=auth.roles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.roles.mjs","names":[],"sources":["../../../../src/modules/auth/auth.roles.ts"],"sourcesContent":["import { z } from \"zod\";\r\n\r\nexport type AuthRoleScope = \"user\" | \"organization\" | \"team\";\r\n\r\nexport interface AuthRoleScopeConfig {\r\n roles: readonly string[];\r\n managerRoles?: readonly string[];\r\n assignableRoles?: readonly string[];\r\n defaultRole?: string;\r\n}\r\n\r\nexport interface AuthRolesConfig {\r\n user: AuthRoleScopeConfig;\r\n organization: AuthRoleScopeConfig;\r\n team: AuthRoleScopeConfig;\r\n}\r\n\r\nexport interface NormalizedAuthRoleScopeConfig {\r\n roles: readonly string[];\r\n managerRoles: readonly string[];\r\n assignableRoles: readonly string[];\r\n defaultRole: string;\r\n}\r\n\r\nexport interface NormalizedAuthRolesConfig {\r\n user: NormalizedAuthRoleScopeConfig;\r\n organization: NormalizedAuthRoleScopeConfig;\r\n team: NormalizedAuthRoleScopeConfig;\r\n}\r\n\r\nconst DEFAULT_USER_SCOPE: NormalizedAuthRoleScopeConfig = {\r\n roles: [\"user\", \"admin\"],\r\n managerRoles: [\"admin\"],\r\n assignableRoles: [\"user\", \"admin\"],\r\n defaultRole: \"user\",\r\n};\r\n\r\nconst DEFAULT_ORGANIZATION_SCOPE: NormalizedAuthRoleScopeConfig = {\r\n roles: [\"member\", \"admin\", \"owner\"],\r\n managerRoles: [\"admin\", \"owner\"],\r\n assignableRoles: [\"member\", \"admin\", \"owner\"],\r\n defaultRole: \"member\",\r\n};\r\n\r\nconst DEFAULT_TEAM_SCOPE: NormalizedAuthRoleScopeConfig = {\r\n roles: [\"owner\"],\r\n managerRoles: [\"owner\"],\r\n assignableRoles: [\"owner\"],\r\n defaultRole: \"owner\",\r\n};\r\n\r\nexport const DEFAULT_AUTH_ROLES: NormalizedAuthRolesConfig = {\r\n user: DEFAULT_USER_SCOPE,\r\n organization: DEFAULT_ORGANIZATION_SCOPE,\r\n team: DEFAULT_TEAM_SCOPE,\r\n};\r\n\r\nfunction pickSubset(\r\n values: readonly string[],\r\n allowed: readonly string[],\r\n fallback: readonly string[]\r\n): readonly string[] {\r\n const allowedSet = new Set(allowed);\r\n const picked = values.filter((value) => allowedSet.has(value));\r\n if (picked.length > 0) {\r\n return picked;\r\n }\r\n\r\n const fallbackPicked = fallback.filter((value) => allowedSet.has(value));\r\n if (fallbackPicked.length > 0) {\r\n return fallbackPicked;\r\n }\r\n\r\n return allowed.length > 0 ? [allowed[0]] : [];\r\n}\r\n\r\nexport function normalizeRoleScopeConfig(\r\n scope: AuthRoleScopeConfig,\r\n defaults: NormalizedAuthRoleScopeConfig\r\n): NormalizedAuthRoleScopeConfig {\r\n const roles = scope.roles.length > 0 ? scope.roles : defaults.roles;\r\n const roleSet = new Set(roles);\r\n\r\n const defaultRole =\r\n scope.defaultRole && roleSet.has(scope.defaultRole)\r\n ? scope.defaultRole\r\n : defaults.defaultRole && roleSet.has(defaults.defaultRole)\r\n ? defaults.defaultRole\r\n : roles[0];\r\n\r\n const managerRoles = pickSubset(\r\n scope.managerRoles ?? defaults.managerRoles,\r\n roles,\r\n defaults.managerRoles\r\n );\r\n\r\n const assignableRoles = pickSubset(\r\n scope.assignableRoles ?? roles,\r\n roles,\r\n roles\r\n );\r\n\r\n return {\r\n roles,\r\n managerRoles,\r\n assignableRoles,\r\n defaultRole,\r\n };\r\n}\r\n\r\nexport function normalizeAuthRolesConfig(\r\n config?: AuthRolesConfig | null\r\n): NormalizedAuthRolesConfig {\r\n if (!config) {\r\n return DEFAULT_AUTH_ROLES;\r\n }\r\n\r\n return {\r\n user: normalizeRoleScopeConfig(config.user, DEFAULT_AUTH_ROLES.user),\r\n organization: normalizeRoleScopeConfig(config.organization, DEFAULT_AUTH_ROLES.organization),\r\n team: normalizeRoleScopeConfig(config.team, DEFAULT_AUTH_ROLES.team),\r\n };\r\n}\r\n\r\nexport function defineAuthRoles(config: AuthRolesConfig): NormalizedAuthRolesConfig {\r\n return normalizeAuthRolesConfig(config);\r\n}\r\n\r\nexport function getRoleKeys(\r\n config: NormalizedAuthRolesConfig,\r\n scope: AuthRoleScope\r\n): readonly string[] {\r\n return config[scope].roles;\r\n}\r\n\r\nexport function isAllowedRole(\r\n config: NormalizedAuthRolesConfig,\r\n scope: AuthRoleScope,\r\n role: string\r\n): boolean {\r\n return getRoleKeys(config, scope).includes(role);\r\n}\r\n\r\nexport function createRoleValueSchema(scope: NormalizedAuthRoleScopeConfig) {\r\n const allowed = [...scope.roles];\r\n if (allowed.length === 0) {\r\n return z.string();\r\n }\r\n return z.enum(allowed as [string, ...string[]]);\r\n}\r\n\r\nexport function getAppRoleTranslationKey(scope: AuthRoleScope, role: string): string {\r\n return `${scope}.role.${role}`;\r\n}\r\n"],"mappings":";AAmDA,MAAa,qBAAgD;CAC3D,MAtBwD;EACxD,OAAO,CAAC,QAAQ,QAAQ;EACxB,cAAc,CAAC,QAAQ;EACvB,iBAAiB,CAAC,QAAQ,QAAQ;EAClC,aAAa;EACd;CAkBC,cAhBgE;EAChE,OAAO;GAAC;GAAU;GAAS;GAAQ;EACnC,cAAc,CAAC,SAAS,QAAQ;EAChC,iBAAiB;GAAC;GAAU;GAAS;GAAQ;EAC7C,aAAa;EACd;CAYC,MAVwD;EACxD,OAAO,CAAC,QAAQ;EAChB,cAAc,CAAC,QAAQ;EACvB,iBAAiB,CAAC,QAAQ;EAC1B,aAAa;EACd;CAMA;AAED,SAAS,WACP,QACA,SACA,UACmB;CACnB,MAAM,aAAa,IAAI,IAAI,QAAQ;CACnC,MAAM,SAAS,OAAO,QAAQ,UAAU,WAAW,IAAI,MAAM,CAAC;AAC9D,KAAI,OAAO,SAAS,EAClB,QAAO;CAGT,MAAM,iBAAiB,SAAS,QAAQ,UAAU,WAAW,IAAI,MAAM,CAAC;AACxE,KAAI,eAAe,SAAS,EAC1B,QAAO;AAGT,QAAO,QAAQ,SAAS,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE;;AAG/C,SAAgB,yBACd,OACA,UAC+B;CAC/B,MAAM,QAAQ,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ,SAAS;CAC9D,MAAM,UAAU,IAAI,IAAI,MAAM;CAE9B,MAAM,cACJ,MAAM,eAAe,QAAQ,IAAI,MAAM,YAAY,GAC/C,MAAM,cACN,SAAS,eAAe,QAAQ,IAAI,SAAS,YAAY,GACvD,SAAS,cACT,MAAM;AAcd,QAAO;EACL;EACA,cAdmB,WACnB,MAAM,gBAAgB,SAAS,cAC/B,OACA,SAAS,aACV;EAWC,iBATsB,WACtB,MAAM,mBAAmB,OACzB,OACA,MACD;EAMC;EACD;;AAGH,SAAgB,yBACd,QAC2B;AAC3B,KAAI,CAAC,OACH,QAAO;AAGT,QAAO;EACL,MAAM,yBAAyB,OAAO,MAAM,mBAAmB,KAAK;EACpE,cAAc,yBAAyB,OAAO,cAAc,mBAAmB,aAAa;EAC5F,MAAM,yBAAyB,OAAO,MAAM,mBAAmB,KAAK;EACrE;;AAGH,SAAgB,gBAAgB,QAAoD;AAClF,QAAO,yBAAyB,OAAO;;AAGzC,SAAgB,YACd,QACA,OACmB;AACnB,QAAO,OAAO,OAAO;;AAGvB,SAAgB,cACd,QACA,OACA,MACS;AACT,QAAO,YAAY,QAAQ,MAAM,CAAC,SAAS,KAAK;;AAGlD,SAAgB,sBAAsB,OAAsC;CAC1E,MAAM,UAAU,CAAC,GAAG,MAAM,MAAM;AAChC,KAAI,QAAQ,WAAW,EACrB,QAAO,EAAE,QAAQ;AAEnB,QAAO,EAAE,KAAK,QAAiC;;AAGjD,SAAgB,yBAAyB,OAAsB,MAAsB;AACnF,QAAO,GAAG,MAAM,QAAQ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m5kdev/commons",
3
- "version": "0.21.9",
3
+ "version": "0.25.0",
4
4
  "license": "GPL-3.0-only",
5
5
  "repository": {
6
6
  "type": "git",
@@ -18,7 +18,7 @@
18
18
  "devDependencies": {
19
19
  "tsdown": "0.21.7",
20
20
  "typescript": "6.0.3",
21
- "@m5kdev/config": "0.21.9"
21
+ "@m5kdev/config": "0.25.0"
22
22
  },
23
23
  "exports": {
24
24
  "./utils/*": {