@magmamath/frontend-config 1.3.4-rc.5 → 1.3.4-rc.6

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.
@@ -123,7 +123,7 @@ var TranslationManager = class {
123
123
  const segments = path.split("/");
124
124
  const locale = segments.pop() ?? "";
125
125
  const canonicalLocale = CANONICAL_LOCALE_BY_NORMALIZED[locale] ?? locale;
126
- return `${segments.join("/")}/${canonicalLocale}?${query}`;
126
+ return `${segments.join("/")}/${canonicalLocale}${query ? `?${query}` : ""}`;
127
127
  };
128
128
  initTolgeeDevTools = async (tolgeeCfg) => {
129
129
  const { DevBackend } = await import('@tolgee/i18next');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shared/constants/common.constants.ts","../../src/translation/TranslationManager.ts","../../src/translation/translation.constants.ts"],"names":["Locale","i18n","withTolgee","initReactI18next","Tolgee","I18nextPlugin","BackendFetch","TranslationNamespace"],"mappings":"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","file":"index.js","sourcesContent":["export enum Platform {\n STUDENTS_WEB = 'STUDENTS',\n TEACHERS_WEB = 'TEACHERS',\n DISTRICT_DASHBOARD = 'DISTRICT',\n AUTH_WEB = 'AUTH_WEB',\n WEB_ADMIN = 'WEB_ADMIN',\n MOBILE = 'MOBILE',\n PARENT_WEB = 'PARENT_WEB',\n}\n\nexport enum Environment {\n MARS = 'MARS',\n VENUS = 'VENUS',\n PROD = 'PROD',\n}\n\nexport enum PlatformBuildTarget {\n PLUTO = 'pluto',\n MARS = 'mars',\n VENUS = 'pre-release',\n PROD = 'production',\n}\n\nexport enum Locale {\n US = 'en-SE',\n SE = 'sv-SE',\n GB = 'en-GB',\n CA = 'en-CA',\n SCT = 'en-SCT',\n DE = 'de-DE',\n}\n\nexport enum Source {\n MATTEAPPEN = 0,\n SKOLON = 1,\n SKOLFEDERATION = 2,\n GOOGLE = 3,\n MICROSOFT = 4,\n CLEVER = 5,\n APPLE = 6,\n MATHSYNC = 7,\n CLASSLINK = 8,\n EDUCLOUD = 9,\n EGIL = 10,\n WONDE = 12,\n SCHOOLOGY = 13,\n SEEMIS = 14,\n IMPORT = 15,\n CANVAS = 16,\n}\n\nexport enum LoginSource {\n MAGMA = 0,\n CLEVER = 1,\n CLASS_LINK = 2,\n SKOLON = 3,\n SKOLFEDERATION = 4,\n GOOGLE = 5,\n MICROSOFT = 6,\n APPLE = 7,\n SCHOOLOGY = 8,\n MY_LOGIN = 9,\n}\n\nexport enum SSO {\n APPLE = 'APPLE',\n GOOGLE = 'GOOGLE',\n MICROSOFT = 'MICROSOFT',\n CLEVER = 'CLEVER',\n SCHOOLOGY = 'SCHOOLOGY',\n CLASS_LINK = 'CLASS_LINK',\n SKOLFEDERATION = 'SKOLFEDERATION',\n SKOLON = 'SKOLON',\n WONDE = 'WONDE',\n CANVAS = 'CANVAS',\n QR_CODE = 'QR_CODE',\n}\n\nexport enum ApiRegion {\n MAIN = 'MAIN',\n CANADA = 'CANADA',\n}\n\nexport enum QRCodeSize {\n DEFAULT = 'default',\n MEDIUM = 'medium',\n LARGE = 'large',\n}\n","import i18n, { InitOptions } from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport type { TolgeeInstance, TolgeeStaticData } from '@tolgee/i18next'\nimport { BackendFetch, I18nextPlugin, Tolgee, withTolgee } from '@tolgee/i18next'\nimport { Locale } from '../shared/constants/common.constants'\nimport {\n FallbackResources,\n OnTranslationInitCallback,\n StorageConfig,\n TolgeeConfig,\n TranslationManagerOptions,\n} from './translation.types'\n\nconst CDN_ID = '39317fd3c6ff2ad02619ba673baae8b6'\nconst TOLGEE_DEV_TIMEOUT_MS = 3000\n\n// Invalid BCP 47 tags (e.g. en-SCT) get lowercased by hermes engine.\nconst CANONICAL_LOCALE_BY_NORMALIZED: Record<string, Locale> = Object.fromEntries(\n Object.values(Locale).map((locale) => [locale.toLowerCase(), locale])\n)\n\nconst DEFAULT_I18N_OPTIONS: InitOptions = {\n fallbackLng: undefined,\n load: 'currentOnly',\n react: {\n useSuspense: false,\n },\n interpolation: {\n escapeValue: false,\n },\n}\n\nexport class TranslationManager {\n private readonly isDev: boolean\n private readonly i18nOptions: InitOptions\n private readonly onInitCallbacks: OnTranslationInitCallback[] = []\n private readonly fallbackResources?: TolgeeStaticData\n private readonly storage?: StorageConfig\n\n private tolgeeCfg: TolgeeConfig | null = null\n private initPromise: Promise<void> | null = null\n\n constructor({ isDev, i18nOptions, storage, fallbackResources }: TranslationManagerOptions) {\n this.isDev = isDev\n this.i18nOptions = i18nOptions\n this.storage = storage\n this.fallbackResources = this.unwrapModuleDefaults(fallbackResources)\n }\n\n private unwrapModuleDefaults(resources?: FallbackResources) {\n if (!resources) return undefined\n return Object.fromEntries(\n Object.entries(resources).map(([key, load]) => [\n this.normalizeResourceKey(key),\n () => load().then((m) => m.default),\n ])\n )\n }\n\n private readonly normalizeResourceKey = (key: string) => {\n const [locale, ...rest] = key.split(':')\n return [this.toCanonicalLocale(locale), ...rest].join(':')\n }\n\n private readonly toCanonicalLocale = (locale: string) => {\n try {\n return Intl.getCanonicalLocales(locale)[0]\n } catch {\n return locale\n }\n }\n\n public readonly onInit = (callback: OnTranslationInitCallback) => {\n this.onInitCallbacks.push(callback)\n }\n\n public readonly init = async (locale: Locale, envConfig: TolgeeConfig) => {\n this.tolgeeCfg = envConfig\n\n if (!this.initPromise) {\n this.initPromise = this.initI18n(locale).catch((error) => {\n this.initPromise = null\n throw error\n })\n }\n await this.initPromise\n }\n\n public readonly setLanguage = async (locale: Locale) => {\n if (!i18n.isInitialized) return\n\n if (this.storage) {\n this.storage.adapter.setItem(this.storage.key, locale)\n }\n\n const canonicalLocale = this.toCanonicalLocale(locale)\n if (i18n.language !== canonicalLocale) {\n await i18n.changeLanguage(canonicalLocale)\n }\n }\n\n private readonly initI18n = async (locale: Locale) => {\n if (!this.tolgeeCfg) return\n\n const canonicalLocale = this.toCanonicalLocale(locale)\n const canUseTolgeeDevTools = this.isDev && this.tolgeeCfg.apiKey && this.tolgeeCfg.apiUrl\n\n const tolgee = canUseTolgeeDevTools\n ? await this.initTolgeeDevTools(this.tolgeeCfg)\n : this.createBaseTolgeeInstance(this.tolgeeCfg).init({ staticData: this.fallbackResources })\n\n await withTolgee(i18n, tolgee)\n .use(initReactI18next)\n .init({\n ...DEFAULT_I18N_OPTIONS,\n ...this.i18nOptions,\n lng: canonicalLocale,\n })\n\n this.onInitCallbacks.forEach((callback) => callback(locale))\n }\n\n private readonly createBaseTolgeeInstance = (tolgeeCfg: TolgeeConfig) => {\n return Tolgee()\n .use(I18nextPlugin())\n .use(\n BackendFetch({\n prefix: `${tolgeeCfg.cdnHost}/${CDN_ID}`,\n fallbackOnFail: true,\n getPath: ({ namespace, language, prefix }) => {\n const cdnLocale = CANONICAL_LOCALE_BY_NORMALIZED[language] ?? language\n return `${prefix}/${namespace}/${cdnLocale}.json`\n },\n })\n )\n }\n\n private readonly normalizeApiUrl = (url: string) => {\n const [path, query] = url.replace(/\\/\\?/, '?').split('?')\n const segments = path.split('/')\n const locale = segments.pop() ?? ''\n const canonicalLocale = CANONICAL_LOCALE_BY_NORMALIZED[locale] ?? locale\n\n return `${segments.join('/')}/${canonicalLocale}?${query}`\n }\n\n private readonly initTolgeeDevTools = async (tolgeeCfg: TolgeeConfig): Promise<TolgeeInstance> => {\n const { DevBackend } = await import('@tolgee/i18next')\n\n const instance = this.createBaseTolgeeInstance(tolgeeCfg).use(DevBackend())\n\n return instance.init({\n apiUrl: tolgeeCfg.apiUrl,\n apiKey: tolgeeCfg.apiKey,\n staticData: this.fallbackResources,\n fetch: async (input, init) => {\n const url = typeof input === 'string' ? this.normalizeApiUrl(input) : input\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), TOLGEE_DEV_TIMEOUT_MS)\n try {\n return await fetch(url, { ...init, signal: controller.signal })\n } finally {\n clearTimeout(timeoutId)\n }\n },\n })\n }\n}\n","export enum TranslationNamespace {\n STUDENTS_WEB = 'students-web',\n TEACHERS_WEB = 'teachers-web',\n DISTRICT_DASH = 'district-dash',\n AUTH_WEB = 'auth-web',\n MOBILE = 'mobile',\n MAGMAMATH_FEATURES = 'magmamath-features',\n DRAW_BOARD = 'drawboard',\n STUDENTS_FEATURES = 'students-features',\n SHARED = 'shared',\n}\n"]}
1
+ {"version":3,"sources":["../../src/shared/constants/common.constants.ts","../../src/translation/TranslationManager.ts","../../src/translation/translation.constants.ts"],"names":["Locale","i18n","withTolgee","initReactI18next","Tolgee","I18nextPlugin","BackendFetch","TranslationNamespace"],"mappings":"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","file":"index.js","sourcesContent":["export enum Platform {\n STUDENTS_WEB = 'STUDENTS',\n TEACHERS_WEB = 'TEACHERS',\n DISTRICT_DASHBOARD = 'DISTRICT',\n AUTH_WEB = 'AUTH_WEB',\n WEB_ADMIN = 'WEB_ADMIN',\n MOBILE = 'MOBILE',\n PARENT_WEB = 'PARENT_WEB',\n}\n\nexport enum Environment {\n MARS = 'MARS',\n VENUS = 'VENUS',\n PROD = 'PROD',\n}\n\nexport enum PlatformBuildTarget {\n PLUTO = 'pluto',\n MARS = 'mars',\n VENUS = 'pre-release',\n PROD = 'production',\n}\n\nexport enum Locale {\n US = 'en-SE',\n SE = 'sv-SE',\n GB = 'en-GB',\n CA = 'en-CA',\n SCT = 'en-SCT',\n DE = 'de-DE',\n}\n\nexport enum Source {\n MATTEAPPEN = 0,\n SKOLON = 1,\n SKOLFEDERATION = 2,\n GOOGLE = 3,\n MICROSOFT = 4,\n CLEVER = 5,\n APPLE = 6,\n MATHSYNC = 7,\n CLASSLINK = 8,\n EDUCLOUD = 9,\n EGIL = 10,\n WONDE = 12,\n SCHOOLOGY = 13,\n SEEMIS = 14,\n IMPORT = 15,\n CANVAS = 16,\n}\n\nexport enum LoginSource {\n MAGMA = 0,\n CLEVER = 1,\n CLASS_LINK = 2,\n SKOLON = 3,\n SKOLFEDERATION = 4,\n GOOGLE = 5,\n MICROSOFT = 6,\n APPLE = 7,\n SCHOOLOGY = 8,\n MY_LOGIN = 9,\n}\n\nexport enum SSO {\n APPLE = 'APPLE',\n GOOGLE = 'GOOGLE',\n MICROSOFT = 'MICROSOFT',\n CLEVER = 'CLEVER',\n SCHOOLOGY = 'SCHOOLOGY',\n CLASS_LINK = 'CLASS_LINK',\n SKOLFEDERATION = 'SKOLFEDERATION',\n SKOLON = 'SKOLON',\n WONDE = 'WONDE',\n CANVAS = 'CANVAS',\n QR_CODE = 'QR_CODE',\n}\n\nexport enum ApiRegion {\n MAIN = 'MAIN',\n CANADA = 'CANADA',\n}\n\nexport enum QRCodeSize {\n DEFAULT = 'default',\n MEDIUM = 'medium',\n LARGE = 'large',\n}\n","import i18n, { InitOptions } from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport type { TolgeeInstance, TolgeeStaticData } from '@tolgee/i18next'\nimport { BackendFetch, I18nextPlugin, Tolgee, withTolgee } from '@tolgee/i18next'\nimport { Locale } from '../shared/constants/common.constants'\nimport {\n FallbackResources,\n OnTranslationInitCallback,\n StorageConfig,\n TolgeeConfig,\n TranslationManagerOptions,\n} from './translation.types'\n\nconst CDN_ID = '39317fd3c6ff2ad02619ba673baae8b6'\nconst TOLGEE_DEV_TIMEOUT_MS = 3000\n\n// Invalid BCP 47 tags (e.g. en-SCT) get lowercased by hermes engine.\nconst CANONICAL_LOCALE_BY_NORMALIZED: Record<string, Locale> = Object.fromEntries(\n Object.values(Locale).map((locale) => [locale.toLowerCase(), locale])\n)\n\nconst DEFAULT_I18N_OPTIONS: InitOptions = {\n fallbackLng: undefined,\n load: 'currentOnly',\n react: {\n useSuspense: false,\n },\n interpolation: {\n escapeValue: false,\n },\n}\n\nexport class TranslationManager {\n private readonly isDev: boolean\n private readonly i18nOptions: InitOptions\n private readonly onInitCallbacks: OnTranslationInitCallback[] = []\n private readonly fallbackResources?: TolgeeStaticData\n private readonly storage?: StorageConfig\n\n private tolgeeCfg: TolgeeConfig | null = null\n private initPromise: Promise<void> | null = null\n\n constructor({ isDev, i18nOptions, storage, fallbackResources }: TranslationManagerOptions) {\n this.isDev = isDev\n this.i18nOptions = i18nOptions\n this.storage = storage\n this.fallbackResources = this.unwrapModuleDefaults(fallbackResources)\n }\n\n private unwrapModuleDefaults(resources?: FallbackResources) {\n if (!resources) return undefined\n return Object.fromEntries(\n Object.entries(resources).map(([key, load]) => [\n this.normalizeResourceKey(key),\n () => load().then((m) => m.default),\n ])\n )\n }\n\n private readonly normalizeResourceKey = (key: string) => {\n const [locale, ...rest] = key.split(':')\n return [this.toCanonicalLocale(locale), ...rest].join(':')\n }\n\n private readonly toCanonicalLocale = (locale: string) => {\n try {\n return Intl.getCanonicalLocales(locale)[0]\n } catch {\n return locale\n }\n }\n\n public readonly onInit = (callback: OnTranslationInitCallback) => {\n this.onInitCallbacks.push(callback)\n }\n\n public readonly init = async (locale: Locale, envConfig: TolgeeConfig) => {\n this.tolgeeCfg = envConfig\n\n if (!this.initPromise) {\n this.initPromise = this.initI18n(locale).catch((error) => {\n this.initPromise = null\n throw error\n })\n }\n await this.initPromise\n }\n\n public readonly setLanguage = async (locale: Locale) => {\n if (!i18n.isInitialized) return\n\n if (this.storage) {\n this.storage.adapter.setItem(this.storage.key, locale)\n }\n\n const canonicalLocale = this.toCanonicalLocale(locale)\n if (i18n.language !== canonicalLocale) {\n await i18n.changeLanguage(canonicalLocale)\n }\n }\n\n private readonly initI18n = async (locale: Locale) => {\n if (!this.tolgeeCfg) return\n\n const canonicalLocale = this.toCanonicalLocale(locale)\n const canUseTolgeeDevTools = this.isDev && this.tolgeeCfg.apiKey && this.tolgeeCfg.apiUrl\n\n const tolgee = canUseTolgeeDevTools\n ? await this.initTolgeeDevTools(this.tolgeeCfg)\n : this.createBaseTolgeeInstance(this.tolgeeCfg).init({ staticData: this.fallbackResources })\n\n await withTolgee(i18n, tolgee)\n .use(initReactI18next)\n .init({\n ...DEFAULT_I18N_OPTIONS,\n ...this.i18nOptions,\n lng: canonicalLocale,\n })\n\n this.onInitCallbacks.forEach((callback) => callback(locale))\n }\n\n private readonly createBaseTolgeeInstance = (tolgeeCfg: TolgeeConfig) => {\n return Tolgee()\n .use(I18nextPlugin())\n .use(\n BackendFetch({\n prefix: `${tolgeeCfg.cdnHost}/${CDN_ID}`,\n fallbackOnFail: true,\n getPath: ({ namespace, language, prefix }) => {\n const cdnLocale = CANONICAL_LOCALE_BY_NORMALIZED[language] ?? language\n return `${prefix}/${namespace}/${cdnLocale}.json`\n },\n })\n )\n }\n\n private readonly normalizeApiUrl = (url: string) => {\n const [path, query] = url.replace(/\\/\\?/, '?').split('?')\n const segments = path.split('/')\n const locale = segments.pop() ?? ''\n const canonicalLocale = CANONICAL_LOCALE_BY_NORMALIZED[locale] ?? locale\n\n return `${segments.join('/')}/${canonicalLocale}${query ? `?${query}` : ''}`\n }\n\n private readonly initTolgeeDevTools = async (tolgeeCfg: TolgeeConfig): Promise<TolgeeInstance> => {\n const { DevBackend } = await import('@tolgee/i18next')\n\n const instance = this.createBaseTolgeeInstance(tolgeeCfg).use(DevBackend())\n\n return instance.init({\n apiUrl: tolgeeCfg.apiUrl,\n apiKey: tolgeeCfg.apiKey,\n staticData: this.fallbackResources,\n fetch: async (input, init) => {\n const url = typeof input === 'string' ? this.normalizeApiUrl(input) : input\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), TOLGEE_DEV_TIMEOUT_MS)\n try {\n return await fetch(url, { ...init, signal: controller.signal })\n } finally {\n clearTimeout(timeoutId)\n }\n },\n })\n }\n}\n","export enum TranslationNamespace {\n STUDENTS_WEB = 'students-web',\n TEACHERS_WEB = 'teachers-web',\n DISTRICT_DASH = 'district-dash',\n AUTH_WEB = 'auth-web',\n MOBILE = 'mobile',\n MAGMAMATH_FEATURES = 'magmamath-features',\n DRAW_BOARD = 'drawboard',\n STUDENTS_FEATURES = 'students-features',\n SHARED = 'shared',\n}\n"]}
@@ -117,7 +117,7 @@ var TranslationManager = class {
117
117
  const segments = path.split("/");
118
118
  const locale = segments.pop() ?? "";
119
119
  const canonicalLocale = CANONICAL_LOCALE_BY_NORMALIZED[locale] ?? locale;
120
- return `${segments.join("/")}/${canonicalLocale}?${query}`;
120
+ return `${segments.join("/")}/${canonicalLocale}${query ? `?${query}` : ""}`;
121
121
  };
122
122
  initTolgeeDevTools = async (tolgeeCfg) => {
123
123
  const { DevBackend } = await import('@tolgee/i18next');
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shared/constants/common.constants.ts","../../src/translation/TranslationManager.ts","../../src/translation/translation.constants.ts"],"names":["Locale","TranslationNamespace"],"mappings":";;;;;;;AAuBO,IAAK,MAAA,qBAAAA,OAAL,KAAA;AACL,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AACL,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AACL,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AACL,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AACL,EAAAA,QAAA,KAAM,CAAA,GAAA,QAAA;AACN,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AANK,EAAAA,OAAAA,OAAAA;AAAA,CAAA,EAAA,MAAA,IAAA,EAAA,CAAA;;;ACVZ,IAAM,MAAS,GAAA,kCAAA;AACf,IAAM,qBAAwB,GAAA,GAAA;AAG9B,IAAM,iCAAyD,MAAO,CAAA,WAAA;AAAA,EACpE,MAAO,CAAA,MAAA,CAAO,MAAM,CAAA,CAAE,GAAI,CAAA,CAAC,MAAW,KAAA,CAAC,MAAO,CAAA,WAAA,EAAe,EAAA,MAAM,CAAC;AACtE,CAAA;AAEA,IAAM,oBAAoC,GAAA;AAAA,EACxC,WAAa,EAAA,MAAA;AAAA,EACb,IAAM,EAAA,aAAA;AAAA,EACN,KAAO,EAAA;AAAA,IACL,WAAa,EAAA;AAAA,GACf;AAAA,EACA,aAAe,EAAA;AAAA,IACb,WAAa,EAAA;AAAA;AAEjB,CAAA;AAEO,IAAM,qBAAN,MAAyB;AAAA,EACb,KAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAA+C,EAAC;AAAA,EAChD,iBAAA;AAAA,EACA,OAAA;AAAA,EAET,SAAiC,GAAA,IAAA;AAAA,EACjC,WAAoC,GAAA,IAAA;AAAA,EAE5C,YAAY,EAAE,KAAA,EAAO,WAAa,EAAA,OAAA,EAAS,mBAAgD,EAAA;AACzF,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA;AACb,IAAA,IAAA,CAAK,WAAc,GAAA,WAAA;AACnB,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AACf,IAAK,IAAA,CAAA,iBAAA,GAAoB,IAAK,CAAA,oBAAA,CAAqB,iBAAiB,CAAA;AAAA;AACtE,EAEQ,qBAAqB,SAA+B,EAAA;AAC1D,IAAI,IAAA,CAAC,WAAkB,OAAA,MAAA;AACvB,IAAA,OAAO,MAAO,CAAA,WAAA;AAAA,MACZ,MAAA,CAAO,QAAQ,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,GAAK,EAAA,IAAI,CAAM,KAAA;AAAA,QAC7C,IAAA,CAAK,qBAAqB,GAAG,CAAA;AAAA,QAC7B,MAAM,IAAK,EAAA,CAAE,KAAK,CAAC,CAAA,KAAM,EAAE,OAAO;AAAA,OACnC;AAAA,KACH;AAAA;AACF,EAEiB,oBAAA,GAAuB,CAAC,GAAgB,KAAA;AACvD,IAAA,MAAM,CAAC,MAAQ,EAAA,GAAG,IAAI,CAAI,GAAA,GAAA,CAAI,MAAM,GAAG,CAAA;AACvC,IAAO,OAAA,CAAC,KAAK,iBAAkB,CAAA,MAAM,GAAG,GAAG,IAAI,CAAE,CAAA,IAAA,CAAK,GAAG,CAAA;AAAA,GAC3D;AAAA,EAEiB,iBAAA,GAAoB,CAAC,MAAmB,KAAA;AACvD,IAAI,IAAA;AACF,MAAA,OAAO,IAAK,CAAA,mBAAA,CAAoB,MAAM,CAAA,CAAE,CAAC,CAAA;AAAA,KACnC,CAAA,MAAA;AACN,MAAO,OAAA,MAAA;AAAA;AACT,GACF;AAAA,EAEgB,MAAA,GAAS,CAAC,QAAwC,KAAA;AAChE,IAAK,IAAA,CAAA,eAAA,CAAgB,KAAK,QAAQ,CAAA;AAAA,GACpC;AAAA,EAEgB,IAAA,GAAO,OAAO,MAAA,EAAgB,SAA4B,KAAA;AACxE,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA;AAEjB,IAAI,IAAA,CAAC,KAAK,WAAa,EAAA;AACrB,MAAA,IAAA,CAAK,cAAc,IAAK,CAAA,QAAA,CAAS,MAAM,CAAE,CAAA,KAAA,CAAM,CAAC,KAAU,KAAA;AACxD,QAAA,IAAA,CAAK,WAAc,GAAA,IAAA;AACnB,QAAM,MAAA,KAAA;AAAA,OACP,CAAA;AAAA;AAEH,IAAA,MAAM,IAAK,CAAA,WAAA;AAAA,GACb;AAAA,EAEgB,WAAA,GAAc,OAAO,MAAmB,KAAA;AACtD,IAAI,IAAA,CAAC,KAAK,aAAe,EAAA;AAEzB,IAAA,IAAI,KAAK,OAAS,EAAA;AAChB,MAAA,IAAA,CAAK,QAAQ,OAAQ,CAAA,OAAA,CAAQ,IAAK,CAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA;AAGvD,IAAM,MAAA,eAAA,GAAkB,IAAK,CAAA,iBAAA,CAAkB,MAAM,CAAA;AACrD,IAAI,IAAA,IAAA,CAAK,aAAa,eAAiB,EAAA;AACrC,MAAM,MAAA,IAAA,CAAK,eAAe,eAAe,CAAA;AAAA;AAC3C,GACF;AAAA,EAEiB,QAAA,GAAW,OAAO,MAAmB,KAAA;AACpD,IAAI,IAAA,CAAC,KAAK,SAAW,EAAA;AAErB,IAAM,MAAA,eAAA,GAAkB,IAAK,CAAA,iBAAA,CAAkB,MAAM,CAAA;AACrD,IAAA,MAAM,uBAAuB,IAAK,CAAA,KAAA,IAAS,KAAK,SAAU,CAAA,MAAA,IAAU,KAAK,SAAU,CAAA,MAAA;AAEnF,IAAA,MAAM,SAAS,oBACX,GAAA,MAAM,KAAK,kBAAmB,CAAA,IAAA,CAAK,SAAS,CAC5C,GAAA,IAAA,CAAK,wBAAyB,CAAA,IAAA,CAAK,SAAS,CAAE,CAAA,IAAA,CAAK,EAAE,UAAY,EAAA,IAAA,CAAK,mBAAmB,CAAA;AAE7F,IAAA,MAAM,WAAW,IAAM,EAAA,MAAM,EAC1B,GAAI,CAAA,gBAAgB,EACpB,IAAK,CAAA;AAAA,MACJ,GAAG,oBAAA;AAAA,MACH,GAAG,IAAK,CAAA,WAAA;AAAA,MACR,GAAK,EAAA;AAAA,KACN,CAAA;AAEH,IAAA,IAAA,CAAK,gBAAgB,OAAQ,CAAA,CAAC,QAAa,KAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,GAC7D;AAAA,EAEiB,wBAAA,GAA2B,CAAC,SAA4B,KAAA;AACvE,IAAA,OAAO,MAAO,EAAA,CACX,GAAI,CAAA,aAAA,EAAe,CACnB,CAAA,GAAA;AAAA,MACC,YAAa,CAAA;AAAA,QACX,MAAQ,EAAA,CAAA,EAAG,SAAU,CAAA,OAAO,IAAI,MAAM,CAAA,CAAA;AAAA,QACtC,cAAgB,EAAA,IAAA;AAAA,QAChB,SAAS,CAAC,EAAE,SAAW,EAAA,QAAA,EAAU,QAAa,KAAA;AAC5C,UAAM,MAAA,SAAA,GAAY,8BAA+B,CAAA,QAAQ,CAAK,IAAA,QAAA;AAC9D,UAAA,OAAO,CAAG,EAAA,MAAM,CAAI,CAAA,EAAA,SAAS,IAAI,SAAS,CAAA,KAAA,CAAA;AAAA;AAC5C,OACD;AAAA,KACH;AAAA,GACJ;AAAA,EAEiB,eAAA,GAAkB,CAAC,GAAgB,KAAA;AAClD,IAAM,MAAA,CAAC,IAAM,EAAA,KAAK,CAAI,GAAA,GAAA,CAAI,QAAQ,MAAQ,EAAA,GAAG,CAAE,CAAA,KAAA,CAAM,GAAG,CAAA;AACxD,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAM,MAAA,MAAA,GAAS,QAAS,CAAA,GAAA,EAAS,IAAA,EAAA;AACjC,IAAM,MAAA,eAAA,GAAkB,8BAA+B,CAAA,MAAM,CAAK,IAAA,MAAA;AAElE,IAAO,OAAA,CAAA,EAAG,SAAS,IAAK,CAAA,GAAG,CAAC,CAAI,CAAA,EAAA,eAAe,IAAI,KAAK,CAAA,CAAA;AAAA,GAC1D;AAAA,EAEiB,kBAAA,GAAqB,OAAO,SAAqD,KAAA;AAChG,IAAA,MAAM,EAAE,UAAA,EAAe,GAAA,MAAM,OAAO,iBAAiB,CAAA;AAErD,IAAA,MAAM,WAAW,IAAK,CAAA,wBAAA,CAAyB,SAAS,CAAE,CAAA,GAAA,CAAI,YAAY,CAAA;AAE1E,IAAA,OAAO,SAAS,IAAK,CAAA;AAAA,MACnB,QAAQ,SAAU,CAAA,MAAA;AAAA,MAClB,QAAQ,SAAU,CAAA,MAAA;AAAA,MAClB,YAAY,IAAK,CAAA,iBAAA;AAAA,MACjB,KAAA,EAAO,OAAO,KAAA,EAAO,IAAS,KAAA;AAC5B,QAAA,MAAM,MAAM,OAAO,KAAA,KAAU,WAAW,IAAK,CAAA,eAAA,CAAgB,KAAK,CAAI,GAAA,KAAA;AACtE,QAAM,MAAA,UAAA,GAAa,IAAI,eAAgB,EAAA;AACvC,QAAA,MAAM,YAAY,UAAW,CAAA,MAAM,UAAW,CAAA,KAAA,IAAS,qBAAqB,CAAA;AAC5E,QAAI,IAAA;AACF,UAAO,OAAA,MAAM,MAAM,GAAK,EAAA,EAAE,GAAG,IAAM,EAAA,MAAA,EAAQ,UAAW,CAAA,MAAA,EAAQ,CAAA;AAAA,SAC9D,SAAA;AACA,UAAA,YAAA,CAAa,SAAS,CAAA;AAAA;AACxB;AACF,KACD,CAAA;AAAA,GACH;AACF;;;ACvKY,IAAA,oBAAA,qBAAAC,qBAAL,KAAA;AACL,EAAAA,sBAAA,cAAe,CAAA,GAAA,cAAA;AACf,EAAAA,sBAAA,cAAe,CAAA,GAAA,cAAA;AACf,EAAAA,sBAAA,eAAgB,CAAA,GAAA,eAAA;AAChB,EAAAA,sBAAA,UAAW,CAAA,GAAA,UAAA;AACX,EAAAA,sBAAA,QAAS,CAAA,GAAA,QAAA;AACT,EAAAA,sBAAA,oBAAqB,CAAA,GAAA,oBAAA;AACrB,EAAAA,sBAAA,YAAa,CAAA,GAAA,WAAA;AACb,EAAAA,sBAAA,mBAAoB,CAAA,GAAA,mBAAA;AACpB,EAAAA,sBAAA,QAAS,CAAA,GAAA,QAAA;AATC,EAAAA,OAAAA,qBAAAA;AAAA,CAAA,EAAA,oBAAA,IAAA,EAAA","file":"index.mjs","sourcesContent":["export enum Platform {\n STUDENTS_WEB = 'STUDENTS',\n TEACHERS_WEB = 'TEACHERS',\n DISTRICT_DASHBOARD = 'DISTRICT',\n AUTH_WEB = 'AUTH_WEB',\n WEB_ADMIN = 'WEB_ADMIN',\n MOBILE = 'MOBILE',\n PARENT_WEB = 'PARENT_WEB',\n}\n\nexport enum Environment {\n MARS = 'MARS',\n VENUS = 'VENUS',\n PROD = 'PROD',\n}\n\nexport enum PlatformBuildTarget {\n PLUTO = 'pluto',\n MARS = 'mars',\n VENUS = 'pre-release',\n PROD = 'production',\n}\n\nexport enum Locale {\n US = 'en-SE',\n SE = 'sv-SE',\n GB = 'en-GB',\n CA = 'en-CA',\n SCT = 'en-SCT',\n DE = 'de-DE',\n}\n\nexport enum Source {\n MATTEAPPEN = 0,\n SKOLON = 1,\n SKOLFEDERATION = 2,\n GOOGLE = 3,\n MICROSOFT = 4,\n CLEVER = 5,\n APPLE = 6,\n MATHSYNC = 7,\n CLASSLINK = 8,\n EDUCLOUD = 9,\n EGIL = 10,\n WONDE = 12,\n SCHOOLOGY = 13,\n SEEMIS = 14,\n IMPORT = 15,\n CANVAS = 16,\n}\n\nexport enum LoginSource {\n MAGMA = 0,\n CLEVER = 1,\n CLASS_LINK = 2,\n SKOLON = 3,\n SKOLFEDERATION = 4,\n GOOGLE = 5,\n MICROSOFT = 6,\n APPLE = 7,\n SCHOOLOGY = 8,\n MY_LOGIN = 9,\n}\n\nexport enum SSO {\n APPLE = 'APPLE',\n GOOGLE = 'GOOGLE',\n MICROSOFT = 'MICROSOFT',\n CLEVER = 'CLEVER',\n SCHOOLOGY = 'SCHOOLOGY',\n CLASS_LINK = 'CLASS_LINK',\n SKOLFEDERATION = 'SKOLFEDERATION',\n SKOLON = 'SKOLON',\n WONDE = 'WONDE',\n CANVAS = 'CANVAS',\n QR_CODE = 'QR_CODE',\n}\n\nexport enum ApiRegion {\n MAIN = 'MAIN',\n CANADA = 'CANADA',\n}\n\nexport enum QRCodeSize {\n DEFAULT = 'default',\n MEDIUM = 'medium',\n LARGE = 'large',\n}\n","import i18n, { InitOptions } from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport type { TolgeeInstance, TolgeeStaticData } from '@tolgee/i18next'\nimport { BackendFetch, I18nextPlugin, Tolgee, withTolgee } from '@tolgee/i18next'\nimport { Locale } from '../shared/constants/common.constants'\nimport {\n FallbackResources,\n OnTranslationInitCallback,\n StorageConfig,\n TolgeeConfig,\n TranslationManagerOptions,\n} from './translation.types'\n\nconst CDN_ID = '39317fd3c6ff2ad02619ba673baae8b6'\nconst TOLGEE_DEV_TIMEOUT_MS = 3000\n\n// Invalid BCP 47 tags (e.g. en-SCT) get lowercased by hermes engine.\nconst CANONICAL_LOCALE_BY_NORMALIZED: Record<string, Locale> = Object.fromEntries(\n Object.values(Locale).map((locale) => [locale.toLowerCase(), locale])\n)\n\nconst DEFAULT_I18N_OPTIONS: InitOptions = {\n fallbackLng: undefined,\n load: 'currentOnly',\n react: {\n useSuspense: false,\n },\n interpolation: {\n escapeValue: false,\n },\n}\n\nexport class TranslationManager {\n private readonly isDev: boolean\n private readonly i18nOptions: InitOptions\n private readonly onInitCallbacks: OnTranslationInitCallback[] = []\n private readonly fallbackResources?: TolgeeStaticData\n private readonly storage?: StorageConfig\n\n private tolgeeCfg: TolgeeConfig | null = null\n private initPromise: Promise<void> | null = null\n\n constructor({ isDev, i18nOptions, storage, fallbackResources }: TranslationManagerOptions) {\n this.isDev = isDev\n this.i18nOptions = i18nOptions\n this.storage = storage\n this.fallbackResources = this.unwrapModuleDefaults(fallbackResources)\n }\n\n private unwrapModuleDefaults(resources?: FallbackResources) {\n if (!resources) return undefined\n return Object.fromEntries(\n Object.entries(resources).map(([key, load]) => [\n this.normalizeResourceKey(key),\n () => load().then((m) => m.default),\n ])\n )\n }\n\n private readonly normalizeResourceKey = (key: string) => {\n const [locale, ...rest] = key.split(':')\n return [this.toCanonicalLocale(locale), ...rest].join(':')\n }\n\n private readonly toCanonicalLocale = (locale: string) => {\n try {\n return Intl.getCanonicalLocales(locale)[0]\n } catch {\n return locale\n }\n }\n\n public readonly onInit = (callback: OnTranslationInitCallback) => {\n this.onInitCallbacks.push(callback)\n }\n\n public readonly init = async (locale: Locale, envConfig: TolgeeConfig) => {\n this.tolgeeCfg = envConfig\n\n if (!this.initPromise) {\n this.initPromise = this.initI18n(locale).catch((error) => {\n this.initPromise = null\n throw error\n })\n }\n await this.initPromise\n }\n\n public readonly setLanguage = async (locale: Locale) => {\n if (!i18n.isInitialized) return\n\n if (this.storage) {\n this.storage.adapter.setItem(this.storage.key, locale)\n }\n\n const canonicalLocale = this.toCanonicalLocale(locale)\n if (i18n.language !== canonicalLocale) {\n await i18n.changeLanguage(canonicalLocale)\n }\n }\n\n private readonly initI18n = async (locale: Locale) => {\n if (!this.tolgeeCfg) return\n\n const canonicalLocale = this.toCanonicalLocale(locale)\n const canUseTolgeeDevTools = this.isDev && this.tolgeeCfg.apiKey && this.tolgeeCfg.apiUrl\n\n const tolgee = canUseTolgeeDevTools\n ? await this.initTolgeeDevTools(this.tolgeeCfg)\n : this.createBaseTolgeeInstance(this.tolgeeCfg).init({ staticData: this.fallbackResources })\n\n await withTolgee(i18n, tolgee)\n .use(initReactI18next)\n .init({\n ...DEFAULT_I18N_OPTIONS,\n ...this.i18nOptions,\n lng: canonicalLocale,\n })\n\n this.onInitCallbacks.forEach((callback) => callback(locale))\n }\n\n private readonly createBaseTolgeeInstance = (tolgeeCfg: TolgeeConfig) => {\n return Tolgee()\n .use(I18nextPlugin())\n .use(\n BackendFetch({\n prefix: `${tolgeeCfg.cdnHost}/${CDN_ID}`,\n fallbackOnFail: true,\n getPath: ({ namespace, language, prefix }) => {\n const cdnLocale = CANONICAL_LOCALE_BY_NORMALIZED[language] ?? language\n return `${prefix}/${namespace}/${cdnLocale}.json`\n },\n })\n )\n }\n\n private readonly normalizeApiUrl = (url: string) => {\n const [path, query] = url.replace(/\\/\\?/, '?').split('?')\n const segments = path.split('/')\n const locale = segments.pop() ?? ''\n const canonicalLocale = CANONICAL_LOCALE_BY_NORMALIZED[locale] ?? locale\n\n return `${segments.join('/')}/${canonicalLocale}?${query}`\n }\n\n private readonly initTolgeeDevTools = async (tolgeeCfg: TolgeeConfig): Promise<TolgeeInstance> => {\n const { DevBackend } = await import('@tolgee/i18next')\n\n const instance = this.createBaseTolgeeInstance(tolgeeCfg).use(DevBackend())\n\n return instance.init({\n apiUrl: tolgeeCfg.apiUrl,\n apiKey: tolgeeCfg.apiKey,\n staticData: this.fallbackResources,\n fetch: async (input, init) => {\n const url = typeof input === 'string' ? this.normalizeApiUrl(input) : input\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), TOLGEE_DEV_TIMEOUT_MS)\n try {\n return await fetch(url, { ...init, signal: controller.signal })\n } finally {\n clearTimeout(timeoutId)\n }\n },\n })\n }\n}\n","export enum TranslationNamespace {\n STUDENTS_WEB = 'students-web',\n TEACHERS_WEB = 'teachers-web',\n DISTRICT_DASH = 'district-dash',\n AUTH_WEB = 'auth-web',\n MOBILE = 'mobile',\n MAGMAMATH_FEATURES = 'magmamath-features',\n DRAW_BOARD = 'drawboard',\n STUDENTS_FEATURES = 'students-features',\n SHARED = 'shared',\n}\n"]}
1
+ {"version":3,"sources":["../../src/shared/constants/common.constants.ts","../../src/translation/TranslationManager.ts","../../src/translation/translation.constants.ts"],"names":["Locale","TranslationNamespace"],"mappings":";;;;;;;AAuBO,IAAK,MAAA,qBAAAA,OAAL,KAAA;AACL,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AACL,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AACL,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AACL,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AACL,EAAAA,QAAA,KAAM,CAAA,GAAA,QAAA;AACN,EAAAA,QAAA,IAAK,CAAA,GAAA,OAAA;AANK,EAAAA,OAAAA,OAAAA;AAAA,CAAA,EAAA,MAAA,IAAA,EAAA,CAAA;;;ACVZ,IAAM,MAAS,GAAA,kCAAA;AACf,IAAM,qBAAwB,GAAA,GAAA;AAG9B,IAAM,iCAAyD,MAAO,CAAA,WAAA;AAAA,EACpE,MAAO,CAAA,MAAA,CAAO,MAAM,CAAA,CAAE,GAAI,CAAA,CAAC,MAAW,KAAA,CAAC,MAAO,CAAA,WAAA,EAAe,EAAA,MAAM,CAAC;AACtE,CAAA;AAEA,IAAM,oBAAoC,GAAA;AAAA,EACxC,WAAa,EAAA,MAAA;AAAA,EACb,IAAM,EAAA,aAAA;AAAA,EACN,KAAO,EAAA;AAAA,IACL,WAAa,EAAA;AAAA,GACf;AAAA,EACA,aAAe,EAAA;AAAA,IACb,WAAa,EAAA;AAAA;AAEjB,CAAA;AAEO,IAAM,qBAAN,MAAyB;AAAA,EACb,KAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAA+C,EAAC;AAAA,EAChD,iBAAA;AAAA,EACA,OAAA;AAAA,EAET,SAAiC,GAAA,IAAA;AAAA,EACjC,WAAoC,GAAA,IAAA;AAAA,EAE5C,YAAY,EAAE,KAAA,EAAO,WAAa,EAAA,OAAA,EAAS,mBAAgD,EAAA;AACzF,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA;AACb,IAAA,IAAA,CAAK,WAAc,GAAA,WAAA;AACnB,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AACf,IAAK,IAAA,CAAA,iBAAA,GAAoB,IAAK,CAAA,oBAAA,CAAqB,iBAAiB,CAAA;AAAA;AACtE,EAEQ,qBAAqB,SAA+B,EAAA;AAC1D,IAAI,IAAA,CAAC,WAAkB,OAAA,MAAA;AACvB,IAAA,OAAO,MAAO,CAAA,WAAA;AAAA,MACZ,MAAA,CAAO,QAAQ,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,GAAK,EAAA,IAAI,CAAM,KAAA;AAAA,QAC7C,IAAA,CAAK,qBAAqB,GAAG,CAAA;AAAA,QAC7B,MAAM,IAAK,EAAA,CAAE,KAAK,CAAC,CAAA,KAAM,EAAE,OAAO;AAAA,OACnC;AAAA,KACH;AAAA;AACF,EAEiB,oBAAA,GAAuB,CAAC,GAAgB,KAAA;AACvD,IAAA,MAAM,CAAC,MAAQ,EAAA,GAAG,IAAI,CAAI,GAAA,GAAA,CAAI,MAAM,GAAG,CAAA;AACvC,IAAO,OAAA,CAAC,KAAK,iBAAkB,CAAA,MAAM,GAAG,GAAG,IAAI,CAAE,CAAA,IAAA,CAAK,GAAG,CAAA;AAAA,GAC3D;AAAA,EAEiB,iBAAA,GAAoB,CAAC,MAAmB,KAAA;AACvD,IAAI,IAAA;AACF,MAAA,OAAO,IAAK,CAAA,mBAAA,CAAoB,MAAM,CAAA,CAAE,CAAC,CAAA;AAAA,KACnC,CAAA,MAAA;AACN,MAAO,OAAA,MAAA;AAAA;AACT,GACF;AAAA,EAEgB,MAAA,GAAS,CAAC,QAAwC,KAAA;AAChE,IAAK,IAAA,CAAA,eAAA,CAAgB,KAAK,QAAQ,CAAA;AAAA,GACpC;AAAA,EAEgB,IAAA,GAAO,OAAO,MAAA,EAAgB,SAA4B,KAAA;AACxE,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA;AAEjB,IAAI,IAAA,CAAC,KAAK,WAAa,EAAA;AACrB,MAAA,IAAA,CAAK,cAAc,IAAK,CAAA,QAAA,CAAS,MAAM,CAAE,CAAA,KAAA,CAAM,CAAC,KAAU,KAAA;AACxD,QAAA,IAAA,CAAK,WAAc,GAAA,IAAA;AACnB,QAAM,MAAA,KAAA;AAAA,OACP,CAAA;AAAA;AAEH,IAAA,MAAM,IAAK,CAAA,WAAA;AAAA,GACb;AAAA,EAEgB,WAAA,GAAc,OAAO,MAAmB,KAAA;AACtD,IAAI,IAAA,CAAC,KAAK,aAAe,EAAA;AAEzB,IAAA,IAAI,KAAK,OAAS,EAAA;AAChB,MAAA,IAAA,CAAK,QAAQ,OAAQ,CAAA,OAAA,CAAQ,IAAK,CAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA;AAGvD,IAAM,MAAA,eAAA,GAAkB,IAAK,CAAA,iBAAA,CAAkB,MAAM,CAAA;AACrD,IAAI,IAAA,IAAA,CAAK,aAAa,eAAiB,EAAA;AACrC,MAAM,MAAA,IAAA,CAAK,eAAe,eAAe,CAAA;AAAA;AAC3C,GACF;AAAA,EAEiB,QAAA,GAAW,OAAO,MAAmB,KAAA;AACpD,IAAI,IAAA,CAAC,KAAK,SAAW,EAAA;AAErB,IAAM,MAAA,eAAA,GAAkB,IAAK,CAAA,iBAAA,CAAkB,MAAM,CAAA;AACrD,IAAA,MAAM,uBAAuB,IAAK,CAAA,KAAA,IAAS,KAAK,SAAU,CAAA,MAAA,IAAU,KAAK,SAAU,CAAA,MAAA;AAEnF,IAAA,MAAM,SAAS,oBACX,GAAA,MAAM,KAAK,kBAAmB,CAAA,IAAA,CAAK,SAAS,CAC5C,GAAA,IAAA,CAAK,wBAAyB,CAAA,IAAA,CAAK,SAAS,CAAE,CAAA,IAAA,CAAK,EAAE,UAAY,EAAA,IAAA,CAAK,mBAAmB,CAAA;AAE7F,IAAA,MAAM,WAAW,IAAM,EAAA,MAAM,EAC1B,GAAI,CAAA,gBAAgB,EACpB,IAAK,CAAA;AAAA,MACJ,GAAG,oBAAA;AAAA,MACH,GAAG,IAAK,CAAA,WAAA;AAAA,MACR,GAAK,EAAA;AAAA,KACN,CAAA;AAEH,IAAA,IAAA,CAAK,gBAAgB,OAAQ,CAAA,CAAC,QAAa,KAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,GAC7D;AAAA,EAEiB,wBAAA,GAA2B,CAAC,SAA4B,KAAA;AACvE,IAAA,OAAO,MAAO,EAAA,CACX,GAAI,CAAA,aAAA,EAAe,CACnB,CAAA,GAAA;AAAA,MACC,YAAa,CAAA;AAAA,QACX,MAAQ,EAAA,CAAA,EAAG,SAAU,CAAA,OAAO,IAAI,MAAM,CAAA,CAAA;AAAA,QACtC,cAAgB,EAAA,IAAA;AAAA,QAChB,SAAS,CAAC,EAAE,SAAW,EAAA,QAAA,EAAU,QAAa,KAAA;AAC5C,UAAM,MAAA,SAAA,GAAY,8BAA+B,CAAA,QAAQ,CAAK,IAAA,QAAA;AAC9D,UAAA,OAAO,CAAG,EAAA,MAAM,CAAI,CAAA,EAAA,SAAS,IAAI,SAAS,CAAA,KAAA,CAAA;AAAA;AAC5C,OACD;AAAA,KACH;AAAA,GACJ;AAAA,EAEiB,eAAA,GAAkB,CAAC,GAAgB,KAAA;AAClD,IAAM,MAAA,CAAC,IAAM,EAAA,KAAK,CAAI,GAAA,GAAA,CAAI,QAAQ,MAAQ,EAAA,GAAG,CAAE,CAAA,KAAA,CAAM,GAAG,CAAA;AACxD,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAM,MAAA,MAAA,GAAS,QAAS,CAAA,GAAA,EAAS,IAAA,EAAA;AACjC,IAAM,MAAA,eAAA,GAAkB,8BAA+B,CAAA,MAAM,CAAK,IAAA,MAAA;AAElE,IAAA,OAAO,CAAG,EAAA,QAAA,CAAS,IAAK,CAAA,GAAG,CAAC,CAAA,CAAA,EAAI,eAAe,CAAA,EAAG,KAAQ,GAAA,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,GAC5E;AAAA,EAEiB,kBAAA,GAAqB,OAAO,SAAqD,KAAA;AAChG,IAAA,MAAM,EAAE,UAAA,EAAe,GAAA,MAAM,OAAO,iBAAiB,CAAA;AAErD,IAAA,MAAM,WAAW,IAAK,CAAA,wBAAA,CAAyB,SAAS,CAAE,CAAA,GAAA,CAAI,YAAY,CAAA;AAE1E,IAAA,OAAO,SAAS,IAAK,CAAA;AAAA,MACnB,QAAQ,SAAU,CAAA,MAAA;AAAA,MAClB,QAAQ,SAAU,CAAA,MAAA;AAAA,MAClB,YAAY,IAAK,CAAA,iBAAA;AAAA,MACjB,KAAA,EAAO,OAAO,KAAA,EAAO,IAAS,KAAA;AAC5B,QAAA,MAAM,MAAM,OAAO,KAAA,KAAU,WAAW,IAAK,CAAA,eAAA,CAAgB,KAAK,CAAI,GAAA,KAAA;AACtE,QAAM,MAAA,UAAA,GAAa,IAAI,eAAgB,EAAA;AACvC,QAAA,MAAM,YAAY,UAAW,CAAA,MAAM,UAAW,CAAA,KAAA,IAAS,qBAAqB,CAAA;AAC5E,QAAI,IAAA;AACF,UAAO,OAAA,MAAM,MAAM,GAAK,EAAA,EAAE,GAAG,IAAM,EAAA,MAAA,EAAQ,UAAW,CAAA,MAAA,EAAQ,CAAA;AAAA,SAC9D,SAAA;AACA,UAAA,YAAA,CAAa,SAAS,CAAA;AAAA;AACxB;AACF,KACD,CAAA;AAAA,GACH;AACF;;;ACvKY,IAAA,oBAAA,qBAAAC,qBAAL,KAAA;AACL,EAAAA,sBAAA,cAAe,CAAA,GAAA,cAAA;AACf,EAAAA,sBAAA,cAAe,CAAA,GAAA,cAAA;AACf,EAAAA,sBAAA,eAAgB,CAAA,GAAA,eAAA;AAChB,EAAAA,sBAAA,UAAW,CAAA,GAAA,UAAA;AACX,EAAAA,sBAAA,QAAS,CAAA,GAAA,QAAA;AACT,EAAAA,sBAAA,oBAAqB,CAAA,GAAA,oBAAA;AACrB,EAAAA,sBAAA,YAAa,CAAA,GAAA,WAAA;AACb,EAAAA,sBAAA,mBAAoB,CAAA,GAAA,mBAAA;AACpB,EAAAA,sBAAA,QAAS,CAAA,GAAA,QAAA;AATC,EAAAA,OAAAA,qBAAAA;AAAA,CAAA,EAAA,oBAAA,IAAA,EAAA","file":"index.mjs","sourcesContent":["export enum Platform {\n STUDENTS_WEB = 'STUDENTS',\n TEACHERS_WEB = 'TEACHERS',\n DISTRICT_DASHBOARD = 'DISTRICT',\n AUTH_WEB = 'AUTH_WEB',\n WEB_ADMIN = 'WEB_ADMIN',\n MOBILE = 'MOBILE',\n PARENT_WEB = 'PARENT_WEB',\n}\n\nexport enum Environment {\n MARS = 'MARS',\n VENUS = 'VENUS',\n PROD = 'PROD',\n}\n\nexport enum PlatformBuildTarget {\n PLUTO = 'pluto',\n MARS = 'mars',\n VENUS = 'pre-release',\n PROD = 'production',\n}\n\nexport enum Locale {\n US = 'en-SE',\n SE = 'sv-SE',\n GB = 'en-GB',\n CA = 'en-CA',\n SCT = 'en-SCT',\n DE = 'de-DE',\n}\n\nexport enum Source {\n MATTEAPPEN = 0,\n SKOLON = 1,\n SKOLFEDERATION = 2,\n GOOGLE = 3,\n MICROSOFT = 4,\n CLEVER = 5,\n APPLE = 6,\n MATHSYNC = 7,\n CLASSLINK = 8,\n EDUCLOUD = 9,\n EGIL = 10,\n WONDE = 12,\n SCHOOLOGY = 13,\n SEEMIS = 14,\n IMPORT = 15,\n CANVAS = 16,\n}\n\nexport enum LoginSource {\n MAGMA = 0,\n CLEVER = 1,\n CLASS_LINK = 2,\n SKOLON = 3,\n SKOLFEDERATION = 4,\n GOOGLE = 5,\n MICROSOFT = 6,\n APPLE = 7,\n SCHOOLOGY = 8,\n MY_LOGIN = 9,\n}\n\nexport enum SSO {\n APPLE = 'APPLE',\n GOOGLE = 'GOOGLE',\n MICROSOFT = 'MICROSOFT',\n CLEVER = 'CLEVER',\n SCHOOLOGY = 'SCHOOLOGY',\n CLASS_LINK = 'CLASS_LINK',\n SKOLFEDERATION = 'SKOLFEDERATION',\n SKOLON = 'SKOLON',\n WONDE = 'WONDE',\n CANVAS = 'CANVAS',\n QR_CODE = 'QR_CODE',\n}\n\nexport enum ApiRegion {\n MAIN = 'MAIN',\n CANADA = 'CANADA',\n}\n\nexport enum QRCodeSize {\n DEFAULT = 'default',\n MEDIUM = 'medium',\n LARGE = 'large',\n}\n","import i18n, { InitOptions } from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport type { TolgeeInstance, TolgeeStaticData } from '@tolgee/i18next'\nimport { BackendFetch, I18nextPlugin, Tolgee, withTolgee } from '@tolgee/i18next'\nimport { Locale } from '../shared/constants/common.constants'\nimport {\n FallbackResources,\n OnTranslationInitCallback,\n StorageConfig,\n TolgeeConfig,\n TranslationManagerOptions,\n} from './translation.types'\n\nconst CDN_ID = '39317fd3c6ff2ad02619ba673baae8b6'\nconst TOLGEE_DEV_TIMEOUT_MS = 3000\n\n// Invalid BCP 47 tags (e.g. en-SCT) get lowercased by hermes engine.\nconst CANONICAL_LOCALE_BY_NORMALIZED: Record<string, Locale> = Object.fromEntries(\n Object.values(Locale).map((locale) => [locale.toLowerCase(), locale])\n)\n\nconst DEFAULT_I18N_OPTIONS: InitOptions = {\n fallbackLng: undefined,\n load: 'currentOnly',\n react: {\n useSuspense: false,\n },\n interpolation: {\n escapeValue: false,\n },\n}\n\nexport class TranslationManager {\n private readonly isDev: boolean\n private readonly i18nOptions: InitOptions\n private readonly onInitCallbacks: OnTranslationInitCallback[] = []\n private readonly fallbackResources?: TolgeeStaticData\n private readonly storage?: StorageConfig\n\n private tolgeeCfg: TolgeeConfig | null = null\n private initPromise: Promise<void> | null = null\n\n constructor({ isDev, i18nOptions, storage, fallbackResources }: TranslationManagerOptions) {\n this.isDev = isDev\n this.i18nOptions = i18nOptions\n this.storage = storage\n this.fallbackResources = this.unwrapModuleDefaults(fallbackResources)\n }\n\n private unwrapModuleDefaults(resources?: FallbackResources) {\n if (!resources) return undefined\n return Object.fromEntries(\n Object.entries(resources).map(([key, load]) => [\n this.normalizeResourceKey(key),\n () => load().then((m) => m.default),\n ])\n )\n }\n\n private readonly normalizeResourceKey = (key: string) => {\n const [locale, ...rest] = key.split(':')\n return [this.toCanonicalLocale(locale), ...rest].join(':')\n }\n\n private readonly toCanonicalLocale = (locale: string) => {\n try {\n return Intl.getCanonicalLocales(locale)[0]\n } catch {\n return locale\n }\n }\n\n public readonly onInit = (callback: OnTranslationInitCallback) => {\n this.onInitCallbacks.push(callback)\n }\n\n public readonly init = async (locale: Locale, envConfig: TolgeeConfig) => {\n this.tolgeeCfg = envConfig\n\n if (!this.initPromise) {\n this.initPromise = this.initI18n(locale).catch((error) => {\n this.initPromise = null\n throw error\n })\n }\n await this.initPromise\n }\n\n public readonly setLanguage = async (locale: Locale) => {\n if (!i18n.isInitialized) return\n\n if (this.storage) {\n this.storage.adapter.setItem(this.storage.key, locale)\n }\n\n const canonicalLocale = this.toCanonicalLocale(locale)\n if (i18n.language !== canonicalLocale) {\n await i18n.changeLanguage(canonicalLocale)\n }\n }\n\n private readonly initI18n = async (locale: Locale) => {\n if (!this.tolgeeCfg) return\n\n const canonicalLocale = this.toCanonicalLocale(locale)\n const canUseTolgeeDevTools = this.isDev && this.tolgeeCfg.apiKey && this.tolgeeCfg.apiUrl\n\n const tolgee = canUseTolgeeDevTools\n ? await this.initTolgeeDevTools(this.tolgeeCfg)\n : this.createBaseTolgeeInstance(this.tolgeeCfg).init({ staticData: this.fallbackResources })\n\n await withTolgee(i18n, tolgee)\n .use(initReactI18next)\n .init({\n ...DEFAULT_I18N_OPTIONS,\n ...this.i18nOptions,\n lng: canonicalLocale,\n })\n\n this.onInitCallbacks.forEach((callback) => callback(locale))\n }\n\n private readonly createBaseTolgeeInstance = (tolgeeCfg: TolgeeConfig) => {\n return Tolgee()\n .use(I18nextPlugin())\n .use(\n BackendFetch({\n prefix: `${tolgeeCfg.cdnHost}/${CDN_ID}`,\n fallbackOnFail: true,\n getPath: ({ namespace, language, prefix }) => {\n const cdnLocale = CANONICAL_LOCALE_BY_NORMALIZED[language] ?? language\n return `${prefix}/${namespace}/${cdnLocale}.json`\n },\n })\n )\n }\n\n private readonly normalizeApiUrl = (url: string) => {\n const [path, query] = url.replace(/\\/\\?/, '?').split('?')\n const segments = path.split('/')\n const locale = segments.pop() ?? ''\n const canonicalLocale = CANONICAL_LOCALE_BY_NORMALIZED[locale] ?? locale\n\n return `${segments.join('/')}/${canonicalLocale}${query ? `?${query}` : ''}`\n }\n\n private readonly initTolgeeDevTools = async (tolgeeCfg: TolgeeConfig): Promise<TolgeeInstance> => {\n const { DevBackend } = await import('@tolgee/i18next')\n\n const instance = this.createBaseTolgeeInstance(tolgeeCfg).use(DevBackend())\n\n return instance.init({\n apiUrl: tolgeeCfg.apiUrl,\n apiKey: tolgeeCfg.apiKey,\n staticData: this.fallbackResources,\n fetch: async (input, init) => {\n const url = typeof input === 'string' ? this.normalizeApiUrl(input) : input\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), TOLGEE_DEV_TIMEOUT_MS)\n try {\n return await fetch(url, { ...init, signal: controller.signal })\n } finally {\n clearTimeout(timeoutId)\n }\n },\n })\n }\n}\n","export enum TranslationNamespace {\n STUDENTS_WEB = 'students-web',\n TEACHERS_WEB = 'teachers-web',\n DISTRICT_DASH = 'district-dash',\n AUTH_WEB = 'auth-web',\n MOBILE = 'mobile',\n MAGMAMATH_FEATURES = 'magmamath-features',\n DRAW_BOARD = 'drawboard',\n STUDENTS_FEATURES = 'students-features',\n SHARED = 'shared',\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magmamath/frontend-config",
3
- "version": "1.3.4-rc.5",
3
+ "version": "1.3.4-rc.6",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",