From de90684f40c6af37461fe8719afc5919a8e9bd3d Mon Sep 17 00:00:00 2001 From: wxzhang Date: Tue, 10 Jan 2023 14:39:48 +0800 Subject: [PATCH] add typescript supports --- packages/apps/app/package.json | 2 +- packages/apps/app/tsconfig.json | 4 +- packages/cli/compile.command.js | 27 ++-- packages/cli/index.js | 4 +- packages/cli/templates/entry.js | 18 +-- packages/cli/templates/entry.ts | 9 +- packages/runtime/index.d.ts | 256 ++++++++++++++++-------------- packages/runtime/index.js | 38 ++--- packages/runtime/package.json | 4 +- packages/runtime/rollup.config.js | 40 ++--- packages/runtime/scope.js | 6 +- packages/utils/index.js | 4 +- 12 files changed, 204 insertions(+), 208 deletions(-) diff --git a/packages/apps/app/package.json b/packages/apps/app/package.json index 20f7c0f..e0a7e5e 100644 --- a/packages/apps/app/package.json +++ b/packages/apps/app/package.json @@ -1,6 +1,6 @@ { "dependencies": { "@voerkai18n/cli": "workspace:^1.0.6", - "@voerkai18n/runtime": "^1.0.0" + "@voerkai18n/runtime": "workspace:^1.0.0" } } diff --git a/packages/apps/app/tsconfig.json b/packages/apps/app/tsconfig.json index dda5cde..a0b25e2 100644 --- a/packages/apps/app/tsconfig.json +++ b/packages/apps/app/tsconfig.json @@ -12,7 +12,7 @@ //"suppressImplicitAnyIndexErrors":true, /* Language and Environment */ "target": "ES2015", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - "lib": ["ES2015"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + //"lib": ["ES2015"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ @@ -100,7 +100,7 @@ // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - + "allowJs": true, /* Completeness */ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ "skipLibCheck": true /* Skip type checking all .d.ts files. */ diff --git a/packages/cli/compile.command.js b/packages/cli/compile.command.js index 354fc74..361da11 100644 --- a/packages/cli/compile.command.js +++ b/packages/cli/compile.command.js @@ -66,7 +66,7 @@ function generateFormatterFile(langName,{isTypeScript,formattersFolder,templateC module.exports =async function compile(langFolder,opts={}){ const options = normalizeCompileOptions(opts); - let { moduleType,inlineRuntime,isTypeScript } = options; + let { moduleType,isTypeScript } = options; // 如果自动则会从当前项目读取,如果没有指定则会是esm if(moduleType==="auto"){ moduleType = findModuleType(langFolder) @@ -139,26 +139,17 @@ module.exports =async function compile(langFolder,opts={}){ } logger.log(t(" - idMap文件: {}"),path.basename(idMapFile)) // 嵌入运行时源码 - if(inlineRuntime && !isTypeScript ){ - const runtimeSourceFolder = path.join(require.resolve("@voerkai18n/runtime"),"../..") - fs.copyFileSync( - path.join(runtimeSourceFolder,"dist",`runtime.${moduleType === 'esm' ? 'mjs' : 'cjs'}`), - path.join(langFolder,"runtime.js") - ) - logger.log(t(" - 运行时: {}"),"runtime.js") - }else{//如果不嵌入则需要安装运行时依赖 - if(!isInstallDependent("@voerkai18n/runtime")){ - installVoerkai18nRuntime(langFolder) - logger.log(t(" - 安装运行时: {}"),"@voerkai18n/runtime") - }else{ - updateVoerkai18nRuntime(langFolder) - logger.log(t(" - 更新运行时:{}"),"@voerkai18n/runtime") - } - } + + if(!isInstallDependent("@voerkai18n/runtime")){ + installVoerkai18nRuntime(langFolder) + logger.log(t(" - 安装运行时: {}"),"@voerkai18n/runtime") + }else{ + updateVoerkai18nRuntime(langFolder) + logger.log(t(" - 更新运行时:{}"),"@voerkai18n/runtime") + } const templateContext = { scopeId:projectPackageJson.name, - inlineRuntime, languages, defaultLanguage, activeLanguage, diff --git a/packages/cli/index.js b/packages/cli/index.js index cf427bc..a95bd21 100644 --- a/packages/cli/index.js +++ b/packages/cli/index.js @@ -91,7 +91,7 @@ program .command('compile') .description(t('编译指定项目的语言包')) .option('-D, --debug', t('输出调试信息')) - .option('--no-inline-runtime', t('不嵌入运行时源码')) + .option('-t, --typescript') .option('-m, --moduleType [types]', t('输出模块类型,取值auto,esm,cjs'), 'esm') .argument('[location]', t('工程项目所在目录'),"./") .hook("preAction",async function(location){ @@ -100,7 +100,7 @@ program }) .action(async (location,options) => { location = getProjectSourceFolder(location) - options.isTypeScript = isTypeScriptProject() + options.isTypeScript = options.typescript==undefined ? isTypeScriptProject() : options.typescript const langFolder = path.join(location,"languages") if(!fs.existsSync(langFolder)){ logger.error(t("语言包文件夹<{}>不存在",langFolder)) diff --git a/packages/cli/templates/entry.js b/packages/cli/templates/entry.js index 8f1cefb..ae4feea 100644 --- a/packages/cli/templates/entry.js +++ b/packages/cli/templates/entry.js @@ -1,25 +1,17 @@ {{if moduleType === "esm"}} import messageIds from "./idMap.js" // 语言ID映射文件 -{{if inlineRuntime }}import runtime from "./runtime.js" // 运行时 -const { translate,i18nScope } = runtime -import defaultFormatters from "./formatters/{{defaultLanguage}}.js" // 默认语言格式化器 -{{if defaultLanguage === activeLanguage}}const activeFormatters = defaultFormatters{{else}}import activeFormatters from "./formatters/{{activeLanguage}}.js"{{/if}} // 激活语言格式化器 -{{else}}import { translate,i18nScope } from "@voerkai18n/runtime" +import { translate,VoerkaI18nScope } from "@voerkai18n/runtime" {{if defaultLanguage === activeLanguage}}const activeFormatters = defaultFormatters{{else}}import activeFormatters from "@voerkai18n/runtime/formatters/{{activeLanguage}}.js"{{/if}} -{{/if}} import defaultMessages from "./{{defaultLanguage}}.js" {{if defaultLanguage === activeLanguage}}const activeMessages = defaultMessages{{else}}import activeMessages from "./{{activeLanguage}}.js"{{/if}} {{else}} const messageIds = require("./idMap") -{{if inlineRuntime }}const { translate,i18nScope } = require("./runtime.js") -const defaultFormatters = require("./formatters/{{defaultLanguage}}.js") -{{if defaultLanguage === activeLanguage}}const activeFormatters = defaultFormatters{{else}}const activeFormatters = require("./formatters/{{activeLanguage}}.js"){{/if}} -{{else}}const { translate,i18nScope } = require("@voerkai18n/runtime") +const { translate,i18nScope } = require("@voerkai18n/runtime") const defaultFormatters = require("@voerkai18n/runtime/formatters/{{defaultLanguage}}.js") {{if defaultLanguage === activeLanguage}}const activeFormatters = defaultFormatters{{else}}const activeFormatters = require("@voerkai18n/runtime/formatters/{{activeLanguage}}.js"){{/if}} -{{/if}} const defaultMessages = require("./{{defaultLanguage}}.js") // 默认语言包 -{{if defaultLanguage === activeLanguage}}const activeMessages = defaultMessages{{else}}const activeMessages = require("./{{activeLanguage}}.js"){{/if}} {{/if}} +{{if defaultLanguage === activeLanguage}}const activeMessages = defaultMessages{{else}}const activeMessages = require("./{{activeLanguage}}.js"){{/if}} +{{/if}} // 语言配置文件 const scopeSettings = {{@ settings}} @@ -34,7 +26,7 @@ const loaders = { {{each languages}}{{if $value.name !== defaultLanguage}} } // 语言作用域 -const scope = new i18nScope({ +const scope = new VoerkaI18nScope({ ...scopeSettings, // languages,defaultLanguage,activeLanguage,namespaces,formatters id : "{{scopeId}}", // 当前作用域的id,自动取当前工程的package.json的name debug : false, // 是否在控制台输出高度信息 diff --git a/packages/cli/templates/entry.ts b/packages/cli/templates/entry.ts index b5e8240..287512e 100644 --- a/packages/cli/templates/entry.ts +++ b/packages/cli/templates/entry.ts @@ -1,12 +1,7 @@ import messageIds from "./idMap" // 语言ID映射文件 -{{if inlineRuntime && !isTypeScript }}import runtime from "./runtime" // 运行时 -const { translate,i18nScope } = runtime -import defaultFormatters from "./formatters/{{defaultLanguage}}" // 默认语言格式化器 -{{if defaultLanguage === activeLanguage}}const activeFormatters = defaultFormatters{{else}}import activeFormatters from "./formatters/{{activeLanguage}}"{{/if}} // 激活语言格式化器 -{{else}}import { translate,i18nScope } from "@voerkai18n/runtime" +import { translate,VoerkaI18nScope } from "@voerkai18n/runtime" import defaultFormatters from "./formatters/{{defaultLanguage}}" // 默认语言格式化器 {{if defaultLanguage === activeLanguage}}const activeFormatters = defaultFormatters{{else}}import activeFormatters from "@voerkai18n/runtime/formatters/{{activeLanguage}}"{{/if}} -{{/if}} import defaultMessages from "./{{defaultLanguage}}" {{if defaultLanguage === activeLanguage}}const activeMessages = defaultMessages{{else}}import activeMessages from "./{{activeLanguage}}"{{/if}} @@ -23,7 +18,7 @@ const loaders = { {{each languages}}{{if $value.name !== defaultLanguage}} } // 语言作用域 -const scope = new i18nScope({ +const scope = new VoerkaI18nScope({ ...scopeSettings, // languages,defaultLanguage,activeLanguage,namespaces,formatters id : "{{scopeId}}", // 当前作用域的id,自动取当前工程的package.json的name debug : false, // 是否在控制台输出高度信息 diff --git a/packages/runtime/index.d.ts b/packages/runtime/index.d.ts index c5fdb7a..b21b1b9 100644 --- a/packages/runtime/index.d.ts +++ b/packages/runtime/index.d.ts @@ -1,130 +1,156 @@ +declare global { + export type VoerkaI18nILanguageMessages = Record + export interface VoerkaI18nLanguagePack { + [key: string]: VoerkaI18nILanguageMessages + } + export interface VoerkaI18nManagerSettings { + debug?: boolean + defaultLanguage: string + activeLanguage: string + formatters: VoerkI18nFormatters + languages: VoerkaI18nLanguage[] + } + export class VoerkaI18nManager { + constructor(settings: VoerkaI18nManagerSettings) + get settings(): Required // 配置参数 + get scopes(): VoerkaI18nScope[] // 注册的报有i18nScope实例q + get activeLanguage(): string // 当前激活语言名称 + get defaultLanguage(): string // 默认语言名称 + get languages(): VoerkaI18nSupportedLanguages // 支持的语言列表 + get formatters(): VoerkI18nFormatters // 内置格式化器{*:{$config,$types,...},zh:{$config,$types,...},en:{$config,$types,...}} + get defaultMessageLoader(): VoerkI18nLoader // 默认语言包加载器 + // 通过默认加载器加载文件 + loadMessagesFromDefaultLoader(newLanguage: string, scope: VoerkaI18nScope): Promise + change(language: string): Promise + register(scope: VoerkaI18nScope): Promise + registerFormatter(name: string, formatter: VoerkI18nFormatter, options?: { language: string | string[] }): void + registerDefaultLoader(fn: VoerkI18nLoader): void + refresh(): Promise + } -export type VoerkaLanguageMessages = Record -export interface VoerkaLanguagePack { - [key: string]: VoerkaLanguageMessages -} -export interface VoerkaI18nManagerSettings { - debug?:boolean - defaultLanguage: string - activeLanguage : string - formatters : VoerkI18nFormatters - languages :VoerkaI18nLanguage[] + export type Voerkai18nIdMap = Record + + export interface VoerkaI18nLanguage { + name: string + title?: string + default?: boolean + fallback?: string + } + + export interface VoerkaI18nSupportedLanguages { + [key: string]: VoerkaI18nLanguage + } + + export type VoerkI18nFormatter = (value: string, ...args: any[]) => string + export type VoerkI18nFormatterConfigs = Record + + export type VoerkI18nFormatters = Record + $config?: Record + } & { + [key: string]: VoerkI18nFormatter + }) | (() => Promise)> + + export type VoerkI18nLoader = () => Awaited> + export interface VoerkI18nLoaders { + [key: string]: VoerkI18nLoader + } + + export interface VoerkaVoerkaI18nScopeOptions { + id?: string + debug?: boolean + languages: VoerkaI18nLanguage[] + defaultLanguage: string // 默认语言名称 + activeLanguage: string // 当前语言名称 + default: VoerkaI18nILanguageMessages // 默认语言包 + messages: VoerkaI18nILanguageMessages // 当前语言包 + idMap: Voerkai18nIdMap // 消息id映射列表 + formatters: VoerkI18nFormatters // 当前作用域的格式化函数列表{: {$types,$config,[格式化器名称]: () => {},[格式化器名称]: () => {}}} + loaders: VoerkI18nLoaders; // 异步加载语言文件的函数列表 + } + + export var VoerkaI18n: VoerkaI18nManager } -export class I18nManager{ - constructor(settings:VoerkaI18nManagerSettings) - get settings():Required // 配置参数 - get scopes():i18nScope[] // 注册的报有i18nScope实例q - get activeLanguage():string // 当前激活语言名称 - get defaultLanguage():string // 默认语言名称 - get languages():VoerkaI18nSupportedLanguages // 支持的语言列表 - get formatters():VoerkI18nFormatters // 内置格式化器{*:{$config,$types,...},zh:{$config,$types,...},en:{$config,$types,...}} - get defaultMessageLoader():VoerkI18nLoader // 默认语言包加载器 - // 通过默认加载器加载文件 - loadMessagesFromDefaultLoader(newLanguage:string,scope:i18nScope):Promise - change(language:string):Promise - register(scope:i18nScope):Promise - registerFormatter(name:string,formatter:VoerkI18nFormatter,options?:{language:string | string[]}):void - registerDefaultLoader(fn:VoerkI18nLoader):void - refresh():Promise -} +export class VoerkaI18nScope { + constructor(options: VoerkaVoerkaI18nScopeOptions, callback?: Function) + get id(): string // 作用域唯一id + get debug(): boolean // 调试开关 + get defaultLanguage(): string // 默认语言名称 + get activeLanguage(): string // 默认语言名称 + get default(): VoerkaI18nILanguageMessages // 默认语言包 + get messages(): VoerkaI18nILanguageMessages // 当前语言包 + get idMap(): Voerkai18nIdMap // 消息id映射列表 + get languages(): VoerkaI18nSupportedLanguages // 当前作用域支持的语言列表[{name,title,fallback}] + get loaders(): VoerkI18nLoaders // 异步加载语言文件的函数列表 + get global(): VoerkaI18nManager // 引用全局VoerkaI18n配置,注册后自动引用 + get formatters(): VoerkI18nFormatters // 当前作用域的所有格式化器定义 {<语言名称>: {$types,$config,[格式化器名称]: () = >{},[格式化器名称]: () => {}}} + get activeFormatters(): VoerkI18nFormatters // 当前作用域激活的格式化器定义 {$types,$config,[格式化器名称]: () = >{},[格式化器名称]: () = >{}} + get activeFormatterConfig(): VoerkI18nFormatterConfigs // 当前格式化器合并后的配置参数,参数已经合并了全局格式化器中的参数 -export type Voerkai18nIdMap = Record - -export interface VoerkaI18nLanguage{ - name:string - title?:string - default?:boolean - fallback?:string -} - -export interface VoerkaI18nSupportedLanguages { - [key :string]:VoerkaI18nLanguage -} - -export type VoerkI18nFormatter = (value:string,...args:any[]) => string -export type VoerkI18nFormatterConfigs = Record - -export type VoerkI18nFormatters = Record - $config?:Record -} & { - [key:string]:VoerkI18nFormatter -}) | (() => Awaited>)> - -export type VoerkI18nLoader = ()=>Awaited> -export interface VoerkI18nLoaders { - [key :string]:VoerkI18nLoader -} - -export interface I18nScopeOptions{ - id?:string - debug?:boolean - languages:VoerkaI18nLanguage[] - defaultLanguage:string // 默认语言名称 - activeLanguage:string // 当前语言名称 - default:VoerkaLanguageMessages // 默认语言包 - messages:VoerkaLanguageMessages // 当前语言包 - idMap:Voerkai18nIdMap // 消息id映射列表 - formatters:VoerkI18nFormatters // 当前作用域的格式化函数列表{: {$types,$config,[格式化器名称]: () => {},[格式化器名称]: () => {}}} - loaders:VoerkI18nLoaders; // 异步加载语言文件的函数列表 -} - -export class i18nScope { - constructor(options:I18nScopeOptions, callback?:Function) - get id():string // 作用域唯一id - get debug():boolean // 调试开关 - get defaultLanguage():string // 默认语言名称 - get activeLanguage():string // 默认语言名称 - get default():VoerkaLanguageMessages // 默认语言包 - get messages(): VoerkaLanguageMessages // 当前语言包 - get idMap():Voerkai18nIdMap // 消息id映射列表 - get languages():VoerkaI18nSupportedLanguages // 当前作用域支持的语言列表[{name,title,fallback}] - get loaders() :VoerkI18nLoaders // 异步加载语言文件的函数列表 - get global():I18nManager // 引用全局VoerkaI18n配置,注册后自动引用 - get formatters():VoerkI18nFormatters // 当前作用域的所有格式化器定义 {<语言名称>: {$types,$config,[格式化器名称]: () = >{},[格式化器名称]: () => {}}} - get activeFormatters():VoerkI18nFormatters // 当前作用域激活的格式化器定义 {$types,$config,[格式化器名称]: () = >{},[格式化器名称]: () = >{}} - get activeFormatterConfig():VoerkI18nFormatterConfigs // 当前格式化器合并后的配置参数,参数已经合并了全局格式化器中的参数 - - /** - * 在全局注册作用域当前作用域 - * @param {*} callback 注册成功后的回调 - */ - register(callback:Function):void - /** + /** + * 在全局注册作用域当前作用域 + * @param {*} callback 注册成功后的回调 + */ + register(callback: Function): void + /** * 注册格式化器 */ - registerFormatter(name:string, formatter:VoerkI18nFormatter, { language , global }:{language:string | string[] , global:boolean}):void + registerFormatter(name: string, formatter: VoerkI18nFormatter, { language, global }: { language: string | string[], global: boolean }): void /** * 注册多种格式化器 */ - registerFormatters(formatters:VoerkI18nFormatters,asGlobal?:boolean):void - /** - * 注册默认文本信息加载器 - */ - registerDefaultLoader(fn:Function):void - /** - * 获取指定语言信息 - * @param {*} language - * @returns - */ - getLanguage(language:string):VoerkaLanguageMessages - hasLanguage(language:string):boolean - refresh(newLanguage:string):Promise - on():void - off():void - offAll():void - change(language:string):Promise + registerFormatters(formatters: VoerkI18nFormatters, asGlobal?: boolean): void + /** + * 注册默认文本信息加载器 + */ + registerDefaultLoader(fn: Function): void + /** + * 获取指定语言信息 + * @param {*} language + * @returns + */ + getLanguage(language: string): VoerkaI18nILanguageMessages + hasLanguage(language: string): boolean + refresh(newLanguage: string): Promise + on(): void + off(): void + offAll(): void + change(language: string): Promise +} +export type VoerkI18nFormatterConfigs = Record +// 翻译函数 +export var translate: { + (message: string, ...args: (string | Function)[]): string + (message: string, vars?: Record): string +} +export interface CreateFormatterOptions { + normalize?: (value: any) => any // 对输入值进行规范化处理,如进行时间格式化时,为了提高更好的兼容性,支持数字时间戳/字符串/Date等,需要对输入值进行处理,如强制类型转换等 + params?: string[] | null // 可选的,声明参数顺序,如果是变参的,则需要传入null + configKey?: string // 声明该格式化器在$config中的路径,支持简单的使用.的路径语法 } +export type Primitive = string | number | boolean | null | undefined -export declare type translate =((message:string,...args:(string | Function)[])=>string) -| ((message:string,vars:Record)=>string) +export interface FormatterDefine { + (this: VoerkI18nFormatterConfigs, value: any, ...args: Primitive[]): string + (this: VoerkI18nFormatterConfigs, value: any, arg1: Primitive, $config: VoerkI18nFormatterConfigs): string + (this: VoerkI18nFormatterConfigs, value: any, arg1: Primitive, arg2: Primitive, $config: VoerkI18nFormatterConfigs): string + (this: VoerkI18nFormatterConfigs, value: any, arg1: Primitive, arg2: Primitive, arg3: Primitive, $config: VoerkI18nFormatterConfigs): string + configurable?: boolean +} +// 创建格式化器 +export type CreateFormatterType = (fn: Function, options: CreateFormatterOptions, defaultParams: Record) => FormatterDefine +export var createFormatter: CreateFormatterType +export var Formatter: CreateFormatterType + +export type CreateFlexFormatterType = (fn: Function, options: CreateFormatterOptions, defaultParams: Record) => FormatterDefine +export var createFlexFormatter: CreateFlexFormatterType +export var FlexFormatter: CreateFlexFormatterType +export var getDataTypeName:(value:any) => string +export var toDate: (value: any) => Date | number +export var toNumber: (value: any,defaultValue:number) => number +export var toBoolean: (value: any) => boolean -declare global { - var VoerkaI18n:I18nManager - var t:((message:string,...args:(string | Function)[])=>string) - | ((message:string,vars:Record)=>string) -} \ No newline at end of file diff --git a/packages/runtime/index.js b/packages/runtime/index.js index 48e5ffc..5b8d8f8 100644 --- a/packages/runtime/index.js +++ b/packages/runtime/index.js @@ -1,12 +1,10 @@ -const {DataTypes,getDataTypeName,isPlainObject,isFunction,isNumber,isNothing,deepMerge,deepMixin} = require("./utils") -const {getInterpolatedVars,replaceInterpolatedVars} = require("./interpolate") +const {DataTypes,getDataTypeName,isFunction,deepMerge,toBoolean} = require("./utils") const {createFormatter,Formatter,FlexFormatter,createFlexFormatter} = require("./formatter") const { toDate } = require("./datatypes/datetime") const { toNumber } = require("./datatypes/numeric") - const EventEmitter = require("./eventemitter") const inlineFormatters = require("./formatters") -const i18nScope = require("./scope") +const VoerkaI18nScope = require("./scope") const { translate } = require("./translate") // 默认语言配置 @@ -36,19 +34,19 @@ const defaultLanguageSettings = { * VoerkaI18n.off("change",(language)=>{}) * * */ - class I18nManager extends EventEmitter{ + class VoerkaI18nManager extends EventEmitter{ constructor(settings={}){ super() - if(I18nManager.instance!=null){ - return I18nManager.instance; + if(VoerkaI18nManager.instance!=null){ + return VoerkaI18nManager.instance; } - I18nManager.instance = this; + VoerkaI18nManager.instance = this; this._settings = deepMerge(defaultLanguageSettings,settings) - this._scopes=[] // 保存i18nScope实例 + this._scopes=[] // 保存VoerkaI18nScope实例 this._defaultMessageLoader = null // 默认语言包加载器 } get settings(){ return this._settings } // 配置参数 - get scopes(){ return this._scopes } // 注册的报有i18nScope实例q + get scopes(){ return this._scopes } // 注册的报有VoerkaI18nScope实例q get activeLanguage(){ return this._settings.activeLanguage} // 当前激活语言 名称 get defaultLanguage(){ return this._settings.defaultLanguage} // 默认语言名称 get languages(){ return this._settings.languages} // 支持的语言列表 @@ -100,8 +98,8 @@ const defaultLanguageSettings = { * @param {*} scope */ async register(scope){ - if(!(scope instanceof i18nScope)){ - throw new TypeError("Scope must be an instance of I18nScope") + if(!(scope instanceof VoerkaI18nScope)){ + throw new TypeError("Scope must be an instance of VoerkaI18nScope") } this._scopes.push(scope) await scope.refresh(this.activeLanguage) @@ -158,20 +156,14 @@ const defaultLanguageSettings = { } -module.exports ={ - isNumber, - isNothing, - isPlainObject, - isFunction, +module.exports ={ toDate, toNumber, - deepMerge, - deepMixin, - getInterpolatedVars, - replaceInterpolatedVars, - I18nManager, + toBoolean, + deepMerge, + VoerkaI18nManager, translate, - i18nScope, + VoerkaI18nScope, createFormatter, Formatter, createFlexFormatter, diff --git a/packages/runtime/package.json b/packages/runtime/package.json index 54d36ad..e2fde1f 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -4,12 +4,12 @@ "description": "核心运行时", "main": "./dist/index.cjs", "module": "./dist/index.esm.js", - "types":"./index.d.ts", + "typings":"./index.d.ts", "homepage": "https://gitee.com/zhangfisher/voerka-i18n", "repository": { "type": "git", "url": "git+https://gitee.com/zhangfisher/voerka-i18n.git" - }, + }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "rollup -c", diff --git a/packages/runtime/rollup.config.js b/packages/runtime/rollup.config.js index dbd9808..2894850 100644 --- a/packages/runtime/rollup.config.js +++ b/packages/runtime/rollup.config.js @@ -32,25 +32,25 @@ export default [ terser() ], external:["@babel/runtime"] - }, - { - input: './index.js', - output: [ - { - file: 'dist/runtime.cjs', - exports:"auto", - format:"cjs", - sourcemap:true - }, - { - file: 'dist/runtime.mjs', - exports:"default", - format:"esm", - sourcemap:true - } - ], - plugins:[ - commonjs() - ] } + // { + // input: './index.js', + // output: [ + // { + // file: 'dist/runtime.cjs', + // exports:"auto", + // format:"cjs", + // sourcemap:true + // }, + // { + // file: 'dist/runtime.mjs', + // exports:"default", + // format:"esm", + // sourcemap:true + // } + // ], + // plugins:[ + // commonjs() + // ] + // } ] \ No newline at end of file diff --git a/packages/runtime/scope.js b/packages/runtime/scope.js index 323f7fd..56bff9b 100644 --- a/packages/runtime/scope.js +++ b/packages/runtime/scope.js @@ -1,6 +1,6 @@ const { DataTypes,isPlainObject, isFunction, getByPath, deepMixin,deepClone } = require("./utils"); -module.exports = class i18nScope { +module.exports = class VoerkaI18nScope { constructor(options = {}, callback) { this._id = options.id || Date.now().toString() + parseInt(Math.random() * 1000); this._debug = options.debug == undefined ? process && process.env && process.env.NODE_ENV === "development" : options.debug; // 当出错时是否在控制台台输出错误信息 @@ -24,8 +24,8 @@ module.exports = class i18nScope { this._initiLanguages() // 如果不存在全局VoerkaI18n实例,说明当前Scope是唯一或第一个加载的作用域,则自动创建全局VoerkaI18n实例 if (!globalThis.VoerkaI18n) { - const { I18nManager } = require("./"); - globalThis.VoerkaI18n = new I18nManager({ + const { VoerkaI18nManager } = require("./"); + globalThis.VoerkaI18n = new VoerkaI18nManager({ debug : this._debug, defaultLanguage: this._defaultLanguage, activeLanguage : this._activeLanguage, diff --git a/packages/utils/index.js b/packages/utils/index.js index da596a6..babbeaf 100644 --- a/packages/utils/index.js +++ b/packages/utils/index.js @@ -414,9 +414,9 @@ function deepMerge(toObj,formObj,options={}){ */ function updateVoerkai18nRuntime(srcPath){ const projectFolder = getProjectRootFolder(srcPath || process.cwd()) - if(fs.existsSync("pnpm-lock.yaml")){ + if(fs.existsSync(path.join(projectFolder,"pnpm-lock.yaml"))){ shelljs.exec("pnpm upgrade --latest @voerkai18n/runtime") - }else if(fs.existsSync("yarn.lock")){ + }else if(fs.existsSync(path.join(projectFolder,"yarn.lock"))){ shelljs.exec("yarn upgrade @voerkai18n/runtime") }else{ shelljs.exec("npm update --save @voerkai18n/runtime")