@windrun-huaiin/lib 6.1.2 → 6.2.1

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.
@@ -62,7 +62,6 @@ declare function createCommonAppConfig(options?: {
62
62
  icon: {
63
63
  uniformColor: string;
64
64
  };
65
- openMdxSEOSiteMap: boolean;
66
65
  showBanner: boolean;
67
66
  clerkAuthInModal: boolean;
68
67
  clerkPageBanner: boolean;
@@ -62,7 +62,6 @@ declare function createCommonAppConfig(options?: {
62
62
  icon: {
63
63
  uniformColor: string;
64
64
  };
65
- openMdxSEOSiteMap: boolean;
66
65
  showBanner: boolean;
67
66
  clerkAuthInModal: boolean;
68
67
  clerkPageBanner: boolean;
@@ -76,7 +76,6 @@ function createCommonAppConfig(options) {
76
76
  icon: {
77
77
  uniformColor: process.env.NEXT_PUBLIC_STYLE_ICON_COLOR || "text-purple-500"
78
78
  },
79
- openMdxSEOSiteMap: process.env.NEXT_PUBLIC_STYLE_OPEN_MDX_SEO_SITE_MAP === "true",
80
79
  showBanner: process.env.NEXT_PUBLIC_STYLE_SHOW_BANNER === "true",
81
80
  clerkAuthInModal: process.env.NEXT_PUBLIC_STYLE_CLERK_AUTH_IN_MODAL === "true",
82
81
  clerkPageBanner: process.env.NEXT_PUBLIC_STYLE_CLERK_PAGE_BANNER === "true",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common-app-config.ts"],"names":[],"mappings":"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","file":"common-app-config.js","sourcesContent":["// Supported languages and their labels\nconst ALL_LOCALE_LABELS = {\n en: \"English\",\n zh: \"简体中文\",\n ja: \"日本語\", \n ko: \"한국어\",\n fr: \"Français\",\n de: \"Deutsch\",\n es: \"Español\",\n it: \"Italiano\",\n pt: \"Português\",\n tr: \"Türkçe\",\n pl: \"Polski\",\n ru: \"Русский\",\n ar: \"العربية\",\n hi: \"हिन्दी\",\n th: \"ไทย\",\n vi: \"Tiếng Việt\",\n} as const;\n\nexport type SupportedLocale = keyof typeof ALL_LOCALE_LABELS;\n\n// Helper function to get language configuration from environment variables\nfunction getLocaleLabels(locales: string[]) {\n return Object.fromEntries(\n locales.map(locale => [\n locale, \n ALL_LOCALE_LABELS[locale as SupportedLocale] || locale\n ])\n );\n}\n\n// Common application configuration creation function\nexport function createCommonAppConfig(options?: {\n // Optional: manually specify supported languages, otherwise read from environment variables\n locales?: string[];\n defaultLocale?: string;\n}) {\n // Priority: manual configuration > environment variables > default values\n const locales = options?.locales ?? \n process.env.NEXT_PUBLIC_I18N_LOCALES?.split(',').map(s => s.trim()) ?? \n ['en', 'zh'];\n \n const defaultLocale = options?.defaultLocale ?? \n process.env.NEXT_PUBLIC_I18N_DEFAULT_LOCALE ?? \n 'en';\n \n const storagePrefix = process.env.NEXT_PUBLIC_I18N_STORAGE_PREFIX || 'WINDRUN-HUAIIN';\n\n const config = {\n // Basic configuration\n baseUrl: process.env.NEXT_PUBLIC_BASE_URL || '',\n githubBaseUrl: process.env.NEXT_PUBLIC_GITHUB_BASE_URL || '',\n github: process.env.NEXT_PUBLIC_GITHUB || '',\n githubInfoToken: process.env.NEXT_PUBLIC_FUMA_GITHUB_TOKEN || '',\n\n // Internationalization configuration\n i18n: {\n locales: locales as readonly string[],\n defaultLocale,\n localeLabels: getLocaleLabels(locales),\n detector: {\n storageKey: process.env.NEXT_PUBLIC_I18N_STORAGE_KEY || 'language-preference-status',\n autoCloseTimeout: parseInt(process.env.NEXT_PUBLIC_I18N_AUTO_CLOSE_TIMEOUT || '10000'),\n expirationDays: parseInt(process.env.NEXT_PUBLIC_I18N_EXPIRATION_DAYS || '30'),\n storagePrefix\n },\n messageRoot: process.env.NEXT_PUBLIC_I18N_MESSAGE_ROOT || 'messages',\n },\n\n // Style configuration\n style: {\n icon: {\n uniformColor: process.env.NEXT_PUBLIC_STYLE_ICON_COLOR || \"text-purple-500\"\n },\n openMdxSEOSiteMap: process.env.NEXT_PUBLIC_STYLE_OPEN_MDX_SEO_SITE_MAP === 'true',\n showBanner: process.env.NEXT_PUBLIC_STYLE_SHOW_BANNER === 'true',\n clerkAuthInModal: process.env.NEXT_PUBLIC_STYLE_CLERK_AUTH_IN_MODAL === 'true',\n clerkPageBanner: process.env.NEXT_PUBLIC_STYLE_CLERK_PAGE_BANNER === 'true',\n watermark: {\n enabled: process.env.NEXT_PUBLIC_STYLE_WATERMARK_ENABLED === 'true',\n text: process.env.NEXT_PUBLIC_STYLE_WATERMARK_TEXT || \"巽川·怀因\"\n },\n cdnBaseUrl: process.env.NEXT_PUBLIC_STYLE_CDN_BASE_URL || \"https://r2.d8ger.com\",\n cdnProxyUrl: process.env.NEXT_PUBLIC_STYLE_CDN_PROXY_URL || \"https://r2-explorer-template.zcy777et.workers.dev/proxy\",\n placeHolder: {\n image: process.env.NEXT_PUBLIC_STYLE_PLACEHOLDER_IMAGE || \"/default.webp\"\n }\n },\n\n // Clerk configuration\n clerk: {\n signInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL || \"/sign-in\",\n fallbackSignInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_FALLBACK_REDIRECT_URL || \"/\",\n signUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_URL || \"/sign-up\", \n fallbackSignUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_FALLBACK_REDIRECT_URL || \"/\",\n waitlistUrl: process.env.NEXT_PUBLIC_CLERK_WAITLIST_URL || \"/waitlist\",\n debug: process.env.CLERK_DEBUG === 'true',\n },\n\n // MDX source file directory configuration\n mdxSourceDir: {\n docs: process.env.NEXT_PUBLIC_MDX_DOCS_DIR || \"src/mdx/docs\",\n blog: process.env.NEXT_PUBLIC_MDX_BLOG_DIR || \"src/mdx/blog\", \n legal: process.env.NEXT_PUBLIC_MDX_LEGAL_DIR || \"src/mdx/legal\"\n },\n };\n\n // Convenient constants - avoid deep nested access\n const shortcuts = {\n iconColor: config.style.icon.uniformColor,\n watermark: config.style.watermark,\n showBanner: config.style.showBanner,\n clerkPageBanner: config.style.clerkPageBanner,\n clerkAuthInModal: config.style.clerkAuthInModal,\n placeHolderImage: config.style.placeHolder.image,\n clerk: config.clerk,\n };\n\n return {\n ...config,\n shortcuts\n };\n}\n\n// Create internationalization helper functions\nexport function createI18nHelpers(i18nConfig: ReturnType<typeof createCommonAppConfig>['i18n']) {\n function isSupportedLocale(locale: string): locale is typeof i18nConfig.locales[number] {\n return (i18nConfig.locales as readonly string[]).includes(locale);\n }\n\n function getValidLocale(locale: string): typeof i18nConfig.locales[number] {\n return isSupportedLocale(locale) ? locale : i18nConfig.defaultLocale;\n }\n\n const generatedLocales = i18nConfig.locales.map((loc) => ({\n name: i18nConfig.localeLabels[loc as keyof typeof i18nConfig.localeLabels] || loc,\n locale: loc,\n }));\n\n return {\n isSupportedLocale,\n getValidLocale,\n generatedLocales\n };\n}\n\n// Convenient configuration presets\nexport const LOCALE_PRESETS = {\n // Only support English\n EN_ONLY: { locales: ['en'] as string[], defaultLocale: 'en' as string },\n \n // English and Chinese\n EN_ZH: { locales: ['en', 'zh'] as string[], defaultLocale: 'en' as string },\n \n // Main Asian languages\n ASIA: { locales: ['en', 'zh', 'ja', 'ko'] as string[], defaultLocale: 'en' as string },\n \n // Main European languages\n EUROPE: { locales: ['en', 'fr', 'de', 'es', 'it'] as string[], defaultLocale: 'en' as string },\n \n // Globalization\n GLOBAL: { locales: ['en', 'zh', 'ja', 'ko', 'fr', 'de', 'es', 'it', 'pt', 'ru'] as string[], defaultLocale: 'en' as string },\n \n // No internationalization (only default language)\n NONE: { locales: [] as string[], defaultLocale: 'en' as string }\n}; "]}
1
+ {"version":3,"sources":["../src/common-app-config.ts"],"names":[],"mappings":"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","file":"common-app-config.js","sourcesContent":["// Supported languages and their labels\nconst ALL_LOCALE_LABELS = {\n en: \"English\",\n zh: \"简体中文\",\n ja: \"日本語\", \n ko: \"한국어\",\n fr: \"Français\",\n de: \"Deutsch\",\n es: \"Español\",\n it: \"Italiano\",\n pt: \"Português\",\n tr: \"Türkçe\",\n pl: \"Polski\",\n ru: \"Русский\",\n ar: \"العربية\",\n hi: \"हिन्दी\",\n th: \"ไทย\",\n vi: \"Tiếng Việt\",\n} as const;\n\nexport type SupportedLocale = keyof typeof ALL_LOCALE_LABELS;\n\n// Helper function to get language configuration from environment variables\nfunction getLocaleLabels(locales: string[]) {\n return Object.fromEntries(\n locales.map(locale => [\n locale, \n ALL_LOCALE_LABELS[locale as SupportedLocale] || locale\n ])\n );\n}\n\n// Common application configuration creation function\nexport function createCommonAppConfig(options?: {\n // Optional: manually specify supported languages, otherwise read from environment variables\n locales?: string[];\n defaultLocale?: string;\n}) {\n // Priority: manual configuration > environment variables > default values\n const locales = options?.locales ?? \n process.env.NEXT_PUBLIC_I18N_LOCALES?.split(',').map(s => s.trim()) ?? \n ['en', 'zh'];\n \n const defaultLocale = options?.defaultLocale ?? \n process.env.NEXT_PUBLIC_I18N_DEFAULT_LOCALE ?? \n 'en';\n \n const storagePrefix = process.env.NEXT_PUBLIC_I18N_STORAGE_PREFIX || 'WINDRUN-HUAIIN';\n\n const config = {\n // Basic configuration\n baseUrl: process.env.NEXT_PUBLIC_BASE_URL || '',\n githubBaseUrl: process.env.NEXT_PUBLIC_GITHUB_BASE_URL || '',\n github: process.env.NEXT_PUBLIC_GITHUB || '',\n githubInfoToken: process.env.NEXT_PUBLIC_FUMA_GITHUB_TOKEN || '',\n\n // Internationalization configuration\n i18n: {\n locales: locales as readonly string[],\n defaultLocale,\n localeLabels: getLocaleLabels(locales),\n detector: {\n storageKey: process.env.NEXT_PUBLIC_I18N_STORAGE_KEY || 'language-preference-status',\n autoCloseTimeout: parseInt(process.env.NEXT_PUBLIC_I18N_AUTO_CLOSE_TIMEOUT || '10000'),\n expirationDays: parseInt(process.env.NEXT_PUBLIC_I18N_EXPIRATION_DAYS || '30'),\n storagePrefix\n },\n messageRoot: process.env.NEXT_PUBLIC_I18N_MESSAGE_ROOT || 'messages',\n },\n\n // Style configuration\n style: {\n icon: {\n uniformColor: process.env.NEXT_PUBLIC_STYLE_ICON_COLOR || \"text-purple-500\"\n },\n showBanner: process.env.NEXT_PUBLIC_STYLE_SHOW_BANNER === 'true',\n clerkAuthInModal: process.env.NEXT_PUBLIC_STYLE_CLERK_AUTH_IN_MODAL === 'true',\n clerkPageBanner: process.env.NEXT_PUBLIC_STYLE_CLERK_PAGE_BANNER === 'true',\n watermark: {\n enabled: process.env.NEXT_PUBLIC_STYLE_WATERMARK_ENABLED === 'true',\n text: process.env.NEXT_PUBLIC_STYLE_WATERMARK_TEXT || \"巽川·怀因\"\n },\n cdnBaseUrl: process.env.NEXT_PUBLIC_STYLE_CDN_BASE_URL || \"https://r2.d8ger.com\",\n cdnProxyUrl: process.env.NEXT_PUBLIC_STYLE_CDN_PROXY_URL || \"https://r2-explorer-template.zcy777et.workers.dev/proxy\",\n placeHolder: {\n image: process.env.NEXT_PUBLIC_STYLE_PLACEHOLDER_IMAGE || \"/default.webp\"\n }\n },\n\n // Clerk configuration\n clerk: {\n signInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL || \"/sign-in\",\n fallbackSignInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_FALLBACK_REDIRECT_URL || \"/\",\n signUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_URL || \"/sign-up\", \n fallbackSignUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_FALLBACK_REDIRECT_URL || \"/\",\n waitlistUrl: process.env.NEXT_PUBLIC_CLERK_WAITLIST_URL || \"/waitlist\",\n debug: process.env.CLERK_DEBUG === 'true',\n },\n\n // MDX source file directory configuration\n mdxSourceDir: {\n docs: process.env.NEXT_PUBLIC_MDX_DOCS_DIR || \"src/mdx/docs\",\n blog: process.env.NEXT_PUBLIC_MDX_BLOG_DIR || \"src/mdx/blog\", \n legal: process.env.NEXT_PUBLIC_MDX_LEGAL_DIR || \"src/mdx/legal\"\n },\n };\n\n // Convenient constants - avoid deep nested access\n const shortcuts = {\n iconColor: config.style.icon.uniformColor,\n watermark: config.style.watermark,\n showBanner: config.style.showBanner,\n clerkPageBanner: config.style.clerkPageBanner,\n clerkAuthInModal: config.style.clerkAuthInModal,\n placeHolderImage: config.style.placeHolder.image,\n clerk: config.clerk,\n };\n\n return {\n ...config,\n shortcuts\n };\n}\n\n// Create internationalization helper functions\nexport function createI18nHelpers(i18nConfig: ReturnType<typeof createCommonAppConfig>['i18n']) {\n function isSupportedLocale(locale: string): locale is typeof i18nConfig.locales[number] {\n return (i18nConfig.locales as readonly string[]).includes(locale);\n }\n\n function getValidLocale(locale: string): typeof i18nConfig.locales[number] {\n return isSupportedLocale(locale) ? locale : i18nConfig.defaultLocale;\n }\n\n const generatedLocales = i18nConfig.locales.map((loc) => ({\n name: i18nConfig.localeLabels[loc as keyof typeof i18nConfig.localeLabels] || loc,\n locale: loc,\n }));\n\n return {\n isSupportedLocale,\n getValidLocale,\n generatedLocales\n };\n}\n\n// Convenient configuration presets\nexport const LOCALE_PRESETS = {\n // Only support English\n EN_ONLY: { locales: ['en'] as string[], defaultLocale: 'en' as string },\n \n // English and Chinese\n EN_ZH: { locales: ['en', 'zh'] as string[], defaultLocale: 'en' as string },\n \n // Main Asian languages\n ASIA: { locales: ['en', 'zh', 'ja', 'ko'] as string[], defaultLocale: 'en' as string },\n \n // Main European languages\n EUROPE: { locales: ['en', 'fr', 'de', 'es', 'it'] as string[], defaultLocale: 'en' as string },\n \n // Globalization\n GLOBAL: { locales: ['en', 'zh', 'ja', 'ko', 'fr', 'de', 'es', 'it', 'pt', 'ru'] as string[], defaultLocale: 'en' as string },\n \n // No internationalization (only default language)\n NONE: { locales: [] as string[], defaultLocale: 'en' as string }\n}; "]}
@@ -74,7 +74,6 @@ function createCommonAppConfig(options) {
74
74
  icon: {
75
75
  uniformColor: process.env.NEXT_PUBLIC_STYLE_ICON_COLOR || "text-purple-500"
76
76
  },
77
- openMdxSEOSiteMap: process.env.NEXT_PUBLIC_STYLE_OPEN_MDX_SEO_SITE_MAP === "true",
78
77
  showBanner: process.env.NEXT_PUBLIC_STYLE_SHOW_BANNER === "true",
79
78
  clerkAuthInModal: process.env.NEXT_PUBLIC_STYLE_CLERK_AUTH_IN_MODAL === "true",
80
79
  clerkPageBanner: process.env.NEXT_PUBLIC_STYLE_CLERK_PAGE_BANNER === "true",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/common-app-config.ts"],"names":[],"mappings":"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","file":"common-app-config.mjs","sourcesContent":["// Supported languages and their labels\nconst ALL_LOCALE_LABELS = {\n en: \"English\",\n zh: \"简体中文\",\n ja: \"日本語\", \n ko: \"한국어\",\n fr: \"Français\",\n de: \"Deutsch\",\n es: \"Español\",\n it: \"Italiano\",\n pt: \"Português\",\n tr: \"Türkçe\",\n pl: \"Polski\",\n ru: \"Русский\",\n ar: \"العربية\",\n hi: \"हिन्दी\",\n th: \"ไทย\",\n vi: \"Tiếng Việt\",\n} as const;\n\nexport type SupportedLocale = keyof typeof ALL_LOCALE_LABELS;\n\n// Helper function to get language configuration from environment variables\nfunction getLocaleLabels(locales: string[]) {\n return Object.fromEntries(\n locales.map(locale => [\n locale, \n ALL_LOCALE_LABELS[locale as SupportedLocale] || locale\n ])\n );\n}\n\n// Common application configuration creation function\nexport function createCommonAppConfig(options?: {\n // Optional: manually specify supported languages, otherwise read from environment variables\n locales?: string[];\n defaultLocale?: string;\n}) {\n // Priority: manual configuration > environment variables > default values\n const locales = options?.locales ?? \n process.env.NEXT_PUBLIC_I18N_LOCALES?.split(',').map(s => s.trim()) ?? \n ['en', 'zh'];\n \n const defaultLocale = options?.defaultLocale ?? \n process.env.NEXT_PUBLIC_I18N_DEFAULT_LOCALE ?? \n 'en';\n \n const storagePrefix = process.env.NEXT_PUBLIC_I18N_STORAGE_PREFIX || 'WINDRUN-HUAIIN';\n\n const config = {\n // Basic configuration\n baseUrl: process.env.NEXT_PUBLIC_BASE_URL || '',\n githubBaseUrl: process.env.NEXT_PUBLIC_GITHUB_BASE_URL || '',\n github: process.env.NEXT_PUBLIC_GITHUB || '',\n githubInfoToken: process.env.NEXT_PUBLIC_FUMA_GITHUB_TOKEN || '',\n\n // Internationalization configuration\n i18n: {\n locales: locales as readonly string[],\n defaultLocale,\n localeLabels: getLocaleLabels(locales),\n detector: {\n storageKey: process.env.NEXT_PUBLIC_I18N_STORAGE_KEY || 'language-preference-status',\n autoCloseTimeout: parseInt(process.env.NEXT_PUBLIC_I18N_AUTO_CLOSE_TIMEOUT || '10000'),\n expirationDays: parseInt(process.env.NEXT_PUBLIC_I18N_EXPIRATION_DAYS || '30'),\n storagePrefix\n },\n messageRoot: process.env.NEXT_PUBLIC_I18N_MESSAGE_ROOT || 'messages',\n },\n\n // Style configuration\n style: {\n icon: {\n uniformColor: process.env.NEXT_PUBLIC_STYLE_ICON_COLOR || \"text-purple-500\"\n },\n openMdxSEOSiteMap: process.env.NEXT_PUBLIC_STYLE_OPEN_MDX_SEO_SITE_MAP === 'true',\n showBanner: process.env.NEXT_PUBLIC_STYLE_SHOW_BANNER === 'true',\n clerkAuthInModal: process.env.NEXT_PUBLIC_STYLE_CLERK_AUTH_IN_MODAL === 'true',\n clerkPageBanner: process.env.NEXT_PUBLIC_STYLE_CLERK_PAGE_BANNER === 'true',\n watermark: {\n enabled: process.env.NEXT_PUBLIC_STYLE_WATERMARK_ENABLED === 'true',\n text: process.env.NEXT_PUBLIC_STYLE_WATERMARK_TEXT || \"巽川·怀因\"\n },\n cdnBaseUrl: process.env.NEXT_PUBLIC_STYLE_CDN_BASE_URL || \"https://r2.d8ger.com\",\n cdnProxyUrl: process.env.NEXT_PUBLIC_STYLE_CDN_PROXY_URL || \"https://r2-explorer-template.zcy777et.workers.dev/proxy\",\n placeHolder: {\n image: process.env.NEXT_PUBLIC_STYLE_PLACEHOLDER_IMAGE || \"/default.webp\"\n }\n },\n\n // Clerk configuration\n clerk: {\n signInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL || \"/sign-in\",\n fallbackSignInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_FALLBACK_REDIRECT_URL || \"/\",\n signUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_URL || \"/sign-up\", \n fallbackSignUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_FALLBACK_REDIRECT_URL || \"/\",\n waitlistUrl: process.env.NEXT_PUBLIC_CLERK_WAITLIST_URL || \"/waitlist\",\n debug: process.env.CLERK_DEBUG === 'true',\n },\n\n // MDX source file directory configuration\n mdxSourceDir: {\n docs: process.env.NEXT_PUBLIC_MDX_DOCS_DIR || \"src/mdx/docs\",\n blog: process.env.NEXT_PUBLIC_MDX_BLOG_DIR || \"src/mdx/blog\", \n legal: process.env.NEXT_PUBLIC_MDX_LEGAL_DIR || \"src/mdx/legal\"\n },\n };\n\n // Convenient constants - avoid deep nested access\n const shortcuts = {\n iconColor: config.style.icon.uniformColor,\n watermark: config.style.watermark,\n showBanner: config.style.showBanner,\n clerkPageBanner: config.style.clerkPageBanner,\n clerkAuthInModal: config.style.clerkAuthInModal,\n placeHolderImage: config.style.placeHolder.image,\n clerk: config.clerk,\n };\n\n return {\n ...config,\n shortcuts\n };\n}\n\n// Create internationalization helper functions\nexport function createI18nHelpers(i18nConfig: ReturnType<typeof createCommonAppConfig>['i18n']) {\n function isSupportedLocale(locale: string): locale is typeof i18nConfig.locales[number] {\n return (i18nConfig.locales as readonly string[]).includes(locale);\n }\n\n function getValidLocale(locale: string): typeof i18nConfig.locales[number] {\n return isSupportedLocale(locale) ? locale : i18nConfig.defaultLocale;\n }\n\n const generatedLocales = i18nConfig.locales.map((loc) => ({\n name: i18nConfig.localeLabels[loc as keyof typeof i18nConfig.localeLabels] || loc,\n locale: loc,\n }));\n\n return {\n isSupportedLocale,\n getValidLocale,\n generatedLocales\n };\n}\n\n// Convenient configuration presets\nexport const LOCALE_PRESETS = {\n // Only support English\n EN_ONLY: { locales: ['en'] as string[], defaultLocale: 'en' as string },\n \n // English and Chinese\n EN_ZH: { locales: ['en', 'zh'] as string[], defaultLocale: 'en' as string },\n \n // Main Asian languages\n ASIA: { locales: ['en', 'zh', 'ja', 'ko'] as string[], defaultLocale: 'en' as string },\n \n // Main European languages\n EUROPE: { locales: ['en', 'fr', 'de', 'es', 'it'] as string[], defaultLocale: 'en' as string },\n \n // Globalization\n GLOBAL: { locales: ['en', 'zh', 'ja', 'ko', 'fr', 'de', 'es', 'it', 'pt', 'ru'] as string[], defaultLocale: 'en' as string },\n \n // No internationalization (only default language)\n NONE: { locales: [] as string[], defaultLocale: 'en' as string }\n}; "]}
1
+ {"version":3,"sources":["../src/common-app-config.ts"],"names":[],"mappings":"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","file":"common-app-config.mjs","sourcesContent":["// Supported languages and their labels\nconst ALL_LOCALE_LABELS = {\n en: \"English\",\n zh: \"简体中文\",\n ja: \"日本語\", \n ko: \"한국어\",\n fr: \"Français\",\n de: \"Deutsch\",\n es: \"Español\",\n it: \"Italiano\",\n pt: \"Português\",\n tr: \"Türkçe\",\n pl: \"Polski\",\n ru: \"Русский\",\n ar: \"العربية\",\n hi: \"हिन्दी\",\n th: \"ไทย\",\n vi: \"Tiếng Việt\",\n} as const;\n\nexport type SupportedLocale = keyof typeof ALL_LOCALE_LABELS;\n\n// Helper function to get language configuration from environment variables\nfunction getLocaleLabels(locales: string[]) {\n return Object.fromEntries(\n locales.map(locale => [\n locale, \n ALL_LOCALE_LABELS[locale as SupportedLocale] || locale\n ])\n );\n}\n\n// Common application configuration creation function\nexport function createCommonAppConfig(options?: {\n // Optional: manually specify supported languages, otherwise read from environment variables\n locales?: string[];\n defaultLocale?: string;\n}) {\n // Priority: manual configuration > environment variables > default values\n const locales = options?.locales ?? \n process.env.NEXT_PUBLIC_I18N_LOCALES?.split(',').map(s => s.trim()) ?? \n ['en', 'zh'];\n \n const defaultLocale = options?.defaultLocale ?? \n process.env.NEXT_PUBLIC_I18N_DEFAULT_LOCALE ?? \n 'en';\n \n const storagePrefix = process.env.NEXT_PUBLIC_I18N_STORAGE_PREFIX || 'WINDRUN-HUAIIN';\n\n const config = {\n // Basic configuration\n baseUrl: process.env.NEXT_PUBLIC_BASE_URL || '',\n githubBaseUrl: process.env.NEXT_PUBLIC_GITHUB_BASE_URL || '',\n github: process.env.NEXT_PUBLIC_GITHUB || '',\n githubInfoToken: process.env.NEXT_PUBLIC_FUMA_GITHUB_TOKEN || '',\n\n // Internationalization configuration\n i18n: {\n locales: locales as readonly string[],\n defaultLocale,\n localeLabels: getLocaleLabels(locales),\n detector: {\n storageKey: process.env.NEXT_PUBLIC_I18N_STORAGE_KEY || 'language-preference-status',\n autoCloseTimeout: parseInt(process.env.NEXT_PUBLIC_I18N_AUTO_CLOSE_TIMEOUT || '10000'),\n expirationDays: parseInt(process.env.NEXT_PUBLIC_I18N_EXPIRATION_DAYS || '30'),\n storagePrefix\n },\n messageRoot: process.env.NEXT_PUBLIC_I18N_MESSAGE_ROOT || 'messages',\n },\n\n // Style configuration\n style: {\n icon: {\n uniformColor: process.env.NEXT_PUBLIC_STYLE_ICON_COLOR || \"text-purple-500\"\n },\n showBanner: process.env.NEXT_PUBLIC_STYLE_SHOW_BANNER === 'true',\n clerkAuthInModal: process.env.NEXT_PUBLIC_STYLE_CLERK_AUTH_IN_MODAL === 'true',\n clerkPageBanner: process.env.NEXT_PUBLIC_STYLE_CLERK_PAGE_BANNER === 'true',\n watermark: {\n enabled: process.env.NEXT_PUBLIC_STYLE_WATERMARK_ENABLED === 'true',\n text: process.env.NEXT_PUBLIC_STYLE_WATERMARK_TEXT || \"巽川·怀因\"\n },\n cdnBaseUrl: process.env.NEXT_PUBLIC_STYLE_CDN_BASE_URL || \"https://r2.d8ger.com\",\n cdnProxyUrl: process.env.NEXT_PUBLIC_STYLE_CDN_PROXY_URL || \"https://r2-explorer-template.zcy777et.workers.dev/proxy\",\n placeHolder: {\n image: process.env.NEXT_PUBLIC_STYLE_PLACEHOLDER_IMAGE || \"/default.webp\"\n }\n },\n\n // Clerk configuration\n clerk: {\n signInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL || \"/sign-in\",\n fallbackSignInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_FALLBACK_REDIRECT_URL || \"/\",\n signUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_URL || \"/sign-up\", \n fallbackSignUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_FALLBACK_REDIRECT_URL || \"/\",\n waitlistUrl: process.env.NEXT_PUBLIC_CLERK_WAITLIST_URL || \"/waitlist\",\n debug: process.env.CLERK_DEBUG === 'true',\n },\n\n // MDX source file directory configuration\n mdxSourceDir: {\n docs: process.env.NEXT_PUBLIC_MDX_DOCS_DIR || \"src/mdx/docs\",\n blog: process.env.NEXT_PUBLIC_MDX_BLOG_DIR || \"src/mdx/blog\", \n legal: process.env.NEXT_PUBLIC_MDX_LEGAL_DIR || \"src/mdx/legal\"\n },\n };\n\n // Convenient constants - avoid deep nested access\n const shortcuts = {\n iconColor: config.style.icon.uniformColor,\n watermark: config.style.watermark,\n showBanner: config.style.showBanner,\n clerkPageBanner: config.style.clerkPageBanner,\n clerkAuthInModal: config.style.clerkAuthInModal,\n placeHolderImage: config.style.placeHolder.image,\n clerk: config.clerk,\n };\n\n return {\n ...config,\n shortcuts\n };\n}\n\n// Create internationalization helper functions\nexport function createI18nHelpers(i18nConfig: ReturnType<typeof createCommonAppConfig>['i18n']) {\n function isSupportedLocale(locale: string): locale is typeof i18nConfig.locales[number] {\n return (i18nConfig.locales as readonly string[]).includes(locale);\n }\n\n function getValidLocale(locale: string): typeof i18nConfig.locales[number] {\n return isSupportedLocale(locale) ? locale : i18nConfig.defaultLocale;\n }\n\n const generatedLocales = i18nConfig.locales.map((loc) => ({\n name: i18nConfig.localeLabels[loc as keyof typeof i18nConfig.localeLabels] || loc,\n locale: loc,\n }));\n\n return {\n isSupportedLocale,\n getValidLocale,\n generatedLocales\n };\n}\n\n// Convenient configuration presets\nexport const LOCALE_PRESETS = {\n // Only support English\n EN_ONLY: { locales: ['en'] as string[], defaultLocale: 'en' as string },\n \n // English and Chinese\n EN_ZH: { locales: ['en', 'zh'] as string[], defaultLocale: 'en' as string },\n \n // Main Asian languages\n ASIA: { locales: ['en', 'zh', 'ja', 'ko'] as string[], defaultLocale: 'en' as string },\n \n // Main European languages\n EUROPE: { locales: ['en', 'fr', 'de', 'es', 'it'] as string[], defaultLocale: 'en' as string },\n \n // Globalization\n GLOBAL: { locales: ['en', 'zh', 'ja', 'ko', 'fr', 'de', 'es', 'it', 'pt', 'ru'] as string[], defaultLocale: 'en' as string },\n \n // No internationalization (only default language)\n NONE: { locales: [] as string[], defaultLocale: 'en' as string }\n}; "]}
package/dist/index.js CHANGED
@@ -183,7 +183,6 @@ function createCommonAppConfig(options) {
183
183
  icon: {
184
184
  uniformColor: process.env.NEXT_PUBLIC_STYLE_ICON_COLOR || "text-purple-500"
185
185
  },
186
- openMdxSEOSiteMap: process.env.NEXT_PUBLIC_STYLE_OPEN_MDX_SEO_SITE_MAP === "true",
187
186
  showBanner: process.env.NEXT_PUBLIC_STYLE_SHOW_BANNER === "true",
188
187
  clerkAuthInModal: process.env.NEXT_PUBLIC_STYLE_CLERK_AUTH_IN_MODAL === "true",
189
188
  clerkPageBanner: process.env.NEXT_PUBLIC_STYLE_CLERK_PAGE_BANNER === "true",
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/llm-utils.ts","../src/common-app-config.ts"],"names":["twMerge","clsx","isValid","format","visit","remark","remarkFrontmatter","remarkMdx","remarkGfm"],"mappings":"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","file":"index.js","sourcesContent":["import type * as React from \"react\";\nimport { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\nimport { format, isValid } from 'date-fns';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function formatTimestamp(timestamp: string, formatter: string) {\n const fail = \"\";\n if (!timestamp) {\n return fail;\n }\n\n // Assume gitTimestamp is a millisecond timestamp string\n const timestampMs = parseInt(timestamp, 10);\n if (isNaN(timestampMs)) {\n return fail;\n }\n\n const date = new Date(timestampMs); // or if it is determined to be seconds, use fromUnixTime(timestampSeconds)\n\n // Check if the date is valid\n if (!isValid(date)) {\n return fail;\n }\n\n // Format the date\n try {\n // 'yyyy-MM-dd HH:mm:ss' is the date-fns formatting pattern\n return format(date, formatter);\n } catch (error) {\n // format may also throw an error due to an invalid date (although isValid should have already caught it)\n console.error(\"Error formatting date:\", error);\n return fail;\n }\n} \n\n// Only allow pasting plain text, prohibit style content\nexport function handlePastePlainText(e: React.ClipboardEvent<HTMLElement>) {\n e.preventDefault();\n const text = e.clipboardData.getData('text/plain');\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount) return;\n // Delete the current selected content\n selection.deleteFromDocument();\n // Insert plain text\n const textNode = document.createTextNode(text);\n const range = selection.getRangeAt(0);\n range.insertNode(textNode);\n // Move the cursor to the inserted text\n range.setStartAfter(textNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n}","import { remark } from 'remark';\nimport remarkGfm from 'remark-gfm';\nimport remarkMdx from 'remark-mdx';\nimport remarkFrontmatter from 'remark-frontmatter';\nimport { visit } from 'unist-util-visit';\n\nfunction remarkRemoveFrontmatter() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (tree: any) => {\n visit(tree, 'yaml', (_node, index, parent) => {\n if (parent && typeof index === 'number') {\n parent.children.splice(index, 1);\n }\n });\n };\n}\n\n// remark(), parse the MDX file into MDAST\n// remarkPlugins(), parse the MDAST into HAST\n// rehypePlugins(), render the HAST into React components, i.e. HTML code\nconst processor = remark()\n // parse the md file header\n .use(remarkFrontmatter, ['yaml'])\n // remove the md file header\n .use(remarkRemoveFrontmatter)\n .use(remarkMdx)\n .use(remarkGfm);\n\nexport async function getLLMText(mdxContent: string, title?: string, description?: string) {\n if (typeof mdxContent !== 'string') {\n console.error('getLLMText: mdxContent received was not a string. Type:', typeof mdxContent);\n return `# Error\\n\\nInvalid content received by text processor.`;\n }\n\n try {\n const processed = await processor.process(mdxContent);\n const contentWithoutFrontmatter = processed.value as string;\n\n const markdownParts = [\n title ? `# ${title}` : null,\n description,\n contentWithoutFrontmatter.trim()\n ];\n\n return markdownParts.filter(part => part != null).join('\\n\\n');\n } catch (processingError) {\n console.error('Error during remark processing in getLLMText:', processingError);\n return `# Error\\n\\nError processing MDX content.`;\n }\n} ","// Supported languages and their labels\nconst ALL_LOCALE_LABELS = {\n en: \"English\",\n zh: \"简体中文\",\n ja: \"日本語\", \n ko: \"한국어\",\n fr: \"Français\",\n de: \"Deutsch\",\n es: \"Español\",\n it: \"Italiano\",\n pt: \"Português\",\n tr: \"Türkçe\",\n pl: \"Polski\",\n ru: \"Русский\",\n ar: \"العربية\",\n hi: \"हिन्दी\",\n th: \"ไทย\",\n vi: \"Tiếng Việt\",\n} as const;\n\nexport type SupportedLocale = keyof typeof ALL_LOCALE_LABELS;\n\n// Helper function to get language configuration from environment variables\nfunction getLocaleLabels(locales: string[]) {\n return Object.fromEntries(\n locales.map(locale => [\n locale, \n ALL_LOCALE_LABELS[locale as SupportedLocale] || locale\n ])\n );\n}\n\n// Common application configuration creation function\nexport function createCommonAppConfig(options?: {\n // Optional: manually specify supported languages, otherwise read from environment variables\n locales?: string[];\n defaultLocale?: string;\n}) {\n // Priority: manual configuration > environment variables > default values\n const locales = options?.locales ?? \n process.env.NEXT_PUBLIC_I18N_LOCALES?.split(',').map(s => s.trim()) ?? \n ['en', 'zh'];\n \n const defaultLocale = options?.defaultLocale ?? \n process.env.NEXT_PUBLIC_I18N_DEFAULT_LOCALE ?? \n 'en';\n \n const storagePrefix = process.env.NEXT_PUBLIC_I18N_STORAGE_PREFIX || 'WINDRUN-HUAIIN';\n\n const config = {\n // Basic configuration\n baseUrl: process.env.NEXT_PUBLIC_BASE_URL || '',\n githubBaseUrl: process.env.NEXT_PUBLIC_GITHUB_BASE_URL || '',\n github: process.env.NEXT_PUBLIC_GITHUB || '',\n githubInfoToken: process.env.NEXT_PUBLIC_FUMA_GITHUB_TOKEN || '',\n\n // Internationalization configuration\n i18n: {\n locales: locales as readonly string[],\n defaultLocale,\n localeLabels: getLocaleLabels(locales),\n detector: {\n storageKey: process.env.NEXT_PUBLIC_I18N_STORAGE_KEY || 'language-preference-status',\n autoCloseTimeout: parseInt(process.env.NEXT_PUBLIC_I18N_AUTO_CLOSE_TIMEOUT || '10000'),\n expirationDays: parseInt(process.env.NEXT_PUBLIC_I18N_EXPIRATION_DAYS || '30'),\n storagePrefix\n },\n messageRoot: process.env.NEXT_PUBLIC_I18N_MESSAGE_ROOT || 'messages',\n },\n\n // Style configuration\n style: {\n icon: {\n uniformColor: process.env.NEXT_PUBLIC_STYLE_ICON_COLOR || \"text-purple-500\"\n },\n openMdxSEOSiteMap: process.env.NEXT_PUBLIC_STYLE_OPEN_MDX_SEO_SITE_MAP === 'true',\n showBanner: process.env.NEXT_PUBLIC_STYLE_SHOW_BANNER === 'true',\n clerkAuthInModal: process.env.NEXT_PUBLIC_STYLE_CLERK_AUTH_IN_MODAL === 'true',\n clerkPageBanner: process.env.NEXT_PUBLIC_STYLE_CLERK_PAGE_BANNER === 'true',\n watermark: {\n enabled: process.env.NEXT_PUBLIC_STYLE_WATERMARK_ENABLED === 'true',\n text: process.env.NEXT_PUBLIC_STYLE_WATERMARK_TEXT || \"巽川·怀因\"\n },\n cdnBaseUrl: process.env.NEXT_PUBLIC_STYLE_CDN_BASE_URL || \"https://r2.d8ger.com\",\n cdnProxyUrl: process.env.NEXT_PUBLIC_STYLE_CDN_PROXY_URL || \"https://r2-explorer-template.zcy777et.workers.dev/proxy\",\n placeHolder: {\n image: process.env.NEXT_PUBLIC_STYLE_PLACEHOLDER_IMAGE || \"/default.webp\"\n }\n },\n\n // Clerk configuration\n clerk: {\n signInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL || \"/sign-in\",\n fallbackSignInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_FALLBACK_REDIRECT_URL || \"/\",\n signUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_URL || \"/sign-up\", \n fallbackSignUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_FALLBACK_REDIRECT_URL || \"/\",\n waitlistUrl: process.env.NEXT_PUBLIC_CLERK_WAITLIST_URL || \"/waitlist\",\n debug: process.env.CLERK_DEBUG === 'true',\n },\n\n // MDX source file directory configuration\n mdxSourceDir: {\n docs: process.env.NEXT_PUBLIC_MDX_DOCS_DIR || \"src/mdx/docs\",\n blog: process.env.NEXT_PUBLIC_MDX_BLOG_DIR || \"src/mdx/blog\", \n legal: process.env.NEXT_PUBLIC_MDX_LEGAL_DIR || \"src/mdx/legal\"\n },\n };\n\n // Convenient constants - avoid deep nested access\n const shortcuts = {\n iconColor: config.style.icon.uniformColor,\n watermark: config.style.watermark,\n showBanner: config.style.showBanner,\n clerkPageBanner: config.style.clerkPageBanner,\n clerkAuthInModal: config.style.clerkAuthInModal,\n placeHolderImage: config.style.placeHolder.image,\n clerk: config.clerk,\n };\n\n return {\n ...config,\n shortcuts\n };\n}\n\n// Create internationalization helper functions\nexport function createI18nHelpers(i18nConfig: ReturnType<typeof createCommonAppConfig>['i18n']) {\n function isSupportedLocale(locale: string): locale is typeof i18nConfig.locales[number] {\n return (i18nConfig.locales as readonly string[]).includes(locale);\n }\n\n function getValidLocale(locale: string): typeof i18nConfig.locales[number] {\n return isSupportedLocale(locale) ? locale : i18nConfig.defaultLocale;\n }\n\n const generatedLocales = i18nConfig.locales.map((loc) => ({\n name: i18nConfig.localeLabels[loc as keyof typeof i18nConfig.localeLabels] || loc,\n locale: loc,\n }));\n\n return {\n isSupportedLocale,\n getValidLocale,\n generatedLocales\n };\n}\n\n// Convenient configuration presets\nexport const LOCALE_PRESETS = {\n // Only support English\n EN_ONLY: { locales: ['en'] as string[], defaultLocale: 'en' as string },\n \n // English and Chinese\n EN_ZH: { locales: ['en', 'zh'] as string[], defaultLocale: 'en' as string },\n \n // Main Asian languages\n ASIA: { locales: ['en', 'zh', 'ja', 'ko'] as string[], defaultLocale: 'en' as string },\n \n // Main European languages\n EUROPE: { locales: ['en', 'fr', 'de', 'es', 'it'] as string[], defaultLocale: 'en' as string },\n \n // Globalization\n GLOBAL: { locales: ['en', 'zh', 'ja', 'ko', 'fr', 'de', 'es', 'it', 'pt', 'ru'] as string[], defaultLocale: 'en' as string },\n \n // No internationalization (only default language)\n NONE: { locales: [] as string[], defaultLocale: 'en' as string }\n}; "]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/llm-utils.ts","../src/common-app-config.ts"],"names":["twMerge","clsx","isValid","format","visit","remark","remarkFrontmatter","remarkMdx","remarkGfm"],"mappings":"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","file":"index.js","sourcesContent":["import type * as React from \"react\";\nimport { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\nimport { format, isValid } from 'date-fns';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function formatTimestamp(timestamp: string, formatter: string) {\n const fail = \"\";\n if (!timestamp) {\n return fail;\n }\n\n // Assume gitTimestamp is a millisecond timestamp string\n const timestampMs = parseInt(timestamp, 10);\n if (isNaN(timestampMs)) {\n return fail;\n }\n\n const date = new Date(timestampMs); // or if it is determined to be seconds, use fromUnixTime(timestampSeconds)\n\n // Check if the date is valid\n if (!isValid(date)) {\n return fail;\n }\n\n // Format the date\n try {\n // 'yyyy-MM-dd HH:mm:ss' is the date-fns formatting pattern\n return format(date, formatter);\n } catch (error) {\n // format may also throw an error due to an invalid date (although isValid should have already caught it)\n console.error(\"Error formatting date:\", error);\n return fail;\n }\n} \n\n// Only allow pasting plain text, prohibit style content\nexport function handlePastePlainText(e: React.ClipboardEvent<HTMLElement>) {\n e.preventDefault();\n const text = e.clipboardData.getData('text/plain');\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount) return;\n // Delete the current selected content\n selection.deleteFromDocument();\n // Insert plain text\n const textNode = document.createTextNode(text);\n const range = selection.getRangeAt(0);\n range.insertNode(textNode);\n // Move the cursor to the inserted text\n range.setStartAfter(textNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n}","import { remark } from 'remark';\nimport remarkGfm from 'remark-gfm';\nimport remarkMdx from 'remark-mdx';\nimport remarkFrontmatter from 'remark-frontmatter';\nimport { visit } from 'unist-util-visit';\n\nfunction remarkRemoveFrontmatter() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (tree: any) => {\n visit(tree, 'yaml', (_node, index, parent) => {\n if (parent && typeof index === 'number') {\n parent.children.splice(index, 1);\n }\n });\n };\n}\n\n// remark(), parse the MDX file into MDAST\n// remarkPlugins(), parse the MDAST into HAST\n// rehypePlugins(), render the HAST into React components, i.e. HTML code\nconst processor = remark()\n // parse the md file header\n .use(remarkFrontmatter, ['yaml'])\n // remove the md file header\n .use(remarkRemoveFrontmatter)\n .use(remarkMdx)\n .use(remarkGfm);\n\nexport async function getLLMText(mdxContent: string, title?: string, description?: string) {\n if (typeof mdxContent !== 'string') {\n console.error('getLLMText: mdxContent received was not a string. Type:', typeof mdxContent);\n return `# Error\\n\\nInvalid content received by text processor.`;\n }\n\n try {\n const processed = await processor.process(mdxContent);\n const contentWithoutFrontmatter = processed.value as string;\n\n const markdownParts = [\n title ? `# ${title}` : null,\n description,\n contentWithoutFrontmatter.trim()\n ];\n\n return markdownParts.filter(part => part != null).join('\\n\\n');\n } catch (processingError) {\n console.error('Error during remark processing in getLLMText:', processingError);\n return `# Error\\n\\nError processing MDX content.`;\n }\n} ","// Supported languages and their labels\nconst ALL_LOCALE_LABELS = {\n en: \"English\",\n zh: \"简体中文\",\n ja: \"日本語\", \n ko: \"한국어\",\n fr: \"Français\",\n de: \"Deutsch\",\n es: \"Español\",\n it: \"Italiano\",\n pt: \"Português\",\n tr: \"Türkçe\",\n pl: \"Polski\",\n ru: \"Русский\",\n ar: \"العربية\",\n hi: \"हिन्दी\",\n th: \"ไทย\",\n vi: \"Tiếng Việt\",\n} as const;\n\nexport type SupportedLocale = keyof typeof ALL_LOCALE_LABELS;\n\n// Helper function to get language configuration from environment variables\nfunction getLocaleLabels(locales: string[]) {\n return Object.fromEntries(\n locales.map(locale => [\n locale, \n ALL_LOCALE_LABELS[locale as SupportedLocale] || locale\n ])\n );\n}\n\n// Common application configuration creation function\nexport function createCommonAppConfig(options?: {\n // Optional: manually specify supported languages, otherwise read from environment variables\n locales?: string[];\n defaultLocale?: string;\n}) {\n // Priority: manual configuration > environment variables > default values\n const locales = options?.locales ?? \n process.env.NEXT_PUBLIC_I18N_LOCALES?.split(',').map(s => s.trim()) ?? \n ['en', 'zh'];\n \n const defaultLocale = options?.defaultLocale ?? \n process.env.NEXT_PUBLIC_I18N_DEFAULT_LOCALE ?? \n 'en';\n \n const storagePrefix = process.env.NEXT_PUBLIC_I18N_STORAGE_PREFIX || 'WINDRUN-HUAIIN';\n\n const config = {\n // Basic configuration\n baseUrl: process.env.NEXT_PUBLIC_BASE_URL || '',\n githubBaseUrl: process.env.NEXT_PUBLIC_GITHUB_BASE_URL || '',\n github: process.env.NEXT_PUBLIC_GITHUB || '',\n githubInfoToken: process.env.NEXT_PUBLIC_FUMA_GITHUB_TOKEN || '',\n\n // Internationalization configuration\n i18n: {\n locales: locales as readonly string[],\n defaultLocale,\n localeLabels: getLocaleLabels(locales),\n detector: {\n storageKey: process.env.NEXT_PUBLIC_I18N_STORAGE_KEY || 'language-preference-status',\n autoCloseTimeout: parseInt(process.env.NEXT_PUBLIC_I18N_AUTO_CLOSE_TIMEOUT || '10000'),\n expirationDays: parseInt(process.env.NEXT_PUBLIC_I18N_EXPIRATION_DAYS || '30'),\n storagePrefix\n },\n messageRoot: process.env.NEXT_PUBLIC_I18N_MESSAGE_ROOT || 'messages',\n },\n\n // Style configuration\n style: {\n icon: {\n uniformColor: process.env.NEXT_PUBLIC_STYLE_ICON_COLOR || \"text-purple-500\"\n },\n showBanner: process.env.NEXT_PUBLIC_STYLE_SHOW_BANNER === 'true',\n clerkAuthInModal: process.env.NEXT_PUBLIC_STYLE_CLERK_AUTH_IN_MODAL === 'true',\n clerkPageBanner: process.env.NEXT_PUBLIC_STYLE_CLERK_PAGE_BANNER === 'true',\n watermark: {\n enabled: process.env.NEXT_PUBLIC_STYLE_WATERMARK_ENABLED === 'true',\n text: process.env.NEXT_PUBLIC_STYLE_WATERMARK_TEXT || \"巽川·怀因\"\n },\n cdnBaseUrl: process.env.NEXT_PUBLIC_STYLE_CDN_BASE_URL || \"https://r2.d8ger.com\",\n cdnProxyUrl: process.env.NEXT_PUBLIC_STYLE_CDN_PROXY_URL || \"https://r2-explorer-template.zcy777et.workers.dev/proxy\",\n placeHolder: {\n image: process.env.NEXT_PUBLIC_STYLE_PLACEHOLDER_IMAGE || \"/default.webp\"\n }\n },\n\n // Clerk configuration\n clerk: {\n signInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL || \"/sign-in\",\n fallbackSignInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_FALLBACK_REDIRECT_URL || \"/\",\n signUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_URL || \"/sign-up\", \n fallbackSignUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_FALLBACK_REDIRECT_URL || \"/\",\n waitlistUrl: process.env.NEXT_PUBLIC_CLERK_WAITLIST_URL || \"/waitlist\",\n debug: process.env.CLERK_DEBUG === 'true',\n },\n\n // MDX source file directory configuration\n mdxSourceDir: {\n docs: process.env.NEXT_PUBLIC_MDX_DOCS_DIR || \"src/mdx/docs\",\n blog: process.env.NEXT_PUBLIC_MDX_BLOG_DIR || \"src/mdx/blog\", \n legal: process.env.NEXT_PUBLIC_MDX_LEGAL_DIR || \"src/mdx/legal\"\n },\n };\n\n // Convenient constants - avoid deep nested access\n const shortcuts = {\n iconColor: config.style.icon.uniformColor,\n watermark: config.style.watermark,\n showBanner: config.style.showBanner,\n clerkPageBanner: config.style.clerkPageBanner,\n clerkAuthInModal: config.style.clerkAuthInModal,\n placeHolderImage: config.style.placeHolder.image,\n clerk: config.clerk,\n };\n\n return {\n ...config,\n shortcuts\n };\n}\n\n// Create internationalization helper functions\nexport function createI18nHelpers(i18nConfig: ReturnType<typeof createCommonAppConfig>['i18n']) {\n function isSupportedLocale(locale: string): locale is typeof i18nConfig.locales[number] {\n return (i18nConfig.locales as readonly string[]).includes(locale);\n }\n\n function getValidLocale(locale: string): typeof i18nConfig.locales[number] {\n return isSupportedLocale(locale) ? locale : i18nConfig.defaultLocale;\n }\n\n const generatedLocales = i18nConfig.locales.map((loc) => ({\n name: i18nConfig.localeLabels[loc as keyof typeof i18nConfig.localeLabels] || loc,\n locale: loc,\n }));\n\n return {\n isSupportedLocale,\n getValidLocale,\n generatedLocales\n };\n}\n\n// Convenient configuration presets\nexport const LOCALE_PRESETS = {\n // Only support English\n EN_ONLY: { locales: ['en'] as string[], defaultLocale: 'en' as string },\n \n // English and Chinese\n EN_ZH: { locales: ['en', 'zh'] as string[], defaultLocale: 'en' as string },\n \n // Main Asian languages\n ASIA: { locales: ['en', 'zh', 'ja', 'ko'] as string[], defaultLocale: 'en' as string },\n \n // Main European languages\n EUROPE: { locales: ['en', 'fr', 'de', 'es', 'it'] as string[], defaultLocale: 'en' as string },\n \n // Globalization\n GLOBAL: { locales: ['en', 'zh', 'ja', 'ko', 'fr', 'de', 'es', 'it', 'pt', 'ru'] as string[], defaultLocale: 'en' as string },\n \n // No internationalization (only default language)\n NONE: { locales: [] as string[], defaultLocale: 'en' as string }\n}; "]}
package/dist/index.mjs CHANGED
@@ -175,7 +175,6 @@ function createCommonAppConfig(options) {
175
175
  icon: {
176
176
  uniformColor: process.env.NEXT_PUBLIC_STYLE_ICON_COLOR || "text-purple-500"
177
177
  },
178
- openMdxSEOSiteMap: process.env.NEXT_PUBLIC_STYLE_OPEN_MDX_SEO_SITE_MAP === "true",
179
178
  showBanner: process.env.NEXT_PUBLIC_STYLE_SHOW_BANNER === "true",
180
179
  clerkAuthInModal: process.env.NEXT_PUBLIC_STYLE_CLERK_AUTH_IN_MODAL === "true",
181
180
  clerkPageBanner: process.env.NEXT_PUBLIC_STYLE_CLERK_PAGE_BANNER === "true",
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/llm-utils.ts","../src/common-app-config.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type * as React from \"react\";\nimport { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\nimport { format, isValid } from 'date-fns';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function formatTimestamp(timestamp: string, formatter: string) {\n const fail = \"\";\n if (!timestamp) {\n return fail;\n }\n\n // Assume gitTimestamp is a millisecond timestamp string\n const timestampMs = parseInt(timestamp, 10);\n if (isNaN(timestampMs)) {\n return fail;\n }\n\n const date = new Date(timestampMs); // or if it is determined to be seconds, use fromUnixTime(timestampSeconds)\n\n // Check if the date is valid\n if (!isValid(date)) {\n return fail;\n }\n\n // Format the date\n try {\n // 'yyyy-MM-dd HH:mm:ss' is the date-fns formatting pattern\n return format(date, formatter);\n } catch (error) {\n // format may also throw an error due to an invalid date (although isValid should have already caught it)\n console.error(\"Error formatting date:\", error);\n return fail;\n }\n} \n\n// Only allow pasting plain text, prohibit style content\nexport function handlePastePlainText(e: React.ClipboardEvent<HTMLElement>) {\n e.preventDefault();\n const text = e.clipboardData.getData('text/plain');\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount) return;\n // Delete the current selected content\n selection.deleteFromDocument();\n // Insert plain text\n const textNode = document.createTextNode(text);\n const range = selection.getRangeAt(0);\n range.insertNode(textNode);\n // Move the cursor to the inserted text\n range.setStartAfter(textNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n}","import { remark } from 'remark';\nimport remarkGfm from 'remark-gfm';\nimport remarkMdx from 'remark-mdx';\nimport remarkFrontmatter from 'remark-frontmatter';\nimport { visit } from 'unist-util-visit';\n\nfunction remarkRemoveFrontmatter() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (tree: any) => {\n visit(tree, 'yaml', (_node, index, parent) => {\n if (parent && typeof index === 'number') {\n parent.children.splice(index, 1);\n }\n });\n };\n}\n\n// remark(), parse the MDX file into MDAST\n// remarkPlugins(), parse the MDAST into HAST\n// rehypePlugins(), render the HAST into React components, i.e. HTML code\nconst processor = remark()\n // parse the md file header\n .use(remarkFrontmatter, ['yaml'])\n // remove the md file header\n .use(remarkRemoveFrontmatter)\n .use(remarkMdx)\n .use(remarkGfm);\n\nexport async function getLLMText(mdxContent: string, title?: string, description?: string) {\n if (typeof mdxContent !== 'string') {\n console.error('getLLMText: mdxContent received was not a string. Type:', typeof mdxContent);\n return `# Error\\n\\nInvalid content received by text processor.`;\n }\n\n try {\n const processed = await processor.process(mdxContent);\n const contentWithoutFrontmatter = processed.value as string;\n\n const markdownParts = [\n title ? `# ${title}` : null,\n description,\n contentWithoutFrontmatter.trim()\n ];\n\n return markdownParts.filter(part => part != null).join('\\n\\n');\n } catch (processingError) {\n console.error('Error during remark processing in getLLMText:', processingError);\n return `# Error\\n\\nError processing MDX content.`;\n }\n} ","// Supported languages and their labels\nconst ALL_LOCALE_LABELS = {\n en: \"English\",\n zh: \"简体中文\",\n ja: \"日本語\", \n ko: \"한국어\",\n fr: \"Français\",\n de: \"Deutsch\",\n es: \"Español\",\n it: \"Italiano\",\n pt: \"Português\",\n tr: \"Türkçe\",\n pl: \"Polski\",\n ru: \"Русский\",\n ar: \"العربية\",\n hi: \"हिन्दी\",\n th: \"ไทย\",\n vi: \"Tiếng Việt\",\n} as const;\n\nexport type SupportedLocale = keyof typeof ALL_LOCALE_LABELS;\n\n// Helper function to get language configuration from environment variables\nfunction getLocaleLabels(locales: string[]) {\n return Object.fromEntries(\n locales.map(locale => [\n locale, \n ALL_LOCALE_LABELS[locale as SupportedLocale] || locale\n ])\n );\n}\n\n// Common application configuration creation function\nexport function createCommonAppConfig(options?: {\n // Optional: manually specify supported languages, otherwise read from environment variables\n locales?: string[];\n defaultLocale?: string;\n}) {\n // Priority: manual configuration > environment variables > default values\n const locales = options?.locales ?? \n process.env.NEXT_PUBLIC_I18N_LOCALES?.split(',').map(s => s.trim()) ?? \n ['en', 'zh'];\n \n const defaultLocale = options?.defaultLocale ?? \n process.env.NEXT_PUBLIC_I18N_DEFAULT_LOCALE ?? \n 'en';\n \n const storagePrefix = process.env.NEXT_PUBLIC_I18N_STORAGE_PREFIX || 'WINDRUN-HUAIIN';\n\n const config = {\n // Basic configuration\n baseUrl: process.env.NEXT_PUBLIC_BASE_URL || '',\n githubBaseUrl: process.env.NEXT_PUBLIC_GITHUB_BASE_URL || '',\n github: process.env.NEXT_PUBLIC_GITHUB || '',\n githubInfoToken: process.env.NEXT_PUBLIC_FUMA_GITHUB_TOKEN || '',\n\n // Internationalization configuration\n i18n: {\n locales: locales as readonly string[],\n defaultLocale,\n localeLabels: getLocaleLabels(locales),\n detector: {\n storageKey: process.env.NEXT_PUBLIC_I18N_STORAGE_KEY || 'language-preference-status',\n autoCloseTimeout: parseInt(process.env.NEXT_PUBLIC_I18N_AUTO_CLOSE_TIMEOUT || '10000'),\n expirationDays: parseInt(process.env.NEXT_PUBLIC_I18N_EXPIRATION_DAYS || '30'),\n storagePrefix\n },\n messageRoot: process.env.NEXT_PUBLIC_I18N_MESSAGE_ROOT || 'messages',\n },\n\n // Style configuration\n style: {\n icon: {\n uniformColor: process.env.NEXT_PUBLIC_STYLE_ICON_COLOR || \"text-purple-500\"\n },\n openMdxSEOSiteMap: process.env.NEXT_PUBLIC_STYLE_OPEN_MDX_SEO_SITE_MAP === 'true',\n showBanner: process.env.NEXT_PUBLIC_STYLE_SHOW_BANNER === 'true',\n clerkAuthInModal: process.env.NEXT_PUBLIC_STYLE_CLERK_AUTH_IN_MODAL === 'true',\n clerkPageBanner: process.env.NEXT_PUBLIC_STYLE_CLERK_PAGE_BANNER === 'true',\n watermark: {\n enabled: process.env.NEXT_PUBLIC_STYLE_WATERMARK_ENABLED === 'true',\n text: process.env.NEXT_PUBLIC_STYLE_WATERMARK_TEXT || \"巽川·怀因\"\n },\n cdnBaseUrl: process.env.NEXT_PUBLIC_STYLE_CDN_BASE_URL || \"https://r2.d8ger.com\",\n cdnProxyUrl: process.env.NEXT_PUBLIC_STYLE_CDN_PROXY_URL || \"https://r2-explorer-template.zcy777et.workers.dev/proxy\",\n placeHolder: {\n image: process.env.NEXT_PUBLIC_STYLE_PLACEHOLDER_IMAGE || \"/default.webp\"\n }\n },\n\n // Clerk configuration\n clerk: {\n signInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL || \"/sign-in\",\n fallbackSignInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_FALLBACK_REDIRECT_URL || \"/\",\n signUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_URL || \"/sign-up\", \n fallbackSignUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_FALLBACK_REDIRECT_URL || \"/\",\n waitlistUrl: process.env.NEXT_PUBLIC_CLERK_WAITLIST_URL || \"/waitlist\",\n debug: process.env.CLERK_DEBUG === 'true',\n },\n\n // MDX source file directory configuration\n mdxSourceDir: {\n docs: process.env.NEXT_PUBLIC_MDX_DOCS_DIR || \"src/mdx/docs\",\n blog: process.env.NEXT_PUBLIC_MDX_BLOG_DIR || \"src/mdx/blog\", \n legal: process.env.NEXT_PUBLIC_MDX_LEGAL_DIR || \"src/mdx/legal\"\n },\n };\n\n // Convenient constants - avoid deep nested access\n const shortcuts = {\n iconColor: config.style.icon.uniformColor,\n watermark: config.style.watermark,\n showBanner: config.style.showBanner,\n clerkPageBanner: config.style.clerkPageBanner,\n clerkAuthInModal: config.style.clerkAuthInModal,\n placeHolderImage: config.style.placeHolder.image,\n clerk: config.clerk,\n };\n\n return {\n ...config,\n shortcuts\n };\n}\n\n// Create internationalization helper functions\nexport function createI18nHelpers(i18nConfig: ReturnType<typeof createCommonAppConfig>['i18n']) {\n function isSupportedLocale(locale: string): locale is typeof i18nConfig.locales[number] {\n return (i18nConfig.locales as readonly string[]).includes(locale);\n }\n\n function getValidLocale(locale: string): typeof i18nConfig.locales[number] {\n return isSupportedLocale(locale) ? locale : i18nConfig.defaultLocale;\n }\n\n const generatedLocales = i18nConfig.locales.map((loc) => ({\n name: i18nConfig.localeLabels[loc as keyof typeof i18nConfig.localeLabels] || loc,\n locale: loc,\n }));\n\n return {\n isSupportedLocale,\n getValidLocale,\n generatedLocales\n };\n}\n\n// Convenient configuration presets\nexport const LOCALE_PRESETS = {\n // Only support English\n EN_ONLY: { locales: ['en'] as string[], defaultLocale: 'en' as string },\n \n // English and Chinese\n EN_ZH: { locales: ['en', 'zh'] as string[], defaultLocale: 'en' as string },\n \n // Main Asian languages\n ASIA: { locales: ['en', 'zh', 'ja', 'ko'] as string[], defaultLocale: 'en' as string },\n \n // Main European languages\n EUROPE: { locales: ['en', 'fr', 'de', 'es', 'it'] as string[], defaultLocale: 'en' as string },\n \n // Globalization\n GLOBAL: { locales: ['en', 'zh', 'ja', 'ko', 'fr', 'de', 'es', 'it', 'pt', 'ru'] as string[], defaultLocale: 'en' as string },\n \n // No internationalization (only default language)\n NONE: { locales: [] as string[], defaultLocale: 'en' as string }\n}; "]}
1
+ {"version":3,"sources":["../src/utils.ts","../src/llm-utils.ts","../src/common-app-config.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type * as React from \"react\";\nimport { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\nimport { format, isValid } from 'date-fns';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function formatTimestamp(timestamp: string, formatter: string) {\n const fail = \"\";\n if (!timestamp) {\n return fail;\n }\n\n // Assume gitTimestamp is a millisecond timestamp string\n const timestampMs = parseInt(timestamp, 10);\n if (isNaN(timestampMs)) {\n return fail;\n }\n\n const date = new Date(timestampMs); // or if it is determined to be seconds, use fromUnixTime(timestampSeconds)\n\n // Check if the date is valid\n if (!isValid(date)) {\n return fail;\n }\n\n // Format the date\n try {\n // 'yyyy-MM-dd HH:mm:ss' is the date-fns formatting pattern\n return format(date, formatter);\n } catch (error) {\n // format may also throw an error due to an invalid date (although isValid should have already caught it)\n console.error(\"Error formatting date:\", error);\n return fail;\n }\n} \n\n// Only allow pasting plain text, prohibit style content\nexport function handlePastePlainText(e: React.ClipboardEvent<HTMLElement>) {\n e.preventDefault();\n const text = e.clipboardData.getData('text/plain');\n const selection = window.getSelection();\n if (!selection || !selection.rangeCount) return;\n // Delete the current selected content\n selection.deleteFromDocument();\n // Insert plain text\n const textNode = document.createTextNode(text);\n const range = selection.getRangeAt(0);\n range.insertNode(textNode);\n // Move the cursor to the inserted text\n range.setStartAfter(textNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n}","import { remark } from 'remark';\nimport remarkGfm from 'remark-gfm';\nimport remarkMdx from 'remark-mdx';\nimport remarkFrontmatter from 'remark-frontmatter';\nimport { visit } from 'unist-util-visit';\n\nfunction remarkRemoveFrontmatter() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (tree: any) => {\n visit(tree, 'yaml', (_node, index, parent) => {\n if (parent && typeof index === 'number') {\n parent.children.splice(index, 1);\n }\n });\n };\n}\n\n// remark(), parse the MDX file into MDAST\n// remarkPlugins(), parse the MDAST into HAST\n// rehypePlugins(), render the HAST into React components, i.e. HTML code\nconst processor = remark()\n // parse the md file header\n .use(remarkFrontmatter, ['yaml'])\n // remove the md file header\n .use(remarkRemoveFrontmatter)\n .use(remarkMdx)\n .use(remarkGfm);\n\nexport async function getLLMText(mdxContent: string, title?: string, description?: string) {\n if (typeof mdxContent !== 'string') {\n console.error('getLLMText: mdxContent received was not a string. Type:', typeof mdxContent);\n return `# Error\\n\\nInvalid content received by text processor.`;\n }\n\n try {\n const processed = await processor.process(mdxContent);\n const contentWithoutFrontmatter = processed.value as string;\n\n const markdownParts = [\n title ? `# ${title}` : null,\n description,\n contentWithoutFrontmatter.trim()\n ];\n\n return markdownParts.filter(part => part != null).join('\\n\\n');\n } catch (processingError) {\n console.error('Error during remark processing in getLLMText:', processingError);\n return `# Error\\n\\nError processing MDX content.`;\n }\n} ","// Supported languages and their labels\nconst ALL_LOCALE_LABELS = {\n en: \"English\",\n zh: \"简体中文\",\n ja: \"日本語\", \n ko: \"한국어\",\n fr: \"Français\",\n de: \"Deutsch\",\n es: \"Español\",\n it: \"Italiano\",\n pt: \"Português\",\n tr: \"Türkçe\",\n pl: \"Polski\",\n ru: \"Русский\",\n ar: \"العربية\",\n hi: \"हिन्दी\",\n th: \"ไทย\",\n vi: \"Tiếng Việt\",\n} as const;\n\nexport type SupportedLocale = keyof typeof ALL_LOCALE_LABELS;\n\n// Helper function to get language configuration from environment variables\nfunction getLocaleLabels(locales: string[]) {\n return Object.fromEntries(\n locales.map(locale => [\n locale, \n ALL_LOCALE_LABELS[locale as SupportedLocale] || locale\n ])\n );\n}\n\n// Common application configuration creation function\nexport function createCommonAppConfig(options?: {\n // Optional: manually specify supported languages, otherwise read from environment variables\n locales?: string[];\n defaultLocale?: string;\n}) {\n // Priority: manual configuration > environment variables > default values\n const locales = options?.locales ?? \n process.env.NEXT_PUBLIC_I18N_LOCALES?.split(',').map(s => s.trim()) ?? \n ['en', 'zh'];\n \n const defaultLocale = options?.defaultLocale ?? \n process.env.NEXT_PUBLIC_I18N_DEFAULT_LOCALE ?? \n 'en';\n \n const storagePrefix = process.env.NEXT_PUBLIC_I18N_STORAGE_PREFIX || 'WINDRUN-HUAIIN';\n\n const config = {\n // Basic configuration\n baseUrl: process.env.NEXT_PUBLIC_BASE_URL || '',\n githubBaseUrl: process.env.NEXT_PUBLIC_GITHUB_BASE_URL || '',\n github: process.env.NEXT_PUBLIC_GITHUB || '',\n githubInfoToken: process.env.NEXT_PUBLIC_FUMA_GITHUB_TOKEN || '',\n\n // Internationalization configuration\n i18n: {\n locales: locales as readonly string[],\n defaultLocale,\n localeLabels: getLocaleLabels(locales),\n detector: {\n storageKey: process.env.NEXT_PUBLIC_I18N_STORAGE_KEY || 'language-preference-status',\n autoCloseTimeout: parseInt(process.env.NEXT_PUBLIC_I18N_AUTO_CLOSE_TIMEOUT || '10000'),\n expirationDays: parseInt(process.env.NEXT_PUBLIC_I18N_EXPIRATION_DAYS || '30'),\n storagePrefix\n },\n messageRoot: process.env.NEXT_PUBLIC_I18N_MESSAGE_ROOT || 'messages',\n },\n\n // Style configuration\n style: {\n icon: {\n uniformColor: process.env.NEXT_PUBLIC_STYLE_ICON_COLOR || \"text-purple-500\"\n },\n showBanner: process.env.NEXT_PUBLIC_STYLE_SHOW_BANNER === 'true',\n clerkAuthInModal: process.env.NEXT_PUBLIC_STYLE_CLERK_AUTH_IN_MODAL === 'true',\n clerkPageBanner: process.env.NEXT_PUBLIC_STYLE_CLERK_PAGE_BANNER === 'true',\n watermark: {\n enabled: process.env.NEXT_PUBLIC_STYLE_WATERMARK_ENABLED === 'true',\n text: process.env.NEXT_PUBLIC_STYLE_WATERMARK_TEXT || \"巽川·怀因\"\n },\n cdnBaseUrl: process.env.NEXT_PUBLIC_STYLE_CDN_BASE_URL || \"https://r2.d8ger.com\",\n cdnProxyUrl: process.env.NEXT_PUBLIC_STYLE_CDN_PROXY_URL || \"https://r2-explorer-template.zcy777et.workers.dev/proxy\",\n placeHolder: {\n image: process.env.NEXT_PUBLIC_STYLE_PLACEHOLDER_IMAGE || \"/default.webp\"\n }\n },\n\n // Clerk configuration\n clerk: {\n signInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_URL || \"/sign-in\",\n fallbackSignInUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_IN_FALLBACK_REDIRECT_URL || \"/\",\n signUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_URL || \"/sign-up\", \n fallbackSignUpUrl: process.env.NEXT_PUBLIC_CLERK_SIGN_UP_FALLBACK_REDIRECT_URL || \"/\",\n waitlistUrl: process.env.NEXT_PUBLIC_CLERK_WAITLIST_URL || \"/waitlist\",\n debug: process.env.CLERK_DEBUG === 'true',\n },\n\n // MDX source file directory configuration\n mdxSourceDir: {\n docs: process.env.NEXT_PUBLIC_MDX_DOCS_DIR || \"src/mdx/docs\",\n blog: process.env.NEXT_PUBLIC_MDX_BLOG_DIR || \"src/mdx/blog\", \n legal: process.env.NEXT_PUBLIC_MDX_LEGAL_DIR || \"src/mdx/legal\"\n },\n };\n\n // Convenient constants - avoid deep nested access\n const shortcuts = {\n iconColor: config.style.icon.uniformColor,\n watermark: config.style.watermark,\n showBanner: config.style.showBanner,\n clerkPageBanner: config.style.clerkPageBanner,\n clerkAuthInModal: config.style.clerkAuthInModal,\n placeHolderImage: config.style.placeHolder.image,\n clerk: config.clerk,\n };\n\n return {\n ...config,\n shortcuts\n };\n}\n\n// Create internationalization helper functions\nexport function createI18nHelpers(i18nConfig: ReturnType<typeof createCommonAppConfig>['i18n']) {\n function isSupportedLocale(locale: string): locale is typeof i18nConfig.locales[number] {\n return (i18nConfig.locales as readonly string[]).includes(locale);\n }\n\n function getValidLocale(locale: string): typeof i18nConfig.locales[number] {\n return isSupportedLocale(locale) ? locale : i18nConfig.defaultLocale;\n }\n\n const generatedLocales = i18nConfig.locales.map((loc) => ({\n name: i18nConfig.localeLabels[loc as keyof typeof i18nConfig.localeLabels] || loc,\n locale: loc,\n }));\n\n return {\n isSupportedLocale,\n getValidLocale,\n generatedLocales\n };\n}\n\n// Convenient configuration presets\nexport const LOCALE_PRESETS = {\n // Only support English\n EN_ONLY: { locales: ['en'] as string[], defaultLocale: 'en' as string },\n \n // English and Chinese\n EN_ZH: { locales: ['en', 'zh'] as string[], defaultLocale: 'en' as string },\n \n // Main Asian languages\n ASIA: { locales: ['en', 'zh', 'ja', 'ko'] as string[], defaultLocale: 'en' as string },\n \n // Main European languages\n EUROPE: { locales: ['en', 'fr', 'de', 'es', 'it'] as string[], defaultLocale: 'en' as string },\n \n // Globalization\n GLOBAL: { locales: ['en', 'zh', 'ja', 'ko', 'fr', 'de', 'es', 'it', 'pt', 'ru'] as string[], defaultLocale: 'en' as string },\n \n // No internationalization (only default language)\n NONE: { locales: [] as string[], defaultLocale: 'en' as string }\n}; "]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@windrun-huaiin/lib",
3
- "version": "6.1.2",
3
+ "version": "6.2.1",
4
4
  "description": "Common utilities and configuration",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -73,7 +73,6 @@ export function createCommonAppConfig(options?: {
73
73
  icon: {
74
74
  uniformColor: process.env.NEXT_PUBLIC_STYLE_ICON_COLOR || "text-purple-500"
75
75
  },
76
- openMdxSEOSiteMap: process.env.NEXT_PUBLIC_STYLE_OPEN_MDX_SEO_SITE_MAP === 'true',
77
76
  showBanner: process.env.NEXT_PUBLIC_STYLE_SHOW_BANNER === 'true',
78
77
  clerkAuthInModal: process.env.NEXT_PUBLIC_STYLE_CLERK_AUTH_IN_MODAL === 'true',
79
78
  clerkPageBanner: process.env.NEXT_PUBLIC_STYLE_CLERK_PAGE_BANNER === 'true',