diff --git a/.gitignore b/.gitignore index f2d2ac5e7c854a1d10405a69d3f8159f7d5832ef..a68487bb8ff0ec13f63c67116eea60873fbed360 100644 --- a/.gitignore +++ b/.gitignore @@ -33,7 +33,11 @@ dist-ssr /packages/mobile-command-services/package /packages/mobile-command-services/dist /packages/mobile-command-services/dist-rollup -/packages/mobile-render/publish +/packages/mobile-ui-vue/package +/packages/ba-command-services/package +/packages/ba-command-services/dist +/packages/ba-command-services/dist-rollup +/packages/ba-render/publish /packages/expression-engine/package /packages/expression-engine/dist-rollup /publish.sh diff --git a/.ls-lint.yml b/.ls-lint.yml index ac8a63998db51b447e9463922f967cf38cd8b4ec..5cd6766f6e0fa43b68ba6ba887f6fb08672e8698 100644 --- a/.ls-lint.yml +++ b/.ls-lint.yml @@ -122,6 +122,10 @@ ignore: - packages/command-services - packages/command-services/node_modules - packages/command-services/package + # ba-command-services + - packages/ba-command-services + - packages/ba-command-services/node_modules + - packages/ba-command-services/package # ui-binding - packages/ui-binding/dist - packages/ui-binding/node_modules diff --git a/eslint.config.mjs b/eslint.config.mjs index 11e490e2e96029e198b38ab49586702272fc742b..759214f5c9dabbcfa5e0840a4ac2720425ab67bd 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -30,6 +30,7 @@ export default [ "packages/mobile-ui-vue/docs/*", "packages/devkit/public/*", "packages/mobile-command-services/public/*", + "packages/ba-command-services/public/*", "packages/mobile-render/publish/*" ] }, diff --git a/lerna.json b/lerna.json index 1ba83d1ac88cd3e332b1fb685698d0f5a1e85929..8e8efb0f6850d53ad14394beccc342b96a6eb452 100644 --- a/lerna.json +++ b/lerna.json @@ -11,6 +11,8 @@ "packages/devkit", "packages/designer", "packages/code-editor", + "packages/ba-command-services", + "packages/command-services", "packages/expression-engine" ], "version": "0.0.0", diff --git a/package.json b/package.json index 33a08cafddbbda7a828d5b2d25515320256d38de..f2ac1e6dbbcc65d1eaa9ad7a6027908b2a8c9289 100644 --- a/package.json +++ b/package.json @@ -49,14 +49,14 @@ "@types/jsonp": "^0.2.3", "@types/lodash": "^4.17.20", "@types/lodash-es": "^4.17.12", - "@types/node": "^18.19.119", + "@types/node": "^18.19.121", "@types/urlencode": "^1.1.4", "@typescript-eslint/eslint-plugin": "^7.18.0", "@typescript-eslint/parser": "^7.18.0", "@vitejs/plugin-vue": "^5.2.4", "@vitejs/plugin-vue-jsx": "^4.2.0", "@vue/babel-plugin-jsx": "^1.4.0", - "@vue/compiler-sfc": "^3.5.17", + "@vue/compiler-sfc": "^3.5.18", "@vue/test-utils": "^2.4.6", "@vuedx/typecheck": "^0.7.6", "@vuedx/typescript-plugin-vue": "^0.7.6", @@ -64,11 +64,11 @@ "babel-jest": "^29.7.0", "body-parser": "^1.20.3", "body-scroll-lock": "4.0.0-beta.0", - "chalk": "^5.4.1", + "chalk": "^5.5.0", "clean-css-cli": "^5.6.3", "commander": "^12.1.0", "compressing": "^1.10.3", - "compression": "^1.8.0", + "compression": "^1.8.1", "conventional-changelog-cli": "^5.0.0", "cors": "^2.8.5", "cpy-cli": "^5.0.0", @@ -77,11 +77,11 @@ "date-fns": "^3.6.0", "del-cli": "^5.1.0", "esbuild-register": "^3.6.0", - "eslint": "^9.31.0", + "eslint": "^9.32.0", "eslint-plugin-import": "^2.32.0", "eslint-plugin-vue": "^9.33.0", "express": "^4.21.2", - "fs-extra": "^11.3.0", + "fs-extra": "^11.3.1", "happy-dom": "^14.12.3", "highlight.js": "^11.11.1", "husky": "^9.1.7", @@ -96,23 +96,23 @@ "npm-run-all": "^4.1.5", "ora": "^8.2.0", "patch-vue-directive-ssr": "^0.0.1", - "rollup": "^4.45.1", - "sass": "^1.89.2", + "rollup": "^4.46.2", + "sass": "^1.90.0", "shelljs": "^0.8.5", "shiki": "^0.11.1", - "stylelint": "^16.21.1", + "stylelint": "^16.23.0", "stylelint-config-recommended-scss": "^14.1.0", "stylelint-config-standard": "^36.0.1", "stylelint-order": "^6.0.4", "stylelint-scss": "^6.12.1", "ts-node": "~10.9.2", - "typescript": "^5.8.3", + "typescript": "^5.9.2", "urlencode": "^2.0.0", "vite": "^5.4.19", "vite-plugin-dts": "3.9.1", "vite-plugin-md": "^0.21.5", "vite-svg-loader": "^5.1.0", - "vitepress": "^1.6.3", + "vitepress": "^1.6.4", "vitepress-theme-demoblock": "1.4.2", "vitest": "^1.6.1", "vue-tsc": "^2.2.12" @@ -131,7 +131,7 @@ "jsonp": "^0.2.1", "markdown-it": "^14.1.0", "markdown-it-container": "^4.0.0", - "ts-jest": "^29.4.0", - "typescript-eslint": "^8.37.0" + "ts-jest": "^29.4.1", + "typescript-eslint": "^8.39.0" } } diff --git a/packages/ba-command-services/.gitignore b/packages/ba-command-services/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..2238e5e0c646e7df5cfca6f7422bd9b8c5254d59 --- /dev/null +++ b/packages/ba-command-services/.gitignore @@ -0,0 +1,26 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +package +dist-rollup +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/packages/ba-command-services/.vscode/extensions.json b/packages/ba-command-services/.vscode/extensions.json new file mode 100644 index 0000000000000000000000000000000000000000..a7cea0b0678120a1b590d1b6592c7318039b9179 --- /dev/null +++ b/packages/ba-command-services/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/packages/ba-command-services/README.md b/packages/ba-command-services/README.md new file mode 100644 index 0000000000000000000000000000000000000000..33895ab2002862766f2df205d5783f14cd0c1d74 --- /dev/null +++ b/packages/ba-command-services/README.md @@ -0,0 +1,5 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + diff --git a/packages/ba-command-services/lib/ba-command.service.ts b/packages/ba-command-services/lib/ba-command.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..3939e3729c52726a1b7799832274b9504fbcb794 --- /dev/null +++ b/packages/ba-command-services/lib/ba-command.service.ts @@ -0,0 +1,29 @@ +import { Injector, Module, ViewModel, ViewModelState } from '@farris/devkit-vue'; + +export class BaCommandService { + constructor(private injector: Injector, private viewModel: ViewModel) { } + public execute(commandName: string, componentId?: string) { + if (!commandName) { + return; + } + if (componentId) { + if (componentId.startsWith('#{')) { + componentId = componentId.slice(2, componentId.length - 1); + } + const module = this.injector.get(Module); + const viewModel = module.getViewModel(componentId); + // const viewModel = viewModels.find((viewModel: ViewModel)=> viewModel.componentId=== componentId); + if (!viewModel) { + console.warn(`There is no viewmodel with id ${componentId}`); + return; + } + return (viewModel as any)[commandName](); + } else { + return (this.viewModel as any)[commandName](); + }; + + } + public suspendFrameContextRowSelectedEvent() { } + + public resumeFrameContextRowSelectedEvent() { } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/ba-controller.service.ts b/packages/ba-command-services/lib/ba-controller.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..45a5c294608edef9b46d2ac3bd2e74cd893d40e1 --- /dev/null +++ b/packages/ba-command-services/lib/ba-controller.service.ts @@ -0,0 +1,55 @@ +import { Entity, Injector, ViewModel, ViewModelState } from '@farris/devkit-vue'; +import { BaProxy, BaRepository } from '@farris/bef-vue'; +import { BaRenderEngineService } from './ba-render-engine.service'; +import { BaTemplateService } from './ba-template.service'; +import { BaFormLoadingService } from './ba-form-loading.service'; +import { BaFormMessageService } from './ba-form-message.service'; +import { BaFormNotifyService } from './ba-form-notify.service'; +import { BaCommandService } from './ba-command.service'; +import { BaContextService } from './devkit-services/index'; + +export class BaControllerService { + protected injector: Injector; + protected contextService: BaContextService; + protected renderEngineService: BaRenderEngineService; + protected templateService: BaTemplateService; + protected formLoadingService: BaFormLoadingService; + protected formMessageService: BaFormMessageService; + protected formNotifyService: BaFormNotifyService; + protected commandService: BaCommandService; + protected repository: BaRepository; + protected apiProxy: BaProxy; + + constructor(protected viewModel: ViewModel) { + this.injector = this.viewModel.getInjector(); + this.contextService = this.injector.get(BaContextService); + this.renderEngineService = this.injector.get(BaRenderEngineService); + this.templateService = this.injector.get(BaTemplateService); + this.formLoadingService = this.injector.get(BaFormLoadingService); + this.formMessageService = this.injector.get(BaFormMessageService); + this.formNotifyService = this.injector.get(BaFormNotifyService); + this.commandService = this.injector.get(BaCommandService); + this.repository = this.viewModel.repository as BaRepository; + this.apiProxy = this.repository?.apiProxy; + } + + /** + * 获取服务实例 + */ + public getService(token: any, defaultValue?: any): T { + const injector = this.viewModel.getInjector(); + return injector.get(token, defaultValue); + } + + /** + * 获取事件参数 + */ + public getEventParams(): any { + const context = (this as any)['context'] as any; + if (context && context.command && context.command.eventParams) { + return context.command.eventParams + } + + return null; + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/ba-entity-change.service.ts b/packages/ba-command-services/lib/ba-entity-change.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..bd5a28340b5accf698f18aafd8d9817bcc5727fc --- /dev/null +++ b/packages/ba-command-services/lib/ba-entity-change.service.ts @@ -0,0 +1,26 @@ +import { BefRepository } from "@farris/bef-vue"; +import { ViewModel, ViewModelState } from "@farris/devkit-vue"; + +export class BaEntityChangeService { + constructor(private viewModel: ViewModel) { } + public hasChanges(): Promise { + return new Promise((resolve, reject) => { + const primaryValue = this.viewModel.entityStore?.getCurrentEntity().idValue; + if (!primaryValue) { + return resolve(false); + } + // const changes = this.viewModel.entityState?.entityChangeHistory.getMergedChanges(); + // if (changes && changes.length > 0) { + // return resolve(true); + // } + const repository = this.viewModel.repository as unknown as BefRepository; + repository.hasChanges() + .then((result) => { + resolve(result); + }) + .catch((error) => { + reject(error); + }); + }); + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/ba-form-loading.service.ts b/packages/ba-command-services/lib/ba-form-loading.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..a136add27ee3dd1eb019402def57dbf67be755eb --- /dev/null +++ b/packages/ba-command-services/lib/ba-form-loading.service.ts @@ -0,0 +1,79 @@ +import { Injector } from "@farris/devkit-vue"; +import { BA_LOADING_SERVICE_TOKEN } from "./tokens"; + +export class BaFormLoadingService { + private loadingService: any; + private loadingTimerRecord: Record = {}; + constructor(private injector: Injector) { + this.loadingService = this.injector.get(BA_LOADING_SERVICE_TOKEN); + } + /** + * 展示加载提示 + * @param configOrMessage + * @returns + */ + public show(configOrMessage?: any): number | undefined | null { + if (this.loadingService) { + const config = this.buildConfig(configOrMessage); + const loadingComponent = this.loadingService.show(config); + return loadingComponent && loadingComponent.value.getLoadingId(); + } + } + /** + * 延时展示加载提示 + * @param delayTime 延时时间,默认500毫秒 + * @param configOrMessage 消息或加载配置 + * @returns + */ + public showLoadingWithDelay(delayTime: number = 500, configOrMessage?: any): number { + const timerId = window.setTimeout(() => { + const loadingId = this.show(configOrMessage); + if (typeof loadingId === 'number') { + this.loadingTimerRecord[timerId] = loadingId; + } + }, delayTime); + this.loadingTimerRecord[timerId] = null; + return timerId; + } + public hideDelayLoading(timerId: any) { + const loadingId = this.loadingTimerRecord[timerId]; + if (typeof loadingId === 'number') { + this.hide(loadingId); + } else { + this.clearLoadingTimer(timerId); + } + } + private clearLoadingTimer(timerId: number) { + window.clearTimeout(timerId); + } + /** + * 隐藏加载 + */ + public hide(loadingId: number) { + if (this.loadingService) { + this.loadingService.close(loadingId); + } + } + public clearAll() { + if (this.loadingService) { + this.loadingService.clearAll(); + } + } + /** + * 构造loading参数 + * @param configOrMessage + * @returns + */ + private buildConfig(configOrMessage?: any) { + let config: any; + if (!configOrMessage) { + return config; + } + if (typeof configOrMessage === 'string') { + config = { message: configOrMessage }; + } else { + config = Object.assign({}, configOrMessage); + } + return config; + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/ba-form-message.service.ts b/packages/ba-command-services/lib/ba-form-message.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..8b947f6a054d9c110b610439c6109cef9e3412bc --- /dev/null +++ b/packages/ba-command-services/lib/ba-form-message.service.ts @@ -0,0 +1,71 @@ +import { InjectionToken, Injector } from "@farris/devkit-vue"; +import { BA_MESSAGE_BOX_SERVICE_TOKEN } from "./tokens"; + +export class BaFormMessageService { + private messageBoxService: any; + constructor(private injector: Injector) { + if (this.injector) { + this.messageBoxService = this.injector.get(BA_MESSAGE_BOX_SERVICE_TOKEN); + } + } + public success(content: string) { + if (this.messageBoxService) { + this.messageBoxService.success(content); + } + } + /** + * 确认弹框 + * @param content 弹出内容提示 + */ + public confirm(content: string): Promise { + return new Promise((resolve, reject) => { + if (this.messageBoxService) { + this.messageBoxService.question(content, '', () => { + resolve(true); + }, () => { + resolve(false); + }); + } else { + reject(); + } + }); + } + + /** + * 消息弹框 + */ + public info(content: string) { + if (this.messageBoxService) { + this.messageBoxService.info(content); + } + } + + /** + * 错误弹框 + */ + public error(content: string) { + if (this.messageBoxService) { + this.messageBoxService.error(content); + } + } + + /** + * 警告弹框 + */ + public warning(content: string) { + if (this.messageBoxService) { + this.messageBoxService.warning(content); + } + } + /** + * 异常 + * @param message + * @param detail + * @param date + */ + public exception(message: string, detail: string, date?: string) { + if (this.messageBoxService) { + this.messageBoxService.error(message, detail, date); + } + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/ba-form-notify.service.ts b/packages/ba-command-services/lib/ba-form-notify.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..a06e51fc7056ad39bff7dd8c48894a3a27d28818 --- /dev/null +++ b/packages/ba-command-services/lib/ba-form-notify.service.ts @@ -0,0 +1,69 @@ +import { Injector } from '@farris/devkit-vue'; +import { BA_NOTIFY_SERVICE_TOKEN } from './tokens'; + +/** + * 通知服务 + * @description + * 成功使用success,失败使用error,警告使用warning,其他场景使用info + */ +export class BaFormNotifyService { + private notifyService: any = null; + /** + * 构造函数 + */ + constructor(private injector: Injector) { + if (this.injector) { + this.notifyService = this.injector.get(BA_NOTIFY_SERVICE_TOKEN); + this.notifyService.globalConfig.position = 'top-center'; + this.notifyService.globalConfig.top = 150; + } + } + + /** + * 信息提示 + * @param content 内容 + */ + public info(content: string) { + const notifyOptions = { + message: content, + timeout: 3000 + }; + return this.notifyService.info(notifyOptions); + } + + /** + * 成功提示 + * @param content 内容 + */ + public success(content: string) { + const notifyOptions = { + message: content, + timeout: 3000 + }; + this.notifyService.success(notifyOptions); + } + + /** + * 警告提示 + * @param content 内容 + */ + public warning(content: string) { + const notifyOptions = { + message: content, + timeout: 3000 + }; + this.notifyService.warning(notifyOptions); + } + + /** + * 错误提示 + * @param content 内容 + */ + public error(content: string) { + const notifyOptions = { + message: content, + timeout: 3000 + }; + this.notifyService.error(notifyOptions); + } +} diff --git a/packages/ba-command-services/lib/ba-render-engine.service.ts b/packages/ba-command-services/lib/ba-render-engine.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..63c88583d5231e12a070bd84293676fdee880122 --- /dev/null +++ b/packages/ba-command-services/lib/ba-render-engine.service.ts @@ -0,0 +1,67 @@ +import { Injector, RENDER_ENGINE_TOKEN, RenderEngine } from '@farris/devkit-vue'; + + +export class BaRenderEngineService { + + /** + * 渲染引擎 + */ + private renderEngine: RenderEngine; + + /** + * 构造函数 + * @param injector 注入器(模块级) + */ + constructor(private injector: Injector) { + this.renderEngine = this.injector.get(RENDER_ENGINE_TOKEN); + } + /** + * 使用组件Id获取组件实例 + * @param componentId + */ + public getComponentById(componentId: string) { + return this.renderEngine.getComponentById(componentId); + } + /** + * 更新组件schema + * @param componentId 组件标识 + * @param partialSchema + */ + public setSchema(componentId: string, partialSchema: Record) { + this.renderEngine.setSchema(componentId, partialSchema); + } + /** + * 获取组件schema + * @param componentId 组件标识 + * @returns + */ + public getSchema(componentId: string) { + return this.renderEngine.getSchema(componentId); + } + /** + * 更新组件属性 + * @param componentId 组件标识 + * @param props 组件属性 + */ + public setProps(componentId: string, props: Record) { + this.renderEngine.setProps(componentId, props); + } + /** + * 获取组件属性 + * @param componentId 组件标识 + * @returns + */ + public getProps(componentId: string) { + return this.renderEngine.getProps(componentId); + } + public getControlValue(controlId: string) { + return this.renderEngine.getControlValue(controlId); + } + + /** + * 获取组件实例 + */ + public getComponentInstance(componentId: string): any { + return this.renderEngine.getComponentById(componentId); + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/ba-template.service.ts b/packages/ba-command-services/lib/ba-template.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..148d01790970182a30d29829bc935b0853bcdc74 --- /dev/null +++ b/packages/ba-command-services/lib/ba-template.service.ts @@ -0,0 +1,21 @@ +import { compile, createVNode } from 'vue'; +import { ViewModel, ViewModelState } from "@farris/devkit-vue"; + +export class BaTemplateService { + constructor(private viewModel: ViewModel) { } + + public createTemplateFactory(template: string) { + const compiledTemplate = compile(template); + const viewModel = { + stateMachine: this.viewModel.state.stateMachine, + uiState: this.viewModel.state.uiState, + bindingData: this.viewModel.state.entityState?.currentEntity, + root: this.viewModel.getRoot(), + parent: this.viewModel.getParent(), + current: this.viewModel + }; + return (cell: any, data: any) => { + return createVNode({ render: compiledTemplate, props: ['rowData', 'viewModel'] }, { viewModel, rowData: data.raw }); + }; + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/data-services/ba-base-data.service.ts b/packages/ba-command-services/lib/data-services/ba-base-data.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..6831cafc28f4bc64ea0a30f9dd7f92404b901fae --- /dev/null +++ b/packages/ba-command-services/lib/data-services/ba-base-data.service.ts @@ -0,0 +1,101 @@ +import { Module, ViewModel, Entity, EntityState, ViewModelState, EntityStore } from '@farris/devkit-vue'; +import { BaRepository } from '@farris/bef-vue'; +import { inject } from 'vue'; +import { BaFormNotifyService } from '../ba-form-notify.service'; + +/** + * 基础数据服务 + */ +class BaBaseDataService { + + /** + * 模块 + */ + protected module: Module; + /** + * 视图模型 + */ + protected viewModel: ViewModel; + + /** + * 数据仓库 + */ + protected repository: BaRepository | any; + + /** + * 实体状态 + */ + protected entityState: EntityStore> | any; + + /** + * 表单 + */ + // protected form: Form; + + /** + * 构造函数 + */ + constructor(viewModel: ViewModel) { + this.module = viewModel.getModule(); + this.viewModel = viewModel; + this.repository = viewModel.repository as unknown as BaRepository; + this.entityState = viewModel.entityStore as EntityStore>; + // this.form = viewModel.form as Form; + } + + /** + * 获取服务实例 + */ + public getService(token: any, defaultValue?: any): T { + const injector = this.viewModel.getInjector(); + return injector.get(token, defaultValue); + } + /** + * 转换成功消息 + * @param successMessage + * @returns + */ + protected parseSuccessMessage(successMessage?: string) { + if (successMessage && successMessage.trim()) { + let showMessage: boolean = true; + if (successMessage.startsWith('{') && successMessage.endsWith('}')) { + try { + const options = JSON.parse(successMessage); + if (options.showMessage === false) { + showMessage = false; + } + } catch { } + } + return { hasMessage: true, showMessage, message: successMessage }; + } + return { hasMessage: false }; + } + protected parseBoolean(value?: string | boolean, defaultValue: boolean = false): boolean { + if (typeof value === 'boolean') { + return value; + } + if (typeof value !== 'string') { + return defaultValue; + } + if (value.toLowerCase().trim() === 'true') { + return true; + } else if (value.toLowerCase().trim() === 'false') { + return false; + } else { + return defaultValue; + } + } + protected displayMessage(parsedMessage: any, defaultMessage: string) { + const { hasMessage, showMessage = true, message = null } = parsedMessage; + if (showMessage === false) { + return; + } + const formNotifyService = this.viewModel.getInjector().get(BaFormNotifyService); + if (formNotifyService) { + const text = hasMessage ? message : defaultMessage; + formNotifyService.success(text); + } + } +} + +export { BaBaseDataService }; \ No newline at end of file diff --git a/packages/ba-command-services/lib/data-services/ba-data-transformation.service.ts b/packages/ba-command-services/lib/data-services/ba-data-transformation.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..c10db4332177e2796d5a439be4a48430c6fbe3a3 --- /dev/null +++ b/packages/ba-command-services/lib/data-services/ba-data-transformation.service.ts @@ -0,0 +1,69 @@ +import { EntityChange, EntityChangeType, Entity, EntitySchema, EntityFieldSchema, AppendEntityChange, ViewModelState, ViewModel, EntityPathNode, EntityPathNodeType, ChangeValueChange, RemoveEntityChange, EntityPath, EntityStore, ExpressionResult } from '@farris/devkit-vue'; + +export class BaDataTransformationService { + constructor() { } + + public dataTransformation(viewModel: ViewModel, viewSchema: any, datas: any[]) { + const expressionResult = viewModel.getInjector().get(ExpressionResult); + // const entityStores: any = viewModel?.entityStore; + const entityStoreKey = viewSchema["dataSource"] + "-entitystore"; + const entityStore: any = viewModel.getModule().getEntityStore(entityStoreKey); + // const repositoryKey = viewSchema["dataSource"] + "-repository"; + // const isCrosstab = this.isOrNotCrosstab(viewModel, repositoryKey); + if (datas && datas.length) { + const columns = this.mergeEntitySchema(entityStore.getEntitySchema()); + if (columns && columns.length) { + const result: any = []; + for (let c = 0; c < datas.length; c++) { + const row = datas[c]; + const newRow: any = {}; + for (let i = 0; i < columns.length; i++) { + const column = columns[i]; + const key = columns[i].code; + newRow[key] = { value: null, displayValue: null }; + if (column.dataTransformation && column.dataTransformation.type === "Expression" && expressionResult[column.dataTransformation.expressionId]) { + const expressResultValue = expressionResult[column.dataTransformation.expressionId]; + const expressionRow = expressResultValue.filter((el: any) => el.id === row.id); + if (expressionRow && expressionRow.length && expressionRow[0][key]) { + newRow[key] = { + value: row[key], + displayValue: expressionRow[0][key] + } + } + } else { + newRow[key] = { + value: row[key], + displayValue: row[key] + } + } + } + result.push(newRow); + } + datas = [...result]; + } + } + return datas; + } + + private isOrNotCrosstab(viewModel: ViewModel, repositoryKey: string) { + const moduleConfig = viewModel.getModule().getConfigManager().getModuleConfig(); + const repository = moduleConfig?.repositories?.find((el: any) => el.id === repositoryKey); + if (repository && repository.sourceType === 'Crosstab') { + return true; + } else { + return false; + } + } + + private mergeEntitySchema(entitySchema: any) { + const result: any = []; + if (entitySchema && entitySchema.getFieldSchemas() && entitySchema.getFieldSchemas().length) { + const fieldSchemas = entitySchema.getFieldSchemas(); + for (let i = 0; i < fieldSchemas.length; i++) { + const fieldSchema = fieldSchemas[i]; + result.push({ code: fieldSchema.name, name: fieldSchema.name, type: fieldSchema.type }); + } + return result; + } + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/data-services/ba-linkage.service.ts b/packages/ba-command-services/lib/data-services/ba-linkage.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..18abb6629814550da50f7d3b3b57bbbeff5a05b9 --- /dev/null +++ b/packages/ba-command-services/lib/data-services/ba-linkage.service.ts @@ -0,0 +1,407 @@ +import { ExpressionResult, ViewModel, ViewModelState, ExpressionEvaluator } from "@farris/devkit-vue"; +import { BaBaseDataService } from "./ba-base-data.service"; +import { BaFormLoadingService } from "../ba-form-loading.service"; +import { BaFormMessageService } from "../ba-form-message.service"; +import { BaFormNotifyService } from "../ba-form-notify.service"; +import { BaEntityChangeService } from "../ba-entity-change.service"; +import { BaObjectOperateService } from "../utils"; + + + +export class BaLinkageService extends BaBaseDataService { + private queryConditionCache = new Map(); + private contextCache = new Map(); + private expressionResult: any; + private baObjectOperateService: BaObjectOperateService; + private expressionEvaluator: ExpressionEvaluator; + + constructor( + viewModel: ViewModel, + private formLoadingService: BaFormLoadingService, + private formMessageService: BaFormMessageService, + private formNotifyService: BaFormNotifyService, + private entityChangeService: BaEntityChangeService, + ) { + super(viewModel); + this.expressionResult = this.viewModel.getInjector().get(ExpressionResult); + this.expressionEvaluator = this.viewModel.getInjector().get(ExpressionEvaluator); + this.baObjectOperateService = new BaObjectOperateService(); + } + + /** + * 触发字段联动逻辑 + * @param {any} change - 包含变更信息的对象,通常为 JSON 字符串 + * @description + * 解析传入的变更信息,获取数据源、路径和新值。 + * 检查模块配置中是否存在字段联动配置。 + * 如果存在联动配置,根据源字段的变更更新目标字段的值。 + * 解析映射规则,执行查询并加载目标数据源的实体数据。 + * @throws {Error} 如果传入的变更信息无效或模块配置缺失,可能抛出异常 */ + public async triggerFieldLinkage(change: any) { + const timerId = this.formLoadingService.showLoadingWithDelay(); + try { + const params = this.parserChangeValue(change); + const moduleConfig = this.viewModel.getModule().getConfigManager().getModuleConfig(); + const linkedConfiguration = moduleConfig["linkedConfiguration"] ?? {}; + + if (!this.validateLinkageConfig(linkedConfiguration)) { + this.formMessageService.error("Invalid change parameter"); + return; + } + + const sourceFieldMap = linkedConfiguration["sourceField"] as Map; + const { dataSource } = params; + if (dataSource && sourceFieldMap.has(dataSource)) { + const sourceFields = sourceFieldMap.get(dataSource); + if (Array.isArray(sourceFields)) { + const updatedFields = [...sourceFields]; // 创建副本避免直接修改原数组 + this.updateFieldValue(updatedFields, params); + sourceFieldMap.set(dataSource, updatedFields); + } else { + console.warn(`Source fields for dataSource ${dataSource} is not an array`); + return; + } + } + + let targetDataSources: any = []; + const targetFieldCache = new Map(); + const mappingRuleCache = new Map(); + const contextTemplateCache = new Map(); + const canExecute = new Map(); + const fieldLinkages = linkedConfiguration["fieldLinkage"]; + this.cacheFieldLinkageConfig(fieldLinkages, sourceFieldMap, targetDataSources, targetFieldCache, mappingRuleCache, contextTemplateCache); + this.canExcute(params, fieldLinkages, canExecute); + for (let i = 0; i < targetDataSources.length; i++) { + const dataSource = targetDataSources[i]; + const entityStoreConfig = moduleConfig.entityStores.find(el => el.id == dataSource + "-entitystore"); + const repository = this.viewModel.getModule().getRepository(dataSource + "-repository") as any; + + this.parseQueryCondition(mappingRuleCache.get(dataSource), sourceFieldMap); + this.mergeQueryCondition(mappingRuleCache.get(dataSource)); + this.parseContext(contextTemplateCache.get(dataSource), sourceFieldMap.get(params["dataSource"])); + + const cachedCondition = this.queryConditionCache.get(dataSource); + const newCondition = cachedCondition + ? this.baObjectOperateService.mergeJsonObjects(cachedCondition, mappingRuleCache.get(dataSource)) + : mappingRuleCache.get(dataSource); + this.queryConditionCache.set(dataSource, newCondition); + + const cachedContext = this.contextCache.get(dataSource); + const newContext = cachedContext + ? this.baObjectOperateService.deepMerge({}, cachedContext, contextTemplateCache.get(dataSource)) + : contextTemplateCache.get(dataSource); + this.contextCache.set(dataSource, this.baObjectOperateService.deepMerge({}, entityStoreConfig?.queryView?.context, newContext)); + + if (!canExecute.get(dataSource)) { + continue; + } + + const entities = await repository.getEntities( + { + columns: entityStoreConfig?.queryView?.columns, + virtualComputeColumns: entityStoreConfig?.queryView?.virtualComputeColumns, + queryCondition: this.queryConditionCache.get(dataSource), + filterCondition: entityStoreConfig?.queryView?.filterCondition, + sortColumns: entityStoreConfig?.queryView?.sortColumns, + context: this.contextCache.get(dataSource), + pagination: entityStoreConfig?.queryView?.pagination + }, + entityStoreConfig?.queryView.sourceType + ); + if (entities && entities.length) { + this.viewModel.getModule().getEntityStore(dataSource + "-entitystore")?.loadEntities(entities); + } else { + this.viewModel.getModule().getEntityStore(dataSource + "-entitystore")?.loadEntities([]); + } + } + } catch (error: any) { + throw new Error(`LinkageConfiguration: Failed to load entities for data source: ${error.message}`); + } finally { + this.formLoadingService.hideDelayLoading(timerId); + } + } + private canExcute(params: any, fieldLinkages: any, canExecute: Map) { + const { path, newValue, targetDataSource } = params; + if (typeof newValue === 'object' && newValue !== null && Object.prototype.toString.call(newValue) === '[object Object]' && Object.getPrototypeOf(newValue) === Object.prototype) { + canExecute.set(targetDataSource, true); + } else { + for (let i = 0; i < fieldLinkages.length; i++) { + const fieldLinkage = fieldLinkages[i]; + const { targetDataSource, target, context, configuration } = fieldLinkage; + let flag = true; + flag = Array.from(target.values()).findIndex((el: any) => { + if (el["value"]) { + if (el["value"] === path) { + return true; + } else { + return false; + } + } else { + return el === path; + } + }) >= 0; + if (context && context["template"]) { + for (let key in context["template"]) { + const value = context["template"][key]; + if (typeof value === 'object' && value !== null && value["type"] === "Expression") { + if (path === value["value"]) { + flag = true; + break; + } + } else { + if (path === value) { + flag = true; + break; + } + } + } + } + if (configuration && configuration["defaultTriggerType"] && (configuration["defaultTriggerType"] - 0) === 3) { + flag = false; + } + if (canExecute.get(targetDataSource)) { continue; } + canExecute.set(targetDataSource, flag); + } + } + } + + private cacheFieldLinkageConfig(fieldLinkages: any, sourceFieldMap: Map, targetDataSources: any, targetFieldCache: any, mappingRuleCache: any, contextTemplateCache: any) { + for (let i = 0; i < fieldLinkages.length; i++) { + const fieldLinkage = fieldLinkages[i]; + const { targetDataSource, target, context } = fieldLinkage; + + this.allTargetFieldNotNull(sourceFieldMap, target); + + if (targetDataSources.findIndex((el: any) => el === targetDataSource) < 0) { + targetDataSources.push(targetDataSource); + } + if (!targetFieldCache.has(targetDataSource)) { + targetFieldCache.set(targetDataSource, new Map()); + } + if (!mappingRuleCache.has(targetDataSource)) { + mappingRuleCache.set(targetDataSource, { + "kind": "logic", + "expresses": [], + "operator": "and" + }); + } + if (!contextTemplateCache.has(targetDataSource)) { + contextTemplateCache.set(targetDataSource, {}); + } + target.forEach((value: any, key: any) => { + targetFieldCache.get(targetDataSource).set(key, value); + }); + + const mappingRule = this.deepCopy(fieldLinkage["mappingRule"]); + mappingRuleCache.get(targetDataSource).expresses.push(...(mappingRule["expresses"] ?? [])); + + if (context) { + contextTemplateCache.set(targetDataSource, this.baObjectOperateService.jsonDeepMerge(contextTemplateCache.get(targetDataSource), JSON.parse(JSON.stringify(context)))); + } + } + } + + private deepCopy(object: any) { + try { + return JSON.parse(JSON.stringify(object)) + } catch (error) { + console.log("LinkageConfiguration [mappingRule] deep copy error:" + error) + } + } + + private parserChangeValue(change: any) { + var param; + try { + param = change ? JSON.parse(change) : null; + } + catch (error) { + console.error("Invalid change parameter:" + error); + } + return param; + }; + + private validateLinkageConfig(linkedConfiguration: any) { + if (!linkedConfiguration || !linkedConfiguration["fieldLinkage"] || !linkedConfiguration["fieldLinkage"].length || !linkedConfiguration["sourceField"]) { + return false; + } else { + return true; + } + } + + /** + * 更新源字段数组中指定字段的值 + * @param sourceFieldArray 源字段数组,每个元素包含 key 和 value + * @param sourceField 需要更新的字段的 key + * @param value 新的字段值 + */ + private updateFieldValue(sourceFieldArray: any[], params: any) { + const { path, newValue } = params; + if (typeof newValue === 'object' && newValue !== null && Object.prototype.toString.call(newValue) === '[object Object]' && Object.getPrototypeOf(newValue) === Object.prototype) { + this.contextCache.clear(); + this.queryConditionCache.clear(); + for (let key in newValue) { + const index = sourceFieldArray.findIndex((el: any) => el.key === key); + if (index >= 0) { + sourceFieldArray[index]["value"] = newValue[key]; + } + } + } else { + const index = sourceFieldArray.findIndex((el: any) => el.key === path); + if (index >= 0) { + sourceFieldArray[index]["value"] = newValue; + } + } + } + + private allTargetFieldNotNull(sourceFieldMap: Map, targetFieldMap: Map) { + return Array.from(targetFieldMap.values()).every((targetValue) => { + return Array.from(sourceFieldMap.values()).some((sourceArray) => { + if (typeof targetValue === 'object' && targetValue !== null && targetValue["type"] === "Expression") { + const index = sourceArray.findIndex((el: any) => el.key === targetValue.value); + if (index >= 0 && this.expressionResult[targetValue.expressionId]) { + return this.expressionResult[targetValue.expressionId]; + } + } else { + const item = sourceArray.find((el: any) => el.key === targetValue); + return item && item.value; + } + }); + }); + } + + private parseContext(context: any, sourceFields: any[]) { + if (!context || !context.template) { + return; + } + for (const key in context.template) { + const value = context.template[key]; + if (typeof value === 'object' && value !== null && value["type"] === "Expression") { + const expressionResult = this.expressionEvaluator.evaluate(value.expressionId); + if (expressionResult) { + context.template[key] = expressionResult; + } else if (this.expressionResult[value.expressionId]) { + context.template[key] = this.expressionResult[value.expressionId] ?? ""; + } else { + context.template[key] = ""; + } + } else { + const index = sourceFields.findIndex((el: any) => el.key === value); + if (index >= 0) { + if ((sourceFields[index] && sourceFields[index].value) == null) { + delete context.template[key]; + } else { + context.template[key] = (sourceFields[index] && sourceFields[index].value) ?? ""; + } + } else { + context.template[key] = ""; + } + } + } + } + + /** + * 递归解析逻辑表达式,替换表达式中的字段值为实际值。 + * @param expression 待解析的表达式对象 + * @param sourceFieldMap 字段值映射表 + */ + private parseQueryCondition(expression: any, sourceFieldMap: Map) { + if (!expression || !expression.expresses) { + return; + } + + expression.expresses.forEach((express: any) => { + if (express.kind === "logic" && express.expresses) { + // 递归处理逻辑表达式 + this.parseQueryCondition(express.expresses, sourceFieldMap); + } else if (express.rightExpress) { + const value = this.getSourceFieldValue(sourceFieldMap, express.rightExpress.dataSource, express.rightExpress.value) ?? ""; + // 替换字段值为实际值 + express.rightExpress.value = value; + } + }); + } + + private mergeQueryCondition(expression: any) { + if (!expression || !expression.expresses) { + return; + } + for (let i = 0; i < expression.expresses.length; i++) { + if (expression.expresses[i].kind === "logic" && expression.expresses[i].expresses) { + this.mergeQueryCondition(expression.expresses[i].expresses); + } else { + if (!expression.expresses[i].rightExpress.value) { + expression.expresses.splice(i, 1); + i--; + } + } + } + } + + private getSourceFieldValue(sourceFieldMap: Map, dataSource: any, columnName: any): any { + let result; + const fields = sourceFieldMap.get(dataSource); + if (!fields) { + return undefined; + } + if (typeof columnName === 'object' && columnName !== null && columnName["type"] === "Expression") { + const expressionResult = this.expressionEvaluator.evaluate(columnName.expressionId); + if (expressionResult) { + result = expressionResult; + } else if (this.expressionResult[columnName.expressionId]) { + result = this.expressionResult[columnName.expressionId] ?? ""; + } else { + result = ""; + } + } else { + const field = fields.find((el: any) => el.key === columnName); + result = field ? field.value : undefined; + } + + return result; + } + + public getQueryConditionCache(key: string) { + if (this.queryConditionCache.has(key)) { + return this.queryConditionCache.get(key); + } + return {}; + } + + public getContextCache(key: string) { + if (this.contextCache.has(key)) { + return this.contextCache.get(key); + } + return {}; + } + + +} + +function debounceRequest(service: (params: any) => Promise, delay: number = 300): (params: any) => Promise { + let timer: NodeJS.Timeout | null = null; + let lastRequest: Promise | null = null; + + return async function (params: any): Promise { + if (timer) { + clearTimeout(timer); + } + + return new Promise((resolve, reject) => { + timer = setTimeout(async () => { + try { + if (lastRequest) { + const result = await lastRequest; + resolve(result); + } else { + lastRequest = service(params); + const result = await lastRequest; + lastRequest = null; + resolve(result); + } + } catch (e) { + console.error(e); + } + }, delay); + }); + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/data-services/ba-query-data.service.ts b/packages/ba-command-services/lib/data-services/ba-query-data.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..26ac3db82198cd31408935c3796c385a822512e5 --- /dev/null +++ b/packages/ba-command-services/lib/data-services/ba-query-data.service.ts @@ -0,0 +1,295 @@ +import { BA_DATA_TRANSFORMATION_SERVICE_TOKEN, Entity, EntityChangeType, EntityStoreConfig, ViewModel, ViewModelState } from "@farris/devkit-vue"; +import { BaBaseDataService } from "./ba-base-data.service"; +import { BaFormLoadingService } from "../ba-form-loading.service"; +import { BaFormMessageService } from "../ba-form-message.service"; +import { BaFormNotifyService } from "../ba-form-notify.service"; +import { BaEntityChangeService } from "../ba-entity-change.service"; +import { BaLinkageService } from "./ba-linkage.service"; +import { BaObjectOperateService } from "../utils"; +import { BaRenderEngineService } from "../ba-render-engine.service"; + +export class BaQueryDataService extends BaBaseDataService { + private baLinkageService: BaLinkageService; + private baObjectOperateService: BaObjectOperateService; + private baRenderEngineService: BaRenderEngineService; + private firstLoadMap = new Map(); + + constructor( + viewModel: ViewModel, + private formLoadingService: BaFormLoadingService, + private formMessageService: BaFormMessageService, + private formNotifyService: BaFormNotifyService, + private entityChangeService: BaEntityChangeService, + ) { + super(viewModel); + this.baObjectOperateService = new BaObjectOperateService(); + this.firstLoadMap.set(this.module.getId(), 0); + } + + public async load() { + this.firstLoadMap.set(this.module.getId(), this.firstLoadMap.get(this.module.getId()) + 1); + const entityStores = this.module.getConfigManager().getModuleConfig()?.entityStores ?? []; + const repositorys = this.module.getConfigManager().getModuleConfig()?.repositories ?? []; + const entityStorePromises = entityStores.map((value: EntityStoreConfig) => { + const index = repositorys.findIndex((el: any) => el.entityStore === value.id); + const queryView = JSON.parse(JSON.stringify(value.queryView)); + if (index >= 0) { + const params = { + columns: queryView.columns, + virtualComputeColumns: queryView?.virtualComputeColumns, + queryCondition: this.getBaLinkageService().getQueryConditionCache(queryView.code) ? this.baObjectOperateService.jsonDeepMerge(queryView.queryCondition, this.getBaLinkageService().getQueryConditionCache(queryView.code)) : queryView.queryCondition, + filterCondition: queryView.filterCondition, + sortColumns: queryView.sortColumns, + context: this.getBaLinkageService().getContextCache(queryView.code) && this.getBaLinkageService().getContextCache(queryView.code)["template"] ? + this.baObjectOperateService.jsonDeepMerge(queryView.context, this.getBaLinkageService().getContextCache(queryView.code)) : queryView.context, + pagination: queryView.pagination + }; + if (!repositorys[index].isVirtualEntity) { + return this.queryData( + queryView.code, + params, + queryView.sourceType + ); + } else { + return this.addVirtualEntity(value.queryView.code); + } + } + return Promise.resolve(null); // 显式处理未匹配的情况 + }); + return Promise.all(entityStorePromises).then((results) => { + // 处理结果逻辑 + return results.filter(result => result !== null); + }); + } + + public refresh(controlId?: any) { + const baRenderEngineService = this.viewModel.getInjector().get(BaRenderEngineService); + const schema = baRenderEngineService.getSchema(controlId); + const repositorys = this.module.getConfigManager().getModuleConfig()?.repositories ?? []; + const entityStores = this.module.getConfigManager().getModuleConfig()?.entityStores ?? []; + let index = repositorys.findIndex((el: any) => el.isVirtualEntity === true); + if (index >= 0) { + const entityStoreKey = repositorys[index].entityStore; + const currentEntity = this.module?.getEntityStore(entityStoreKey)?.getCurrentEntity(); + index = entityStores.findIndex((el: any) => el.id = entityStoreKey); + let dataSource = ""; + if (index >= 0) { + dataSource = entityStores[index].queryView.code + } + const changeObject = { + dataSource, + targetDataSource: schema["dataSource"], + newValue: currentEntity, + oldValue: "", + type: EntityChangeType.ValueChange.at, + path: "path" + }; + const command: any = { + name: "TriggerFieldLinkage1", + params: [{ + name: "change", + value: "{EVENTPARAM~/payload/change}" + }], + eventParams: { payload: { change: JSON.stringify(changeObject) } } + } + return this.viewModel.dispatch(command); + } + return Promise.resolve(null); + } + + public queryData(dataSource: string, params: any, sourceType?: string) { + const timerId = this.formLoadingService.showLoadingWithDelay(); + const repositoryId = dataSource + "-repository", entityStoreId = dataSource + "-entitystore"; + const currentRepository = this.module.getRepository(repositoryId) as any; + const entityStateTarget = this.module.getEntityStore(entityStoreId) as any; + + if (typeof params === "string") { + params = JSON.parse(params); + } + + const loadPromise = this.isExcute(dataSource) ? currentRepository.getEntities.call(currentRepository, params, sourceType) + .then((entities: Entity[]) => { + entityStateTarget.loadEntities(entities); + return entities; + }) + .catch((error: any) => { + throw error; + }) + .finally(() => { + this.formLoadingService.hideDelayLoading(timerId); + }) : Promise.resolve([]).finally(() => { + // entityStateTarget.loadEntities([]); + this.formLoadingService.hideDelayLoading(timerId); + }); + return loadPromise; + } + + public queryDataByHierarchy(sourceType: string, controlId: string, queryParams: any, dataSource: string, schema?: any) { + let treeConditions: any = {}; + if (queryParams) { + treeConditions = JSON.parse(queryParams); + } + let viewSchema: any = {}; + if (schema) { + viewSchema = JSON.parse(schema); + } + const entityStores = this.module.getConfigManager().getModuleConfig()?.entityStores ?? []; + const repositorys = this.module.getConfigManager().getModuleConfig()?.repositories ?? []; + const entityStoreIndex = entityStores.findIndex((el: EntityStoreConfig) => el.id === dataSource + "-entitystore"); + const repositoryIndex = repositorys.findIndex((el: any) => el.id === dataSource + "-repository"); + if (entityStoreIndex >= 0 && repositoryIndex >= 0) { + const dataSource = entityStores[entityStoreIndex].queryView.code; + if (!repositorys[repositoryIndex].isVirtualEntity) { + const queryView = JSON.parse(JSON.stringify(entityStores[entityStoreIndex].queryView)); + let params = this.baObjectOperateService.jsonDeepMerge(queryView, { + queryCondition: this.getBaLinkageService().getQueryConditionCache(dataSource) + }); + params = this.baObjectOperateService.jsonDeepMerge(params, { + context: this.getBaLinkageService().getContextCache(dataSource) && this.getBaLinkageService().getContextCache(dataSource)["template"] + ? this.getBaLinkageService().getContextCache(dataSource) + : entityStores[entityStoreIndex].queryView.context + }); + params = this.baObjectOperateService.jsonDeepMerge(params, treeConditions, "columns"); + return this.queryChildrenData( + dataSource, + params, + sourceType, + viewSchema + ); + } else { + return this.addVirtualEntity(entityStores[entityStoreIndex].queryView.code); + } + } else { + return Promise.resolve(null); + } + } + + private queryChildrenData(dataSource: string, queryParams?: any, sourceType?: string, schema?: any) { + const dataTransformation: any = this.viewModel.getInjector().get(BA_DATA_TRANSFORMATION_SERVICE_TOKEN); + const timerId = this.formLoadingService.showLoadingWithDelay(); + const repositoryId = dataSource + "-repository"; + const currentRepository = this.module.getRepository(repositoryId) as any; + + const loadPromise = currentRepository.getEntities.call(currentRepository, queryParams, sourceType) + .then((entities: Entity[]) => { + const datas = dataTransformation.dataTransformation(this.viewModel, schema, entities); + return datas; + }) + .catch((error: any) => { + throw error; + }) + .finally(() => { + this.formLoadingService.hideDelayLoading(timerId); + }); + return loadPromise; + } + + public addVirtualEntity(dataSource: string) { + const repositoryId = dataSource + "-repository", entityStoreId = dataSource + "-entitystore"; + const timerId = this.formLoadingService.showLoadingWithDelay(); + const currentRepository = this.module.getRepository(repositoryId) as any; + const entityStateTarget = this.module.getEntityStore(entityStoreId) as any; + const entitySchema = entityStateTarget.getEntitySchema().getFieldSchemas(); + currentRepository.updateEntitySchema(entityStateTarget.getEntitySchema()); + const defaultValue: any = {}; + const allComponentSchema = this.getAllComponentSchema() || []; + if (entitySchema && entitySchema.length) { + entitySchema.forEach((el: any) => { + if (el.name === "id") { + defaultValue[el.name] = new Date().getTime(); + } else { + const index = allComponentSchema.findIndex((item: any) => { + if (item.binding && item.binding.field === el.name) { + return true; + } else { + return false; + } + }); + if (index !== -1) { + const componentRef = this.getBaRenderEngineService().getComponentById(allComponentSchema[index].id); + if (componentRef && componentRef.getSelectData()) { + defaultValue[el.name] = componentRef.getSelectData(); + } else { + if (allComponentSchema[index] && allComponentSchema[index].defaultValue) { + defaultValue[el.name] = allComponentSchema[index].defaultValue; + } else { + defaultValue[el.name] = ""; + } + } + } else { + defaultValue[el.name] = ""; + } + } + }); + } + + const createPromise = currentRepository.createVirtualEntity(defaultValue).then((entity: Entity) => { + entityStateTarget.loadEntities([]); + entityStateTarget.appendEntities([entity]); + return entity; + }).finally(() => { + this.formLoadingService.hideDelayLoading(timerId); + }); + return createPromise; + } + + private parsingParameters(parameter?: string | any[]): any[] { + parameter = !parameter ? '{}' : parameter; + if (typeof parameter === 'string') { + parameter = JSON.parse(parameter) as any[]; + } + return parameter; + } + private getBaLinkageService() { + if (!this.baLinkageService) { + this.baLinkageService = this.viewModel.getInjector().get(BaLinkageService); + } + return this.baLinkageService; + } + private getBaRenderEngineService() { + if (!this.baRenderEngineService) { + this.baRenderEngineService = this.viewModel.getInjector().get(BaRenderEngineService); + } + return this.baRenderEngineService; + } + private isExcute(dataSource: string) { + let flag = true; + const linkedConfiguration = this.module.getConfigManager().getModuleConfig()?.linkedConfiguration ?? {}; + if (linkedConfiguration["fieldLinkage"] && linkedConfiguration["fieldLinkage"].length) { + for (let i = 0; i < linkedConfiguration["fieldLinkage"].length; i++) { + const item = linkedConfiguration["fieldLinkage"][i]; + if (item["configuration"] && item["configuration"]["defaultTriggerType"] && item["configuration"]["defaultTriggerType"] !== 3) { + flag = true; + } else { + if (dataSource === item.targetDataSource) { + flag = false; + break; + } + } + } + } + return flag; + } + private getAllComponentSchema() { + const result: any[] = []; + const component = this.getBaRenderEngineService().getSchema("root-component"); + if (component.contents && component.contents.length) { + for (let i = 0; i < component.contents.length; i++) { + this.recursionParser(component.contents[i], null, result); + } + } + return result; + } + private recursionParser(component: any, contents: any, cache: any) { + if (component) { + cache.push(component); + if (component.contents && component.contents.length) { + this.recursionParser(null, component.contents, cache); + } + } else { + for (let i = 0; i < contents.length; i++) { + this.recursionParser(contents[i], null, cache); + } + } + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/data-services/index.ts b/packages/ba-command-services/lib/data-services/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..89d2595d2158d4a185b43440f48ff62cd5a89cc7 --- /dev/null +++ b/packages/ba-command-services/lib/data-services/index.ts @@ -0,0 +1,4 @@ +export * from './ba-base-data.service'; +export * from './ba-query-data.service'; +export * from './ba-linkage.service'; +export * from './ba-data-transformation.service'; \ No newline at end of file diff --git a/packages/ba-command-services/lib/devkit-services/ba-context-service.ts b/packages/ba-command-services/lib/devkit-services/ba-context-service.ts new file mode 100644 index 0000000000000000000000000000000000000000..d315381558a8cca7940705e6142884671927ef2a --- /dev/null +++ b/packages/ba-command-services/lib/devkit-services/ba-context-service.ts @@ -0,0 +1,160 @@ +import { Devkit, Module, ViewModel, ViewModelState } from '@farris/devkit-vue'; +import { BaRenderEngineService } from '../ba-render-engine.service'; + +/** + * 上下文服务 + */ +class BaContextService { + + protected devkit: Devkit; + + /** + * 视图模型 + */ + protected module: Module; + + /** + * 视图模型 + */ + protected viewModel: ViewModel; + + /** + * 渲染引擎 + */ + private renderEngineService: BaRenderEngineService; + + /** + * 构造函数 + */ + constructor(viewModel: ViewModel, renderEngineService: BaRenderEngineService) { + this.viewModel = viewModel; + this.module = this.viewModel.getModule(); + this.devkit = this.module.getDevkit(); + this.renderEngineService = renderEngineService; + } + + /** + * 获取当前表单的模块 + */ + public getModule(): Module { + return this.module; + } + + /** + * 获取当前表单的根视图模型 + */ + public getRootViewModel(): ViewModel { + const rootViewModel = this.module.getRootViewModel(); + + return rootViewModel; + } + + /** + * 获取当前表单指定ID的视图模型 + */ + public getViewModelById(viewModelId: string): ViewModel | null { + const module = this.getModule(); + const targetViewModel = module.getViewModel(viewModelId); + return targetViewModel; + } + + /** + * 获取外部表单的模块 + */ + public getExternalModule(externalContainerId: string): Module { + const allModules = this.devkit.getModules(); + const externalModule = allModules.find((module)=> { + const moduleId = module.getId(); + return moduleId.startsWith(externalContainerId); + }); + if (!externalModule) { + throw new Error(`Module(externalContainerId=${externalContainerId}) does not exist`); + } + + return externalModule; + } + + /** + * 获取当前表单的根视图模型 + */ + public getExternalRootViewModel(externalContainerId: string): ViewModel { + const externalModule = this.getExternalModule(externalContainerId); + const rootViewModel = externalModule.getRootViewModel(); + + return rootViewModel; + } + + /** + * 获取当前表单指定ID的视图模型 + */ + public getExternalViewModelById(externalContainerId: string, viewModelId: string): ViewModel | null { + const externalModule = this.getExternalModule(externalContainerId); + const targetViewModel = externalModule.getViewModel(viewModelId); + return targetViewModel; + } + + /** + * 获取弹窗表单的模块 + */ + public getModalModule(modalId: string): Module { + const modalModuleId = this.getModalModuleId(modalId); + const modalModule = this.devkit.getModule(modalModuleId); + if (!modalModule) { + throw new Error(`Module(id=${modalModuleId}) does not exist`); + } + + return modalModule; + } + + /** + * 获取弹窗表单的根视图模型 + */ + public getModalRootViewModel(modalId: string): ViewModel { + const modalModule = this.getModalModule(modalId); + const modalRootViewModel = modalModule.getRootViewModel(); + + return modalRootViewModel; + } + + /** + * 获取弹窗表单内指定ID的视图模型 + */ + public getModalViewModelById(modalId: string, viewModelId: string): ViewModel | null { + const modalModule = this.getModalModule(modalId); + const targetViewModel = modalModule.getViewModel(viewModelId); + return targetViewModel; + } + + /** + * 根据弹窗表单的模块ID + */ + private getModalModuleId(modalId: string): string { + const modalSchema = this.renderEngineService.getSchema(modalId); + if (!modalSchema) { + throw new Error(`Modal(id=${modalId}) does not exist`); + } + if (!Array.isArray(modalSchema.contents) || modalSchema.contents.length === 0) { + throw new Error('There is no form in the modal'); + } + + const externalContainerSchema = modalSchema.contents[0]; + const modalModuleId = this.getExternalModuleId(externalContainerSchema); + + return modalModuleId; + } + + /** + * 获取外部容器内表单的模块ID + */ + private getExternalModuleId(externalContainerSchema: any): string { + const externalContainerId = externalContainerSchema.id; + const { externalComponent } = externalContainerSchema; + const externalComponentCode = externalComponent.code; + + const externalModuleId = `${externalContainerId}-${externalComponentCode}`; + + return externalModuleId; + } +} + +export { BaContextService }; \ No newline at end of file diff --git a/packages/ba-command-services/lib/devkit-services/index.ts b/packages/ba-command-services/lib/devkit-services/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..4929622b6c6054d84385541f8e5ac2d3bb67ff45 --- /dev/null +++ b/packages/ba-command-services/lib/devkit-services/index.ts @@ -0,0 +1 @@ +export * from './ba-context-service'; diff --git a/packages/ba-command-services/lib/exception/ba-form-exception.handler.ts b/packages/ba-command-services/lib/exception/ba-form-exception.handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..0d3ed2eab9fb7dbd6920571b3a207e6837b8cb3b --- /dev/null +++ b/packages/ba-command-services/lib/exception/ba-form-exception.handler.ts @@ -0,0 +1,40 @@ +import { ExceptionHandler } from "@farris/devkit-vue"; +import { BaExceptionStrategyFactory } from "./exception-strategy/ba-exception-strategy.factory"; +import { BaFormMessageService } from "../ba-form-message.service"; +import { BaFormLoadingService } from "../ba-form-loading.service"; +import { BaClientException, BaException, BaServerException, BaUnAuthorizedException } from "./types"; + +export class BaFormExceptionHandler implements ExceptionHandler { + constructor(private formMessageService: BaFormMessageService, private formLoadingService: BaFormLoadingService) { } + public handle(error: any) { + this.formLoadingService.clearAll(); + const exception = this.parse(error); + const exceptionStrategy = BaExceptionStrategyFactory.create(exception, this.formMessageService); + exceptionStrategy.handleException(exception); + } + private parse(error: any): BaException { + if (error.response) { + // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围 + if (error.response.status === 401) { + return { status: error.response.status } as BaUnAuthorizedException; + } else { + let data = error.response.data; + const { Code, Level, Message, Detail, date, innerMessage, RequestId } = data; + return { + code: Code, detail: Detail, level: Level, message: Message, requestId: RequestId, date, innerMessage + } as BaServerException; + } + } else if (error.request) { + // 请求已经成功发起,但没有收到响应 + const json = error.toJSON(); + const message = json && json.message; + const stack = json && json.stack; + return { message, stack } as BaClientException; + } else { + // 发送请求时出了问题 + const message = error.message; + const stack = error.stack; + return { message, stack } as BaClientException; + } + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/exception/exception-strategy/ba-client-exception.strategy.ts b/packages/ba-command-services/lib/exception/exception-strategy/ba-client-exception.strategy.ts new file mode 100644 index 0000000000000000000000000000000000000000..19ec180df2f8878305c479eb5ad2b795f91b6d92 --- /dev/null +++ b/packages/ba-command-services/lib/exception/exception-strategy/ba-client-exception.strategy.ts @@ -0,0 +1,15 @@ +import { BaFormMessageService } from "../../ba-form-message.service"; +import { BaClientException, BaIExceptionStrategy } from "../types"; +import { BaExceptionStrategy } from "./ba-exception-strategy"; + +export class BaClientExceptionStrategy extends BaExceptionStrategy implements BaIExceptionStrategy { + constructor( + public messagerService: BaFormMessageService, + ) { + super(messagerService); + } + + handleException(error: BaClientException): void { + this.messagerService.exception(error.message, error.stack); + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/exception/exception-strategy/ba-error-exception.strategy.ts b/packages/ba-command-services/lib/exception/exception-strategy/ba-error-exception.strategy.ts new file mode 100644 index 0000000000000000000000000000000000000000..a4e7e3947ffc97bfbba38b8dba7516d897a1523c --- /dev/null +++ b/packages/ba-command-services/lib/exception/exception-strategy/ba-error-exception.strategy.ts @@ -0,0 +1,64 @@ +// import moment from "moment"; +import { BaFormMessageService } from "../../ba-form-message.service"; +import { BaIExceptionStrategy, BaServerException } from "../types"; +import { BaExceptionStrategy } from "./ba-exception-strategy"; + +class ErrorDeduplicator { + private static errorSet = new Set(); + static isDuplicate(error: any): boolean { + const errorKey = `${error.code}:${error.message}`; + if (ErrorDeduplicator.errorSet.has(errorKey)) { + return true; + } + ErrorDeduplicator.errorSet.add(errorKey); + return false; + } +} + + +/** + * 错误级别异常处理 + */ +export class BaErrorExceptionStrategy extends BaExceptionStrategy implements BaIExceptionStrategy { + private errorSet = new Set(); + + constructor( + public messagerService: BaFormMessageService + ) { + super(messagerService); + } + + public handleException(error: BaServerException): void { + if (!error) { + return; + } + + this.handleErrorLevel(error); + } + + private handleErrorLevel(error: BaServerException): void { + const message = error.message || ''; + const date = error.date || new Date(); + // TODO: 支持日期格式化 + const localDate = '';//moment(date).format('YYYY-MM-DD HH:mm:ss'); + const detail = error.detail || error.innerMessage || ''; + + if (!ErrorDeduplicator.isDuplicate(error)) { + this.messagerService.exception(message, detail, localDate); + } + + this.displayError(error); + } + /** + * 在控制台中显示错误信息 + */ + private displayError(error: BaServerException) { + if (!error) { + return; + } + if (!console || !console.error) { + return; + } + console.error(error); + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/exception/exception-strategy/ba-exception-strategy.factory.ts b/packages/ba-command-services/lib/exception/exception-strategy/ba-exception-strategy.factory.ts new file mode 100644 index 0000000000000000000000000000000000000000..2475f60b20ab50e17fadef23b20d8237ce716ce8 --- /dev/null +++ b/packages/ba-command-services/lib/exception/exception-strategy/ba-exception-strategy.factory.ts @@ -0,0 +1,50 @@ +import { BaFormMessageService } from "../../ba-form-message.service"; +import { BaException, ExceptionLevel, BaIExceptionStrategy, BaServerException } from "../types"; +import { BaClientExceptionStrategy } from "./ba-client-exception.strategy"; +import { BaErrorExceptionStrategy } from "./ba-error-exception.strategy"; +import { BaFatalExceptionStrategy } from "./ba-fatal-exception.strategy"; +import { BaInfoExceptionStrategy } from "./ba-info-exception.strategy"; +import { BaUnauthorizedExceptionStrategy } from "./ba-unauthorized-exception.strategy"; +import { BaWarningExceptionStrategy } from "./ba-warning-exception.strategy"; + +export class BaExceptionStrategyFactory { + public static create(exception: BaException, messagerService: BaFormMessageService) { + if (this.isUnauthorizedException(exception)) { + return new BaUnauthorizedExceptionStrategy(messagerService); + } else if (this.isServerException(exception)) { + const serverException = exception as BaServerException; + return this.getExceptionHandleStrategy(serverException.level, messagerService); + } else { + return new BaClientExceptionStrategy(messagerService); + } + } + private static isServerException(exception: BaException) { + return 'code' in exception; + } + private static isUnauthorizedException(exception: BaException) { + return 'status' in exception; + } + private static getExceptionHandleStrategy(exceptionLevel: ExceptionLevel, messagerService: BaFormMessageService): BaIExceptionStrategy { + let exceptionStrategy: BaIExceptionStrategy; + switch (exceptionLevel) { + case ExceptionLevel.Info: + exceptionStrategy = new BaInfoExceptionStrategy(messagerService); + break; + case ExceptionLevel.Warning: + exceptionStrategy = new BaWarningExceptionStrategy(messagerService); + break; + case ExceptionLevel.Error: + exceptionStrategy = new BaErrorExceptionStrategy(messagerService); + break; + case ExceptionLevel.Fatal: + exceptionStrategy = new BaFatalExceptionStrategy(messagerService); + break; + default: + // 默认异常等级是错误 + exceptionStrategy = new BaErrorExceptionStrategy(messagerService); + break; + } + + return exceptionStrategy; + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/exception/exception-strategy/ba-exception-strategy.ts b/packages/ba-command-services/lib/exception/exception-strategy/ba-exception-strategy.ts new file mode 100644 index 0000000000000000000000000000000000000000..74da36f615b40c980cabe12acbada2ec0a5d5b5c --- /dev/null +++ b/packages/ba-command-services/lib/exception/exception-strategy/ba-exception-strategy.ts @@ -0,0 +1,10 @@ +import { BaFormMessageService } from '../../ba-form-message.service'; + +/** + * 异常处理基类 + */ +export class BaExceptionStrategy { + constructor( + public messagerService: BaFormMessageService) { + } +} diff --git a/packages/ba-command-services/lib/exception/exception-strategy/ba-fatal-exception.strategy.ts b/packages/ba-command-services/lib/exception/exception-strategy/ba-fatal-exception.strategy.ts new file mode 100644 index 0000000000000000000000000000000000000000..1faa989701c84825b24e0af79bfb6178ba568b2d --- /dev/null +++ b/packages/ba-command-services/lib/exception/exception-strategy/ba-fatal-exception.strategy.ts @@ -0,0 +1,20 @@ +import { BaFormMessageService } from "../../ba-form-message.service"; +import { BaIExceptionStrategy, BaServerException } from "../types"; +import { BaExceptionStrategy } from "./ba-exception-strategy"; + +/** + * 致命错误级别异常处理 + */ +export class BaFatalExceptionStrategy extends BaExceptionStrategy implements BaIExceptionStrategy { + constructor( + public messagerService: BaFormMessageService) { + super(messagerService); + } + + public handleException(error: BaServerException): void { + if (!error) { + return; + } + this.messagerService.error(error.message); + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/exception/exception-strategy/ba-info-exception.strategy.ts b/packages/ba-command-services/lib/exception/exception-strategy/ba-info-exception.strategy.ts new file mode 100644 index 0000000000000000000000000000000000000000..3580bbdf1547a011bc0fac5f6d57f743e1df5e27 --- /dev/null +++ b/packages/ba-command-services/lib/exception/exception-strategy/ba-info-exception.strategy.ts @@ -0,0 +1,20 @@ +import { BaFormMessageService } from "../../ba-form-message.service"; +import { BaIExceptionStrategy, BaServerException } from "../types"; +import { BaExceptionStrategy } from "./ba-exception-strategy"; + +/** + * 信息级别异常处理 + */ +export class BaInfoExceptionStrategy extends BaExceptionStrategy implements BaIExceptionStrategy { + constructor( + public messagerService: BaFormMessageService) { + super(messagerService); + } + + public handleException(error: BaServerException): void { + if (!error) { + return; + } + this.messagerService.info(error.message); + } +} diff --git a/packages/ba-command-services/lib/exception/exception-strategy/ba-unauthorized-exception.strategy.ts b/packages/ba-command-services/lib/exception/exception-strategy/ba-unauthorized-exception.strategy.ts new file mode 100644 index 0000000000000000000000000000000000000000..bf5f85b40c69c627592e2a914d77799651c7f011 --- /dev/null +++ b/packages/ba-command-services/lib/exception/exception-strategy/ba-unauthorized-exception.strategy.ts @@ -0,0 +1,14 @@ +import { BaFormMessageService } from "../../ba-form-message.service"; +import { BaLocaleService } from "../../locale"; +import { BaIExceptionStrategy, BaUnAuthorizedException } from "../types"; +import { BaExceptionStrategy } from "./ba-exception-strategy"; + +export class BaUnauthorizedExceptionStrategy extends BaExceptionStrategy implements BaIExceptionStrategy { + constructor( + public messagerService: BaFormMessageService) { + super(messagerService); + } + handleException(error: BaUnAuthorizedException): void { + this.messagerService.warning(BaLocaleService.translate('unauthorized')); + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/exception/exception-strategy/ba-warning-exception.strategy.ts b/packages/ba-command-services/lib/exception/exception-strategy/ba-warning-exception.strategy.ts new file mode 100644 index 0000000000000000000000000000000000000000..aaeabb420f9497c14855a89be1d4fd99202b831b --- /dev/null +++ b/packages/ba-command-services/lib/exception/exception-strategy/ba-warning-exception.strategy.ts @@ -0,0 +1,20 @@ +import { BaFormMessageService } from "../../ba-form-message.service"; +import { BaIExceptionStrategy, BaServerException } from "../types"; +import { BaExceptionStrategy } from "./ba-exception-strategy"; + +/** + * 警告级别异常处理 + */ +export class BaWarningExceptionStrategy extends BaExceptionStrategy implements BaIExceptionStrategy { + constructor( + public messagerService: BaFormMessageService) { + super(messagerService); + } + + public handleException(error: BaServerException): void { + if (!error) { + return; + } + this.messagerService.warning(error.message); + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/exception/exception-strategy/index.ts b/packages/ba-command-services/lib/exception/exception-strategy/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c8e5d1bd212968ae9d31cd4484e71a38786b49f9 --- /dev/null +++ b/packages/ba-command-services/lib/exception/exception-strategy/index.ts @@ -0,0 +1,8 @@ +export * from './ba-client-exception.strategy'; +export * from './ba-error-exception.strategy'; +export * from './ba-exception-strategy.factory'; +export * from './ba-exception-strategy'; +export * from './ba-fatal-exception.strategy'; +export * from './ba-info-exception.strategy'; +export * from './ba-unauthorized-exception.strategy'; +export * from './ba-warning-exception.strategy'; diff --git a/packages/ba-command-services/lib/exception/index.ts b/packages/ba-command-services/lib/exception/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..9c820d56c461364012f94f7440b74a4b73d0b7ad --- /dev/null +++ b/packages/ba-command-services/lib/exception/index.ts @@ -0,0 +1,3 @@ +export * from './exception-strategy/index'; +export * from './ba-form-exception.handler'; +export * from './types'; diff --git a/packages/ba-command-services/lib/exception/types.ts b/packages/ba-command-services/lib/exception/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..c17354ae88b639980d5de9ca4cd243eb1a669b5c --- /dev/null +++ b/packages/ba-command-services/lib/exception/types.ts @@ -0,0 +1,52 @@ +interface BaException { +} +interface BaClientException extends BaException { + message: string; + stack: string; +} +/** + * 服务器端异常 + */ +interface BaServerException extends BaException { + code: string; + level: ExceptionLevel; + message: string; + detail: string; + requestId: string; + date?: string; + innerMessage?: string; +} +interface BaUnAuthorizedException extends BaException { + status: number; +} +/** + * 服务器端异常等级 + */ +const enum ExceptionLevel { + /** + * 提示信息 + */ + Info = 0, + /** + * 警告 + */ + Warning, + /** + * 错误 + */ + Error, + /** + * 致命错误 + */ + Fatal +} + +/** +* 异常处理接口 +*/ +interface BaIExceptionStrategy { + handleException(error: BaException): void; +} + + +export { BaClientException, BaServerException, ExceptionLevel, BaIExceptionStrategy, BaException, BaUnAuthorizedException }; diff --git a/packages/ba-command-services/lib/index.ts b/packages/ba-command-services/lib/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..5e6535f636ce4383fa255db4ce20c81fea7120bf --- /dev/null +++ b/packages/ba-command-services/lib/index.ts @@ -0,0 +1,15 @@ +export * from './data-services/index'; +export * from './devkit-services/index'; +export * from './exception/index'; +export * from './locale/index'; +export * from './ba-command.service'; +export * from './ba-controller.service'; +export * from './ba-entity-change.service'; +export * from './ba-form-loading.service'; +export * from './ba-form-message.service'; +export * from './ba-form-notify.service'; +export * from './ba-render-engine.service'; +export * from './ba-template.service'; +export * from './tokens'; +export * from './providers'; +export * from './utils/index'; diff --git a/packages/ba-command-services/lib/locale/ba-locale.service.ts b/packages/ba-command-services/lib/locale/ba-locale.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..2a6b60de7836a60541f75ae9f69b0a1934d669ec --- /dev/null +++ b/packages/ba-command-services/lib/locale/ba-locale.service.ts @@ -0,0 +1,53 @@ +import { DEFAULT_LOCALE } from "@farris/devkit-vue"; +import { BA_DEFAULT_LOCALE_CONFIG, BaLocaleConfig, BaLocaleResources } from "./types"; +import axios, { AxiosRequestConfig } from "axios"; +import { get } from 'lodash-es'; + +export class BaLocaleService { + private static config: BaLocaleConfig; + private static localeResources: Record = {}; + public static async setup(config: BaLocaleConfig) { + BaLocaleService.config = { ...BA_DEFAULT_LOCALE_CONFIG, ...config }; + const locale = BaLocaleService.config.locale; + const uri = `${BaLocaleService.config.uri}/${locale}.json`; + try { + const resources = await BaLocaleService.loadResource(uri); + BaLocaleService.localeResources[locale] = resources; + } catch (error) { + const uri = `${BaLocaleService.config.uri}/${DEFAULT_LOCALE}.json`; + const resources = await BaLocaleService.loadResource(uri); + BaLocaleService.localeResources[locale] = resources; + } + } + public static setLocales(locale: string, resources: BaLocaleResources, moduleId?: string) { + if (!locale || !resources) { + return; + } + if (BaLocaleService.localeResources[locale]) { + BaLocaleService.localeResources[locale] = { ...BaLocaleService.localeResources[locale], ...resources }; + } else { + BaLocaleService.localeResources[locale] = resources; + } + } + public static translate(key: string, moduleId?: string, defaultValue?: string) { + const locale = BaLocaleService.config.locale; + if (BaLocaleService.localeResources[locale]) { + const text = get(BaLocaleService.localeResources[locale], key); + if (text) { + return text; + } + } + return defaultValue; + } + private static loadResource(url: string, config: AxiosRequestConfig = {}) { + const defaultOptions = { + timeout: 5000, + headers: { + 'Cache-Control': 'no-cache' + } + }; + config = { ...defaultOptions, ...config }; + const requestPromise = axios.get(url, config).then((response) => response.data); + return requestPromise; + } +} diff --git a/packages/ba-command-services/lib/locale/ba-translate.service.ts b/packages/ba-command-services/lib/locale/ba-translate.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..6ff29bce3a7d9522eea013109be6c2beeb119d47 --- /dev/null +++ b/packages/ba-command-services/lib/locale/ba-translate.service.ts @@ -0,0 +1,20 @@ +import { Injector, Translate, TRANSLATE_TOKEN } from '@farris/devkit-vue'; +import { BaLocaleResources } from './types'; +export class BaTranslateService implements Translate { + private localeResources: Record = {}; + constructor(private injector: Injector) { } + public transform(key: string, defaultValue?: string): string { + const translate = this.injector.get(TRANSLATE_TOKEN); + return translate.transform(key, defaultValue); + } + public setLocales(locale: string, resources: BaLocaleResources) { + if (!locale || !resources) { + return; + } + if (this.localeResources[locale]) { + this.localeResources[locale] = { ...this.localeResources[locale], ...resources }; + } else { + this.localeResources[locale] = resources; + } + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/locale/index.ts b/packages/ba-command-services/lib/locale/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..00d53243f862e4ef846f7f702cb8bb2fb447e663 --- /dev/null +++ b/packages/ba-command-services/lib/locale/index.ts @@ -0,0 +1,3 @@ +export * from './types'; +export * from './ba-locale.service'; +export * from './ba-translate.service'; diff --git a/packages/ba-command-services/lib/locale/locales/en.json b/packages/ba-command-services/lib/locale/locales/en.json new file mode 100644 index 0000000000000000000000000000000000000000..20d66f856d107c691eaefceffc1829bc3dd67573 --- /dev/null +++ b/packages/ba-command-services/lib/locale/locales/en.json @@ -0,0 +1,41 @@ +{ + "yes": "Yes", + "no": "No", + "confirm": "Confirm", + "cancel": "Cancel", + "saveSuccess": "Successfully saved!", + "saveFailed": "Save failed!", + "deleteSuccess": "Successfully deleted!", + "deleteFaild": "Failed to delete!", + "confirmDeletion": "Confirm deletion?", + "confirmClosing": "There is unsaved data. Do you want to continue closing?", + "confirmCancel": "Exist unsaved change,Confirm to cancel?", + "unauthorized": "Your login has expired, please login again.", + "noDataExist": "Data does not exist to access the edit state!", + "pleaseSelectDeleteData": "Please select the data to delete!", + "pleaseSelectParentNode": "Please select parent node!", + "deleteChildFirst": "Please delete the child nodes first!", + "pleaseSelectDetailFormData": "Please select a detail form data first!", + "pleaseSelectEditData": "Please select the data you want to edit!", + "pleaseSelectViewData": "Please select the data you want to view!", + "hasChangeCheckFaild": "An error occurred while checking the page for unsaved changes! Please make sure the data has been saved. Do you want to continue closing?", + "pleaseSelectCopyData": "Please select the data you want to copy!", + "unallowEmptyBizBillId": "Please select the data you want to print!", + "required": "Please input '$property'", + "maxLength": "'$property' should not longer than $constraint1", + "minLength": "'$property' should not shorter than $constraint1 charactor`", + "maxValue": "'$property' should not bigger than $constraint1", + "minValue": "'$property' should not less than $constraint1", + "maxDate": "'$property' should not late than $constraint1", + "minDate": "'$property' should not early than $constraint1", + "allVertifyMessages": "All", + "errorTypeVertifyMessages": "Error", + "emptyTypeVertifyMessages": "Empty", + "verifyMessageWithRowIndex": "row $constraint1", + "pleaseSelectUpdateRow":"Please select the row where you want to update the attachment!", + "pleaseUploadFirst":"Please upload attachment first!", + "pleaseSelectDownloadAttachment":"Please select the attachment you want to download!", + "noDownloadAttachment":"There are no attachments to download!", + "noAttachment":"There are no attachments to preview.", + "noParentData":"Please select the parent data!" +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/locale/locales/zh-CHS.json b/packages/ba-command-services/lib/locale/locales/zh-CHS.json new file mode 100644 index 0000000000000000000000000000000000000000..4f178def69d82f79186503270e6e8a55cd7b646a --- /dev/null +++ b/packages/ba-command-services/lib/locale/locales/zh-CHS.json @@ -0,0 +1,41 @@ +{ + "yes": "是", + "no": "否", + "confirm": "确定", + "cancel": "取消", + "saveSuccess": "保存成功!", + "saveFailed": "保存失败!", + "deleteSuccess": "删除成功!", + "deleteFaild": "删除失败!", + "confirmDeletion": "确认删除?", + "confirmClosing": "存在未保存的数据,是否继续关闭?", + "confirmCancel": "存在未保存的变更,确认取消?", + "unauthorized": "用户登录信息已失效,请重新登录。", + "noDataExist": "要编辑的数据不存在,无法进入编辑状态!", + "pleaseSelectDeleteData": "请选择要删除的数据!", + "pleaseSelectParentNode": "请选择父节点", + "deleteChildFirst": "请先删除子节点", + "pleaseSelectDetailFormData": "请先选择一条从表数据!", + "pleaseSelectEditData": "请选择要编辑的数据!", + "pleaseSelectViewData": "请选择要查看的数据!", + "hasChangeCheckFaild": "在检查页面是否存在未保存的变更时发生错误!请确保数据已经保存。是否继续关闭?", + "pleaseSelectCopyData": "请选择要复制的数据!", + "unallowEmptyBizBillId": "请选择要打印的数据!", + "required": "请输入'$property'", + "maxLength": "'$property'的长度不得大于$constraint1", + "minLength": "'$property'的值不应小于$constraint1个字符`", + "maxValue": "'$property'的值不应大于$constraint1", + "minValue": "'$property'的值不应小于$constraint1", + "maxDate": "'$property'的值不应晚于$constraint1", + "minDate": "'$property'的值不应早于$constraint1", + "allVertifyMessages": "全部", + "errorTypeVertifyMessages": "错填", + "emptyTypeVertifyMessages": "漏填", + "verifyMessageWithRowIndex": "第 $constraint1 行", + "pleaseSelectUpdateRow":"请选择要更新附件的行!", + "pleaseUploadFirst":"请先上传附件!", + "pleaseSelectDownloadAttachment":"请选择要下载的附件!", + "noDownloadAttachment":"找不到要下载的附件!", + "noAttachment":"请选择上级数据!", + "noParentData":"请选择上级数据!" +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/locale/locales/zh-CHT.json b/packages/ba-command-services/lib/locale/locales/zh-CHT.json new file mode 100644 index 0000000000000000000000000000000000000000..1812c8beb59cb8595c9225dcfdd424a891ec8117 --- /dev/null +++ b/packages/ba-command-services/lib/locale/locales/zh-CHT.json @@ -0,0 +1,41 @@ +{ + "yes": "是", + "no": "否", + "confirm": "確定", + "cancel": "取消", + "saveSuccess": "保存成功!", + "saveFailed": "保存失敗!", + "deleteSuccess": "刪除成功!", + "deleteFaild": "刪除失敗!", + "confirmDeletion": "確認刪除?", + "confirmClosing": "存在未保存的數據,是否繼續關閉?", + "confirmCancel": "存在未保存的變更,確認取消?", + "unauthorized": "用戶登錄信息已失效,請重新登錄。", + "noDataExist": "要編輯的數據不存在,無法進入編輯狀態!", + "pleaseSelectDeleteData": "請選擇要刪除的數據!", + "pleaseSelectParentNode": "請選擇父節點!", + "deleteChildFirst": "請先刪除子節點", + "pleaseSelectDetailFormData": "請先選擇一條從表數據!", + "pleaseSelectEditData": "請選擇要編輯的數據!", + "pleaseSelectViewData": "請選擇要查看的數據!", + "hasChangeCheckFaild": "在檢查頁面是否存在未保存的變更時發生錯誤!請確保數據已經保存。是否繼續關閉?", + "pleaseSelectCopyData": "請選擇要復制的數據!", + "unallowEmptyBizBillId": "請選擇要打印的數據!", + "required": "請輸入'$property'", + "maxLength": "'$property'的長度不得大於$constraint1", + "minLength": "'$property'的長度不得小於$constraint1个字符`", + "maxValue": "'$property'的值不應大於$constraint1", + "minValue": "'$property'的值不應小於$constraint1", + "maxDate": "'$property'的值不應晚於$constraint1", + "minDate": "'$property'的日期不應早於$constraint1", + "allVertifyMessages": "全部", + "errorTypeVertifyMessages": "錯填", + "emptyTypeVertifyMessages": "漏填", + "verifyMessageWithRowIndex": "第 $constraint1 行", + "pleaseSelectUpdateRow":"請選擇更新附件的行!", + "pleaseUploadFirst":"請先上傳附件!", + "pleaseSelectDownloadAttachment":"請選擇要下載的附件!", + "noDownloadAttachment":"找不到要下載的附件!", + "noAttachment":"沒有可以預覽的附件。", + "noParentData":"請選擇上級數據!" +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/locale/types.ts b/packages/ba-command-services/lib/locale/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..ffe0c3e988496fdf68cd4667215b5e15958a5447 --- /dev/null +++ b/packages/ba-command-services/lib/locale/types.ts @@ -0,0 +1,15 @@ +import { DEFAULT_LOCALE } from '@farris/devkit-vue'; + +export interface BaLocaleConfig { + locale: string; + fallbackLocale?: string; + uri?: string; +} +export const BA_DEFAULT_LOCALE_CONFIG: BaLocaleConfig = { + locale: DEFAULT_LOCALE, + fallbackLocale: DEFAULT_LOCALE, + uri: '/platform/common/web/@farris/i18n/command-services' +}; +export interface BaLocaleResources { + [key: string]: any; +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/providers.ts b/packages/ba-command-services/lib/providers.ts new file mode 100644 index 0000000000000000000000000000000000000000..897bdfadbffe721c149f3ed17e12ca5684432f9c --- /dev/null +++ b/packages/ba-command-services/lib/providers.ts @@ -0,0 +1,20 @@ +import { ViewModel, StaticProvider, Injector, BA_EXCEPTION_HANDLER_TOKEN, BA_DATA_TRANSFORMATION_SERVICE_TOKEN } from '@farris/devkit-vue'; +import { BaQueryDataService, BaContextService, BaRenderEngineService, BaFormNotifyService, BaFormLoadingService, BaFormMessageService, BaFormExceptionHandler, BaEntityChangeService, BaLinkageService, BaDataTransformationService } from './index'; + +const baCommandServiceRootProviders: StaticProvider[] = [ + { provide: BaFormNotifyService, useClass: BaFormNotifyService, deps: [Injector] }, + { provide: BaFormLoadingService, useClass: BaFormLoadingService, deps: [Injector] }, + { provide: BaFormMessageService, useClass: BaFormMessageService, deps: [Injector] }, + { provide: BA_DATA_TRANSFORMATION_SERVICE_TOKEN, useClass: BaDataTransformationService, deps: [] }, + { provide: BA_EXCEPTION_HANDLER_TOKEN, useClass: BaFormExceptionHandler, deps: [BaFormMessageService, BaFormLoadingService] }, +]; + +const baCommandServiceProviders: StaticProvider[] = [ + { provide: BaRenderEngineService, useClass: BaRenderEngineService, deps: [Injector] }, + { provide: BaEntityChangeService, useClass: BaEntityChangeService, deps: [ViewModel] }, + { provide: BaContextService, useClass: BaContextService, deps: [ViewModel, BaRenderEngineService] }, + { provide: BaQueryDataService, useClass: BaQueryDataService, deps: [ViewModel, BaFormLoadingService, BaFormMessageService, BaFormNotifyService, BaEntityChangeService] }, + { provide: BaLinkageService, useClass: BaLinkageService, deps: [ViewModel, BaFormLoadingService, BaFormMessageService, BaFormNotifyService, BaEntityChangeService] } +]; + +export { baCommandServiceRootProviders, baCommandServiceProviders }; diff --git a/packages/ba-command-services/lib/tokens.ts b/packages/ba-command-services/lib/tokens.ts new file mode 100644 index 0000000000000000000000000000000000000000..8ce3e16c46541af953c9502980aaebbd1f834731 --- /dev/null +++ b/packages/ba-command-services/lib/tokens.ts @@ -0,0 +1,6 @@ +import { InjectionToken } from '@farris/devkit-vue'; + +export const BA_MESSAGE_BOX_SERVICE_TOKEN = new InjectionToken('@farris/ba-command-services-message-box-service-token'); +export const BA_NOTIFY_SERVICE_TOKEN = new InjectionToken('@farris/ba-command-services-notify-service-token'); +export const BA_LOADING_SERVICE_TOKEN = new InjectionToken('@farris/ba-command-services-loading-service-token'); +export const BA_MODAL_SERVICE_TOKEN = new InjectionToken('@farris/ba-command-services-modal-service-token'); \ No newline at end of file diff --git a/packages/ba-command-services/lib/utils/ba-object-operate.service.ts b/packages/ba-command-services/lib/utils/ba-object-operate.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..10cacc14b6f2889fbcce70848900aa1842c86577 --- /dev/null +++ b/packages/ba-command-services/lib/utils/ba-object-operate.service.ts @@ -0,0 +1,149 @@ +interface Express { + kind: string; + expresses: Express[] | Compare[]; + operator: string; +} + +interface Compare { + expressType: number; + kind: string; + leftExpress: { + dataSource: string; + queryId: string; + datasetId: string; + columnName: string; + dataType: string; + }; + rightExpress: { + queryId: string; + datasetId: string; + value: string | null | undefined | any; + dataSource: string; + dataType: string; + }; + operator: string; +} + +export class BaObjectOperateService { + constructor() { + } + + public deepMerge(target: any, ...sources: any[]): any { + if (!sources.length) return target; + const source = sources.shift(); + + if (this.isMergeable(target) && this.isMergeable(source)) { + for (const key in source) { + if (this.isMergeable(source[key])) { + if (!target[key]) { + Object.assign(target, { [key]: {} }); + } + this.deepMerge(target[key], source[key]); + } else { + Object.assign(target, { [key]: source[key] }); + } + } + } + return this.deepMerge(target, ...sources); + } + + public jsonDeepMerge(target: any, source: any, replaceKey?: any) { + const isObject = (obj: any) => obj && typeof obj === 'object'; + + if (!isObject(target) || !isObject(source)) { + return source; + } + + Object.keys(source).forEach(key => { + const targetValue = target[key]; + const sourceValue = source[key]; + + if (Array.isArray(targetValue) && Array.isArray(sourceValue)) { + if (replaceKey && replaceKey === key) { + target[key] = sourceValue; + } else { + target[key] = targetValue.concat(sourceValue); + } + } else if (isObject(targetValue) && isObject(sourceValue)) { + target[key] = this.jsonDeepMerge(Object.assign({}, targetValue), sourceValue); + } else { + target[key] = sourceValue; + } + }); + + return target; + } + + private isMergeable(item: any): item is any { + return item && typeof item === 'object' && !Array.isArray(item); + } + + private mergeExpressions(base: Express | Compare | any, update: Express | Compare | any): Express { + const result: Express = { + kind: base.kind, + expresses: [], + operator: base.operator + }; + + for (const expr of update.expresses) { + let found = false; + for (let i = 0; i < result.expresses.length; i++) { + if (this.areExpressionsEqual(result.expresses[i], expr)) { + if (expr.kind === 'compare') { + const compareExpr: Compare = expr as any; + if (compareExpr.rightExpress.value === null || + compareExpr.rightExpress.value === undefined || + compareExpr.rightExpress.value === '') { + // 不合并该节点 + found = false; + break; + } else { + // 合并比较表达式 + result.expresses[i] = expr; + found = true; + break; + } + } else { + // 合并逻辑表达式 + result.expresses[i] = this.mergeExpressions(result.expresses[i], expr); + found = true; + break; + } + } + } + + if (!found) { + result.expresses.push(expr); + } + } + + return result; + } + + private areExpressionsEqual(a: Express | Compare | any, b: Express | Compare | any): boolean { + if (a.kind !== b.kind) { + return false; + } + if (a.kind !== 'compare' && b.kind !== 'compare') { + if (a.expresses.length !== b.expresses.length) { + return false; + } + for (let i = 0; i < a.expresses.length; i++) { + if (!this.areExpressionsEqual(a.expresses[i], b.expresses[i])) { + return false; + } + } + } else { + if (a.leftExpress.columnName === b.leftExpress.columnName && a.operator === b.operator) { + return true; + } else { + return false; + } + } + return true; + } + + public mergeJsonObjects(base: Express, update: Express): Express { + return this.mergeExpressions(base, update); + } +} \ No newline at end of file diff --git a/packages/ba-command-services/lib/utils/index.ts b/packages/ba-command-services/lib/utils/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c4914b0aca7539c2342c8152ff2e30a8f631db1e --- /dev/null +++ b/packages/ba-command-services/lib/utils/index.ts @@ -0,0 +1 @@ +export * from './ba-object-operate.service'; diff --git a/packages/ba-command-services/package.json b/packages/ba-command-services/package.json new file mode 100644 index 0000000000000000000000000000000000000000..7907f9a5c82410467eb4a041246294101ba22531 --- /dev/null +++ b/packages/ba-command-services/package.json @@ -0,0 +1,60 @@ +{ + "name": "@farris/ba-command-services-vue", + "private": true, + "version": "0.0.1", + "license": "Apache-2.0", + "description": "Render schema to web page with farris ui.", + "type": "module", + "keywords": [ + "farris", + "charts-command-services" + ], + "homepage": "https://farris-design.gitee.io/farris-vue/", + "repository": { + "type": "git", + "url": "git@gitee.com:ubml/farris-vue.git" + }, + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "build:lib": "node ./scripts/index.cjs build", + "preview": "vite preview", + "rollup": "rollup -c rollup.config.js" + }, + "dependencies": { + "@farris/bef-vue": "workspace:^", + "@farris/devkit-vue": "workspace:^", + "@farris/ui-vue": "workspace:^", + "@farris/charts-vue": "workspace:^", + "lodash": "^4.17.21", + "vue": "^3.4.37", + "vue-router": "^4.3.0", + "moment": "2.29.1", + "axios": "^1.7.2" + }, + "devDependencies": { + "@babel/cli": "^7.25.7", + "@babel/core": "^7.25.8", + "@babel/preset-env": "^7.25.8", + "@farris/cli": "workspace:*", + "@rollup/plugin-babel": "^6.0.4", + "@rollup/plugin-commonjs": "^28.0.1", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-terser": "^0.4.4", + "@vitejs/plugin-vue": "^5.1.2", + "core-js": "^3.38.1", + "lodash": "^4.17.21", + "rollup": "^4.24.0", + "rollup-plugin-typescript2": "^0.36.0", + "rollup-plugin-visualizer": "^5.12.0", + "rollup-plugin-vue": "^6.0.0", + "tslib": "^2.7.0", + "typescript": "^5.5.3", + "vite": "^5.4.1", + "vite-plugin-dts": "^2.1.0", + "vue-tsc": "^2.0.29" + }, + "types": "package/types/index.d.ts", + "module": "package/ba-command-services-vue.esm.js" +} \ No newline at end of file diff --git a/packages/ba-command-services/rollup.config.js b/packages/ba-command-services/rollup.config.js new file mode 100644 index 0000000000000000000000000000000000000000..910c1117573b3ec38f84b3a3017be86f317b32c1 --- /dev/null +++ b/packages/ba-command-services/rollup.config.js @@ -0,0 +1,69 @@ +import typescript from 'rollup-plugin-typescript2'; +import vue from 'rollup-plugin-vue'; +import resolve from "@rollup/plugin-node-resolve"; +import commonjs from '@rollup/plugin-commonjs'; +import babel from '@rollup/plugin-babel'; +import { + visualizer +} from "rollup-plugin-visualizer"; +import terser from "@rollup/plugin-terser"; +import json from '@rollup/plugin-json'; +import { createRequire } from 'node:module'; + +const require = createRequire(import.meta.url); +const { name } = require('./package.json'); + +const packageName = name.split('/')[1]; + +export default { + input: 'lib/index.ts', + external: ['@farris/devkit-vue', '@farris/bef-vue', '@farris/ui-vue', 'vue', 'tslib', 'lodash', '@gsp-svc/formdoc-upload-vue', '@gsp-svc/file-viewer-vue','axios','@gsp-svc/cloudprint-vue'], + output: [{ + file: `dist-rollup/@farris/ba-command-services-vue.js`, + format: 'system', + exports: 'auto', + banner: `/*! Last Update Time: ${new Date().toLocaleString()} */` + }], + plugins: [ + json(), + vue(), + resolve({ + extensions: ['.js', '.ts'], + preferBuiltins: true + }), + commonjs({ + include: 'node_modules/**' + }), + typescript({ + tsconfigOverride: { + compilerOptions: { + module: 'esnext', + target: 'es5', + useDefineForClassFields: false + } + }, + exclude: ['./src/**/*'] + }), + babel({ + presets: [ + [ + "@babel/preset-env", + { + loose: true + } + ] + ], + babelHelpers: 'bundled', + }), + visualizer({ + template: "sunburst", + filename: process.cwd() + `/dist-rollup/@farris/ba-command-services-vue.html`, + }), + // terser({ + // keep_fnames: true, + // format: { + // comments: /^!/ + // } + // }) + ], +}; diff --git a/packages/ba-command-services/scripts/commands/build.cjs b/packages/ba-command-services/scripts/commands/build.cjs new file mode 100644 index 0000000000000000000000000000000000000000..b55ff21145ab55b45564abf35c2eeb436e0d6e67 --- /dev/null +++ b/packages/ba-command-services/scripts/commands/build.cjs @@ -0,0 +1,65 @@ +const { resolve } = require("path"); +const fsExtra = require("fs-extra"); +const { omit } = require("lodash"); +const { build } = require("vite"); +const dts = require("vite-plugin-dts"); +const replace = require("../plugins/replace.cjs"); +const getViteConfig = require("./vite.config.cjs"); +const package = require("../../package.json"); + +const CWD = process.cwd(); + +const getVersion = () => { + const versionNums = package.version.split("."); + return versionNums + .map((num, index) => (index === versionNums.length - 1 ? +num + 1 : num)) + .join("."); +}; + +const createPackageJson = async (version) => { + package.version = getVersion(version); + package.main = "./ba-command-services-vue.umd.js"; + package.module = "./ba-command-services-vue.esm.js"; + package.style = "./style.css"; + package.dependencies = omit(package.dependencies, ""); + package.typings = "./types/index.d.ts"; + package.types = "./types/index.d.ts"; + package.private = false; + const fileStr = JSON.stringify( + omit(package, "scripts", "devDependencies"), + null, + 2 + ); + await fsExtra.outputFile( + resolve(CWD, "./package", `package.json`), + fileStr, + "utf-8" + ); +}; + +exports.build = async () => { + const lib = { + entry: resolve(CWD, "./lib/index.ts"), + name: "BaCommandServicesVue", + fileName: "ba-command-services-vue", + formats: ["esm", "umd"], + }; + + const outDir = resolve(CWD, "./package"); + const plugins = [dts({ + entryRoot: "./lib", + outputDir: resolve(CWD, "./package/types"), + include: [ + "./lib/**/*.ts", + "./lib/**/*.tsx", + "./lib/**/*.vue", + ], + noEmitOnError: false, + skipDiagnostics: true, + }), replace({ path: (format, args) => `.${args[1]}/index.${format}.js` })]; + const config = getViteConfig({ lib, outDir, plugins }); + + await build(config); + + await createPackageJson(); +}; diff --git a/packages/ba-command-services/scripts/commands/vite.config.cjs b/packages/ba-command-services/scripts/commands/vite.config.cjs new file mode 100644 index 0000000000000000000000000000000000000000..00e8f1527cfff2312d43c5d5504d1e6b3196ca0a --- /dev/null +++ b/packages/ba-command-services/scripts/commands/vite.config.cjs @@ -0,0 +1,59 @@ +const { resolve } = require("path"); +const { defineConfig } = require("vite"); +const vue = require("@vitejs/plugin-vue"); +const vueJsx = require("@vitejs/plugin-vue-jsx"); + +module.exports = function (options) { + const { lib, outDir, minify = false, plugins = [] } = options; + return defineConfig({ + configFile: false, + publicDir: false, + plugins: [ + vue(), + vueJsx(), + ...plugins + ], + resolve: { + alias: [{ find: "@", replacement: resolve(__dirname, "../../") }], + }, + build: { + target:"es2015", + lib, + outDir, + minify, + rollupOptions: { + // external: ["vue", "@vueuse/core", "@vue/shared", "dayjs"], + external: (id) => { + const items = [ + "vue", + "lodash", + "@vueuse/core", + "@vue/shared", + "dayjs", + "@/components", + "@farris/ui-vue", + "@farris/devkit-vue", + "@farris/bef", + "@farris/charts-vue", + "moment" + ]; + return items.find((item) => id.indexOf(item) === 0); + }, + output: { + exports: "named", + globals: (id) => { + if (id.includes('@/components')) { + const name = id.split('/').pop(); + return name.slice(0, 1).toUpperCase() + name.slice(1); + } + const map = { + vue: "Vue", + dayjs: "dayjs", + }; + return map[id]; + } + }, + }, + }, + }); +}; diff --git a/packages/ba-command-services/scripts/index.cjs b/packages/ba-command-services/scripts/index.cjs new file mode 100644 index 0000000000000000000000000000000000000000..18f7bb24d34c819ae2ca14ae2a1317a0cbebf7bc --- /dev/null +++ b/packages/ba-command-services/scripts/index.cjs @@ -0,0 +1,7 @@ +#!/usr/bin/env node +const { Command } = require('commander'); +const { build } = require('./commands/build.cjs'); + +const program = new Command(); +program.command('build').description('构建 Ba Command Services For Vue').action(build); +program.parse(); diff --git a/packages/ba-command-services/scripts/plugins/replace.cjs b/packages/ba-command-services/scripts/plugins/replace.cjs new file mode 100644 index 0000000000000000000000000000000000000000..7cdf449569399783c01f924f7e6eca32a39c6385 --- /dev/null +++ b/packages/ba-command-services/scripts/plugins/replace.cjs @@ -0,0 +1,12 @@ +module.exports = function replace({ path }) { + return { + name: 'ba-replace', + renderChunk(code, chunk) { + const fileNames = chunk.fileName.split('.'); + const format = fileNames[fileNames.length - 2]; + return code.replace(/@\/components(\/\w+)/g, (...args) => { + return path(format, args); + }); + } + }; +}; diff --git a/packages/ba-command-services/src/app.vue b/packages/ba-command-services/src/app.vue new file mode 100644 index 0000000000000000000000000000000000000000..e0a7a772e408d74bba46a3ddeca488913718af72 --- /dev/null +++ b/packages/ba-command-services/src/app.vue @@ -0,0 +1,11 @@ + + + + + diff --git a/packages/ba-command-services/src/assets/vue.svg b/packages/ba-command-services/src/assets/vue.svg new file mode 100644 index 0000000000000000000000000000000000000000..770e9d333ee70e75fe7c0bad7fb13e4f6ed4627a --- /dev/null +++ b/packages/ba-command-services/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/ba-command-services/src/main.ts b/packages/ba-command-services/src/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..6f0c8704a0877eb41cb392414a2b39de397162e7 --- /dev/null +++ b/packages/ba-command-services/src/main.ts @@ -0,0 +1,19 @@ +import { createApp } from 'vue'; +import FarrisUI from '@farris/ui-vue'; +import { createDevkit } from '@farris/devkit-vue'; +import '@farris/ui-vue/style.css'; +import router from './router/index'; +import './style.css'; +import App from './app.vue'; + +const app = createApp(App); +app.use(router); +// use farris ui +app.use(FarrisUI); + +// devkit +const devkit = createDevkit({ + providers: [] +}); +app.use(devkit); +app.mount('#app'); diff --git a/packages/ba-command-services/src/router/index.ts b/packages/ba-command-services/src/router/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..52c9e8461c2b7ca1e5ac0681f20b1166b601f696 --- /dev/null +++ b/packages/ba-command-services/src/router/index.ts @@ -0,0 +1,19 @@ +import { createRouter, createWebHistory } from 'vue-router'; +import List from '../views/list/list.vue'; +import Card from '../views/card/card.vue'; + +const router = createRouter({ + history: createWebHistory(), + routes: [ + { + path: '/', + component: List + }, + { + path: '/card', + component: Card + } + ] +}); + +export default router; diff --git a/packages/charts-vue/src/style.css b/packages/ba-command-services/src/style.css similarity index 100% rename from packages/charts-vue/src/style.css rename to packages/ba-command-services/src/style.css diff --git a/packages/ba-command-services/src/views/card/card.vue b/packages/ba-command-services/src/views/card/card.vue new file mode 100644 index 0000000000000000000000000000000000000000..688cf355d0a726e57ed17509dea4fa87f059664f --- /dev/null +++ b/packages/ba-command-services/src/views/card/card.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/packages/ba-command-services/src/views/card/viewmodel/card-entity-state.ts b/packages/ba-command-services/src/views/card/viewmodel/card-entity-state.ts new file mode 100644 index 0000000000000000000000000000000000000000..606d2cbb8d234287f8e50b4606dabbb445a1ef1e --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/card-entity-state.ts @@ -0,0 +1,8 @@ +import { EntityState } from '@farris/devkit-vue'; +import { MainEntity } from './entities/index'; + +export class CardEntityState extends EntityState { + constructor() { + super(MainEntity); + } +} diff --git a/packages/ba-command-services/src/views/card/viewmodel/card-form.ts b/packages/ba-command-services/src/views/card/viewmodel/card-form.ts new file mode 100644 index 0000000000000000000000000000000000000000..6ded16ffbfcef759a44fcfd1cc8b543419382303 --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/card-form.ts @@ -0,0 +1,63 @@ +import { Form, ControlProp, BindingType, FormControl, ViewModel } from '@farris/devkit-vue'; + +export class CardForm extends Form { + + constructor(viewModel: ViewModel) { + super(viewModel); + } + + @ControlProp({ + bindingType: BindingType.EntityState, + bindingPath: '/id' + }) + public id: FormControl; + + @ControlProp({ + bindingType: BindingType.EntityState, + bindingPath: '/version' + }) + public version: FormControl; + + @ControlProp({ + bindingType: BindingType.EntityState, + bindingPath: '/string1' + }) + public string1: FormControl; + + @ControlProp({ + bindingType: BindingType.EntityState, + bindingPath: '/string2' + }) + public string2: FormControl; + + @ControlProp({ + bindingType: BindingType.EntityState, + bindingPath: '/float1' + }) + public float1: FormControl; + + @ControlProp({ + bindingType: BindingType.EntityState, + bindingPath: '/number1' + }) + public number1: FormControl; + + @ControlProp({ + bindingType: BindingType.EntityState, + bindingPath: '/date1' + }) + public date1: FormControl; + + @ControlProp({ + bindingType: BindingType.EntityState, + bindingPath: '/dateTime1' + }) + public dateTime1: FormControl; + + @ControlProp({ + bindingType: BindingType.EntityState, + bindingPath: '/enum1' + }) + public enum1: FormControl; + +} diff --git a/packages/ba-command-services/src/views/card/viewmodel/card-proxy.ts b/packages/ba-command-services/src/views/card/viewmodel/card-proxy.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6868fb2e759b6e3b33d1b3ad5088b759e5be2d3 --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/card-proxy.ts @@ -0,0 +1,20 @@ +import { HttpClient } from '@farris/devkit-vue'; +import { BefProxy } from '@farris/bef-vue'; + +/** + * 代理 + */ +export class CardProxy extends BefProxy { + + /** + * 基路径地址 + */ + public baseUrl = '/api/webapp/formtemplate/v1.0/mainlist1_frm'; + + /** + * 构造函数 + */ + constructor(httpClient: HttpClient) { + super(httpClient); + } +} diff --git a/packages/ba-command-services/src/views/card/viewmodel/card-viewmodel.ts b/packages/ba-command-services/src/views/card/viewmodel/card-viewmodel.ts new file mode 100644 index 0000000000000000000000000000000000000000..98bb731511a8bc47d53c764ae86909c9335e12ce --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/card-viewmodel.ts @@ -0,0 +1,30 @@ +import { ViewModel, CommandAction } from '@farris/devkit-vue'; + +export class CardViewModel extends ViewModel { + public get inject() { + return this.injector; + } + + @CommandAction({ + name: 'add' + }) + public add() { } + + @CommandAction({ + name: 'edit', + params: { + id: '02b88225-fb84-45da-9109-1f8ee03d3565', + action: 'edit' + } + }) + public edit() { } + + @CommandAction({ + name: 'view', + params: { + id: '02b88225-fb84-45da-9109-1f8ee03d3565', + action: 'view' + } + }) + public view() { } +} diff --git a/packages/ba-command-services/src/views/card/viewmodel/card.repository.ts b/packages/ba-command-services/src/views/card/viewmodel/card.repository.ts new file mode 100644 index 0000000000000000000000000000000000000000..7d9869e23c6ba319750c9d228898ebe1220facf7 --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/card.repository.ts @@ -0,0 +1,16 @@ +import { ViewModel, Type } from '@farris/devkit-vue'; +import { BefProxy, BefRepository } from '@farris/bef-vue'; +import { MainEntity } from './entities/index'; +import { CardProxy } from './card-proxy'; + +export class CardRepository extends BefRepository { + + public entityType = MainEntity; + + public apiProxyType: Type = CardProxy; + + constructor(viewModel: ViewModel) { + super(viewModel); + } + +} diff --git a/packages/ba-command-services/src/views/card/viewmodel/entities/index.ts b/packages/ba-command-services/src/views/card/viewmodel/entities/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a616fb7ddd489c738230c18fb2b2cf949907cf8a --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/entities/index.ts @@ -0,0 +1 @@ +export * from './main-entity'; diff --git a/packages/ba-command-services/src/views/card/viewmodel/entities/main-entity.ts b/packages/ba-command-services/src/views/card/viewmodel/entities/main-entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..47fa79330922f2110ccaa31e5c6fb87883973331 --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/entities/main-entity.ts @@ -0,0 +1,68 @@ +import { Field, Entity } from '@farris/devkit-vue'; + +class MainEntity extends Entity { + + /** + * id + */ + @Field({ + primary: true + }) + public id: string; + + /** + * version + */ + @Field() + public version: string; + + /** + * string1 + */ + @Field() + public string1: string; + + /** + * string2 + */ + @Field() + public string2: string; + + /** + * float1 + */ + @Field() + public number1: any; + + /** + * float1 + */ + @Field() + public float1: any; + + /** + * bollean1 + */ + @Field() + public boolean1: any; + + /** + * date1 + */ + @Field() + public date1: any; + + /** + * dateTime1 + */ + @Field() + public dateTime1: string; + + /** + * enum1 + */ + @Field() + public enum1: any; +} + +export { MainEntity }; diff --git a/packages/ba-command-services/src/views/card/viewmodel/handlers/add.handler.ts b/packages/ba-command-services/src/views/card/viewmodel/handlers/add.handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..14b1215c87598ec892c813659b89beb061c06a17 --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/handlers/add.handler.ts @@ -0,0 +1,15 @@ +import { CommandContext, CommandHandler } from '@farris/devkit-vue'; +import { CreateDataService } from '../../../../../lib'; + +export class AddHandler extends CommandHandler { + + public name = 'add'; + + constructor(private createDataService: CreateDataService) { + super(); + } + + execute(context: CommandContext) { + return this.createDataService.create(); + } +} diff --git a/packages/ba-command-services/src/views/card/viewmodel/handlers/edit.handler.ts b/packages/ba-command-services/src/views/card/viewmodel/handlers/edit.handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..9f864808046a4439b06763582f8d96e959cd4fff --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/handlers/edit.handler.ts @@ -0,0 +1,17 @@ +import { CommandContext, CommandHandler } from '@farris/devkit-vue'; +import { LoadDataService } from '../../../../../lib/index'; + +export class EditHandler extends CommandHandler { + + public name = 'edit'; + + constructor(private loadDataService: LoadDataService) { + super(); + } + + execute(context: CommandContext) { + console.log('execute edit action'); + const { id = null } = context.command.params; + this.loadDataService.loadById(id); + } +} diff --git a/packages/ba-command-services/src/views/card/viewmodel/handlers/index.ts b/packages/ba-command-services/src/views/card/viewmodel/handlers/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..23f0c10421ad86be16667f93cb6b8728558190f7 --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/handlers/index.ts @@ -0,0 +1,4 @@ +export * from './add.handler'; +export * from './view.handler'; +export * from './edit.handler'; +export * from './load.handler'; diff --git a/packages/ba-command-services/src/views/card/viewmodel/handlers/load.handler.ts b/packages/ba-command-services/src/views/card/viewmodel/handlers/load.handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..1d9236e300933c679836be082338474c4768c581 --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/handlers/load.handler.ts @@ -0,0 +1,16 @@ +import { CommandContext, CommandHandler } from '@farris/devkit-vue'; +import { ParamService } from '../services/index'; + +export class LoadHandler extends CommandHandler { + + public name = 'load'; + + constructor(private paramService: ParamService) { + super(); + } + + execute(context: CommandContext) { + const { id = null, action = null } = this.paramService.parseQuery(); + if (action) { /* empty */ } + } +} diff --git a/packages/ba-command-services/src/views/card/viewmodel/handlers/view.handler.ts b/packages/ba-command-services/src/views/card/viewmodel/handlers/view.handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..73dcc23244aea595f690586ef40ffda1bc7eedd4 --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/handlers/view.handler.ts @@ -0,0 +1,17 @@ +import { CommandContext, CommandHandler } from '@farris/devkit-vue'; +import { LoadDataService } from '../../../../../lib/index'; + +export class ViewHandler extends CommandHandler { + + public name = 'view'; + + constructor(private loadDataService: LoadDataService) { + super(); + } + + execute(context: CommandContext) { + console.log('execute view action'); + const { id = null } = context.command.params; + this.loadDataService.loadById(id); + } +} diff --git a/packages/ba-command-services/src/views/card/viewmodel/index.ts b/packages/ba-command-services/src/views/card/viewmodel/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c7f638982c609d387e7b4bf3da79c5efc823b887 --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/index.ts @@ -0,0 +1,8 @@ +export * from './entities/index'; +export * from './services/index'; +export * from './handlers/index'; +export * from './card-entity-state'; +export * from './card-form'; +export * from './card-proxy'; +export * from './card.repository'; +export * from './card-viewmodel'; diff --git a/packages/ba-command-services/src/views/card/viewmodel/services/index.ts b/packages/ba-command-services/src/views/card/viewmodel/services/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..6fbcc01af02e86f68d5e6db613c43172a4fc7022 --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/services/index.ts @@ -0,0 +1 @@ +export * from './param.service'; diff --git a/packages/ba-command-services/src/views/card/viewmodel/services/param.service.ts b/packages/ba-command-services/src/views/card/viewmodel/services/param.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..dcc99f23680310517db645f79b2c607d8106109e --- /dev/null +++ b/packages/ba-command-services/src/views/card/viewmodel/services/param.service.ts @@ -0,0 +1,8 @@ +import { useRoute } from 'vue-router'; + +export class ParamService { + parseQuery() { + const route = useRoute(); + return route.query; + } +} diff --git a/packages/ba-command-services/src/views/list/list.vue b/packages/ba-command-services/src/views/list/list.vue new file mode 100644 index 0000000000000000000000000000000000000000..8092ef23ff0bf1f2115986a961addecb3fb77264 --- /dev/null +++ b/packages/ba-command-services/src/views/list/list.vue @@ -0,0 +1,171 @@ + + + + + + + diff --git a/packages/ba-command-services/src/views/list/viewmodel/entities/index.ts b/packages/ba-command-services/src/views/list/viewmodel/entities/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..a616fb7ddd489c738230c18fb2b2cf949907cf8a --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/entities/index.ts @@ -0,0 +1 @@ +export * from './main-entity'; diff --git a/packages/ba-command-services/src/views/list/viewmodel/entities/main-entity.ts b/packages/ba-command-services/src/views/list/viewmodel/entities/main-entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..9c9f750d788ae69c0bfdb6f71354873123364ac3 --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/entities/main-entity.ts @@ -0,0 +1,62 @@ +import { Field, Entity } from '@farris/devkit-vue'; + +class MainEntity extends Entity { + + /** + * id + */ + @Field({ + primary: true + }) + public id: string; + + /** + * version + */ + @Field() + public version: string; + + /** + * string1 + */ + @Field() + public string1: string; + + /** + * string2 + */ + @Field() + public string2: string; + + /** + * float1 + */ + @Field() + public float1: any; + + /** + * bollean1 + */ + @Field() + public boolean1: any; + + /** + * date1 + */ + @Field() + public date1: any; + + /** + * dateTime1 + */ + @Field() + public dateTime1: string; + + /** + * enum1 + */ + @Field() + public enum1: any; +} + +export { MainEntity }; diff --git a/packages/ba-command-services/src/views/list/viewmodel/handlers/add.handler.ts b/packages/ba-command-services/src/views/list/viewmodel/handlers/add.handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..dea6857f9f12864f97f69976143ed755f2c1a627 --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/handlers/add.handler.ts @@ -0,0 +1,19 @@ +import { CommandContext, CommandHandler } from '@farris/devkit-vue'; +import { ListService } from '../services/index'; + +export class AddHandler extends CommandHandler { + + public name = 'add'; + + constructor(private listService: ListService) { + super(); + } + + execute(context: CommandContext) { + const args = [ + '', + 'add' + ]; + return this.invoke(this.listService, 'navigate', args, context); + } +} diff --git a/packages/ba-command-services/src/views/list/viewmodel/handlers/edit.handler.ts b/packages/ba-command-services/src/views/list/viewmodel/handlers/edit.handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..effa0da0f4d1eabd3b187f39fbd704377201ae36 --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/handlers/edit.handler.ts @@ -0,0 +1,19 @@ +import { CommandContext, CommandHandler } from '@farris/devkit-vue'; +import { ListService } from '../services/index'; + +export class EditHandler extends CommandHandler { + + public name = 'edit'; + + constructor(private listService: ListService) { + super(); + } + + execute(context: CommandContext) { + const args = [ + '02b88225-fb84-45da-9109-1f8ee03d3565', + 'edit' + ]; + return this.invoke(this.listService, 'navigate', args, context); + } +} diff --git a/packages/ba-command-services/src/views/list/viewmodel/handlers/index.ts b/packages/ba-command-services/src/views/list/viewmodel/handlers/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..23f0c10421ad86be16667f93cb6b8728558190f7 --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/handlers/index.ts @@ -0,0 +1,4 @@ +export * from './add.handler'; +export * from './view.handler'; +export * from './edit.handler'; +export * from './load.handler'; diff --git a/packages/ba-command-services/src/views/list/viewmodel/handlers/load.handler.ts b/packages/ba-command-services/src/views/list/viewmodel/handlers/load.handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..0ae3a2f95b92b164eed39c2edd40e036e26daec9 --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/handlers/load.handler.ts @@ -0,0 +1,16 @@ +import { CommandContext, CommandHandler } from '@farris/devkit-vue'; +import { ListService } from '../services/index'; +import {LoadDataService} from '../../../../../lib/index'; + +export class LoadHandler extends CommandHandler { + + public name = 'load'; + + constructor(private loadDataService: LoadDataService) { + super(); + } + + execute(context: CommandContext) { + return this.loadDataService.load(); + } +} diff --git a/packages/ba-command-services/src/views/list/viewmodel/handlers/view.handler.ts b/packages/ba-command-services/src/views/list/viewmodel/handlers/view.handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..7fe436a2fc7c4950f4d981b9e3f641a4f8ca8eb7 --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/handlers/view.handler.ts @@ -0,0 +1,19 @@ +import { CommandContext, CommandHandler } from '@farris/devkit-vue'; +import { ListService } from '../services/index'; + +export class ViewHandler extends CommandHandler { + + public name = 'view'; + + constructor(private listService: ListService) { + super(); + } + + execute(context: CommandContext) { + const args = [ + '02b88225-fb84-45da-9109-1f8ee03d3565', + 'view' + ]; + return this.invoke(this.listService, 'navigate', args, context); + } +} diff --git a/packages/ba-command-services/src/views/list/viewmodel/index.ts b/packages/ba-command-services/src/views/list/viewmodel/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..100a3f4b0fe610548a67a10a47238d67baf5b815 --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/index.ts @@ -0,0 +1,6 @@ +export * from './services/index'; +export * from './handlers/index'; +export * from './list.repository'; +export * from './list-viewmodel'; +export * from './list-entity-state'; +export * from './list-ui-state'; diff --git a/packages/ba-command-services/src/views/list/viewmodel/list-entity-state.ts b/packages/ba-command-services/src/views/list/viewmodel/list-entity-state.ts new file mode 100644 index 0000000000000000000000000000000000000000..4c8437c1354b6f5b1a51b1e5326b6c1e90e15f7e --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/list-entity-state.ts @@ -0,0 +1,30 @@ +import { ref, Ref } from 'vue'; +import { EntityState } from '@farris/devkit-vue'; +import { MainEntity } from './entities/index'; + +/** + * 列表页实体状态 + */ +class ListEntityState extends EntityState { + + /** + * 数据源 + */ + public data: Ref; + + /** + * 当前实体 + */ + public current: Ref; + + /** + * 构造函数 + */ + constructor() { + super(MainEntity); + this.data = ref(this.entityList.toJSON()); + this.current = ref(null); + } +} + +export { ListEntityState }; diff --git a/packages/ba-command-services/src/views/list/viewmodel/list-proxy.ts b/packages/ba-command-services/src/views/list/viewmodel/list-proxy.ts new file mode 100644 index 0000000000000000000000000000000000000000..f79b3c5c8bd4ff1ec48f2da0c5a035d428d6bd0a --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/list-proxy.ts @@ -0,0 +1,20 @@ +import { HttpClient } from '@farris/devkit-vue'; +import { BefProxy } from '@farris/bef-vue'; + +/** + * 代理 + */ +export class ListProxy extends BefProxy { + + /** + * 基路径地址 + */ + public baseUrl = '/api/webapp/formtemplate/v1.0/mainlist1_frm'; + + /** + * 构造函数 + */ + constructor(httpClient: HttpClient) { + super(httpClient); + } +} diff --git a/packages/ba-command-services/src/views/list/viewmodel/list-ui-state.ts b/packages/ba-command-services/src/views/list/viewmodel/list-ui-state.ts new file mode 100644 index 0000000000000000000000000000000000000000..8c6d43ecc0f58e6caf6e3f5b9a2f5f8f28dc85d4 --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/list-ui-state.ts @@ -0,0 +1,16 @@ +import { UIState } from '@farris/devkit-vue'; + +/** + * 员工列表UI状态 + */ +class ListUIState extends UIState { + + /** + * 构造函数 + */ + constructor() { + super(); + } +} + +export { ListUIState }; diff --git a/packages/ba-command-services/src/views/list/viewmodel/list-viewmodel.ts b/packages/ba-command-services/src/views/list/viewmodel/list-viewmodel.ts new file mode 100644 index 0000000000000000000000000000000000000000..79a067c6ad7656a5fffc551f3975ae22d343eece --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/list-viewmodel.ts @@ -0,0 +1,88 @@ +import { State, Getter, Action, CommandAction, ViewModel, EntityList } from '@farris/devkit-vue'; + +/** + * 列表视图模型 + */ +class ListViewModel extends ViewModel { + /** + * 部门信息 + */ + @State() + public deptInfo: any = { id: '', name: '' }; + + /** + * 数据源 + */ + @State() + public data: any[] = []; + + /** + * 总数 + */ + @Getter() + public get total(): number { + return this.data.length; + }; + + /** + * 加载数据 + */ + @Action() + public load1() { + // 加载部门数据 + this.deptInfo = { + id: '0001', + name: '产品研发部' + }; + } + + @CommandAction({ + name: 'load', + params: {} + }) + public load() { } + + @CommandAction({ + name: 'add', + params: {} + }) + public add() { } + + /** + * 打开卡片查看 + */ + @CommandAction({ + name: 'view', + params: { + id: '0001', + action: 'view' + } + }) + public view() { } + + /** + * 打开卡片编辑 + */ + @CommandAction({ + name: 'edit', + params: { + id: '0001', + action: 'edit' + } + }) + public edit() { } + + /** + * 打开卡片 + */ + @CommandAction({ + name: 'remove', + params: { + id: '0001' + } + }) + public remove() { } + +} + +export { ListViewModel }; diff --git a/packages/ba-command-services/src/views/list/viewmodel/list.repository.ts b/packages/ba-command-services/src/views/list/viewmodel/list.repository.ts new file mode 100644 index 0000000000000000000000000000000000000000..e890bd98f9fba5fde2b0ed821f562cbbb6fc7973 --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/list.repository.ts @@ -0,0 +1,27 @@ +import { ViewModel } from '@farris/devkit-vue'; +import {BefRepository} from '@farris/bef-vue'; +import { MainEntity } from './entities/index'; +import { ListProxy } from './list-proxy'; + +/** + * 员工实体仓库 + */ +class ListRepository extends BefRepository { + + public apiProxyType = ListProxy; + + /** + * Entity类型 + */ + public entityType = MainEntity; + + /** + * 构造函数 + */ + constructor(viewModel: ViewModel) { + super(viewModel); + } + +} + +export { ListRepository }; diff --git a/packages/ba-command-services/src/views/list/viewmodel/services/index.ts b/packages/ba-command-services/src/views/list/viewmodel/services/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..032a0985a470858e2b4ff91b6ebcc7fc5339d9ce --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/services/index.ts @@ -0,0 +1 @@ +export * from './list.service'; diff --git a/packages/ba-command-services/src/views/list/viewmodel/services/list.service.ts b/packages/ba-command-services/src/views/list/viewmodel/services/list.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..ceef8e080869f7b3bc7534724c94cdca3bf969cd --- /dev/null +++ b/packages/ba-command-services/src/views/list/viewmodel/services/list.service.ts @@ -0,0 +1,22 @@ +import router from '../../../../router/index'; + +/** + * 主实体服务 + */ +export class ListService { + public navigate(id: string, action: string) { + const params: any = { action }; + if (id) { + params.id = id; + } + router.push({ path: '/card', query: params }); + } + + public load() { + + } + + public loadData(content: string) { + console.log('EmployeeService=>test】: ' + content); + } +} diff --git a/packages/ba-command-services/src/vite-env.d.ts b/packages/ba-command-services/src/vite-env.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..14fa74923045e334cfac26387dd5aa8ad993b403 --- /dev/null +++ b/packages/ba-command-services/src/vite-env.d.ts @@ -0,0 +1 @@ +// / diff --git a/packages/ba-command-services/tsconfig.json b/packages/ba-command-services/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..bcb316126f8297574312bb3943d5a3af9d0d6577 --- /dev/null +++ b/packages/ba-command-services/tsconfig.json @@ -0,0 +1,43 @@ +{ + "compilerOptions": { + "target": "es5", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": false, + "esModuleInterop": true, + "lib": [ + "ESNext", + "DOM", + "dom.iterable", + "scripthost" + ], + "skipLibCheck": true, + "importHelpers": true, + "experimentalDecorators": true, + "strictPropertyInitialization": false, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "types": [ + "vitest/globals", + "@farris/bef-vue", + "@farris/devkit-vue" + ] + }, + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "src/**/*.tsx", + "src/**/*.vue", + "test/**/*.ts" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] +} \ No newline at end of file diff --git a/packages/ba-command-services/tsconfig.node.json b/packages/ba-command-services/tsconfig.node.json new file mode 100644 index 0000000000000000000000000000000000000000..e564a46d42f4a0a956d65eefef31c8881480e61b --- /dev/null +++ b/packages/ba-command-services/tsconfig.node.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "strict": true, + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "verbatimModuleSyntax": false, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true + }, + "include": [ + "vite.config.ts" + ] +} \ No newline at end of file diff --git a/packages/ba-command-services/vite.config.ts b/packages/ba-command-services/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..2a9715eace1f6d26c048119672665acc598a4c97 --- /dev/null +++ b/packages/ba-command-services/vite.config.ts @@ -0,0 +1,26 @@ +import { defineConfig } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import path from 'path'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [vue()], + server: { + proxy: { + "/api": { + target: "http://10.110.87.52:5200", + changeOrigin: true, + secure: false, + headers:{ + Cookie:'caf_web_session=OTViOThmNDMtY2YwZC00YmJmLWFjM2EtZmM0NTgwNWM5OGU5' + } + } + } + }, + resolve: { + alias: { + "@farris/devkit-vue": path.resolve(__dirname, "../devkit/lib/index"), + "@farris/bef-vue": path.resolve(__dirname, "../bef/lib/index") + } + } +}); diff --git a/packages/bef/lib/ba/ba-proxy-extend.ts b/packages/bef/lib/ba/ba-proxy-extend.ts new file mode 100644 index 0000000000000000000000000000000000000000..04887b47fa0de9efda4b68befc2b6a86d1eb1d88 --- /dev/null +++ b/packages/bef/lib/ba/ba-proxy-extend.ts @@ -0,0 +1,72 @@ +import { HttpHeaders, Entity, ExceptionHandler, EXCEPTION_HANDLER_TOKEN, Devkit, BA_EXCEPTION_HANDLER_TOKEN } from '@farris/devkit-vue'; +import { ResponseInfo } from '../types'; +import { RequestInfoUtil, ResponseInfoUtil } from '../utils'; +import { BaRepository } from './ba-repository'; +import { FrameworkSessionService } from '../framework-session.service'; +import { IProxyExtend } from '../bef-proxy-extend'; +import { BaSessionManager } from './session'; + +export class BaProxyExtend implements IProxyExtend { + private frameworkSessionService: FrameworkSessionService; + /** + * 构造函数 + */ + constructor(private repository: BaRepository) { + this.frameworkSessionService = new FrameworkSessionService(); + } + + extendBody(body: any) { + return RequestInfoUtil.appendRequestInfoToBody(body, this.repository); + } + extendHeaders(headers: any): Promise { + const tabId = this.frameworkSessionService.tabId; + const runtimeContext: any = {}; + if (tabId) { + runtimeContext.tabId = tabId; + } + const beBaseUri = this.repository.apiProxy.baseUrl; + const moduleId = this.repository.module.getId(); + + // ToDo: 统一查询平台没有bef SessionId + // const sessionIdPromise = BaSessionManager.getSessionId(moduleId, this.repository.sessionService, beBaseUri, runtimeContext).then(() => { + // headers = this.repository.sessionService.extendRequestHeaders(headers, runtimeContext); + // return headers; + // }); + headers = this.repository.sessionService.extendRequestHeaders(headers, runtimeContext); + + return Promise.resolve(headers); + } + onResponse(response: any, hasRequestInfo?: boolean) { + this.handleResponseHeaders(response.headers); + + return this.handleResponseBody(response.body); + } + onError(error: any, selfHandError: boolean, ignoreError: boolean): Promise { + if (selfHandError) { + return Promise.reject(error); + } + if (ignoreError) { + return Promise.resolve(); + } + // 处理公共异常 + const injector = this.repository.module.getInjector(); + if (!injector) { + return Promise.reject(error); + } + const exceptionHandler = injector.get(BA_EXCEPTION_HANDLER_TOKEN); + if (!exceptionHandler) { + return Promise.reject(error); + } + exceptionHandler.handle(error); + return Promise.reject(error); + } + private handleResponseHeaders(headers: any): void { + this.repository.sessionService.handleResponseHeaders(headers); + } + private handleResponseBody(responseInfo: ResponseInfo): ResponseInfo { + if (responseInfo && responseInfo.hasOwnProperty('returnValue')) { + return responseInfo.returnValue; + } + return responseInfo; + } +} \ No newline at end of file diff --git a/packages/bef/lib/ba/ba-proxy.ts b/packages/bef/lib/ba/ba-proxy.ts new file mode 100644 index 0000000000000000000000000000000000000000..7358f56ef4e62d73065f15ec413a44e76ee06613 --- /dev/null +++ b/packages/bef/lib/ba/ba-proxy.ts @@ -0,0 +1,137 @@ +import { HttpParams, HttpMethod, HttpMethods, HttpRequestConfig, HttpClient } from '@farris/devkit-vue'; +import { ContentType, ResponseInfo } from '../types'; +import { IProxyExtend } from '../bef-proxy-extend'; +import { RequestInfoUtil } from '../utils/request-info.util'; + +class BaProxy { + public baseUrl: string; + + protected proxyExtend: IProxyExtend; + + constructor(public httpClient: HttpClient) { } + + public init(baseUrl: string) { + this.baseUrl = baseUrl; + } + + public setProxyExtend(proxyExtend: IProxyExtend) { + this.proxyExtend = proxyExtend; + } + + public extendQuery(entityFilter: any): Promise { + return this.wrapAsync(() => { + const url = `${this.baseUrl}/extension/query`; + const params: HttpParams = {}; + if (entityFilter) { + const entityFilterString = JSON.stringify(entityFilter); + params.entityFilter = entityFilterString; + } + const bodyWithRequestInfo = this.proxyExtend.extendBody({}); + const requestConfig: HttpRequestConfig = { + params, + body: bodyWithRequestInfo + }; + return this.request(HttpMethods.PUT, url, requestConfig); + }); + } + + private wrapAsync(asyncFunction: () => Promise): Promise { + return new Promise((resolve, reject) => asyncFunction().then(resolve).catch(reject)); + } + + public queryData(params: any): Promise { + return this.wrapAsync(() => { + const url = `${this.baseUrl}/datas`; + const bodyWithRequestInfo = this.proxyExtend.extendBody(params); + const requestConfig: HttpRequestConfig = { + body: bodyWithRequestInfo + }; + return this.request(HttpMethods.POST, url, requestConfig); + }); + } + + public queryDataByCrosstab(params: any): Promise { + return this.wrapAsync(() => { + const url = `${this.baseUrl}/datas/crosstable`; + const bodyWithRequestInfo = this.proxyExtend.extendBody(params); + const requestConfig: HttpRequestConfig = { + body: bodyWithRequestInfo + }; + return this.request(HttpMethods.POST, url, requestConfig); + }); + } + + public request(method: HttpMethod, url: string, requestConfigs: HttpRequestConfig = {}, ignoreHandlingChanges = false, selfHandError: boolean = false, ignoreError: boolean = false): Promise { + this.setContentType(requestConfigs); + // 扩展headers + const resultPromise = this.proxyExtend.extendHeaders(requestConfigs.headers).then((headers: any) => { + requestConfigs.headers = headers; + requestConfigs.observe = 'response'; + return this.httpClient.request(method, url, requestConfigs).then((result: any) => { + if (ignoreHandlingChanges === true) { + return result && result.body && result.body.returnValue ? result.body.returnValue : result; + } + const hasRequestInfo = RequestInfoUtil.hasRequestInfo(requestConfigs); + return this.proxyExtend.onResponse(result, hasRequestInfo); + }).catch((error: any) => { + return this.proxyExtend.onError(error, selfHandError, ignoreError); + }); + }); + + return resultPromise; + } + + private setContentType(requestConfigs: HttpRequestConfig = {}) { + // 开发以及配置过content-type + if (requestConfigs.headers != null && (requestConfigs.headers['Content-Type'] != null || requestConfigs.headers['content-type'] != null)) { + return; + } + const detectedContentType = this.detectContentType(requestConfigs); + switch (detectedContentType) { + case ContentType.NONE: + break; + case ContentType.JSON: + requestConfigs.headers = Object.assign({}, requestConfigs.headers, { 'Content-Type': 'application/json' }); + break; + case ContentType.FORM: + requestConfigs.headers = Object.assign({}, requestConfigs.headers, { 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' }); + break; + case ContentType.TEXT: + requestConfigs.headers = Object.assign({}, requestConfigs.headers, { 'Content-Type': 'text/plain' }); + break; + case ContentType.BLOB: + const blob = requestConfigs.body as Blob; + if (blob && blob.type) { + requestConfigs.headers = Object.assign({}, requestConfigs.headers, { 'Content-Type': blob.type }); + } + break; + } + } + + private detectContentType(requestConfigs: HttpRequestConfig = {}): ContentType { + const body = requestConfigs.body || null; + if (body == null) { + return ContentType.NONE; + } + else if (body instanceof URLSearchParams) { + return ContentType.FORM; + } + else if (body instanceof FormData) { + return ContentType.FORM_DATA; + } + else if (body instanceof Blob) { + return ContentType.BLOB; + } + else if (body instanceof ArrayBuffer) { + return ContentType.ARRAY_BUFFER; + } + else if (body && typeof body === 'object') { + return ContentType.JSON; + } + else { + return ContentType.TEXT; + } + } +} + +export { BaProxy }; \ No newline at end of file diff --git a/packages/bef/lib/ba/ba-repository-config.ts b/packages/bef/lib/ba/ba-repository-config.ts new file mode 100644 index 0000000000000000000000000000000000000000..5bda1cfa1da0e251175e50ed9e2c712b1f5d6514 --- /dev/null +++ b/packages/bef/lib/ba/ba-repository-config.ts @@ -0,0 +1,14 @@ +import { Type, RepositoryConfig } from '@farris/devkit-vue'; +import { BaProxy } from './ba-proxy'; +import { BefVariableConfig } from '../bef-repository-config'; + +/** + * Bef远程仓库配置 + */ +interface BaRepositoryConfig extends RepositoryConfig { + baseUrl: string; + variables: BefVariableConfig[]; + apiProxyType?: Type; +} + +export { BaRepositoryConfig }; diff --git a/packages/bef/lib/ba/ba-repository.ts b/packages/bef/lib/ba/ba-repository.ts new file mode 100644 index 0000000000000000000000000000000000000000..2918b5ad479b0bef38412a211948cca1fe6b8ce2 --- /dev/null +++ b/packages/bef/lib/ba/ba-repository.ts @@ -0,0 +1,194 @@ +import { + Type, Injector, HttpClient, Entity, RepositoryConfig, Repository, createEntitiesBySchema, EntityListFieldSchema, Module, + HttpMethods +} from '@farris/devkit-vue'; +import { BaProxy } from './ba-proxy' +import { BaProxyExtend } from './ba-proxy-extend' +import { FrameworkSessionService } from '../framework-session.service'; +import { BaSessionService } from './session/ba_session_service'; +import { BaSessionHandlingStrategyFactory } from './session'; + +class BaRepository extends Repository { + public apiProxyType: Type; + + private injector: Injector; + + public sessionService: any; + + public apiProxy: BaProxy; + + /** + * 分页信息 + */ + public paginationInfo: any = null; + + constructor(module: Module) { + super(module); + this.injector = module.getInjector(); + } + + public init(config: RepositoryConfig) { + super.init(config); + this.initApiProxy(config); + this.initPaginationInfo(); + this.initSessionService(); + if (config["isVirtualEntity"] && config["isVirtualEntity"] == true) { + this.addVirtualEntity(); + } + } + + private initApiProxy(config: RepositoryConfig) { + if (config.isDynamic) { + this.apiProxy = this.injector.get(BaProxy); + this.apiProxy.init(config.baseUrl); + + } else { + this.apiProxy = this.injector.get(config.apiProxyType); + } + const proxyExtendType = new BaProxyExtend(this); + this.apiProxy.setProxyExtend(proxyExtendType); + } + + private initSessionService() { + const handlingStrategyName = 'SeparatedSession'; + const frmSessionService = new FrameworkSessionService(); + const httpClient = this.injector.get(HttpClient); + const baseUrl = `${this.apiProxy.baseUrl}`; + const sessionHandlingStrategyFactory = new BaSessionHandlingStrategyFactory(); + const sessionHandlingStrategy = sessionHandlingStrategyFactory.create(handlingStrategyName, frmSessionService, baseUrl, httpClient, this.injector); + this.sessionService = new BaSessionService(sessionHandlingStrategy); + } + + /** + * 初始化分页信息 + */ + private initPaginationInfo() { + const pagination = this.paginationInfo || {}; + this.entityStore.setEntityPagination(pagination); + } + + public getEntities(queryParams: any, sourceType?: string): Promise { + const currentPagination = this.entityStore.getPaginationByPath('/'); + if (currentPagination) { + if (queryParams.pagination && queryParams.pagination.hasOwnProperty('page')) { + queryParams.pagination['page']['size'] = typeof queryParams.pagination['page']['size'] === 'number' ? queryParams.pagination['page']['size'] : (currentPagination.pageIndex || 1); + queryParams.pagination['page']['number'] = typeof queryParams.pagination['page']['number'] === 'number' ? queryParams.pagination['page']['number'] : (currentPagination.pageIndex || 1); + } + } + const entityFilter = this.buildEntityFilter(queryParams.columns, queryParams.virtualComputeColumns, queryParams.queryCondition, queryParams.filterCondition, queryParams.sortColumns, queryParams.context, queryParams.pagination, queryParams.treeCondition); + const params = { + queryjson: entityFilter ? JSON.stringify(entityFilter) : "{}" + }; + const proxy = sourceType && sourceType === 'Crosstab' ? this.apiProxy.queryDataByCrosstab : this.apiProxy.queryData; + const queryPromise = proxy.call(this.apiProxy, params).then((returnValue: any) => { + const datas = returnValue.data; + const header = returnValue.header; + const totalRowCount = returnValue.totalRowCount; + const entityDatas: any = []; + if (datas && datas.length && header && header.length) { + const idHeader = header.find((el) => { return el.columnName === "id" }) ?? {}; + const flag = idHeader && idHeader.hasOwnProperty("columnName"); + for (let i = 0; i < datas.length; i++) { + const row = {}; + for (let j = 0; j < datas[i].length; j++) { + row[header[j].columnName] = datas[i][j]; + } + if (!flag) { + row["id"] = this.guid(); + } + entityDatas.push(row); + } + } + // if (sourceType && sourceType === 'Crosstab') { + const entityStoreCode = this.entityStore.getEntitySchema().code; + this.changeEntityStoreConfig(entityStoreCode, entityDatas); + this.updateEntitySchema(this.module.getEntityStore(entityStoreCode + "-entitystore")?.getEntitySchema()); + // } + const entities = this.buildEntites(entityDatas); + // 更新分页信息 + const serverPagination: any = { + totalCount: totalRowCount ?? 0 + }; + if (serverPagination) { + this.entityStore.setPaginationByPath('/', serverPagination); + } + return entities; + }); + return queryPromise; + } + + private buildEntityFilter(columns: any[], virtualComputeColumns: any[], queryCondition?: any[], filterCondition?: any[], sortColumns?: any[], context?: any, pagination?: any, treeCondition?: any) { + const entityFilter = { + columns: columns, + virtualComputeColumns: virtualComputeColumns, + sortColumns: sortColumns || [], + queryCondition: queryCondition || [], + filterCondition: filterCondition || [], + treeCondition: treeCondition || {}, + context: context, + pagination: pagination, + }; + + return entityFilter; + } + + public createVirtualEntity(defaultValue?: any): Promise { + const entity = this.buildEntity(defaultValue); + return Promise.resolve(entity); + } + + private guid(prefix = ""): string { + let timestamp = Date.now(); + return prefix + 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.substr(prefix.length).replace(/[xy]/g, function (c) { + const random = (timestamp + Math.random() * 16) % 16 | 0; + timestamp = Math.floor(timestamp / 16); + return (c === 'x' ? random : (random & 3 | 8)).toString(16); + }); + } + + private changeEntityStoreConfig(code: string, entityDatas: any[]) { + const moduleConfig = this.module.getConfigManager().getModuleConfig(); + if (moduleConfig && moduleConfig.entityStores.length) { + const entityStoreKey = code + "-entitystore"; + const index = moduleConfig.entityStores.findIndex((el) => { + return el.id === entityStoreKey; + }); + if (index >= 0 && entityDatas && entityDatas.length) { + const newFields: any[] = []; + if (moduleConfig.entityStores[index]["state"] && moduleConfig.entityStores[index]["state"]["entity"] && moduleConfig.entityStores[index]["state"]["entity"]["fields"]) { + for (let key in entityDatas[0]) { + newFields.push({ + name: key, + type: "Primitive", + multiLangeuage: false + }) + } + + moduleConfig.entityStores[index]["state"]["entity"]["fields"] = [...newFields]; + + this.module.getEntityStore(entityStoreKey)?.init(moduleConfig.entityStores[index]); + } + + } + } + } + + public addVirtualEntity() { + const entitySchema = this.entitySchema.getFieldSchemas(); + const defaultValue: any = {}; + if (entitySchema && entitySchema.length) { + entitySchema.forEach((el: any) => { + if (el.name === "id") { + defaultValue[el.name] = new Date().getTime(); + } else { + defaultValue[el.name] = ""; + } + }); + } + const entity = this.buildEntity(defaultValue); + this.entityStore.loadEntities([]); + this.entityStore.appendEntities([entity]); + } +} + +export { BaRepository }; diff --git a/packages/bef/lib/ba/index.ts b/packages/bef/lib/ba/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..1e9f37e606b15a78185201746f206b9f596685e5 --- /dev/null +++ b/packages/bef/lib/ba/index.ts @@ -0,0 +1,5 @@ +export * from './ba-proxy'; +export * from './ba-proxy-extend'; +export * from './ba-repository'; +export * from './ba-repository-config'; +export * from './session/index'; \ No newline at end of file diff --git a/packages/bef/lib/ba/session/ba_session_manager.ts b/packages/bef/lib/ba/session/ba_session_manager.ts new file mode 100644 index 0000000000000000000000000000000000000000..cf94cc6532a56217e726a55776179e9ba6e7dd0e --- /dev/null +++ b/packages/bef/lib/ba/session/ba_session_manager.ts @@ -0,0 +1,16 @@ +import { RuntimeContext } from '../../types'; +import { BaSessionService } from './ba_session_service'; + +export class BaSessionManager { + private static history: string[] = []; + public static getSessionId(moduleId: string, sessionService: BaSessionService, beBaseUri: string, runtimeContext?: RuntimeContext): Promise { + const key = `${moduleId}_${beBaseUri}`; + const createSessionIsInvoked = this.history.includes(key); + if (createSessionIsInvoked) { + return Promise.resolve(null); + } else { + this.history.push(key); + return sessionService.getBeSessionId(runtimeContext); + } + } + } \ No newline at end of file diff --git a/packages/bef/lib/ba/session/ba_session_service.ts b/packages/bef/lib/ba/session/ba_session_service.ts new file mode 100644 index 0000000000000000000000000000000000000000..b7a2478a90dc68a02d0716d3862b53d9b6fc33d4 --- /dev/null +++ b/packages/bef/lib/ba/session/ba_session_service.ts @@ -0,0 +1,65 @@ +import { RuntimeContext } from '../../types'; +import { BaSessionHandlingStrategy } from './handling-strategies/ba-handling-strategy'; + +/** + * BE会话服务 + */ +class BaSessionService { + + /** + * Session处理策略类 + */ + private handlingStrategy: BaSessionHandlingStrategy; + + /** + * 构造函数 + */ + constructor(handlingStrategy: BaSessionHandlingStrategy) { + this.handlingStrategy = handlingStrategy; + } + + /** + * 获取token + */ + public get token() { + return this.handlingStrategy.getFrameworkSessionId(); + } + + /** + * 获取BeSessionId + */ + public getBeSessionId(runtimeContext?: RuntimeContext): Promise { + return this.handlingStrategy.getSessionId(runtimeContext); + } + + /** + * 设置sessionId + * @param sessionId sessionId + */ + public setBeSessionId(sessionId: string, runtimeContext?: RuntimeContext) { + this.handlingStrategy.setSessionId(sessionId, runtimeContext); + } + + /** + * 清空BeSessionId + */ + public clearBeSessionId(runtimeContext?: RuntimeContext) { + this.handlingStrategy.clearSessionId(runtimeContext); + } + + /** + * 扩展请求header + */ + public extendRequestHeaders(headers: any, runtimeContext?: RuntimeContext): any { + return this.handlingStrategy.handleRequestHeaders(headers, runtimeContext); + } + + /** + * 处理响应header + */ + public handleResponseHeaders(headers: any): void { + return this.handlingStrategy.handleReponseHeaders(headers); + } +} + +export { BaSessionService }; diff --git a/packages/bef/lib/ba/session/handling-strategies/ba-handling-strategy-factory.ts b/packages/bef/lib/ba/session/handling-strategies/ba-handling-strategy-factory.ts new file mode 100644 index 0000000000000000000000000000000000000000..e5f1992a77cb6ee21d92f33a796611e53fc2b880 --- /dev/null +++ b/packages/bef/lib/ba/session/handling-strategies/ba-handling-strategy-factory.ts @@ -0,0 +1,38 @@ +import { HttpClient, Injector } from '@farris/devkit-vue'; +import { FrameworkSessionService } from '../../../framework-session.service'; +import { BaSessionStorageStrategy } from '../storage-strategies/index'; +import { BaSeparatedSessionHandlingStrategy } from './ba-separated-session-handling-strategy'; +import { BaUnifiedSessionHandlingStrategy } from './ba-unified-session-handling-strategy'; +import { BaSessionHandlingStrategy } from './ba-handling-strategy'; + +/** + * BeSession处理策略工厂 + */ +class BaSessionHandlingStrategyFactory { + /** + * 创建BeSession处理策略 + */ + public create( + handlingStrategyName: string, + frmSessionService: FrameworkSessionService, + beBaseUrl: string, + httpClient: HttpClient, + injector: Injector + ): BaSessionHandlingStrategy { + const storageStrategy = this.createStorageStrategy(); + if (handlingStrategyName === 'UnifiedSession') { + return new BaUnifiedSessionHandlingStrategy(storageStrategy, frmSessionService, httpClient, beBaseUrl, injector); + } else { + return new BaSeparatedSessionHandlingStrategy(storageStrategy, frmSessionService, httpClient, beBaseUrl, injector); + } + } + + /** + * 创建BeSession缓存策略 + */ + private createStorageStrategy(): BaSessionStorageStrategy { + return new BaSessionStorageStrategy(); + } +} + +export { BaSessionHandlingStrategyFactory }; diff --git a/packages/bef/lib/ba/session/handling-strategies/ba-handling-strategy.ts b/packages/bef/lib/ba/session/handling-strategies/ba-handling-strategy.ts new file mode 100644 index 0000000000000000000000000000000000000000..bad89871fdeb8596b54ed3e08b8c21f786df0387 --- /dev/null +++ b/packages/bef/lib/ba/session/handling-strategies/ba-handling-strategy.ts @@ -0,0 +1,100 @@ +import { HttpHeaders, HttpClient, Injector } from '@farris/devkit-vue'; +import { FrameworkSessionService } from '../../../framework-session.service'; +import { BaSessionStorageStrategy } from '../storage-strategies/index'; +import { RuntimeContext } from '../../../types'; + +/** + * 会话处理策略类 + */ +abstract class BaSessionHandlingStrategy { + + /** + * 存储策略 + */ + protected storageStrategy: BaSessionStorageStrategy; + + /** + * 框架Session服务 + */ + protected frameworkSessionService: FrameworkSessionService; + + /** + * Http客户端 + */ + protected httpClient: HttpClient; + + /** + * 创建Session的的EAPI地址 + */ + protected baseUrl: string; + + /** + * 创建Session接口地址 + */ + protected createSessionUrl: string; + + /** + * 关闭Session接口地址 + */ + protected closeSessionUrl: string; + /** + * 上次使用的会话id + */ + protected lastTimeUsedSessionId: string; + /** + * injector + */ + protected injector: Injector; + + /** + * 构造函数 + */ + constructor( + storageStrategy: BaSessionStorageStrategy, + frameworkSessionService: FrameworkSessionService, + httpClient: HttpClient, + baseUrl: string, + injector: Injector + ) { + this.storageStrategy = storageStrategy; + this.frameworkSessionService = frameworkSessionService; + this.httpClient = httpClient; + this.baseUrl = baseUrl; + // this.createSessionUrl = `${baseUrl}/service/createsession`; + // this.closeSessionUrl = `${baseUrl}/service/closesession`; + this.injector = injector; + } + + public abstract getSessionId(runtimeContext?: RuntimeContext): Promise; + public abstract setSessionId(sessionId: string, runtimeContext?: RuntimeContext): void; + public abstract clearSessionId(runtimeContext?: RuntimeContext): void; + public abstract handleRequestHeaders(headers: HttpHeaders, runtimeContext?: RuntimeContext): HttpHeaders; + public abstract handleReponseHeaders(headers: HttpHeaders): void; + protected abstract getSessionStorageKey(runtimeContext?: RuntimeContext): string; + + /** + * 获取框架SessionId + * TODO: 暂不支持runtimeContext + */ + public getFrameworkSessionId() { + return this.frameworkSessionId; + } + + /** + * 从缓存中获取BeSession + */ + protected getSessionIdFromStorage(runtimeContext?: RuntimeContext) { + const sessionStorageKey = this.getSessionStorageKey(runtimeContext); + const beSessionId = this.storageStrategy.getItem(sessionStorageKey); + return beSessionId; + } + /** + * 框架SessionId(用户的或者功能菜单的) + */ + protected get frameworkSessionId(): string { + return this.frameworkSessionService.getCurrentSessionId(); + } + +} + +export { BaSessionHandlingStrategy }; diff --git a/packages/bef/lib/ba/session/handling-strategies/ba-separated-session-handling-strategy.ts b/packages/bef/lib/ba/session/handling-strategies/ba-separated-session-handling-strategy.ts new file mode 100644 index 0000000000000000000000000000000000000000..fe13713c52fee80f64bbde72daf9b270517df246 --- /dev/null +++ b/packages/bef/lib/ba/session/handling-strategies/ba-separated-session-handling-strategy.ts @@ -0,0 +1,140 @@ +import { HttpHeaders, HttpClient, HttpRequestConfig, Injector } from '@farris/devkit-vue'; +import { BefHttpUtil, BefEnvUtil } from '../../../utils/index'; +import { FrameworkSessionService } from '../../../framework-session.service'; +import { BaSessionStorageStrategy } from '../storage-strategies'; +import { RuntimeContext } from '../../../types'; +import { BaSessionHandlingStrategy } from './ba-handling-strategy'; + +/** + * 隔离的BeSession处理策略 + */ +class BaSeparatedSessionHandlingStrategy extends BaSessionHandlingStrategy { + /** + * 构造函数 + */ + constructor( + storageStrategy: BaSessionStorageStrategy, + frameworkSessionService: FrameworkSessionService, + httpClient: HttpClient, + baseUrl: string, + injector: Injector + ) { + super(storageStrategy, frameworkSessionService, httpClient, baseUrl, injector); + } + + /** + * 获取BeSessionId + */ + public getSessionId(runtimeContext?: RuntimeContext): Promise { + const beSessionId = this.getSessionIdFromStorage(runtimeContext); + if (beSessionId) { + return Promise.resolve(beSessionId); + } + const sessionIdPromise = this.closeLastTimeUsedSession().then(() => { + return this.createSession(runtimeContext); + }); + return sessionIdPromise; + } + /** + * 创建BeSessionId + */ + protected createSession(runtimeContext?: RuntimeContext): Promise { + const requestConfig: HttpRequestConfig = { + responseType: 'text', + headers: { + 'Content-Type': 'application/json' + } + }; + requestConfig.headers = BefHttpUtil.appendCafRuntimeCommonVariable(requestConfig.headers, this.frameworkSessionId); + return this.httpClient.post(this.createSessionUrl, null, requestConfig).then((beSessionId: string) => { + this.setSessionId(beSessionId, runtimeContext); + return beSessionId; + }); + } + + /** + * 关闭上次使用的会话 + */ + protected closeLastTimeUsedSession(): Promise { + return Promise.resolve(true); + // ToDo: 统一查询平台无bef SessionId + // if (!this.lastTimeUsedSessionId) { + // return Promise.resolve(true); + // } + + // const requestConfig: HttpRequestConfig = { + // responseType: 'text', + // headers: { + // 'Content-Type': 'application/json' + // } + // }; + + // // headers处理 + // requestConfig.headers = BefHttpUtil.appendCafRuntimeContext(requestConfig.headers, this.lastTimeUsedSessionId); + // requestConfig.headers = BefHttpUtil.appendCafRuntimeCommonVariable(requestConfig.headers, this.frameworkSessionId); + + // // 无论是否成功,统一置空cleardBeSessionId + // return this.httpClient.post(this.closeSessionUrl, null, requestConfig).then(() => { + // return true; + // }); + } + /** + * 设置BeSessionId + */ + public setSessionId(sessionId: string, runtimeContext?: RuntimeContext): void { + const sessionKey = this.getSessionStorageKey(runtimeContext); + this.storageStrategy.setItem(sessionKey, sessionId); + } + + /** + * 清空BeSessionId + */ + public clearSessionId(runtimeContext?: RuntimeContext) { + if (BefEnvUtil.isInFramework() === true) { + this.storageStrategy.removeItemsByScope(this.frameworkSessionId); + } else { + const sessionKey = this.getSessionStorageKey(runtimeContext); + this.lastTimeUsedSessionId = this.getSessionIdFromStorage(runtimeContext); + this.storageStrategy.removeItem(sessionKey); + } + } + + /** + * 扩展BeSessionId相关头信息 + */ + public handleRequestHeaders(headers: HttpHeaders, runtimeContext?: RuntimeContext): HttpHeaders { + const frmSessionId = this.getFrameworkSessionId(); + const beSessionId = this.getSessionIdFromStorage(runtimeContext); + + headers = BefHttpUtil.appendCafRuntimeCommonVariable(headers, frmSessionId); + // ToDo: 统一查询平台无bef SessionId + // if (beSessionId) { + // headers = BefHttpUtil.appendCafRuntimeContext(headers, beSessionId); + // headers = BefHttpUtil.appendSessionId(headers, beSessionId); + // } + return headers; + } + + /** + * 处理服务器端返回的headers + */ + public handleReponseHeaders(headers: any): void { + } + + /** + * 获取某个Repository对应的BeSession的唯一key + */ + protected getSessionStorageKey(runtimeContext?: RuntimeContext): string { + let sessionId: string = this.frameworkSessionId; + if (runtimeContext) { + sessionId = this.getFrameworkSessionId(); + } + const tabId = runtimeContext && runtimeContext.tabId; + if (tabId) { + return `${sessionId}_${tabId}_${this.baseUrl}`; + } + return `${sessionId}_${this.baseUrl}`; + } +} + +export { BaSeparatedSessionHandlingStrategy }; \ No newline at end of file diff --git a/packages/bef/lib/ba/session/handling-strategies/ba-unified-session-handling-strategy.ts b/packages/bef/lib/ba/session/handling-strategies/ba-unified-session-handling-strategy.ts new file mode 100644 index 0000000000000000000000000000000000000000..e01ca93fc503bb185a9c1fa7a007c351c49d8927 --- /dev/null +++ b/packages/bef/lib/ba/session/handling-strategies/ba-unified-session-handling-strategy.ts @@ -0,0 +1,92 @@ +import { HttpClient, HttpHeaders, Injector, Devkit } from '@farris/devkit-vue'; +import { BaSessionStorageStrategy } from '../storage-strategies'; +import { FrameworkSessionService } from '../../../framework-session.service'; +import { RuntimeContext } from '../../../types'; +import { BefHttpUtil } from '../../../utils'; +import { BaSessionHandlingStrategy } from './ba-handling-strategy'; + +/** + * 会话复用场景下会话处理策略 + */ +export class BaUnifiedSessionHandlingStrategy extends BaSessionHandlingStrategy { + /** + * 构造函数 + */ + constructor( + storageStrategy: BaSessionStorageStrategy, + frameworSessionService: FrameworkSessionService, + httpClient: HttpClient, + baseUrl: string, + protected injector: Injector + ) { + super(storageStrategy, frameworSessionService, httpClient, baseUrl, injector); + } + /** + * 获取会话复用的session id + * @param runtimeContext runtime context + */ + public getSessionId(runtimeContext: RuntimeContext): Promise { + const sessionKey = this.getSessionStorageKey(runtimeContext); + const sessionId = this.storageStrategy.getItem(sessionKey); + return Promise.resolve(sessionId); + } + /** + * 设置session id + * @param sessionId session id + * @param runtimeContext runtime context + */ + public setSessionId(sessionId: string, runtimeContext: RuntimeContext): void { + const sessionKey = this.getSessionStorageKey(runtimeContext); + this.storageStrategy.setItem(sessionKey, sessionId); + } + /** + * 清空session id + * @param runtimeContext runtime context + */ + public clearSessionId(runtimeContext: RuntimeContext): void { + const sessionKey = this.getSessionStorageKey(runtimeContext); + this.storageStrategy.removeItem(sessionKey); + } + /** + * 处理请求header + * @param headers + * @param runtimeContext runtime context + */ + public handleRequestHeaders(headers: HttpHeaders, runtimeContext?: RuntimeContext): HttpHeaders { + const frmSessionId = this.getFrameworkSessionId(); + const beSessionId = this.getSessionIdFromStorage(runtimeContext); + const devkit = this.injector.get(Devkit, undefined); + if (devkit) { + // 使用应用id作为function instance id + const funcInstId = ''; + headers = BefHttpUtil.appendFuncInstId(headers, funcInstId); + } + headers = BefHttpUtil.appendCafRuntimeCommonVariable(headers, frmSessionId); + if (beSessionId) { + headers = BefHttpUtil.appendCafRuntimeContext(headers, beSessionId); + } + return headers; + } + /** + * 处理返回header + * @param headers + */ + public handleReponseHeaders(headers: HttpHeaders): void { + } + /** + * 构造session存储的key + * @param runtimeContext runtime context + */ + protected getSessionStorageKey(runtimeContext?: RuntimeContext): string { + let sessionId = this.frameworkSessionId; + if (runtimeContext) { + sessionId = this.getFrameworkSessionId(); + } + const tabId = runtimeContext && runtimeContext.tabId; + if (tabId) { + return `${sessionId}_${tabId}_${this.baseUrl}`; + } + return `${sessionId}_${this.baseUrl}`; + } + +} \ No newline at end of file diff --git a/packages/bef/lib/ba/session/handling-strategies/index.ts b/packages/bef/lib/ba/session/handling-strategies/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..25fdf031db327a23d420fee71753910b56e7e8ce --- /dev/null +++ b/packages/bef/lib/ba/session/handling-strategies/index.ts @@ -0,0 +1,4 @@ +export * from './ba-separated-session-handling-strategy'; +export * from './ba-unified-session-handling-strategy'; +export * from './ba-handling-strategy-factory'; +export * from './ba-handling-strategy'; diff --git a/packages/bef/lib/ba/session/index.ts b/packages/bef/lib/ba/session/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..05374386035bd0374ee47c59bc76e919af3f6e13 --- /dev/null +++ b/packages/bef/lib/ba/session/index.ts @@ -0,0 +1,4 @@ +export * from './handling-strategies/index'; +export * from './storage-strategies/index'; +export * from './ba_session_service'; +export * from './ba_session_manager'; diff --git a/packages/bef/lib/ba/session/storage-strategies/ba-session-storage-strategy.ts b/packages/bef/lib/ba/session/storage-strategies/ba-session-storage-strategy.ts new file mode 100644 index 0000000000000000000000000000000000000000..d440e62414cf38f03407865b970aa40bb6cf221c --- /dev/null +++ b/packages/bef/lib/ba/session/storage-strategies/ba-session-storage-strategy.ts @@ -0,0 +1,95 @@ +import { StorageStrategy } from '../../../session'; + +/** + * 基于浏览器SessionStorage的BeSession缓存 + * @summary + * 1、SeparatedSession模式下: + * { + * BE_SESSION_ID: { + * frmSessionId1_beSessionUri1: beSessionId-1, + * frmSessionId2_beSessionUri2: beSessionId-2, + * } + * } + * 2、UnifiedSession模式下(在Debug状态,同模式1): + * { + * BE_SESSION_ID: { + * frmSessionId1: beSessionId-1, + * frmSessionId2: beSessionId-2, + * } + * } + */ +class BaSessionStorageStrategy implements StorageStrategy { + /** + * 缓存Token + */ + private sessionStorageKey = 'BE_SESSION_ID'; + + /** + * 获取值 + */ + public getItem(beSessionKey: string): string { + const beSessions = this.getAllBeSessions(); + return beSessions[beSessionKey]; + } + + /** + * 设置值 + */ + public setItem(beSessionKey: string, beSessionId: string) { + const beSessions = this.getAllBeSessions(); + beSessions[beSessionKey] = beSessionId; + this.setAllBeSessions(beSessions); + } + + /** + * 删除值 + */ + public removeItem(beSessionKey: string) { + const beSessions = this.getAllBeSessions(); + if (beSessions[beSessionKey]) { + delete beSessions[beSessionKey]; + } + this.setAllBeSessions(beSessions); + } + + /** + * 根据scope删除值 + */ + public removeItemsByScope(beSessionScope: string) { + const beSessions = this.getAllBeSessions(); + Object.keys(beSessions).forEach((beSessionKey: string) => { + if (beSessionKey.startsWith(beSessionScope) === true) { + delete beSessions[beSessionKey]; + } + }); + this.setAllBeSessions(beSessions); + } + + /** + * 清空所有会话 + */ + public clear(): void { + window.sessionStorage.removeItem(this.sessionStorageKey); + } + + /** + * 从SessionStorage中获取全部BeSessions + */ + private getAllBeSessions(): any { + const beSessionsJson = window.sessionStorage.getItem(this.sessionStorageKey); + if (!beSessionsJson) { + return {}; + } + return JSON.parse(beSessionsJson); + } + + /** + * 设置全部BeSessions到SessionStorage + */ + setAllBeSessions(beSessions: any): void { + const beSessionsString = JSON.stringify(beSessions); + window.sessionStorage.setItem(this.sessionStorageKey, beSessionsString); + } +} + +export { BaSessionStorageStrategy }; diff --git a/packages/bef/lib/ba/session/storage-strategies/index.ts b/packages/bef/lib/ba/session/storage-strategies/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..9182fe67caa496b1f56b6ac0d82b9db05039a555 --- /dev/null +++ b/packages/bef/lib/ba/session/storage-strategies/index.ts @@ -0,0 +1 @@ +export * from './ba-session-storage-strategy'; diff --git a/packages/bef/lib/index.ts b/packages/bef/lib/index.ts index ff237e74cf960bd55758c91684850da8fe2d04b7..36dc02447ff2b568e2cd1590f75115a32ade53ef 100644 --- a/packages/bef/lib/index.ts +++ b/packages/bef/lib/index.ts @@ -11,3 +11,4 @@ export * from './bef-tree-repository'; export * from './bef-parent-tree-repository'; export * from './bef-path-tree-repository'; export * from './providers'; +export * from './ba/index'; diff --git a/packages/bef/lib/providers.ts b/packages/bef/lib/providers.ts index c0029bd4d857db0a8d21fefb8565928a55fef9e1..4f433523d96cff7800e44c5afca79094add419d7 100644 --- a/packages/bef/lib/providers.ts +++ b/packages/bef/lib/providers.ts @@ -2,6 +2,7 @@ import { StaticProvider, HttpClient, Repository, getDynamicRepositoryToken, View import { BefParentTreeRepository } from './bef-parent-tree-repository'; import { BefProxy } from './bef-proxy'; import { BefPathTreeRepository } from './bef-path-tree-repository'; +import { BaProxy } from './ba'; const befProviders: StaticProvider[] = [ { provide: BefPathTreeRepository, useClass: BefPathTreeRepository, deps: [ViewModel] }, @@ -10,6 +11,7 @@ const befProviders: StaticProvider[] = [ const befRootProviders: StaticProvider[] = [ { provide: BefProxy, useClass: BefProxy, deps: [HttpClient] }, + { provide: BaProxy, useClass: BaProxy, deps: [HttpClient] }, ]; export { befProviders, befRootProviders }; \ No newline at end of file diff --git a/packages/bef/lib/utils/request-info.util.ts b/packages/bef/lib/utils/request-info.util.ts index 0ce32601c72082308dba2bef7c2027c395118934..3764e4e9fca54e4c4188cea4b6e20a954e6d36ff 100644 --- a/packages/bef/lib/utils/request-info.util.ts +++ b/packages/bef/lib/utils/request-info.util.ts @@ -2,6 +2,7 @@ import { Entity } from '@farris/devkit-vue'; import { RequestInfo } from '../types'; import { BefRepository } from '../bef-repository'; import { BefChangeDetailBuilder } from '../change/index'; +import { BaRepository } from '../ba'; class RequestInfoUtil { @@ -40,8 +41,11 @@ class RequestInfoUtil { /** * 向body中添加RequestInfo */ - public static appendRequestInfoToBody(body: any, repository: BefRepository): any { - const requestInfo = this.buildRequestInfo(repository); + public static appendRequestInfoToBody(body: any, repository: BefRepository | BaRepository): any { + let requestInfo = {}; // BAP: BA统一查询平台请求提body没有变更集和变量字典,所以不需要执行buildRequestInfo方法 + if (repository instanceof BefRepository) { + requestInfo = this.buildRequestInfo(repository); + } // body不存在时,body=requestInfo if (!body || Object.keys(body).length === 0) { return requestInfo; diff --git a/packages/charts-vue/.gitignore b/packages/charts-vue/.gitignore index ca8018c48b20a44abef75a8ca13ce6f2aa0c518a..9c48e7b2abc7ada931fc3d690acfcb84f21153e7 100644 --- a/packages/charts-vue/.gitignore +++ b/packages/charts-vue/.gitignore @@ -14,6 +14,7 @@ dist-ssr *.local coverage package +package-system # Editor directories and files .vscode/* diff --git a/packages/charts-vue/components/charts-bar/index.ts b/packages/charts-vue/components/charts-bar/index.ts index a489598686f94f4f701686a33f62a6a5ec7c93bb..298d5f3f8eda67049a578344cf57f78b966ecfcd 100644 --- a/packages/charts-vue/components/charts-bar/index.ts +++ b/packages/charts-vue/components/charts-bar/index.ts @@ -1,13 +1,22 @@ +import { App } from 'vue'; import FChartsBar from './src/charts-bar.component'; -// import { propsResolver } from './src/charts-bar.props'; import { withInstall } from '@farris/charts-vue/components/charts-common'; +import { propsResolver } from './src/charts-bar.props'; -export * from './src/charts-bar.props'; +FChartsBar.install = (app: App) => { + app.component(FChartsBar.name as string, FChartsBar); +}; +FChartsBar.register = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record, resolverMap: Record) => { + componentMap['charts-bar'] = FChartsBar; + propsResolverMap['charts-bar'] = propsResolver; +}; + +FChartsBar.registerDesigner = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record) => { + // componentMap['charts-bar'] = FChartsBar; + // propsResolverMap['charts-bar'] = propsResolver; +}; -// FChartsBar.register = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record, resolverMap: Record) => { -// componentMap['charts-bar'] = FChartsBar; -// propsResolverMap['charts-bar'] = propsResolver; -// }; +export * from './src/charts-bar.props'; export { FChartsBar }; export default withInstall(FChartsBar); diff --git a/packages/charts-vue/components/charts-bar/src/charts-bar.props.ts b/packages/charts-vue/components/charts-bar/src/charts-bar.props.ts index bb0ff26eab252b2189311b3bdde9cb9a88307c89..fc02c7da1b3d0c79be3b6f976bba67275bbed95b 100644 --- a/packages/charts-vue/components/charts-bar/src/charts-bar.props.ts +++ b/packages/charts-vue/components/charts-bar/src/charts-bar.props.ts @@ -5,6 +5,10 @@ import { SelectProps, TooltipProps, SelectedModeType, SamplingType, TextStyleProps, LegendProps, TitleProps, GridProps, DataZoomProps, EmphasisProps } from '@farris/charts-vue/components/charts-common'; +import { createPropsResolver } from "@farris/ui-vue"; +import chartsBarSchema from './schema/charts-bar.schema.json'; +import { schemaMapper } from './schema/schema-mapper'; +import { schemaResolver } from './schema/schema-resolver'; export const barSeriesProps = { @@ -158,3 +162,4 @@ export const chartsBarProps = { } as Record; export type ChartsBarProps = ExtractPropTypes; +export const propsResolver = createPropsResolver(chartsBarProps, chartsBarSchema, schemaMapper, schemaResolver); diff --git a/packages/charts-vue/components/charts-bar/src/schema/charts-bar.schema.json b/packages/charts-vue/components/charts-bar/src/schema/charts-bar.schema.json index 4650e6a7580d64bf0f42e408db50caf0723234b1..ad978e623d60bd9098afc80d570efa0c615e1250 100644 --- a/packages/charts-vue/components/charts-bar/src/schema/charts-bar.schema.json +++ b/packages/charts-vue/components/charts-bar/src/schema/charts-bar.schema.json @@ -1,893 +1,71 @@ { - "$schema": "https://json-schema.org/draft/2020-12/schema", - "$id": "https://farris-design.gitee.io/charts-bar.schema.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://example.com/product.schema.json", "title": "charts-bar", - "description": "A Farris Bar Component", + "description": "", "type": "object", "properties": { "id": { - "description": "The unique identifier for a Input Group", + "type": "string" + }, + "name": { "type": "string" }, "type": { - "description": "The type string of Input Group component", + "description": "The type string of GridLayout component", "type": "string", - "default": "bar" + "default": "charts-bar" }, - "name": { - "type": "string" + "appearance": { + "description": "", + "type": "object", + "properties": { + "class": { + "type": "string" + }, + "style": { + "type": "string" + } + }, + "default": {} + }, + "height": { + "type": ["string", "number"], + "default": "100%" + }, + "width": { + "type": ["string", "number"], + "default": "100%" }, "code": { "type": "string" }, "color": { - "type": "array", - "default": [ - "#5470c6", - "#91cc75", - "#fac858", - "#ee6666", - "#73c0de", - "#3ba272", - "#fc8452", - "#9a60b4", - "#ea7ccc" - ] + "type": "array" }, "textStyle": { - "type": "object", - "properties": { - "color": { - "type": "string", - "default": "#808080" - }, - "fontStyle": { - "type": "string", - "enum": [ - "normal", - "italic", - "oblique" - ], - "default": "normal" - }, - "fontWeight": { - "type": "string", - "enum": [ - "normal", - "bold", - "bolder", - "lighter" - ], - "default": "normal" - }, - "fontFamily": { - "type": "string", - "enum": [ - "serif", - "monospace", - "Arial", - "Courier New" - ], - "default": "serif" - }, - "fontSize": { - "type": "number", - "default": 12 - }, - "lineHeight": { - "type": "number" - }, - "width": { - "type": "number" - }, - "height": { - "type": "number" - }, - "overflow": { - "type": "string", - "enum": [ - "none", - "truncate", - "break", - "breakAll" - ], - "default": "none" - }, - "ellipsis": { - "type": "string", - "description": "在overflow配置为'truncate'的时候,可以通过该属性配置末尾显示的文本", - "default": "..." - } - } + "type": "object" }, "title": { - "type": "object", - "properties": { - "id": { - "type": "string", - "default": "" - }, - "show": { - "type": "boolean", - "default": true - }, - "text": { - "type": "string", - "default": "" - }, - "link": { - "type": "string", - "default": "" - }, - "target": { - "type": "string", - "enum": [ - "blank", - "self" - ], - "default": "blank" - }, - "textStyle": { - "type": "object", - "properties": { - "color": { - "type": "string", - "default": "#2D2F33" - }, - "fontStyle": { - "type": "string", - "enum": [ - "normal", - "italic", - "oblique" - ], - "default": "normal" - }, - "fontWeight": { - "type": [ - "string", - "number" - ], - "enum": [ - "normal", - "bold", - "bolder", - "lighter" - ], - "default": 500 - }, - "fontFamily": { - "type": "string", - "enum": [ - "serif", - "monospace", - "Arial", - "Courier New" - ], - "default": "serif" - }, - "lineHeight": { - "type": "number", - "default": 26 - } - } - }, - "subtext": { - "type": "string", - "default": "" - }, - "sublink": { - "type": "string", - "default": "" - }, - "subtarget": { - "type": "string", - "enum": [ - "blank", - "self" - ], - "default": "blank" - }, - "subtextStyle": { - "type": "object", - "properties": { - "color": { - "type": "string", - "default": "#2D2F33" - }, - "fontStyle": { - "type": "string", - "enum": [ - "normal", - "italic", - "oblique" - ], - "default": "normal" - }, - "fontWeight": { - "type": [ - "string", - "number" - ], - "enum": [ - "normal", - "bold", - "bolder", - "lighter" - ], - "default": "normal" - }, - "fontFamily": { - "type": "string", - "enum": [ - "serif", - "monospace", - "Arial", - "Courier New" - ], - "default": "serif" - }, - "lineHeight": { - "type": "number", - "default": 20 - } - } - }, - "triggerEvent": { - "type": "boolean", - "default": true - }, - "padding": { - "type": "array", - "items": { - "type": "number" - }, - "default": [ - 5, - 5, - 5, - 5 - ] - }, - "itemGap": { - "type": "number", - "default": 10 - }, - "top": { - "type": [ - "string", - "number" - ], - "default": "auto" - }, - "bottom": { - "type": [ - "string", - "number" - ], - "default": "auto" - }, - "left": { - "type": [ - "string", - "number" - ], - "default": "auto" - }, - "right": { - "type": [ - "string", - "number" - ], - "default": "auto" - } - } + "type": "object" }, "legend": { - "type": "object", - "properties": { - "id": { - "type": "string", - "default": "" - }, - "show": { - "type": "boolean", - "default": true - }, - "type": { - "type": "string", - "enum": [ - "plain", - "scroll" - ], - "default": "plain" - }, - "top": { - "type": [ - "string", - "number" - ], - "default": "auto" - }, - "bottom": { - "type": [ - "string", - "number" - ], - "default": "auto" - }, - "left": { - "type": [ - "string", - "number" - ], - "default": "auto" - }, - "right": { - "type": [ - "string", - "number" - ], - "default": "auto" - }, - "width": { - "type": [ - "string", - "number" - ], - "default": "auto" - }, - "height": { - "type": [ - "string", - "number" - ], - "default": "auto" - }, - "orient": { - "type": [ - "string" - ], - "enum": [ - "horizontal", - "vertical" - ], - "default": "horizontal" - }, - "align": { - "type": "string", - "enum": [ - "auto", - "left", - "right" - ], - "default": "auto" - }, - "padding": { - "type": "number", - "default": 5 - }, - "itemGap": { - "type": "number", - "default": 10 - }, - "itemWidth": { - "type": "number", - "default": 12 - }, - "itemHeight": { - "type": "number", - "default": 12 - }, - "itemStyle": { - "type": "object", - "properties": { - "color": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "lineStyle": { - "type": "object", - "properties": { - "color": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "textStyle": { - "type": "object", - "properties": { - "color": { - "type": "string", - "default": "#666666" - }, - "fontSize": { - "type": "number", - "default": 12 - }, - "fontStyle": { - "type": "string", - "enum": [ - "normal", - "italic", - "oblique" - ], - "default": "normal" - }, - "fontWeight": { - "type": [ - "string", - "number" - ], - "enum": [ - "normal", - "bold", - "bolder", - "lighter" - ], - "default": 400 - }, - "fontFamily": { - "type": "string", - "enum": [ - "serif", - "monospace", - "Arial", - "Courier New" - ], - "default": "serif" - }, - "lineHeight": { - "type": "number", - "default": 16 - } - } - }, - "formatter": { - "type": "object", - "default": "" - }, - "tooltip": { - "type": "boolean", - "default": false - }, - "icon": { - "type": "string", - "default": "" - }, - "data": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "icon": { - "type": "string" - }, - "textStyle": { - "type": "object", - "properties": { - "color": { - "type": "string" - }, - "fontStyle": { - "type": "string", - "enum": [ - "normal", - "italic", - "oblique" - ] - }, - "fontWeight": { - "type": [ - "string", - "number" - ], - "enum": [ - "normal", - "bold", - "bolder", - "lighter" - ] - }, - "fontFamily": { - "type": "string", - "enum": [ - "serif", - "monospace", - "Arial", - "Courier New" - ] - }, - "lineHeight": { - "type": "number" - } - } - } - } - }, - "borderRadius": { - "type": [ - "number", - "array" - ], - "default": 0 - } - } + "type": "object" }, "grid": { - "type": "object", - "properties": { - "id": { - "type": "string", - "default": "" - }, - "show": { - "type": "boolean", - "default": true - }, - "zlevel": { - "type": "number", - "default": 0 - }, - "z": { - "type": "number", - "default": 0 - }, - "top": { - "type": [ - "string", - "number" - ], - "default": 60 - }, - "bottom": { - "type": [ - "string", - "number" - ], - "default": 60 - }, - "left": { - "type": [ - "string", - "number" - ], - "default": "10%" - }, - "right": { - "type": [ - "string", - "number" - ], - "default": "10%" - }, - "width": { - "type": [ - "string", - "number" - ], - "default": "auto" - }, - "height": { - "type": [ - "string", - "number" - ], - "default": "auto" - }, - "containLabel": { - "type": "boolean", - "description": "grid 区域是否包含坐标轴的刻度标签。containLabel 为 false 的时候:grid.left grid.right grid.top grid.bottom grid.width grid.height 决定的是由坐标轴形成的矩形的尺寸和位置。这比较适用于多个 grid 进行对齐的场景,因为往往多个 grid 对齐的时候,是依据坐标轴来对齐的。containLabel 为 true 的时候:grid.left grid.right grid.top grid.bottom grid.width grid.height 决定的是包括了坐标轴标签在内的所有内容所形成的矩形的位置。这常用于『防止标签溢出』的场景,标签溢出指的是,标签长度动态变化时,可能会溢出容器或者覆盖其他组件", - "default": false - }, - "backgroundColor": { - "type": "string", - "default": "rgba(1,51,100,0.05)" - }, - "borderColor": { - "type": "string", - "default": "#FFFFFF" - }, - "borderWidth": { - "type": "number", - "default": 0 - }, - "tooltip": { - "type": "object", - "properties": { - "show": { - "type": "boolean" - }, - "padding": { - "type": "number" - }, - "trigger": { - "type": "string", - "enum": [ - "item", - "axis", - "none" - ] - }, - "formatter": { - "type": "object" - }, - "valueFormater": { - "type": "object" - }, - "textStyle": { - "type": "object", - "properties": { - "color": { - "type": "string" - }, - "fontStyle": { - "type": "string", - "enum": [ - "normal", - "italic", - "oblique" - ] - }, - "fontWeight": { - "type": [ - "string", - "number" - ], - "enum": [ - "normal", - "bold", - "bolder", - "lighter" - ] - }, - "fontFamily": { - "type": "string", - "enum": [ - "serif", - "monospace", - "Arial", - "Courier New" - ] - }, - "lineHeight": { - "type": "number" - } - } - }, - "axisPointer": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": [ - "line", - "shadow", - "none", - "cross" - ], - "description": "指示器类型。" - }, - "axis": { - "type": "string", - "enum": [ - "x", - "y", - "radius", - "angle" - ], - "description": "指示器的坐标轴。默认情况,坐标系会自动选择显示哪个轴的 axisPointer(默认取类目轴或者时间轴)" - }, - "label": { - "type": "object", - "properties": { - "show": { - "type": "boolean", - "description": "是否显示文本标签。" - }, - "precision": { - "type": [ - "number", - "string" - ], - "description": "文本标签中数值的小数点精度。默认根据当前轴的值自动判断。也可以指定如 2 表示保留两位小数" - }, - "margin": { - "type": "number", - "description": "label 距离轴的距离" - }, - "color": { - "type": "string", - "description": "文字的颜色" - }, - "fontStyle": { - "type": "string", - "enum": [ - "normal", - "italic", - "oblique" - ], - "description": "文字字体的风格" - }, - "fontWeight": { - "type": [ - "number", - "string" - ], - "description": "文字字体的粗细. normal bold bolder lighter, 100|200|300|400" - }, - "fontFamily": { - "type": "string", - "description": "文字的字体系列. 'serif' , 'monospace', 'Arial', 'Courier New', 'Microsoft YaHei', ..." - }, - "fontSize": { - "type": "number" - }, - "lineHeight": { - "type": "number" - }, - "width": { - "type": "number" - }, - "height": { - "type": "number" - }, - "overflow": { - "type": "string", - "enum": [ - "none", - "truncate", - "break", - "breakAll" - ], - "description": "文字超出宽度是否截断或者换行。配置width时有效" - }, - "padding": { - "type": "array" - }, - "backgroundColor": { - "type": "string" - }, - "borderColor": { - "type": "string" - }, - "borderWidth": { - "type": "number" - } - } - }, - "lineStyle": { - "type": "object", - "properties": { - "color": { - "type": "string" - }, - "width": { - "type": "number" - }, - "type": { - "type": [ - "string", - "array" - ], - "description": "线的类型" - }, - "cap": { - "type": "string", - "enum": [ - "butt", - "round", - "square" - ], - "description": "用于指定线段的绘制方式" - }, - "join": { - "type": "string", - "enum": [ - "bevel", - "round", - "miter" - ], - "description": "用于设置2个长度不为0的相连部分(线段,圆弧,曲线)如何连接在一起的属性" - } - } - } - } - } - } - } - } - }, - "appearance": { - "description": "", - "type": "object", - "properties": { - "class": { - "type": "string" - }, - "style": { - "type": "string" - } - }, - "default": {} + "type": "object" }, "xAxis": { - "type": "object", - "properties": { - "type": { - "type": "string", - "default": "category" - }, - "data": { - "type": "array", - "default": [] - } - } + "type": "object" }, "yAxis": { - "type": "object", - "properties": { - "type": { - "type": "string", - "default": "value" - } - } + "type": "object" + }, + "dataZoom": { + "type": "object" }, "series": { - "type": "array", - "properties": { - "type": { - "type": "string", - "default": "bar" - }, - "id": { - "type": "string", - "default": "" - }, - "name": { - "type": "string", - "default": "" - }, - "xAxisIndex": { - "type": "number", - "default": 0 - }, - "yAxisIndex": { - "type": "number", - "default": 0 - }, - "clip": { - "type": "boolean", - "default": true - }, - "data": { - "type": "array", - "properties" : { - "name": { - "type": "string" - }, - "value": { - "type": "number" - } - }, - "default": [] - } - - }, - "default": [] + "type": "object" } - - }, - "required": [ - "id", - "type" - ] -} \ No newline at end of file + } +} \ No newline at end of file diff --git a/packages/charts-vue/components/charts-bar/src/schema/schema-mapper.ts b/packages/charts-vue/components/charts-bar/src/schema/schema-mapper.ts new file mode 100644 index 0000000000000000000000000000000000000000..9731e0a06388662001f2d51344e1ac664b51ab57 --- /dev/null +++ b/packages/charts-vue/components/charts-bar/src/schema/schema-mapper.ts @@ -0,0 +1,5 @@ +import { MapperFunction, resolveAppearance } from "@farris/ui-vue"; + +export const schemaMapper = new Map([ + ['appearance', resolveAppearance] +]); diff --git a/packages/charts-vue/components/charts-bar/src/schema/schema-resolver.ts b/packages/charts-vue/components/charts-bar/src/schema/schema-resolver.ts new file mode 100644 index 0000000000000000000000000000000000000000..c10c25caa2ad90607eee6f71572066e10a3515be --- /dev/null +++ b/packages/charts-vue/components/charts-bar/src/schema/schema-resolver.ts @@ -0,0 +1,5 @@ +import { DynamicResolver } from "@farris/ui-vue"; + +export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record): Record { + return schema; +} diff --git a/packages/charts-vue/components/charts-line/index.ts b/packages/charts-vue/components/charts-line/index.ts index 86e86dd5e97baae64c07cc1dec616cf4b42a1217..33c2b938a82ff8d969dfc4277dc62e7d75cb2905 100644 --- a/packages/charts-vue/components/charts-line/index.ts +++ b/packages/charts-vue/components/charts-line/index.ts @@ -1,5 +1,20 @@ +import { App } from 'vue'; import FCharstLine from './src/charts-line.component'; import { withInstall } from '@farris/charts-vue/components/charts-common'; +import { propsResolver } from './src/charts-line.props'; + +FCharstLine.install = (app: App) => { + app.component(FCharstLine.name as string, FCharstLine); +}; +FCharstLine.register = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record, resolverMap: Record) => { + componentMap['charts-line'] = FCharstLine; + propsResolverMap['charts-line'] = propsResolver; +}; + +FCharstLine.registerDesigner = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record) => { + // componentMap['charts-line'] = FCharstLine; + // propsResolverMap['charts-line'] = propsResolver; +}; export * from './src/charts-line.props'; export { FCharstLine }; diff --git a/packages/charts-vue/components/charts-line/src/charts-line.props.ts b/packages/charts-vue/components/charts-line/src/charts-line.props.ts index f85ec555d28d41df4ef525ac8d3c868b6479bfcb..393b4563e866638b4e3f1513d357cca9dc68c08e 100644 --- a/packages/charts-vue/components/charts-line/src/charts-line.props.ts +++ b/packages/charts-vue/components/charts-line/src/charts-line.props.ts @@ -5,6 +5,10 @@ import { SelectProps, TooltipProps, SelectedModeType, SamplingType, TextStyleProps, LegendProps, TitleProps, GridProps, DataZoomProps } from '@farris/charts-vue/components/charts-common'; +import { createPropsResolver } from "@farris/ui-vue"; +import chartsLineSchema from './schema/charts-line.schema.json'; +import { schemaMapper } from './schema/schema-mapper'; +import { schemaResolver } from './schema/schema-resolver'; export const lineSeriesProps = { type: { type: String, default: 'line' }, @@ -101,9 +105,9 @@ export const chartsLineProps = { backgroundColor: { type: String }, - width: { type: [Number, String] }, + width: { type: [Number, String], default: "100%" }, - height: { type: [Number, String] }, + height: { type: [Number, String], default: "100%" }, textStyle: { type: Object as PropType }, @@ -119,3 +123,4 @@ export const chartsLineProps = { }; export type ChartsLineProps = ExtractPropTypes; +export const propsResolver = createPropsResolver(chartsLineProps, chartsLineSchema, schemaMapper, schemaResolver); diff --git a/packages/charts-vue/components/charts-line/src/schema/charts-line.schema.json b/packages/charts-vue/components/charts-line/src/schema/charts-line.schema.json new file mode 100644 index 0000000000000000000000000000000000000000..ba7bbea9fd04701238f286ae111bd5030535ac61 --- /dev/null +++ b/packages/charts-vue/components/charts-line/src/schema/charts-line.schema.json @@ -0,0 +1,71 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://example.com/product.schema.json", + "title": "charts-line", + "description": "", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "description": "The type string of GridLayout component", + "type": "string", + "default": "charts-line" + }, + "appearance": { + "description": "", + "type": "object", + "properties": { + "class": { + "type": "string" + }, + "style": { + "type": "string" + } + }, + "default": {} + }, + "height": { + "type": ["string", "number"], + "default": "100%" + }, + "width": { + "type": ["string", "number"], + "default": "100%" + }, + "code": { + "type": "string" + }, + "color": { + "type": "array" + }, + "textStyle": { + "type": "object" + }, + "title": { + "type": "object" + }, + "legend": { + "type": "object" + }, + "grid": { + "type": "object" + }, + "xAxis": { + "type": "object" + }, + "yAxis": { + "type": "object" + }, + "dataZoom": { + "type": "object" + }, + "series": { + "type": "object" + } + } +} \ No newline at end of file diff --git a/packages/charts-vue/components/charts-line/src/schema/schema-mapper.ts b/packages/charts-vue/components/charts-line/src/schema/schema-mapper.ts new file mode 100644 index 0000000000000000000000000000000000000000..f37bb5f44b4516f4d0ab751a3da893b673924f79 --- /dev/null +++ b/packages/charts-vue/components/charts-line/src/schema/schema-mapper.ts @@ -0,0 +1,5 @@ +import { MapperFunction, resolveAppearance } from "@farris/ui-vue"; + +export const schemaMapper = new Map([ + ['appearance', resolveAppearance] +]); \ No newline at end of file diff --git a/packages/charts-vue/components/charts-line/src/schema/schema-resolver.ts b/packages/charts-vue/components/charts-line/src/schema/schema-resolver.ts new file mode 100644 index 0000000000000000000000000000000000000000..c10c25caa2ad90607eee6f71572066e10a3515be --- /dev/null +++ b/packages/charts-vue/components/charts-line/src/schema/schema-resolver.ts @@ -0,0 +1,5 @@ +import { DynamicResolver } from "@farris/ui-vue"; + +export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record): Record { + return schema; +} diff --git a/packages/charts-vue/components/charts-scatter/index.ts b/packages/charts-vue/components/charts-scatter/index.ts index 2a9684bb46beaba64cd124aa8190306b6082241f..267bd6b03294683a2b419157e625f1e4bf58e4f8 100644 --- a/packages/charts-vue/components/charts-scatter/index.ts +++ b/packages/charts-vue/components/charts-scatter/index.ts @@ -1,5 +1,20 @@ +import { App } from 'vue'; import FCharstScatter from './src/charts-scatter.component'; import { withInstall } from '@farris/charts-vue/components/charts-common'; +import { propsResolver } from './src/charts-scatter.props'; + +FCharstScatter.install = (app: App) => { + app.component(FCharstScatter.name as string, FCharstScatter); +}; +FCharstScatter.register = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record, resolverMap: Record) => { + componentMap['charts-scatter'] = FCharstScatter; + propsResolverMap['charts-scatter'] = propsResolver; +}; + +FCharstScatter.registerDesigner = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record) => { + // componentMap['charts-bar'] = FCharstScatter; + // propsResolverMap['charts-bar'] = propsResolver; +}; export * from './src/charts-scatter.props'; export { FCharstScatter }; diff --git a/packages/charts-vue/components/charts-scatter/src/charts-scatter.props.ts b/packages/charts-vue/components/charts-scatter/src/charts-scatter.props.ts index ee3d0d6d9d8891e1044625d51fcf5fa28399cfac..eb06846c93f020220908bb35ef76aad614bf1f83 100644 --- a/packages/charts-vue/components/charts-scatter/src/charts-scatter.props.ts +++ b/packages/charts-vue/components/charts-scatter/src/charts-scatter.props.ts @@ -4,6 +4,10 @@ import { LineStyleProps, animationProps, BlurProps, SelectProps, TooltipProps, SelectedModeType, SamplingType, TextStyleProps, LegendProps, TitleProps, GridProps, DataZoomProps, AxisProps, ToolboxProps } from '@farris/charts-vue/components/charts-common'; +import { createPropsResolver } from "@farris/ui-vue"; +import chartsScatterSchema from './schema/charts-line.schema.json'; +import { schemaMapper } from './schema/schema-mapper'; +import { schemaResolver } from './schema/schema-resolver'; export const scatterSeriesProps = { type: { type: String, default: 'scatter' }, @@ -122,3 +126,4 @@ export const chartsScatterProps = { }; export type ChartsScatterProps = ExtractPropTypes; +export const propsResolver = createPropsResolver(chartsScatterProps, chartsScatterSchema, schemaMapper, schemaResolver); diff --git a/packages/charts-vue/components/charts-scatter/src/schema/charts-line.schema.json b/packages/charts-vue/components/charts-scatter/src/schema/charts-line.schema.json new file mode 100644 index 0000000000000000000000000000000000000000..af2b368556c2f50dfdccf46189573b1a16dda456 --- /dev/null +++ b/packages/charts-vue/components/charts-scatter/src/schema/charts-line.schema.json @@ -0,0 +1,71 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://example.com/product.schema.json", + "title": "charts-scatter", + "description": "", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "description": "The type string of GridLayout component", + "type": "string", + "default": "charts-scatter" + }, + "appearance": { + "description": "", + "type": "object", + "properties": { + "class": { + "type": "string" + }, + "style": { + "type": "string" + } + }, + "default": {} + }, + "height": { + "type": ["string", "number"], + "default": "100%" + }, + "width": { + "type": ["string", "number"], + "default": "100%" + }, + "code": { + "type": "string" + }, + "color": { + "type": "array" + }, + "textStyle": { + "type": "object" + }, + "title": { + "type": "object" + }, + "legend": { + "type": "object" + }, + "grid": { + "type": "object" + }, + "xAxis": { + "type": "object" + }, + "yAxis": { + "type": "object" + }, + "dataZoom": { + "type": "object" + }, + "series": { + "type": "object" + } + } +} \ No newline at end of file diff --git a/packages/charts-vue/components/charts-scatter/src/schema/schema-mapper.ts b/packages/charts-vue/components/charts-scatter/src/schema/schema-mapper.ts new file mode 100644 index 0000000000000000000000000000000000000000..f37bb5f44b4516f4d0ab751a3da893b673924f79 --- /dev/null +++ b/packages/charts-vue/components/charts-scatter/src/schema/schema-mapper.ts @@ -0,0 +1,5 @@ +import { MapperFunction, resolveAppearance } from "@farris/ui-vue"; + +export const schemaMapper = new Map([ + ['appearance', resolveAppearance] +]); \ No newline at end of file diff --git a/packages/charts-vue/components/charts-scatter/src/schema/schema-resolver.ts b/packages/charts-vue/components/charts-scatter/src/schema/schema-resolver.ts new file mode 100644 index 0000000000000000000000000000000000000000..c10c25caa2ad90607eee6f71572066e10a3515be --- /dev/null +++ b/packages/charts-vue/components/charts-scatter/src/schema/schema-resolver.ts @@ -0,0 +1,5 @@ +import { DynamicResolver } from "@farris/ui-vue"; + +export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record): Record { + return schema; +} diff --git a/packages/charts-vue/components/common/composition/type.ts b/packages/charts-vue/components/common/composition/type.ts new file mode 100644 index 0000000000000000000000000000000000000000..becb6d58ab158df8b8d1a93f332f47c1c1f42ce2 --- /dev/null +++ b/packages/charts-vue/components/common/composition/type.ts @@ -0,0 +1,32 @@ +export interface DataField { + col: string; + code: string; + dataType: string; + name: string; + datasetId: string; + sort: 'asc' | 'desc' | 'none'; +} + +// 值字段定义 +export interface ValueField { + col: string; + code: string; + aggregate: 'sum' | 'avg' | 'min' | 'max' | 'count' | 'distinct'; + dataType: string; + name: string; + datasetId?: string; + sort: 'asc' | 'desc' | 'none'; +} + +// 交互触发器定义 +export interface InteractiveTrigger { + code: string; + name: string; + includeQueryFields?: boolean; + extendedFields?: Array<{ + code: string; + name: string; + }>; +} + + diff --git a/packages/charts-vue/components/common/index.ts b/packages/charts-vue/components/common/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..b68e102d3c1b5881fbee194ca1285b707e47dfd5 --- /dev/null +++ b/packages/charts-vue/components/common/index.ts @@ -0,0 +1,36 @@ +export * from './props/type/chart.type'; +export * from './props/chart/blur.props'; +export * from './props/chart/datazoom.props'; +export * from './props/chart/grid.props'; +export * from './props/chart/itemstyle.props'; +export * from './props/chart/label.props'; +export * from './props/chart/labellayout.props'; +export * from './props/chart/labelline.props'; +export * from './props/chart/legend.props'; +export * from './props/chart/select.props'; +export * from './props/chart/textstyle.props'; +export * from './props/chart/title.props'; +export * from './props/chart/axis.props'; +export * from './props/chart/data.props'; +export * from './props/chart/border.props'; +export * from './props/chart/animation.props'; +export * from './props/chart/toolbox.props'; +export * from './props/chart/emphasis.props'; +export * from './props/chart/scalelimit.props'; + +export * from './props/common/button.props'; +export * from './props/common/data-binding.props'; +export * from './props/common/data-field.props'; +export * from './props/common/filter-field.props'; +export * from './props/common/value-field.props'; +export * from './props/common/env.props'; +export * from './props/common/background-config.props'; +export * from './props/common/gradient-stop.props'; +export * from './props/common/gradient-config.props'; +export * from './props/common/header-tool.props'; +export * from './props/common/data-item.props'; + +export * from './utils/with-install'; +export * from './utils/header-tool-utils'; +export * from './utils/widget-utils'; +export * from './utils/background-style-utils'; diff --git a/packages/charts-vue/components/common/props/chart/animation.props.ts b/packages/charts-vue/components/common/props/chart/animation.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..4487045e938d58ae0262ce14f11afc390089d627 --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/animation.props.ts @@ -0,0 +1,16 @@ +import { ExtractPropTypes, PropType } from 'vue'; + +export const animationProps = { + /** 是否开启动画。 */ + animation: { type: Boolean, default: true }, + /** 是否开启动画的阈值,当单个系列显示的图形数量大于这个阈值时会关闭动画。 */ + animationThreshold: { type: Number, default: 2000 }, + /** 初始动画的时长,支持回调函数 */ + animationDuration: { type: Number, default: 1000 }, + /** 初始动画的缓动效果 */ + animationEasingUpdate: { type: String, default: 'linear' }, + /** 初始动画的延迟,支持回调函数 */ + animationDelayUpdate: { type: [Number, Function] } +}; + +export type AnimationProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/axis.props.ts b/packages/charts-vue/components/common/props/chart/axis.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..a2b57dc968eba2bbf1d5315ed8c42685ac1cea55 --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/axis.props.ts @@ -0,0 +1,211 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { AlignLabelType, AlignType, AxisPointerType, AxisType, BorderType, FontStyleType, FontWeightType, LocationType, OverFlowType, PositionType, VerticalAlignType } from '../type/chart.type'; +import { TextStyleProps } from './textstyle.props'; +import { LineStyleProps } from './legend.props'; +import { TooltipProps } from './grid.props'; +import { AreaStyleProps } from './datazoom.props'; +import { LabelProps } from './label.props'; + +export const nameTruncateProps = { + maxWidth: { type: Number }, + + ellipsis: { type: String } +}; + +export type NameTruncateProps = ExtractPropTypes; + +export const axisLineProps = { + show: { type: Boolean, default: true }, + + onZero: { type: Boolean, default: true }, + + onZeroAxisIndex: { type: Number }, + + symbol: { type: String, Array, default: 'none' }, + + symbolSize: { type: Array }, + + symbolOffset: { type: Array }, + + lineStyle: { type: Object as PropType } +}; + +export type AxisLineProps = ExtractPropTypes; + +export const axisTickProps = { + show: { type: Boolean, default: true }, + + alignWithLabel: { type: Boolean, default: false }, + + interval: { type: [Number, Function], default: 'auto' }, + + inside: { type: Boolean, default: false }, + + length: { type: Number, default: 5 }, + + lineStyle: { type: Object as PropType } +}; + +export type AxisTickProps = ExtractPropTypes; + +export const axisLabelProps = { + show: { type: Boolean, default: true }, + + interval: { type: [Number, Function], default: 'auto' }, + + inside: { type: Boolean, default: false }, + + rotate: { type: Number, default: 0 }, + + margin: { type: Number, default: 8 }, + + formatter: { type: [String, Function] }, + + showMinLabel: { type: Boolean, default: null }, + + showMaxLabel: { type: Boolean, default: null }, + + alignMinLabel: { type: String as PropType, default: null }, + + alignMaxLabel: { type: String as PropType, default: null }, + + hideOverlap: { type: Boolean }, + + customValues: { type: Array }, + + color: { type: Function as PropType<(val: string) => string> }, + + fontStyle: { type: String as PropType }, + + fontWeight: { type: String as PropType , Number }, + + fontFamily: { type: String }, + + fontSize: { type: Number }, + + width: { type: Number }, + + height: { type: Number }, + + align: { type: String as PropType }, + + verticalAlign: { type: String as PropType }, + + borderColor: { type: String }, + + borderWidth: { type: Number }, + + borderType: { type: String as PropType }, + + borderRadius: { type: Number }, + + padding: { type: [Number, Array] }, + + overflow: { type: String as PropType } +}; + +export type AxisLabelProps = ExtractPropTypes; + +export const splitAreaProps = { + show: { type: Boolean }, + + interval: { type: [Number, Function], default: 'auto' }, + + areaStyle: { type: Object as PropType }, +}; + +export type SplitAreaProps = ExtractPropTypes; + +export const axisPointerProps = { + show: { type: Boolean }, + + type: { type: String as PropType }, + + snap: { type: Boolean }, + + z: { type: Number }, + + label: { type: Object as PropType }, + + lineStyle: { type: Object as PropType }, + + triggerEmphasis: { type: Boolean, default: true }, + + triggerTooltip: { type: Boolean, default: true }, + + value: { type: Number } +}; + +export type AxisPointerProps = ExtractPropTypes; + +export const axisProps = { + id: { type: String }, + + show: { type: Boolean, default: true }, + + gridIndex: { type: Number, default: 0 }, + + alignTicks: { type: Boolean, default: false }, + + position: { type: String as PropType }, + + offset: { type: Number, default: 0 }, + + type: { type: String as PropType, default: 'value' }, + + name: { type: String }, + + nameLocation: { type: String as PropType, default: 'end' }, + + nameTextStyle: { type: Object as PropType }, + + nameGap: { type: Number }, + + nameRotate: { type: Number }, + + nameTruncate: { type: Object as PropType }, + + inverse: { type: Boolean, default: false }, + + boundaryGap: { type: [Boolean, Array] }, + + min: { type: [Number, String, Function] }, + + max: { type: [Number, String, Function] }, + + scale: { type: Boolean, default: false }, + + splitNumber: { type: Number, default: 5 }, + + minInterval: { type: Number }, + + maxInterval: { type: Number }, + + logBase: { type: Number, default: 10 }, + + startValue: { type: Number }, + + silent: { type: Boolean, default: false }, + + triggerEvent: { type: Boolean, default: false }, + + axisLine: { type: Object as ExtractPropTypes }, + + axisTick: { type: Object as PropType }, + + axisLabel: { type: Object as PropType }, + + splitArea: { type: Object as PropType }, + + tooltip: { type: Object as PropType }, + + axisPointer: { type: Object as PropType }, + + zlevel: { type: Number }, + + z: { type: Number }, + + data: { type: Array } +}; + +export type AxisProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/blur.props.ts b/packages/charts-vue/components/common/props/chart/blur.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..c96792d5a281c2f4dbffb3b77af9dc6de14f9d74 --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/blur.props.ts @@ -0,0 +1,20 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { LabelProps } from './label.props'; +import { LabelLineProps } from './labelline.props'; +import { ItemStyleProps } from './itemstyle.props'; +import { LineStyleProps } from './legend.props'; +import { AreaStyleProps } from './datazoom.props'; + +export const blurProps = { + label: { type: Object as PropType }, + + labelLine: { type: Object as PropType }, + + itemStyle: { type: Object as PropType }, + + lineStyle: { type: Object as PropType }, + + areaStyle: { type: Object as PropType } +}; + +export type BlurProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/border.props.ts b/packages/charts-vue/components/common/props/chart/border.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..d13cf386fdf190a8708a496392b86eb287d6b320 --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/border.props.ts @@ -0,0 +1,15 @@ +import { ExtractPropTypes, PropType } from 'vue'; + +export const borderProps = { + borderColor: { type: String }, + + borderWidth: { type: Number }, + /** 边框类型: solid dashed dotted */ + borderType: { type: [String, Number, Array] }, + + borderDashOffset: { type: Number }, + + borderRadius: { type: [Number, Array] } +}; + +export type BorderProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/data.props.ts b/packages/charts-vue/components/common/props/chart/data.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..0361289f10250e1d0709d4bd5a11b23f32ba0c3c --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/data.props.ts @@ -0,0 +1,39 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { LabelProps } from './label.props'; +import { LabelLineProps } from './labelline.props'; +import { ItemStyleProps } from './itemstyle.props'; +import { BlurProps } from './blur.props'; +import { TooltipProps } from './grid.props'; +import { SelectProps } from './select.props'; + +export const dataProps = { + name: { type: String }, + + value: { type: String }, + + groupId: { type: String }, + + childGroupId: { type: String }, + + symbol: { type: [String, Array], default: 'none' }, + + symbolSize: { type: Array }, + + symbolOffset: { type: Array }, + + symbolRotate: { type: Number }, + + label: { type: Object as PropType }, + + labelLine: { type: Object as PropType }, + + itemStyle: { type: Object as PropType }, + + blur: { type: Object as PropType }, + + tooltip: { type: Object as PropType }, + + select: { type: Object as PropType } +}; + +export type DataProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/datazoom.props.ts b/packages/charts-vue/components/common/props/chart/datazoom.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..e71620e1cf3fc5eb97d89c80f7aff6b42935f658 --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/datazoom.props.ts @@ -0,0 +1,89 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { LineStyleProps } from './legend.props'; +import { TextStyleProps } from './textstyle.props'; + +export const areaStyleProps = { + color: { type: String }, + + opacity: { type: Number } +}; + +export type AreaStyleProps = ExtractPropTypes; + +export const dataBackgroundProps = { + color: { type: String }, + + width: { type: Number }, + + type: { type: [String, Number, Array] }, + + lineStyle: { type: Object as PropType }, + + areaStyle: { type: Object as PropType }, +}; + +export type DataBackgroundProps = ExtractPropTypes; + +export const selectedDataBackgroundProps = { + lineStyle: { type: Object as PropType }, + + areaStyle: { type: Object as PropType } +}; + +export type SelectedDataBackgroundProps = ExtractPropTypes; + +export const dataZoomProps = { + type: { type: String, default: 'slider' }, + + id: { type: String }, + + show: { type: Boolean, default: true }, + + backgroundColor: { type: String }, + + dataBackground: { type: Object as PropType }, + + selectedDataBackground: { type: Object as PropType }, + + fillerColor: { type: String }, + + borderColor: { type: String }, + + borderRadius: { type: Number }, + + showDetails: { type: Boolean, default: true }, + + realtime: { type: Boolean, default: true }, + + textStyle: { type: Object as PropType }, + + xAxisIndex: { type: [Number, Array] }, + + yAxisIndex: { type: [Number, Array] }, + + start: { type: Number }, + + end: { type: Number }, + + minSpan: { type: Number }, + + maxSpan: { type: Number }, + + zlevel: { type: Number }, + + z: { type: Number }, + + top: { type: [String, Number] }, + + bottom: { type: [String, Number] }, + + left: { type: [String, Number] }, + + right: { type: [String, Number] }, + + width: { type: [String, Number] }, + + height: { type: [String, Number] }, +}; + +export type DataZoomProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/emphasis.props.ts b/packages/charts-vue/components/common/props/chart/emphasis.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..cede8d47bf77d2bdcec2ab8ec82dc08bca3d24fd --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/emphasis.props.ts @@ -0,0 +1,23 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { FocusType, BlurScopeType } from '../type/chart.type'; +import { LabelProps } from './label.props'; +import { LabelLineProps } from './labelline.props'; +import { ItemStyleProps } from './itemstyle.props'; + + +export const emphasisProps = { + + disabled: { type: Boolean, default: false }, + + focus: { type: String as PropType, default: 'series' }, + + blurScope: { type: String as PropType, default: 'coordinateSystem' }, + + label: { type: Object as PropType }, + + labelLine: { type: Object as PropType }, + + itemStyle: { type: Object as PropType } +}; + +export type EmphasisProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/grid.props.ts b/packages/charts-vue/components/common/props/chart/grid.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..008dc740290434cd8d35d41a18f59d96e1099170 --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/grid.props.ts @@ -0,0 +1,56 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { TriggerType } from '../type/chart.type'; + +export const tooltipProps = { + show: { type: Boolean, default: true }, + + padding: { type: Array as unknown as PropType }, + + trigger: { type: String as PropType , default: 'item' }, + + formatter: { type: [String, Function] }, + + valueFormatter: { type: Object as PropType<(value: number | string, dataIndex: number) => string> }, + + backgroundColor: { type: String }, + + borderColor: { type: String }, + + borderWidth: { type: Number } +}; + +export type TooltipProps = ExtractPropTypes; + +export const gridProps = { + id: { type: String }, + + show: { type: Boolean, default: true }, + + zlevel: { type: Number }, + + z: { type: Number }, + + top: { type: [String, Number] }, + + bottom: { type: [String, Number] }, + + left: { type: [String, Number] }, + + right: { type: [String, Number] }, + + width: { type: [String, Number] }, + + height: { type: [String, Number] }, + + containLabel: { type: Boolean }, + + backgroundColor: { type: String }, + + borderColor: { type: String }, + + borderWidth: { type: Number }, + + tooltip: { type: Object as PropType } +}; + +export type GridProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/itemstyle.props.ts b/packages/charts-vue/components/common/props/chart/itemstyle.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..cadc24d680dbded97f8b1560182ce9a83f04a84c --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/itemstyle.props.ts @@ -0,0 +1,18 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { BorderType } from '../type/chart.type'; + +export const itemStyleProps = { + color: { type: String, default: 'auto' }, + + borderColor: { type: String }, + + borderWidth: { type: Number }, + + borderType: { type: String as PropType }, + + borderRadius: { type: Number }, + + opacity: { type: Number } +}; + +export type ItemStyleProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/label.props.ts b/packages/charts-vue/components/common/props/chart/label.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..c89d8f6bd0feb34bea04de0c2126441c983efc64 --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/label.props.ts @@ -0,0 +1,48 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { AlignType, BorderType, FontStyleType, FontWeightType, OverFlowType, PositionType, VerticalAlignType } from '../type/chart.type'; + +export const labelProps = { + show: { type: Boolean, default: false }, + + distance: { type: Number, default: 5 }, + + rotate: { type: Number }, + + offset: { type: Array }, + + formatter: { type: [String, Function] }, + + color: { type: String }, + + fontStyle: { type: String as PropType }, + + fontWeight: { type: [String as PropType , Number] }, + + fontFamily: { type: String }, + + fontSize: { type: Number }, + + align: { type: String as PropType }, + + verticalAlign: { type: String as PropType }, + + borderColor: { type: String }, + + borderWidth: { type: Number }, + + borderType: { type: String as PropType }, + + borderRadius: { type: Number }, + + padding: { type: [Number, Array] }, + + width: { type: Number }, + + height: { type: Number }, + + overflow: { type: String as PropType }, + + position: { type: String as PropType } +}; + +export type LabelProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/labellayout.props.ts b/packages/charts-vue/components/common/props/chart/labellayout.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..218ccd4aa8f3a61ee40fc4bc0aa559ba90239f5c --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/labellayout.props.ts @@ -0,0 +1,34 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { AlignType, MoveOverlapType, VerticalAlignType } from '../type/chart.type'; + +export const labelLayoutProps = { + hideOverlap: { type: Boolean }, + + moveOverlap: { type: String as PropType }, + + x: { type: [String, Number] }, + + y: { type: [String, Number] }, + + dx: { type: Number }, + + dy: { type: Number }, + + rotate: { type: Number }, + + width: { type: Number }, + + height: { type: Number }, + + align: { type: String as PropType }, + + verticalAlign: { type: String as PropType }, + + fontSize: { type: Number }, + + draggable: { type: Boolean }, + + labelLinePoints: { type: Array } +}; + +export type LabelLayoutProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/labelline.props.ts b/packages/charts-vue/components/common/props/chart/labelline.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..3064b42682c7491f776f5b1375965f7c052f9879 --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/labelline.props.ts @@ -0,0 +1,10 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { LineStyleProps } from './legend.props'; + +export const labelLineProps = { + show: { type: Boolean }, + + lineStyle: { type: Object as PropType } +}; + +export type LabelLineProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/legend.props.ts b/packages/charts-vue/components/common/props/chart/legend.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..eb63900e2122cfe18f9fa0f715d8338ab98b965a --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/legend.props.ts @@ -0,0 +1,85 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { LegendType, AlignType, OrientType, BorderType, CapType, JoinType } from '../type/chart.type'; +import { TextStyleProps } from './textstyle.props'; +import { ItemStyleProps } from './itemstyle.props'; +import { TooltipProps } from './grid.props'; + +export const lineStyleProps = { + color: { type: String }, + + width: { type: Number }, + + type: { type: String as PropType }, + + dashOffset: { type: Number }, + + cap: { type: String as PropType }, + + join: { type: String as PropType }, + + opacity: { type: Number } +}; + +export type LineStyleProps = ExtractPropTypes; + +export const legendDataProps = { + name: { type: String }, + + icon: { type: String }, + + value: { type: String }, + + textStyle: { type: Object as ExtractPropTypes } +}; + +export type LegendDataProps = ExtractPropTypes; + +export const legendProps = { + id: { type: String }, + + show: { type: Boolean, default: true }, + + type: { type: String as PropType }, + + top: { type: [String, Number], default: 'auto' }, + + bottom: { type: [String, Number], default: 'auto' }, + + left: { type: [String, Number], default: 'auto' }, + + right: { type: [String, Number], default: 'auto' }, + + width: { type: [String, Number], default: 'auto' }, + + height: { type: [String, Number], default: 'auto' }, + + orient: { type: String as PropType }, + + align: { type: String as PropType, default: 'auto' }, + + itemGap: { type: Number, default: 10 }, + + itemWidth: { type: Number, default: 25 }, + + itemHeight: { type: Number, default: 14 }, + + itemStyle: { type: Object as PropType }, + + lineStyle: { type: Object as PropType }, + + formatter: { type: [String, Function as PropType<(name: string) => string>] }, + + selectedMode: { type: Boolean, default: true }, + + textStyle: { type: Object as PropType }, + + tooltip: { type: Object as PropType, default: true }, + + icon: { type: String }, + + data: { type: Array }, + + borderRadius: { type: [String, Number] } +}; + +export type LegendProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/scalelimit.props.ts b/packages/charts-vue/components/common/props/chart/scalelimit.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..86ff928ec97e2c0fbe483a11e7fe5ba83e3fbaba --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/scalelimit.props.ts @@ -0,0 +1,11 @@ +import { ExtractPropTypes } from 'vue'; + +export const scaleLimitProps = { + + min: { type: Number}, + + max: { type: Number} + +}; + +export type ScaleLimitProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/select.props.ts b/packages/charts-vue/components/common/props/chart/select.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..be6a009fbb73c8f5c5fa306fffdfb0e98ad204a0 --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/select.props.ts @@ -0,0 +1,16 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { LabelProps } from './label.props'; +import { LabelLineProps } from './labelline.props'; +import { ItemStyleProps } from './itemstyle.props'; + +export const selectProps = { + disabled: { type: Boolean }, + + label: { type: Object as PropType }, + + labelLine: { type: Object as PropType }, + + itemStyle: { type: Object as PropType } +}; + +export type SelectProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/style.props.ts b/packages/charts-vue/components/common/props/chart/style.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/charts-vue/components/common/props/chart/textstyle.props.ts b/packages/charts-vue/components/common/props/chart/textstyle.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..48876f0996d4126cf053fd04c713dfd297a3608c --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/textstyle.props.ts @@ -0,0 +1,32 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { FontStyleType, FontWeightType, OverFlowType, AlignType, VerticalAlignType } from '../type/chart.type'; + +export const textStyleProps = { + color: { type: String }, + + fontStyle: { type: String as PropType }, + + fontWeight: { type: String as PropType , Number }, + + fontFamily: { type: String }, + + lineHeight: { type: Number }, + + width: { type: Number }, + + height: { type: Number }, + + overflow: { type: String as PropType } +}; + +export type TextStyleProps = ExtractPropTypes; + +export const subTextStyleProps = { + ...textStyleProps, + + align: { type: String as PropType }, + + verticalAlign: { type: String as PropType } +}; + +export type SubTextStyleProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/title.props.ts b/packages/charts-vue/components/common/props/chart/title.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..023c7073fef7d093a7da0b6ca3954a73fcdbee68 --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/title.props.ts @@ -0,0 +1,44 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { SubTextStyleProps, TextStyleProps } from './textstyle.props'; +import { LinkType } from '../type/chart.type'; +import { borderProps } from './border.props'; + +export const titleProps = { + id: { type: String }, + + show: { type: Boolean, default: true }, + + text: { type: String }, + + target: { type: String as PropType, default: 'blank' }, + + textStyle: { type: Object as PropType }, + + subtext: { type: String }, + + sublink: { type: String }, + + subtarget: { type: String as PropType, default: 'blank' }, + + subtextStyle: { type: Object as PropType }, + + triggerEvent: { type: Boolean, default: true }, + + padding: { type: Array as unknown as PropType }, + + itemGap: { type: Number, default: 10 }, + + top: { type: [String, Number], default: 'auto' }, + + bottom: { type: [String, Number], default: 'auto' }, + + left: { type: [String, Number], default: 'auto' }, + + right: { type: [String, Number], default: 'auto' }, + + backgroundColor: { type: String }, + + ...borderProps +}; + +export type TitleProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/chart/toolbox.props.ts b/packages/charts-vue/components/common/props/chart/toolbox.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..bcafe92d8b8fee9685cb2554dd19c05230d5247a --- /dev/null +++ b/packages/charts-vue/components/common/props/chart/toolbox.props.ts @@ -0,0 +1,42 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { OrientType } from '../type/chart.type'; + +export const toolboxFeatureProps = { + dataZoom: { type: Object, default: {} }, + + restore: { type: Object, default: {} }, + + saveAsImage: { type: Object, default: {} }, +}; + +export type toolboxFeatureProps = ExtractPropTypes; + +export const toolboxProps = { + id: { type: String }, + + show: { type: Boolean, default: true }, + + orient: { type: String as PropType, default: 'horizontal' }, + + showTitle: { type: Boolean, default: true }, + + top: { type: [String, Number] }, + + bottom: { type: [String, Number] }, + + left: { type: [String, Number] }, + + right: { type: [String, Number] }, + + width: { type: [String, Number] }, + + height: { type: [String, Number] }, + + zlevel: { type: Number }, + + z: { type: Number }, + + feature: { type: Object as PropType } +}; + +export type ToolboxProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/animation.props.ts b/packages/charts-vue/components/common/props/common/animation.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..4487045e938d58ae0262ce14f11afc390089d627 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/animation.props.ts @@ -0,0 +1,16 @@ +import { ExtractPropTypes, PropType } from 'vue'; + +export const animationProps = { + /** 是否开启动画。 */ + animation: { type: Boolean, default: true }, + /** 是否开启动画的阈值,当单个系列显示的图形数量大于这个阈值时会关闭动画。 */ + animationThreshold: { type: Number, default: 2000 }, + /** 初始动画的时长,支持回调函数 */ + animationDuration: { type: Number, default: 1000 }, + /** 初始动画的缓动效果 */ + animationEasingUpdate: { type: String, default: 'linear' }, + /** 初始动画的延迟,支持回调函数 */ + animationDelayUpdate: { type: [Number, Function] } +}; + +export type AnimationProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/axis.props.ts b/packages/charts-vue/components/common/props/common/axis.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..fbc4ef8994cfaf4d1db1e9c6a22cf1f1231cba8f --- /dev/null +++ b/packages/charts-vue/components/common/props/common/axis.props.ts @@ -0,0 +1,211 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { AlignLabelType, AlignType, AxisPointerType, AxisType, BorderType, FontStyleType, FontWeightType, LocationType, OverFlowType, PositionType, VerticalAlignType } from '../type/common.type'; +import { TextStyleProps } from './textstyle.props'; +import { LineStyleProps } from './legend.props'; +import { TooltipProps } from './grid.props'; +import { AreaStyleProps } from './datazoom.props'; +import { LabelProps } from './label.props'; + +export const nameTruncateProps = { + maxWidth: { type: Number }, + + ellipsis: { type: String } +}; + +export type NameTruncateProps = ExtractPropTypes; + +export const axisLineProps = { + show: { type: Boolean, default: true }, + + onZero: { type: Boolean, default: true }, + + onZeroAxisIndex: { type: Number }, + + symbol: { type: String, Array, default: 'none' }, + + symbolSize: { type: Array }, + + symbolOffset: { type: Array }, + + lineStyle: { type: Object as PropType } +}; + +export type AxisLineProps = ExtractPropTypes; + +export const axisTickProps = { + show: { type: Boolean, default: true }, + + alignWithLabel: { type: Boolean, default: false }, + + interval: { type: [Number, Function], default: 'auto' }, + + inside: { type: Boolean, default: false }, + + length: { type: Number, default: 5 }, + + lineStyle: { type: Object as PropType } +}; + +export type AxisTickProps = ExtractPropTypes; + +export const axisLabelProps = { + show: { type: Boolean, default: true }, + + interval: { type: [Number, Function], default: 'auto' }, + + inside: { type: Boolean, default: false }, + + rotate: { type: Number, default: 0 }, + + margin: { type: Number, default: 8 }, + + formatter: { type: [String, Function] }, + + showMinLabel: { type: Boolean, default: null }, + + showMaxLabel: { type: Boolean, default: null }, + + alignMinLabel: { type: String as PropType, default: null }, + + alignMaxLabel: { type: String as PropType, default: null }, + + hideOverlap: { type: Boolean }, + + customValues: { type: Array }, + + color: { type: Function as PropType<(val: string) => string> }, + + fontStyle: { type: String as PropType }, + + fontWeight: { type: String as PropType , Number }, + + fontFamily: { type: String }, + + fontSize: { type: Number }, + + width: { type: Number }, + + height: { type: Number }, + + align: { type: String as PropType }, + + verticalAlign: { type: String as PropType }, + + borderColor: { type: String }, + + borderWidth: { type: Number }, + + borderType: { type: String as PropType }, + + borderRadius: { type: Number }, + + padding: { type: [Number, Array] }, + + overflow: { type: String as PropType } +}; + +export type AxisLabelProps = ExtractPropTypes; + +export const splitAreaProps = { + show: { type: Boolean }, + + interval: { type: [Number, Function], default: 'auto' }, + + areaStyle: { type: Object as PropType }, +}; + +export type SplitAreaProps = ExtractPropTypes; + +export const axisPointerProps = { + show: { type: Boolean }, + + type: { type: String as PropType }, + + snap: { type: Boolean }, + + z: { type: Number }, + + label: { type: Object as PropType }, + + lineStyle: { type: Object as PropType }, + + triggerEmphasis: { type: Boolean, default: true }, + + triggerTooltip: { type: Boolean, default: true }, + + value: { type: Number } +}; + +export type AxisPointerProps = ExtractPropTypes; + +export const axisProps = { + id: { type: String }, + + show: { type: Boolean, default: true }, + + gridIndex: { type: Number, default: 0 }, + + alignTicks: { type: Boolean, default: false }, + + position: { type: String as PropType }, + + offset: { type: Number, default: 0 }, + + type: { type: String as PropType, default: 'value' }, + + name: { type: String }, + + nameLocation: { type: String as PropType, default: 'end' }, + + nameTextStyle: { type: Object as PropType }, + + nameGap: { type: Number }, + + nameRotate: { type: Number }, + + nameTruncate: { type: Object as PropType }, + + inverse: { type: Boolean, default: false }, + + boundaryGap: { type: [Boolean, Array] }, + + min: { type: [Number, String, Function] }, + + max: { type: [Number, String, Function] }, + + scale: { type: Boolean, default: false }, + + splitNumber: { type: Number, default: 5 }, + + minInterval: { type: Number }, + + maxInterval: { type: Number }, + + logBase: { type: Number, default: 10 }, + + startValue: { type: Number }, + + silent: { type: Boolean, default: false }, + + triggerEvent: { type: Boolean, default: false }, + + axisLine: { type: Object as ExtractPropTypes }, + + axisTick: { type: Object as PropType }, + + axisLabel: { type: Object as PropType }, + + splitArea: { type: Object as PropType }, + + tooltip: { type: Object as PropType }, + + axisPointer: { type: Object as PropType }, + + zlevel: { type: Number }, + + z: { type: Number }, + + data: { type: Array } +}; + +export type AxisProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/background-config.props.ts b/packages/charts-vue/components/common/props/common/background-config.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6e2944fa1c8c2a49d0dd775d7a6c334e3795d59 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/background-config.props.ts @@ -0,0 +1,34 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { GradientConfigProps } from './gradient-config.props'; + +export const backgroundConfigProps = { + type: { + type: String as PropType<'color' | 'image' | 'gradient'>, + default: 'color' + }, + color: { + type: String, + default: '#fff' + }, + image: { + type: String + }, + gradient: { + type: Object as PropType, + default: () => ({ + type: 'linear', + angle: 0, + stops: [{ + color: '#ffffff', + position: 0 + }, { + color: '#e0e0e0', + position: 100 + }] + }) + } +}; + +export type BackgroundConfigProps = ExtractPropTypes; + +export default backgroundConfigProps; diff --git a/packages/charts-vue/components/common/props/common/blur.props.ts b/packages/charts-vue/components/common/props/common/blur.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..c96792d5a281c2f4dbffb3b77af9dc6de14f9d74 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/blur.props.ts @@ -0,0 +1,20 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { LabelProps } from './label.props'; +import { LabelLineProps } from './labelline.props'; +import { ItemStyleProps } from './itemstyle.props'; +import { LineStyleProps } from './legend.props'; +import { AreaStyleProps } from './datazoom.props'; + +export const blurProps = { + label: { type: Object as PropType }, + + labelLine: { type: Object as PropType }, + + itemStyle: { type: Object as PropType }, + + lineStyle: { type: Object as PropType }, + + areaStyle: { type: Object as PropType } +}; + +export type BlurProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/border.props.ts b/packages/charts-vue/components/common/props/common/border.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..d13cf386fdf190a8708a496392b86eb287d6b320 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/border.props.ts @@ -0,0 +1,15 @@ +import { ExtractPropTypes, PropType } from 'vue'; + +export const borderProps = { + borderColor: { type: String }, + + borderWidth: { type: Number }, + /** 边框类型: solid dashed dotted */ + borderType: { type: [String, Number, Array] }, + + borderDashOffset: { type: Number }, + + borderRadius: { type: [Number, Array] } +}; + +export type BorderProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/button.props.ts b/packages/charts-vue/components/common/props/common/button.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..33b21105e014aaa7381529e3f868de13a347d6ed --- /dev/null +++ b/packages/charts-vue/components/common/props/common/button.props.ts @@ -0,0 +1,13 @@ +import { ExtractPropTypes, PropType } from 'vue'; +// 按钮配置 +export const buttonProps = { + id: { type: String }, + text: { type: String }, + icon: { type: String }, + disabled: { type: Boolean }, + visible: { type: Boolean }, + onClick: { type: Function as PropType<(...args: any[]) => void> }, + // 支持更多元数据配置属性 +}; + +export type ButtonProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/common.props.ts b/packages/charts-vue/components/common/props/common/common.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/charts-vue/components/common/props/common/data-binding.props.ts b/packages/charts-vue/components/common/props/common/data-binding.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..2c9cb3915f0c0cd6a5d4e943e4d3953afdfb3116 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/data-binding.props.ts @@ -0,0 +1,44 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { DataFieldProps } from './data-field.props'; +import { FilterFieldProps } from './filter-field.props'; +import { ValueFieldProps } from './value-field.props'; +export interface DataBindingKeyConfig { + type: string; + name: string; + name_cht: string; + name_chs: string; + name_en: string; + maxNumber: number; + minNumber: number; + cols: DataFieldProps[]; +} + +// 数据绑定配置中的值字段配置 +export interface DataBindingValueConfig { + type: string; + name: string; + name_cht: string; + name_chs: string; + name_en: string; + maxNumber: number;// 允许拖入的最多字段数 + minNumber: number;// 允许拖入的最少字段数 + cols: ValueFieldProps[]; +} +export interface sortFieldProps { + code: string; + sort: string; +} +// 数据绑定配置 +export const dataBindingProps = { + queryViewIds: { type: Array as PropType }, + // 只放置维度字段,不同的项代表不同的分类,使用type字段区分,例如交叉表,可以有两个即type为row和type为column + keys: { type: Array as PropType }, + // 不区分字段类型可以维度量度混合放置,不同的项代表不同的分类 + columns: { type: Array as PropType }, + // 只放置数值类字段,不同的项代表不同的分类,使用type字段区分,例如双Y轴,可以有两个即type为Y1和type为Y2 + values: { type: Array as PropType }, + filters: { type: Array as PropType }, + sorts: { type: Array as PropType }, +}; + +export type DataBindingProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/data-field.props.ts b/packages/charts-vue/components/common/props/common/data-field.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..a8a61967bf92d78647c82f92bb4008a8e8e59bbf --- /dev/null +++ b/packages/charts-vue/components/common/props/common/data-field.props.ts @@ -0,0 +1,14 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { SortType } from '../type/common.type'; +// 基础字段类型 +export const dataFieldProps = { + col: { type: String }, + code: { type: String }, + dataType: { type: String }, + name: { type: String }, + datasetId: { type: String }, + sort: { type: String as PropType } + // 支持更多元数据配置属性 +}; + +export type DataFieldProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/data-item.props.ts b/packages/charts-vue/components/common/props/common/data-item.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..51f50edb7f0d958108f7d5d3300294cf689c971e --- /dev/null +++ b/packages/charts-vue/components/common/props/common/data-item.props.ts @@ -0,0 +1,7 @@ +export interface DataItemFieldProps { + value: string | number | null; + displayValue?: string; +} +export interface DataItemProps { + [key: string]: DataItemFieldProps; +} diff --git a/packages/charts-vue/components/common/props/common/data.props.ts b/packages/charts-vue/components/common/props/common/data.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..0361289f10250e1d0709d4bd5a11b23f32ba0c3c --- /dev/null +++ b/packages/charts-vue/components/common/props/common/data.props.ts @@ -0,0 +1,39 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { LabelProps } from './label.props'; +import { LabelLineProps } from './labelline.props'; +import { ItemStyleProps } from './itemstyle.props'; +import { BlurProps } from './blur.props'; +import { TooltipProps } from './grid.props'; +import { SelectProps } from './select.props'; + +export const dataProps = { + name: { type: String }, + + value: { type: String }, + + groupId: { type: String }, + + childGroupId: { type: String }, + + symbol: { type: [String, Array], default: 'none' }, + + symbolSize: { type: Array }, + + symbolOffset: { type: Array }, + + symbolRotate: { type: Number }, + + label: { type: Object as PropType }, + + labelLine: { type: Object as PropType }, + + itemStyle: { type: Object as PropType }, + + blur: { type: Object as PropType }, + + tooltip: { type: Object as PropType }, + + select: { type: Object as PropType } +}; + +export type DataProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/datazoom.props.ts b/packages/charts-vue/components/common/props/common/datazoom.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..e71620e1cf3fc5eb97d89c80f7aff6b42935f658 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/datazoom.props.ts @@ -0,0 +1,89 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { LineStyleProps } from './legend.props'; +import { TextStyleProps } from './textstyle.props'; + +export const areaStyleProps = { + color: { type: String }, + + opacity: { type: Number } +}; + +export type AreaStyleProps = ExtractPropTypes; + +export const dataBackgroundProps = { + color: { type: String }, + + width: { type: Number }, + + type: { type: [String, Number, Array] }, + + lineStyle: { type: Object as PropType }, + + areaStyle: { type: Object as PropType }, +}; + +export type DataBackgroundProps = ExtractPropTypes; + +export const selectedDataBackgroundProps = { + lineStyle: { type: Object as PropType }, + + areaStyle: { type: Object as PropType } +}; + +export type SelectedDataBackgroundProps = ExtractPropTypes; + +export const dataZoomProps = { + type: { type: String, default: 'slider' }, + + id: { type: String }, + + show: { type: Boolean, default: true }, + + backgroundColor: { type: String }, + + dataBackground: { type: Object as PropType }, + + selectedDataBackground: { type: Object as PropType }, + + fillerColor: { type: String }, + + borderColor: { type: String }, + + borderRadius: { type: Number }, + + showDetails: { type: Boolean, default: true }, + + realtime: { type: Boolean, default: true }, + + textStyle: { type: Object as PropType }, + + xAxisIndex: { type: [Number, Array] }, + + yAxisIndex: { type: [Number, Array] }, + + start: { type: Number }, + + end: { type: Number }, + + minSpan: { type: Number }, + + maxSpan: { type: Number }, + + zlevel: { type: Number }, + + z: { type: Number }, + + top: { type: [String, Number] }, + + bottom: { type: [String, Number] }, + + left: { type: [String, Number] }, + + right: { type: [String, Number] }, + + width: { type: [String, Number] }, + + height: { type: [String, Number] }, +}; + +export type DataZoomProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/emphasis.props.ts b/packages/charts-vue/components/common/props/common/emphasis.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..dee43a1144b8006f84468f749b901e9273444bd7 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/emphasis.props.ts @@ -0,0 +1,23 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { FocusType, BlurScopeType } from '../type/common.type'; +import { LabelProps } from './label.props'; +import { LabelLineProps } from './labelline.props'; +import { ItemStyleProps } from './itemstyle.props'; + + +export const emphasisProps = { + + disabled: { type: Boolean, default: false }, + + focus: { type: String as PropType, default: 'series' }, + + blurScope: { type: String as PropType, default: 'coordinateSystem' }, + + label: { type: Object as PropType }, + + labelLine: { type: Object as PropType }, + + itemStyle: { type: Object as PropType } +}; + +export type EmphasisProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/env.props.ts b/packages/charts-vue/components/common/props/common/env.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..6e9433ec9dfebda739c0cdb9b1e5c68da94b3aa5 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/env.props.ts @@ -0,0 +1,12 @@ +import { ExtractPropTypes, Prop, PropType } from 'vue'; +import { ViewportType, SceneType, LanguageType } from '../type/common.type'; +// 环境变量定义 +export const envProps = { + viewportType: { type: String as PropType }, + sceneType: { type: String as PropType }, + theme: { type: Object }, + font: { type: Object }, + language: { type: String as PropType } +}; + +export type EnvProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/filter-field.props.ts b/packages/charts-vue/components/common/props/common/filter-field.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..4d7eb380fc089b7e786aa99e9d28f08514964a4b --- /dev/null +++ b/packages/charts-vue/components/common/props/common/filter-field.props.ts @@ -0,0 +1,8 @@ +import { ExtractPropTypes } from 'vue'; +// 过滤,后期修修改 +export const filterFieldProps = { + col: { type: String }, + value: { type: [String, Number] }, +}; + +export type FilterFieldProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/gradient-config.props.ts b/packages/charts-vue/components/common/props/common/gradient-config.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..2a6490e13b4b9464fbb34bfacd49607b0c49e5ca --- /dev/null +++ b/packages/charts-vue/components/common/props/common/gradient-config.props.ts @@ -0,0 +1,27 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { GradientStopProps } from './gradient-stop.props'; + +export const gradientConfigProps = { + type: { + type: String as PropType<'linear' | 'radial'>, + default: 'linear' + }, + angle: { + type: Number, + default: 0 + }, + stops: { + type: Array as PropType, + default: () => ([{ + color: '#ffffff', + position: 0 + }, { + color: '#e0e0e0', + position: 100 + }]) + } +}; + +export type GradientConfigProps = ExtractPropTypes; + +export default gradientConfigProps; diff --git a/packages/charts-vue/components/common/props/common/gradient-stop.props.ts b/packages/charts-vue/components/common/props/common/gradient-stop.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..b580f1772dd37bdd83f6ed38dcbc11f2e9e187a7 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/gradient-stop.props.ts @@ -0,0 +1,17 @@ +import { ExtractPropTypes, PropType } from 'vue'; + +export const gradientStopProps = { + color: { + type: String, + required: true + }, + position: { + type: Number, + required: true, + validator: (value: number) => value >= 0 && value <= 100 + } +}; + +export type GradientStopProps = ExtractPropTypes; + +export default gradientStopProps; diff --git a/packages/charts-vue/components/common/props/common/grid.props.ts b/packages/charts-vue/components/common/props/common/grid.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..cf066a7d0456d437d693e0b4b6c1502c180260bc --- /dev/null +++ b/packages/charts-vue/components/common/props/common/grid.props.ts @@ -0,0 +1,56 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { TriggerType } from '../type/common.type'; + +export const tooltipProps = { + show: { type: Boolean, default: true }, + + padding: { type: Array as unknown as PropType }, + + trigger: { type: String as PropType , default: 'item' }, + + formatter: { type: [String, Function] }, + + valueFormatter: { type: Object as PropType<(value: number | string, dataIndex: number) => string> }, + + backgroundColor: { type: String }, + + borderColor: { type: String }, + + borderWidth: { type: Number } +}; + +export type TooltipProps = ExtractPropTypes; + +export const gridProps = { + id: { type: String }, + + show: { type: Boolean, default: true }, + + zlevel: { type: Number }, + + z: { type: Number }, + + top: { type: [String, Number] }, + + bottom: { type: [String, Number] }, + + left: { type: [String, Number] }, + + right: { type: [String, Number] }, + + width: { type: [String, Number] }, + + height: { type: [String, Number] }, + + containLabel: { type: Boolean }, + + backgroundColor: { type: String }, + + borderColor: { type: String }, + + borderWidth: { type: Number }, + + tooltip: { type: Object as PropType } +}; + +export type GridProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/header-tool.props.ts b/packages/charts-vue/components/common/props/common/header-tool.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..ae60320891831a4e8fbd7d0712d700d8d4463adf --- /dev/null +++ b/packages/charts-vue/components/common/props/common/header-tool.props.ts @@ -0,0 +1,12 @@ +import { ExtractPropTypes } from 'vue'; + +// 标题工具配置 +export const headerToolProps = { + id: { type: String }, + type: { type: String }, // 如 'select', 'date-picker' 等 + label: { type: String }, + options: { type: Array<{ name: string; value: any }> }, + value: { type: [String, Number, Object, Array] }, + // 支持更多元数据配置属性 +}; +export type HeaderToolProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/itemstyle.props.ts b/packages/charts-vue/components/common/props/common/itemstyle.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..badab5b84466ea83486abcc8532804f55c6f994b --- /dev/null +++ b/packages/charts-vue/components/common/props/common/itemstyle.props.ts @@ -0,0 +1,18 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { BorderType } from '../type/common.type'; + +export const itemStyleProps = { + color: { type: String, default: 'auto' }, + + borderColor: { type: String }, + + borderWidth: { type: Number }, + + borderType: { type: String as PropType }, + + borderRadius: { type: Number }, + + opacity: { type: Number } +}; + +export type ItemStyleProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/label.props.ts b/packages/charts-vue/components/common/props/common/label.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..ed4d880438abf2bd6a781176ef4f4910f02d243b --- /dev/null +++ b/packages/charts-vue/components/common/props/common/label.props.ts @@ -0,0 +1,48 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { AlignType, BorderType, FontStyleType, FontWeightType, OverFlowType, PositionType, VerticalAlignType } from '../type/common.type'; + +export const labelProps = { + show: { type: Boolean, default: false }, + + distance: { type: Number, default: 5 }, + + rotate: { type: Number }, + + offset: { type: Array }, + + formatter: { type: [String, Function] }, + + color: { type: String }, + + fontStyle: { type: String as PropType }, + + fontWeight: { type: [String as PropType , Number] }, + + fontFamily: { type: String }, + + fontSize: { type: Number }, + + align: { type: String as PropType }, + + verticalAlign: { type: String as PropType }, + + borderColor: { type: String }, + + borderWidth: { type: Number }, + + borderType: { type: String as PropType }, + + borderRadius: { type: Number }, + + padding: { type: [Number, Array] }, + + width: { type: Number }, + + height: { type: Number }, + + overflow: { type: String as PropType }, + + position: { type: String as PropType } +}; + +export type LabelProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/labellayout.props.ts b/packages/charts-vue/components/common/props/common/labellayout.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..e789d3c3cd9c2d0263a690a98ce164470b067c0e --- /dev/null +++ b/packages/charts-vue/components/common/props/common/labellayout.props.ts @@ -0,0 +1,34 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { AlignType, MoveOverlapType, VerticalAlignType } from '../type/common.type'; + +export const labelLayoutProps = { + hideOverlap: { type: Boolean }, + + moveOverlap: { type: String as PropType }, + + x: { type: [String, Number] }, + + y: { type: [String, Number] }, + + dx: { type: Number }, + + dy: { type: Number }, + + rotate: { type: Number }, + + width: { type: Number }, + + height: { type: Number }, + + align: { type: String as PropType }, + + verticalAlign: { type: String as PropType }, + + fontSize: { type: Number }, + + draggable: { type: Boolean }, + + labelLinePoints: { type: Array } +}; + +export type LabelLayoutProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/labelline.props.ts b/packages/charts-vue/components/common/props/common/labelline.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..3064b42682c7491f776f5b1375965f7c052f9879 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/labelline.props.ts @@ -0,0 +1,10 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { LineStyleProps } from './legend.props'; + +export const labelLineProps = { + show: { type: Boolean }, + + lineStyle: { type: Object as PropType } +}; + +export type LabelLineProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/legend.props.ts b/packages/charts-vue/components/common/props/common/legend.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..be320467cc5c0a7e7b7cbea5ac1979547528bd35 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/legend.props.ts @@ -0,0 +1,85 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { LegendType, AlignType, OrientType, BorderType, CapType, JoinType } from '../type/common.type'; +import { TextStyleProps } from './textstyle.props'; +import { ItemStyleProps } from './itemstyle.props'; +import { TooltipProps } from './grid.props'; + +export const lineStyleProps = { + color: { type: String }, + + width: { type: Number }, + + type: { type: String as PropType }, + + dashOffset: { type: Number }, + + cap: { type: String as PropType }, + + join: { type: String as PropType }, + + opacity: { type: Number } +}; + +export type LineStyleProps = ExtractPropTypes; + +export const legendDataProps = { + name: { type: String }, + + icon: { type: String }, + + value: { type: String }, + + textStyle: { type: Object as ExtractPropTypes } +}; + +export type LegendDataProps = ExtractPropTypes; + +export const legendProps = { + id: { type: String }, + + show: { type: Boolean, default: true }, + + type: { type: String as PropType }, + + top: { type: [String, Number], default: 'auto' }, + + bottom: { type: [String, Number], default: 'auto' }, + + left: { type: [String, Number], default: 'auto' }, + + right: { type: [String, Number], default: 'auto' }, + + width: { type: [String, Number], default: 'auto' }, + + height: { type: [String, Number], default: 'auto' }, + + orient: { type: String as PropType }, + + align: { type: String as PropType, default: 'auto' }, + + itemGap: { type: Number, default: 10 }, + + itemWidth: { type: Number, default: 25 }, + + itemHeight: { type: Number, default: 14 }, + + itemStyle: { type: Object as PropType }, + + lineStyle: { type: Object as PropType }, + + formatter: { type: [String, Function as PropType<(name: string) => string>] }, + + selectedMode: { type: Boolean, default: true }, + + textStyle: { type: Object as PropType }, + + tooltip: { type: Object as PropType, default: true }, + + icon: { type: String }, + + data: { type: Array }, + + borderRadius: { type: [String, Number] } +}; + +export type LegendProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/scalelimit.props.ts b/packages/charts-vue/components/common/props/common/scalelimit.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..86ff928ec97e2c0fbe483a11e7fe5ba83e3fbaba --- /dev/null +++ b/packages/charts-vue/components/common/props/common/scalelimit.props.ts @@ -0,0 +1,11 @@ +import { ExtractPropTypes } from 'vue'; + +export const scaleLimitProps = { + + min: { type: Number}, + + max: { type: Number} + +}; + +export type ScaleLimitProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/select.props.ts b/packages/charts-vue/components/common/props/common/select.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..be6a009fbb73c8f5c5fa306fffdfb0e98ad204a0 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/select.props.ts @@ -0,0 +1,16 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { LabelProps } from './label.props'; +import { LabelLineProps } from './labelline.props'; +import { ItemStyleProps } from './itemstyle.props'; + +export const selectProps = { + disabled: { type: Boolean }, + + label: { type: Object as PropType }, + + labelLine: { type: Object as PropType }, + + itemStyle: { type: Object as PropType } +}; + +export type SelectProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/style.props.ts b/packages/charts-vue/components/common/props/common/style.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/charts-vue/components/common/props/common/textstyle.props.ts b/packages/charts-vue/components/common/props/common/textstyle.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..aed62f958d2217b5436d4966777ac146c0bb5705 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/textstyle.props.ts @@ -0,0 +1,32 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { FontStyleType, FontWeightType, OverFlowType, AlignType, VerticalAlignType } from '../type/common.type'; + +export const textStyleProps = { + color: { type: String }, + + fontStyle: { type: String as PropType }, + + fontWeight: { type: String as PropType , Number }, + + fontFamily: { type: String }, + + lineHeight: { type: Number }, + + width: { type: Number }, + + height: { type: Number }, + + overflow: { type: String as PropType } +}; + +export type TextStyleProps = ExtractPropTypes; + +export const subTextStyleProps = { + ...textStyleProps, + + align: { type: String as PropType }, + + verticalAlign: { type: String as PropType } +}; + +export type SubTextStyleProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/title.props.ts b/packages/charts-vue/components/common/props/common/title.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..09483965b0d62546e4605a52363858567922cb60 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/title.props.ts @@ -0,0 +1,44 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { SubTextStyleProps, TextStyleProps } from './textstyle.props'; +import { LinkType } from '../type/common.type'; +import { borderProps } from './border.props'; + +export const titleProps = { + id: { type: String }, + + show: { type: Boolean, default: true }, + + text: { type: String }, + + target: { type: String as PropType, default: 'blank' }, + + textStyle: { type: Object as PropType }, + + subtext: { type: String }, + + sublink: { type: String }, + + subtarget: { type: String as PropType, default: 'blank' }, + + subtextStyle: { type: Object as PropType }, + + triggerEvent: { type: Boolean, default: true }, + + padding: { type: Array as unknown as PropType }, + + itemGap: { type: Number, default: 10 }, + + top: { type: [String, Number], default: 'auto' }, + + bottom: { type: [String, Number], default: 'auto' }, + + left: { type: [String, Number], default: 'auto' }, + + right: { type: [String, Number], default: 'auto' }, + + backgroundColor: { type: String }, + + ...borderProps +}; + +export type TitleProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/toolbox.props.ts b/packages/charts-vue/components/common/props/common/toolbox.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..b4f96fe37ab351f88cb6f8464903a5ea1c351550 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/toolbox.props.ts @@ -0,0 +1,42 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { OrientType } from '../type/common.type'; + +export const toolboxFeatureProps = { + dataZoom: { type: Object, default: {} }, + + restore: { type: Object, default: {} }, + + saveAsImage: { type: Object, default: {} }, +}; + +export type toolboxFeatureProps = ExtractPropTypes; + +export const toolboxProps = { + id: { type: String }, + + show: { type: Boolean, default: true }, + + orient: { type: String as PropType, default: 'horizontal' }, + + showTitle: { type: Boolean, default: true }, + + top: { type: [String, Number] }, + + bottom: { type: [String, Number] }, + + left: { type: [String, Number] }, + + right: { type: [String, Number] }, + + width: { type: [String, Number] }, + + height: { type: [String, Number] }, + + zlevel: { type: Number }, + + z: { type: Number }, + + feature: { type: Object as PropType } +}; + +export type ToolboxProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/common/value-field.props.ts b/packages/charts-vue/components/common/props/common/value-field.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..6d2301bdfbc7778d36f8a82ed274ff4795f9cf55 --- /dev/null +++ b/packages/charts-vue/components/common/props/common/value-field.props.ts @@ -0,0 +1,10 @@ +import { ExtractPropTypes, PropType } from 'vue'; +import { dataFieldProps } from './data-field.props'; +import { AggregateType } from '../type/common.type'; + +// 数值类型字段 +export const valueFieldProps = { + ...dataFieldProps, + aggregate: { type: String as PropType } +}; +export type ValueFieldProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/common/props/type/chart.type.ts b/packages/charts-vue/components/common/props/type/chart.type.ts new file mode 100644 index 0000000000000000000000000000000000000000..a77f33f2bbb8729b1f97fe89d5442eebb1ad59c2 --- /dev/null +++ b/packages/charts-vue/components/common/props/type/chart.type.ts @@ -0,0 +1,49 @@ +export type FontStyleType = 'normal' | 'italic' | 'oblique'; + +export type FontWeightType = 'normal' | 'bold' | 'bolder' | 'lighter'; + +export type OverFlowType = 'none' | 'truncate' | 'break' | 'breakAll'; + +export type AlignType = 'left' | 'center' | 'right' | 'auto'; + +export type VerticalAlignType = 'top' | 'middle' | 'bottom' | 'auto'; + +export type LinkType = 'blank' | 'self'; + +export type LegendType = 'plain' | 'scroll'; + +export type OrientType = 'horizontal' | 'vertical'; + +export type PositionType = 'top' | 'bottom'; + +export type AxisType = 'value' | 'category' | 'time' | 'log'; + +export type LocationType = 'start' | 'middle' | 'center' | 'end'; + +export type BorderType = 'solid' | 'dashed' | 'dotted'; + +export type CapType = 'butt' | 'round' | 'square'; + +export type JoinType = 'bevel' | 'round' | 'miter'; + +export type MoveOverlapType = 'shiftX' | 'shifY'; + +export type AlignLabelType = 'left' | 'center' | 'right' | null; + +export type AxisPointerType = 'line' | 'shadow' | 'none'; + +export type ColorByType = 'series' | 'data'; + +export type StackStrategyType = 'samesign' | 'all' | 'positive' | 'negative'; + +export type SelectedModeType = 'single' | 'multiple' | 'series'; + +export type SamplingType = 'lttb' | 'average' | 'min' | 'max' | 'minmax' | 'sum'; + +export type TriggerType = 'item' | 'axis' | 'none'; + +export type CombinedType = 'line' | 'bar'; + +export type FocusType = 'self' | 'series' | 'none'; + +export type BlurScopeType = 'coordinateSystem' | 'series' | 'global'; diff --git a/packages/charts-vue/components/common/props/type/common.type.ts b/packages/charts-vue/components/common/props/type/common.type.ts new file mode 100644 index 0000000000000000000000000000000000000000..6f6f8caa9b1f818d0b0598af7025b91d654c3202 --- /dev/null +++ b/packages/charts-vue/components/common/props/type/common.type.ts @@ -0,0 +1,10 @@ +// 排序类型 +export type SortType = 'asc' | 'desc' | 'none'; +// 聚合方式类型 +export type AggregateType = 'sum' | 'avg' | 'min' | 'max' | 'count' | 'distinct'; +// 视窗类型:PC、移动、大屏 +export type ViewportType = 'PC' | 'Mobile' | 'BigScreen'; +// 运行场景:组件预览、设计时、运行时 +export type SceneType = 'Preview' | 'Designing' | 'Running'; +// 多语类型 +export type LanguageType = 'cht' | 'chs' | 'en'; diff --git a/packages/charts-vue/components/common/utils/background-style-utils.ts b/packages/charts-vue/components/common/utils/background-style-utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..900a00316aa46ecfb488361e47e07c5c5006761b --- /dev/null +++ b/packages/charts-vue/components/common/utils/background-style-utils.ts @@ -0,0 +1,39 @@ +import { BackgroundConfigProps } from "../props/common/background-config.props"; +/** + * 处理背景样式 + * @param background 组件样式属性 + * @returns 背景样式对象 + */ +export function getBackgroundStyle(background: BackgroundConfigProps) { + const bg = background || {}; + switch (bg.type) { + case 'color': + return { + backgroundColor: bg.color + }; + case 'image': + return { + backgroundImage: `url(${bg.image})`, + backgroundSize: 'cover', + backgroundRepeat: 'no-repeat' + }; + case 'gradient': + if (bg.gradient) { + const { gradient } = bg; + if (gradient.type === 'linear' && gradient.stops) { + const stops = gradient.stops.map((stop: any) => `${stop.color} ${stop.position}%`).join(', '); + return { + background: `linear-gradient(${gradient.angle || 0}deg, ${stops})` + }; + } else if (gradient.type === 'radial' && gradient.stops) { + const stops = gradient.stops.map((stop: any) => `${stop.color} ${stop.position}%`).join(', '); + return { + background: `radial-gradient(${stops})` + }; + } + } + return {}; + default: + return {}; + } +} diff --git a/packages/charts-vue/components/common/utils/color-utils.ts b/packages/charts-vue/components/common/utils/color-utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..4f037e12353de74e69259058170bd798d41d28b3 --- /dev/null +++ b/packages/charts-vue/components/common/utils/color-utils.ts @@ -0,0 +1,527 @@ + +/** + * 渐变色配置类型 + */ +export interface GradientColorConfig { + type: string; + x: number; + y: number; + x2: number; + y2: number; + r?: number; + colorStops: Array<{ + offset: number; + color: string; + }>; + global: boolean; +} + +/** + * 颜色对象接口 + */ +export interface ColorObject { + r: number; // 红色值 (0-255) + g: number; // 绿色值 (0-255) + b: number; // 蓝色值 (0-255) + a?: number; // 透明度值 (0-1), 可选 + h?: number; // 色相值 (0-360), 可选 + s?: number; // 饱和度值 (0-100), 可选 + l?: number; // 亮度值 (0-100), 可选 +} + +/** + * 输出格式枚举 + */ +export enum ColorFormat { + HEX = 'hex', + HEXA = 'hexa', + RGB = 'rgb', + RGBA = 'rgba', + HSL = 'hsl', + HSLA = 'hsla' +} + +/** + * 获取渐变色配置 + * @param colorList 颜色列表或单个颜色 + * @param type 渐变类型 + * @returns 渐变色配置或单个颜色 + */ +export function getGradientColor( + colorList: string[] | string, + type: string +): GradientColorConfig | string { + // 数组,组织成渐变色 + if (Array.isArray(colorList)) { + if (colorList.length > 1) { + const jbsList: { offset: number; color: string }[] = []; // 渐变色数组 + const colorStep = 1 / (colorList.length - 1); // 颜色的步长 + + for (let i = 0; i < colorList.length; i++) { + const item = { + offset: i * colorStep, + color: colorList[i] + }; + jbsList.push(item); + } + + const baseConfig = { + colorStops: jbsList, + global: false + }; + + const configs: Record = { + linear: { + type: 'linear', + x: 0, + y: 1, + x2: 0, + y2: 0, + ...baseConfig + }, + linearYNe: { + type: 'linear', + x: 0, + y: 0, + x2: 0, + y2: 1, + ...baseConfig + }, + linearX: { + type: 'linear', + x: 0, + y: 0, + x2: 1, + y2: 0, + ...baseConfig + }, + linearXNe: { + type: 'linear', + x: 1, + y: 0, + x2: 0, + y2: 0, + ...baseConfig + }, + radial: { + type: 'radial', + x: 0, + y: 0, + r: 1, + ...baseConfig + } + }; + + return configs[type] || configs.linear; + } else { + return colorList[0]; + } + } else { + // 单颜色,直接返回 + return colorList; + } +} + +// 获取单颜色的色系 +export function getSingleChartColorList(chartColorList: (string | string[])[]): string[] { + chartColorList = chartColorList || []; + return chartColorList.map(item => { + if (Array.isArray(item)) { + return item[0]; + } else { + return item as string; + } + }); +} + +/** + * 将十六进制颜色值转换为 RGBA 格式 + * @param hex - 十六进制颜色值,支持 #fff 或 #ffffff 格式 + * @param alpha - 透明度值,范围 0-1,默认为 1 + * @returns RGBA 颜色字符串,格式为 rgba(r, g, b, a) + */ +export function hexToRgba(hex: string, alpha: number = 1): string { + // 移除 # 前缀 + hex = hex.replace('#', ''); + + // 处理 #fff 这样的简写格式 + if (hex.length === 3) { + hex = hex.split('').map(char => char + char).join(''); + } + + // 解析十六进制值 + const r = parseInt(hex.substring(0, 2), 16); + const g = parseInt(hex.substring(2, 4), 16); + const b = parseInt(hex.substring(4, 6), 16); + + return `rgba(${r}, ${g}, ${b}, ${alpha})`; +} + +/** + * 将RGB颜色值转换为十六进制格式 + * @param r - 红色值 (0-255) + * @param g - 绿色值 (0-255) + * @param b - 蓝色值 (0-255) + * @returns 十六进制颜色字符串,格式为 #ffffff + */ +export function rgbToHex(r: number, g: number, b: number): string { + const toHex = (n: number) => { + const hex = n.toString(16); + return hex.length === 1 ? '0' + hex : hex; + }; + + return `#${toHex(r)}${toHex(g)}${toHex(b)}`; +} + +/** + * 将RGB颜色值转换为HSL格式 + * @param r - 红色值 (0-255) + * @param g - 绿色值 (0-255) + * @param b - 蓝色值 (0-255) + * @returns HSL颜色对象 + */ +export function rgbToHsl(r: number, g: number, b: number): { h: number; s: number; l: number } { + r /= 255; + g /= 255; + b /= 255; + + const max = Math.max(r, g, b); + const min = Math.min(r, g, b); + let h = 0, s = 0; + const l = (max + min) / 2; + + if (max !== min) { + const d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + + switch (max) { + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + + if (h) {h *= 60;} + } + + return { + h: Math.round(h), + s: Math.round(s * 100), + l: Math.round(l * 100) + }; +} + +/** + * 解析RGB颜色字符串 + * @param rgb - RGB颜色字符串,如 rgb(255, 0, 0) + * @returns 包含r, g, b值的对象 + */ +function parseRgb(rgb: string): ColorObject | null { + const match = rgb.match(/rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/i); + if (match) { + const r = parseInt(match[1], 10); + const g = parseInt(match[2], 10); + const b = parseInt(match[3], 10); + + const hsl = rgbToHsl(r, g, b); + return { + r, + g, + b, + h: hsl.h, + s: hsl.s, + l: hsl.l + }; + } + return null; +} + +/** + * 解析RGBA颜色字符串 + * @param rgba - RGBA颜色字符串,如 rgba(255, 0, 0, 0.5) + * @returns 包含r, g, b, a值的对象 + */ +function parseRgba(rgba: string): ColorObject | null { + const match = rgba.match(/rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d.]+)\s*\)/i); + if (match) { + const r = parseInt(match[1], 10); + const g = parseInt(match[2], 10); + const b = parseInt(match[3], 10); + const a = parseFloat(match[4]); + + const hsl = rgbToHsl(r, g, b); + return { + r, + g, + b, + a, + h: hsl.h, + s: hsl.s, + l: hsl.l + }; + } + return null; +} + +/** + * 解析十六进制颜色字符串 + * @param hex - 十六进制颜色字符串,如 #fff 或 #ffffff + * @returns 包含r, g, b值的对象 + */ +function parseHex(hex: string): ColorObject | null { + hex = hex.replace('#', ''); + + // 处理 #fff 这样的简写格式 + if (hex.length === 3) { + hex = hex.split('').map(char => char + char).join(''); + } + + if (hex.length === 6) { + const r = parseInt(hex.substring(0, 2), 16); + const g = parseInt(hex.substring(2, 4), 16); + const b = parseInt(hex.substring(4, 6), 16); + + const hsl = rgbToHsl(r, g, b); + return { + r, + g, + b, + h: hsl.h, + s: hsl.s, + l: hsl.l + }; + } + return null; +} + +/** + * 解析HSL颜色字符串 + * @param hsl - HSL颜色字符串,如 hsl(0, 100%, 50%) + * @returns 包含r, g, b, h, s, l值的对象 + */ +function parseHsl(hsl: string): ColorObject | null { + const match = hsl.match(/hsl\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)/i); + if (match) { + const h = parseInt(match[1], 10); + const s = parseInt(match[2], 10); + const l = parseInt(match[3], 10); + + // 将HSL转换为RGB + const hDecimal = h / 360; + const sDecimal = s / 100; + const lDecimal = l / 100; + + let r, g, b; + + if (s === 0) { + r = g = b = lDecimal; // 灰色 + } else { + const hue2rgb = (p: number, q: number, t: number) => { + if (t < 0) {t += 1;} + if (t > 1) {t -= 1;} + if (t < 1 / 6) {return p + (q - p) * 6 * t;} + if (t < 1 / 2) {return q;} + if (t < 2 / 3) {return p + (q - p) * (2 / 3 - t) * 6;} + return p; + }; + + const q = lDecimal < 0.5 ? lDecimal * (1 + sDecimal) : lDecimal + sDecimal - lDecimal * sDecimal; + const p = 2 * lDecimal - q; + r = hue2rgb(p, q, hDecimal + 1 / 3); + g = hue2rgb(p, q, hDecimal); + b = hue2rgb(p, q, hDecimal - 1 / 3); + } + + return { + r: Math.round(r * 255), + g: Math.round(g * 255), + b: Math.round(b * 255), + h, + s, + l + }; + } + return null; +} + +/** + * 解析HSLA颜色字符串 + * @param hsla - HSLA颜色字符串,如 hsla(0, 100%, 50%, 0.5) + * @returns 包含r, g, b, a, h, s, l值的对象 + */ +function parseHsla(hsla: string): ColorObject | null { + const match = hsla.match(/hsla\(\s*(\d+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*,\s*([\d.]+)\s*\)/i); + if (match) { + const h = parseInt(match[1], 10); + const s = parseInt(match[2], 10); + const l = parseInt(match[3], 10); + const a = parseFloat(match[4]); + + // 将HSL转换为RGB + const hDecimal = h / 360; + const sDecimal = s / 100; + const lDecimal = l / 100; + + let r, g, b; + + if (s === 0) { + r = g = b = lDecimal; // 灰色 + } else { + const hue2rgb = (p: number, q: number, t: number) => { + if (t < 0) {t += 1;} + if (t > 1) {t -= 1;} + if (t < 1 / 6) {return p + (q - p) * 6 * t;} + if (t < 1 / 2) {return q;} + if (t < 2 / 3) {return p + (q - p) * (2 / 3 - t) * 6;} + return p; + }; + + const q = lDecimal < 0.5 ? lDecimal * (1 + sDecimal) : lDecimal + sDecimal - lDecimal * sDecimal; + const p = 2 * lDecimal - q; + r = hue2rgb(p, q, hDecimal + 1 / 3); + g = hue2rgb(p, q, hDecimal); + b = hue2rgb(p, q, hDecimal - 1 / 3); + } + + return { + r: Math.round(r * 255), + g: Math.round(g * 255), + b: Math.round(b * 255), + a, + h, + s, + l + }; + } + return null; +} + +/** + * 使用canvas将颜色名称转换为RGB值 + * @param colorName - 颜色名称,如 red, blue 等 + * @returns ColorObject对象 + */ +function parseColorName(colorName: string): ColorObject | null { + const canvas = document.createElement('canvas'); + const ctx = canvas.getContext('2d'); + if (!ctx) {return null;} + + ctx.fillStyle = colorName; + const computedColor = ctx.fillStyle; + + // 尝试解析canvas返回的颜色值 + if (computedColor.startsWith('#')) { + return parseHex(computedColor); + } + + if (computedColor.startsWith('rgb')) { + return computedColor.includes('rgba') ? parseRgba(computedColor) : parseRgb(computedColor); + } + + return null; +} + +/** + * 解析任意格式的颜色字符串 + * @param color - 任意格式的颜色字符串 + * @returns ColorObject对象 + */ +export function parseColor(color: string): ColorObject | null { + if (!color) {return null;} + + color = color.trim(); + + // 尝试解析不同格式 + if (color.startsWith('#')) { + return parseHex(color); + } + + if (color.startsWith('rgba(')) { + return parseRgba(color); + } + + if (color.startsWith('rgb(')) { + return parseRgb(color); + } + + if (color.startsWith('hsla(')) { + return parseHsla(color); + } + + if (color.startsWith('hsl(')) { + return parseHsl(color); + } + + // 尝试解析颜色名称 + return parseColorName(color); +} + +/** + * 将ColorObject转换为指定格式的颜色字符串 + * @param colorObj - ColorObject对象 + * @param format - 目标格式 + * @param alpha - 透明度值 (0-1),仅在RGBA和HSLA格式中使用 + * @returns 指定格式的颜色字符串 + */ +export function formatColor(colorObj: ColorObject, format: ColorFormat, alpha?: number): string { + switch (format) { + case ColorFormat.HEX: + return rgbToHex(colorObj.r, colorObj.g, colorObj.b); + + case ColorFormat.HEXA: { + const hex = rgbToHex(colorObj.r, colorObj.g, colorObj.b); + const alphaHex = Math.round((alpha !== undefined ? alpha : (colorObj.a || 1)) * 255).toString(16).padStart(2, '0'); + return `${hex}${alphaHex}`; + } + + case ColorFormat.RGB: + return `rgb(${colorObj.r}, ${colorObj.g}, ${colorObj.b})`; + + case ColorFormat.RGBA: { + const rgbaAlpha = alpha !== undefined ? alpha : (colorObj.a || 1); + return `rgba(${colorObj.r}, ${colorObj.g}, ${colorObj.b}, ${rgbaAlpha})`; + } + + case ColorFormat.HSL: + if (colorObj.h !== undefined && colorObj.s !== undefined && colorObj.l !== undefined) { + return `hsl(${colorObj.h}, ${colorObj.s}%, ${colorObj.l}%)`; + } else { + // 如果HSL值不存在,从RGB计算 + const hsl = rgbToHsl(colorObj.r, colorObj.g, colorObj.b); + return `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`; + } + + case ColorFormat.HSLA: { + const hslaAlpha = alpha !== undefined ? alpha : (colorObj.a || 1); + if (colorObj.h !== undefined && colorObj.s !== undefined && colorObj.l !== undefined) { + return `hsla(${colorObj.h}, ${colorObj.s}%, ${colorObj.l}%, ${hslaAlpha})`; + } else { + // 如果HSL值不存在,从RGB计算 + const hsl = rgbToHsl(colorObj.r, colorObj.g, colorObj.b); + return `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${hslaAlpha})`; + } + } + + default: + return rgbToHex(colorObj.r, colorObj.g, colorObj.b); + } +} + +/** + * 将任意格式的颜色转换为指定格式 + * @param color - 输入颜色字符串(支持hex, rgb, rgba, hsl, hsla, color names等) + * @param toFormat - 目标格式 + * @param alpha - 透明度值 (0-1),用于覆盖原透明度或设置新透明度 + * @returns 指定格式的颜色字符串 + */ +export function convertColor(color: string, toFormat: ColorFormat, alpha?: number): string { + const colorObj = parseColor(color); + + if (!colorObj) { + // 如果无法解析颜色,返回默认黑色 + const defaultColor: ColorObject = { r: 0, g: 0, b: 0 }; + return formatColor(defaultColor, toFormat, alpha); + } + + return formatColor(colorObj, toFormat, alpha); +} + diff --git a/packages/charts-vue/components/common/utils/header-tool-utils.ts b/packages/charts-vue/components/common/utils/header-tool-utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..758403325c824aa72cec1f63e1a4d8b7dcd5bdd1 --- /dev/null +++ b/packages/charts-vue/components/common/utils/header-tool-utils.ts @@ -0,0 +1,73 @@ +import { h, VNode } from 'vue'; +import { FDatePicker, FCapsule } from '@farris/ui-vue'; + +/** + * 渲染headerTools中的控件 + * @param tool 工具配置 + * @param onValueChange 值变化回调 + * @returns VNode + */ +export function renderHeaderTool(tool: any, onValueChange: (value: any) => void): VNode { + const commonProps = { + ...tool, + modelValue: tool.value, + 'onUpdate:modelValue': (value: any) => { + tool.value = value; + onValueChange(value); + // 如果有onChange回调,则调用 + if (tool.onChange) { + tool.onChange(value); + } + } + }; + + switch (tool.type) { + case 'date-picker': + return h(FDatePicker, commonProps); + case 'capsule': + commonProps.items = commonProps.options; + return h(FCapsule, commonProps); + default: + // 默认渲染一个输入框 + return h('input', { + type: 'text', + value: tool.value, + placeholder: tool.label, + onInput: (event: InputEvent) => { + const target = event.target as HTMLInputElement; + tool.value = target.value; + onValueChange(target.value); + // 如果有onChange回调,则调用 + if (tool.onChange) { + tool.onChange(target.value); + } + } + }); + } +} + +/** + * 渲染单个工具项 + * @param tool 工具配置 + * @param renderTool 渲染工具函数 + * @param className 样式类名 + * @returns VNode + */ +export function renderHeaderToolItem( + tool: any, + renderTool: (tool: any) => VNode +): VNode { + return h('div', { + style: { + display: 'flex', + alignItems: 'center' + } + }, [ + tool.label ? h('label', { + style: { + marginRight: '4px' + } + }, tool.label || '') : '', + renderTool(tool) + ]); +} diff --git a/packages/charts-vue/components/common/utils/widget-utils.ts b/packages/charts-vue/components/common/utils/widget-utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..87690059b511365140ba859ea1a496c1f76610f3 --- /dev/null +++ b/packages/charts-vue/components/common/utils/widget-utils.ts @@ -0,0 +1,128 @@ +import { h } from 'vue'; +import { FButtonGroup } from '@farris/ui-vue'; + +/** + * 处理按钮点击事件的通用函数 + * @param buttons 按钮配置数组 + * @param buttonId 被点击的按钮ID + * @param event 鼠标事件 + * @param emit 事件发射器 + */ +export function handleButtonClick( + buttons: any[] | undefined, + buttonId: string, + event: MouseEvent, + emit: (event: string, ...args: any[]) => void +): void { + // 查找被点击的按钮配置 + const button = buttons?.find(btn => btn.id === buttonId); + + // 如果按钮配置中有onClick处理函数,则调用它 + if (button && button.onClick) { + button.onClick(event, buttonId); + } + + // 发出buttonClick事件 + emit('buttonClick', event, buttonId); +} + +/** + * 渲染按钮组的通用函数 + * @param buttons 按钮配置数组 + * @param handleButtonClick 按钮点击处理函数 + * @returns VNode + */ +export function renderButtons(buttons: any[], handleButtonClick: (event: MouseEvent, buttonId: string) => void) { + const processedButtons = (buttons || []).map(button => ({ + id: button.id, + text: button.text, + icon: button.icon, + disabled: button.disabled, + visible: button.visible !== false, // 默认为true + onClick: (event: MouseEvent) => handleButtonClick(event, button.id) + })); + + if (processedButtons.length === 0) { + return null; + } + + // 使用FButtonGroup渲染按钮组 + const buttonGroupData = processedButtons.filter(btn => btn.visible).map(button => ({ + id: button.id, + text: button.text, + icon: button.icon, + disable: button.disabled + })); + + return h(FButtonGroup, { + data: buttonGroupData, + type: 'secondary', + onClick: (buttonItem: any) => { + const button = processedButtons.find(btn => btn.id === buttonItem.id); + if (button) { + button.onClick({} as MouseEvent); // 简化处理 + } + } + }); +} + +/** + * 渲染标题元素的通用函数 + * @param queryProperties 组件属性 + * @param defaultFontSize 默认字体大小 + * @returns VNode + */ +export function renderTitleElement(queryProperties: any, defaultFontSize: string = '16px') { + const titleStyle = queryProperties?.titleStyle || {}; + // 获取字体大小 + const fontSize = titleStyle.fontSize || defaultFontSize; + const style = { + color: titleStyle.color || '#333', + fontSize: fontSize, + backgroundColor: titleStyle.backgroundColor || 'transparent', + fontWeight: titleStyle.fontWeight || 'normal', + textAlign: titleStyle.textAlign || 'left', + margin: '0', + display: 'flex', + alignItems: 'center', + }; + + // 处理 icon 属性,支持字符串和对象两种格式 + const renderIcon = () => { + const iconProp = queryProperties?.icon; + + // 如果是对象格式 + if (iconProp && typeof iconProp === 'object') { + const { type, content, height = '1em', marginRight = '0.5em' } = iconProp; + + if (type === 'image') { + return h('div', { + style: { + marginRight, + display: 'flex', + alignItems: 'center' + } + }, [ + h('img', { + src: content, + style: { height } + }) + ]); + } else { + // icon 类型 + return h('i', { + class: `${content.includes('f-icon') ? 'f-icon' : ''} ${content}`, + style: { + marginRight, + fontSize: height + } + }); + } + } + }; + + return h('div', { style }, [ + renderIcon(), + h('span', queryProperties?.title || '') + ]); +} diff --git a/packages/charts-vue/components/common/utils/with-install.ts b/packages/charts-vue/components/common/utils/with-install.ts new file mode 100644 index 0000000000000000000000000000000000000000..3bce8e707a3f40c9a79f95a9c4a7c093f0805aa7 --- /dev/null +++ b/packages/charts-vue/components/common/utils/with-install.ts @@ -0,0 +1,10 @@ +import type { App, Component, Plugin } from 'vue'; + +export const withInstall = (component: T) => { + const c = component as any; + c.install = function (app: App) { + app.component(c.name, component); + }; + + return component as T & Plugin; +}; diff --git a/packages/charts-vue/components/components.ts b/packages/charts-vue/components/components.ts index 110fed723f1cdaff666571f089656c8b4bc562ef..2cebe373063736619e14dfc27fd9cb945ca26020 100644 --- a/packages/charts-vue/components/components.ts +++ b/packages/charts-vue/components/components.ts @@ -20,3 +20,8 @@ export { default as FChartsTreemap } from './charts-treemap'; export type { ChartsTreemapProps } from './charts-treemap'; export { default as FChartsGraph } from './charts-graph'; export type { ChartsGraphProps } from './charts-graph'; +export { FBaDynamicView } from './dynamic-view'; +export type { BaDynamicViewProps } from './dynamic-view'; +export * from './dynamic-view/src/components/maps'; +// 公共导出 +export * from './common'; diff --git a/packages/charts-vue/components/dynamic-view/index.ts b/packages/charts-vue/components/dynamic-view/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..8098e26e79034bc43e7014e37de82d26d5d733d2 --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/index.ts @@ -0,0 +1,14 @@ +import type { App } from 'vue'; +import FBaDynamicView from './src/dynamic-view.component'; + +export * from './src/dynamic-view.props'; + +export * from './src/components/maps'; + +export { FBaDynamicView }; + +export default { + install(app: App): void { + app.component(FBaDynamicView.name as string, FBaDynamicView); + } +}; diff --git a/packages/charts-vue/components/dynamic-view/src/callback-deliver.ts b/packages/charts-vue/components/dynamic-view/src/callback-deliver.ts new file mode 100644 index 0000000000000000000000000000000000000000..f0c3ab915e9835b61add98e219505929de3a2250 --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/callback-deliver.ts @@ -0,0 +1,10 @@ +import { Caller } from "@farris/ui-vue"; + +export function createCallbackDeliver(callback: (type: string, args: any[]) => any): Caller { + function call(methodName: string, payloads: any[]): any { + return callback(methodName, payloads); + } + return { + call + }; +} diff --git a/packages/charts-vue/components/dynamic-view/src/components/maps.ts b/packages/charts-vue/components/dynamic-view/src/components/maps.ts new file mode 100644 index 0000000000000000000000000000000000000000..37119ca745e8b1bf26864daa33fc796963946dd9 --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/components/maps.ts @@ -0,0 +1,44 @@ +import FGridLayoutWrapper from '@farris/charts-vue/components/grid-layout'; +import FChartsLine from '@farris/charts-vue/components/charts-line'; +import FChartsBar from '@farris/charts-vue/components/charts-bar'; +import FCharstScatter from '@farris/charts-vue/components/charts-scatter'; +import { componentMap, componentPropsConverter, resolverMap, loadRegister } from '@farris/ui-vue'; +import { HttpClient } from '../service/http'; + +declare const System: any; +const httpClient = new HttpClient(); +function toPascalCase(str) { + return str.replace(/(^|-)([a-z])/g, function (match, p1, p2) { + return p2.toUpperCase(); + }); +} +async function loadRegister1() { + loadRegister(); + FGridLayoutWrapper.register(componentMap, componentPropsConverter, null, resolverMap); + FChartsLine.register(componentMap, componentPropsConverter, null, resolverMap); + FChartsBar.register(componentMap, componentPropsConverter, null, resolverMap); + FCharstScatter.register(componentMap, componentPropsConverter, null, resolverMap); + const res = await httpClient.get('/api/ba/bap/v1.0/storycomponent/components', {}); + const components: any = []; + if (Array.isArray(res)) { + for (let i = 0; i < res.length; i++) { + const item = res[i]; + if (item.components) { + for (const key in item.components) { + components.push(item.components[key]); + } + } + } + } + if (components.length) { + for (let i = 0; i < components.length; i++) { + const module = await System.import(`${components[i].path}/index.systemjs.js`) + const key = toPascalCase(components[i].type); + if (module && module[key]) { + module[key].register(componentMap, componentPropsConverter, null, resolverMap); + } + } + } +} + +export { componentMap, componentPropsConverter, loadRegister1, resolverMap }; diff --git a/packages/charts-vue/components/dynamic-view/src/composition/index.ts b/packages/charts-vue/components/dynamic-view/src/composition/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..9828d143ccbe22f44921318572c444eb43cd6237 --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/composition/index.ts @@ -0,0 +1,3 @@ +export * from './use-form-schema'; +export * from './use-binding-data'; +export * from './use-component-manager'; diff --git a/packages/charts-vue/components/dynamic-view/src/composition/use-binding-data.ts b/packages/charts-vue/components/dynamic-view/src/composition/use-binding-data.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6ba1de336e95222c66eda2abdcddeee17cbb55e --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/composition/use-binding-data.ts @@ -0,0 +1,23 @@ +import { BindingData } from "@farris/ui-vue"; +import { Ref, SetupContext } from "vue"; + +export function useBindingData(modelValue: Ref>, setupContext: SetupContext): BindingData { + function getValue(elementId: string) { + return modelValue.value && modelValue.value[elementId]; + } + + function setValue(elementId: string, field: string, value: any) { + if (modelValue.value) { + modelValue.value[elementId] = value; + } + if (!field) { + return; + } + setupContext.emit('update:modelValue', { elementId, field, value, modelValue: modelValue.value }); + } + + return { + getValue, + setValue + }; +} diff --git a/packages/charts-vue/components/dynamic-view/src/composition/use-component-manager.ts b/packages/charts-vue/components/dynamic-view/src/composition/use-component-manager.ts new file mode 100644 index 0000000000000000000000000000000000000000..620a20573821a3223b30456683e72ab423496bd0 --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/composition/use-component-manager.ts @@ -0,0 +1,51 @@ +import { UseComponentInstanceManager } from "../types"; + +export function useComponentManager(): UseComponentInstanceManager { + const instances: Map = new Map(); + + function register(id: string, instance: any) { + instances.set(id, instance); + } + + function get(id: string) { + const instance = instances.get(id); + if (!instance) { + console.warn(`Instance with id ${id} not found`); + return null; + } + return instance; + } + + function remove(id: string) { + instances.delete(id); + } + + function update(id: string, instance: any) { + if (!instances.has(id)) { + console.warn(`Instance with id ${id} not found`); + return; + } + instances.set(id, instance); + } + + function has(id: string): boolean { + return instances.has(id); + } + + function getAll(): Map { + return new Map(instances); + } + + function clear() { + instances.clear(); + } + return { + register, + get, + remove, + update, + has, + getAll, + clear + }; +} diff --git a/packages/charts-vue/components/dynamic-view/src/composition/use-entity-resolver.ts b/packages/charts-vue/components/dynamic-view/src/composition/use-entity-resolver.ts new file mode 100644 index 0000000000000000000000000000000000000000..09d40288263783136138c4f6e652711a3fffef7f --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/composition/use-entity-resolver.ts @@ -0,0 +1,90 @@ +/* eslint-disable no-use-before-define */ +import { ResolvedEntity, EntitySchema, UseEntityResolver } from "../types"; +import { useFormSchema } from "./use-form-schema"; + +export function useEntityResolver(schema: Record): UseEntityResolver { + const { getSchemaEntity } = useFormSchema(schema); + function resolveEntityByDataSource(dataSource: string): ResolvedEntity | any | null { + const entity = getSchemaEntity(); + const entityInfo = resolveEntity(entity, dataSource); + return entityInfo; + } + function resolveEntities(entitySchema: EntitySchema | any): ResolvedEntity[] { + const result: ResolvedEntity[] = []; + if (Array.isArray(entitySchema)) { + for (let i = 0; i < entitySchema.length; i++) { + result.push({ + bindingPaths: [], + primaryKey: "id", + label: entitySchema[i]?.label + }); + } + } else { + function traverse(entity: EntitySchema, path: string[]) { + const currentPath = [...path, entity.label]; + const primary = entitySchema?.type?.primary || null; + if (primary) { + result.push({ + bindingPaths: currentPath, + primaryKey: entity.type.primary, + label: entity.label + }); + } + entity.type.entities.forEach(childEntity => { + traverse(childEntity, currentPath); + }); + } + const primary = entitySchema?.type?.primary || null; + if (!primary) { + return result; + } + result.push({ + bindingPaths: [], + primaryKey: entitySchema.type.primary, + label: entitySchema.label + }); + const childEntities = entitySchema?.type?.entities || []; + childEntities.forEach((entity) => { + traverse(entity, []); + }); + } + return result; + } + function resolveEntity(entity: Record | any, entityLabel: string, isRoot: boolean = true): ResolvedEntity | any | null { + const currentPath = isRoot ? [] : [entity.label]; + if (Array.isArray(entity)) { + const result: any[] = []; + for (let i = 0; i < entity.length; i++) { + const result = resolveEntity(entity[i], entityLabel, true); + if (result) { + result.push(result); + } + } + return result; + } else { + if (entity.label === entityLabel) { + return { + bindingPaths: currentPath, + primaryKey: entity?.type?.primary ?? "id", + label: entity.label + }; + } + for (const childEntity of entity.type.entities) { + const result = resolveEntity(childEntity, entityLabel, false); + if (result) { + return { + bindingPaths: [...currentPath, ...result.bindingPaths], + primaryKey: result.primaryKey, + label: result.label + }; + } + } + return null; + } + } + return { + resolveEntityByDataSource, + resolveEntity, + resolveEntities + }; +} diff --git a/packages/charts-vue/components/dynamic-view/src/composition/use-entity-state.ts b/packages/charts-vue/components/dynamic-view/src/composition/use-entity-state.ts new file mode 100644 index 0000000000000000000000000000000000000000..1255c85431e6e7124fc41e32742b032788383f05 --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/composition/use-entity-state.ts @@ -0,0 +1,32 @@ +import { EntityState, ResolvedEntity } from "../types"; +import { useEntityResolver } from "./use-entity-resolver"; +import { useFormSchema } from "./use-form-schema"; + +export function useEntityState(schema: Record) { + const bindingContexts: Record = {}; + const { getSchemaEntity } = useFormSchema(schema); + const { resolveEntities } = useEntityResolver(schema); + + function setup() { + const schemaEntity = getSchemaEntity(); + const entities = resolveEntities(schemaEntity); + entities.forEach((entity: ResolvedEntity) => { + const bindingPath = '/' + entity.bindingPaths.join('/'); + const { primaryKey } = entity; + const bindingContext: EntityState = { primaryKey, bindingPath, label: entity.label, currentId: null }; + bindingContexts[bindingPath] = bindingContext; + }); + } + function get(bindingPath: string | string[]): EntityState { + if (Array.isArray(bindingPath)) { + bindingPath = '/' + bindingPath.join('/'); + } else { + bindingPath = '/' + bindingPath.split('/').filter((item: any) => item).join('/'); + } + return bindingContexts[bindingPath]; + } + return { + setup, + get + }; +} diff --git a/packages/charts-vue/components/dynamic-view/src/composition/use-entity.ts b/packages/charts-vue/components/dynamic-view/src/composition/use-entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..bb3ba43b2753849d04ae601b05d9660e67d35041 --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/composition/use-entity.ts @@ -0,0 +1,34 @@ +import { EntityState, ResolvedEntity } from "../types"; +import { useEntityResolver } from "./use-entity-resolver"; +import { useFormSchema } from "./use-form-schema"; + +export function useEntity(schema: Record) { + const bindingDataContexts: Record = {}; + const { getSchemaEntity } = useFormSchema(schema); + const { resolveEntities } = useEntityResolver(schema); + + function setup() { + const schemaEntity = getSchemaEntity(); + const entities = resolveEntities(schemaEntity); + entities.forEach((entity: ResolvedEntity) => { + const bindingPath = '/' + entity.bindingPaths.join('/'); + const { primaryKey } = entity; + const bindingContext: EntityState = { primaryKey, bindingPath, currentId: null, label: entity.label }; + // jumphere by sagi + bindingContext['dataSource'] = entity.label; + bindingDataContexts[bindingPath] = bindingContext; + }); + } + function get(bindingPath: string | string[]): EntityState { + if (Array.isArray(bindingPath)) { + bindingPath = '/' + bindingPath.join('/'); + } else { + bindingPath = '/' + bindingPath.split('/').filter((item: any) => item).join('/'); + } + return bindingDataContexts[bindingPath]; + } + return { + setup, + get + }; +} diff --git a/packages/charts-vue/components/dynamic-view/src/composition/use-field-resolver.ts b/packages/charts-vue/components/dynamic-view/src/composition/use-field-resolver.ts new file mode 100644 index 0000000000000000000000000000000000000000..cbdf9f3b08164c4ac068d87c888202add06bf709 --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/composition/use-field-resolver.ts @@ -0,0 +1,79 @@ +/* eslint-disable no-use-before-define */ + +import { ResolvedEntityField, UseFieldResolver } from "../types"; +import { useFormSchema } from "./use-form-schema"; + +export function useFieldResolver(schema: Record): UseFieldResolver { + const { getSchemaEntity } = useFormSchema(schema); + function resolveFieldById(fieldId: string): ResolvedEntityField | any { + const entity = getSchemaEntity(); + if (Array.isArray(entity)) { + const fieldInfos: any[] = []; + for (let i = 0; i < entity.length; i++) { + const fieldInfo = resolveFields(entity[i], fieldId); + if (fieldInfo) { + fieldInfos.push(fieldInfo); + } + } + return fieldInfos; + } else { + const fieldInfo = resolveField(entity, fieldId); + return fieldInfo; + } + } + + function resolveFields(entitySchema: Record, fieldId: string): ResolvedEntityField | any { + const { fields } = entitySchema.columns; + for (const field of fields) { + if (field.columnName === fieldId) { + return { + id: field.columnName, + bindingPath: field.columnName, + require: false, + readonly: false, + multiLanguage: false, + label: field.columnName, + dataSource: entitySchema.label + }; + } + } + return null; + } + + function resolveField(entitySchema: Record, fieldId: string): ResolvedEntityField | null { + const { fields } = entitySchema.type; + for (const field of fields) { + if (field.id === fieldId) { + return { + id: field.id, + bindingPath: field.bindingPath, + require: field.require, + readonly: field.readonly, + multiLanguage: field.multiLanguage, + label: field.label, + dataSource: entitySchema.label + }; + } + if (field.type && field.type.fields) { + const result = resolveField({ type: field.type, label: entitySchema.label }, fieldId); + if (result) { + return result; + } + } + } + const { entities } = entitySchema.type; + if (!entities || entities.length < 1) { + return null; + } + for (const entity of entities) { + const result = resolveField(entity, fieldId); + if (result) { + return result; + } + } + return null; + } + return { + resolveFieldById + }; +} diff --git a/packages/charts-vue/components/dynamic-view/src/composition/use-form-schema.ts b/packages/charts-vue/components/dynamic-view/src/composition/use-form-schema.ts new file mode 100644 index 0000000000000000000000000000000000000000..e6e51e22a73d8a5a9b930aef3732fb93445e6831 --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/composition/use-form-schema.ts @@ -0,0 +1,15 @@ +import { EntitySchema } from "../types"; + +export function useFormSchema(schema: Record) { + function getSchemaEntity(): EntitySchema | any { + if (schema?.module?.entity?.length > 0 && schema?.module?.entity[0]['entities']) { + return schema?.module?.entity[0]?.entities[0] || {}; + } else { + return schema?.module?.entity || []; + } + } + + return { + getSchemaEntity + }; +} diff --git a/packages/charts-vue/components/dynamic-view/src/designer-styles.css b/packages/charts-vue/components/dynamic-view/src/designer-styles.css new file mode 100644 index 0000000000000000000000000000000000000000..5e346036ccd90bd0b09b0644184127bb7a48af6d --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/designer-styles.css @@ -0,0 +1,60 @@ +/* 设计器相关样式 */ +.ba-designer-wrapper { + position: relative; + width: 100%; + height: 100%; +} + +.ba-designer-wrapper.position-relative { + position: relative; +} +.ba-designer-wrapper.dgComponentFocused, +.ba-designer-wrapper.dgComponentSelected, +.ba-designer-wrapper.ba-designer-wrapper-selected { + outline: 1px solid rgba(65, 144, 255, 0.8); + outline-offset: 0; + border: none !important; +} + +/* 删除按钮浮层 */ +.ba-designer-wrapper-more-popover { + display: none; + position: absolute; + top: 0; + right: -20px; + width: 20px; + height: 32px; + background-color: rgba(42, 135, 255, 0.8); + border-radius: 0 6px 6px 0; + z-index: 10; + + flex-direction: column; + justify-content: center; + align-items: center; + gap: 5px; + & > span { + color: #fff; + font-size: 13px; + } + } + +.ba-designer-wrapper:hover .ba-designer-wrapper-more-popover, +.ba-designer-wrapper.dgComponentSelected .ba-designer-wrapper-more-popover, +.ba-designer-wrapper.dgComponentFocused .ba-designer-wrapper-more-popover, +.ba-designer-wrapper.ba-designer-wrapper-selected .ba-designer-wrapper-more-popover { + display: flex; +} + +.ba-designer-wrapper-more-popover .f-icon, +.ba-designer-wrapper-more-popover .f-icon:hover { + display: inline-flex; + align-items: center; + justify-content: center; + width: 24px; + height: 24px; + padding: 4px; + cursor: pointer; + font-size: 14px; + color: #fff; + transition: all 0.3s; +} diff --git a/packages/charts-vue/components/dynamic-view/src/dynamic-view.component.tsx b/packages/charts-vue/components/dynamic-view/src/dynamic-view.component.tsx new file mode 100644 index 0000000000000000000000000000000000000000..930bca7a875cc8ec4642bad2c2af8523dbf670be --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/dynamic-view.component.tsx @@ -0,0 +1,695 @@ +/* eslint-disable @typescript-eslint/no-unsafe-function-type */ +/* eslint-disable no-use-before-define */ +import { SetupContext, defineComponent, ref, watch, inject, createVNode, VNode, reactive, Reactive, provide } from 'vue'; +import { cloneDeep, merge, mergeWith } from 'lodash-es'; +import { baDynamicViewProps, BaDynamicViewProps } from './dynamic-view.props'; +import { componentMap, componentPropsConverter, loadRegister1, resolverMap } from './components/maps'; +import { createEventsResolver, createFormBindingResolver, EditorResolver, SelectionItemResolver, UpdateColumnsResolver } from '@farris/ui-vue'; +import { createEventDispatcher } from './event-dispatcher'; +import { useComponentManager } from './composition/use-component-manager'; +import { useBindingData } from './composition/use-binding-data'; +import { useEntityState } from './composition/use-entity-state'; +import { createCallbackDeliver } from './callback-deliver'; +import './designer-styles.css'; + +interface BaDesignerContext { + isDesign: boolean; + selectedComponentId: string; + notAllowedSelectedComponentNames: string[]; +} + +const FBaDynamicView = defineComponent({ + name: 'FBaDynamicView', + props: baDynamicViewProps, + emits: ['update:modelValue', 'event', 'componentReady', 'selectionChange', 'componentDelete'], + setup(props: BaDynamicViewProps, setupContext: SetupContext) { + const baDesignerContext = inject("BaDesignerContext"); + const schema = ref(props.schema); + const modelValue = ref(props.modelValue); + const callback = ref(props.callback); + const { customComponentRenders } = props; + + const schemaMap: Map = new Map(); + const dataSourceMap: Map = new Map(); + // loadRegister1(); + const componentManager = useComponentManager(); + const bindingData = useBindingData(modelValue, setupContext); + const entityState = useEntityState(schema.value); + const propsMap = new Map(); + entityState.setup(); + // const componentState = new Map>(); + const state = new Map; }>>(); + + function isObjectEqual(obj1, obj2) { + // 如果是基本类型,直接比较 + if (obj1 === obj2) { return true; } + + // 处理数组比较 + if (Array.isArray(obj1) && Array.isArray(obj2)) { + // 数组长度不同直接返回false + if (obj1.length !== obj2.length) { return false; } + + // 递归比较数组中的每个元素 + for (let i = 0; i < obj1.length; i++) { + if (!isObjectEqual(obj1[i], obj2[i])) { + return false; + } + } + return true; + } + + // 如果其中一个是null或者不是对象 + if (obj1 == null || typeof obj1 !== 'object' || obj2 == null || typeof obj2 !== 'object') { + if (typeof obj1 === 'function' || typeof obj2 === 'function') { + return true; + } + return false; + } + + const keys1 = Object.keys(obj1); + const keys2 = Object.keys(obj2); + + if (keys1.length !== keys2.length) { return false; } + + for (const key of keys1) { + // if (key === 'modelValue') { + // obj1[key] = obj2[key]; + // continue; + // }; + if (!keys2.includes(key) || !isObjectEqual(obj1[key], obj2[key])) { + return false; + } + } + return true; + } + + function resolveModels(viewSchema: Record) { + const componentType = viewSchema.type; + const { dataSource, binding = undefined } = viewSchema; + if (!dataSource && binding === undefined) { + return {}; + } + if (dataSource) { + dataSourceMap.set(dataSource, viewSchema); + } + const resolver = resolverMap[componentType]; + const bindingResolver = resolver && resolver.bindingResolver ? resolver.bindingResolver : createFormBindingResolver(); + return bindingResolver.resolve(viewSchema, bindingData); + } + + function renderSlots(slots?: Record) { + const result: Record = {}; + if (!slots) { + return result; + } + Object.entries(slots).forEach(([name, schema]) => { + result[name] = () => { + if (Array.isArray(schema)) { + return schema.map((schema: Record) => render(schema)); + } + return render(schema); + }; + }); + return result; + } + + function resolveCallbacks(viewSchema: Record) { + const componentKey = viewSchema.type; + const resolvers = resolverMap[componentKey]; + if (!resolvers || Object.keys(resolvers).length < 1) { + return {}; + } + const { callbackResolver, editorResolver } = resolvers; + const callbackDeliver = createCallbackDeliver(callback.value); + if (editorResolver) { + const editor = editorResolver.resolve(viewSchema); + const componentType = editor.type; + const resolvers = resolverMap[componentType]; + const { callbackResolver } = resolvers || {}; + if (!callbackResolver) { + return {}; + } + return callbackResolver.resolve(viewSchema, callbackDeliver); + } + if (!callbackResolver) { + return {}; + } + return callbackResolver.resolve(viewSchema, callbackDeliver); + + } + function resolveEvents(viewSchema: Record) { + const componentKey = viewSchema.type; + const eventDispatcher = createEventDispatcher(setupContext, viewSchema); + const Component = componentMap[componentKey]; + const eventResolver = createEventsResolver(); + const resolver = resolverMap[componentKey]; + const editorResolver: EditorResolver = resolver ? resolver.editorResolver : null; + if (editorResolver) { + const editor = editorResolver.resolve(viewSchema); + const componentType = editor.type; + const Editor = componentMap[componentType]; + const eventProps = eventResolver ? eventResolver(Editor, viewSchema, eventDispatcher) : {}; + return eventProps; + } + const eventProps = eventResolver ? eventResolver(Component, viewSchema, eventDispatcher) : {}; + return eventProps; + } + + function resolveExtraProps(viewSchema: Record) { + // const componentKey = viewSchema.type; + // const resolver = resolverMap[componentKey]; + // const extraPropsResolver: ExtraPropsResolver | null = resolver ? resolver.extraPropsResolver : null; + // if (!extraPropsResolver) { + // return {}; + // } + // return extraPropsResolver.resolve(viewSchema); + return {}; + } + + function resolveProps(viewSchema: Record) { + const componentKey = viewSchema.type; + const propsConverter = componentPropsConverter[componentKey]; + const componentProps: Record = propsConverter ? propsConverter(viewSchema) : {}; + const eventProps = { + ...resolveEvents(viewSchema) + }; + const callbackProps = { + ...resolveCallbacks(viewSchema) + }; + const viewProps = { + ...componentProps, + ...resolveModels(viewSchema), + ...resolveExtraProps(viewSchema) + }; + + if (componentKey === 'component') { + viewProps['code'] = schema.value?.module?.code; + } + + const componentPropsResult = { + ...viewProps, + key: viewSchema.id, + selectedComponentId: props.selectedComponentId, + // ref 回调已移至 createNode 中统一处理,避免重复注册 + }; + return { props: componentPropsResult, eventProps, callbackProps }; + } + + // 处理设计器 wrapper 点击事件 + function handleSelectionChange(event: MouseEvent, componentId: string, componentType: string) { + // 阻止事件冒泡 + event.stopPropagation(); + // 发送事件 + setupContext.emit('selectionChange', componentType, schemaMap.get(componentId), componentId, componentManager.get(componentId)); + } + // 删除组件 + function handleDeleteComponent(event: MouseEvent, componentId: string) { + event.stopPropagation(); + const viewSchema = schemaMap.get(componentId); + if (!viewSchema) { + return; + } + setupContext.emit('componentDelete', componentId); + } + + // 渲染设计器按钮组 + function renderDesignerButtons(componentId: string, componentType: string) { + if (!(baDesignerContext && baDesignerContext?.isDesign)) { + return null; + } + + // 检查组件是否在不允许删除列表中 + const cannotDelete = props.cannotDeleteComponentIds && + props.cannotDeleteComponentIds.includes(componentId); + + // 如果不允许删除,不显示按钮组 + if (cannotDelete) { + return null; + } + + return ( +
+ handleDeleteComponent(event, componentId)}> + +
+ ); + } + + // 缓存 ContextProvider 组件定义,避免每次 render 都创建新的组件 + const contextProviderCache = new Map(); + + // 创建或获取缓存的 ContextProvider + function getOrCreateContextProvider( + componentId: string, + componentType: any, + vnodeProps: any, + designItemContext: any, + children?: any + ) { + if (!contextProviderCache.has(componentId)) { + const ContextProvider = defineComponent({ + name: `ContextProvider_${componentId}`, + props: ['vnodeProps', 'componentType', 'designItemContext', 'children'], + setup(props, { expose }) { + provide('design-item-context', props.designItemContext); + + const innerComponentRef = ref(); + expose(innerComponentRef); + + return () => { + const innerProps = { + ...props.vnodeProps, + ref: (el: any) => { + innerComponentRef.value = el; + if (props.vnodeProps.ref && typeof props.vnodeProps.ref === 'function') { + props.vnodeProps.ref(el); + } + } + }; + + if (props.children && props.children.length > 0) { + return createVNode(props.componentType, innerProps, props.children); + } else { + return createVNode(props.componentType, innerProps, null); + } + }; + } + }); + contextProviderCache.set(componentId, ContextProvider); + } + return contextProviderCache.get(componentId); + } + + function render(viewSchema: Record, parentContext?: any) { + const componentKey = viewSchema.type; + + // 自定义组件渲染器 + if (customComponentRenders && customComponentRenders[componentKey]) { + return customComponentRenders[componentKey](viewSchema); + } + + if (componentKey === 'component-ref') { + const componentSchema = schema.value?.module?.components + .find((component: any) => component.id === viewSchema.component); + if (componentSchema) { + return render(componentSchema, parentContext); + } + } + + if (viewSchema.id) { + schemaMap.set(viewSchema.id, viewSchema); + } + const Component = componentMap[componentKey]; + if (!Component) { + return null; + } + + // 创建组件实例引用 + const componentInstanceRef = ref(); + const designerItemElementRef = ref(); + + // 为设计时组件提供 DesignerItemContext + const designItemContext = baDesignerContext && baDesignerContext?.isDesign ? { + designerItemElementRef, + componentInstance: componentInstanceRef, + schema: viewSchema, + parent: parentContext, + setupContext: setupContext, + updateContextSchema: (newSchema: any) => { + if (newSchema) { + Object.assign(viewSchema, newSchema); + } + } + } : null; + // const { props, eventProps } = resolveProps(viewSchema); + + const renderChildren = () => { + if (!viewSchema.contents) { + return null; + } + if (typeof viewSchema.contents === 'string') { + return viewSchema.contents; + } + return viewSchema.contents.map((schema: Record) => render(schema, designItemContext)); + }; + // const resolver = resolverMap[componentKey]; + // const editorResolver: EditorResolver = resolver ? resolver.editorResolver : null; + // if (editorResolver) { + // const editor = editorResolver.resolve(viewSchema); + // Object.assign(editor, eventProps); + // } else { + // Object.assign(props, eventProps); + // } + const createNode = (componentType: any, nodeProps: Record, children?: null | undefined | any[]) => { + let vnode; + + // 创建基础 VNode,并附加 ref(合并了原 resolveProps 中的逻辑) + const vnodeProps = { + ...nodeProps, + ref: (el: any) => { + if (el && viewSchema.id) { + // 注册组件实例(仅注册一次) + if (!componentManager.has(viewSchema.id)) { + componentManager.register(viewSchema.id, el); + componentInstanceRef.value = el; + } + + // 更新 propsMap 并发送 componentReady 事件 + if (!propsMap.has(viewSchema.id)) { + propsMap.set(viewSchema.id, JSON.parse(JSON.stringify(nodeProps))); + } + if (!isObjectEqual(nodeProps, propsMap.get(viewSchema.id))) { + propsMap.set(viewSchema.id, JSON.parse(JSON.stringify(nodeProps))); + setupContext.emit('componentReady', { ref: ref(el), id: viewSchema.id, type: viewSchema.type }); + } + } + } + }; + + // 判断是否需要提供 design-item-context + // grid-layout 等容器组件在 notAllowedSelectedComponentNames 中,不需要 ContextProvider + const needsContext = + designItemContext && + baDesignerContext && baDesignerContext?.isDesign && + baDesignerContext?.notAllowedSelectedComponentNames?.indexOf(componentType.name) < 0; + + // 如果需要提供上下文,使用缓存的 ContextProvider + if (needsContext) { + const ContextProvider = getOrCreateContextProvider( + viewSchema.id, + componentType, + vnodeProps, + designItemContext, + children + ); + vnode = createVNode(ContextProvider, { + key: viewSchema.id, + vnodeProps, + componentType, + designItemContext, + children + }); + } else { + if (children && children.length > 0) { + vnode = createVNode(componentType, vnodeProps, children); + } else { + vnode = createVNode(componentType, vnodeProps, null); + } + } + + // 如果处于设计模式,包装设计器容器并提供上下文 + if (needsContext) { + const isSelected = props.selectedComponentId === nodeProps.id; + const designerWrapperClass = { + 'ba-designer-wrapper': true, + 'farris-component': true, + 'position-relative': true, + 'ba-designer-wrapper-selected': isSelected, + 'dgComponentSelected': isSelected, + 'dgComponentFocused': isSelected + }; + + // 保存原来的组件 vnode + const originalVNode = vnode; + + // 渲染删除按钮 + const deleteButton = renderDesignerButtons(nodeProps.id, componentKey); + + // 使用 createVNode 创建包装器,把原组件和删除按钮作为子节点 + const children = deleteButton ? [originalVNode, deleteButton] : [originalVNode]; + + vnode = createVNode( + 'div', + { + class: designerWrapperClass, + style: { width: '100%', height: '100%' }, + onClick: (event: MouseEvent) => handleSelectionChange(event, nodeProps.id, componentKey), + ref: (el: any) => { + if (el) { + designerItemElementRef.value = el; + } + }, + ['data-design-item-id']: viewSchema.id + }, + // 使用数组包装原组件和删除按钮,确保正确渲染 + children + ); + } + + return vnode; + }; + // componentState.set(viewSchema.id, reactive({ props })); + // const reactivedProps = componentState.get(viewSchema.id).props; + const stateProps = state.get(viewSchema.id)?.props || {}; + if (viewSchema.contents && viewSchema.contents.length > 0) { + return createNode(Component, stateProps, [renderChildren()]); + } else if (viewSchema.slots) { + return createNode(Component, stateProps, [...Object.values(renderSlots(viewSchema.slots))]); + } else { + return createNode(Component, stateProps); + } + } + + function rerender(component: any) { + if (component.$forceUpdate) { + component.$forceUpdate(); + } + } + function getControlValue(id: string) { + return bindingData.getValue(id); + } + function getSchema(id: string) { + return schemaMap.get(id); + } + + function setSchema(id: string, partialSchema: Record) { + const elementSchema = schemaMap.get(id); + if (!elementSchema) { + return; + } + const componentInstance = componentManager.get(id); + if (!componentInstance) { + return; + } + merge(elementSchema, partialSchema); + const componentKey = elementSchema.type; + const resolver = resolverMap[componentKey]; + const updateColumnsResolver: UpdateColumnsResolver = resolver ? resolver.updateColumnsResolver : null; + if (updateColumnsResolver) { + updateColumnsResolver.updateColumns(componentInstance, elementSchema); + } + rerender(componentInstance); + } + function getProps(id: string): Record | undefined { + return state.get(id)?.props; + } + + function setProps(id: string, props: Record) { + const currentState = state.get(id); + mergeWith(currentState?.props, props, mergeArray); + // state.set(id, reactive({ props: { ...currentProps, ...props } })); + } + + function invoke(id: string, method: string, ...args: any[]): any { + const componentInstance = componentManager.get(id); + if (!componentInstance) { + return; + } + if (!componentInstance || typeof componentInstance[method] !== 'function') { + throw new Error(`Method ${method} not found on instance ${id}`); + } + return componentInstance[method](...args); + } + + function selectItemById(bindingPath: string, id: string) { + const bindingEntityState = entityState.get(bindingPath); + if (!bindingEntityState) { + return; + } + const entityLabel = bindingEntityState.label; + const viewSchema = dataSourceMap.get(entityLabel); + if (!viewSchema) { + return; + } + const componentType = viewSchema.type; + const resolver = resolverMap[componentType]; + const selectionMethodResolver: SelectionItemResolver | null = resolver ? resolver.selectionItemResolver : null; + if (selectionMethodResolver) { + const Component = componentManager.get(viewSchema.id); + selectionMethodResolver.selectItemById(Component, id); + } + } + function isMergeable(item: any): item is any { + return item && typeof item === 'object' && !Array.isArray(item); + } + function deepMerge(target: any, ...sources: any[]): any { + if (!sources.length) { return target; } + const source = sources.shift(); + + if (isMergeable(target) && isMergeable(source)) { + for (const key in source) { + if (isMergeable(source[key])) { + if (!target[key]) { + Object.assign(target, { [key]: {} }); + } + deepMerge(target[key], source[key]); + } else { + Object.assign(target, { [key]: source[key] }); + } + } + } + return deepMerge(target, ...sources); + } + function convertSchemaToProps(viewSchema: Record) { + const componentKey = viewSchema.type; + if (componentKey === 'component-ref') { + const componentSchema = schema.value?.module?.components + .find((component: any) => component.id === viewSchema.component); + if (componentSchema) { + return convertSchemaToProps(componentSchema); + } + } + const Component = componentMap[componentKey]; + if (!Component) { + return; + } + const { props, eventProps, callbackProps } = resolveProps(viewSchema); + const resolver = resolverMap[componentKey]; + const editorResolver: EditorResolver = resolver ? resolver.editorResolver : null; + if (editorResolver) { + const editor = editorResolver.resolve(viewSchema); + deepMerge(editor, eventProps, callbackProps); + } else { + deepMerge(props, eventProps, callbackProps); + } + if (props && Object.keys(props).length > 0) { + const currentState = state.get(viewSchema.id); + if (!currentState) { + state.set(viewSchema.id, reactive({ props })); + } else { + deepMerge(currentState?.props, props); + } + // state.set(viewSchema.id, reactive({ props: { ...currentProps, ...props } })); + } + if (!viewSchema.contents || !Array.isArray(viewSchema.contents)) { + return; + } + viewSchema.contents.forEach((schema: Record) => convertSchemaToProps(schema)); + } + + function convertPartialSchemaToProps(type: string, viewSchema: Record) { + const propsConverter = componentPropsConverter[type]; + const componentProps: Record = propsConverter ? propsConverter(viewSchema, false) : {}; + return componentProps; + } + + function convertModelValueToProps(viewSchema: Record) { + const componentKey = viewSchema.type; + if (componentKey === 'component-ref') { + const componentSchema = schema.value?.module?.components + .find((component: any) => component.id === viewSchema.component); + if (componentSchema) { + return convertModelValueToProps(componentSchema); + } + } + const Component = componentMap[componentKey]; + if (!Component) { + return; + } + const modelProps = resolveModels(viewSchema); + if (modelProps && Object.keys(modelProps).length > 0) { + const currentState = state.get(viewSchema.id); + if (!currentState) { + state.set(viewSchema.id, reactive({ props: modelProps })); + } else { + mergeWith(currentState?.props, modelProps, (objValue, srcValue) => { + if (Array.isArray(srcValue)) { + return srcValue; + } + return undefined; + }); + } + // state.set(viewSchema.id, reactive({ props: { ...currentProps, ...modelProps } })); + } + if (!viewSchema.contents || !Array.isArray(viewSchema.contents)) { + return; + } + viewSchema.contents.forEach((schema: Record) => convertModelValueToProps(schema)); + } + function getFrameComponentSchema(): Record | null { + const components: Record[] = schema.value?.module?.components; + if (!components || components.length < 1) { + return null; + } + const frameComponent = components.find((component: Record) => component.componentType && component.componentType.toLowerCase() === 'frame'); + if (!frameComponent) { + return null; + } + + frameComponent['formCode'] = schema.value?.module?.code; + return frameComponent; + } + + function mergeArray(target: any, source: any) { + if (Array.isArray(target) && Array.isArray(source)) { + const mergedMap = new Map(); + target.forEach(item => { + if (item.id != null) { + mergedMap.set(item.id, item); + } + }); + + // 合并源数组元素到Map,存在则深度合并 + source.forEach(item => { + if (item.id != null) { + const existing = mergedMap.get(item.id); + if (existing) { + // 合并现有元素和当前元素 + mergedMap.set(item.id, mergeWith(existing, item, mergeArray)); + } else { + mergedMap.set(item.id, cloneDeep(item)); + } + } + }); + const combined = Array.from(mergedMap.values()); + return combined; + } + } + + watch(() => props.modelValue, (newModelValue) => { + modelValue.value = newModelValue; + const viewSchema = getFrameComponentSchema(); + if (!viewSchema) { + return; + } + convertModelValueToProps(viewSchema); + }); + + watch(() => props.schema, (newSchema) => { + schema.value = newSchema; + const viewSchema = getFrameComponentSchema(); + if (!viewSchema) { + return; + } + convertSchemaToProps(viewSchema); + }); + + setupContext.expose({ componentManager, rerender, getProps, invoke, setProps, selectItemById, getSchema, setSchema, convertPartialSchemaToProps, getControlValue }); + + return () => { + const components: Record[] = schema.value?.module?.components; + if (!components || components.length < 1) { + return null; + } + const frameComponent = components.find((component: Record) => component.componentType && component.componentType.toLowerCase() === 'frame'); + if (!frameComponent) { + return null; + } + return render(frameComponent); + }; + } +}); +export default FBaDynamicView; diff --git a/packages/charts-vue/components/dynamic-view/src/dynamic-view.props.ts b/packages/charts-vue/components/dynamic-view/src/dynamic-view.props.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ecbfdab02837e1d70b9c34bd94fb635367b2a71 --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/dynamic-view.props.ts @@ -0,0 +1,37 @@ +import { ExtractPropTypes, PropType } from 'vue'; + +export const baDynamicViewProps = { + /** + * schema + */ + schema: { type: Object, default: null }, + /** + * 组件值 + */ + modelValue: { type: Object as PropType>, default: null }, + /** + * 回调 + */ + callback: { type: Function as PropType<(type: string, ...args: unknown[]) => any>, default: () => { } }, + + /** + * 自定义组件渲染器 + */ + customComponentRenders: { type: Object, default: null }, + + /** + * 当前选中的组件ID + */ + selectedComponentId: { type: String, default: '' }, + + /** + * 组件ID + */ + componentId: { type: String, default: '' }, + + /** + * 不允许删除的组件ID列表 + */ + cannotDeleteComponentIds: { type: Array as PropType, default: () => [] } +}; +export type BaDynamicViewProps = ExtractPropTypes; diff --git a/packages/charts-vue/components/dynamic-view/src/event-dispatcher.ts b/packages/charts-vue/components/dynamic-view/src/event-dispatcher.ts new file mode 100644 index 0000000000000000000000000000000000000000..ba31c8b7cc433422bc515b66e5c45cf7a8ba02b9 --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/event-dispatcher.ts @@ -0,0 +1,12 @@ + +import { SetupContext } from "vue"; +import { EventDispatcher } from "@farris/ui-vue"; + +export function createEventDispatcher(context: SetupContext, schema: Record): EventDispatcher { + function dispatch(token: string, eventName: string, type: string, payloads: any[]) { + context.emit('event', { token, name: eventName, type, payloads, schema }); + } + return { + dispatch + }; +} diff --git a/packages/charts-vue/components/dynamic-view/src/service/http/http-client.ts b/packages/charts-vue/components/dynamic-view/src/service/http/http-client.ts new file mode 100644 index 0000000000000000000000000000000000000000..2633841280e56fddd0241ee00a9ddffa39ffd1ea --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/service/http/http-client.ts @@ -0,0 +1,73 @@ +import axios from 'axios'; +import { AxiosInstance, AxiosResponse } from 'axios'; +import { HttpMethod, HttpRequestConfig } from './types'; +import { HttpUtil } from './http-util'; + +/** + * HttpClient + */ +export class HttpClient { + + /** + * axios实例 + */ + private axiosInstance: AxiosInstance; + + /** + * 构造函数 + */ + constructor() { + this.axiosInstance = axios.create(); + } + + /** + * 发送GET请求 + */ + public get(url: string, requestConfig: HttpRequestConfig): Promise { + return this.request('GET', url, requestConfig); + } + + /** + * 发送POST请求 + */ + public post(url: string, body: any, requestConfig: HttpRequestConfig): Promise { + requestConfig = HttpUtil.appendBodyToRequestConfig(body, requestConfig); + return this.request('POST', url, requestConfig); + } + + /** + * 发送PUT请求 + */ + public put(url: string, body: any, requestConfig: HttpRequestConfig): Promise { + requestConfig = HttpUtil.appendBodyToRequestConfig(body, requestConfig); + return this.request('PUT', url, requestConfig); + } + + /** + * 发送PATCH请求 + */ + public patch(url: string, body: any, requestConfig: HttpRequestConfig): Promise { + requestConfig = HttpUtil.appendBodyToRequestConfig(body, requestConfig); + return this.request('PATCH', url, requestConfig); + } + + /** + * 发送DELETE请求 + */ + public delete(url: string, requestConfig: HttpRequestConfig): Promise { + return this.request('DELETE', url, requestConfig); + } + + /** + * 发送请求 + */ + public request(method: HttpMethod, url: string, requestConfig: HttpRequestConfig): Promise { + const axiosRequestConfig = HttpUtil.buildAxiosRequestConfig(method, url, requestConfig); + const responsePromise = this.axiosInstance.request(axiosRequestConfig).then((axiosResponse: AxiosResponse) => { + const httpResponse = HttpUtil.buildHttpResponse(axiosResponse); + return requestConfig.observe === 'response' ? httpResponse : axiosResponse.data; + }); + + return responsePromise; + } +} diff --git a/packages/charts-vue/components/dynamic-view/src/service/http/http-util.ts b/packages/charts-vue/components/dynamic-view/src/service/http/http-util.ts new file mode 100644 index 0000000000000000000000000000000000000000..8ef4cdf6f86f45b2a1931af427cb9d381b8b63ab --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/service/http/http-util.ts @@ -0,0 +1,57 @@ +import { AxiosRequestConfig, AxiosResponse } from 'axios'; +import { HttpMethod, HttpHeaders, HttpResponse, HttpRequestConfig } from './types'; + +export class HttpUtil { + + /** + * 追加Header + */ + public static appendHeader(headers: HttpHeaders, key: string, value: string): HttpHeaders { + headers = Object.assign({}, headers, { [key]: value }); + return headers; + } + + /** + * 向RequestConfig中追加body + */ + public static appendBodyToRequestConfig(body: any, requestConfig: HttpRequestConfig) { + if (!requestConfig) { + requestConfig = {}; + } + requestConfig = Object.assign({}, requestConfig, { body }); + + return requestConfig; + } + + /** + * 构造AxiosReqeustConfig + */ + public static buildAxiosRequestConfig(method: HttpMethod, url: string, requestConfig: HttpRequestConfig | any): AxiosRequestConfig { + requestConfig = requestConfig || {}; + + const axiosRequestConfig: AxiosRequestConfig = { + url, + method, + params: requestConfig.params || null, + headers: requestConfig.headers || null, + responseType: requestConfig.responseType || 'json', + data: requestConfig.body || null, + withCredentials: true + }; + return axiosRequestConfig; + } + + /** + * 构造Http响应信息 + */ + public static buildHttpResponse(axiosResponse: AxiosResponse) { + const httpResponse: HttpResponse = { + body: axiosResponse.data, + headers: axiosResponse.headers, + status: axiosResponse.status, + statusText: axiosResponse.statusText + }; + return httpResponse; + } + +} diff --git a/packages/charts-vue/components/dynamic-view/src/service/http/index.ts b/packages/charts-vue/components/dynamic-view/src/service/http/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..b015a418c00278477bb42a68f67b39964d819578 --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/service/http/index.ts @@ -0,0 +1,3 @@ +export * from './types'; +export * from './http-util'; +export * from './http-client'; diff --git a/packages/charts-vue/components/dynamic-view/src/service/http/types.ts b/packages/charts-vue/components/dynamic-view/src/service/http/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..8e3a505d98a7a711aef8b07f0011d1e4f86ccf28 --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/service/http/types.ts @@ -0,0 +1,73 @@ +/** + * 请求头信息 + */ +export interface HttpHeaders { + [key: string]: string; +} + +/** + * Http参数 + */ +export interface HttpParams { + [key: string]: string; +} + +/** + * 请求方法 + */ +export type HttpMethod = | 'GET' | 'DELETE' | 'HEAD' | 'OPTIONS' | 'POST' | 'PUT' | 'PATCH' | 'LINK' | 'UNLINK'; + +/** + * HttpMethods + */ +export class HttpMethods { + public static GET: HttpMethod = 'GET'; + + public static DELETE: HttpMethod = 'DELETE'; + + public static HEAD: HttpMethod = 'HEAD'; + + public static OPTIONS: HttpMethod = 'OPTIONS'; + + public static POST: HttpMethod = 'POST'; + + public static PUT: HttpMethod = 'PUT'; + + public static PATCH: HttpMethod = 'PATCH'; + + public static LINK: HttpMethod = 'LINK'; + + public static UNLINK: HttpMethod = 'UNLINK'; +} + + +/** + * 返回值类型 + */ +export type HttpResponseType = | 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'; + +/** + * 返回值处理类型 + */ +export type ObserveType = 'body' | 'response'; + +/** + * Http响应信息 + */ +export interface HttpResponse { + headers: any; + body: any; + status: number; + statusText: string; +} + +/** + * Http请求配置 + */ +export interface HttpRequestConfig { + params?: HttpParams; + body?: any; + headers?: HttpHeaders; + responseType?: HttpResponseType; + observe?: 'body' | 'response'; +} diff --git a/packages/charts-vue/components/dynamic-view/src/types.ts b/packages/charts-vue/components/dynamic-view/src/types.ts new file mode 100644 index 0000000000000000000000000000000000000000..624ae1ecdde93b6c99c209c1d522f172277c7bea --- /dev/null +++ b/packages/charts-vue/components/dynamic-view/src/types.ts @@ -0,0 +1,83 @@ + +export interface EntityState { + primaryKey: string; + bindingPath: string; + currentId: string | null; + label: string; +} + +export interface UseBindingContext { + setup(); + get(bindingPath: string | string[]): EntityState; +} + +export interface EntityFieldSchema { + id: string; + require: any; + multiLanguage: boolean; + defaultValue: any; + readonly: any; + bindingPath: string; + label: string; + type: Record; + name: string; +} + +export interface EntityTypeSchema { + entities: EntitySchema[]; + primary: string; + displayName: string; + fields: EntityFieldSchema[]; + name: string; +} +export interface EntitySchema { + id: string; + label: string; + code: string; + type: EntityTypeSchema; + name: string; +} + +export interface ResolvedEntity { + bindingPaths: string[]; + primaryKey: string; + label: string; +} + +export interface ResolvedEntityField { + id: string; + bindingPath: string; + require: any; + readonly: any; + multiLanguage: boolean; + label: string; + dataSource: string; +} + +export interface UseEntityResolver { + resolveEntityByDataSource(dataSource: string): ResolvedEntity | null; + resolveEntities(entitySchema: EntitySchema): ResolvedEntity[]; + resolveEntity(entity: Record, entityLabel: string, isRoot?: boolean): ResolvedEntity | null; +} + +export interface UseFieldResolver { + resolveFieldById(fieldId: string): ResolvedEntityField | null; +} + +// export interface UseBindingData { +// currentId: ComputedRef; +// primaryKey: ComputedRef; +// bindingList: ComputedRef; +// currentItem: ComputedRef; +// setValueByPath(bindingPath: string, value: any); +// } + +export interface UseComponentInstanceManager { + register(id: string, instance: any): void; + get(id: string): any | null; + remove(id: string): void; + update(id: string, instance: any): void; + has(id: string): boolean; + getAll(): Map; + clear(): void; +} diff --git a/packages/charts-vue/components/grid-layout/grid-layout.scss b/packages/charts-vue/components/grid-layout/grid-layout.scss new file mode 100644 index 0000000000000000000000000000000000000000..1d757a2163baa4abb5f93f5fee02d5ddff92143a --- /dev/null +++ b/packages/charts-vue/components/grid-layout/grid-layout.scss @@ -0,0 +1,163 @@ +.vue-grid-layout-guid-lines { + position: relative; + border-radius: 3px; + background: var(--grid-bg); + transition: all 0.3s ease; + background-image: radial-gradient(circle at center, var(--dot-color) var(--dot-size), transparent var(--dot-size)); + background-size: var(--dot-spacing) var(--dot-spacingh); + background-position: calc(var(--dot-spacing) / 2) calc(var(--dot-spacingh) / 2); + background-color: #F8FBFC !important; +} + +:root { + --primary-color: #6366f1; + --secondary-color: #8b5cf6; + --dot-color: rgba(99, 102, 241, 0.3); + --dot-spacing: calc(100%/12/6); + --dot-spacingh: calc(60px/4); + --dot-size: 1px; + --guide-color: rgba(139, 92, 246, 0.6); + --grid-bg: #ffffff; +} + +.vue-grid-layout.responsive-grid { + background-image: linear-gradient(to right, var(--grid-primary-color) 1px, transparent 1px), linear-gradient(to bottom, var(--grid-primary-color) 1px, transparent 1px); + background-size: var(--grid-spacing-large) var(--grid-spacing-large); +} + +/* 大屏幕优化 */ +@media (min-width: 1200px) { + .vue-grid-layout.responsive-grid { + background-size: var(--grid-spacing-large) var(--grid-spacing-large); + } +} + +/* 平板优化 */ +@media (max-width: 768px) { + .vue-grid-layout.responsive-grid { + background-size: calc(var(--grid-spacing-large) * 0.8) calc(var(--grid-spacing-large) * 0.8); + } +} + +/* 手机优化 */ +@media (max-width: 480px) { + .vue-grid-layout.responsive-grid { + background-size: calc(var(--grid-spacing-large) * 0.6) calc(var(--grid-spacing-large) * 0.6); + } +} + +/* 拖拽状态指示器 */ +.vue-grid-item.dragging { + box-shadow: 0 8px 25px rgba(52, 152, 219, 0.4); + z-index: 25; + opacity: 0.9; +} + +/* 网格项尺寸指示器 */ +.vue-grid-item .size-indicator { + position: absolute; + bottom: 5px; + right: 5px; + background: rgba(0, 0, 0, 0.3); + color: white; + padding: 2px 6px; + border-radius: 3px; + font-size: 10px; + opacity: 0; + transition: opacity 0.2s ease; +} + +.vue-grid-item:hover .size-indicator { + opacity: 1; +} + +/* 网格线淡入动画 */ +@keyframes gridlineFadeIn { + // from { + // background-position: -1px -1px, -1px -1px; + // } + + // to { + // background-position: 0px 0px, 0px 0px; + // } +} + +.vue-grid-layout.gridlines-visible { + // animation: gridlineFadeIn 0.5s ease-out; +} + +/* 辅助线脉动动画 */ +@keyframes guidelinePulse { + // 0%, + // 100% { + // opacity: 0.6; + // } + + // 50% { + // opacity: 0.9; + // } +} + +/* 网格线容器样式 */ +/* 基础网格线 */ +/* 网格项样式 */ +.vue-grid-item { + color: white; + font-weight: 500; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s ease; + border-radius: 10px; + // z-index: 3; +} + +/* 网格项悬停效果 */ +.vue-grid-item:hover { + background: #FFFFFF; + box-shadow: 0px 2px 14px 0px rgba(0, 0, 0, 0.06); + border-radius: 10px; +} + +/* 占位符样式 - 增强辅助线 */ +.vue-grid-item.vue-grid-placeholder { + opacity: 0.15; + background: #4190FF; + border-radius: 10px; +} + +.grid-wrapper { + position: relative; + /* 确保网格线容器可以绝对定位 */ + width: 100%; + height: 100%; +} + +.grid-lines { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + /* 防止网格线阻挡交互 */ + z-index: 2; + /* 确保网格线在底层 */ +} + +.grid-line { + position: absolute; + background: rgba(200, 200, 200, 0.5); +} + +.vertical { + top: 0; + width: 1px; + height: 100%; +} + +.horizontal { + left: 0; + height: 1px; + width: 100%; +} \ No newline at end of file diff --git a/packages/charts-vue/components/grid-layout/index.ts b/packages/charts-vue/components/grid-layout/index.ts index 57f8bb62dd8b069c59802cb4d9d06fe55d1fd509..9c2aa312d9ec4c18356fbc319572563ba51679e6 100644 --- a/packages/charts-vue/components/grid-layout/index.ts +++ b/packages/charts-vue/components/grid-layout/index.ts @@ -14,12 +14,30 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import FGridLayoutWrapper from './src/gridlayoutwrapper.component'; +import { App } from 'vue'; +import FGridLayoutWrapperComponent from './src/gridlayoutwrapper.component'; import LayoutItem from './src/composition/type'; import { withInstall } from '@farris/charts-vue/components/charts-common'; - +import './grid-layout.scss'; export * from './src/gridlayout.props'; +import { propsResolver } from './src/gridlayout.props'; + + +const FGridLayoutWrapper = withInstall(FGridLayoutWrapperComponent) + +FGridLayoutWrapper.install = (app: App) => { + app.component(FGridLayoutWrapperComponent.name as string, FGridLayoutWrapperComponent); +}; +FGridLayoutWrapper.register = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record, resolverMap: Record) => { + componentMap['grid-layout'] = FGridLayoutWrapperComponent; + propsResolverMap['grid-layout'] = propsResolver; +}; + +FGridLayoutWrapper.registerDesigner = (componentMap: Record, propsResolverMap: Record, configResolverMap: Record) => { + // componentMap['grid-layout'] = FGridLayoutWrapperComponent; + // propsResolverMap['grid-layout'] = propsResolver; +}; export { FGridLayoutWrapper }; export type { LayoutItem }; -export default withInstall(FGridLayoutWrapper); +export default FGridLayoutWrapper; diff --git a/packages/charts-vue/components/grid-layout/src/gridlayout.props.ts b/packages/charts-vue/components/grid-layout/src/gridlayout.props.ts index 6543601a25122f65b117d10325f57f293e4c58a6..537fa80728f9732f952389c5a73fa96234834b07 100644 --- a/packages/charts-vue/components/grid-layout/src/gridlayout.props.ts +++ b/packages/charts-vue/components/grid-layout/src/gridlayout.props.ts @@ -16,17 +16,18 @@ */ import LayoutItem from './composition/type'; import { ExtractPropTypes, PropType } from 'vue'; +import { createPropsResolver } from "@farris/ui-vue"; +import gridLayoutSchema from './schema/grid-layout.schema.json'; +import { schemaMapper } from './schema/schema-mapper'; +import { schemaResolver } from './schema/schema-resolver'; export const gridLayoutProps = { /** 数据源,参与布局的item */ layout: { type: Array as PropType, - required: true, - validator: (value: unknown) => - Array.isArray(value) && value.every(item => - typeof item === 'object' && 'i' in item - ) + default: () => [] }, + guidelinesEnabled: { type: Boolean, default: true }, /** 定义栅栏布局的列数 */ columnNumber: { type: Number, default: 12 }, /** 行高,单位像素 */ @@ -36,13 +37,16 @@ export const gridLayoutProps = { /** 定义栅栏元素是否可以调整大小 */ isResizable: { type: Boolean, default: true }, /** 定义栅格中的元素边距 */ - margin: { type: Array as unknown as PropType<[number, number]>, default: () => [10, 10] }, + margin: { type: Array as unknown as PropType<[number, number]>, default: () => [5, 5] }, /** 标识布局容器是否自动调整大小 */ autoSize: { type: Boolean, default: true }, /** 标识布局是否为响应式 */ responsive: { type: Boolean, default: true }, - verticalCompact: { type: Boolean, default: true }, + verticalCompact: { type: Boolean, default: false }, useCssTransforms: { type: Boolean, default: true }, + preventCollision: { type: Boolean, default: false }, + cols: { type: Object, default: { lg: 12, md: 10, sm: 8, xs: 4, xxs: 2, xss: 2 } }, + breakpoints: { type: Object, default: { lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0, xss: 0 } }, /** 对应Vue生命周期的created */ layoutCreatedEvent: { type: Function, default: (newLayout: any) => { } }, /** 对应Vue生命周期的beforeMount */ @@ -65,3 +69,4 @@ export const gridLayoutProps = { } as Record; export type GridLayoutProps = ExtractPropTypes; +export const propsResolver = createPropsResolver(gridLayoutProps, gridLayoutSchema, schemaMapper, schemaResolver); \ No newline at end of file diff --git a/packages/charts-vue/components/grid-layout/src/gridlayoutwrapper.component.tsx b/packages/charts-vue/components/grid-layout/src/gridlayoutwrapper.component.tsx index 9071d475fa108b210bd7951a1e3f0ac437e68601..0360b6d896504fbd6cdc019836426329d592a9ab 100644 --- a/packages/charts-vue/components/grid-layout/src/gridlayoutwrapper.component.tsx +++ b/packages/charts-vue/components/grid-layout/src/gridlayoutwrapper.component.tsx @@ -1,4 +1,3 @@ - /** * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd. * @@ -15,9 +14,8 @@ * limitations under the License. */ -import { defineComponent, SetupContext, ShallowRef, shallowRef, watch } from 'vue'; -import { GridLayout, GridItem } from "vue3-grid-layout"; -import 'vue3-grid-layout/public/app.css'; +import { defineComponent, SetupContext, ShallowRef, shallowRef, watch, ref, onMounted, inject, nextTick, computed, onBeforeUnmount, reactive } from 'vue'; +import { GridLayout, GridItem } from "vue3-grid-layout-ts"; import { gridLayoutProps, GridLayoutProps } from './gridlayout.props'; import LayoutItem from './composition/type'; @@ -33,26 +31,104 @@ export default defineComponent({ 'itemMove', 'itemResize', 'itemMoved', - 'itemResized' + 'itemResized', + 'gridLayoutItemClick', ], - components: { - 'grid-layout': GridLayout, - 'grid-item': GridItem - }, setup(props: GridLayoutProps, context: SetupContext) { + const SNAP_STEP = 5; + const gridLinesContainer = ref(); + const gridLayoutRef = ref | null>(null); const model: ShallowRef = shallowRef([...props.layout]); - + // const itemCache = new Map(); + // const slotsOutCache = new Map(); + const hasChildren = ref(true); const { slots } = context; - watch( - () => props.layout, - (newLayout) => { - if (newLayout !== props.layout) { - model.value = [...newLayout]; - } - }, - { flush: 'post' } - ); + const mouseXY: any = { "x": null, "y": null }; + const dragPos: any = { "x": null, "y": null, "w": 1, "h": 1, "i": null }; + + const styleConfig = reactive({ + "position": "relative", + "border-radius": "3px", + "background": "#ffffff", + "transition": "all 0.3s ease", + "background-image": "radial-gradient(circle at center, rgba(99, 102, 241, 0.3) 1px, transparent 1.5px)", + "background-size": `calc(100%/${props.columnNumber}) calc(${props.rowHeight}px)`, + "background-position": `calc(calc(100%/${props.columnNumber}) / 2) calc(calc(${props.rowHeight}px) / 2)`, + "background-color": "#F8FBFC !important" + }); + const dynamicStyle = computed(() => ({ + "position": styleConfig['position'], + "border-radius": styleConfig['border-radius'], + "background": styleConfig['background'], + "transition": styleConfig['transition'], + "background-image": styleConfig['background-image'], + "background-size": styleConfig['background-size'], + "background-position": styleConfig['background-position'], + "background-color": styleConfig['background-color'], + "background-origin": "context-box", + "background-clip": "border-box", + "border": "2px solid transparent" + })); + + const gridItemRefs = new Map(); + + const setItemRef = (el: any) => { + if (el) { + gridItemRefs.set(el.i, el); + } + } + + function sortBreakpoints(breakpoints: any) { + const keys: Array = Object.keys(breakpoints) + return keys.sort(function (a, b) { + return breakpoints[a] - breakpoints[b] + }) + } + + function getBreakpointFromWidth(breakpoints: any, width: number) { + const sorted = sortBreakpoints(breakpoints) + let matching = sorted[0] + for (let i = 1, len = sorted.length; i < len; i++) { + const breakpointName = sorted[i] + if (width > breakpoints[breakpointName]) { matching = breakpointName; } + } + return matching + } + + function drawGridLines() { + // const container = this.$refs.gridLinesContainer; + gridLinesContainer.value.innerHTML = ""; // 清空已有网格线 + + // 动态创建垂直网格线(列) + for (let col = 0; col <= props.columnNumber; col++) { + const line = document.createElement("div"); + line.className = "grid-line vertical"; + if (col === props.columnNumber) { + line.style.right = `${0}%`; + } else { + line.style.left = `${(col / props.columnNumber) * 100}%`; + } + gridLinesContainer.value.appendChild(line); + } + + let clientHeight = gridLayoutRef?.value?.$refs?.this$refsLayout?.clientHeight; + if (clientHeight <= 0) { + clientHeight = props.rowHeight * 12; + } + // 动态创建水平网格线(行) + for (let row = 0; row <= (clientHeight / props.rowHeight); row++) { + const line = document.createElement("div"); + line.className = "grid-line horizontal"; + line.style.top = `${(props.rowHeight * row)}px`; + gridLinesContainer.value.appendChild(line); + } + } + + function isMobile() { + const ua = navigator.userAgent; + return /Android|iPhone|iPad|iPod|Mobile/i.test(ua); + } function handleLayoutCreated(item: LayoutItem) { const layoutItem = item as LayoutItem; @@ -80,15 +156,15 @@ export default defineComponent({ } function moveEvent(id: any, newX: number, newY: number) { - const item = props.layout.find((item) => item.id === id); + const item = model?.value.find((item) => item.i === id); if (item) { - const updatedItem = { ...item, x: newX, y: newY }; + const updatedItem = { ...item, x: newX, y: newY }; context.emit('itemMove', updatedItem); } } function resizeEvent(id: any, newX: number, newY: number, newColumnWidth: number, newRowHeight: number) { - const item = props.layout.find((item) => item.id === id); + const item = model?.value.find((item) => item.i === id); if (item) { const updatedItem = { ...item, x: newX, y: newY, w: newColumnWidth, h: newRowHeight }; context.emit('itemResize', updatedItem); @@ -96,64 +172,231 @@ export default defineComponent({ } function movedEvent(id: any, newX: number, newY: number) { - const item = props.layout.find((item) => item.id === id); + const item = model?.value.find((item) => item.i === id); if (item) { - const updatedItem = { ...item, x: newX, y: newY }; + const updatedItem = { ...item, x: newX, y: newY }; context.emit('itemMoved', updatedItem); } } function resizedEvent(id: any, newX: number, newY: number, newColumnWidth: number, newRowHeight: number) { - const item = props.layout.find((item) => item.id === id); + const item = model?.value.find((item) => item.i === id); if (item) { const updatedItem = { ...item, x: newX, y: newY, w: newColumnWidth, h: newRowHeight }; context.emit('itemResized', updatedItem); } } - return () => ( - - { - model.value.map(item => ( - - { slots.default && slots.default({item}) } - - )) + function updateLayout(layout: any) { + model.value = [...layout]; + isMobile(); + if (gridLayoutRef) { + const match = getBreakpointFromWidth(props.breakpoints, gridLayoutRef.value.width); + let currentCols = props.cols[match]; + if (currentCols <= 2) { currentCols = 10; } + // "background-size": `calc(100%/${props.columnNumber}) calc(${props.rowHeight}px)`, + // "background-position": `calc(calc(100%/${props.columnNumber}) / 2) calc(calc(${props.rowHeight}px) / 2)`, + styleConfig['background-size'] = `calc(100%/${currentCols}) calc(${props.rowHeight}px)`; + styleConfig['background-position'] = `calc(calc(100%/${currentCols}) / 2) calc(calc(${props.rowHeight}px) / 2)`; + } + } + + function drag(e, itemConfig, targetAreaId?: string) { + e.stopPropagation() + e.preventDefault() + let parentElement = document.getElementById('grid-layout'); + if (targetAreaId) { + // 存在指定区域参数,更改 #grid-layout 获取方法 + const areaElement = document.getElementById(targetAreaId); + if (areaElement) { + parentElement = areaElement.querySelector("#grid-layout"); } - + } + if (!parentElement) { return; } + + const parentRect = parentElement.getBoundingClientRect(); + let mouseInGrid = false; + if (mouseXY.x > parentRect.left && mouseXY.x < parentRect.right && mouseXY.y > parentRect.top && mouseXY.y < parentRect.bottom) { + mouseInGrid = true; + } + if (mouseInGrid === true && (model.value.findIndex(item => item.i === 'drop')) === -1) { + const newItem = { + x: (model.value.length * 2) % (props.columnNumber || 12), + y: model.value.length + (props.columnNumber || 12), // puts it at the bottom + w: (itemConfig && itemConfig["w"]) || 3, + h: (itemConfig && itemConfig["h"]) || 1, + i: 'drop', + }; + model.value = [...props.layout, newItem]; + } + setTimeout(() => { + const index = model.value.findIndex(item => item.i === 'drop'); + if (index !== -1) { + try { + gridLayoutRef.value.$refs.this$refsLayout.children[model.value.length].style.display = 'block'; + } catch (error) { + console.error(error); + } + const el = index >= model.value.length ? gridLayoutRef.value.defaultGridItem : gridItemRefs.get(model.value[index].i); + el.dragging = { "top": mouseXY.y - parentRect.top, "left": mouseXY.x - parentRect.left }; + const new_pos = el.calcXY(mouseXY.y - parentRect.top, mouseXY.x - parentRect.left); + if (mouseInGrid === true) { + gridLayoutRef.value.dragEvent('dragstart', 'drop', new_pos.x, new_pos.y, ((itemConfig && itemConfig["h"]) || 1), ((itemConfig && itemConfig["w"]) || 3)); + dragPos.i = String(index); + dragPos.x = model.value[index].x; + dragPos.y = model.value[index].y; + } + if (mouseInGrid === false) { + gridLayoutRef.value.dragEvent('dragend', 'drop', new_pos.x, new_pos.y, ((itemConfig && itemConfig["h"]) || 1), ((itemConfig && itemConfig["w"]) || 3)); + model.value = [...model.value.filter(obj => obj.i !== 'drop')]; + } + } + }); + } + + function dragend(e, itemConfig, targetAreaId?: string) { + let newItem: any = null; + let parentElement = document.getElementById("grid-layout"); + if (targetAreaId) { + // 存在指定区域参数,更改 #grid-layout 获取方法 + const areaElement = document.getElementById(targetAreaId); + if (areaElement) { + parentElement = areaElement.querySelector("#grid-layout"); + } + } + if (!parentElement) { return; } + + const parentRect = parentElement.getBoundingClientRect(); + let mouseInGrid = false; + if (parentRect) { + if (mouseXY.x > parentRect.left && mouseXY.x < parentRect.right && mouseXY.y > parentRect.top && mouseXY.y < parentRect.bottom) { + mouseInGrid = true; + } + if (mouseInGrid === true) { + gridLayoutRef.value.dragEvent('dragend', 'drop', dragPos.x, dragPos.y, ((itemConfig && itemConfig["h"]) || 1), ((itemConfig && itemConfig["w"]) || 3)); + const index = model.value.findIndex(obj => obj.i === 'drop'); + if (index !== -1) { + newItem = JSON.parse(JSON.stringify(model.value)); + model.value.splice(index, 1); + const placeholderGridItem: any = document.querySelector('.vue-grid-placeholder'); + if (placeholderGridItem) { + placeholderGridItem.style.display = 'none'; + } + } + } + } + return newItem; + } + + watch( + () => props.layout, + (newLayout) => { + model.value = [...newLayout]; + } ); + + onMounted(() => { + // drawGridLines(); + document.addEventListener("dragover", function (e) { + mouseXY.x = e.clientX; + mouseXY.y = e.clientY; + }, false); + // document.addEventListener("resize", drawGridLines); + }); + + onBeforeUnmount(() => { + // document.removeEventListener("resize", drawGridLines); + }); + + function getLayoutData() { + return model.value; + } + + context.expose({ drag, dragend, getLayoutData }); + + function renderSlots(children: any) { + // if (!children?.length || !model?.value?.length || model?.value?.length !== children?.length) { + // hasChildren.value = false; + // return []; + // } + if (!model.value.length) { + return []; + } + const itemArray: any = []; + model?.value?.map((item, index) => { + const gridItem = ( + + {!children || index >= children?.length ?
: children[index]} +
+ ); + + itemArray.push(gridItem); + }); + return itemArray; + } + + return () => { + const children: any = slots.default && slots.default() && slots.default().length === 1 + ? (slots.default()[0]).children && (slots.default()[0]).children?.length + ? (slots.default()[0]).children && (slots.default()[0]).children?.length && ((slots.default()[0]).children || []) + : slots.default && slots.default() && slots.default() + : slots.default && slots.default() && slots.default(); + + return ( + + {...renderSlots(children)} + + ) + } } }); diff --git a/packages/charts-vue/components/grid-layout/src/schema/grid-layout.schema.json b/packages/charts-vue/components/grid-layout/src/schema/grid-layout.schema.json new file mode 100644 index 0000000000000000000000000000000000000000..2e4826d626d465a9765d295e59ec33b900f27ca6 --- /dev/null +++ b/packages/charts-vue/components/grid-layout/src/schema/grid-layout.schema.json @@ -0,0 +1,205 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://farris-design.gitee.io/grid-layout.schema.json", + "title": "grid-layout", + "description": "A Farris Charts GridLayout Component", + "type": "object", + "properties": { + "id": { + "description": "The unique identifier for a GridLayout", + "type": "string" + }, + "type": { + "description": "The type string of GridLayout component", + "type": "string", + "default": "grid-layout" + }, + "appearance": { + "description": "", + "type": "object", + "properties": { + "class": { + "type": "string" + }, + "style": { + "type": "string" + } + }, + "default": {} + }, + "layout": { + "description": "", + "type": "object", + "properties": { + "x": { + "description": "", + "type": "number" + }, + "y": { + "description": "", + "type": "number" + }, + "w": { + "description": "", + "type": "number" + }, + "h": { + "description": "", + "type": "number" + }, + "i": { + "description": "", + "type": "string" + }, + "minW": { + "description": "", + "type": "number" + }, + "maxW": { + "description": "", + "type": "number" + }, + "minH": { + "description": "", + "type": "number" + }, + "maxH": { + "description": "", + "type": "number" + }, + "isDraggable": { + "description": "", + "type": "boolean", + "default": true + }, + "isResizable": { + "description": "", + "type": "boolean", + "default": true + } + } + }, + "cols": { + "description": "", + "type": "object", + "properties": { + "lg": { + "description": "", + "type": "number", + "default": 12 + }, + "md": { + "description": "", + "type": "number", + "default": 10 + }, + "sm": { + "description": "", + "type": "number", + "default": 6 + }, + "xs": { + "description": "", + "type": "number", + "default": 4 + }, + "xss": { + "description": "", + "type": "number", + "default": 2 + } + } + }, + "breakpoints": { + "description": "", + "type": "object", + "properties": { + "lg": { + "description": "", + "type": "number", + "default": 1200 + }, + "md": { + "description": "", + "type": "number", + "default": 996 + }, + "sm": { + "description": "", + "type": "number", + "default": 768 + }, + "xs": { + "description": "", + "type": "number", + "default": 480 + }, + "xss": { + "description": "", + "type": "number", + "default": 0 + } + } + }, + "columnNumber": { + "description": "", + "type": "number", + "default": 12 + }, + "rowHeight": { + "description": "", + "type": "number", + "default": 50 + }, + "guidelinesEnabled": { + "description": "", + "type": "boolean", + "default": true + }, + "isDraggable": { + "description": "", + "type": "boolean", + "default": true + }, + "isResizable": { + "description": "", + "type": "boolean", + "default": true + }, + "margin": { + "description": "", + "type": "array", + "default": [ + 10, + 10 + ] + }, + "autoSize": { + "description": "", + "type": "boolean", + "default": true + }, + "responsive": { + "description": "", + "type": "boolean", + "default": true + }, + "verticalCompact": { + "description": "", + "type": "boolean", + "default": true + }, + "useCssTransforms": { + "description": "", + "type": "boolean", + "default": true + } + }, + "required": [ + "type" + ], + "ignore": [ + "id", + "appearance" + ] +} \ No newline at end of file diff --git a/packages/charts-vue/components/grid-layout/src/schema/schema-mapper.ts b/packages/charts-vue/components/grid-layout/src/schema/schema-mapper.ts new file mode 100644 index 0000000000000000000000000000000000000000..f37bb5f44b4516f4d0ab751a3da893b673924f79 --- /dev/null +++ b/packages/charts-vue/components/grid-layout/src/schema/schema-mapper.ts @@ -0,0 +1,5 @@ +import { MapperFunction, resolveAppearance } from "@farris/ui-vue"; + +export const schemaMapper = new Map([ + ['appearance', resolveAppearance] +]); \ No newline at end of file diff --git a/packages/charts-vue/components/grid-layout/src/schema/schema-resolver.ts b/packages/charts-vue/components/grid-layout/src/schema/schema-resolver.ts new file mode 100644 index 0000000000000000000000000000000000000000..c10c25caa2ad90607eee6f71572066e10a3515be --- /dev/null +++ b/packages/charts-vue/components/grid-layout/src/schema/schema-resolver.ts @@ -0,0 +1,5 @@ +import { DynamicResolver } from "@farris/ui-vue"; + +export function schemaResolver(resolver: DynamicResolver, schema: Record, context: Record): Record { + return schema; +} diff --git a/packages/charts-vue/components/index.ts b/packages/charts-vue/components/index.ts index 824a1ee918bd6d17e54ceebda40151f73e0947aa..32cfbe36073da1b25c6af9bc1f9ec1d703ae9079 100644 --- a/packages/charts-vue/components/index.ts +++ b/packages/charts-vue/components/index.ts @@ -25,7 +25,9 @@ import FChartsGraph from './charts-graph'; import FChartsTreemap from './charts-treemap'; import FChartsProcessGauge from './charts-process-gauge'; import FChartsCombined from './charts-combined'; +import FBaDynamicView from './dynamic-view'; import '../public/assets/farris-all.css'; +import '@farris/mobile-ui-vue/style.css'; // 导出所有组件,可以按需加载 export * from './components'; // 导出设计器部分组件及属性 @@ -40,11 +42,11 @@ export default { .use(FChartsScatter) .use(FChartsCombined) .use(FChartsProcessGauge) - .use(FChartsProcessGauge) .use(FChartsBar) .use(FChartsRadar) .use(FChartsFunnel) .use(FChartsGraph) - .use(FChartsTreemap); + .use(FChartsTreemap) + .use(FBaDynamicView); } }; diff --git a/packages/charts-vue/demos/grid-layout/grid-layout-charts.vue b/packages/charts-vue/demos/grid-layout/grid-layout-charts.vue index fb9e6ddb923e387161e6d014a54dff586220090a..24b5c4b2cbd06ba25549eaad56ef703162fefe1b 100644 --- a/packages/charts-vue/demos/grid-layout/grid-layout-charts.vue +++ b/packages/charts-vue/demos/grid-layout/grid-layout-charts.vue @@ -1,43 +1,39 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/packages/charts-vue/farris.config.mjs b/packages/charts-vue/farris.config.mjs index fccaffaa516fc472f5da9156d018b3895d737e81..02eca7b0b7339dcf004469ea7c910ad5778444ab 100644 --- a/packages/charts-vue/farris.config.mjs +++ b/packages/charts-vue/farris.config.mjs @@ -16,14 +16,17 @@ export default { outDir: fileURLToPath(new URL('./dist', import.meta.url)), externals: { include: [''], + exclude: ['vue3-grid-layout','@emotion/css','@farris/mobile-ui-vue'], filter: (externals) => { return (id) => { - return externals.find((item) => item && id.indexOf(item) === 0); + return externals.find((item) => { + return (item && id.indexOf(item) === 0) || id.indexOf('grid-layout') >= 0; + }); }; } }, externalDependencies: true, - minify: 'terser', + minify: 'false', alias: [ { find: '@', replacement: fileURLToPath(new URL('./', import.meta.url)) }, { find: '@/components', replacement: fileURLToPath(new URL('./components', import.meta.url)) }, diff --git a/packages/charts-vue/package.json b/packages/charts-vue/package.json index e4d4c047f5a39531067d25165cad288b0c6045f6..362c870ee8c3d1e950e75edbeed650d5e86994cd 100644 --- a/packages/charts-vue/package.json +++ b/packages/charts-vue/package.json @@ -24,6 +24,7 @@ "check": "vue-tsc --noEmit", "build": "vue-tsc --noEmit && vite build", "build:lib": "node --max-old-space-size=8192 ./scripts/index.js build", + "build:syslib": "node --max-old-space-size=8192 ./scripts/index.js sys", "preview": "vite preview", "test": "jest --config jest.config.js", "vitest": "vitest", @@ -34,8 +35,9 @@ "build:system": "farris-cli build-lib -ep" }, "dependencies": { - "@docsearch/js": "3.6.0", "@types/lodash-es": "^4.17.4", + "@emotion/css": "^11.13.5", + "@farris/mobile-ui-vue": "0.0.1-beta.3", "@vue/shared": "^3.2.0", "@vueuse/core": "^9.2.0", "async-validator": "^4.2.0", @@ -48,7 +50,8 @@ "rxjs": "^7.4.0", "vite-plugin-dts": "^2.1.0", "vue": "^3.2.37", - "vue3-grid-layout": "^1.0.0" + "vue3-grid-layout-ts": "0.0.4", + "@farris/ui-vue": "workspace:^" }, "devDependencies": { "@babel/parser": "^7.19.0", @@ -72,6 +75,7 @@ "@vue/test-utils": "^2.0.0", "@vuedx/typecheck": "^0.7.5", "@vuedx/typescript-plugin-vue": "^0.7.5", + "vite-plugin-libcss":"1.1.2", "babel-jest": "^29.0.3", "chalk": "^5.0.0", "commander": "^9.4.0", diff --git a/packages/charts-vue/public/assets/style.css b/packages/charts-vue/public/assets/style.css new file mode 100644 index 0000000000000000000000000000000000000000..b8c71bba2578e95dc93ac5db712e66d516665779 --- /dev/null +++ b/packages/charts-vue/public/assets/style.css @@ -0,0 +1 @@ +.vue-grid-item{transition:all .2s ease;transition-property:left,top,right}.vue-grid-item.no-touch{-ms-touch-action:none;touch-action:none}.vue-grid-item.cssTransforms{transition-property:transform;left:0;right:auto}.vue-grid-item.cssTransforms.render-rtl{left:auto;right:0}.vue-grid-item.resizing{opacity:.6;z-index:3}.vue-grid-item.vue-draggable-dragging{transition:none;z-index:3}.vue-grid-item.vue-grid-placeholder{background:red;opacity:.2;transition-duration:.1s;z-index:2;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.vue-grid-item>.vue-resizable-handle{position:absolute;width:20px;height:20px;bottom:0;right:0;background:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pg08IS0tIEdlbmVyYXRvcjogQWRvYmUgRmlyZXdvcmtzIENTNiwgRXhwb3J0IFNWRyBFeHRlbnNpb24gYnkgQWFyb24gQmVhbGwgKGh0dHA6Ly9maXJld29ya3MuYWJlYWxsLmNvbSkgLiBWZXJzaW9uOiAwLjYuMSAgLS0+DTwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DTxzdmcgaWQ9IlVudGl0bGVkLVBhZ2UlMjAxIiB2aWV3Qm94PSIwIDAgNiA2IiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmMDAiIHZlcnNpb249IjEuMSINCXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhtbDpzcGFjZT0icHJlc2VydmUiDQl4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjZweCIgaGVpZ2h0PSI2cHgiDT4NCTxnIG9wYWNpdHk9IjAuMzAyIj4NCQk8cGF0aCBkPSJNIDYgNiBMIDAgNiBMIDAgNC4yIEwgNCA0LjIgTCA0LjIgNC4yIEwgNC4yIDAgTCA2IDAgTCA2IDYgTCA2IDYgWiIgZmlsbD0iIzAwMDAwMCIvPg0JPC9nPg08L3N2Zz4=);background-position:bottom right;padding:0 3px 3px 0;background-repeat:no-repeat;background-origin:content-box;box-sizing:border-box;cursor:se-resize}.vue-grid-item>.vue-rtl-resizable-handle{bottom:0;left:0;background:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAuMDAwMDAwMDAwMDAwMDAyIiBoZWlnaHQ9IjEwLjAwMDAwMDAwMDAwMDAwMiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KIDwhLS0gQ3JlYXRlZCB3aXRoIE1ldGhvZCBEcmF3IC0gaHR0cDovL2dpdGh1Yi5jb20vZHVvcGl4ZWwvTWV0aG9kLURyYXcvIC0tPgogPGc+CiAgPHRpdGxlPmJhY2tncm91bmQ8L3RpdGxlPgogIDxyZWN0IGZpbGw9Im5vbmUiIGlkPSJjYW52YXNfYmFja2dyb3VuZCIgaGVpZ2h0PSIxMiIgd2lkdGg9IjEyIiB5PSItMSIgeD0iLTEiLz4KICA8ZyBkaXNwbGF5PSJub25lIiBvdmVyZmxvdz0idmlzaWJsZSIgeT0iMCIgeD0iMCIgaGVpZ2h0PSIxMDAlIiB3aWR0aD0iMTAwJSIgaWQ9ImNhbnZhc0dyaWQiPgogICA8cmVjdCBmaWxsPSJ1cmwoI2dyaWRwYXR0ZXJuKSIgc3Ryb2tlLXdpZHRoPSIwIiB5PSIwIiB4PSIwIiBoZWlnaHQ9IjEwMCUiIHdpZHRoPSIxMDAlIi8+CiAgPC9nPgogPC9nPgogPGc+CiAgPHRpdGxlPkxheWVyIDE8L3RpdGxlPgogIDxsaW5lIGNhbnZhcz0iI2ZmZmZmZiIgY2FudmFzLW9wYWNpdHk9IjEiIHN0cm9rZS1saW5lY2FwPSJ1bmRlZmluZWQiIHN0cm9rZS1saW5lam9pbj0idW5kZWZpbmVkIiBpZD0ic3ZnXzEiIHkyPSItNzAuMTc4NDA3IiB4Mj0iMTI0LjQ2NDE3NSIgeTE9Ii0zOC4zOTI3MzciIHgxPSIxNDQuODIxMjg5IiBzdHJva2Utd2lkdGg9IjEuNSIgc3Ryb2tlPSIjMDAwIiBmaWxsPSJub25lIi8+CiAgPGxpbmUgc3Ryb2tlPSIjNjY2NjY2IiBzdHJva2UtbGluZWNhcD0idW5kZWZpbmVkIiBzdHJva2UtbGluZWpvaW49InVuZGVmaW5lZCIgaWQ9InN2Z181IiB5Mj0iOS4xMDY5NTciIHgyPSIwLjk0NzI0NyIgeTE9Ii0wLjAxODEyOCIgeDE9IjAuOTQ3MjQ3IiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiLz4KICA8bGluZSBzdHJva2UtbGluZWNhcD0idW5kZWZpbmVkIiBzdHJva2UtbGluZWpvaW49InVuZGVmaW5lZCIgaWQ9InN2Z183IiB5Mj0iOSIgeDI9IjEwLjA3MzUyOSIgeTE9IjkiIHgxPSItMC42NTU2NCIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2U9IiM2NjY2NjYiIGZpbGw9Im5vbmUiLz4KIDwvZz4KPC9zdmc+);background-position:bottom left;padding-left:3px;background-repeat:no-repeat;background-origin:content-box;cursor:sw-resize;right:auto}.vue-grid-item.disable-userselect{user-select:none}.vue-grid-layout{position:relative;transition:height .2s ease} diff --git a/packages/charts-vue/scripts/commands/build-system.js b/packages/charts-vue/scripts/commands/build-system.js new file mode 100644 index 0000000000000000000000000000000000000000..0d906b5ea3dbc938a70c0e0bc7bd26816d2b56f4 --- /dev/null +++ b/packages/charts-vue/scripts/commands/build-system.js @@ -0,0 +1,243 @@ +import fs from 'fs'; +import path from 'path'; +import fsExtra from 'fs-extra'; +import { fileURLToPath } from 'url'; +import { omit } from 'lodash-es'; +import { defineConfig, build } from 'vite'; +import vue from '@vitejs/plugin-vue'; +import vueJsx from '@vitejs/plugin-vue-jsx'; +import dts from 'vite-plugin-dts'; +import ts from 'typescript'; +import { replace } from './replace-path.js'; +import { replaceDesignerPath } from './replace-designer-path.js'; + +const currentFileName = fileURLToPath(import.meta.url); +const currentDirectoryName = path.dirname(currentFileName); +const rootPath = path.resolve(currentDirectoryName, '../../'); + +const packageJsonPath = path.resolve(rootPath, 'package.json'); +const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf8'); +const packageObject = JSON.parse(packageJsonContent); + +const getVersion = () => { + const versionNums = packageObject.version.split('.'); + return versionNums.map((num, index) => (index === versionNums.length - 1 ? +num + 1 : num)).join('.'); +}; +const packageVersion = packageObject.version; + +const createPackageJson = async () => { + packageObject.version = packageVersion; + packageObject.main = './farris.charts.all.umd.js'; + packageObject.module = './farris.charts.all.esm.js'; + packageObject.style = './index.css'; + packageObject.dependencies = omit(packageObject.dependencies, 'vue'); + packageObject.types = './types/index.d.ts'; + const fileStr = JSON.stringify(omit(packageObject, 'scripts', 'devDependencies'), null, 2); + await fsExtra.outputFile(path.resolve('./package-system', `package.json`), fileStr, 'utf-8'); +}; + +// 确保输出目录存在 +function ensureDirExists(dirPath) { + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath, { recursive: true }); + } +} + +function replaceAll(source, find, replace) { + return source.replace(new RegExp(find, 'g'), replace); +} + +// 编译单个文件 +function compileTsFile(componentName) { + // 指定编译器选项 + const options = { + allowJs: true, // 允许编译JS文件 + outDir: 'dist', // 输出目录 + format: 'esm', + ext: 'js', + module: ts.ModuleKind.ESNext // 模块代码生成 + }; + const filePath = `./components/${componentName}/style.ts`; + let fileContent = fs.readFileSync(filePath).toString(); + const replaceArray = [ + { find: '/style"', replace: '/style.js"' }, + { find: '@farris/charts-vue/components/', replace: '../' }, + { find: '@farris/charts-vue/theme-default/', replace: '../../theme-default/' } + ]; + replaceArray.forEach((item) => { + fileContent = replaceAll(fileContent, item.find, item.replace); + }); + // 使用编译器API编译文件 + const result = ts.transpileModule(fileContent, { + compilerOptions: options, + transformers: undefined, + reportDiagnostics: true, + fileName: filePath + }); + + // 获取编译后的代码 + const jsCode = result.outputText; + + // 获取输出文件路径 + const outPath = `./package-system/components/${componentName}/style.js`; + ensureDirExists(`./package-system/components/${componentName}`); + // 将编译后的代码写入到输出文件 + fs.writeFileSync(outPath, jsCode); +} + +const externals = ['vue', '@vueuse/core', '@vue/shared', 'bignumber.js', + 'lodash', 'lodash-es', 'echarts', '@farris/charts-vue/components']; + +async function buildSeperately(componentName) { + const tsEntry = `./components/${componentName}/index.ts`; + if (fs.existsSync(tsEntry)) { + const componentBuildOptions = await build( + defineConfig({ + configFile: false, + publicDir: false, + plugins: [vue(), vueJsx(), + // 应该先替换设计器组件路径,注意插件的顺序 + // replaceDesignerPath((format, args) => `../../designer${args[2]}/index.${format}.js`), + replace((format, args) => `..${args[2]}/index.${format}.js`) + ], + build: { + lib: { + entry: tsEntry, + // name: componentName, + fileName: 'index', + formats: ['systemjs'] + }, + systemjs: true, + outDir: `./package-system/components/${componentName}`, + rollupOptions: { + logLevel: 'silent', + external: + (id) => { + return externals.find((item) => id.indexOf(item) === 0); + }, + output: { + globals: { + vue: 'Vue', + '@vueuse/core': 'VueUseCore', + '@vue/shared': 'VueShared', + 'bignumber.js': 'BigNumber', + 'lodash-es': 'LodashES' + }, + assetFileNames: ({ name, names, type }) => { + if (type === 'asset' && /\.(css)$/i.test(name)) { + return 'index.[ext]'; + } + if (type === 'asset' && /\.(css)$/i.test(names)) { + return 'index.[ext]'; + } + return '[name].[ext]'; + } + } + } + }, + resolve: { + alias: { + '@farris/charts-vue/components': path.resolve(rootPath, './components') + } + } + }) + ); + + const packageContent = `{ + "name": "${componentName}", + "version": "${packageVersion}", + "main": "index.umd.js", + "module": "index.esm.js", + "style": "index.css", + "types": "../types/${componentName}/index.d.ts" + }`; + fsExtra.outputFile(`./package-system/components/${componentName}/package.json`, packageContent, 'utf-8'); + } + + const cssEntry = `./components/${componentName}/style.ts`; + if (fs.existsSync(cssEntry)) { + const compilerHost = ts.createCompilerHost({}); + // 编译指定的ts文件 + compileTsFile(componentName); + } +} + +const buildSysLibs = async () => { + await build( + defineConfig({ + configFile: false, + publicDir: false, + plugins: [ + vue(), + vueJsx(), + dts({ + entryRoot: './components', + outputDir: `./package-system/types`, + noEmitOnError: false, + skipDiagnostics: false + }), + // 应该先替换设计器组件路径,注意插件的顺序 + // replaceDesignerPath((format, args) => `./designer${args[2]}/index.${format}.js`), + replace((format, args) => `./components${args[2]}/index.${format}.js`) + ], + build: { + lib: { + entry: './components/index.ts', + name: 'FarrisVueCharts', + fileName: 'farris.charts.all', + formats: ['systemjs', 'esm', 'umd'] + }, + outDir: './package-system', + rollupOptions: { + logLevel: 'silent', + // external: ['vue', '@vueuse/core', '@vue/shared', 'bignumber.js', 'lodash', 'lodash-es', 'echarts'], + external: (id) => { + return externals.find((item) => id.indexOf(item) === 0 && item !== '@farris/charts-vue/components'); + }, + output: { + exports: "named", + globals: { + globals: { + vue: 'Vue', + '@vueuse/core': 'VueUseCore', + '@vue/shared': 'VueShared', + 'bignumber.js': 'BigNumber', + 'lodash-es': 'LodashES' + } + }, + assetFileNames: ({ names, type, name }) => { + if (type === 'asset' && /\.(css)$/i.test(name)) { + return 'index.[ext]'; + } + if (type === 'asset' && /\.(css)$/i.test(names)) { + return 'index.[ext]'; + } + return '[name].[ext]'; + } + } + } + }, + resolve: { + alias: { + '@farris/charts-vue/components': path.resolve(rootPath, './components') + } + } + }) + ); + + await createPackageJson(); + const components = fs.readdirSync('./components').filter((name) => { + const componentDir = path.resolve('./components', name); + const isDir = fs.lstatSync(componentDir).isDirectory(); + // const ignore = isDir && fs.readdirSync(componentDir).includes('.buildignore'); + const ignore = false; + return isDir && !ignore && (fs.readdirSync(componentDir).includes('index.ts') || + fs.readdirSync(componentDir).includes('style.ts')); + }); + + components.forEach((componentName) => { + buildSeperately(componentName); + }); +}; + +export { buildSysLibs }; diff --git a/packages/charts-vue/scripts/commands/build.js b/packages/charts-vue/scripts/commands/build.js index 5d6be187645a2e2978183a4807ddd3ea541dcfdc..c9a5e1a3354062f8dd39366ee6395e6a57c95a54 100644 --- a/packages/charts-vue/scripts/commands/build.js +++ b/packages/charts-vue/scripts/commands/build.js @@ -27,8 +27,8 @@ const packageVersion = packageObject.version; const createPackageJson = async () => { packageObject.version = packageVersion; - packageObject.main = './farris.charts.umd.js'; - packageObject.module = './farris.charts.esm.js'; + packageObject.main = './farris.charts.all.umd.js'; + packageObject.module = './farris.charts.all.esm.js'; packageObject.style = './index.css'; packageObject.dependencies = omit(packageObject.dependencies, 'vue'); packageObject.types = './types/index.d.ts'; diff --git a/packages/charts-vue/scripts/index.js b/packages/charts-vue/scripts/index.js index a4ea64be33d51b694e3e84cc7d153a8087766fa2..31b04b4ffc5b2bf83f610e28195afeb0effc1423 100644 --- a/packages/charts-vue/scripts/index.js +++ b/packages/charts-vue/scripts/index.js @@ -1,6 +1,7 @@ #!/usr/bin/env node import { Command, Option } from 'commander'; import { buildLibs } from './commands/build.js'; +import { buildSysLibs } from './commands/build-system.js'; import { buildDesignerLibs } from './commands/build-designer.js'; const program = new Command(); @@ -10,4 +11,9 @@ program.command('build').description('构建 Farris UI Vue 组件库').action(fu buildLibs() .then(() => { }); }); + +program.command('sys').description('构建 Farris UI Vue 组件库').action(function () { + buildSysLibs() + .then(() => { }); +}); program.parse(); diff --git a/packages/charts-vue/src/app.vue b/packages/charts-vue/src/app.vue index 06f26b1b8835f6c377cc0fbf0ab7891ad66b9ae0..277e80285efe4199b5f0de52c9bbbd430d78f4ba 100644 --- a/packages/charts-vue/src/app.vue +++ b/packages/charts-vue/src/app.vue @@ -3,7 +3,7 @@ // Check out https://vuejs.org/api/sfc-script-setup.html#script-setup import { computed, ref, onMounted } from 'vue'; -import GridLayoutWrapper from '../demos/grid-layout/grid-layout.vue'; +import GridLayoutWrapper from '../demos/grid-layout/grid-layout-charts.vue'; import ChartsLine from '../demos/charts-line/charts-line.vue'; const routes: Record = { diff --git a/packages/charts-vue/src/assets/style.css b/packages/charts-vue/src/assets/style.css new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/charts-vue/src/main.ts b/packages/charts-vue/src/main.ts index da2921a92b032a4d6277c61695a060d8b12876eb..3db2a8d38fd26fac5fc2264f96795a6d80b625f7 100644 --- a/packages/charts-vue/src/main.ts +++ b/packages/charts-vue/src/main.ts @@ -1,5 +1,5 @@ import { createApp } from 'vue'; -import './style.css'; +// import './style.css'; import App from './app.vue'; import Farris from '../components'; import Plugins from './app-plugin'; diff --git a/packages/designer/src/app.vue b/packages/designer/src/App.vue similarity index 100% rename from packages/designer/src/app.vue rename to packages/designer/src/App.vue diff --git a/packages/devkit/lib/change-handler/abstract-change-handler.ts b/packages/devkit/lib/change-handler/abstract-change-handler.ts index f0cf88a46089aeb64f2c8e39a1b700a6e5ad4ef2..73407067c21f5055034ef585686adba5a6c47f69 100644 --- a/packages/devkit/lib/change-handler/abstract-change-handler.ts +++ b/packages/devkit/lib/change-handler/abstract-change-handler.ts @@ -39,8 +39,14 @@ export abstract class AbstractChangeHandler implements ChangeHandler { return this.isReadonlyExpression(expressionObject) || this.isVisibleExpression(expressionObject) || this.isValidateExpression(expressionObject) || this.isRequiredExpression(expressionObject) || this.isDependencyExpression(expressionObject) || this.isButtonDisabledExpression(expressionObject) || this.isButtonVisibleExpression(expressionObject) || this.isContainerVisibleExpression(expressionObject); } - protected resolvePath(path: string | string[]) { - return this.viewModel.entityStore.getEntitySchema().resolvePath(path); + protected resolvePath(path: string | string[], expressionObject: any) { + let result: any; + if (this.viewModel.getModule().getDevkitType() === "BA") { + result = this.viewModel.entityStore[expressionObject.dataSource + "-entitystore"].getEntitySchema().resolvePath(path); + } else { + result = this.viewModel.entityStore.getEntitySchema().resolvePath(path); + } + return result; } private isReadonlyExpression(expressionObject: ExpressionObject): boolean { return expressionObject && expressionObject.type === ExpressionType.Readonly || false; diff --git a/packages/devkit/lib/change-handler/entity-store-append-entity-change-handler.ts b/packages/devkit/lib/change-handler/entity-store-append-entity-change-handler.ts index 600ca0efb10d71a96479375cfdb0bef32fc3d668..5566609f1ad43e1f2b3eaa34935fcdf4a4c8eb42 100644 --- a/packages/devkit/lib/change-handler/entity-store-append-entity-change-handler.ts +++ b/packages/devkit/lib/change-handler/entity-store-append-entity-change-handler.ts @@ -86,13 +86,13 @@ export class EntityStoreAppendEntityChangeHandler extends AbstractChangeHandler if (!entityDependencies || entityDependencies.length < 1) { return false; } - const { entityPaths: changePaths } = this.resolveChangePath(change); + const { entityPaths: changePaths } = this.resolveChangePath(change, expressionObject); // 表达式依赖了字段,需要确认依赖的字段所在的表是否是事件表 // 2、获取依赖字段的表路径 const index = entityDependencies.findIndex((dependency: string) => { // 去掉ENTITY~前缀 const dependencyPath = dependency.split(DEPENDENCY_SPLITER).slice(1).join(DEPENDENCY_SPLITER); - const { entityPaths: dependencyPaths } = this.resolvePath(dependencyPath); + const { entityPaths: dependencyPaths } = this.resolvePath(dependencyPath, expressionObject); // 获取依赖字段所在的表路径 return dependencyPaths.join(DEPENDENCY_SPLITER) === changePaths.join(DEPENDENCY_SPLITER); }); @@ -102,9 +102,9 @@ export class EntityStoreAppendEntityChangeHandler extends AbstractChangeHandler if (!expressionObject.deps || expressionObject.deps.length < 1) { return false; } - const { entityPaths: changePaths } = this.resolveChangePath(change); + const { entityPaths: changePaths } = this.resolveChangePath(change, expressionObject); const expressionPath = expressionObject.path; - const { entityPaths: expressionPaths } = this.resolvePath(expressionPath); + const { entityPaths: expressionPaths } = this.resolvePath(expressionPath, expressionObject); // 主表新增 if (changePaths.length === 0 && expressionObject.bindingType === ExpressionBindingType.Field) { // 认为主表新增时不需要处理聚合函数 @@ -127,7 +127,7 @@ export class EntityStoreAppendEntityChangeHandler extends AbstractChangeHandler return false; } const deps = dependency.split(DEPENDENCY_SPLITER).filter((p) => p).slice(1); - const { entityPaths: resolvedDependencyPath } = this.resolvePath(deps); + const { entityPaths: resolvedDependencyPath } = this.resolvePath(deps, expressionObject); if (resolvedDependencyPath && resolvedDependencyPath.join(DEPENDENCY_SPLITER) === changePaths.join(DEPENDENCY_SPLITER)) { return true; } @@ -136,8 +136,8 @@ export class EntityStoreAppendEntityChangeHandler extends AbstractChangeHandler return index === -1 ? false : true; } private filterChangeSourceExpressions(change: Change, expressionObject: ExpressionObject) { - const { entityPaths: expressionPaths } = this.resolvePath(expressionObject.path); - const { entityPaths: changePaths } = this.resolveChangePath(change); + const { entityPaths: expressionPaths } = this.resolvePath(expressionObject.path, expressionObject); + const { entityPaths: changePaths } = this.resolveChangePath(change, expressionObject); // 过滤掉非当前表的表达式 if (!isEqual(expressionPaths, changePaths)) { return false; @@ -171,16 +171,20 @@ export class EntityStoreAppendEntityChangeHandler extends AbstractChangeHandler // 去掉ENTITY~前缀 const dependencyPath = dependency.split('/').slice(1).join('/'); // 获取路径中的实体信息 - const { entityPaths: resolvedDependencyPath } = this.resolvePath(dependencyPath); - const { entityPaths: changePaths } = this.resolveChangePath(change); + const { entityPaths: resolvedDependencyPath } = this.resolvePath(dependencyPath, expressionObject); + const { entityPaths: changePaths } = this.resolveChangePath(change, expressionObject); return changePaths.join('/') === resolvedDependencyPath.join('/'); }); return index !== -1; } - private resolveChangePath(change: Change) { + private resolveChangePath(change: Change, expressionObject: ExpressionObject) { const appendEntityChange = change.detail as AppendEntityChange; const changePath = appendEntityChange.path.toShortPath(); - return this.viewModel.entityStore.getEntitySchema().resolvePath(changePath); + if (this.viewModel.getModule().getDevkitType() === "BA") { + return this.viewModel.entityStore[expressionObject.dataSource + "-entitystore"].getEntitySchema().resolvePath(changePath); + } else { + return this.viewModel.entityStore.getEntitySchema().resolvePath(changePath); + } } } diff --git a/packages/devkit/lib/change-handler/entity-store-current-change-handler.ts b/packages/devkit/lib/change-handler/entity-store-current-change-handler.ts index b2f3c265599d6b35d631ffac7d91214ac3327c07..e771ed8a5ecd8e810b6f77bb53437fe18abec3df 100644 --- a/packages/devkit/lib/change-handler/entity-store-current-change-handler.ts +++ b/packages/devkit/lib/change-handler/entity-store-current-change-handler.ts @@ -82,8 +82,8 @@ export class EntityStoreCurrentChangeHandler extends AbstractChangeHandler { if (this.isFieldExpression(expressionObject) && (expressionObject.type === ExpressionType.Compute || expressionObject.type === ExpressionType.Dependency || expressionObject.type === ExpressionType.Validate)) { return false; } - const { entityPaths: changePaths } = this.resolveChangePath(change); - const { entityPaths: expressionPaths } = this.resolvePath(expressionObject.path); + const { entityPaths: changePaths } = this.resolveChangePath(change, expressionObject); + const { entityPaths: expressionPaths } = this.resolvePath(expressionObject.path, expressionObject); // 只关注从表行切换 if (changePaths.length !== 1) { return false; @@ -102,10 +102,10 @@ export class EntityStoreCurrentChangeHandler extends AbstractChangeHandler { }); } private filterElementExpressions(change: Change, expressionObject: ExpressionObject) { - const { entityPaths: changePaths } = this.resolveChangePath(change); + const { entityPaths: changePaths } = this.resolveChangePath(change, expressionObject); const index = expressionObject.deps?.findIndex((dependency: string) => { const dependencyPaths = dependency.split('/').slice(1); - const resolvedDependencyPaths = this.resolvePath(dependencyPaths); + const resolvedDependencyPaths = this.resolvePath(dependencyPaths, expressionObject); if(!resolvedDependencyPaths){ return false; } @@ -114,9 +114,9 @@ export class EntityStoreCurrentChangeHandler extends AbstractChangeHandler { }); return index !== -1; } - private resolveChangePath(change: Change) { + private resolveChangePath(change: Change, expressionObject: any) { const appendEntityChange = change.detail as ChangeCurrentEntityChange; const changePath = appendEntityChange.path.toShortPath(); - return this.resolvePath(changePath); + return this.resolvePath(changePath, expressionObject); } } diff --git a/packages/devkit/lib/change-handler/entity-store-load-entity-change-handler.ts b/packages/devkit/lib/change-handler/entity-store-load-entity-change-handler.ts index 47fc4db47dfbdb5a78f602c6c5b166e87dd2681e..d70ccccfd04bc00c29eaff59bda763defe3605cb 100644 --- a/packages/devkit/lib/change-handler/entity-store-load-entity-change-handler.ts +++ b/packages/devkit/lib/change-handler/entity-store-load-entity-change-handler.ts @@ -30,7 +30,7 @@ export class EntityStoreLoadEntityChangeHandler extends AbstractChangeHandler { } matches.forEach((expressionObject: ExpressionObject) => { const expressionContextBuilder = new ExpressionContextBuilder(); - const expressionContext = expressionContextBuilder.buildContext(this.viewModel); + const expressionContext = expressionObject.type === ExpressionType.DataTransformation ? expressionContextBuilder.buildDataTransformationContext(this.viewModel) : expressionContextBuilder.buildContext(this.viewModel); const result = this.expressionExecutor.compile(expressionObject, expressionContext); if (result === undefined && !this.isValidateOrRequiredExpression(expressionObject)) { return; @@ -61,17 +61,17 @@ export class EntityStoreLoadEntityChangeHandler extends AbstractChangeHandler { } return expressionObjects.filter((expressionObject: ExpressionObject) => { // 重新加载实体时不计算计算、校验表达式,只处理只读、必填、可见表达式 - if (expressionObject.ns !== change.ns || (expressionObject.type !== ExpressionType.Readonly && expressionObject.type !== ExpressionType.Visible && expressionObject.type !== ExpressionType.Required && expressionObject.type !== ExpressionType.Disabled)) { + if (expressionObject.ns !== change.ns || (expressionObject.type !== ExpressionType.DataTransformation && expressionObject.type !== ExpressionType.Readonly && expressionObject.type !== ExpressionType.Visible && expressionObject.type !== ExpressionType.Required && expressionObject.type !== ExpressionType.Disabled)) { return false; } // 计算事件表路径 - const { entityPaths: changePaths } = this.resolveChangePath(change); + const { entityPaths: changePaths } = this.resolveChangePath(change, expressionObject); // const changePath = changePaths.join(DEPENDENCY_SPLITER); if (this.isElementExpression(expressionObject)) { // 是否是匹配变更的元素表达式 return this.filterElementExpression(change, expressionObject); } - const { entityPaths: expressionPaths } = this.resolvePath(expressionObject.path); + const { entityPaths: expressionPaths } = this.resolvePath(expressionObject.path, expressionObject); // 影响一个表达式是否要计算的因子有两个:表达式作用的字段、表达式的依赖 // 以下判断的前提时数据加载场景!! // 1、表达式作用的字段 @@ -99,14 +99,14 @@ export class EntityStoreLoadEntityChangeHandler extends AbstractChangeHandler { // 去掉ENTITY~前缀 const dependencyPath = dep.split('/').slice(1); // 获取依赖字段所在的表路径 - const { entityPaths: dependencyPaths } = this.resolvePath(dependencyPath); + const { entityPaths: dependencyPaths } = this.resolvePath(dependencyPath, expressionObject); return isEqual(dependencyPaths, changePaths); }); return index !== -1; }); } private filterElementExpression(change: Change, expressionObject: ExpressionObject) { - const { entityPaths: changePaths } = this.resolveChangePath(change); + const { entityPaths: changePaths } = this.resolveChangePath(change, expressionObject); const changePath = changePaths.join(DEPENDENCY_SPLITER); // 没有依赖的表达式 if (!expressionObject.deps || expressionObject.deps.length === 0) { @@ -122,14 +122,14 @@ export class EntityStoreLoadEntityChangeHandler extends AbstractChangeHandler { // 去掉ENTITY~前缀 const depPath = dep.split('/').slice(1).join('/'); // 获取依赖字段所在的表路径 - const { entityPaths: dependencyPaths } = this.resolvePath(depPath); + const { entityPaths: dependencyPaths } = this.resolvePath(depPath, expressionObject); return dependencyPaths.join(DEPENDENCY_SPLITER) === changePath; }); return index !== -1; } - private resolveChangePath(change: Change) { + private resolveChangePath(change: Change, expressionObject: ExpressionObject) { const appendEntityChange = change.detail as LoadEntityChange; const changePath = appendEntityChange.path.toShortPath(); - return this.resolvePath(changePath); + return this.resolvePath(changePath, expressionObject); } } diff --git a/packages/devkit/lib/change-handler/entity-store-remove-entity-change-handler.ts b/packages/devkit/lib/change-handler/entity-store-remove-entity-change-handler.ts index eb1e53786c3dadc2c9f4641f865e9c5496ce7b1c..d9aedd03aa59a7a596898ddabff815d713c5da5a 100644 --- a/packages/devkit/lib/change-handler/entity-store-remove-entity-change-handler.ts +++ b/packages/devkit/lib/change-handler/entity-store-remove-entity-change-handler.ts @@ -63,7 +63,7 @@ export class EntityStoreRemoveEntityChangeHandler extends AbstractChangeHandler return false; } // event.path like [id:xxxx] or [id:xxxx,子表s] - const { entityPaths: changePaths } = this.resolveChangePath(change); + const { entityPaths: changePaths } = this.resolveChangePath(change, expressionObject); // 主表删除 if (changePaths.length === 0 && (this.isFieldExpression(expressionObject) || this.isElementExpression(expressionObject))) { return false; @@ -72,21 +72,21 @@ export class EntityStoreRemoveEntityChangeHandler extends AbstractChangeHandler if (this.isElementExpression(expressionObject)) { return this.filterElementExpression(change, expressionObject); } - const { entityPaths: expressionPaths } = this.resolvePath(expressionObject.path); + const { entityPaths: expressionPaths } = this.resolvePath(expressionObject.path, expressionObject); // 被删除数据本身的表达式不需要计算 if (isEqual(changePaths, expressionPaths)) { return false; } const index = expressionObject.deps.findIndex((dependency: string) => { const dependencyPaths = dependency.split(DEPENDENCY_SPLITER).filter((p) => p).slice(1); - const { entityPaths: dependencyEntityPaths } = this.resolvePath(dependencyPaths); + const { entityPaths: dependencyEntityPaths } = this.resolvePath(dependencyPaths, expressionObject); return isEqual(dependencyEntityPaths, changePaths); }); return index === -1 ? false : true; }); } private filterElementExpression(change: Change, expressionObject: ExpressionObject) { - const { entityPaths: changePaths } = this.resolveChangePath(change); + const { entityPaths: changePaths } = this.resolveChangePath(change, expressionObject); const index = expressionObject.deps?.findIndex((dependency: string) => { // 依赖 TODO:依赖不可能以实体路径开始,必须是ENTITY~或STATE~ const fullChangePaths = Array.from(changePaths); @@ -99,9 +99,9 @@ export class EntityStoreRemoveEntityChangeHandler extends AbstractChangeHandler }); return index === -1 ? false : true; } - private resolveChangePath(change: Change) { + private resolveChangePath(change: Change, expressionObject: any) { const appendEntityChange = change.detail as RemoveEntityChange; const changePath = appendEntityChange.path.toShortPath(); - return this.resolvePath(changePath); + return this.resolvePath(changePath, expressionObject); } } diff --git a/packages/devkit/lib/change-handler/entity-store-value-change-handler.ts b/packages/devkit/lib/change-handler/entity-store-value-change-handler.ts index 4bf1a682cb6b80c8c2d07a643417e90ecaa2efa6..8fcd90a22534f7fa6c7c193a72b7e11c2462db83 100644 --- a/packages/devkit/lib/change-handler/entity-store-value-change-handler.ts +++ b/packages/devkit/lib/change-handler/entity-store-value-change-handler.ts @@ -23,7 +23,9 @@ export class EntityStoreValueChangeHandler extends AbstractChangeHandler { if (!expressionObjects || expressionObjects.length < 1) { return; } - const matches = this.filter(change, expressionObjects); + + const isBA = this.viewModel.getModule().getDevkitType() === "BA"; + const matches = isBA ? expressionObjects : this.filter(change, expressionObjects); if (!matches || matches.length < 1) { return; } @@ -49,8 +51,8 @@ export class EntityStoreValueChangeHandler extends AbstractChangeHandler { return; } const option: EffectOption = { message: expressionObject.message, messageType: expressionObject.messageType }; - const { entityPaths: changePaths } = this.resolveChangePath(change); - const { entityPaths: expressionPaths, propertyPaths: expressionPropertyPaths } = this.resolvePath(expressionObject.path); + const { entityPaths: changePaths } = this.resolveChangePath(change, expressionObject); + const { entityPaths: expressionPaths, propertyPaths: expressionPropertyPaths } = this.resolvePath(expressionObject.path, expressionObject); const valueChange = change.detail as ChangeValueChange; // 根据表达式绑定的字段、变更的路径进行处理 if (isEqual(changePaths, expressionPaths) || changePaths.length === expressionPaths.length + 1) { @@ -133,10 +135,10 @@ export class EntityStoreValueChangeHandler extends AbstractChangeHandler { } return expressionObjects.filter((expressionObject: ExpressionObject) => { const { deps } = expressionObject; - if (!deps || deps.length < 1 || change.ns !== expressionObject.ns) { + if ((!deps || deps.length < 1 || change.ns !== expressionObject.ns)) { return false; } - const { entityPaths, propertyPaths } = this.resolveChangePath(change); + const { entityPaths, propertyPaths } = this.resolveChangePath(change, expressionObject); // const { entityPaths: expressionEntityPaths, propertyPaths: expressionPropertyPaths } = this.resolvePath(expressionObject.path); const changePaths = entityPaths.concat(propertyPaths); // if (isEqual(changePaths, expressionEntityPaths.concat(expressionPropertyPaths))) { @@ -146,9 +148,9 @@ export class EntityStoreValueChangeHandler extends AbstractChangeHandler { return deps.includes(changePaths.join('/')); }); } - private resolveChangePath(change: Change) { + private resolveChangePath(change: Change, expressionObject: any) { const appendEntityChange = change.detail as RemoveEntityChange; const changePath = appendEntityChange.path.toShortPath(); - return this.resolvePath(changePath); + return this.resolvePath(changePath, expressionObject); } } diff --git a/packages/devkit/lib/change-handler/state-store-value-change-handler.ts b/packages/devkit/lib/change-handler/state-store-value-change-handler.ts index 992db0de126cae35378c1c420441d064adbb2001..d94d43dc1f60b41fc136b5ab976e5971584229c0 100644 --- a/packages/devkit/lib/change-handler/state-store-value-change-handler.ts +++ b/packages/devkit/lib/change-handler/state-store-value-change-handler.ts @@ -54,7 +54,7 @@ export class StateStoreValueChangeHandler extends AbstractChangeHandler { return; } // 目前仅支持实体表达式,没有变量表达式 - const { entityPaths: expressionPaths, propertyPaths: expressionPropertyPaths } = this.resolvePath(expressionObject.path); + const { entityPaths: expressionPaths, propertyPaths: expressionPropertyPaths } = this.resolvePath(expressionObject.path, expressionObject); const entities = this.viewModel.entityStore.getEntities(); const paths = this.buildPaths(this.viewModel.entityStore, entities); // 仅计算、校验、必填表达式 diff --git a/packages/devkit/lib/change-observer/entity-state-change-observer.ts b/packages/devkit/lib/change-observer/entity-state-change-observer.ts index 08352a9db93fb1b09755f276b685cb086de789a7..f0e11167db96cae408e328b52f12ba4d6c477271 100644 --- a/packages/devkit/lib/change-observer/entity-state-change-observer.ts +++ b/packages/devkit/lib/change-observer/entity-state-change-observer.ts @@ -16,16 +16,30 @@ export class EntityStateChangeObserver extends ChangeObserver { if (!entityStore) { return; } - entityStore.watchChange((change: StateChange>) => { - const entityChange = change as EntityChange; - const entityStateChange: Change> = { - // TODO: namespace应与组合表单ns一致 - ns: '', - source: ChangeSource.EntityState, - detail: change, - type: entityChange.type - }; - callback(entityStateChange); - }); + // BAP: BA统一查询平台有多个Entity、Repository、EntityStore,这里的EntityStore是对象key是id,value是EntityStore实例 + if (this.viewModel.getModule().getDevkitType() === "BA") { + for (let key in entityStore) { + if (entityStore[key] && typeof entityStore[key].watchChange === 'function') { + entityStore[key].watchChange((change: StateChange>) => { + callback(this.createEntityStateChange(change)); + }); + } + } + } else { + entityStore.watchChange((change: StateChange>) => { + callback(this.createEntityStateChange(change)); + }); + } + } + + private createEntityStateChange(change: StateChange>): Change> { + const entityChange = change as EntityChange; + return { + // TODO: namespace应与组合表单ns一致 + ns: '', + source: ChangeSource.EntityState, + detail: change, + type: entityChange.type + }; } } diff --git a/packages/devkit/lib/common/tokens.ts b/packages/devkit/lib/common/tokens.ts index c07a00f32daa0d5f8e7513e0a138602860e9ad81..73ce216949ef89e8e5fe5b6cb06033129cebe397 100644 --- a/packages/devkit/lib/common/tokens.ts +++ b/packages/devkit/lib/common/tokens.ts @@ -2,8 +2,18 @@ import { InjectionToken } from "./di/injection-token"; import { ExceptionHandler, RenderEngine, FormValidator, Translate, RuntimeFrameworkContext } from "./types"; export const EXCEPTION_HANDLER_TOKEN = new InjectionToken('@farris/exception_handler_token'); +/** + * BAP: BA统一查询平台BaException的Token + */ +export const BA_EXCEPTION_HANDLER_TOKEN = new InjectionToken('@farris/ba-exception_handler_token'); export const RENDER_ENGINE_TOKEN = new InjectionToken('@farris/render_engine_token'); + +/** + * BAP: BA统一查询平台RenderEngine的Token +*/ +export const BA_RENDER_ENGINE_TOKEN = new InjectionToken('@farris/ba-render_engine_token'); +export const BA_DATA_TRANSFORMATION_SERVICE_TOKEN = new InjectionToken('@farris/ba-data_transformation_service_token'); /** * 命名空间token */ @@ -20,4 +30,5 @@ export const LOCALE_TOKEN = new InjectionToken('@farris/locale_id_token' */ export const TRANSLATE_TOKEN = new InjectionToken('@farris/translate_token'); +export const DEVKIT_TYPE_TOKEN = new InjectionToken('@farris/devkit_type_token'); export const RUNTIME_FRAMEWORK_CONTEXT_TOKEN = new InjectionToken('@farris/runtime_framework_context_token'); diff --git a/packages/devkit/lib/expression-dependency-resolver/entity-expression-dependency-resolver.ts b/packages/devkit/lib/expression-dependency-resolver/entity-expression-dependency-resolver.ts index f7263166815eb24d98222deed2c633ef3c68383b..e012248177663e8922ac66288afb254d5f1fbaeb 100644 --- a/packages/devkit/lib/expression-dependency-resolver/entity-expression-dependency-resolver.ts +++ b/packages/devkit/lib/expression-dependency-resolver/entity-expression-dependency-resolver.ts @@ -34,7 +34,22 @@ export class EntityExpressionDependencyResolver implements Resolver { private getEntityDependency(expression: string): string[] { const dependencies: string[] = []; // 使用正则匹配出所有实体 - const entityCode = this.viewModel.entityStore?.getEntitySchema().getCode(); + let entityCode = ""; + // BAP: BA统一查询平台支持多实体查询,需要根据模块配置中的表达式来获取实体 + if (this.viewModel.getModule().getDevkitType() === "BA") { + const moduleConfig = this.viewModel.getModule().getConfigManager().getModuleConfig(); + if (moduleConfig.expressions && moduleConfig.expressions.length) { + moduleConfig.expressions.forEach((item: any) => { + if (item.rules && item.rules.length) { + if (item.rules.findIndex((rule: any) => rule.value === expression) >= 0) { + entityCode = item.dataSource; + } + } + }); + } + } else { + entityCode = this.viewModel.entityStore?.getEntitySchema().getCode(); + } const regex = new RegExp(`[\\'\\"]?\\s*(${entityCode})[\\.\\[\\]a-zA-Z0-9_]+\\s*[\\'\\"]?`, 'g'); const entityPropertyExpressions: RegExpMatchArray | null = expression.match(regex); if (Array.isArray(entityPropertyExpressions) && entityPropertyExpressions.length > 0) { diff --git a/packages/devkit/lib/expression-effector/compute-expression-effector.ts b/packages/devkit/lib/expression-effector/compute-expression-effector.ts index a6f96282516b6a456a713aae5b3d7f627eabf272..1b18dbeb166ad0bf2fab2baa41a006fbed59e4e9 100644 --- a/packages/devkit/lib/expression-effector/compute-expression-effector.ts +++ b/packages/devkit/lib/expression-effector/compute-expression-effector.ts @@ -22,6 +22,10 @@ export class ComputeExpressionEffector implements ExpressionEffector { } // 表达式结果可能作用于多条数据或单条数据,作用于多条数据时则应有paths属性,单条数据时默认使用当前行 const realPath = path ? path : expressionObject.path; - this.viewModel.entityStore?.setValueByPath(realPath, value); + if (this.viewModel.getModule().getDevkitType() === "BA") { + this.viewModel.entityStore[expressionObject.dataSource + "-entitystore"]?.setValueByPath(realPath, value); + } else { + this.viewModel.entityStore?.setValueByPath(realPath, value); + } } } diff --git a/packages/devkit/lib/expression-effector/required-expression-effector.ts b/packages/devkit/lib/expression-effector/required-expression-effector.ts index a31cf169a12ca0c64bbf3c9bcb80d7d2ff1c0ea8..3d48017ffe7265e69392e24c9cacbe3e00f4533d 100644 --- a/packages/devkit/lib/expression-effector/required-expression-effector.ts +++ b/packages/devkit/lib/expression-effector/required-expression-effector.ts @@ -13,7 +13,7 @@ export class RequiredExpressionEffector implements ExpressionEffector { if (!this.shouldProcessExpression(expressionObject)) { return; } - const resolvedPath = this.resolvePath(expressionObject.path); + const resolvedPath = this.resolvePath(expressionObject.path, expressionObject); if (!resolvedPath) { return; } @@ -21,8 +21,20 @@ export class RequiredExpressionEffector implements ExpressionEffector { requiredEffector.effect(expressionObject, value, option); } - private resolvePath(path: string) { - return this.viewModel.entityStore?.getEntitySchema().resolvePath(path); + private resolvePath(path: string, expressionObject: ExpressionObject) { + if (!this.viewModel || !this.viewModel.entityStore) { + throw new Error("ViewModel or entityStore is not initialized."); + } + + if (this.viewModel.getModule().getDevkitType() === "BA") { + const entityStoreKey = expressionObject.dataSource + "-entitystore"; + if (!this.viewModel.entityStore[entityStoreKey]) { + throw new Error(`EntityStore for key '${entityStoreKey}' not found.`); + } + return this.viewModel.entityStore[entityStoreKey].getEntitySchema()?.resolvePath(path); + } else { + return this.viewModel.entityStore.getEntitySchema()?.resolvePath(path); + } } /** * 根据实体路径获取视图模型 diff --git a/packages/devkit/lib/expression/expression-context-builder.test.ts b/packages/devkit/lib/expression/expression-context-builder.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..3dd07ecbde7eb1bf76a933ce92798fe0877c1ab1 --- /dev/null +++ b/packages/devkit/lib/expression/expression-context-builder.test.ts @@ -0,0 +1,105 @@ +import { ExpressionContextBuilder } from "./expression-context-builder"; +import { ViewModel, ViewModelState } from "../viewmodel"; +import { Entity, EntityListFieldSchema, EntitySchema, EntityState, EntityStore, FieldType } from "../store"; +import BigNumber from "bignumber.js"; + +describe('ExpressionContextBuilder', () => { + let builder: ExpressionContextBuilder; + let viewModel: ViewModel; + let entityStore: EntityStore>; + let entitySchema: EntitySchema; + + beforeEach(() => { + builder = new ExpressionContextBuilder(); + viewModel = new ViewModel(); + entityStore = new EntityStore>(); + entitySchema = new EntitySchema(); + viewModel.entityStore = entityStore; + viewModel.entityStore.setEntitySchema(entitySchema); + }); + + /** + * 测试 buildContext 方法的基本功能 + * 验证是否能正确构建上下文 + */ + it('should build context correctly', () => { + const context = builder.buildContext(viewModel); + expect(context).toBeDefined(); + expect(context.BigNumber).toEqual(BigNumber); + expect(context.CurrentLanguage).toBe('zh-CHS'); + }); + + /** + * 测试 buildContext 方法在无实体数据时的行为 + * 验证是否能正确处理空数据 + */ + it('should handle empty entity data', () => { + entityStore.setEntityList([]); + const context = builder.buildContext(viewModel); + expect(context).toBeDefined(); + expect(Object.keys(context).length).toBeGreaterThan(0); + }); + + /** + * 测试 buildContext 方法在包含子表时的行为 + * 验证是否能正确构建包含子表的上下文 + */ + it('should handle entity with sub-tables', () => { + const subSchema = new EntityListFieldSchema(); + subSchema.name = 'subTable'; + subSchema.entitySchema = new EntitySchema(); + entitySchema.addFieldSchema(subSchema); + + const context = builder.buildContext(viewModel); + expect(context).toBeDefined(); + expect(context[entitySchema.getCode()]).toBeDefined(); + }); + + /** + * 测试 buildDataTransformationContext 方法的基本功能 + * 验证是否能正确构建数据转换上下文 + */ + it('should build data transformation context correctly', () => { + const context = builder.buildDataTransformationContext(viewModel); + expect(context).toBeDefined(); + expect(context.BigNumber).toEqual(BigNumber); + expect(context.CurrentLanguage).toBe('zh-CHS'); + }); + + /** + * 测试 buildStateContext 方法的基本功能 + * 验证是否能正确构建状态上下文 + */ + it('should build state context correctly', () => { + const state = { prop1: 'value1', prop2: 'value2' }; + viewModel.uiStore = { getState: () => state } as any; + const context = builder.buildStateContext(viewModel); + expect(context).toBeDefined(); + expect(context.prop1).toBe('value1'); + expect(context.prop2).toBe('value2'); + }); + + /** + * 测试 buildEntityContext 方法的基本功能 + * 验证是否能正确构建实体上下文 + */ + it('should build entity context correctly', () => { + const entity = new Entity(); + entity.idValue = '1'; + entityStore.setCurrentEntity(entity); + const context = builder.buildEntityContext(entitySchema, entityStore); + expect(context).toBeDefined(); + expect(context.__type__).toBe('Entity'); + }); + + /** + * 测试 createIteratorableNode 方法的基本功能 + * 验证是否能正确创建可迭代节点 + */ + it('should create iteratorable node correctly', () => { + const node = builder.createIteratorableNode(); + expect(node).toBeDefined(); + expect(node.__type__).toBe('List'); + expect(node.__items__).toEqual([]); + }); +}); \ No newline at end of file diff --git a/packages/devkit/lib/expression/expression-context-builder.ts b/packages/devkit/lib/expression/expression-context-builder.ts index efd3ca8cd5bfa5127d7ee1fc4868d0a0c1858054..5bc3d408a38bd56cf3586932d7bff7ec710fd12e 100644 --- a/packages/devkit/lib/expression/expression-context-builder.ts +++ b/packages/devkit/lib/expression/expression-context-builder.ts @@ -5,20 +5,60 @@ import { ViewModel, ViewModelState } from "../viewmodel"; export class ExpressionContextBuilder { constructor() { } public buildContext(viewModel: ViewModel, currentRows?: { bindingPath: string, primaryValue: string; }[]) { - const entitySchema = viewModel.entityStore.getEntitySchema(); - const entityContext = this.buildEntityContext(entitySchema, viewModel.entityStore, currentRows); const stateContext = this.buildStateContext(viewModel); - const entityCode = viewModel.entityStore.getEntitySchema().getCode(); - const runtimeFrameworkContext = this.buildRuntimeFrameworkContext(viewModel); + let entityContexts: Record = {}; + + if (viewModel.getModule().getDevkitType() === "BA") { + const result: any = {}; + for (let key in viewModel.entityStore) { + const entitySchema = viewModel.entityStore[key].getEntitySchema(); + entityContexts[entitySchema.getCode()] = this.buildEntityContext(entitySchema, viewModel.entityStore[key], currentRows); + } + } else { + const entitySchema = viewModel.entityStore.getEntitySchema(); + const entityCode = entitySchema.getCode(); + entityContexts[entityCode] = this.buildEntityContext(entitySchema, viewModel.entityStore, currentRows); + } + return { + // ...runtimeFrameworkContext, + ...entityContexts, + ...stateContext, + ...this.COMMON_CONTEXT + }; + + } + + private readonly COMMON_CONTEXT = { + BigNumber, + CurrentLanguage: 'zh-CHS' + }; + + public buildDataTransformationContext(viewModel: ViewModel, currentRows?: { bindingPath: string, primaryValue: string; }[]) { + const result: any = {}; + for (let key in viewModel.entityStore) { + const entitySchema = viewModel.entityStore[key].getEntitySchema(); + const entityContext = this.buildDataTransformationEntityContext(entitySchema, viewModel.entityStore[key], currentRows); + result[entitySchema.getCode()] = entityContext; + } + const stateContext = this.buildStateContext(viewModel); + return { - ...runtimeFrameworkContext, - [entityCode]: entityContext, + // ...runtimeFrameworkContext, + ...result, ...stateContext, BigNumber, CurrentLanguage: 'zh-CHS', viewModel }; } + private buildDataTransformationEntityContext(entitySchema: EntitySchema, entityStore: EntityStore> | null, currentRows?: { bindingPath: string, primaryValue: string; }[]) { + const entityList: any = entityStore.getEntityList(); + if (!entityList || !entityList.getEntities().length) { + return []; + } + const entityContext = entityList.toJSON(); + return entityContext; + } private buildStateContext(viewModel: ViewModel) { const result: Record = {}; const uiState = viewModel.uiStore?.getState(); diff --git a/packages/devkit/lib/expression/expression-registry.ts b/packages/devkit/lib/expression/expression-registry.ts index b43c6df20be9c96b0636a16a09d29e0f6588304c..6bc30d5c49e22f1c3accb9143d863754ae3b4b6b 100644 --- a/packages/devkit/lib/expression/expression-registry.ts +++ b/packages/devkit/lib/expression/expression-registry.ts @@ -16,7 +16,8 @@ export class ExpressionRegistry { } this.expressionObjects = []; expressions.forEach((expressionConfig: ExpressionConfig) => { - const { rules, target, targetType, targetId } = expressionConfig; + //BAP: BA统一查询平台表因为支持多个entity,所以表达式配置项新增了dataSource字段,用于标识表达式绑定的实体 + const { rules, target, targetType, dataSource, targetId } = expressionConfig; if (!target || !targetType || !rules || rules.length < 1) { return; } @@ -36,6 +37,7 @@ export class ExpressionRegistry { message: rule.message, messageType: rule.messageType || 'error', deps: [], + dataSource: dataSource, elementId: rule.elementId, fieldId: targetId }; diff --git a/packages/devkit/lib/expression/types.ts b/packages/devkit/lib/expression/types.ts index 3984c15265f27d99d10acd7de6fc8e30eabb01a8..f9bba60b9f5ff31c0a3f92d7f6583916b5780dbd 100644 --- a/packages/devkit/lib/expression/types.ts +++ b/packages/devkit/lib/expression/types.ts @@ -48,6 +48,10 @@ export enum ExpressionType { * 禁用 */ Disabled = 'disabled', + /** + * BAP: BA统一查询平台数据转换 + */ + DataTransformation = 'dataTransformation', } export enum ExpressionMessageType { error = 'error', @@ -66,6 +70,7 @@ export interface ExpressionConfig { target: string; targetType: ExpressionBindingType; rules: ExpressionRule[]; + [prop: string]: any; targetId: string; } /** @@ -121,6 +126,10 @@ export interface ExpressionObject { */ factory?: any; elementId?: string; + /** + * BAP: BA统一查询平台表因为支持多个entity,所以表达式配置项新增了dataSource字段,用于标识表达式绑定的实体 + */ + dataSource?: string; fieldId?: string; } diff --git a/packages/devkit/lib/module/configs/module-config.ts b/packages/devkit/lib/module/configs/module-config.ts index 757906cc8c4772258d444a0445617ab2accc0080..abacc20eff1abf7fc28bed7f40c169bc019bf955 100644 --- a/packages/devkit/lib/module/configs/module-config.ts +++ b/packages/devkit/lib/module/configs/module-config.ts @@ -8,6 +8,7 @@ import { ExpressionConfig } from '../../expression'; /** * Module配置 + * BAP: BA统一查询平台,新增联动配置,所以新增[key: string]: any; */ interface ModuleConfig { id: string; @@ -25,6 +26,7 @@ interface ModuleConfig { viewModels: ViewModelConfig[]; expressions?: ExpressionConfig[] | null; locale?: string; + [key: string]: any; } export { ModuleConfig }; \ No newline at end of file diff --git a/packages/devkit/lib/module/module-creator.ts b/packages/devkit/lib/module/module-creator.ts index ab5fe612ea2e7c128b18ab8dbc14d7c553e8cd54..fe918b5d070c7fb348b19cdb471989ac05f313a1 100644 --- a/packages/devkit/lib/module/module-creator.ts +++ b/packages/devkit/lib/module/module-creator.ts @@ -43,6 +43,53 @@ function createRepositoryProviders(repositoryConfigs: RepositoryConfig[]) { return providers; } +function updateRepositoryProviders(repositoryConfigs: RepositoryConfig[], injector: any) { + if (!repositoryConfigs || !Array.isArray(repositoryConfigs)) { + return []; + } + + const providers: StaticProvider[] = []; + repositoryConfigs.forEach((repositoryConfig) => { + if (!repositoryConfig) { + throw new Error('RepositoryConfig does not exist'); + + } + if (!repositoryConfig.type) { + throw new Error(`The type property of RepositoryConfig(id=${repositoryConfig.id}) can not be empty`); + } + const type = repositoryConfig.type; + const deps = repositoryConfig.deps || []; + + let provider: StaticProvider; + if (repositoryConfig.isDynamic) { + const dynamicRepositoryToken = getDynamicRepositoryToken(repositoryConfig.id); + let repository; + try { + repository = injector.get(dynamicRepositoryToken); + } catch (e) { + } + if (repository) { + provider = { + provide: dynamicRepositoryToken, + useValue: repository, + deps: [Module] + }; + } else { + provider = { + provide: dynamicRepositoryToken, + useClass: type, + deps: [Module] + }; + } + } else { + provider = { provide: type, useClass: type, deps: [...deps] }; + } + providers.push(provider); + + }); + + return providers; +} function createExpressionsProviders(expressions: ExpressionConfig[]) { const providers: StaticProvider[] = []; providers.push({ provide: EXPRESSIONS_TOKEN, useValue: expressions || [] }); @@ -70,6 +117,21 @@ function createModuleProviders(moduleConfig: ModuleConfig) { return providers; } +function updateModuleProviders(moduleConfig: ModuleConfig, injector: any, module: any) { + const extendProviders: StaticProvider[] = moduleConfig.providers || []; + const repositoryProviders = updateRepositoryProviders(moduleConfig.repositories, injector); + const expressionsProviders = createExpressionsProviders(moduleConfig.expressions); + const providers = [ + ...extendProviders, + ...repositoryProviders, + ...expressionsProviders + ]; + + providers.push({ provide: Module, useValue: module, deps: [Injector] }); + + return providers; +} + /** * 创建动态模块 */ @@ -91,6 +153,37 @@ function createDynamicModule(moduleConfig: ModuleConfig) { return module; } +function createDynamicBaModule(moduleConfig: ModuleConfig) { + const devkit = inject(DEVKIT_INJECTION_TOKEN) as Devkit; + if (!devkit) { + throw new Error('Devkit can not be empty'); + } + + if (devkit.getModule(moduleConfig.id)) { + const module = devkit.getModule(moduleConfig.id); + module.init(moduleConfig); + + const devkitInjector = devkit.getInjector(); + const providers = updateModuleProviders(moduleConfig, devkitInjector, module); + const moduleInjector = createInjector(providers, devkitInjector); + module.updateInjector(moduleInjector); + + return module; + } else { + const devkitInjector = devkit.getInjector(); + + const providers = createModuleProviders(moduleConfig); + const moduleInjector = createInjector(providers, devkitInjector); + const module = moduleInjector.get(Module); + module.init(moduleConfig); + + devkit.regitsterModule(moduleConfig.id, module); + provide(MODULE_INJECTION_TOKEN, module); + + return module; + } +} + /** * 创建静态模块 */ @@ -102,4 +195,4 @@ function createStaticModule(moduleType: Type) { return module; } -export { createDynamicModule, createStaticModule }; \ No newline at end of file +export { createDynamicModule, createStaticModule, createDynamicBaModule }; \ No newline at end of file diff --git a/packages/devkit/lib/module/module.ts b/packages/devkit/lib/module/module.ts index 77b1d7d5e0966e7eedc48e0c0a98975be605a492..25705622400609fc2fdf77ae14562dfd875d6d33 100644 --- a/packages/devkit/lib/module/module.ts +++ b/packages/devkit/lib/module/module.ts @@ -1,9 +1,11 @@ -import { DEFAULT_LOCALE, EventBus, IDisposable, Injector, RUNTIME_FRAMEWORK_CONTEXT_TOKEN, RuntimeFrameworkContext } from '../common/index'; +import { DEFAULT_LOCALE, DEVKIT_TYPE_TOKEN, Effect, EffectManager, EventBus, Injector, IDisposable, RuntimeFrameworkContext, RUNTIME_FRAMEWORK_CONTEXT_TOKEN } from '../common/index'; import { Devkit, useDevkit } from '../devkit'; import { Entity, EntityState, EntityStore, UIState, UIStore, FormState, FormStore, FormArrayState, FormArrayStore, StateMachineState, StateMachine, + StateChange, + EntityStoreConfig, } from '../store/index'; import { Repository, getDynamicRepositoryToken } from '../repository/index'; import { ViewModel, ViewModelState } from '../viewmodel/index'; @@ -84,6 +86,11 @@ class Module implements IDisposable { private locale: string; /** + * 副作用管理 + */ + public effectManager: EffectManager>; + + /* * 可释放对象 */ private disposables: IDisposable[]; @@ -96,6 +103,7 @@ class Module implements IDisposable { * 构造函数 */ constructor(injector: Injector) { + this.effectManager = new EffectManager>(); this.injector = injector; this.entityStores = new Map>>(); this.uiStores = new Map>(); @@ -129,6 +137,10 @@ class Module implements IDisposable { return this.injector; } + public updateInjector(injector: any) { + this.injector = injector; + } + /** * 获取框架框架实例 */ @@ -294,15 +306,18 @@ class Module implements IDisposable { */ public createEntityStore(id: string): EntityStore> { let store = this.getEntityStore(id); - if (store) { - return store; - } const storeConfig = this.configManager.getEntityStoreConfig(id); if (!storeConfig) { throw new Error(`StoreConfig(id=${id}) does not exist`); } + if (store) { + if (this.isEquel(store, storeConfig)) { + return store; + } + } + if (storeConfig.type) { store = this.injector.get(storeConfig.type); } else { @@ -311,9 +326,32 @@ class Module implements IDisposable { store.init(storeConfig); this.entityStores.set(id, store); + store.watchChange((change: any) => { + this.triggerChange(change); + }); + return store; } + private isEquel(store: EntityStore>, storeConfig: EntityStoreConfig) { + let result = false; + const entityStoreFields: any = store.getEntitySchema().getFieldSchemas(); + const storeConfigFields: any = storeConfig.state.entity.fields; + if (entityStoreFields.length === storeConfigFields.length) { + for (let i = 0; i < storeConfigFields.length; i++) { + const index = entityStoreFields.findIndex((el: any) => el.name === storeConfigFields[i].name); + if (index < 0) { + result = false; + break; + } + } + result = true; + } else { + result = false; + } + return result; + } + /** * 创建UI仓库 */ @@ -468,6 +506,34 @@ class Module implements IDisposable { return this.locale; } + public getDevkitType() { + let result = ''; + try { + result = this.injector.get(DEVKIT_TYPE_TOKEN); + } catch { + } + return result; + } + + /** + * 监听变更 + */ + public watchChange(changeEffectFunc: (change: StateChange) => void): Function { + const changeEffect = new Effect>(changeEffectFunc); + this.effectManager.addEffect(changeEffect); + const stopWatch = () => { + this.effectManager.removeEffect(changeEffect); + }; + + return stopWatch; + } + + /** + * 触发变更 + */ + public triggerChange(change: any) { + this.effectManager.trigger(change); + } /** * 注册可释放对象 */ diff --git a/packages/devkit/lib/repository/repository.ts b/packages/devkit/lib/repository/repository.ts index 6a70fd75e0560ce3d30c3d273168478224962329..90a58f318fc23dbc7f6e966e565ba7f917495ab8 100644 --- a/packages/devkit/lib/repository/repository.ts +++ b/packages/devkit/lib/repository/repository.ts @@ -33,8 +33,9 @@ abstract class Repository { /** * 实体仓库 + * BAP: BA统一查询平台entityStore存在多个,所以新增类型any */ - public entityStore: EntityStore>; + public entityStore: EntityStore> | any; /** * ID @@ -62,6 +63,14 @@ abstract class Repository { this.entitySchema = this.entityStore.getEntitySchema(); } + public updateEntitySchema(entitySchema?: EntitySchema) { + if (entitySchema) { + this.entitySchema = entitySchema; + } else { + this.entitySchema = this.entityStore.getEntitySchema(); + } + } + /** * 批量创建实体 */ diff --git a/packages/devkit/lib/store/entity-store/configs/entity-store-config.ts b/packages/devkit/lib/store/entity-store/configs/entity-store-config.ts index 3b152e98491009ffd51330c3383f99e559a0fdbc..37101eee0fc39c6fdf507636f8d3573932a83972 100644 --- a/packages/devkit/lib/store/entity-store/configs/entity-store-config.ts +++ b/packages/devkit/lib/store/entity-store/configs/entity-store-config.ts @@ -39,11 +39,13 @@ interface EntityListFieldConfig extends FieldConfig { /** * 实体配置 + * BAP: BA统一查询平台有冗余属性,新增[key: string]: any; */ interface EntityConfig { idKey: string; - fields: FieldConfig[]; - code: string; + fields?: FieldConfig[]; + code?: string; + [key: string]: any; } /** @@ -55,12 +57,14 @@ interface EntityStateConfig { /** * EntityStore配置 + * BAP: BA统一查询平台有冗余属性,新增[key: string]: any; */ interface EntityStoreConfig extends StoreConfig { id: string; type?: Type>>; deps?: StaticProvider[]; state: EntityStateConfig; + [key: string]: any; } export { FieldConfig, PrimitiveFieldConfig, EntityFieldConfig, EntityListFieldConfig, EntityConfig, EntityStateConfig, EntityStoreConfig }; diff --git a/packages/devkit/lib/store/entity-store/entity-state-updater.ts b/packages/devkit/lib/store/entity-store/entity-state-updater.ts index 4e10a2d0113d914bcb7207fbd58ba335142b9c85..62774fbf2bcb472c38af51d01a689d4f4625819d 100644 --- a/packages/devkit/lib/store/entity-store/entity-state-updater.ts +++ b/packages/devkit/lib/store/entity-store/entity-state-updater.ts @@ -53,6 +53,8 @@ class EntityStateUpdater { entities, pagination }; + // BAP: BA统一查询增加数据源属性, 用于数据绑定 + change["dataSource"] = this.entityStore.getEntitySchema().getCode(); this.entityStore.triggerChange(change); } @@ -169,6 +171,8 @@ class EntityStateUpdater { oldValue, newValue }; + // BAP: BA统一查询增加数据源属性, 用于联动处理 + change["dataSource"] = this.entityStore.getEntitySchema().getCode(); this.entityStore.triggerChange(change, persistent); } diff --git a/packages/devkit/lib/viewmodel/viewmodel-creator.ts b/packages/devkit/lib/viewmodel/viewmodel-creator.ts index 7fad67ee51545301f0fdc62ecadd03bf7c8db641..0783171a30463e4e6cde7f0a1b0661fa7f222cf1 100644 --- a/packages/devkit/lib/viewmodel/viewmodel-creator.ts +++ b/packages/devkit/lib/viewmodel/viewmodel-creator.ts @@ -119,4 +119,46 @@ function createViewModel>(module: Module, v return viewModel as VM; } -export { createViewModel }; \ No newline at end of file +/** + * 创建BaViewModel + */ +function createBaViewModel>(module: Module, viewModelId: string): VM { + if (!module) { + throw new Error('Module does not exist'); + } + + const moduleConfigManager = module.getConfigManager(); + const viewModelConfig = moduleConfigManager.getViewModelConfig(viewModelId); + if (!viewModelConfig) { + throw new Error(`ViewModelConfig(id=${viewModelId}) does not exist`); + } + + let parentViewModel; + if (viewModelConfig.parentId) { + parentViewModel = module.getViewModel(viewModelConfig.parentId); + if (!parentViewModel) { + throw new Error(`ParentViewModel(id=${viewModelConfig.parentId}) does not exist`); + } + } + const parentInjector = parentViewModel ? parentViewModel.getInjector() : module.getInjector(); + + const providers = getViewModelProviders(viewModelConfig); + + if (module.getViewModel(viewModelConfig.id)) { + const viewModel = module.getViewModel(viewModelConfig.id); + viewModel.init(viewModelConfig); + + return viewModel as VM; + } else { + const viewModelInjector = createInjector(providers, parentInjector); + const viewModel = viewModelInjector.get(ViewModel); + module.registerViewModel(viewModelConfig.id, viewModel); + provide(VIEWMODEL_INJECTION_TOKEN, viewModel); + + viewModel.init(viewModelConfig); + + return viewModel as VM; + } +} + +export { createViewModel, createBaViewModel }; \ No newline at end of file diff --git a/packages/devkit/lib/viewmodel/viewmodel-initializer.ts b/packages/devkit/lib/viewmodel/viewmodel-initializer.ts index dfedbafec0e5b10f33ae0600f5d52456c17cf6dc..3b64e1d960b481f691e201bfb5c558194f274b10 100644 --- a/packages/devkit/lib/viewmodel/viewmodel-initializer.ts +++ b/packages/devkit/lib/viewmodel/viewmodel-initializer.ts @@ -60,11 +60,12 @@ class ViewModelInitializer { /** * 初始化状态 + * BAP: BA统一查询平台,有多个EntityStore,所以entityState的监听支持对象,key为entityStore的id,value为entityStore的实例 */ private initState(): void { this.viewModel.state = reactive({ - entityState: null, - uiState: {}, + entityState: this.module.getDevkitType() === "BA" ? {} : null, + uiState: null, }); } @@ -77,21 +78,35 @@ class ViewModelInitializer { /** * 初始化实体仓库 + * BAP: BA统一查询平台,元数据描述中有多个entityStore,所以初始化要支持多个entityStore */ private initEntityStore(): void { if (!this.config.entityStore) { return; } - const id = this.config.entityStore; - const entityStore = this.module.createEntityStore(id); - - // 更新状态 - this.viewModel.state.entityState = entityStore.getState(); - entityStore.watchChange(() => { + const id: any = this.config.entityStore; + + if (id instanceof Array) { + this.viewModel.entityStore = {}; + for (let i = 0; i < id.length; i++) { + const entityStore = this.module.createEntityStore(id[i]); + this.viewModel.state.entityState[id[i]] = entityStore.getState(); + entityStore.watchChange(() => { + this.viewModel.state.entityState[id[i]] = entityStore.getState(); + }); + this.viewModel.entityStore[id[i]] = entityStore; + } + } else { + const entityStore = this.module.createEntityStore(id); + + // 更新状态 this.viewModel.state.entityState = entityStore.getState(); - }); + entityStore.watchChange(() => { + this.viewModel.state.entityState = entityStore.getState(); + }); - this.viewModel.entityStore = entityStore; + this.viewModel.entityStore = entityStore; + } } /** @@ -172,13 +187,21 @@ class ViewModelInitializer { /** * 初始化远程实体仓库 + * BAP: BA统一查询平台,元数据描述中有多个repository,所以初始化要支持多个repository */ private initRepository(): void { if (!this.config.repository) { return; } - const id = this.config.repository; - this.viewModel.repository = this.module.createRepository(id); + const id: any = this.config.repository; + if (id instanceof Array) { + this.viewModel.repository = {}; + for (let i = 0; i < id.length; i++) { + this.viewModel.repository[id[i]] = this.module.createRepository(id[i]) + } + } else { + this.viewModel.repository = this.module.createRepository(id); + } } /** diff --git a/packages/devkit/lib/viewmodel/viewmodel.ts b/packages/devkit/lib/viewmodel/viewmodel.ts index 354d0d5802ae132d533529038c12b967617add5b..e6e487362a0f6309609c0b784c7602c12ad38c4b 100644 --- a/packages/devkit/lib/viewmodel/viewmodel.ts +++ b/packages/devkit/lib/viewmodel/viewmodel.ts @@ -23,8 +23,9 @@ class ViewModelState { /** * 实体状态 + * BAP: BA统一查询平台支持多个entityState,所以新增any类型 */ - public entityState?: EntityState; + public entityState?: EntityState | any; /** * UI状态 @@ -64,8 +65,9 @@ class ViewModel extends ViewModelNode { /** * 实体曾库 + * BAP: BA统一查询平台支持多个entityStore,所以新增any类型 */ - public entityStore: EntityStore> | null = null; + public entityStore: EntityStore> | any | null = null; /** * UI仓库 @@ -89,8 +91,9 @@ class ViewModel extends ViewModelNode { /** * 远程实体仓库 + * BAP: BA统一查询平台支持多个repository,所以新增any类型 */ - public repository: Repository; + public repository: Repository | any; /** * 视图模型状态 diff --git a/packages/devkit/rollup.config.js b/packages/devkit/rollup.config.js index 498fe32f67a84216422dc7c2e1e3340969ad63bd..3c276c14e501dc88d4e6450877a16394e170e3e6 100644 --- a/packages/devkit/rollup.config.js +++ b/packages/devkit/rollup.config.js @@ -57,11 +57,11 @@ export default { template: "sunburst", filename: process.cwd() + `/dist-rollup/@farris/devkit-vue.html`, }), - terser({ - keep_fnames: true, - format: { - comments: /^!/ - } - }) + // terser({ + // keep_fnames: true, + // format: { + // comments: /^!/ + // } + // }) ], }; diff --git a/packages/expression-engine/lib/function/default_functions.ts b/packages/expression-engine/lib/function/default_functions.ts index 7dddcefed0cca67cfc8762159c2ad203377df18f..0d401cba49ef7d3b57a8105f5f1f143eaea968c8 100644 --- a/packages/expression-engine/lib/function/default_functions.ts +++ b/packages/expression-engine/lib/function/default_functions.ts @@ -1783,4 +1783,45 @@ export class DefaultFunctions { `)(); } + /** + * BAP: BA统一查询平台数据格批量式化 + */ + public addPrefix(entityName: any, prop1: string, prefix: string) { + return this.eval(` + var list = ${entityName}; + var array = DefaultFunction.getIterable(list); + var result = array.map(item => { + item["${prop1}"] = "${prefix}" + item["${prop1}"]; + return item; + }); + return result; + `)(); + } + + public addSuffix(entityName: any, prop1: string, suffix: string) { + return this.eval(` + var list = ${entityName}; + var array = DefaultFunction.getIterable(list); + var result = array.map(item => { + item["${prop1}"] = item["${prop1}"] + "${suffix}"; + return item; + }); + return result; + `)(); + } + + public parseIntervalData(originalString: string | any, separator: string, index: number) { + let s = "~"; + if (separator) { + s = separator; + } + if (!originalString || index < 0) { + return ""; + } + if (originalString.indexOf(s) < 0) { + return originalString; + } + const array = originalString.split(s); + return array[index]; + } } diff --git a/packages/renderer/farris.config.mjs b/packages/renderer/farris.config.mjs index 7b27e66514b68594e93a311616e2cd8c8b97b4cf..4a7168faf5f5979d66750d7e083383544299ce81 100644 --- a/packages/renderer/farris.config.mjs +++ b/packages/renderer/farris.config.mjs @@ -27,7 +27,7 @@ export default { } }, manifest: false, - minify: 'terser', + minify: false, terserOptions: { compress: { keep_classnames: true, diff --git a/packages/renderer/package.json b/packages/renderer/package.json index d498a6f85950d9f79abc6583ea666bf1ac81e978..7e32298f8fc30d9406db2812d24fe72bc2abf85d 100644 --- a/packages/renderer/package.json +++ b/packages/renderer/package.json @@ -35,7 +35,10 @@ "vue": "^3.2.37", "@edp-bif/runtime-api-vue": "0.0.1", "@farris/devkit-vue": "workspace:^", + "@farris/ui-vue": "workspace:^", + "@farris/charts-vue": "workspace:^", "@farris/command-services-vue": "workspace:^", + "@farris/ba-command-services-vue": "workspace:^", "@farris/bef-vue": "workspace:^", "@farris/ui-binding-vue": "workspace:^", "@farris/expression-engine-vue": "workspace:^", diff --git a/packages/renderer/src/app.vue b/packages/renderer/src/app.vue index 8b59df18209f993cc65772a052f8718c33cae1de..020147f6f478a9466339e4d089bcde1abcd4ca82 100644 --- a/packages/renderer/src/app.vue +++ b/packages/renderer/src/app.vue @@ -6,7 +6,9 @@ import { MetadataLoader, MetadataManager } from './metadata/index'; import { ComponentInternalInstance, getCurrentInstance, provide, Ref, ref } from 'vue'; import { LanguageListLoader, ResourceLoader } from './i18n'; import { LocaleQuery } from './i18n'; -import { DynamicScriptService, LocaleService, Terminal, TERMINAL_TOKEN } from '@farris/command-services-vue'; +import { BaMetadataLoader } from './metadata/ba-matadata/ba-metadata-loader'; +import { loadRegister1 } from '@farris/charts-vue'; +import { DynamicScriptService, Terminal, TERMINAL_TOKEN } from '@farris/command-services-vue'; import { addFormRoute } from './router/use-form-routes'; const bizMetadataId = ref(); @@ -29,6 +31,21 @@ function resolveQuery(query: LocationQuery) { return result; } +function resolveQueryForBa(query: LocationQuery) { + const { metadataId, baseMetadataId, isRtc, isRootMetadata = null, appType, cvft, funcId, tabId } = query; + const result = { + metadataId: Array.isArray(metadataId) ? metadataId.pop() : metadataId, + isRtc: Array.isArray(isRtc) ? isRtc.pop() : isRtc, + baseMetadataId: Array.isArray(baseMetadataId) ? baseMetadataId.pop() : baseMetadataId, + isRootMetadata: Array.isArray(isRootMetadata) ? isRootMetadata.pop() : isRootMetadata, + appType: Array.isArray(appType) ? appType.pop() : appType, + cvft: Array.isArray(cvft) ? cvft.pop() : cvft, + funcId: Array.isArray(funcId) ? funcId.pop() : funcId, + tabId: Array.isArray(tabId) ? tabId.pop() : tabId, + }; + return result; +} + /** * 是否需要重新加载元数据 * 如果跳转后页面的元数据ID和当前元数据ID一致,则不需要重新加载数据 @@ -45,7 +62,6 @@ function needLoadMetadata(query: LocationQuery) { return true; } - router.beforeResolve(async (to: RouteLocationNormalizedGeneric) => { const routerName = to.name as string; @@ -53,32 +69,6 @@ router.beforeResolve(async (to: RouteLocationNormalizedGeneric) => { return true; } - // 加载元数据 - const localeQuery = devkitInjector.get(LocaleQuery, undefined); - await LocaleService.setup({ locale: localeQuery.locale }); - const metadataLoader = devkitInjector.get(MetadataLoader, undefined); - - if (routerName === 'preview' || routerName === 'debug') { - // 预览/调试模式:根据path获取元数据 - const formMetadataPath = to.query.metadataPath?.toString(); - const projectPath = to.query.projectPath?.toString(); - if (!formMetadataPath || !projectPath) { - return false; - } - bizMetadataId.value = to.query.baseMetadataId?.toString(); - await metadataLoader.loadMetadataByPath(projectPath, formMetadataPath); - } else if (routerName === 'renderer') { - const { metadataId, baseMetadataId } = resolveQuery(to.query); - const targetMetadataId = metadataId || baseMetadataId; - if (!targetMetadataId) { - return false; - } - bizMetadataId.value = targetMetadataId; - await metadataLoader.loadMetadataById(targetMetadataId); - } else { - return false; - } - // 添加表单路由 const metadataManager = devkitInjector.get(MetadataManager); const metadatas = metadataManager.getMetadataCache(bizMetadataId.value); @@ -108,6 +98,7 @@ router.beforeResolve(async (to: RouteLocationNormalizedGeneric) => { const languageListLoader = devkitInjector.get(LanguageListLoader); const resourceLoader = devkitInjector.get(ResourceLoader); await languageListLoader.loadLanguageList(); + const baMetadataLoader = devkitInjector.get(BaMetadataLoader, undefined); if (routerName === 'preview' || routerName === 'debug') { // 预览/调试模式:根据path获取元数据 @@ -118,6 +109,19 @@ router.beforeResolve(async (to: RouteLocationNormalizedGeneric) => { await resourceLoader.loadByProjectPath(bizMetadataId.value, projectPath); } else if (routerName === 'renderer') { await resourceLoader.loadByMetadataId(bizMetadataId.value); + } else if (routerName === 'barenderer') { + // BAP: BA统一查询平台的renderer路由分支 + const { metadataId, baseMetadataId } = resolveQueryForBa(to.query); + const targetMetadataId = metadataId || baseMetadataId; + if (!targetMetadataId) { + return false; + } + bizMetadataId.value = targetMetadataId; + await baMetadataLoader.loadMetadataById(targetMetadataId); + await resourceLoader.baLoadByMetadataId(targetMetadataId); + await loadRegister1(); + } else { + return false; } return true; diff --git a/packages/renderer/src/bapage.vue b/packages/renderer/src/bapage.vue new file mode 100644 index 0000000000000000000000000000000000000000..275f1c93c07ccad7b723b106f70b20b8feb93e11 --- /dev/null +++ b/packages/renderer/src/bapage.vue @@ -0,0 +1,104 @@ + + + + diff --git a/packages/renderer/src/barenderer.vue b/packages/renderer/src/barenderer.vue new file mode 100644 index 0000000000000000000000000000000000000000..690aa8cb65f59e7021fa3323ecca6fbe654ee2a1 --- /dev/null +++ b/packages/renderer/src/barenderer.vue @@ -0,0 +1,14 @@ + + + + + diff --git a/packages/renderer/src/callback-handler/ba/crosstab-callback-handler.ts b/packages/renderer/src/callback-handler/ba/crosstab-callback-handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..b6d76fda22dbc848e8dc3a97d983e32abe002626 --- /dev/null +++ b/packages/renderer/src/callback-handler/ba/crosstab-callback-handler.ts @@ -0,0 +1,47 @@ +import { Module } from "@farris/devkit-vue"; +import { CallbackHandler } from "../callback-handler"; +import { FormMetadataService } from "../../service"; + +/** + * 帮助后回调 + */ +export class CrosstabCallbackHandler extends CallbackHandler { + public schemaType: string | null = "crosstab"; + + /** + * 回调类型 + */ + public callbackType: string | null = 'queryData'; + + /** + * 构造函数 + * @param module 模块实例 + * @param formMetadataService 元数据服务 + */ + constructor(module: Module, private formMetadataService: FormMetadataService) { + super(module); + } + + /** + * 处理回调 + * @param type 回调类型 + * @param args 回调参数 + * @returns + */ + public handle(type: string, args: any[]): undefined | boolean | Promise { + const payload = args[0]; + + // 从组件配置中获取组件ID和回调绑定的命令 + const viewSchema = args[1]; + const { id, queryData } = viewSchema; + if (!queryData) { + return payload.data; + } + + // 执行命令 + const relatedComponent = this.formMetadataService.getRelatedComponent(id); + const viewModel = this.module.getViewModel(relatedComponent.id); + payload.schema = JSON.stringify(viewSchema); + return (viewModel as any)[queryData]({ payload, schema: viewSchema }); + } +} diff --git a/packages/renderer/src/callback-handler/ba/index.ts b/packages/renderer/src/callback-handler/ba/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..2fd52a20830c521da602f8afb26be2b9824d3d18 --- /dev/null +++ b/packages/renderer/src/callback-handler/ba/index.ts @@ -0,0 +1 @@ +export * from './crosstab-callback-handler'; \ No newline at end of file diff --git a/packages/renderer/src/callback-handler/providers.ts b/packages/renderer/src/callback-handler/providers.ts index 4986640bc9820e681eb52682cbeeddd2e45a70fe..471cfd337592af848244bd37d66833c8734a841d 100644 --- a/packages/renderer/src/callback-handler/providers.ts +++ b/packages/renderer/src/callback-handler/providers.ts @@ -11,6 +11,7 @@ import { DictPickedCallbackHandler } from "./dict-picked-callback-handler"; import { BeforeCloseModalCallbackHandler } from './before-close-modal-callback-handler'; import { LoadComboListDataCallbackHandler } from './combo-list-before-open-callback-handler'; import { FormNotifyService } from "@farris/command-services-vue"; +import { CrosstabCallbackHandler } from "./ba"; import { BeforeCloseDrawerCallbackHandler } from "./before-close-drawer-callback-handler"; export const callbackHandlerProviders: StaticProvider[] = [ @@ -22,6 +23,7 @@ export const callbackHandlerProviders: StaticProvider[] = [ { provide: CALLBACK_HANDLER_TOKEN, useClass: BeforeCloseModalCallbackHandler, deps: [Module], multi: true }, { provide: CALLBACK_HANDLER_TOKEN, useClass: LoadComboListDataCallbackHandler, deps: [Module], multi: true }, { provide: CALLBACK_HANDLER_TOKEN, useClass: BeforeCloseDrawerCallbackHandler, deps: [Module], multi: true }, + { provide: CALLBACK_HANDLER_TOKEN, useClass: CrosstabCallbackHandler, deps: [Module, FormMetadataService], multi: true }, { provide: CALLBACK_HANDLER_TOKEN, useClass: BeforeUpdateDataGridCallCallbackHandler, deps: [Module], multi: true }, { provide: CallbackHandlerRegistry, useClass: CallbackHandlerRegistry, deps: [Injector] } ]; diff --git a/packages/renderer/src/composition/ba/index.ts b/packages/renderer/src/composition/ba/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..3b141e2529a66580fabe46de73ab1bbef5885b83 --- /dev/null +++ b/packages/renderer/src/composition/ba/index.ts @@ -0,0 +1,2 @@ +export * from './use-ba-module-creator'; +export * from './use-config-resolver'; \ No newline at end of file diff --git a/packages/renderer/src/composition/ba/use-ba-module-creator.ts b/packages/renderer/src/composition/ba/use-ba-module-creator.ts new file mode 100644 index 0000000000000000000000000000000000000000..02f09fba334e5351b203a6d581ffb4bf1aaea0ca --- /dev/null +++ b/packages/renderer/src/composition/ba/use-ba-module-creator.ts @@ -0,0 +1,12 @@ +import { createDynamicBaModule, createBaViewModel, ModuleConfig } from "@farris/devkit-vue"; +import { Ref } from "vue"; + +export function useBaModuleCreator(metadata: Ref, moduleConfig: ModuleConfig){ + const module = createDynamicBaModule(moduleConfig); + const { components } = metadata.value.form?.content?.module || []; + components.forEach((component: any) => { + const viewModel = createBaViewModel(module, component.id); + module.registerViewModel(component.id, viewModel); + }); + return module; +} diff --git a/packages/renderer/src/composition/ba/use-config-resolver.ts b/packages/renderer/src/composition/ba/use-config-resolver.ts new file mode 100644 index 0000000000000000000000000000000000000000..201d22f232306c58fe33697329d43f09c73f818f --- /dev/null +++ b/packages/renderer/src/composition/ba/use-config-resolver.ts @@ -0,0 +1,6 @@ +import { Injector } from "@farris/devkit-vue"; +import { ConfigResolver } from "../../config"; + +export function useConfigResolver(injector: Injector){ + return injector.get(ConfigResolver); +} diff --git a/packages/renderer/src/composition/index.ts b/packages/renderer/src/composition/index.ts index a3048ea3f8f972db3a2c3acb5d22fc58e17a9e79..84bc108868e34c23d99d5b3be3316531334bfc83 100644 --- a/packages/renderer/src/composition/index.ts +++ b/packages/renderer/src/composition/index.ts @@ -21,6 +21,7 @@ export * from './use-html-template-transformer'; export * from './use-component-config-dependency-resolver'; export * from './use-custom-component-renders'; export * from './use-translate'; +export * from './ba/index'; export * from './use-custom-css'; export * from './use-rich-editor-provide'; export * from './use-resource'; diff --git a/packages/renderer/src/composition/use-component-providers.ts b/packages/renderer/src/composition/use-component-providers.ts index a508e642c07758eb0a7c5deb0ecfbad69d88e5ba..db7986933fd3fdcf9f369071cbb36d423a3ce562 100644 --- a/packages/renderer/src/composition/use-component-providers.ts +++ b/packages/renderer/src/composition/use-component-providers.ts @@ -1,4 +1,5 @@ +import { BA_MESSAGE_BOX_SERVICE_TOKEN, BA_NOTIFY_SERVICE_TOKEN, BA_LOADING_SERVICE_TOKEN, BA_MODAL_SERVICE_TOKEN } from '@farris/ba-command-services-vue'; import { MESSAGE_BOX_SERVICE_TOKEN, NOTIFY_SERVICE_TOKEN, LOADING_SERVICE_TOKEN, MODAL_SERVICE_TOKEN, VERIFY_DETAIL_SERVICE_TOKEN } from '@farris/command-services-vue'; import { StaticProvider } from '@farris/devkit-vue'; import { inject } from 'vue'; @@ -15,6 +16,10 @@ export function useComponentProviders() { { provide: NOTIFY_SERVICE_TOKEN, useValue: NotifyService }, { provide: LOADING_SERVICE_TOKEN, useValue: LoadingService }, { provide: MODAL_SERVICE_TOKEN, useValue: ModalService }, + { provide: BA_MESSAGE_BOX_SERVICE_TOKEN, useValue: MessageBoxService }, + { provide: BA_NOTIFY_SERVICE_TOKEN, useValue: NotifyService }, + { provide: BA_LOADING_SERVICE_TOKEN, useValue: LoadingService }, + { provide: BA_MODAL_SERVICE_TOKEN, useValue: ModalService }, { provide: VERIFY_DETAIL_SERVICE_TOKEN, useValue: VerifyDetailService } ]; return { diff --git a/packages/renderer/src/composition/use-model-value.ts b/packages/renderer/src/composition/use-model-value.ts index 3c39fc41c003c6b1209cb0f90f178c7a14711954..6cff6d39679ccc6e5345bf14e75b7c8b3ba59e2a 100644 --- a/packages/renderer/src/composition/use-model-value.ts +++ b/packages/renderer/src/composition/use-model-value.ts @@ -13,15 +13,27 @@ import { ENTITY_STORE_SUFFIX } from "../types"; export function useModelValue(formInjector: Injector, module: Module) { const modelValue: Ref = ref({}); const moduleConfigId = formInjector.get(MODULE_CONFIG_ID_TOKEN); - const entityStore = module.getEntityStore(moduleConfigId + ENTITY_STORE_SUFFIX); - const modelValueResolver = useModelValueResolver(formInjector); - modelValue.value = modelValueResolver.resolve(); - - // 监听实体变化,更新modelValue - entityStore?.watchChange((change: any) => { + const entityStoreConfigs = module.getConfigManager().getModuleConfig()?.entityStores ?? []; + // BAP: BA统一查询平台 + if (module.getDevkitType() === 'BA') { + for (let i = 0; i < entityStoreConfigs.length; i++) { + const entityStore = module.getEntityStore(entityStoreConfigs[i].id); + entityStore?.watchChange((change: any) => { + const modelValueResolver = useModelValueResolver(formInjector); + modelValue.value = modelValueResolver.resolve(); + }); + } + } else { + const entityStore = module.getEntityStore(moduleConfigId + ENTITY_STORE_SUFFIX); const modelValueResolver = useModelValueResolver(formInjector); modelValue.value = modelValueResolver.resolve(); - }); + + // 监听实体变化,更新modelValue + entityStore?.watchChange((change: any) => { + const modelValueResolver = useModelValueResolver(formInjector); + modelValue.value = modelValueResolver.resolve(); + }); + } return { modelValue diff --git a/packages/renderer/src/composition/use-module-config.ts b/packages/renderer/src/composition/use-module-config.ts index 87bb1e3bf65aaf7ae49e2f11cffae8c323c374d9..0ae39fc6182256cc61004e2fc0ee1c7c2ef69bd0 100644 --- a/packages/renderer/src/composition/use-module-config.ts +++ b/packages/renderer/src/composition/use-module-config.ts @@ -1,7 +1,7 @@ import { befProviders, befRootProviders } from "@farris/bef-vue"; -import { commandServiceModuleProviders, commandServiceViewModelProviders, VUE_ROUTER_TOKEN } from "@farris/command-services-vue"; -import { Injector, ModuleConfig, RENDER_ENGINE_TOKEN, StaticProvider } from "@farris/devkit-vue"; +import { DEVKIT_TYPE_TOKEN, Injector, ModuleConfig, RENDER_ENGINE_TOKEN, StaticProvider, TRANSLATE_TOKEN } from "@farris/devkit-vue"; import { ref, Ref } from "vue"; +import { commandServiceModuleProviders, commandServiceViewModelProviders, commandServiceProviders, commandServiceRootProviders, VUE_ROUTER_TOKEN } from "@farris/command-services-vue"; import { ModuleConfigBuilder } from "../config-builders"; import { RenderEngineImpl } from "../render-engine"; import { FORM_METADATA_ID_TOKEN, FORM_METADATA_TOKEN, MODULE_CONFIG_ID_TOKEN, RENDER_TOKEN } from "../tokens"; @@ -28,6 +28,8 @@ import { UploadDevkitProviders, UploadDevkitRootProviders } from '@gsp-svc/formd import { FileViewerServiceProviders, FileViewerDevkitProviders, FileViewerDevkitRootProviders } from '@gsp-svc/file-viewer-vue'; import { i18nModuleProviders } from "../i18n"; import { CloudPrintServiceProviders } from '@gsp-svc/cloudprint-vue'; +import { BaModuleConfigBuilder } from "../config-builders/ba/ba-module-config-builder"; +import { baCommandServiceRootProviders, baCommandServiceProviders } from "@farris/ba-command-services-vue"; import { ChgdrProviders } from '@gsp-cmp/chgdr-vue'; import { componentServiceProviders } from "../component-services"; import { useRouter } from "vue-router"; @@ -43,6 +45,8 @@ export function useModuleConfig(metadata: Ref, uiProviders: StaticProvider[],par webComponents: metadata?.value.webComponents, moduleProviders: [ ...uiProviders, + ...commandServiceRootProviders, + ...baCommandServiceRootProviders, ...commandServiceModuleProviders, ...befRootProviders, { provide: FORM_METADATA_ID_TOKEN, useValue: metadata?.value.form.id, deps: [] }, @@ -58,6 +62,8 @@ export function useModuleConfig(metadata: Ref, uiProviders: StaticProvider[],par ], viewModelProviders: [ ...befProviders, + ...commandServiceProviders, + ...baCommandServiceProviders, ...commandServiceViewModelProviders, ...configProviders, ...configDependencyResolverProviders, @@ -86,7 +92,14 @@ export function useModuleConfig(metadata: Ref, uiProviders: StaticProvider[],par ...componentServiceProviders, ] }; - const moduleConfigBuilder = new ModuleConfigBuilder(moduleMetaContext); - const moduleConfig = moduleConfigBuilder.build(); + let moduleConfig: any = {}; + // BAP: BA统一查询Module + if (uiProviders.length > 0 && uiProviders.findIndex((provider: any) => provider.provide === DEVKIT_TYPE_TOKEN && provider.useValue === 'BA') >= 0) { + const moduleConfigBuilder = new BaModuleConfigBuilder(moduleMetaContext); + moduleConfig = moduleConfigBuilder.build(); + } else { + const moduleConfigBuilder = new ModuleConfigBuilder(moduleMetaContext); + moduleConfig = moduleConfigBuilder.build(); + } return moduleConfig; } diff --git a/packages/renderer/src/composition/use-ui-binding.ts b/packages/renderer/src/composition/use-ui-binding.ts index 8a132589c27d028ffd50b0313c6d59c01a3f1165..6cb943c235b62683bb44c9aa8a522fcb1475ec9c 100644 --- a/packages/renderer/src/composition/use-ui-binding.ts +++ b/packages/renderer/src/composition/use-ui-binding.ts @@ -1,6 +1,6 @@ /* eslint-disable no-use-before-define */ import { Injector } from '@farris/devkit-vue'; -import { useCalendarBinding, useDataGridBinding, useFormGroupBinding, useListViewBinding, useTreeGridBinding, useDiscussionBinding } from '@farris/ui-binding-vue'; +import { useCalendarBinding, useDataGridBinding, useFormGroupBinding, useListViewBinding, useTreeGridBinding, useDiscussionBinding, useBaBinding, useBaComboBoxBinding } from '@farris/ui-binding-vue'; import { useFormMetadataService } from './use-form-metadata-service'; import { useModule } from './use-module'; import { DataSourceResolver, FieldResolver } from '../resolvers'; @@ -17,7 +17,27 @@ export function useUIBinding(injector: Injector) { return; } const viewSchema = formMetadata.getMetadataById(id); - if (type === 'data-grid' || type === 'tree-grid' || type === 'list-view') { + if (viewSchema["isStoryStudioComponent"]) { + const { data } = viewSchema || {}; + const relatedComponent = formMetadata.getRelatedComponent(id); + if (!relatedComponent) { + return; + } + const viewModel = module.getViewModel(relatedComponent.id); + if (!viewModel) { + return; + } + const entityPath = "/"; + if (!entityPath) { + return; + } + if (type === 'ba-combo-box' || viewSchema["binding"]) { + useBaComboBoxBinding(ref, { entityPath, viewModel, viewSchema, module }); + } + if (viewSchema["dataSource"]) { + useBaBinding(ref, { entityPath, viewModel, viewSchema, module }); + } + } else if (type === 'data-grid' || type === 'tree-grid' || type === 'list-view') { const { dataSource, selection } = viewSchema || {}; const { multiSelect, showCheckbox } = selection || {}; const relatedComponent = formMetadata.getRelatedComponent(id); diff --git a/packages/renderer/src/config-builders/ba/ba-entity-store-config-builder.ts b/packages/renderer/src/config-builders/ba/ba-entity-store-config-builder.ts new file mode 100644 index 0000000000000000000000000000000000000000..3dca4bc3470c0db0bca1e6fc6135ba44ea8afb03 --- /dev/null +++ b/packages/renderer/src/config-builders/ba/ba-entity-store-config-builder.ts @@ -0,0 +1,133 @@ +import { + FieldConfig, PrimitiveFieldConfig, EntityFieldConfig, EntityListFieldConfig, EntityConfig, + EntityStateConfig, EntityStoreConfig +} from '@farris/devkit-vue'; +import { ENTITY_STORE_SUFFIX } from '../../types'; + +/** + * 实体仓库配置构造器 + */ +class BaEntityStoreConfigBuilder { + + /** + * 表单元数据 + */ + private formMeta: any; + + /** + * 构造函数 + */ + constructor(formMeta: any) { + this.formMeta = formMeta; + } + + /** + * 构造实体仓库配置 + */ + build(schemaNode: any) { + const id = schemaNode.code + ENTITY_STORE_SUFFIX; + const parentEntitySchema = schemaNode.columns; + const entityStateConfig = this.buildEntityStateConfig(parentEntitySchema, schemaNode.code); + const entityStoreConfig: EntityStoreConfig = { + id, + state: entityStateConfig + }; + + return entityStoreConfig; + } + + /** + * 创建实体状态配置 + */ + private buildEntityStateConfig(entitySchemaNode: any, code: any): EntityStateConfig { + const entityConfig = this.buildEntityConfig(entitySchemaNode, code); + const entityStateConfig = { + entity: entityConfig + }; + + return entityStateConfig; + } + + /** + * 构造实体配置 + */ + private buildEntityConfig(entitySchemaNode: any, code: string): EntityConfig { + const idKey = "id"; + const entitySchemaNodeCopy = this.analysisEntitySchema(entitySchemaNode); + const fieldConfigs = this.buildEntityFieldConfigs(entitySchemaNodeCopy); + const entityConfig = { + idKey, + fields: fieldConfigs, + code: code + }; + return entityConfig; + } + + private analysisEntitySchema(entitySchemaNode: any) { + const schema = JSON.parse(JSON.stringify(entitySchemaNode)); + if (schema && schema.length) { + const schemaNode = schema.find((el: any) => el.columnName === "id"); + const flag = schemaNode && schemaNode["columnName"] ? true : false; + if (!flag) { + schema.push({ + columnName: "id", + dataType: "text", + datasetId: "", + queryId: "" + }); + } + } + return schema + } + + /** + * 构造实体字段配置集合 + */ + private buildEntityFieldConfigs(entitySchemaNode: any[]): FieldConfig[] { + const fieldConfigs: FieldConfig[] = []; + + // 简单字段和关联字段 + entitySchemaNode.forEach((fieldSchemaNode: any) => { + let fieldConfig: FieldConfig; + if (fieldSchemaNode["operationType"] && fieldSchemaNode["operationType"] === "ROW_TO_COLUMN") { + const { operationContext } = fieldSchemaNode; + if (operationContext["data"]) { + const { data } = operationContext; + if (data["groups"] && data["groups"].length) { + data["groups"].forEach((group: any) => { + fieldConfig = this.buildPrimitiveFieldConfig(group); + fieldConfigs.push(fieldConfig); + }); + } + if (data["values"] && data["values"].length) { + data["values"].forEach((value: any) => { + fieldConfig = this.buildPrimitiveFieldConfig(value); + fieldConfigs.push(fieldConfig); + }); + } + } + } else { + fieldConfig = this.buildPrimitiveFieldConfig(fieldSchemaNode); + fieldConfigs.push(fieldConfig); + } + }); + + return fieldConfigs; + } + + /** + * 构造简单字段配置 + */ + private buildPrimitiveFieldConfig(fieldSchemaNode: any): PrimitiveFieldConfig { + const fieldConfig: PrimitiveFieldConfig = { + type: 'Primitive', + name: fieldSchemaNode.columnName, + multiLanguage: false + }; + + return fieldConfig; + } + +} + +export { BaEntityStoreConfigBuilder }; diff --git a/packages/renderer/src/config-builders/ba/ba-expression-config-builder.ts b/packages/renderer/src/config-builders/ba/ba-expression-config-builder.ts new file mode 100644 index 0000000000000000000000000000000000000000..7ed451eaae42b0b981c7b780686a0e7a925727da --- /dev/null +++ b/packages/renderer/src/config-builders/ba/ba-expression-config-builder.ts @@ -0,0 +1,82 @@ +import { ExpressionBindingType } from "@farris/devkit-vue"; +import { DataSourceResolver, FieldResolver } from "../../resolvers"; +import { ExpressionMetadata } from "../../types"; + +export class BaExpressionConfigBuilder { + constructor(private formMeta: any) { } + public build(expression: ExpressionMetadata) { + this.convertFieldExpression(expression); + this.buildRules(expression); + return expression; + } + private convertFieldExpression(expression: any) { + if (expression.targetType === ExpressionBindingType.Field) { + const path = this.convertFieldIdToPath(expression.target, expression.dataSource); + if (!path) { + console.warn(`expression target ${expression.target} not found`); + return; + } + expression.target = path; + } + } + private buildRules(expression: any) { + const { rules } = expression; + if (!rules || rules.length < 1) { + return; + } + rules.forEach((rule: any) => { + if (!rule.value) { + return; + } + const config = JSON.parse(rule.value); + const expression1 = config.expr; + rule.value = this.cleanSpecialCharacters(expression1, expression.dataSource); + }); + } + private cleanSpecialCharacters(expression: string, dataSource: string) { + const regex = new RegExp(`[\\'\\"]?\\s*(${dataSource})[\\.\\[\\]a-zA-Z0-9_]+\\s*[\\'\\"]?`, 'g'); + const entityPropertyExpressions: RegExpMatchArray | null = expression.match(regex); + if (Array.isArray(entityPropertyExpressions) && entityPropertyExpressions.length > 0) { + // 解析出所有实体相关的字符串,以主实体名字开头,包含主实体属性或子表 + entityPropertyExpressions.forEach((item: string) => { + if (item.indexOf('.') === -1) { + return; + } + // 去数组 + if (/\[\d\]/g.test(item)) { + const replacer = item.replace(/\[\d\]/g, ''); + expression = this.replaceAll(expression, item, replacer); + } + // 去星号 + if (/\*/g.test(item)) { + const replacer = item.replace(/\*/g, ''); + expression = this.replaceAll(expression, item, replacer); + } + }); + } + return expression; + } + private convertFieldIdToPath(id: string, entityCode: string): string | null { + const resolvedField = FieldResolver.baResolve(this.getEntitySchema(entityCode), id); + if (!resolvedField) { + return null; + } + const { dataSource, bindingPath } = resolvedField; + const resolvedDataSource = DataSourceResolver.resolve(this.getEntitySchema(entityCode), dataSource); + if (!resolvedDataSource) { + return null; + } + const { bindingPaths } = resolvedDataSource; + const fullPaths = bindingPaths.concat(bindingPath.split('.')); + return '/' + fullPaths.join('/'); + } + + private getEntitySchema(dataSource: string): any { + const entity = this.formMeta.module.entity.find((item: any) => item.code === dataSource); + return entity; + } + + private replaceAll(originalValue: string, search: string, replacer: string) { + return originalValue.split(search).join(replacer); + } +} diff --git a/packages/renderer/src/config-builders/ba/ba-linkage-config-builder.ts b/packages/renderer/src/config-builders/ba/ba-linkage-config-builder.ts new file mode 100644 index 0000000000000000000000000000000000000000..7c0388e5d46c228756e40a776d9c3aea9c811c6e --- /dev/null +++ b/packages/renderer/src/config-builders/ba/ba-linkage-config-builder.ts @@ -0,0 +1,97 @@ +export class BaLinkageConfigBuilder { + /** + * 表单元数据 + */ + private formMeta: any; + + constructor(formMeta: any) { + this.formMeta = formMeta; + } + + public build(linkedConfiguration: any): any { + const schema = this.buildFieldLinkage(linkedConfiguration?.fieldLinkage); + return schema; + } + + private buildFieldLinkage(fieldLinkage: any) { + const fieldLinkageConfig: any = { + fieldLinkage: [] + }; + if (!fieldLinkage || !fieldLinkage.length) { + return []; + } + + const sourceFieldsMap = new Map(); + fieldLinkage.forEach((item: any) => { + const targetFieldsMap = new Map(); + + this.buildSourceFieldMap(item.sourceField, sourceFieldsMap); + + this.buildTargetFieldMap(item.target, targetFieldsMap); + + this.buildFieldRelation(item.mappingRule, targetFieldsMap); + + const config = this.buildContext(item.context); + + fieldLinkageConfig.fieldLinkage.push({ + target: targetFieldsMap, + targetDataSource: item.target.dataSource, + mappingRule: item.mappingRule, + context: config, + configuration: item["configuration"] + }); + }); + + fieldLinkageConfig["sourceField"] = sourceFieldsMap; + + return fieldLinkageConfig; + } + + private buildSourceFieldMap(item: any, sourceFieldsMap: any) { + if (!item || !item.fields || item.fields.length < 1) { return; } + + item.fields.forEach((field: any) => { + if (!sourceFieldsMap.has(field.dataSource)) { + sourceFieldsMap.set(field.dataSource, []); + } + const fieldArray = sourceFieldsMap.get(field.dataSource) ?? []; + if (fieldArray.findIndex((el: any) => el.key === field.columnName) < 0) { + fieldArray?.push({ key: field.columnName, value: null }); + } + }); + } + + private buildTargetFieldMap(target: any, targetFieldsMap: any) { + if (!target) { return; } + + // const dataSource = target.dataSource; + target.fields.forEach((targetField: any) => { + // if (!targetFieldsMap.has(dataSource)) { + // targetFieldsMap.set(dataSource, new Map()); + // } + // targetFieldsMap.get(dataSource)?.set(targetField.columnName, ""); + targetFieldsMap.set(targetField.columnName, ""); + }); + } + + private buildFieldRelation(mappingRule: any, targetFieldsMap: any) { + if (mappingRule) { + mappingRule.expresses.forEach((express: any) => { + if (express.kind === "logic") { + this.buildFieldRelation(express.expresses, targetFieldsMap); + } else { + // targetFieldsMap.get(express.leftExpress.dataSource)?.set(express.leftExpress.columnName, express.rightExpress.value); + targetFieldsMap.set(express.leftExpress.columnName, express.rightExpress.value); + } + }); + } + } + + private buildContext(context: any) { + let config: any = {}; + if (context && context.template) { + config = JSON.parse(JSON.stringify(context)); + } + return config; + } +} \ No newline at end of file diff --git a/packages/renderer/src/config-builders/ba/ba-module-config-builder.ts b/packages/renderer/src/config-builders/ba/ba-module-config-builder.ts new file mode 100644 index 0000000000000000000000000000000000000000..51b74f0a04ba3c94adaaa2e52a67a36c147bb3ac --- /dev/null +++ b/packages/renderer/src/config-builders/ba/ba-module-config-builder.ts @@ -0,0 +1,268 @@ +import { + EntityStoreConfig, UIStoreConfig, FormStoreConfig, FormArrayStoreConfig, + StateMachineConfig, RepositoryConfig, ViewModelConfig, ModuleConfig, + ExpressionConfig, +} from '@farris/devkit-vue'; +import { FormMetadataQuery } from '../../service/index'; +import { BaRepositoryConfigBuilder } from './ba-repository-config-builder'; +import { EntityStoreConfigBuilder } from '../entity-store-config-builder'; +import { UIStoreConfigBuilder } from '../ui-store-config-builder'; +import { FormStoreConfigBuilder, FormArrayStoreConfigBuilder } from '../form/index'; +import { StateMachineConfigBuilder } from '../state-machine-config-builder'; +import { ExpressionMetadata } from '../../types'; +import { BaEntityStoreConfigBuilder } from './ba-entity-store-config-builder'; +import { BaViewModelConfigBuilder } from './ba-viewmodel-config-builder'; +import { BaLinkageConfigBuilder } from './ba-linkage-config-builder'; +import { BaExpressionConfigBuilder } from './ba-expression-config-builder'; + +/** + * 模块配置构造器 + */ +class BaModuleConfigBuilder { + + /** + * 上下文 + */ + private context: any; + + /** + * 表单元数据 + */ + private formMeta: any; + + /** + * 表单元数据查询 + */ + private formMetaQuery: FormMetadataQuery; + + /** + * 状态机元数据集合 + */ + private smMetas: any; + + /** + * 命令构件集合 + */ + private webCmdMetas: any[]; + + /** + * 服务构件集合 + */ + private webCmpMetas: any[]; + + /** + * 模块配置 + */ + private moduleConfig: ModuleConfig; + + /** + * 构造函数 + */ + constructor(context: any) { + this.context = context; + this.context = context; + this.formMeta = this.context.form; + this.formMetaQuery = new FormMetadataQuery({ content: this.formMeta }); + this.smMetas = this.context.stateMachines; + this.webCmdMetas = this.context.webcmds; + this.webCmpMetas = this.context.webComponents; + this.moduleConfig = { + id: '', + providers: [], + entityStores: [], + uiStores: [], + formStores: [], + formArrayStores: [], + stateMachines: [], + repositories: [], + viewModels: [], + expressions: [] + }; + } + + /** + * 构造模块配置 + */ + public build() { + this.buildRepositoryConfigs(this.formMeta); + this.buildEntityStoreConfigs(this.formMeta); + // this.buildStateMachineConfigs(this.formMeta, this.smMetas); + this.buildViewModelConfigs(this.formMeta, this.webCmdMetas, this.webCmpMetas, this.context.viewModelProviders); + this.buildExpressionConfigs(this.formMeta); + this.buildLinkageConfigs(this.formMeta); + this.moduleConfig.id = this.getModuleId(); + this.moduleConfig.providers = this.context.moduleProviders; + this.moduleConfig.locale = localStorage.getItem('languageCode') || 'zh-CHS'; + + return this.moduleConfig; + } + + /** + * 获取模块ID + */ + private getModuleId(): string { + const { code, externalContainerId } = this.formMeta.module; + const moduleId = externalContainerId ? `${externalContainerId}-${code}` : code; + + return moduleId; + } + + /** + * 构造远程实体仓库配置 + */ + private buildRepositoryConfigs(formMeta: any): RepositoryConfig[] { + const builder = new BaRepositoryConfigBuilder(formMeta); + const configs: RepositoryConfig[] = []; + const schemaNodes = formMeta.module.entity as any[]; + schemaNodes.forEach((schemaNode: any) => { + const config = builder.build(schemaNode); + configs.push(config); + }); + this.moduleConfig.repositories = configs; + + return configs; + } + + /** + * 构造实体仓库配置 + */ + private buildEntityStoreConfigs(formMeta: any): EntityStoreConfig[] { + const builder = new BaEntityStoreConfigBuilder(formMeta); + const configs: EntityStoreConfig[] = []; + + const schemaNodes = formMeta.module.entity; + schemaNodes.forEach((schema: any) => { + const config = builder.build(schema); + config["queryView"] = schema; + configs.push(config); + }); + this.moduleConfig.entityStores = configs; + + return configs; + } + + // /** + // * 构造状态机配置 + // */ + // private buildStateMachineConfigs(formMeta: any, smMetas: any): StateMachineConfig[] { + // const builder = new StateMachineConfigBuilder(formMeta); + // const configs: StateMachineConfig[] = []; + // smMetas.forEach((smMeta: any) => { + // const config = builder.build(smMeta); + // if (!config) { + // return; + // } + // configs.push(config); + // }); + // this.moduleConfig.stateMachines = configs; + + // return configs; + // } + + /** + * 构造视图模型配置 + */ + public buildViewModelConfigs(formMeta: any, webCmdMetas: any[], webComponentMetadatas: any[], viewModelProviders: any[]): ViewModelConfig[] { + const builder = new BaViewModelConfigBuilder(formMeta, webCmdMetas, webComponentMetadatas, viewModelProviders); + const configs: ViewModelConfig[] = []; + const viewModelNodes = formMeta.module.viewmodels as any[]; + viewModelNodes.forEach((viewModelNode) => { + const config = builder.build(viewModelNode); + if (!config) { + return; + } + + const uiStoreConfig = this.buildUIStoreConfig(viewModelNode); + config.uiStore = uiStoreConfig ? uiStoreConfig.id : undefined; + + // const formStoreConfig = this.buildFormStoreConfig(viewModelNode); + // config.formStore = formStoreConfig ? formStoreConfig.id : undefined; + + // const formArrayStoreConfig = this.buildFormArrayStoreConfig(viewModelNode); + // config.formArrayStore = formArrayStoreConfig ? formArrayStoreConfig.id : undefined; + + configs.push(config); + }); + this.moduleConfig.viewModels = configs; + + return configs; + } + + /** + * 构造UI仓库配置 + */ + public buildUIStoreConfig(viewModelNode: any): UIStoreConfig { + const builder = new UIStoreConfigBuilder(this.formMeta); + const config = builder.build(viewModelNode); + this.moduleConfig.uiStores.push(config); + + return config; + } + + // /** + // * 构造表单仓库 + // */ + // public buildFormStoreConfig(viewModelNode: any): FormStoreConfig | undefined { + // const builder = new FormStoreConfigBuilder(this.formMetaQuery); + // const config = builder.build(viewModelNode); + // if (config.state.controls.length === 0) { + // return; + // } + // this.moduleConfig.formStores.push(config); + + // return config; + // } + + // /** + // * 构造表单数组仓库配置 + // */ + // public buildFormArrayStoreConfig(viewModelNode: any): FormArrayStoreConfig | undefined { + // const builder = new FormArrayStoreConfigBuilder(this.formMetaQuery); + // const config = builder.build(viewModelNode); + // if (config.state.controls.length === 0) { + // return; + // } + // this.moduleConfig.formArrayStores.push(config); + + // return config; + // } + + private buildExpressionConfigs(formMeta: any) { + const expressionConfigs = this.buildExpressions(formMeta); + if (!expressionConfigs) { + return; + } + this.moduleConfig.expressions = expressionConfigs; + } + private buildExpressions(formMeta: any): ExpressionConfig[] | null { + const { expressions } = formMeta.module; + if (!expressions || !Array.isArray(expressions) || expressions.length < 1) { + return null; + } + const expressionConfigBuilder = new BaExpressionConfigBuilder(formMeta); + expressions.forEach((expression: ExpressionMetadata) => { + expressionConfigBuilder.build(expression); + }); + return expressions; + } + + private buildLinkageConfigs(formMeta: any) { + const linkageConfigs = this.buildLinkages(formMeta); + if (!linkageConfigs) { + return; + } + this.moduleConfig.linkedConfiguration = linkageConfigs; + } + + private buildLinkages(formMeta: any): any | null { + let { linkedConfiguration } = formMeta.module; + if (!linkedConfiguration) { + return {}; + } + const linkageConfigBuilder = new BaLinkageConfigBuilder(formMeta); + linkedConfiguration = linkageConfigBuilder.build(linkedConfiguration); + return linkedConfiguration; + } +} + +export { BaModuleConfigBuilder }; diff --git a/packages/renderer/src/config-builders/ba/ba-repository-config-builder.ts b/packages/renderer/src/config-builders/ba/ba-repository-config-builder.ts new file mode 100644 index 0000000000000000000000000000000000000000..cc2ca843c9b9c950cbc220f600dfb87250acf3b6 --- /dev/null +++ b/packages/renderer/src/config-builders/ba/ba-repository-config-builder.ts @@ -0,0 +1,63 @@ +import { Module } from '@farris/devkit-vue'; +import { BaRepository, BaRepositoryConfig, BefVariableConfig } from '@farris/bef-vue'; +import { ENTITY_STORE_SUFFIX, REPOSITORY_SUFFIX } from '../../types'; + +/** + * 远程实体仓库配置构造器 + */ +class BaRepositoryConfigBuilder { + + /** + * 表单元数据 + */ + private formMeta: any; + + /** + * 构造函数 + */ + constructor(formMeta: any) { + this.formMeta = formMeta; + } + + /** + * 构造配置 + */ + public build(schema: any): BaRepositoryConfig { + const variableConfigs = this.buildVariableConfigs(schema?.context?.template); + const config = { + id: schema.code + REPOSITORY_SUFFIX, + type: BaRepository, + deps: [ Module ], + isDynamic: true, + entityStore: schema.code + ENTITY_STORE_SUFFIX, + baseUrl: '/' + schema.sourceUri.toLowerCase(), + isVirtualEntity: schema.isVirtualEntity ?? false, + variables: variableConfigs, + sourceType: schema.sourceType + }; + + return config; + } + + /** + * 构造变量配置 + */ + private buildVariableConfigs(variableNodes: any): BefVariableConfig[] { + if (Object.prototype.toString.call(variableNodes) === '[object Object]') { + return []; + } + const result = []; + for (const key in variableNodes) { + if (variableNodes[key]) { + const variableConfig: BefVariableConfig = { + name: key + }; + result.push(variableConfig); + } + } + + return result; + } +} + +export { BaRepositoryConfigBuilder }; diff --git a/packages/renderer/src/config-builders/ba/ba-viewmodel-config-builder.ts b/packages/renderer/src/config-builders/ba/ba-viewmodel-config-builder.ts new file mode 100644 index 0000000000000000000000000000000000000000..2ad53ad03e28da3586b1073565b51aa06e193f31 --- /dev/null +++ b/packages/renderer/src/config-builders/ba/ba-viewmodel-config-builder.ts @@ -0,0 +1,170 @@ +import { CommandParamConfig, CommandConfig, ViewModelConfig, CommandHandlerConfig } from '@farris/devkit-vue'; +import { CommandHandlerConfigBuilder } from '../command-handler-builder'; +import { ENTITY_STORE_SUFFIX, REPOSITORY_SUFFIX, UI_STORE_SUFFIX } from '../../types'; + +/** + * 视图模型配置构造器 + */ +class BaViewModelConfigBuilder { + + /** + * 表单元数据 + */ + private formMeta: any; + + /** + * 表单元数据 + */ + private webCmdMetas: any[]; + + private webComponentMetadatas: any[]; + + /** + * 视图模型注入配置 + */ + private viewModelProviders: any[]; + + /** + * 构造函数 + */ + constructor(formMeta: any, webCmdMetas: any[], webComponentMetadatas: any[], viewModelProviders: any[]) { + this.formMeta = formMeta; + this.webCmdMetas = webCmdMetas; + this.webComponentMetadatas = webComponentMetadatas; + this.viewModelProviders = viewModelProviders; + } + + /** + * 构造配置 + */ + public build(viewModelNode: any) { + const componentNode = this.getComponentNode(viewModelNode.id); + if (!componentNode) { + return; + } + + const moduleCode = this.formMeta.module.code; + const commandConfigs = this.buildCommandConfigs(viewModelNode.commands); + const commandHandlerConfigs = this.buildCommandHandlerConfigs(viewModelNode.commands); + + const parentViewModelId = viewModelNode.parent; + let parentComponent = null; + if (parentViewModelId) { + parentComponent = this.getComponentNode(parentViewModelId); + } + this.getComponentNode(parentViewModelId); + + const viewModelConfig: ViewModelConfig = { + id: componentNode.id, + entityStore: this.buildEntityStore(), + uiStore: this.buildUIStore(), + stateMachine: viewModelNode.stateMachine, + repository: this.buildRepository(), + providers: this.viewModelProviders, + commands: commandConfigs, + commandHandlers: commandHandlerConfigs, + bindingPath: viewModelNode.bindTo, + parentId: parentComponent ? parentComponent.id : null, + enableValidation: viewModelNode.enableValidation, + }; + + return viewModelConfig; + } + + private buildEntityStore() { + const entityStoreConfig: any = []; + this.formMeta?.module?.entity.forEach((el: any) => { + entityStoreConfig.push(el.code + ENTITY_STORE_SUFFIX); + }); + return entityStoreConfig; + } + + private buildUIStore() { + const uiStoreConfig: any = []; + this.formMeta?.module?.entity.forEach((el: any) => { + uiStoreConfig.push(el.code + UI_STORE_SUFFIX); + }); + return uiStoreConfig; + } + + private buildRepository() { + const repositoryConfig: any = []; + this.formMeta?.module?.entity.forEach((el: any) => { + repositoryConfig.push(el.code + REPOSITORY_SUFFIX); + }); + return repositoryConfig; + } + + /** + * 构造命令配置 + */ + private buildCommandConfigs(commandNodes: any[]): CommandConfig[] { + const commandConfigs: CommandConfig[] = []; + commandNodes.forEach((commandNode) => { + const paramConfigs = this.buildCommandParamConfigs(commandNode.params); + const commandConfig: CommandConfig = { + name: commandNode.code, + params: paramConfigs + }; + commandConfigs.push(commandConfig); + }); + + return commandConfigs; + } + + /** + * 构造命令参数配置 + */ + private buildCommandParamConfigs(paramNodes: any[]): CommandParamConfig[] { + const paramsConfigs: CommandParamConfig[] = []; + paramNodes.forEach((paramNode) => { + const paramConfig: CommandParamConfig = { + name: paramNode.name, + value: paramNode.value, + type: paramNode.type + }; + paramsConfigs.push(paramConfig); + }); + + return paramsConfigs; + } + + /** + * 构造命令处理器配置 + */ + private buildCommandHandlerConfigs(commandNodes: any[]): CommandHandlerConfig[] { + const commandHandlerConfigBuilder = new CommandHandlerConfigBuilder(this.formMeta, this.webCmdMetas, this.webComponentMetadatas); + const commandHandlerConfigs: CommandHandlerConfig[] = []; + commandNodes.forEach((commandNode) => { + // const webCmdId = commandNode.cmpId; + // const commandName = commandNode.code; + // const commandHandlerNode = this.getCommandHandlerNode(webCmdId, commandNode.handlerName); + + // const taskConfigs = this.buildTaskConfigs(commandHandlerNode.Items); + // const commandHandlerConfig: CommandHandlerConfig = { + // commandName, + // tasks: taskConfigs + // }; + // commandHandlerConfigs.push(commandHandlerConfig); + const commandHandlerConfig = commandHandlerConfigBuilder.build(commandNode); + if (commandHandlerConfig) { + commandHandlerConfigs.push(commandHandlerConfig); + } + }); + + return commandHandlerConfigs; + } + /** + * 获取视图模型对应组件 + */ + private getComponentNode(viewModelId: string): any | undefined { + const componentNodes = this.formMeta.module.components; + const targetComponentNode = componentNodes.find((componentNode: any) => { + return componentNode.viewModel === viewModelId; + }); + + return targetComponentNode; + } +} + +export { BaViewModelConfigBuilder }; diff --git a/packages/renderer/src/config-builders/ba/index.ts b/packages/renderer/src/config-builders/ba/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f34baf5683596f5b58a54423788b772d5477f577 --- /dev/null +++ b/packages/renderer/src/config-builders/ba/index.ts @@ -0,0 +1,6 @@ +export * from './ba-entity-store-config-builder'; +export * from './ba-module-config-builder'; +export * from './ba-repository-config-builder'; +export * from './ba-viewmodel-config-builder'; +export * from './ba-linkage-config-builder'; +export * from './ba-expression-config-builder'; \ No newline at end of file diff --git a/packages/renderer/src/config-builders/repository-config-builder.ts b/packages/renderer/src/config-builders/repository-config-builder.ts index f77dd8c89d89d93f7b7fc666320eadab90ac2791..84f308f30488bd889d969424f067ef62108b291b 100644 --- a/packages/renderer/src/config-builders/repository-config-builder.ts +++ b/packages/renderer/src/config-builders/repository-config-builder.ts @@ -1,6 +1,6 @@ import { Module } from '@farris/devkit-vue'; import { BefRepository, BefRepositoryConfig, BefVariableConfig } from '@farris/bef-vue'; -import { ENTITY_STORE_SUFFIX } from '../types'; +import { ENTITY_STORE_SUFFIX, REPOSITORY_SUFFIX } from '../types'; /** * 远程实体仓库配置构造器 @@ -25,7 +25,7 @@ class RepositoryConfigBuilder { public build(schema: any): BefRepositoryConfig { const variableConfigs = this.buildVariableConfigs(schema.variables); const config = { - id: this.formMeta.module.code + '-repository', + id: this.formMeta.module.code + REPOSITORY_SUFFIX, type: BefRepository, deps: [ Module ], isDynamic: true, diff --git a/packages/renderer/src/config-builders/viewmodel-config-builder.ts b/packages/renderer/src/config-builders/viewmodel-config-builder.ts index e3f542a9f57d501a1c45b51645ff4199138f0e92..55dbd1c584c2e17c9269c05dcccff35ec25f6ec9 100644 --- a/packages/renderer/src/config-builders/viewmodel-config-builder.ts +++ b/packages/renderer/src/config-builders/viewmodel-config-builder.ts @@ -1,6 +1,6 @@ import { CommandParamConfig, CommandConfig, ViewModelConfig, CommandHandlerConfig } from '@farris/devkit-vue'; import { CommandHandlerConfigBuilder } from './command-handler-builder'; -import { ENTITY_STORE_SUFFIX } from '../types'; +import { ENTITY_STORE_SUFFIX, REPOSITORY_SUFFIX, UI_STORE_SUFFIX } from '../types'; /** * 视图模型配置构造器 @@ -57,9 +57,9 @@ class ViewModelConfigBuilder { const viewModelConfig: ViewModelConfig = { id: componentNode.id, entityStore: moduleCode + ENTITY_STORE_SUFFIX, - uiStore: viewModelNode.code + '-uistore', + uiStore: viewModelNode.code + UI_STORE_SUFFIX, stateMachine: viewModelNode.stateMachine, - repository: moduleCode + '-repository', + repository: moduleCode + REPOSITORY_SUFFIX, providers: this.viewModelProviders, commands: commandConfigs, commandHandlers: commandHandlerConfigs, diff --git a/packages/renderer/src/event-handler/model-value-update-event-handler.ts b/packages/renderer/src/event-handler/model-value-update-event-handler.ts index c99fefe41d2915c39edfc3cb66e9ceb1bacf888f..68396c5f710475ce9c4dd0d0b5e2c552dcd2df5b 100644 --- a/packages/renderer/src/event-handler/model-value-update-event-handler.ts +++ b/packages/renderer/src/event-handler/model-value-update-event-handler.ts @@ -1,5 +1,5 @@ import { EventHandler } from "./types"; -import { Injector, Module } from "@farris/devkit-vue"; +import { ChangeValueChange, EntityChangeType, Injector, Module } from "@farris/devkit-vue"; import { FormMetadataService } from "../service"; import { ViewEvent } from "../types"; import { EventEmitter } from "../common"; @@ -43,6 +43,7 @@ export class ModelValueUpdateEventHandler implements EventHandler { return; } const viewModel = this.module.getViewModel(frameComponent.id); + // BAP: BA统一查询平台字段解析 const currentEntity = viewModel?.entityStore?.getCurrentEntityByPath(`/${bindingPaths.join('/')}`); if (!currentEntity || !currentEntity.idValue) { return; @@ -53,14 +54,86 @@ export class ModelValueUpdateEventHandler implements EventHandler { viewModel?.entityStore?.setValueByPath(entityPath, value); } } + + private baOonModelValueUpdate(payload: any) { + if (!payload) { + return; + } + if (typeof payload !== 'object' || !payload.field || payload.value === null || payload.value === undefined) { + console.error('Invalid payload format'); + return; + } + const { field: fieldId, value } = payload; + if (!fieldId) { + console.error('Invalid fieldId'); + return; + } + // BAP: BA统一查询平台字段解析 + const field = FieldResolver.baResolve(this.getEntitySchema(payload.elementId), fieldId); + if (!field) { + return; + } + const { dataSource, bindingPath } = field; + if (!dataSource || !bindingPath) { + console.error(`Invalid field: ${JSON.stringify(field)}`); + return; + } + // BAP: BA统一查询平台字段解析 + const entity = DataSourceResolver.resolve(this.getEntitySchema(payload.elementId), dataSource); + if (!entity) { + console.error(`Invalid datasource: ${dataSource}`); + return; + } + const fieldBindingPaths = bindingPath.split('.').filter(Boolean); + const { bindingPaths } = entity; + const paths = [...bindingPaths, ...fieldBindingPaths]; + const entityPath = `/${paths.join('/')}`; + // use root component + const frameComponent = this.formMetadataService.getFrameComponent(); + if (!frameComponent) { + return; + } + const viewModel = this.module.getViewModel(frameComponent.id); + + const entityStore = viewModel?.entityStore[dataSource + '-entitystore']; + if (!entityStore) { + console.error(`Entity store not found for dataSource: ${dataSource}`); + return; + } + // BAP: BA统一查询平台字段解析 + const currentEntity = viewModel?.entityStore[dataSource + '-entitystore'].getCurrentEntityByPath(`/${bindingPaths.join('/')}`); + if (!currentEntity || !currentEntity.idValue) { + return; + } + viewModel?.entityStore[dataSource + '-entitystore'].setValueByPath(entityPath, value); + } + private get entitySchema() { return this.formMetadataService.getEntity(); } + + private getEntitySchema(id: string): any { + const metadata = this.formMetadataService.getMetadataById(id); + if (metadata) { + if (metadata['binding']) { + return this.formMetadataService.getEntityById(metadata.binding?.dataSource) + } + } + return null; + } public bind() { - this.emitter.on('update:modelValue', (payload: ViewEvent) => this.onModelValueUpdate(payload)); + if (this.module.getDevkitType() === "BA") { + this.emitter.on('update:modelValue', (payload: ViewEvent) => this.baOonModelValueUpdate(payload)); + } else { + this.emitter.on('update:modelValue', (payload: ViewEvent) => this.onModelValueUpdate(payload)); + } } public dispose() { - this.emitter.off('update:modelValue', (payload: ViewEvent) => this.onModelValueUpdate(payload)); + if (this.module.getDevkitType() === "BA") { + this.emitter.off('update:modelValue', (payload: ViewEvent) => this.baOonModelValueUpdate(payload)); + } else { + this.emitter.off('update:modelValue', (payload: ViewEvent) => this.onModelValueUpdate(payload)); + } } } diff --git a/packages/renderer/src/expression-effectors/expression-required-effector.ts b/packages/renderer/src/expression-effectors/expression-required-effector.ts index 2742f2f47200af7f9474b5e1b65b593535fab620..70b4b0ce763d5b8187ea9474aac37a801ade1bc4 100644 --- a/packages/renderer/src/expression-effectors/expression-required-effector.ts +++ b/packages/renderer/src/expression-effectors/expression-required-effector.ts @@ -11,7 +11,7 @@ export class ExpressionRequiredEffector implements Effector { private formMetadataService: FormMetadataService ) { } public effect(expressionObject: ExpressionObject, isRequired: boolean, option?: EffectOption): void { - const resolvedPath = this.resolvePath(expressionObject.path); + const resolvedPath = this.resolvePath(expressionObject.path, expressionObject); if (!resolvedPath) { return; } @@ -157,8 +157,12 @@ export class ExpressionRequiredEffector implements Effector { /** * 解析路径 */ - private resolvePath(path: string | string[]) { - return this.viewModel.entityStore?.getEntitySchema().resolvePath(path); + private resolvePath(path: string | string[], expressionObject: any) { + if (this.viewModel.getModule().getDevkitType() === "BA") { + return this.viewModel.entityStore[expressionObject.dataSource + "-entitystore"].getEntitySchema().resolvePath(path); + } else { + return this.viewModel.entityStore.getEntitySchema().resolvePath(path); + } } /** * 查找控件配置 diff --git a/packages/renderer/src/i18n/resource-loader.ts b/packages/renderer/src/i18n/resource-loader.ts index 410ac99c59836238eddc4502b87e6101f900bfdf..8ea1eedeb09499ec4747ac58443f98ab50727325 100644 --- a/packages/renderer/src/i18n/resource-loader.ts +++ b/packages/renderer/src/i18n/resource-loader.ts @@ -64,6 +64,13 @@ export class ResourceLoader { }, {}); this.resourceManager.setResourceCache(formMetadataId, resourceObject); }); + } + /** + * BAP: BA统一查询平台新增通过id加载国际化资源方法 + * @param formMetadataId + */ + public baLoadByMetadataId(formMetadataId: string) { + } public async loadByMetadataId(formMetadataId: string) { const metadata = this.metadataManager.getMetadataCache(formMetadataId); diff --git a/packages/renderer/src/main.ts b/packages/renderer/src/main.ts index e37c6253f0be5a285b2016869bab6852f5be33e8..0f853073293f1502a239452f905d69a454a28b4e 100644 --- a/packages/renderer/src/main.ts +++ b/packages/renderer/src/main.ts @@ -1,4 +1,6 @@ import { createApp } from 'vue'; +import FarrisVue from '@farris/ui-vue'; +import FarrisChartsVue from '@farris/charts-vue'; import { createDevkit } from '@farris/devkit-vue'; import { commandServicesDevkitProviders } from '@farris/command-services-vue'; import { metadataProviders } from './metadata'; @@ -22,4 +24,12 @@ const devkit = createDevkit({ const app = createApp(App); app.use(router); app.use(devkit); -app.mount('#app'); \ No newline at end of file +app.use(FarrisVue, { + locale: localStorage.getItem('languageCode') || 'zh-CHS', + uri: '/platform/common/web/@farris/i18n/ui' +}); +app.use(FarrisChartsVue, { + locale: localStorage.getItem('languageCode') || 'zh-CHS', + uri: '/platform/common/web/@farris/i18n/ui' +}); +app.mount('#app'); diff --git a/packages/renderer/src/metadata/ba-matadata/ba-metadata-loader.ts b/packages/renderer/src/metadata/ba-matadata/ba-metadata-loader.ts new file mode 100644 index 0000000000000000000000000000000000000000..91c96e85ceb21ef878746af492c6d27d1a63a0d8 --- /dev/null +++ b/packages/renderer/src/metadata/ba-matadata/ba-metadata-loader.ts @@ -0,0 +1,135 @@ +import { MetadataManager } from '../metadata-manager'; +import { FormMetadataQuery } from '../../service/form-metadata-query'; +import { LocaleQuery } from '../../i18n'; +import { BaMetadataDataServiceImpl } from './data-service/metadata-data-service-extend'; + +/** + * 元数据加载器 + */ +class BaMetadataLoader { + + /** + * 元数据取数服务 + */ + private metadataDataService: BaMetadataDataServiceImpl; + + /** + * 元数据管理器 + */ + private metadataManager: MetadataManager; + + /** + * 构造函数 + */ + constructor(metadataDataService: BaMetadataDataServiceImpl, metadataManager: MetadataManager, private localeQuery: LocaleQuery) { + this.metadataDataService = metadataDataService; + this.metadataManager = metadataManager; + } + + /** + * 根据路径加载表单元数据 + */ + public async loadMetadataByPath(projectPath: string, formMetadataPath: string) { + const metadatas = await this.metadataDataService.loadMetadataByPath(projectPath, formMetadataPath); + + const formMetadataQuery = new FormMetadataQuery(metadatas.form); + this.normalizeStatemachines(formMetadataQuery, metadatas); + this.normalizeExternalComponents(formMetadataQuery, metadatas); + + this.metadataManager.setMetadatasCache(metadatas.form.id, metadatas); + await this.loadExternalMetadataByPath(metadatas.form); + } + + /** + * 根据ID加载元数据 + */ + public async loadMetadataById(formMetadataId: string) { + const metadatas = await this.metadataDataService.loadMetadataById(formMetadataId); + + const formMetadataQuery = new FormMetadataQuery(metadatas.form); + this.normalizeStatemachines(formMetadataQuery, metadatas); + this.normalizeExternalComponents(formMetadataQuery, metadatas); + + this.metadataManager.setMetadatasCache(formMetadataId, metadatas); + await this.loadExternalMetadataByPath(metadatas.form); + } + + /** + * 根据Path加载外部表单元数据 + */ + public async loadExternalMetadataByPath(formMetadata: any) { + const formMetadataQuery = new FormMetadataQuery(formMetadata); + const externalFormInfos = formMetadataQuery.getExternalFormInfos(); + + for (const externalFormInfo of externalFormInfos) { + await this.loadMetadataByPath(externalFormInfo.projectPath, externalFormInfo.formMetadataPath); + this.correctExternalFormCode(externalFormInfo); + } + } + + /** + * 根据ID加载外部表单元数据 + */ + public async loadExternalMetadataById(formMetadata: any) { + const formMetadataQuery = new FormMetadataQuery(formMetadata); + const externalFormInfos = formMetadataQuery.getExternalFormInfos(); + + for (const externalFormInfo of externalFormInfos) { + await this.loadMetadataById(externalFormInfo.id); + this.correctExternalFormCode(externalFormInfo); + } + } + /** + * 标准化元数据 + */ + private normalizeStatemachines(formMetadataQuery: FormMetadataQuery, metadatas: any): void { + if (!metadatas) { + return; + } + const formMetadata = metadatas.form?.content; + if (!formMetadata) { + return; + } + + // 获取状态机ID + const stateMachines = formMetadata.module?.stateMachines; + if (!Array.isArray(stateMachines) || stateMachines.length < 1) { + return; + } + const stateMachineId = stateMachines[0].id; + + // 补全状态机ID + const viewModels = formMetadata.module?.viewmodels; + if (!Array.isArray(viewModels) || viewModels.length < 1) { + return; + } + viewModels.forEach((viewModel: any) => { + viewModel.stateMachine = stateMachineId; + }); + } + + /** + * 标准化外部组件 + */ + private normalizeExternalComponents(formMetadataQuery: FormMetadataQuery, metadatas: any) { + const externalComponentNodes: any[] = formMetadataQuery.getExternalComponents(); + if (!Array.isArray(externalComponentNodes)) { + return; + } + + const rootVmComponent = formMetadataQuery.getRootComponent(); + externalComponentNodes.forEach((externalComponentNode: any) => { + rootVmComponent.contents.push(externalComponentNode); + }); + } + + /** + * 针对外部表单,补上外部容器ID + */ + private correctExternalFormCode(externalFormInfo: any) { + const externalMetadata = this.metadataManager.getMetadataCache(externalFormInfo.id); + externalMetadata.form.content.module.externalContainerId = externalFormInfo.externalContainerId; + } +} + +export { BaMetadataLoader }; diff --git a/packages/renderer/src/metadata/ba-matadata/data-service/ba-metadata-data-service.ts b/packages/renderer/src/metadata/ba-matadata/data-service/ba-metadata-data-service.ts new file mode 100644 index 0000000000000000000000000000000000000000..b7048bacbbc5448f6c4cc1944fbe30608777ad72 --- /dev/null +++ b/packages/renderer/src/metadata/ba-matadata/data-service/ba-metadata-data-service.ts @@ -0,0 +1,55 @@ + +import { BaMetadataRepository } from "../repository/ba-metadata-repository"; +import { Metadata } from "../../../types"; + +export class BaMetadataDataService { + constructor(private repository: BaMetadataRepository) { } + + public loadByFullPath(metadataFullPath: string): Promise { + return this.repository.load(metadataFullPath).then((response: any) => { + return this.createMetadata(response); + }); + } + + public loadById(metadataId: string) { + return this.repository.retrieve(metadataId).then((response: any) => { + return this.createMetadata(response); + }); + } + + public loadByFileName(fileName: string) { + return this.repository.load(fileName).then((response: any) => { + return this.createMetadata(response); + }); + } + + private createMetadata(response: any) { + if (response['module']) { + const { code, entity } = response.module; + const { type = 'Form', eapiNameSpace: namespace, voPath: relativePath } = entity[0]; + const content = response; + const refs = {}; + const metadata = { id: response["id"] || "card", content, refs, relativePath, type, code, namespace }; + return metadata; + } else { + if (response['board'] || response['metadata']) { + let metadata = response?.metadata?.metadata; + if (metadata) { + metadata = JSON.parse(metadata); + const { code, entity } = metadata.module; + const { type = 'Form', eapiNameSpace: namespace, sourceUri: relativePath } = entity[0]; + const content = metadata; + const refs = {}; + const resutl = { id: response["board"]["id"] || "card", content, refs, relativePath, type, code, namespace }; + return resutl; + } else { + console.error("metadata is null"); + return null; + } + } else { + console.error("metadata is null"); + return null; + } + } + } +} diff --git a/packages/renderer/src/metadata/ba-matadata/data-service/metadata-data-service-extend.ts b/packages/renderer/src/metadata/ba-matadata/data-service/metadata-data-service-extend.ts new file mode 100644 index 0000000000000000000000000000000000000000..e5d80596dbdc1f8dbfeef963b064fc13fb8aba15 --- /dev/null +++ b/packages/renderer/src/metadata/ba-matadata/data-service/metadata-data-service-extend.ts @@ -0,0 +1,112 @@ +import { DEFAULT_LOCALE } from "@farris/devkit-vue"; +import { LanguageListManager } from "../../../i18n"; +import { Metadata, FormMetadata, StateMachineRefMetadata, WebCommandRefMetadata } from "../../../types"; +import { CommonWebCommandMetadataDataService, CustomWebCommandMetadataDataService, CustomWebComponentMetadataDataService, FormMetadataDataService, MetadataDataService, ResourceMetadataDataService, StateMachineMetadataDataService } from "../../data-service"; +import { BaMetadataDataService } from "./ba-metadata-data-service"; + +export class BaMetadataDataServiceImpl extends MetadataDataService { + constructor( + public baMetadataDataService: BaMetadataDataService, + public formMetadataDataService: FormMetadataDataService, + public stateMachineMetadataDataService: StateMachineMetadataDataService, + public webCommandMetadataDataService: CommonWebCommandMetadataDataService, + public customWebComponentMetadataDataService: CustomWebComponentMetadataDataService, + public customWebCommandMetadataDataService: CustomWebCommandMetadataDataService, + public resourceMetadataDataService: ResourceMetadataDataService, + public languageListManager: LanguageListManager + ) { + super( + formMetadataDataService, + stateMachineMetadataDataService, + webCommandMetadataDataService, + customWebComponentMetadataDataService, + customWebCommandMetadataDataService, + resourceMetadataDataService, + languageListManager + ) + } + + public loadMetadataByPath(projectPath: string, metadataPath: string) { + return this.baMetadataDataService.loadByFullPath(metadataPath).then((formMetadata: Metadata) => { + const schema = formMetadata.content as FormMetadata; + + // 状态机元数据 + const { stateMachines = [] } = schema.module; + const stateMachineMetadataPromise = stateMachines && stateMachines.length > 0 ? stateMachines.map((stateMachine: StateMachineRefMetadata) => { + return this.stateMachineMetadataDataService.loadByProjectPath(projectPath, stateMachine.uri); + }) : [Promise.resolve(null)]; + + // 命令元数据 + const commandsMetadataPromise = schema.module.webcmds.map((webCommand: WebCommandRefMetadata) => { + const { id } = webCommand; + return this.webCommandMetadataDataService.loadByProjectPath(projectPath, id); + }); + + // 自定义构件元数据 + const customWebComponentMetadataPromise = this.customWebComponentMetadataDataService.loadByType(projectPath); + + const promises = [Promise.all(stateMachineMetadataPromise), Promise.all(commandsMetadataPromise), customWebComponentMetadataPromise]; + return Promise.all(promises).then(([stateMachineSchema, commandSchemas, customWebComponents]) => { + return { + form: formMetadata, + stateMachines: stateMachineSchema as Metadata[], + commands: commandSchemas as Metadata[], + webComponents: customWebComponents as Metadata[], + // resourceMetadatas: resourceMetadatas + }; + }); + }); + } + + public loadMetadataById(metadataId: string) { + return this.baMetadataDataService.loadById(metadataId).then((formMetadata: Metadata) => { + const schema = formMetadata.content as FormMetadata; + const { stateMachines } = schema.module; + // const stateMachineRefSchema = stateMachines[0]; + const stateMachineMetadataPromise = stateMachines && stateMachines.length > 0 ? stateMachines.map((stateMachine: StateMachineRefMetadata) => { + return this.stateMachineMetadataDataService.loadById(stateMachine.uri); + }) : [Promise.resolve(null)]; + + const commandsMetadataPromise = schema.module.webcmds.map((webCommand: WebCommandRefMetadata) => { + const { id } = webCommand; + return this.webCommandMetadataDataService.loadById(id); + }); + + const promises = [Promise.all(stateMachineMetadataPromise), Promise.all(commandsMetadataPromise)]; // , Promise.all(resourceMetadataPromise) Promise.all(stateMachineMetadataPromise), + + return Promise.all(promises).then(([stateMachineSchema, commandSchemas]) => { // , resourceMetadatas stateMachineSchema, + const customWebComponents: string[] = []; + if (commandSchemas && commandSchemas.length > 0) { + commandSchemas.forEach((commandSchema: Metadata | null) => { + if (commandSchema && commandSchema.content && commandSchema.content.Extends && commandSchema.content.Extends.IsCommon === false) { + const commands = commandSchema.content.Commands as any[]; + commands.forEach((command: any) => { + const items = command.Items as any[]; + items.forEach((item: any) => { + if (!item.ComponentPath.startsWith('Gsp/')) { + const componentId = item.ComponentId; + if (!customWebComponents.includes(componentId)) { + customWebComponents.push(componentId); + } + } + }); + }); + } + }); + } + const customWebComponentMetadataPromise = customWebComponents.length > 0 ? Promise.all(customWebComponents.map((id: string) => { + return this.customWebComponentMetadataDataService.loadById(id); + })) : Promise.resolve(null); + return customWebComponentMetadataPromise.then((customWebComponents: Metadata[] | null) => { + return { + form: formMetadata, + stateMachines: stateMachineSchema as Metadata[], + commands: commandSchemas as Metadata[], + webComponents: customWebComponents as Metadata[], + // resourceMetadatas + }; + }); + }); + }); + } +} \ No newline at end of file diff --git a/packages/renderer/src/metadata/ba-matadata/index.ts b/packages/renderer/src/metadata/ba-matadata/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/renderer/src/metadata/ba-matadata/repository/ba-metadata-repository.ts b/packages/renderer/src/metadata/ba-matadata/repository/ba-metadata-repository.ts new file mode 100644 index 0000000000000000000000000000000000000000..7a738f07d859bb9d6d2ce529d8396217d0fefc7c --- /dev/null +++ b/packages/renderer/src/metadata/ba-matadata/repository/ba-metadata-repository.ts @@ -0,0 +1,25 @@ +import { HttpClient, HttpParams, HttpRequestConfig } from "@farris/devkit-vue"; + +export class BaMetadataRepository { + constructor(private httpClient: HttpClient) { + } + + public load(metadataPath: string): Promise { + return this.httpClient.get(`/api/ba/bap/v1.0/storyboard/boards/${metadataPath}`, {}); + // return this.httpClient.get(`/platform/common/web/barenderer/metadata/${metadataPath}.json`, {}); + } + + public loadMetadatasByType(metadataPath: string, metadataType: string): Promise { + return this.httpClient.get(`/api/ba/bap/v1.0/storyboard/boards/${metadataPath}`, {}); + // return this.httpClient.get(`/platform/common/web/barenderer/metadata/${metadataPath}.json`, {}); + } + + public relied(metadataId: string, metadataPath: string): Promise { + return this.httpClient.get(`/platform/common/web/barenderer/metadata/${metadataId}.json`, {}); + // return this.httpClient.get(`/platform/common/web/barenderer/metadata/${metadataId}.json`, {}); + } + + public retrieve(metadataId: string): Promise { + return this.httpClient.get(`/api/ba/bap/v1.0/storyboard/boards/${metadataId}`, {}); + } +} diff --git a/packages/renderer/src/metadata/data-service/metadata-data-service.ts b/packages/renderer/src/metadata/data-service/metadata-data-service.ts index b49b22a5e3594b60c8bbd0066f0b5647c90e47cf..c5d70c47250c8ab23086c11ec7d275a3f8eae1d8 100644 --- a/packages/renderer/src/metadata/data-service/metadata-data-service.ts +++ b/packages/renderer/src/metadata/data-service/metadata-data-service.ts @@ -10,13 +10,13 @@ import { DEFAULT_LOCALE } from "@farris/devkit-vue"; export class MetadataDataService { constructor( - private formMetadataDataService: FormMetadataDataService, - private stateMachineMetadataDataService: StateMachineMetadataDataService, - private webCommandMetadataDataService: CommonWebCommandMetadataDataService, - private customWebComponentMetadataDataService: CustomWebComponentMetadataDataService, - private customWebCommandMetadataDataService: CustomWebCommandMetadataDataService, - private resourceMetadataDataService: ResourceMetadataDataService, - private languageListManager: LanguageListManager + public formMetadataDataService: FormMetadataDataService, + public stateMachineMetadataDataService: StateMachineMetadataDataService, + public webCommandMetadataDataService: CommonWebCommandMetadataDataService, + public customWebComponentMetadataDataService: CustomWebComponentMetadataDataService, + public customWebCommandMetadataDataService: CustomWebCommandMetadataDataService, + public resourceMetadataDataService: ResourceMetadataDataService, + public languageListManager: LanguageListManager ) { } /** diff --git a/packages/renderer/src/metadata/data-service/providers.ts b/packages/renderer/src/metadata/data-service/providers.ts index c036eb76f969aac56ef869791cd3437836da948f..0f42a681330046b5e843800ddd9d471b5e5a677c 100644 --- a/packages/renderer/src/metadata/data-service/providers.ts +++ b/packages/renderer/src/metadata/data-service/providers.ts @@ -10,12 +10,18 @@ import { CustomWebComponentMetadataDataService } from "./custom-web-component-me import { CustomWebCommandMetadataDataService } from "./custom-web-command-metadata-data-service"; import { LanguageListManager } from "../../i18n"; +import { BaMetadataRepository } from "../ba-matadata/repository/ba-metadata-repository"; +import { BaMetadataDataService } from "../ba-matadata/data-service/ba-metadata-data-service"; +import { BaMetadataDataServiceImpl } from "../ba-matadata/data-service/metadata-data-service-extend"; + export const metadataDataServiceProviders: StaticProvider[] = [ { provide: FormMetadataDataService, useClass: FormMetadataDataService, deps: [MetadataRepository] }, + { provide: BaMetadataDataService, useClass: BaMetadataDataService, deps: [BaMetadataRepository] }, { provide: StateMachineMetadataDataService, useClass: StateMachineMetadataDataService, deps: [MetadataRepository] }, { provide: CommonWebCommandMetadataDataService, useClass: CommonWebCommandMetadataDataService, deps: [MetadataRepository] }, { provide: ResourceMetadataDataService, useClass: ResourceMetadataDataService, deps: [MetadataRepository] }, { provide: CustomWebComponentMetadataDataService, useClass: CustomWebComponentMetadataDataService, deps: [MetadataRepository] }, { provide: CustomWebCommandMetadataDataService, useClass: CustomWebCommandMetadataDataService, deps: [MetadataRepository] }, - { provide: MetadataDataService, useClass: MetadataDataService, deps: [FormMetadataDataService, StateMachineMetadataDataService, CommonWebCommandMetadataDataService, CustomWebComponentMetadataDataService, CustomWebCommandMetadataDataService, ResourceMetadataDataService, LanguageListManager] } + { provide: MetadataDataService, useClass: MetadataDataService, deps: [FormMetadataDataService, StateMachineMetadataDataService, CommonWebCommandMetadataDataService, CustomWebComponentMetadataDataService, CustomWebCommandMetadataDataService, ResourceMetadataDataService, LanguageListManager] }, + { provide: BaMetadataDataServiceImpl, useClass: BaMetadataDataServiceImpl, deps: [BaMetadataDataService, FormMetadataDataService, StateMachineMetadataDataService, CommonWebCommandMetadataDataService, CustomWebComponentMetadataDataService, CustomWebCommandMetadataDataService, ResourceMetadataDataService, LanguageListManager] } ]; diff --git a/packages/renderer/src/metadata/providers.ts b/packages/renderer/src/metadata/providers.ts index 32adb6095312216e3114bc19d288152a05dae97e..0db3d770a3d49eb579ccc52659a7290de5f09f83 100644 --- a/packages/renderer/src/metadata/providers.ts +++ b/packages/renderer/src/metadata/providers.ts @@ -4,10 +4,13 @@ import { metadataDataServiceProviders, MetadataDataService } from "./data-servic import { MetadataManager } from './metadata-manager'; import { MetadataLoader } from './metadata-loader'; import { LocaleQuery } from "../i18n"; +import { BaMetadataLoader } from "./ba-matadata/ba-metadata-loader"; +import { BaMetadataDataServiceImpl } from "./ba-matadata/data-service/metadata-data-service-extend"; export const metadataProviders: StaticProvider[] = [ ...metadataRepositoryProviders, ...metadataDataServiceProviders, { provide: MetadataManager, useClass: MetadataManager, deps: [] }, - { provide: MetadataLoader, useClass: MetadataLoader, deps: [MetadataDataService, MetadataManager, LocaleQuery] } + { provide: MetadataLoader, useClass: MetadataLoader, deps: [MetadataDataService, MetadataManager, LocaleQuery] }, + { provide: BaMetadataLoader, useClass: BaMetadataLoader, deps: [BaMetadataDataServiceImpl, MetadataManager, LocaleQuery] } ]; diff --git a/packages/renderer/src/metadata/repository/providers.ts b/packages/renderer/src/metadata/repository/providers.ts index 87a105268f3bad4bd06237f5dcc46687b2411887..1e8f3c4cfe7a72205053c9e0ca9cfc3965ce23fa 100644 --- a/packages/renderer/src/metadata/repository/providers.ts +++ b/packages/renderer/src/metadata/repository/providers.ts @@ -1,6 +1,8 @@ import { HttpClient, StaticProvider } from "@farris/devkit-vue"; import { MetadataRepository } from "./metadata-repository"; +import { BaMetadataRepository } from "../ba-matadata/repository/ba-metadata-repository"; export const metadataRepositoryProviders: StaticProvider[] = [ - { provide: MetadataRepository, useClass: MetadataRepository, deps: [HttpClient] } + { provide: MetadataRepository, useClass: MetadataRepository, deps: [HttpClient] }, + { provide: BaMetadataRepository, useClass: BaMetadataRepository, deps: [HttpClient] } ]; diff --git a/packages/renderer/src/resolvers/data-source-resolver.ts b/packages/renderer/src/resolvers/data-source-resolver.ts index 31d553b4c39b912c1f47ce83f25fdba830673c76..7dea20b0f6c86309c18af16a90b2e35bed9d8347 100644 --- a/packages/renderer/src/resolvers/data-source-resolver.ts +++ b/packages/renderer/src/resolvers/data-source-resolver.ts @@ -10,9 +10,12 @@ export class DataSourceResolver { if (entity.label === entityLabel) { return { bindingPaths: currentPath, - primaryKey: entity.type.primary + primaryKey: entity?.type?.primary || "id" // BAP: BA统一查询平台默认主键是id }; } + if (!entity.type || !entity.type.entities) { + return null; + } for (const childEntity of entity.type.entities) { const result = this.resolveEntity(childEntity, entityLabel, false); if (result) { diff --git a/packages/renderer/src/resolvers/field-resolver.ts b/packages/renderer/src/resolvers/field-resolver.ts index 3b339f933c9d3e1e4de347ef952494b61c0cc4f4..b2fad5091c929307e0d6bd4617ab7ead3a3f78a5 100644 --- a/packages/renderer/src/resolvers/field-resolver.ts +++ b/packages/renderer/src/resolvers/field-resolver.ts @@ -5,6 +5,14 @@ export class FieldResolver { return fieldInfo; } + /** + * BAP: BA统一查询平台字段解析 + */ + public static baResolve(entityMetadata: EntityMetadata, fieldId: string): ResolvedEntityField | any | null { + const fieldInfo = this.baResolveField(entityMetadata, fieldId); + return fieldInfo; + } + private static resolveField(entitySchema: Record, fieldId: string): ResolvedEntityField | null { const { fields } = entitySchema.type; for (const field of fields) { @@ -38,4 +46,25 @@ export class FieldResolver { } return null; } + + /** + * BAP: BA统一查询平台字段解析 + */ + private static baResolveField(entitySchema: Record, fieldId: string): any | null { + const { columns } = entitySchema; + for (const col of columns) { + if (col.columnName === fieldId) { + return { + id: col.columnName, + bindingPath: col.columnName, + required: true, + readonly: false, + multiLanguage: false, + label: col.columnName, + dataSource: entitySchema.label + }; + } + } + } + } diff --git a/packages/renderer/src/resolvers/model-value-resolver.ts b/packages/renderer/src/resolvers/model-value-resolver.ts index 3bc44e684383ebe6059ed3d896a490c05f2edffc..0522be0c6eb2066318546a676a3ac99f0c0ef4e2 100644 --- a/packages/renderer/src/resolvers/model-value-resolver.ts +++ b/packages/renderer/src/resolvers/model-value-resolver.ts @@ -1,4 +1,4 @@ -import { Injector, Module } from "@farris/devkit-vue"; +import { DEVKIT_TYPE_TOKEN, Injector, Module } from "@farris/devkit-vue"; import { FormMetadataService } from "../service"; import { DataSourceResolver } from "./data-source-resolver"; import { FieldResolver } from "./field-resolver"; @@ -81,13 +81,14 @@ export class ModelValueResolver { public resolveBindingValue(viewSchema: Record): any | null { const { binding } = viewSchema; const { field } = binding; - const resolvedField = FieldResolver.resolve(this.entityMetadata, field); + const devkitType = this.module.getDevkitType(); + const resolvedField = devkitType === "BA" ? FieldResolver.baResolve(this.getEntityMetadata(binding.dataSource), binding.path) : FieldResolver.resolve(this.entityMetadata, field); if (!resolvedField) { console.warn(`Invalid field: ${field}`); return null; } const { dataSource, bindingPath } = resolvedField; - const resolvedEntity = DataSourceResolver.resolve(this.entityMetadata, dataSource); + const resolvedEntity = devkitType === "BA" ? DataSourceResolver.resolve(this.getEntityMetadata(dataSource), dataSource) : DataSourceResolver.resolve(this.entityMetadata, dataSource); if (!resolvedEntity) { console.warn(`Invalid entity dataSource: ${dataSource}`); return null; @@ -97,10 +98,14 @@ export class ModelValueResolver { const fieldBindingPath = bindingPaths.concat(...fieldBindingPaths).join('/'); let value = null; try { - value = this.entityStore?.getValueByPath('/' + fieldBindingPath); - const pipe = this.pipeRegistry.getPipe(viewSchema); - if (pipe) { - value = pipe.transform(value, viewSchema); + if (devkitType === "BA") { + value = this.module.getEntityStore(`${dataSource}${ENTITY_STORE_SUFFIX}`)?.getValueByPath('/' + fieldBindingPath); + } else { + value = this.entityStore?.getValueByPath('/' + fieldBindingPath); + const pipe = this.pipeRegistry.getPipe(viewSchema); + if (pipe) { + value = pipe.transform(value, viewSchema); + } } } catch (e) { @@ -116,13 +121,19 @@ export class ModelValueResolver { */ public resolveDataSourceValue(viewSchema: Record): any[] | null { const { dataSource } = viewSchema; - const resolvedEntity = DataSourceResolver.resolve(this.entityMetadata, dataSource); + // BAP: BA统一查询平台有多个entityStore,默认潜规则通过使用元数据entity节点的编号来获取entityMetadata + const resolvedEntity = this.module.getDevkitType() === "BA" ? DataSourceResolver.resolve(this.getEntityMetadata(dataSource), dataSource) : DataSourceResolver.resolve(this.entityMetadata, dataSource); if (!resolvedEntity) { console.warn(`Invalid entity dataSource: ${dataSource}`); return null; } const { bindingPaths } = resolvedEntity; - const entityList = this.entityStore?.getEntityListByPath('/' + bindingPaths.join('/')); + let entityList; + if (this.module.getDevkitType() === "BA") { + entityList = this.module.getEntityStore(`${dataSource}${ENTITY_STORE_SUFFIX}`)?.getEntityListByPath('/' + bindingPaths.join('/')); + } else { + entityList = this.entityStore?.getEntityListByPath('/' + bindingPaths.join('/')); + } const value: any[] = entityList?.toJSON() || []; return value; } @@ -142,6 +153,12 @@ export class ModelValueResolver { return this.formMetadataService.getEntity(); } + /** + * 实体元数据 + */ + private getEntityMetadata(id: string) { + return this.formMetadataService.getEntityById(id); + } private get pipeRegistry() { return this.injector.get(PipeRegistry); } diff --git a/packages/renderer/src/router.ts b/packages/renderer/src/router.ts index 4c7ad5572a70569ac3fd3bcac1df0e60a541de01..5842672ff23b80f38ec3219ae8182b071b755c26 100644 --- a/packages/renderer/src/router.ts +++ b/packages/renderer/src/router.ts @@ -2,6 +2,7 @@ import { createRouter, createWebHashHistory } from 'vue-router'; import PreviewView from './preview.vue'; import DebugView from './debug.vue'; import RendererView from './renderer.vue'; +import BaRenderer from './barenderer.vue'; const router = createRouter({ history: createWebHashHistory(), @@ -20,6 +21,11 @@ const router = createRouter({ path: '/', name: 'renderer', component: RendererView + }, + { + path: '/barenderer', + name: 'barenderer', + component: BaRenderer } ] }); diff --git a/packages/renderer/src/service/entity-schema-query.ts b/packages/renderer/src/service/entity-schema-query.ts index 89dfc171db87f285ef9667bbbe4210a8077459c6..a8679c43385fbb0046cc7f641737c4524cc5a5fc 100644 --- a/packages/renderer/src/service/entity-schema-query.ts +++ b/packages/renderer/src/service/entity-schema-query.ts @@ -39,11 +39,19 @@ class EntitySchemaQuery { /** * 实体Schema查询服务 */ - constructor(formModule:any) { - this.rootEntitySchema = formModule.entity[0].entities[0]; + constructor(formModule: any) { this.labelAndEntitySchemaMap = new Map(); this.idAndFieldSchemaMap = new Map(); - this.collectEntitySchema(this.rootEntitySchema, null); + if (formModule && formModule.entity && formModule.entity.length && formModule.entity[0].entities && formModule.entity[0].entities.length) { + this.rootEntitySchema = formModule.entity[0].entities[0]; + this.collectEntitySchema(this.rootEntitySchema, null); + } else { + // BAP: BA统一查询平台支持多个entity + if (formModule && formModule.entity && formModule.entity.length) { + this.rootEntitySchema = formModule.entity; + this.collectBaEntitySchema(this.rootEntitySchema, null); + } + } } /** @@ -68,6 +76,31 @@ class EntitySchemaQuery { return this.idAndFieldSchemaMap.get(id); } + private collectBaEntitySchema(entitySchemas: any, wrappedParentEntitySchema: any) { + entitySchemas.forEach((entitySchema: any) => { + const bindingPath = this.getEntityBindingPath(wrappedParentEntitySchema, entitySchema); + const wrappedEntitySchema = { + entitySchema, + bindingPath, + wrappedParentEntitySchema, + }; + this.labelAndEntitySchemaMap.set(entitySchema.code, wrappedEntitySchema); + this.collectBaFieldSchemas(entitySchema.columns, wrappedEntitySchema); + }); + } + + private collectBaFieldSchemas(fieldSchemas: any[], wrappedEntitySchema: any) { + fieldSchemas.forEach((fieldSchema: any) => { + this.collectBaFieldSchema(fieldSchema, wrappedEntitySchema); + }); + } + + private collectBaFieldSchema(fieldSchema: any, wrappedEntitySchema: any) { + const bindingPath = this.getFieldBindingPath(wrappedEntitySchema, fieldSchema); + const wrappedFieldSchema = { bindingPath, fieldSchema }; + this.idAndFieldSchemaMap.set(fieldSchema.id, wrappedFieldSchema); + } + /** * 搜集所有实体信息 */ @@ -146,7 +179,7 @@ class EntitySchemaQuery { */ private getFieldBindingPath(wrappedEntitySchema: any, fieldSchema: any): string { const entityBindingPath = wrappedEntitySchema.bindingPath; - const shortBindingPath = fieldSchema.bindingPath.split('.').join('/'); + const shortBindingPath = (fieldSchema.bindingPath ? fieldSchema.bindingPath : fieldSchema.columnName).split('.').join('/'); if (entityBindingPath === '/') { return `/${shortBindingPath}`; diff --git a/packages/renderer/src/service/form-metadata-service.ts b/packages/renderer/src/service/form-metadata-service.ts index b4d2c4cec6d2769631cbb6e8a6b2319ecf3bf9ce..886010951df7c762bbec8f9d47d61a1962dbfef0 100644 --- a/packages/renderer/src/service/form-metadata-service.ts +++ b/packages/renderer/src/service/form-metadata-service.ts @@ -1,12 +1,21 @@ +import { Injector } from "@farris/devkit-vue"; import { ComponentMetadata, EntityMetadata, FormMetadata, MetadataType, ViewModelMetadata } from "../types"; +import { FORM_METADATA_TOKEN } from "../tokens"; export class FormMetadataService { private metadataMap: Map = new Map(); - constructor(private metadata: FormMetadata) { + constructor(private metadata: FormMetadata, private injector: Injector) { const components = this.metadata?.module?.components || []; this.traverseComponent(components); } + + public refreshMetadata(metadata: any) { + const components = metadata?.module?.components || []; + this.metadata = metadata; + this.traverseComponent(components); + } + public getModuleId(): string { return this.metadata.module.id; } @@ -35,6 +44,15 @@ export class FormMetadataService { return this.metadata?.module?.entity[0]?.entities[0] || {} as any; } + /** + * BAP: BA统一查询平台新增通过id获取实体元数据方法 + * @param id + * @returns + */ + public getEntityById(id: string): EntityMetadata { + return this.metadata?.module?.entity?.find((el: any) => el.code === id) || {} as any; + } + public getFrameComponent(): ComponentMetadata | null { const { components } = this.metadata?.module || {}; if (!components || components.length < 1) { @@ -80,11 +98,16 @@ export class FormMetadataService { private traverseComponent(components: any[], parentId?: string) { components.forEach((component) => { if (component?.id) { - this.metadataMap.set(component.id, { - schema: component, - type: component.type, - parentId - }); + this.metadataMap.set(component.id, + Object.assign( + this.metadataMap.get(component.id) ? this.metadataMap.get(component.id) : {}, + { + schema: component, + type: component.type, + parentId + } + ) + ); } if (component.contents) { this.traverseComponent(component.contents, component.id); diff --git a/packages/renderer/src/service/providers.ts b/packages/renderer/src/service/providers.ts index bd8dfa5b2f4520702b53c2f71fbdf5a86810cdc9..1a42c82ddc826a94c8c17da9ee6c918c3b50b164 100644 --- a/packages/renderer/src/service/providers.ts +++ b/packages/renderer/src/service/providers.ts @@ -5,6 +5,6 @@ import { ComponentService } from "./component-service"; import { FORM_METADATA_TOKEN } from "../tokens"; export const serviceProviders: StaticProvider[] = [ - { provide: FormMetadataService, useClass: FormMetadataService, deps: [FORM_METADATA_TOKEN] }, + { provide: FormMetadataService, useClass: FormMetadataService, deps: [FORM_METADATA_TOKEN, Injector] }, { provide: ComponentService, useClass: ComponentService, deps: [Injector] } ]; diff --git a/packages/renderer/src/types.ts b/packages/renderer/src/types.ts index 629959b48de252f127bdcccabc62d3497e1d7fd6..93df1656fd40bf9939f71c1ad20fed01bc91a457 100644 --- a/packages/renderer/src/types.ts +++ b/packages/renderer/src/types.ts @@ -268,6 +268,8 @@ export interface ViewEvent { } export const ENTITY_STORE_SUFFIX = '-entitystore'; +export const UI_STORE_SUFFIX = '-uistore'; +export const REPOSITORY_SUFFIX = '-repository'; export interface RuleMetadata { id: string; type: ExpressionType; diff --git a/packages/ui-binding/lib/compositions/index.ts b/packages/ui-binding/lib/compositions/index.ts index 85df2f0022f4939351f63f4ba845965c3e6645e4..ae59aa1098a68aeb40f7d5adafd2a23b0d9a6961 100644 --- a/packages/ui-binding/lib/compositions/index.ts +++ b/packages/ui-binding/lib/compositions/index.ts @@ -9,6 +9,8 @@ export * from './use-entity-path'; export * from './use-command-executor'; export * from './use-entity-state-change'; export * from './use-form-group-binding'; +export * from './use-ba-binding'; +export * from './use-ba-combo-box-binding'; export * from './use-list-view-binding'; export * from './use-calendar-binding'; export * from './use-discussion-binding'; diff --git a/packages/ui-binding/lib/compositions/use-ba-binding.ts b/packages/ui-binding/lib/compositions/use-ba-binding.ts new file mode 100644 index 0000000000000000000000000000000000000000..98f8b111b20c4d9578d1f797bc54f395170811b9 --- /dev/null +++ b/packages/ui-binding/lib/compositions/use-ba-binding.ts @@ -0,0 +1,80 @@ +import { ref } from 'vue'; +import { EntityChange, EntityChangeType, Entity, EntitySchema, EntityFieldSchema, AppendEntityChange, ViewModelState, ViewModel, EntityPathNode, EntityPathNodeType, ChangeValueChange, RemoveEntityChange, EntityPath, EntityStore, ExpressionResult, BA_DATA_TRANSFORMATION_SERVICE_TOKEN } from '@farris/devkit-vue'; +import { BindingOptions, ElementRef, UseDataGridBinding } from '../types'; +import { useElementRef } from './use-element-ref'; +import { useEntityPath } from './use-entity-path'; + +export const changeCache = new Map(); +export function useBaBinding(elementRef: ElementRef, options: BindingOptions) { + const componentRef = useElementRef(elementRef); + const viewModel: ViewModel = options.viewModel; + const expressionResult = viewModel.getInjector().get(ExpressionResult); + const dataTransformationService: any = viewModel.getInjector().get(BA_DATA_TRANSFORMATION_SERVICE_TOKEN); + const { multiSelect, viewSchema, module } = options; + const pagination = ref(); + const data = ref(); + /** + * 渲染表格数据 + */ + function render(change: EntityChange | any) { + const bindingPath = `/`; + if (change.type === EntityChangeType.ValueChange || change.type === EntityChangeType.Update) { + } else { + const changePath = change && change.path.toShortPath(); + if (!(changePath === bindingPath || bindingPath.startsWith(changePath))) { + return; + } + } + let datas: Record[] | undefined = []; + const entityStoreKey = viewSchema["dataSource"] + "-entitystore"; + const entityStore = viewModel.getModule().getEntityStore(entityStoreKey); + if (viewSchema["dataSource"] && entityStore) { + datas = entityStore.getEntityListByPath(options.entityPath).toJSON(); + data.value = datas; + if (datas && datas.length) { + const newDatas = dataTransformationService.dataTransformation(viewModel, viewSchema, datas); + if (newDatas && newDatas.length) { + datas = [...newDatas]; + } + } + } + if (change.type === EntityChangeType.Load) { + if (viewSchema["dataSource"] && change["dataSource"] && change["dataSource"] === viewSchema["dataSource"]) { + const pagnaition = entityStore?.getPaginationByPath("/") as any; + const result: any = { + datas: datas, + totalRowCount: 0 + }; + if (pagnaition && pagnaition["totalCount"]) { + result["totalRowCount"] = pagnaition["totalCount"]; + } + componentRef?.value?.refresh(result); + } + } else if (change.type === EntityChangeType.Append) { + + } else if (change.type === EntityChangeType.CurrentChange) { + + } else if (change.type === EntityChangeType.Remove) { + + } else if (change.type === EntityChangeType.ValueChange) { + + } else if (change.type === EntityChangeType.Update) { + + } + }; + + const entityStoreKey = viewSchema["dataSource"] + "-entitystore"; + if (viewSchema["dataSource"] && viewModel.getModule().getEntityStore(entityStoreKey)) { + const cacheKey = viewSchema["dataSource"] + viewSchema["id"]; + if (!changeCache.has(cacheKey) || changeCache.get(cacheKey) !== componentRef) { + viewModel.getModule().watchChange((change: any) => { + render(change); + }); + changeCache.set(cacheKey, componentRef); + } + } + return { + data, + pagination + }; +} \ No newline at end of file diff --git a/packages/ui-binding/lib/compositions/use-ba-combo-box-binding.ts b/packages/ui-binding/lib/compositions/use-ba-combo-box-binding.ts new file mode 100644 index 0000000000000000000000000000000000000000..da003cf92b388bd89e75c44c6d5a71f1c29cae79 --- /dev/null +++ b/packages/ui-binding/lib/compositions/use-ba-combo-box-binding.ts @@ -0,0 +1,45 @@ +import { EntityChange, EntityChangeType, ViewModelState, ViewModel } from '@farris/devkit-vue'; +import { BindingOptions, ElementRef } from '../types'; +import { useElementRef } from './use-element-ref'; + +export const valueChangeCache = new Map(); +export function useBaComboBoxBinding(elementRef: ElementRef, options: BindingOptions) { + const componentRef = useElementRef(elementRef); + const viewModel: ViewModel = options.viewModel; + // const actionExecutor = useActionExecutor(viewModel); + const { multiSelect, viewSchema, module } = options; + + function valueChange(change: EntityChange | any, key: string, viewSchema: any) { + if (change.type === EntityChangeType.ValueChange || change.type === EntityChangeType.Update) { + const binding = viewSchema?.binding ?? {}; + if (binding["dataSource"] === change.dataSource && binding["path"] === change?.path?.getLastNode()?.nodeValue) { + const changeObject = { + dataSource: change.dataSource, + newValue: change.newValue, + oldValue: change.oldValue, + status: change.status, + type: change.type, + path: change?.path?.getLastNode()?.getNodeValue() ?? "" + } + const command: any = { + name: "TriggerFieldLinkage1", + params: [{ + name: "change", + value: "{EVENTPARAM~/payload/change}" + }], + eventParams: { payload: { change: JSON.stringify(changeObject) } } + } + viewModel.dispatch(command); + } + } + } + + const binding = viewSchema?.binding ?? {}; + const cacheKey = binding["dataSource"] + binding["path"]; + if (!valueChangeCache.has(cacheKey) || valueChangeCache.get(cacheKey) !== componentRef) { + viewModel.getModule().watchChange((change: any) => { + valueChange(change, "", viewSchema); + }); + valueChangeCache.set(cacheKey, componentRef); + } +} \ No newline at end of file diff --git a/packages/ui-binding/lib/compositions/use-entity-path.ts b/packages/ui-binding/lib/compositions/use-entity-path.ts index 775b0980eeb125d9fe3c67893dbb6e86629c3380..f92eaa575cd84e60f251fb1ea7c683556ae97483 100644 --- a/packages/ui-binding/lib/compositions/use-entity-path.ts +++ b/packages/ui-binding/lib/compositions/use-entity-path.ts @@ -4,7 +4,7 @@ export function useEntityPath(viewModel: ViewModel, entityPath: const path = viewModel.entityStore?.createPath(entityPath || '/', isEntityListPath); function toShortPath(): string[] | null { if (path) { - return path.toShortPath().split('/').filter((item)=> item); + return path.toShortPath().split('/').filter((item:any)=> item); } return null; } diff --git a/packages/ui-binding/lib/compositions/use-parent-tree-builder.ts b/packages/ui-binding/lib/compositions/use-parent-tree-builder.ts index 4df15fbd02316aeb8a89bdf29b0b4d8fa389577c..88256fa26118bca04f3317f89b15d17da1f106be 100644 --- a/packages/ui-binding/lib/compositions/use-parent-tree-builder.ts +++ b/packages/ui-binding/lib/compositions/use-parent-tree-builder.ts @@ -12,7 +12,7 @@ export function useParentTreeBuilder(hierarchyKey: string, viewModel: ViewModel< function build(expandNodeIds: string[] = []): TreeBuildResult { const entities = viewModel.entityStore?.getEntitiesByPath(entityPath) || []; const treeNodes: TreeNode[] = []; - entities.forEach(item => buildTreeNode(item, treeNodes, expandNodeIds)); + entities.forEach((item:any) => buildTreeNode(item, treeNodes, expandNodeIds)); const rootId = getRootId(treeNodes); return { rootId, data: treeNodes }; } diff --git a/packages/ui-binding/lib/compositions/use-path-tree-builder.ts b/packages/ui-binding/lib/compositions/use-path-tree-builder.ts index 2dda670cf1746875b17d7f55d69cd5cdaa32e821..83080da37ac72cd83493b36109345879f79bc558 100644 --- a/packages/ui-binding/lib/compositions/use-path-tree-builder.ts +++ b/packages/ui-binding/lib/compositions/use-path-tree-builder.ts @@ -10,7 +10,7 @@ export function usePathTreeBuilder(hierarchyKey: string, viewModel: ViewModel { + entities.forEach((nodeData:any) => { const hierarchyInfo = getHierarchyInfo(nodeData); const key = `level${hierarchyInfo.layer}`; if (levels[key]) { @@ -23,7 +23,7 @@ export function usePathTreeBuilder(hierarchyKey: string, viewModel: ViewModel buildTreeNode(item, treeNodes, expandNodeIds)); + entities.forEach((item:any) => buildTreeNode(item, treeNodes, expandNodeIds)); const rootId = getRootId(treeNodes); return { rootId, data: treeNodes }; } diff --git a/packages/ui-binding/lib/compositions/use-tree-grid-binding.ts b/packages/ui-binding/lib/compositions/use-tree-grid-binding.ts index e7828392ba98eff911d81158412512563fad6876..c4dd62eb4cd557a8a5de9c0736979a9a9dd4be0a 100644 --- a/packages/ui-binding/lib/compositions/use-tree-grid-binding.ts +++ b/packages/ui-binding/lib/compositions/use-tree-grid-binding.ts @@ -34,7 +34,7 @@ export function useTreeGridBinding(elementRef: ElementRef, options: TreeBuilderB * 渲染数据 */ function render(change: EntityChange) { - const entityPaths = entityPath?.toShortPath().split('/').filter((item) => item);; + const entityPaths = entityPath?.toShortPath().split('/').filter((item:any) => item);; const bindingPath = `/${entityPaths?.join('/')}`; if (change.type === EntityChangeType.ValueChange || change.type === EntityChangeType.Update) { const changePaths = change.path.clone(); @@ -191,7 +191,7 @@ export function useTreeGridBinding(elementRef: ElementRef, options: TreeBuilderB }; } function getCurrentEntityId() { - const entityPaths = entityPath?.toShortPath().split('/').filter((item) => item);; + const entityPaths = entityPath?.toShortPath().split('/').filter((item:any) => item);; const bindingPath = `/${entityPaths?.join('/')}`; const currentEntity = viewModel.entityStore?.getCurrentEntityByPath(bindingPath); const id = currentEntity?.idValue; diff --git a/packages/ui-binding/lib/types.ts b/packages/ui-binding/lib/types.ts index d78b55f120c9bd643ab8f547dbd817a646a38e70..188f937e6254f897f7120bc1dc688e23779ea6db 100644 --- a/packages/ui-binding/lib/types.ts +++ b/packages/ui-binding/lib/types.ts @@ -28,6 +28,7 @@ export interface BindingOptions { viewModel: ViewModel; entityPath: string | EntityPath; multiSelect?: boolean; + [key: string]: any; } export interface TreeBuilderBindingOptions extends BindingOptions { diff --git a/packages/ui-binding/rollup.config.js b/packages/ui-binding/rollup.config.js index a2ef2472ee96c46482f8d6594184dc8d21c4d7d3..3307af19316cd893fc9e3c80b6a74d5c4d589600 100644 --- a/packages/ui-binding/rollup.config.js +++ b/packages/ui-binding/rollup.config.js @@ -59,11 +59,11 @@ export default { template: "sunburst", filename: process.cwd() + `/dist-rollup/@farris/ui-binding-vue.html`, }), - terser({ - keep_fnames: true, - format: { - comments: /^!/ - } - }) + // terser({ + // keep_fnames: true, + // format: { + // comments: /^!/ + // } + // }) ], }; diff --git a/packages/ui-vue/components/components.ts b/packages/ui-vue/components/components.ts index 909fe6220e7d51514fd7df2ffc9d3b04bf23d1b1..72c01afa650b7f7733d1eea5f6b916de9e44ad5b 100644 --- a/packages/ui-vue/components/components.ts +++ b/packages/ui-vue/components/components.ts @@ -115,6 +115,7 @@ export { default as FPropertyEditor } from './property-editor'; export { default as MenuLookupContainer } from './menu-lookup/src/components/modal-container.component'; export { useMenuTreeGridCoordinator } from './menu-lookup/src/composition/use-tree-grid-coordinator'; export { default as FLookup } from './lookup'; +export * from './dynamic-view/src/components/maps'; export { default as FImage } from './image'; export type { ImageProps } from './image'; export { default as FComment } from './comment'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1cb27960fdf203fe495d52716dcd220f489d2d37..0fc3f369057026e09e17bb57ecc0ec517bf90ded 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,7 +9,7 @@ importers: .: dependencies: '@eslint/js': - specifier: ^9.31.0 + specifier: ^9.32.0 version: 9.32.0 axios: specifier: ^1.11.0 @@ -30,8 +30,8 @@ importers: specifier: ^4.0.0 version: 4.0.0 ts-jest: - specifier: ^29.4.0 - version: 29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.23.1)(jest-util@29.7.0)(jest@29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)))(typescript@5.8.3) + specifier: ^29.4.1 + version: 29.4.1(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.23.1)(jest-util@29.7.0)(jest@29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)))(typescript@5.9.2) typescript-eslint: specifier: ^8.37.0 version: 8.38.0(eslint@9.38.0(jiti@2.5.1))(typescript@5.8.3) @@ -53,7 +53,7 @@ importers: version: 2.29.5 '@commitlint/cli': specifier: ^19.8.1 - version: 19.8.1(@types/node@18.19.120)(typescript@5.8.3) + version: 19.8.1(@types/node@18.19.121)(typescript@5.9.2) '@commitlint/config-conventional': specifier: ^19.8.1 version: 19.8.1 @@ -71,13 +71,13 @@ importers: version: 2.3.1 '@rollup/plugin-babel': specifier: ^6.0.4 - version: 6.0.4(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.45.1) + version: 6.0.4(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.46.2) '@rollup/plugin-node-resolve': specifier: ^15.3.1 - version: 15.3.1(rollup@4.45.1) + version: 15.3.1(rollup@4.46.2) '@testing-library/vue': specifier: ^8.1.0 - version: 8.1.0(@vue/compiler-sfc@3.5.18)(vue@3.5.18(typescript@5.8.3)) + version: 8.1.0(@vue/compiler-sfc@3.5.18)(vue@3.5.18(typescript@5.9.2)) '@types/crypto-js': specifier: ^4.2.2 version: 4.2.2 @@ -103,8 +103,8 @@ importers: specifier: ^4.17.12 version: 4.17.12 '@types/node': - specifier: ^18.19.119 - version: 18.19.120 + specifier: ^18.19.121 + version: 18.19.121 '@types/urlencode': specifier: ^1.1.4 version: 1.1.4 @@ -116,15 +116,15 @@ importers: version: 7.18.0(eslint@9.38.0(jiti@2.5.1))(typescript@5.8.3) '@vitejs/plugin-vue': specifier: ^5.2.4 - version: 5.2.4(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0))(vue@3.5.18(typescript@5.8.3)) + version: 5.2.4(vite@5.4.19(@types/node@18.19.121)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0))(vue@3.5.18(typescript@5.9.2)) '@vitejs/plugin-vue-jsx': specifier: ^4.2.0 - version: 4.2.0(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0))(vue@3.5.18(typescript@5.8.3)) + version: 4.2.0(vite@5.4.19(@types/node@18.19.121)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0))(vue@3.5.18(typescript@5.9.2)) '@vue/babel-plugin-jsx': specifier: ^1.4.0 version: 1.4.0(@babel/core@7.28.0) '@vue/compiler-sfc': - specifier: ^3.5.17 + specifier: ^3.5.18 version: 3.5.18 '@vue/test-utils': specifier: ^2.4.6 @@ -148,8 +148,8 @@ importers: specifier: 4.0.0-beta.0 version: 4.0.0-beta.0 chalk: - specifier: ^5.4.1 - version: 5.4.1 + specifier: ^5.5.0 + version: 5.5.0 clean-css-cli: specifier: ^5.6.3 version: 5.6.3 @@ -160,7 +160,7 @@ importers: specifier: ^1.10.3 version: 1.10.3 compression: - specifier: ^1.8.0 + specifier: ^1.8.1 version: 1.8.1 conventional-changelog-cli: specifier: ^5.0.0 @@ -199,8 +199,8 @@ importers: specifier: ^4.21.2 version: 4.21.2 fs-extra: - specifier: ^11.3.0 - version: 11.3.0 + specifier: ^11.3.1 + version: 11.3.1 happy-dom: specifier: ^14.12.3 version: 14.12.3 @@ -218,7 +218,7 @@ importers: version: 0.12.2 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)) + version: 29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -244,11 +244,11 @@ importers: specifier: ^0.0.1 version: 0.0.1 rollup: - specifier: ^4.45.1 - version: 4.45.1 + specifier: ^4.46.2 + version: 4.46.2 sass: - specifier: ^1.89.2 - version: 1.89.2 + specifier: ^1.90.0 + version: 1.90.0 shelljs: specifier: ^0.8.5 version: 0.8.5 @@ -256,53 +256,144 @@ importers: specifier: ^0.11.1 version: 0.11.1 stylelint: - specifier: ^16.21.1 - version: 16.22.0(typescript@5.8.3) + specifier: ^16.23.0 + version: 16.23.0(typescript@5.9.2) stylelint-config-recommended-scss: specifier: ^14.1.0 - version: 14.1.0(postcss@8.4.47)(stylelint@16.22.0(typescript@5.8.3)) + version: 14.1.0(postcss@8.5.6)(stylelint@16.23.0(typescript@5.9.2)) stylelint-config-standard: specifier: ^36.0.1 - version: 36.0.1(stylelint@16.22.0(typescript@5.8.3)) + version: 36.0.1(stylelint@16.23.0(typescript@5.9.2)) stylelint-order: specifier: ^6.0.4 - version: 6.0.4(stylelint@16.22.0(typescript@5.8.3)) + version: 6.0.4(stylelint@16.23.0(typescript@5.9.2)) stylelint-scss: specifier: ^6.12.1 - version: 6.12.1(stylelint@16.22.0(typescript@5.8.3)) + version: 6.12.1(stylelint@16.23.0(typescript@5.9.2)) ts-node: specifier: ~10.9.2 - version: 10.9.2(@types/node@18.19.120)(typescript@5.8.3) + version: 10.9.2(@types/node@18.19.121)(typescript@5.9.2) typescript: - specifier: ^5.8.3 - version: 5.8.3 + specifier: ^5.9.2 + version: 5.9.2 urlencode: specifier: ^2.0.0 version: 2.0.0 vite: specifier: ^5.4.19 - version: 5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0) + version: 5.4.19(@types/node@18.19.121)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0) vite-plugin-dts: specifier: 3.9.1 - version: 3.9.1(@types/node@18.19.120)(rollup@4.45.1)(typescript@5.8.3)(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0)) + version: 3.9.1(@types/node@18.19.121)(rollup@4.46.2)(typescript@5.9.2)(vite@5.4.19(@types/node@18.19.121)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0)) vite-plugin-md: specifier: ^0.21.5 version: 0.21.5(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.9(@types/node@18.19.57)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) vite-svg-loader: specifier: ^5.1.0 - version: 5.1.0(vue@3.5.18(typescript@5.8.3)) + version: 5.1.0(vue@3.5.18(typescript@5.9.2)) vitepress: specifier: ^1.6.3 version: 1.6.3(@algolia/client-search@5.34.1)(@types/node@18.19.120)(async-validator@4.2.5)(axios@1.12.2)(postcss@8.4.47)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass-embedded@1.80.3)(sass@1.89.2)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.8.3) vitepress-theme-demoblock: specifier: 1.4.2 - version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.89.2)(typescript@5.8.3) + version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.90.0)(typescript@5.9.2) vitest: specifier: ^1.6.1 - version: 1.6.1(@types/node@18.19.120)(happy-dom@14.12.3)(jsdom@20.0.3)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0) + version: 1.6.1(@types/node@18.19.121)(happy-dom@14.12.3)(jsdom@20.0.3)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0) vue-tsc: specifier: ^2.2.12 - version: 2.2.12(typescript@5.8.3) + version: 2.2.12(typescript@5.9.2) + + packages/ba-command-services: + dependencies: + '@farris/bef-vue': + specifier: workspace:^ + version: link:../bef + '@farris/charts-vue': + specifier: workspace:^ + version: link:../charts-vue + '@farris/devkit-vue': + specifier: workspace:^ + version: link:../devkit + '@farris/ui-vue': + specifier: workspace:^ + version: link:../ui-vue + axios: + specifier: ^1.7.2 + version: 1.11.0 + lodash: + specifier: ^4.17.21 + version: 4.17.21 + moment: + specifier: 2.29.1 + version: 2.29.1 + vue: + specifier: ^3.4.37 + version: 3.5.18(typescript@5.9.2) + vue-router: + specifier: ^4.3.0 + version: 4.4.5(vue@3.5.18(typescript@5.9.2)) + devDependencies: + '@babel/cli': + specifier: ^7.25.7 + version: 7.25.9(@babel/core@7.28.0) + '@babel/core': + specifier: ^7.25.8 + version: 7.28.0 + '@babel/preset-env': + specifier: ^7.25.8 + version: 7.28.0(@babel/core@7.28.0) + '@farris/cli': + specifier: workspace:* + version: link:../cli + '@rollup/plugin-babel': + specifier: ^6.0.4 + version: 6.0.4(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.46.2) + '@rollup/plugin-commonjs': + specifier: ^28.0.1 + version: 28.0.1(rollup@4.46.2) + '@rollup/plugin-json': + specifier: ^6.1.0 + version: 6.1.0(rollup@4.46.2) + '@rollup/plugin-node-resolve': + specifier: ^15.2.3 + version: 15.3.1(rollup@4.46.2) + '@rollup/plugin-terser': + specifier: ^0.4.4 + version: 0.4.4(rollup@4.46.2) + '@vitejs/plugin-vue': + specifier: ^5.1.2 + version: 5.2.4(vite@5.4.19(@types/node@24.2.0)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0))(vue@3.5.18(typescript@5.9.2)) + core-js: + specifier: ^3.38.1 + version: 3.39.0 + rollup: + specifier: ^4.24.0 + version: 4.46.2 + rollup-plugin-typescript2: + specifier: ^0.36.0 + version: 0.36.0(rollup@4.46.2)(typescript@5.9.2) + rollup-plugin-visualizer: + specifier: ^5.12.0 + version: 5.12.0(rollup@4.46.2) + rollup-plugin-vue: + specifier: ^6.0.0 + version: 6.0.0(@vue/compiler-sfc@3.5.18) + tslib: + specifier: ^2.7.0 + version: 2.8.1 + typescript: + specifier: ^5.5.3 + version: 5.9.2 + vite: + specifier: ^5.4.1 + version: 5.4.19(@types/node@24.2.0)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0) + vite-plugin-dts: + specifier: ^2.1.0 + version: 2.3.0(@types/node@24.2.0)(rollup@4.46.2)(vite@5.4.19(@types/node@24.2.0)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0)) + vue-tsc: + specifier: ^2.0.29 + version: 2.2.12(typescript@5.9.2) packages/bef: dependencies: @@ -475,9 +566,15 @@ importers: packages/charts-vue: dependencies: - '@docsearch/js': - specifier: 3.6.0 - version: 3.6.0(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) + '@emotion/css': + specifier: ^11.13.5 + version: 11.13.5 + '@farris/mobile-ui-vue': + specifier: 0.0.1-beta.3 + version: 0.0.1-beta.3(typescript@5.6.3) + '@farris/ui-vue': + specifier: workspace:^ + version: link:../ui-vue '@types/lodash-es': specifier: ^4.17.4 version: 4.17.12 @@ -517,9 +614,9 @@ importers: vue: specifier: ^3.2.37 version: 3.5.12(typescript@5.6.3) - vue3-grid-layout: - specifier: ^1.0.0 - version: 1.0.0(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27)(typescript@5.6.3) + vue3-grid-layout-ts: + specifier: 0.0.1 + version: 0.0.1(typescript@5.6.3) devDependencies: '@babel/parser': specifier: ^7.19.0 @@ -626,6 +723,9 @@ importers: vite-plugin-banner: specifier: ^0.8.0 version: 0.8.0 + vite-plugin-libcss: + specifier: 1.1.2 + version: 1.1.2(vite@5.4.9(@types/node@24.2.0)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) vite-plugin-md: specifier: ^0.21.5 version: 0.21.5(@vitejs/plugin-vue@4.6.2(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) @@ -1004,7 +1104,7 @@ importers: version: 7.28.0 '@commitlint/cli': specifier: ^19.3.0 - version: 19.5.0(@types/node@20.5.1)(typescript@4.9.5) + version: 19.5.0(@types/node@24.2.0)(typescript@4.9.5) '@commitlint/config-conventional': specifier: ^19.2.0 version: 19.5.0 @@ -1073,7 +1173,7 @@ importers: version: 9.3.7 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) + version: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)) ora: specifier: ^6.1.2 version: 6.3.1 @@ -1103,7 +1203,7 @@ importers: version: 4.0.0 vitepress: specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@algolia/client-search@5.34.1)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.8(@algolia/client-search@5.35.0)(@types/node@24.2.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -1330,7 +1430,7 @@ importers: version: 2.1.1(vite@5.4.19(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/babel-plugin-jsx': specifier: ^1.1.1 - version: 1.2.5(@babel/core@7.25.8) + version: 1.2.5(@babel/core@7.28.0) eslint: specifier: ^9.19.0 version: 9.38.0(jiti@2.5.1) @@ -1372,7 +1472,7 @@ importers: version: 5.12.0(rollup@4.24.0) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.5.1)(typescript@5.6.3) + version: 10.9.2(@types/node@24.2.0)(typescript@5.6.3) tslib: specifier: ^2.7.0 version: 2.8.0 @@ -1409,7 +1509,7 @@ importers: version: 7.28.0 '@commitlint/cli': specifier: ^19.3.0 - version: 19.5.0(@types/node@20.5.1)(typescript@4.9.5) + version: 19.5.0(@types/node@24.2.0)(typescript@4.9.5) '@commitlint/config-conventional': specifier: ^19.2.0 version: 19.5.0 @@ -1478,7 +1578,7 @@ importers: version: 9.3.7 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) + version: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)) ora: specifier: ^6.1.2 version: 6.3.1 @@ -1508,7 +1608,7 @@ importers: version: 4.0.0 vitepress: specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@algolia/client-search@5.34.1)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.8(@algolia/client-search@5.35.0)(@types/node@24.2.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -1615,19 +1715,19 @@ importers: version: 17.8.1 '@rollup/plugin-babel': specifier: ^6.0.4 - version: 6.0.4(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.45.1) + version: 6.0.4(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.46.2) '@rollup/plugin-commonjs': specifier: ^28.0.1 - version: 28.0.1(rollup@4.45.1) + version: 28.0.1(rollup@4.46.2) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.45.1) + version: 6.1.0(rollup@4.46.2) '@rollup/plugin-node-resolve': specifier: ^15.2.3 - version: 15.3.0(rollup@4.45.1) + version: 15.3.0(rollup@4.46.2) '@rollup/plugin-terser': specifier: ^0.4.4 - version: 0.4.4(rollup@4.45.1) + version: 0.4.4(rollup@4.46.2) '@testing-library/vue': specifier: ^7.0.0 version: 7.0.0(@vue/compiler-sfc@3.5.12)(vue@3.5.12(typescript@4.9.5)) @@ -1684,7 +1784,7 @@ importers: version: 9.3.7 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) + version: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -1696,10 +1796,10 @@ importers: version: 0.0.1 rollup-plugin-typescript2: specifier: ^0.36.0 - version: 0.36.0(rollup@4.45.1)(typescript@4.9.5) + version: 0.36.0(rollup@4.46.2)(typescript@4.9.5) rollup-plugin-visualizer: specifier: ^5.12.0 - version: 5.12.0(rollup@4.45.1) + version: 5.12.0(rollup@4.46.2) rollup-plugin-vue: specifier: ^6.0.0 version: 6.0.0(@vue/compiler-sfc@3.5.12) @@ -1729,7 +1829,7 @@ importers: version: 4.0.0 vitepress: specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@algolia/client-search@5.34.1)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.8(@algolia/client-search@5.35.0)(@types/node@24.2.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -1814,7 +1914,7 @@ importers: version: 9.29.1(eslint@9.38.0(jiti@2.5.1)) jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) + version: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)) prettier: specifier: ^3.2.5 version: 3.5.3 @@ -1847,7 +1947,7 @@ importers: version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) vitest: specifier: ^0.29.2 - version: 0.29.8(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0) + version: 0.29.8(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0) vue-tsc: specifier: ^1.2.0 version: 1.8.27(typescript@4.9.5) @@ -1869,7 +1969,7 @@ importers: version: 17.8.1 '@docsearch/js': specifier: 3.6.0 - version: 3.6.0(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) + version: 3.6.0(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) '@farris/cli': specifier: workspace:* version: link:../cli @@ -1911,7 +2011,7 @@ importers: version: 2.2.2 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) + version: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)) patch-vue-directive-ssr: specifier: ^0.0.1 version: 0.0.1 @@ -1923,13 +2023,13 @@ importers: version: 4.9.5 vitepress: specifier: 1.0.0-alpha.10 - version: 1.0.0-alpha.10(@algolia/client-search@5.34.1)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.89.2)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.10(@algolia/client-search@5.35.0)(@types/node@24.2.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.90.0)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 - version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.89.2)(typescript@4.9.5) + version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.90.0)(typescript@4.9.5) vitest: specifier: ^0.29.2 - version: 0.29.8(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0) + version: 0.29.8(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0) vue-router: specifier: ^4.3.0 version: 4.4.5(vue@3.5.12(typescript@4.9.5)) @@ -1942,6 +2042,9 @@ importers: '@farris/bef-vue': specifier: workspace:^ version: link:../bef + '@farris/charts-vue': + specifier: workspace:^ + version: link:../charts-vue '@farris/command-services-vue': specifier: workspace:^ version: link:../command-services @@ -2083,7 +2186,7 @@ importers: version: 9.3.7 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) + version: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)) ora: specifier: ^6.1.2 version: 6.3.1 @@ -2116,7 +2219,7 @@ importers: version: 4.0.0 vitepress: specifier: 1.0.0-alpha.8 - version: 1.0.0-alpha.8(@algolia/client-search@5.34.1)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) + version: 1.0.0-alpha.8(@algolia/client-search@5.35.0)(@types/node@24.2.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) @@ -2346,7 +2449,7 @@ importers: version: 9.3.7 jest: specifier: ^29.0.0 - version: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + version: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3)) ora: specifier: ^6.1.2 version: 6.3.1 @@ -2376,7 +2479,7 @@ importers: version: 5.1.0(vue@3.5.12(typescript@5.6.3)) vitepress: specifier: ^1.0.0-alpha.8 - version: 1.0.0-alpha.10(@algolia/client-search@5.34.1)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3) + version: 1.0.0-alpha.10(@algolia/client-search@5.35.0)(@types/node@24.2.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3) vitepress-theme-demoblock: specifier: 1.4.2 version: 1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@5.6.3) @@ -2389,6 +2492,10 @@ importers: packages: + '@algolia/abtesting@1.1.0': + resolution: {integrity: sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==} + engines: {node: '>= 14.0.0'} + '@algolia/autocomplete-core@1.17.7': resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} @@ -2432,100 +2539,145 @@ packages: '@algolia/cache-browser-local-storage@4.24.0': resolution: {integrity: sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==} + '@algolia/cache-browser-local-storage@4.25.2': + resolution: {integrity: sha512-tA1rqAafI+gUdewjZwyTsZVxesl22MTgLWRKt1+TBiL26NiKx7SjRqTI3pzm8ngx1ftM5LSgXkVIgk2+SRgPTg==} + '@algolia/cache-common@4.24.0': resolution: {integrity: sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==} + '@algolia/cache-common@4.25.2': + resolution: {integrity: sha512-E+aZwwwmhvZXsRA1+8DhH2JJIwugBzHivASTnoq7bmv0nmForLyH7rMG5cOTiDK36DDLnKq1rMGzxWZZ70KZag==} + '@algolia/cache-in-memory@4.24.0': resolution: {integrity: sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==} - '@algolia/client-abtesting@5.34.1': - resolution: {integrity: sha512-M4zb6J7q+pg9V9Xk0k1WDgvupfCtXcxjKGTrNVYemiredLVGOmvVIPAUjg2rx4QmK7DWNApWLsieYwk7PAaOXw==} + '@algolia/cache-in-memory@4.25.2': + resolution: {integrity: sha512-KYcenhfPKgR+WJ6IEwKVEFMKKCWLZdnYuw08+3Pn1cxAXbJcTIKjoYgEXzEW6gJmDaau2l55qNrZo6MBbX7+sw==} + + '@algolia/client-abtesting@5.35.0': + resolution: {integrity: sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==} engines: {node: '>= 14.0.0'} '@algolia/client-account@4.24.0': resolution: {integrity: sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==} + '@algolia/client-account@4.25.2': + resolution: {integrity: sha512-IfRGhBxvjli9mdexrCxX2N4XT9NBN3tvZK5zCaL8zkDcgsthiM9WPvGIZS/pl/FuXB7hA0lE5kqOzsQDP6OmGQ==} + '@algolia/client-analytics@4.24.0': resolution: {integrity: sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==} - '@algolia/client-analytics@5.34.1': - resolution: {integrity: sha512-h18zlL+bVUlbNE92olo1d/r6HQPkxhmP7yCpA1osERwpgC6F058kWm0O0aYdrHJIHtWBcs9aRqq7IkQSkpjPJg==} + '@algolia/client-analytics@4.25.2': + resolution: {integrity: sha512-4Yxxhxh+XjXY8zPyo+h6tQuyoJWDBn8E3YLr8j+YAEy5p+r3/5Tp+ANvQ+hNaQXbwZpyf5d4ViYOBjJ8+bWNEg==} + + '@algolia/client-analytics@5.35.0': + resolution: {integrity: sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==} engines: {node: '>= 14.0.0'} '@algolia/client-common@4.24.0': resolution: {integrity: sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==} - '@algolia/client-common@5.34.1': - resolution: {integrity: sha512-otPWALs72KvmVuP0CN0DI6sqVx1jQWKi+/DgAiP8DysVMgiNlva3GDKTtAK6XVGlT08f4h32FNuL0yQODuCfKA==} + '@algolia/client-common@4.25.2': + resolution: {integrity: sha512-HXX8vbJPYW29P18GxciiwaDpQid6UhpPP9nW9WE181uGUgFhyP5zaEkYWf9oYBrjMubrGwXi5YEzJOz6Oa4faA==} + + '@algolia/client-common@5.35.0': + resolution: {integrity: sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.34.1': - resolution: {integrity: sha512-SNDb5wuEpQFM6S5Shk2iytLMusvGycm9uTuYh7cGa1h3U7O65OjjjIgQ0lLY5HPybHNtmXr4Zh/EZ23pZvAJHg==} + '@algolia/client-insights@5.35.0': + resolution: {integrity: sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==} engines: {node: '>= 14.0.0'} '@algolia/client-personalization@4.24.0': resolution: {integrity: sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==} - '@algolia/client-personalization@5.34.1': - resolution: {integrity: sha512-T8z9KqYJOup83Hw0mgICYWfJoLh//FNWbf4roFd95ZJzZ4v1cN/hvr7Eqml1qWMoCkJb4y/XQjrXsJ6Y9XnMLw==} + '@algolia/client-personalization@4.25.2': + resolution: {integrity: sha512-K81PRaHF77mHv2u8foWTHnIf5c+QNf/SnKNM7rB8JPi7TMYi4E5o2mFbgdU1ovd8eg9YMOEAuLkl1Nz1vbM3zQ==} + + '@algolia/client-personalization@5.35.0': + resolution: {integrity: sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.34.1': - resolution: {integrity: sha512-YA0kC4CwO1mc1dliNgbFgToweRa7Uihjz3izEaV4cXninF1v4SaOrPkQUsiFPprAffjMzOUoT7vahQZ/HZyiKQ==} + '@algolia/client-query-suggestions@5.35.0': + resolution: {integrity: sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==} engines: {node: '>= 14.0.0'} '@algolia/client-search@4.24.0': resolution: {integrity: sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==} - '@algolia/client-search@5.34.1': - resolution: {integrity: sha512-bt5hC9vvjaKvdvsgzfXJ42Sl3qjQqoi/FD8V7HOQgtNFhwSauZOlgLwFoUiw67sM+r7ehF7QDk5WRDgY7fAkIg==} + '@algolia/client-search@4.25.2': + resolution: {integrity: sha512-pO/LpVnQlbJpcHRk+AroWyyFnh01eOlO6/uLZRUmYvr/hpKZKxI6n7ufgTawbo0KrAu2CePfiOkStYOmDuRjzQ==} + + '@algolia/client-search@5.35.0': + resolution: {integrity: sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.34.1': - resolution: {integrity: sha512-QLxiBskQxFGzPqKZvBNEvNN95kgDCbBd2X29ZGfh6Sr2QOSU34US6Z9x2duiF4o9FwsB0i6eQ2c9vHfuH0lAQg==} + '@algolia/ingestion@1.35.0': + resolution: {integrity: sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==} engines: {node: '>= 14.0.0'} '@algolia/logger-common@4.24.0': resolution: {integrity: sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==} + '@algolia/logger-common@4.25.2': + resolution: {integrity: sha512-aUXpcodoIpLPsnVc2OHgC9E156R7yXWLW2l+Zn24Cyepfq3IvmuVckBvJDpp7nPnXkEzeMuvnVxQfQsk+zP/BA==} + '@algolia/logger-console@4.24.0': resolution: {integrity: sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==} - '@algolia/monitoring@1.34.1': - resolution: {integrity: sha512-NteCvWcWXXdnPGyZH8rXHslcf2pM1WGDNMGNZFXLFtOt1Gf1Tjy2t0NZLp+Mxap3JMV4mbYmactbXrvpQf/lLA==} + '@algolia/logger-console@4.25.2': + resolution: {integrity: sha512-H3Y+UB0Ty0htvMJ6zDSufhFTSDlg3Pyj3AXilfDdDRcvfhH4C/cJNVm+CTaGORxL5uKABGsBp+SZjsEMTyAunQ==} + + '@algolia/monitoring@1.35.0': + resolution: {integrity: sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==} engines: {node: '>= 14.0.0'} '@algolia/recommend@4.24.0': resolution: {integrity: sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==} - '@algolia/recommend@5.34.1': - resolution: {integrity: sha512-UdgDSrunLIBAAAxQlYLXYLnYFN4wkzkrAYx+wMLEk/pzASWyza3BkecbUFVqoYOBIgwo7Mt4iymzVtFkzL2uCQ==} + '@algolia/recommend@4.25.2': + resolution: {integrity: sha512-puRrGeXwAuVa4mLdvXvmxHRFz9MkcCOLPcjz7MjU4NihlpIa+lZYgikJ7z0SUAaYgd6l5Bh00hXiU/OlX5ffXQ==} + + '@algolia/recommend@5.35.0': + resolution: {integrity: sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==} engines: {node: '>= 14.0.0'} '@algolia/requester-browser-xhr@4.24.0': resolution: {integrity: sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==} - '@algolia/requester-browser-xhr@5.34.1': - resolution: {integrity: sha512-567LfFTc9VOiPtuySQohoqaWMeohYWbXK71aMSin+SLMgeKX7hz5LrVmkmMQj9udwWK6/mtHEYZGPYHSuXpLQg==} + '@algolia/requester-browser-xhr@4.25.2': + resolution: {integrity: sha512-aAjfsI0AjWgXLh/xr9eoR8/9HekBkIER3bxGoBf9d1XWMMoTo/q92Da2fewkxwLE6mla95QJ9suJGOtMOewXXQ==} + + '@algolia/requester-browser-xhr@5.35.0': + resolution: {integrity: sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==} engines: {node: '>= 14.0.0'} '@algolia/requester-common@4.24.0': resolution: {integrity: sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==} - '@algolia/requester-fetch@5.34.1': - resolution: {integrity: sha512-YRbygPgGBEik5U593JvyjgxFjcsyZMR25eIQxNHvSQumdAzt5A4E4Idw3yXnwhrmMdjML54ZXT7EAjnTjWy8Xw==} + '@algolia/requester-common@4.25.2': + resolution: {integrity: sha512-Q4wC3sgY0UFjV3Rb3icRLTpPB5/M44A8IxzJHM9PNeK1T3iX7X/fmz7ATUYQYZTpwHCYATlsQKWiTpql1hHjVg==} + + '@algolia/requester-fetch@5.35.0': + resolution: {integrity: sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==} engines: {node: '>= 14.0.0'} '@algolia/requester-node-http@4.24.0': resolution: {integrity: sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==} - '@algolia/requester-node-http@5.34.1': - resolution: {integrity: sha512-o0mqRYbS82Rt4DE02Od7RL6pNtV7oSxScPuIw8LW4aqO2V5eCF05Pry/SnUgcI/Vb2QCYC66hytBCqzyC/toZA==} + '@algolia/requester-node-http@4.25.2': + resolution: {integrity: sha512-Ja/FYB7W9ZM+m8UrMIlawNUAKpncvb9Mo+D8Jq5WepGTUyQ9CBYLsjwxv9O8wbj3TSWqTInf4uUBJ2FKR8G7xw==} + + '@algolia/requester-node-http@5.35.0': + resolution: {integrity: sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==} engines: {node: '>= 14.0.0'} '@algolia/transporter@4.24.0': resolution: {integrity: sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==} + '@algolia/transporter@4.25.2': + resolution: {integrity: sha512-yw3RLHWc6V+pbdsFtq8b6T5bJqLDqnfKWS7nac1Vzcmgvs/V/Lfy7/6iOF9XRilu5aBDOBHoP1SOeIDghguzWw==} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -3620,6 +3772,10 @@ packages: resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.28.2': + resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} + engines: {node: '>=6.9.0'} + '@babel/template@7.25.7': resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==} engines: {node: '>=6.9.0'} @@ -3650,8 +3806,8 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@bufbuild/protobuf@2.2.0': - resolution: {integrity: sha512-+imAQkHf7U/Rwvu0wk1XWgsP3WnpCWmK7B48f0XqSNzgk64+grljTKC7pnO/xBiEMUziF7vKRfbBnOQhg126qQ==} + '@bufbuild/protobuf@2.6.3': + resolution: {integrity: sha512-w/gJKME9mYN7ZoUAmSMAWXk4hkVpxRKvEJCb3dV5g9wwWdxTJJ0ayOJAVcNxtdqaxDyFuC0uz4RSGVacJ030PQ==} '@changesets/apply-release-plan@7.0.12': resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} @@ -4069,6 +4225,36 @@ packages: '@eggjs/yauzl@2.11.0': resolution: {integrity: sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==} + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + + '@emotion/css@11.13.5': + resolution: {integrity: sha512-wQdD0Xhkn3Qy2VNcIzbLP9MR8TafI0MJb7BEAXKp+w4+XqErksWR4OXomuDzPsN4InLdGhVe6EYcn2ZIUCpB8w==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -4513,10 +4699,6 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.1': - resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -4684,14 +4866,14 @@ packages: resolution: {integrity: sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==} engines: {node: '>=10.13.0'} - '@iconify-json/simple-icons@1.2.44': - resolution: {integrity: sha512-CdWgSPygwDlDbKtDWjvi3NtUefnkoepXv90n3dQxJerqzD9kI+nEJOiWUBM+eOyMYQKtxBpLWFBrgeotF0IZKw==} + '@iconify-json/simple-icons@1.2.46': + resolution: {integrity: sha512-MJfKQDhOMQD5Fc8PcTtCdFX0oBf/nKVfp69ScdEKIXW0JXELX5V2Ld45EsjShi8aJ6DNhdDtSDZvKuDnkDiKnw==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@inquirer/figures@1.0.7': - resolution: {integrity: sha512-m+Trk77mp54Zma6xLkLuY+mvanPxlE4A7yNKs2HBiyZ4UkVs28Mv5c/pgWrHeInx+USHeX/WEPzjrWrcJiQgjw==} + '@inquirer/figures@1.0.13': + resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} engines: {node: '>=18'} '@interactjs/actions@1.10.27': @@ -4722,48 +4904,23 @@ packages: '@interactjs/modifiers': 1.10.27 '@interactjs/utils': 1.10.27 - '@interactjs/inertia@1.10.27': - resolution: {integrity: sha512-S/SVj/M0D+wWWPVXHcXN/YUWOK51LFJsEA+CTgVnFhlSU04+1FUvNLwilCZcHgECu1RJxZNKDwZysDATg+r8jQ==} - peerDependencies: - '@interactjs/core': 1.10.27 - '@interactjs/modifiers': 1.10.27 - '@interactjs/utils': 1.10.27 - '@interactjs/interact@1.10.27': resolution: {integrity: sha512-XdH3A2UUzjEFGGJgFuJlhiz99tE8jB8xNh/DmnoMuL6uOQPxNA+sWRnzEVjG0+zY2P3/dbhEpi4Cn3FLPzydwA==} - '@interactjs/interactjs@1.10.27': - resolution: {integrity: sha512-UwhfUZMZVXUY72efPABuKSBz1sUY+r+49v8t6Ku9o5Jq76AKg9mwmdGszIlOn3ppnFDDjvtzK/8TL+Sbd0EQEA==} - '@interactjs/modifiers@1.10.27': resolution: {integrity: sha512-ei/qfoQ+9/8k6WzNzdNqHI6cWkIV576N4Ap16r5CoqOWwhA6Xzj3OMHf1g0t1O4eSq2HdJsVJn3eLNfw9HsbeQ==} peerDependencies: '@interactjs/core': 1.10.27 '@interactjs/utils': 1.10.27 - '@interactjs/offset@1.10.27': - resolution: {integrity: sha512-AezsLiuK+Qv4jXdYuRa65HJ2pMFMZPlqiAep6ZRLwhP9HE7O75c0EAm+gfx+dpPrHNHs6J9LaiKSZl+B+A2qAw==} - peerDependencies: - '@interactjs/core': 1.10.27 - '@interactjs/utils': 1.10.27 - - '@interactjs/pointer-events@1.10.27': - resolution: {integrity: sha512-Yo5SS6PhWfC93gHNxnwwW0wvebo5hSYJKGaSnAHO4f9Lh25yibecMnmPBmiEfWVcdMboK/kXrme43mHQaRegVg==} - peerDependencies: - '@interactjs/core': 1.10.27 - '@interactjs/utils': 1.10.27 - - '@interactjs/reflow@1.10.27': - resolution: {integrity: sha512-Msm0QdYFr40oSsPFxyCR3dHN/pQx34k7QSkdN1uIsUn/drrm+YSFvrvVOu99DFOwr7gTThr5vNe06Sz4vubTSA==} - peerDependencies: - '@interactjs/core': 1.10.27 - '@interactjs/utils': 1.10.27 - '@interactjs/snappers@1.10.27': resolution: {integrity: sha512-HZLZ0XSi6HI08OmTv/HKG6AltQoaKAALLQ+KDW92utj3XSgw7oren0KsWUKPhaPg3Av7R1jFQd08s+uafqIlLw==} peerDependencies: '@interactjs/utils': 1.10.27 + '@interactjs/types@1.10.27': + resolution: {integrity: sha512-BUdv0cvs4H5ODuwft2Xp4eL8Vmi3LcihK42z0Ft/FbVJZoRioBsxH+LlsBdK4tAie7PqlKGy+1oyOncu1nQ6eA==} + '@interactjs/utils@1.10.27': resolution: {integrity: sha512-+qfLOio2OxQqg1cXSnRaCl+N8MQDQLDS9w+aOGxH8YLAhIMyt7Asxx/46//sT8orgsi16pmlBPtngPHT9s8zKw==} @@ -4890,6 +5047,9 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} @@ -4976,24 +5136,48 @@ packages: cpu: [arm64] os: [android] + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + '@parcel/watcher-darwin-arm64@2.4.1': resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + '@parcel/watcher-darwin-x64@2.4.1': resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + '@parcel/watcher-freebsd-x64@2.4.1': resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + '@parcel/watcher-linux-arm-glibc@2.4.1': resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} engines: {node: '>= 10.0.0'} @@ -5001,6 +5185,20 @@ packages: os: [linux] libc: [glibc] + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + '@parcel/watcher-linux-arm64-glibc@2.4.1': resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} engines: {node: '>= 10.0.0'} @@ -5008,6 +5206,13 @@ packages: os: [linux] libc: [glibc] + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@parcel/watcher-linux-arm64-musl@2.4.1': resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} engines: {node: '>= 10.0.0'} @@ -5015,6 +5220,13 @@ packages: os: [linux] libc: [musl] + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + '@parcel/watcher-linux-x64-glibc@2.4.1': resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} engines: {node: '>= 10.0.0'} @@ -5022,6 +5234,13 @@ packages: os: [linux] libc: [glibc] + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + '@parcel/watcher-linux-x64-musl@2.4.1': resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} engines: {node: '>= 10.0.0'} @@ -5029,28 +5248,57 @@ packages: os: [linux] libc: [musl] + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + '@parcel/watcher-win32-arm64@2.4.1': resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + '@parcel/watcher-win32-ia32@2.4.1': resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + '@parcel/watcher-win32-x64@2.4.1': resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + '@parcel/watcher@2.4.1': resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} engines: {node: '>= 10.0.0'} + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -5066,11 +5314,11 @@ packages: '@polka/url@0.5.0': resolution: {integrity: sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==} - '@polka/url@1.0.0-next.28': - resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@rolldown/pluginutils@1.0.0-beta.29': - resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} + '@rolldown/pluginutils@1.0.0-beta.31': + resolution: {integrity: sha512-IaDZ9NhjOIOkYtm+hH0GX33h3iVZ2OeSUnFF0+7Z4+1GuKs4Kj5wK3+I2zNV9IPLfqV4XlwWif8SXrZNutxciQ==} '@rollup/plugin-babel@6.0.4': resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} @@ -5143,13 +5391,22 @@ packages: rollup: optional: true + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.24.0': resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm-eabi@4.45.1': - resolution: {integrity: sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==} + '@rollup/rollup-android-arm-eabi@4.46.2': + resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} cpu: [arm] os: [android] @@ -5158,8 +5415,8 @@ packages: cpu: [arm64] os: [android] - '@rollup/rollup-android-arm64@4.45.1': - resolution: {integrity: sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==} + '@rollup/rollup-android-arm64@4.46.2': + resolution: {integrity: sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ==} cpu: [arm64] os: [android] @@ -5168,8 +5425,8 @@ packages: cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-arm64@4.45.1': - resolution: {integrity: sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==} + '@rollup/rollup-darwin-arm64@4.46.2': + resolution: {integrity: sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ==} cpu: [arm64] os: [darwin] @@ -5178,18 +5435,18 @@ packages: cpu: [x64] os: [darwin] - '@rollup/rollup-darwin-x64@4.45.1': - resolution: {integrity: sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==} + '@rollup/rollup-darwin-x64@4.46.2': + resolution: {integrity: sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.45.1': - resolution: {integrity: sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==} + '@rollup/rollup-freebsd-arm64@4.46.2': + resolution: {integrity: sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.45.1': - resolution: {integrity: sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==} + '@rollup/rollup-freebsd-x64@4.46.2': + resolution: {integrity: sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw==} cpu: [x64] os: [freebsd] @@ -5199,8 +5456,8 @@ packages: os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': - resolution: {integrity: sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==} + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': + resolution: {integrity: sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA==} cpu: [arm] os: [linux] libc: [glibc] @@ -5211,8 +5468,8 @@ packages: os: [linux] libc: [musl] - '@rollup/rollup-linux-arm-musleabihf@4.45.1': - resolution: {integrity: sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==} + '@rollup/rollup-linux-arm-musleabihf@4.46.2': + resolution: {integrity: sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ==} cpu: [arm] os: [linux] libc: [musl] @@ -5223,8 +5480,8 @@ packages: os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-gnu@4.45.1': - resolution: {integrity: sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==} + '@rollup/rollup-linux-arm64-gnu@4.46.2': + resolution: {integrity: sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng==} cpu: [arm64] os: [linux] libc: [glibc] @@ -5235,14 +5492,14 @@ packages: os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-musl@4.45.1': - resolution: {integrity: sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==} + '@rollup/rollup-linux-arm64-musl@4.46.2': + resolution: {integrity: sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': - resolution: {integrity: sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==} + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': + resolution: {integrity: sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA==} cpu: [loong64] os: [linux] libc: [glibc] @@ -5253,8 +5510,8 @@ packages: os: [linux] libc: [glibc] - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': - resolution: {integrity: sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==} + '@rollup/rollup-linux-ppc64-gnu@4.46.2': + resolution: {integrity: sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw==} cpu: [ppc64] os: [linux] libc: [glibc] @@ -5265,14 +5522,14 @@ packages: os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.45.1': - resolution: {integrity: sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==} + '@rollup/rollup-linux-riscv64-gnu@4.46.2': + resolution: {integrity: sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.45.1': - resolution: {integrity: sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==} + '@rollup/rollup-linux-riscv64-musl@4.46.2': + resolution: {integrity: sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw==} cpu: [riscv64] os: [linux] libc: [musl] @@ -5283,8 +5540,8 @@ packages: os: [linux] libc: [glibc] - '@rollup/rollup-linux-s390x-gnu@4.45.1': - resolution: {integrity: sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==} + '@rollup/rollup-linux-s390x-gnu@4.46.2': + resolution: {integrity: sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA==} cpu: [s390x] os: [linux] libc: [glibc] @@ -5295,8 +5552,8 @@ packages: os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.45.1': - resolution: {integrity: sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==} + '@rollup/rollup-linux-x64-gnu@4.46.2': + resolution: {integrity: sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA==} cpu: [x64] os: [linux] libc: [glibc] @@ -5307,8 +5564,8 @@ packages: os: [linux] libc: [musl] - '@rollup/rollup-linux-x64-musl@4.45.1': - resolution: {integrity: sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==} + '@rollup/rollup-linux-x64-musl@4.46.2': + resolution: {integrity: sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA==} cpu: [x64] os: [linux] libc: [musl] @@ -5318,8 +5575,8 @@ packages: cpu: [arm64] os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.45.1': - resolution: {integrity: sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==} + '@rollup/rollup-win32-arm64-msvc@4.46.2': + resolution: {integrity: sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g==} cpu: [arm64] os: [win32] @@ -5328,8 +5585,8 @@ packages: cpu: [ia32] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.45.1': - resolution: {integrity: sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==} + '@rollup/rollup-win32-ia32-msvc@4.46.2': + resolution: {integrity: sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ==} cpu: [ia32] os: [win32] @@ -5338,8 +5595,8 @@ packages: cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.45.1': - resolution: {integrity: sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==} + '@rollup/rollup-win32-x64-msvc@4.46.2': + resolution: {integrity: sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==} cpu: [x64] os: [win32] @@ -5515,24 +5772,32 @@ packages: '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.6': - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/chai-subset@1.3.5': resolution: {integrity: sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==} + '@types/chai-subset@1.3.6': + resolution: {integrity: sha512-m8lERkkQj+uek18hXOZuec3W/fCRTrU4hrnXjH3qhHy96ytuPaPiWGgu7sJb7tZxZonO75vYAjCvpe/e4VUwRw==} + peerDependencies: + '@types/chai': <5.2.0 + '@types/chai@4.3.20': resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} '@types/conventional-commits-parser@5.0.0': resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + '@types/conventional-commits-parser@5.0.1': + resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + '@types/crypto-js@4.2.2': resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} @@ -5635,23 +5900,26 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@18.19.120': - resolution: {integrity: sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA==} - - '@types/node@18.19.57': - resolution: {integrity: sha512-I2ioBd/IPrYDMv9UNR5NlPElOZ68QB7yY5V2EsLtSrTO0LM0PnCEFF9biLWHf5k+sIy4ohueCV9t4gk1AEdlVA==} + '@types/node@18.19.121': + resolution: {integrity: sha512-bHOrbyztmyYIi4f1R0s17QsPs1uyyYnGcXeZoGEd227oZjry0q6XQBQxd82X1I57zEfwO8h9Xo+Kl5gX1d9MwQ==} '@types/node@20.5.1': resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} + '@types/node@24.2.0': + resolution: {integrity: sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -5686,8 +5954,9 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@types/zrender@4.0.6': - resolution: {integrity: sha512-1jZ9bJn2BsfmYFPBHtl5o3uV+ILejAtGrDcYSpT4qaVKEI/0YY+arw3XHU04Ebd8Nca3SQ7uNcLaqiL+tTFVMg==} + '@types/zrender@5.0.0': + resolution: {integrity: sha512-70NLuJssk1cp5+8l18zk/z6kpcxKw4/vTbeFKh0R1TIv7/XF7+U7wkGvUOCEzIJv3Px3L1HaUM5ASP0mqKJPKQ==} + deprecated: This is a stub types definition. zrender provides its own type definitions, so you do not need this installed. '@typescript-eslint/eslint-plugin@7.18.0': resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} @@ -5700,13 +5969,13 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.38.0': - resolution: {integrity: sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==} + '@typescript-eslint/eslint-plugin@8.39.0': + resolution: {integrity: sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.38.0 + '@typescript-eslint/parser': ^8.39.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/parser@7.18.0': resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} @@ -5718,32 +5987,32 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.38.0': - resolution: {integrity: sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==} + '@typescript-eslint/parser@8.39.0': + resolution: {integrity: sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.38.0': - resolution: {integrity: sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==} + '@typescript-eslint/project-service@8.39.0': + resolution: {integrity: sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/scope-manager@7.18.0': resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.38.0': - resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} + '@typescript-eslint/scope-manager@8.39.0': + resolution: {integrity: sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.38.0': - resolution: {integrity: sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==} + '@typescript-eslint/tsconfig-utils@8.39.0': + resolution: {integrity: sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/type-utils@7.18.0': resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} @@ -5755,19 +6024,19 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.38.0': - resolution: {integrity: sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==} + '@typescript-eslint/type-utils@8.39.0': + resolution: {integrity: sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/types@7.18.0': resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.38.0': - resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} + '@typescript-eslint/types@8.39.0': + resolution: {integrity: sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@7.18.0': @@ -5779,11 +6048,11 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.38.0': - resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} + '@typescript-eslint/typescript-estree@8.39.0': + resolution: {integrity: sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/utils@7.18.0': resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} @@ -5791,19 +6060,19 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@8.38.0': - resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==} + '@typescript-eslint/utils@8.39.0': + resolution: {integrity: sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/visitor-keys@7.18.0': resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.38.0': - resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} + '@typescript-eslint/visitor-keys@8.39.0': + resolution: {integrity: sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -6222,11 +6491,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -6274,8 +6538,11 @@ packages: algoliasearch@4.24.0: resolution: {integrity: sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==} - algoliasearch@5.34.1: - resolution: {integrity: sha512-s70HlfBgswgEdmCYkUJG8i/ULYhbkk8N9+N8JsWUwszcp7eauPEr5tIX4BY0qDGeKWQ/qZvmt4mxwTusYY23sg==} + algoliasearch@4.25.2: + resolution: {integrity: sha512-lYx98L6kb1VvXypbPI7Z54C4BJB2VT5QvOYthvPq6/POufZj+YdyeZSKjoLBKHJgGmYWQTHOKtcCTdKf98WOCA==} + + algoliasearch@5.35.0: + resolution: {integrity: sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==} engines: {node: '>= 14.0.0'} alien-signals@1.0.13: @@ -6548,9 +6815,6 @@ packages: async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - async@3.2.6: - resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -6612,6 +6876,10 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + babel-plugin-polyfill-corejs2@0.4.11: resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} peerDependencies: @@ -6645,10 +6913,10 @@ packages: babel-polyfill@6.26.0: resolution: {integrity: sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==} - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0 || ^8.0.0-0 babel-preset-jest@29.6.3: resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} @@ -6739,11 +7007,11 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@1.8.5: resolution: {integrity: sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==} @@ -6883,8 +7151,8 @@ packages: caniuse-lite@1.0.30001669: resolution: {integrity: sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==} - caniuse-lite@1.0.30001727: - resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + caniuse-lite@1.0.30001731: + resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -6909,8 +7177,8 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + chalk@5.5.0: + resolution: {integrity: sha512-1tm8DTaJhPBG3bIkVeZt1iZM9GfSX2lzOeDVZH9R9ffRHpmHvxZ/QhgQH/aDTkswQVt+YHdXAdS/In/30OjCbg==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} change-case@3.1.0: @@ -6947,12 +7215,16 @@ packages: resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - cjs-module-lexer@1.4.1: - resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} class-utils@0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} @@ -7303,8 +7575,8 @@ packages: engines: {node: '>=10'} hasBin: true - conventional-changelog-writer@8.0.0: - resolution: {integrity: sha512-TQcoYGRatlAnT2qEWDON/XSfnVG38JzA7E0wcGScu7RElQBkg9WWgZd1peCWFcWDh1xfb2CfsrcvOn1bbSzztA==} + conventional-changelog-writer@8.2.0: + resolution: {integrity: sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw==} engines: {node: '>=18'} hasBin: true @@ -7339,8 +7611,8 @@ packages: engines: {node: '>=16'} hasBin: true - conventional-commits-parser@6.0.0: - resolution: {integrity: sha512-TbsINLp48XeMXR8EvGjTnKGsZqBemisPoyWESlpRyR8lif0lcwzqz+NMtYSj1ooF/WYjSuu7wX0CtdeeMEQAmA==} + conventional-commits-parser@6.2.0: + resolution: {integrity: sha512-uLnoLeIW4XaoFtH37qEcg/SXMJmKF4vi7V0H2rnPueg+VEtFGA/asSCNTcq4M/GQ6QmlzchAEtOoDTtKqWeHag==} engines: {node: '>=18'} hasBin: true @@ -7379,8 +7651,8 @@ packages: core-js-compat@3.38.1: resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} - core-js-compat@3.44.0: - resolution: {integrity: sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==} + core-js-compat@3.45.0: + resolution: {integrity: sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA==} core-js@2.6.12: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} @@ -7421,6 +7693,10 @@ packages: cosmiconfig: '>=9' typescript: '>=5' + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -7460,14 +7736,10 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + cross-spawn@6.0.6: + resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} engines: {node: '>=4.8'} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -7482,8 +7754,8 @@ packages: css-node-extract@2.1.3: resolution: {integrity: sha512-E7CzbC0I4uAs2dI8mPCVe+K37xuja5kjIugOotpwICFL7vzhmFMAPHvS/MF9gFrmv8DDUANsxrgyT/I3OLukcw==} - css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} css-selector-extract@3.3.6: resolution: {integrity: sha512-bBI8ZJKKyR9iHvxXb4t3E6WTMkis94eINopVg7y2FmmMjLXUVduD7mPEcADi4i9FX4wOypFMFpySX+0keuefxg==} @@ -7500,8 +7772,8 @@ packages: resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} css.escape@1.5.1: @@ -7631,15 +7903,15 @@ packages: resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} engines: {node: '>=10'} - decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} - dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -7790,8 +8062,8 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} dot-case@2.1.1: resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} @@ -7834,13 +8106,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true - - electron-to-chromium@1.5.191: - resolution: {integrity: sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==} + electron-to-chromium@1.5.197: + resolution: {integrity: sha512-m1xWB3g7vJ6asIFz+2pBUbq3uGmfmln1M9SSvBe4QIFWYrRHylP73zL/3nMjDmwz8V+1xAXQDfBd6+HPW0WvDQ==} electron-to-chromium@1.5.41: resolution: {integrity: sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==} @@ -7872,8 +8139,8 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} enhanced-resolve@5.17.1: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} @@ -7894,6 +8161,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -8560,15 +8831,15 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.0.3: - resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -8594,9 +8865,6 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - filename-regex@2.0.1: resolution: {integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==} engines: {node: '>=0.10.0'} @@ -8621,8 +8889,11 @@ packages: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} - find-up-simple@1.0.0: - resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} find-up@1.1.2: @@ -8684,6 +8955,15 @@ packages: focus-trap@7.6.5: resolution: {integrity: sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==} + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + follow-redirects@1.15.9: resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} engines: {node: '>=4.0'} @@ -8732,8 +9012,8 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - fp-ts@2.16.9: - resolution: {integrity: sha512-+I2+FnVB+tVaxcYyQkHUq7ZdKScaBlX53A41mxQtpIccsfyv8PzdzP7fzp2AY832T4aoK6UZ5WRX/ebGd8uZuQ==} + fp-ts@2.16.10: + resolution: {integrity: sha512-vuROzbNVfCmUkZSUbnWSltR1sbheyQbTzug7LB/46fEa1c0EucLeBaCEUE0gF3ZGUGBt9lVUiziGOhhj6K1ORA==} fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -8756,8 +9036,8 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.3.0: - resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + fs-extra@11.3.1: + resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} engines: {node: '>=14.14'} fs-extra@7.0.1: @@ -9094,6 +9374,10 @@ packages: has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -9180,8 +9464,8 @@ packages: hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - hookified@1.10.0: - resolution: {integrity: sha512-dJw0492Iddsj56U1JsSTm9E/0B/29a1AuoSLRAte8vQg/kaTGF3IgjEWT8c8yG4cC10+HisE1x5QAwR0Xwc+DA==} + hookified@1.11.0: + resolution: {integrity: sha512-aDdIN3GyU5I6wextPplYdfmWCo+aLmjjVbntmX6HLD5RCi/xKsivYEBhnRD+d9224zFf008ZpLMPlWF0ZodYZw==} hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -9270,6 +9554,10 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} @@ -9294,8 +9582,8 @@ packages: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} - index-to-position@0.1.2: - resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} + index-to-position@1.1.0: + resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==} engines: {node: '>=18'} inferred-types@0.37.6: @@ -9319,6 +9607,9 @@ packages: resolution: {integrity: sha512-LJKFHCSeIRq9hanN14IlOtPSTe3lNES7TYDTE2xxdAy1LS5rYphajK1qtwvj3YmQXvvk0U2Vbmcni8P9EIQW9w==} engines: {node: '>=18'} + interactjs@1.10.27: + resolution: {integrity: sha512-y/8RcCftGAF24gSp76X2JS3XpHiUvDQyhF8i7ujemBz77hwiHDuJzftHx7thY8cxGogwGiPJ+o97kWB6eAXnsA==} + internal-slot@1.0.7: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} @@ -9356,8 +9647,8 @@ packages: resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} engines: {node: '>= 0.10'} - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} is-array-buffer@3.0.4: @@ -9707,8 +9998,8 @@ packages: resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} engines: {node: '>= 0.4'} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} is-what@4.1.16: @@ -9774,11 +10065,6 @@ packages: resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} engines: {node: 20 || >=22} - jake@10.9.2: - resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} - engines: {node: '>=10'} - hasBin: true - jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -9936,8 +10222,8 @@ packages: jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - js-beautify@1.15.1: - resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + js-beautify@1.15.4: + resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} engines: {node: '>=14'} hasBin: true @@ -9962,6 +10248,9 @@ packages: js-tokens@9.0.0: resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -9988,8 +10277,13 @@ packages: engines: {node: '>=6'} hasBin: true - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} @@ -10048,8 +10342,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.4.0: - resolution: {integrity: sha512-TMckyVjEoacG5IteUpUrOBsFORtheqziVyyY2dLUwg1jwTb8u48LX4TgmtogkNl9Y9unaEJ1luj10fGyjMGFOQ==} + keyv@5.5.0: + resolution: {integrity: sha512-QG7qR2tijh1ftOvClut4YKKg1iW6cx3GZsKoGyJPxHkGWK9oJhG9P3j5deP0QQOGDowBMVQFaP+Vm4NpGYvmIQ==} kind-of@1.1.0: resolution: {integrity: sha512-aUH6ElPnMGon2/YkxRIigV32MOpTVcoXQ1Oo8aYn40s+sJ3j+0gFZsT8HKDcxNy7Fi9zuquWtGaGAahOdv5p/g==} @@ -10137,8 +10431,8 @@ packages: engines: {node: '>=18.12.0'} hasBin: true - listr2@8.2.5: - resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + listr2@8.3.3: + resolution: {integrity: sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==} engines: {node: '>=18.0.0'} load-json-file@1.1.0: @@ -10157,6 +10451,10 @@ packages: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} @@ -10539,8 +10837,8 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} - mime-db@1.53.0: - resolution: {integrity: sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} mime-types@2.1.35: @@ -10578,10 +10876,6 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - minimatch@7.4.6: resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} engines: {node: '>=10'} @@ -10632,6 +10926,9 @@ packages: mlly@1.7.2: resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==} + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + modify-values@1.0.1: resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} engines: {node: '>=0.10.0'} @@ -10680,8 +10977,8 @@ packages: resolution: {integrity: sha512-FrJc5AxzXSqiQNF+8CyJk6VxuKO4UVPgw32FZuFZ3X9W+JqOAQBTokZhh0ZkEqGpEOyp3z778ssmBTvdrTAdqw==} deprecated: Package no longer supported. Use at your own risk - nan@2.22.0: - resolution: {integrity: sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==} + nan@2.23.0: + resolution: {integrity: sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==} nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} @@ -10810,8 +11107,8 @@ packages: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} engines: {node: '>=0.10.0'} - nwsapi@2.2.13: - resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==} + nwsapi@2.2.21: + resolution: {integrity: sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==} object-assign@3.0.0: resolution: {integrity: sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==} @@ -11047,8 +11344,8 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@0.2.2: - resolution: {integrity: sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg==} + package-manager-detector@0.2.11: + resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} param-case@2.1.1: resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} @@ -11077,8 +11374,8 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-json@8.1.0: - resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} parse-node-version@1.0.1: @@ -11089,8 +11386,8 @@ packages: resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} engines: {node: '>=0.10.0'} - parse5@7.2.0: - resolution: {integrity: sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -11184,6 +11481,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -11207,6 +11507,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pidtree@0.3.1: resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} engines: {node: '>=0.10'} @@ -11237,8 +11541,8 @@ packages: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} pkg-dir@4.2.0: @@ -11248,6 +11552,9 @@ packages: pkg-types@1.2.1: resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + plugin-error@0.1.2: resolution: {integrity: sha512-WzZHcm4+GO34sjFMxQMqZbsz3xiNEgonCskQ9v+IroMmYgk/tas8dG+Hr2D6IbRPybZ12oWpzE/w3cGJ6FJzOw==} engines: {node: '>=0.10.0'} @@ -11271,6 +11578,10 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + postcss-media-query-parser@0.2.3: resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} @@ -11324,6 +11635,9 @@ packages: preact@10.24.3: resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} + preact@10.27.0: + resolution: {integrity: sha512-/DTYoB6mwwgPytiqQTh/7SFRL98ZdiD8Sk8zIUVOxtwq4oWcwrcd1uno9fE/zZmUaUrFNYzbH14CPebOz9tZQw==} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -11362,8 +11676,8 @@ packages: resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} engines: {node: '>= 0.8'} - prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} engines: {node: '>=6'} private@0.1.8: @@ -11393,14 +11707,14 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} pump@2.0.1: resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} pumpify@1.5.1: resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} @@ -11421,12 +11735,16 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -11543,6 +11861,10 @@ packages: resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} engines: {node: '>= 14.16.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + rechoir@0.6.2: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} @@ -11706,8 +12028,8 @@ packages: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated - resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} resolve@1.19.0: @@ -11738,8 +12060,8 @@ packages: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rfdc@1.4.1: @@ -11803,8 +12125,8 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rollup@4.45.1: - resolution: {integrity: sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==} + rollup@4.46.2: + resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -11818,6 +12140,9 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + safe-array-concat@1.1.2: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} @@ -11988,8 +12313,8 @@ packages: engines: {node: '>=14.0.0'} hasBin: true - sass@1.89.2: - resolution: {integrity: sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==} + sass@1.90.0: + resolution: {integrity: sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==} engines: {node: '>=14.0.0'} hasBin: true @@ -12089,6 +12414,10 @@ packages: shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} + engines: {node: '>= 0.4'} + shelljs@0.8.5: resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} engines: {node: '>=4'} @@ -12112,10 +12441,6 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - side-channel@1.1.0: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} @@ -12246,8 +12571,8 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.20: - resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} speakingurl@14.0.1: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} @@ -12294,6 +12619,9 @@ packages: std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + stdin-discarder@0.1.0: resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -12302,10 +12630,6 @@ packages: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -12436,6 +12760,9 @@ packages: strip-literal@2.1.0: resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + strong-type@0.1.6: resolution: {integrity: sha512-eJe5caH6Pi5oMMeQtIoBPpvNu/s4jiyb63u5tkHNnQXomK+puyQ5i+Z5iTLBr/xUz/pIcps0NSfzzFI34+gAXg==} engines: {node: '>=12.0.0'} @@ -12477,11 +12804,14 @@ packages: peerDependencies: stylelint: ^16.0.2 - stylelint@16.22.0: - resolution: {integrity: sha512-SVEMTdjKNV4ollUrIY9ordZ36zHv2/PHzPjfPMau370MlL2VYXeLgSNMMiEbLGRO8RmD2R8/BVUeF2DfnfkC0w==} + stylelint@16.23.0: + resolution: {integrity: sha512-69T5aS2LUY306ekt1Q1oaSPwz/jaG9HjyMix3UMrai1iEbuOafBe2Dh8xlyczrxFAy89qcKyZWWtc42XLx3Bbw==} engines: {node: '>=18.12.0'} hasBin: true + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + superjson@2.2.2: resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} engines: {node: '>=16'} @@ -12645,8 +12975,9 @@ packages: resolution: {integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==} engines: {node: '>=0.10.0'} - to-buffer@1.1.1: - resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==} + to-buffer@1.2.1: + resolution: {integrity: sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==} + engines: {node: '>= 0.4'} to-fast-properties@1.0.3: resolution: {integrity: sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==} @@ -12718,8 +13049,8 @@ packages: resolution: {integrity: sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==} engines: {node: '>=6'} - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -12730,8 +13061,8 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-jest@29.4.0: - resolution: {integrity: sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==} + ts-jest@29.4.1: + resolution: {integrity: sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -12786,6 +13117,9 @@ packages: tslib@2.8.0: resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -12822,10 +13156,6 @@ packages: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} - type-fest@4.26.1: - resolution: {integrity: sha512-yOGpmOAL7CkKe/91I5O3gPICmJNLJ1G4zFYVAsRHg7M64biSnPtRj0WNQt++bRkjYOqjWXrhnUw1utzmVErAdg==} - engines: {node: '>=16'} - type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} @@ -12872,12 +13202,12 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.38.0: - resolution: {integrity: sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==} + typescript-eslint@8.39.0: + resolution: {integrity: sha512-lH8FvtdtzcHJCkMOKnN73LIn6SLTpoojgJqDAxPm1jCR14eWSGPX8ul/gggBdPMk/d5+u9V854vTYQ8T5jF/1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} @@ -12894,8 +13224,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true @@ -12908,6 +13238,9 @@ packages: ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} @@ -12935,6 +13268,9 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -13090,8 +13426,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} @@ -13152,6 +13488,11 @@ packages: vite: optional: true + vite-plugin-libcss@1.1.2: + resolution: {integrity: sha512-nM1vqIibhKPvzpa6aPc8DahGcKS82cUE/Jiap6r9aIrsNno105RIDI8XnLmP1nKU8nhGb08eNrWjSOhO53c6NQ==} + peerDependencies: + vite: '*' + vite-plugin-md@0.20.6: resolution: {integrity: sha512-9KOL9B+Dc5zb9ihl0pVodtfkOkfnxo0MUXNyWBGitnHQYWldw92L8rahvTbnW7Z4P0qTjVU3G3amfR+35ZxtCw==} @@ -13292,8 +13633,8 @@ packages: resolution: {integrity: sha512-kTRN5DCagvMqr9OjylSV9/waGg0IHrxL0hBVuJoz7ykleZq2qR02n5CaiFq5QrSB/VRBGqiVsFQzet9vJsXS8g==} hasBin: true - vitepress@1.6.3: - resolution: {integrity: sha512-fCkfdOk8yRZT8GD9BFqusW3+GggWYZ/rYncOfmgcDtP3ualNHCAg+Robxp2/6xfH1WwPHtGpPwv7mbA3qomtBw==} + vitepress@1.6.4: + resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} hasBin: true peerDependencies: markdown-it-mathjax3: ^4 @@ -13397,8 +13738,11 @@ packages: vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - vue-component-type-helpers@2.1.6: - resolution: {integrity: sha512-ng11B8B/ZADUMMOsRbqv0arc442q7lifSubD0v8oDXIFoMg/mXwAPUunrroIDkY+mcD0dHKccdaznSVp8EoX3w==} + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-component-type-helpers@2.2.12: + resolution: {integrity: sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==} vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} @@ -13455,8 +13799,8 @@ packages: peerDependencies: typescript: '>=5.0.0' - vue3-grid-layout@1.0.0: - resolution: {integrity: sha512-rFiHnlBFxkY9ojh0YB+cSKCE9A9/mhdbgaPARWD7r2yHPWxV9tHDPbMAN+uycsIDF7ikBpNgeQ9PfeiGaXHUWw==} + vue3-grid-layout-ts@0.0.1: + resolution: {integrity: sha512-SpJXzRlup1RODK36cmqTF3ThXqe9gbXGZl7zVervqxEkRdHYGquuS3FhHDKGXX/lOXXqk0idVQzkAdF/wRjJDw==} vue@3.5.12: resolution: {integrity: sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==} @@ -13584,8 +13928,8 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -13620,13 +13964,12 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.6.0: - resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} - engines: {node: '>= 14'} - hasBin: true + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} engines: {node: '>= 14.6'} hasBin: true @@ -13667,6 +14010,10 @@ packages: resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + yoctocolors-cjs@2.1.2: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} @@ -13679,83 +14026,103 @@ packages: zrender@5.6.1: resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + zrender@6.0.0: + resolution: {integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1)(search-insights@2.17.2)': + '@algolia/abtesting@1.1.0': + dependencies: + '@algolia/client-common': 5.35.0 + '@algolia/requester-browser-xhr': 5.35.0 + '@algolia/requester-fetch': 5.35.0 + '@algolia/requester-node-http': 5.35.0 + + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0)(search-insights@2.17.2)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1)(search-insights@2.17.2) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0)(search-insights@2.17.2) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-core@1.9.3(@algolia/client-search@5.34.1)(algoliasearch@4.24.0)(search-insights@2.17.2)': + '@algolia/autocomplete-core@1.9.3(@algolia/client-search@5.35.0)(algoliasearch@4.24.0)(search-insights@2.17.2)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@5.34.1)(algoliasearch@4.24.0)(search-insights@2.17.2) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@5.34.1)(algoliasearch@4.24.0) + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@5.35.0)(algoliasearch@4.24.0)(search-insights@2.17.2) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@5.35.0)(algoliasearch@4.24.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1)(search-insights@2.17.2)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0)(search-insights@2.17.2)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0) search-insights: 2.17.2 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@5.34.1)(algoliasearch@4.24.0)(search-insights@2.17.2)': + '@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@5.35.0)(algoliasearch@4.24.0)(search-insights@2.17.2)': dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@5.34.1)(algoliasearch@4.24.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@5.35.0)(algoliasearch@4.24.0) search-insights: 2.17.2 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1) - '@algolia/client-search': 5.34.1 - algoliasearch: 5.34.1 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0) + '@algolia/client-search': 5.35.0 + algoliasearch: 5.35.0 - '@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@5.34.1)(algoliasearch@4.24.0)': + '@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@5.35.0)(algoliasearch@4.24.0)': dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@5.34.1)(algoliasearch@4.24.0) - '@algolia/client-search': 5.34.1 + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@5.35.0)(algoliasearch@4.24.0) + '@algolia/client-search': 5.35.0 algoliasearch: 4.24.0 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1)': + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0)': dependencies: - '@algolia/client-search': 5.34.1 - algoliasearch: 5.34.1 + '@algolia/client-search': 5.35.0 + algoliasearch: 5.35.0 - '@algolia/autocomplete-shared@1.9.3(@algolia/client-search@5.34.1)(algoliasearch@4.24.0)': + '@algolia/autocomplete-shared@1.9.3(@algolia/client-search@5.35.0)(algoliasearch@4.24.0)': dependencies: - '@algolia/client-search': 5.34.1 + '@algolia/client-search': 5.35.0 algoliasearch: 4.24.0 '@algolia/cache-browser-local-storage@4.24.0': dependencies: '@algolia/cache-common': 4.24.0 + '@algolia/cache-browser-local-storage@4.25.2': + dependencies: + '@algolia/cache-common': 4.25.2 + '@algolia/cache-common@4.24.0': {} + '@algolia/cache-common@4.25.2': {} + '@algolia/cache-in-memory@4.24.0': dependencies: '@algolia/cache-common': 4.24.0 - '@algolia/client-abtesting@5.34.1': + '@algolia/cache-in-memory@4.25.2': + dependencies: + '@algolia/cache-common': 4.25.2 + + '@algolia/client-abtesting@5.35.0': dependencies: - '@algolia/client-common': 5.34.1 - '@algolia/requester-browser-xhr': 5.34.1 - '@algolia/requester-fetch': 5.34.1 - '@algolia/requester-node-http': 5.34.1 + '@algolia/client-common': 5.35.0 + '@algolia/requester-browser-xhr': 5.35.0 + '@algolia/requester-fetch': 5.35.0 + '@algolia/requester-node-http': 5.35.0 '@algolia/client-account@4.24.0': dependencies: @@ -13763,6 +14130,12 @@ snapshots: '@algolia/client-search': 4.24.0 '@algolia/transporter': 4.24.0 + '@algolia/client-account@4.25.2': + dependencies: + '@algolia/client-common': 4.25.2 + '@algolia/client-search': 4.25.2 + '@algolia/transporter': 4.25.2 + '@algolia/client-analytics@4.24.0': dependencies: '@algolia/client-common': 4.24.0 @@ -13770,26 +14143,38 @@ snapshots: '@algolia/requester-common': 4.24.0 '@algolia/transporter': 4.24.0 - '@algolia/client-analytics@5.34.1': + '@algolia/client-analytics@4.25.2': + dependencies: + '@algolia/client-common': 4.25.2 + '@algolia/client-search': 4.25.2 + '@algolia/requester-common': 4.25.2 + '@algolia/transporter': 4.25.2 + + '@algolia/client-analytics@5.35.0': dependencies: - '@algolia/client-common': 5.34.1 - '@algolia/requester-browser-xhr': 5.34.1 - '@algolia/requester-fetch': 5.34.1 - '@algolia/requester-node-http': 5.34.1 + '@algolia/client-common': 5.35.0 + '@algolia/requester-browser-xhr': 5.35.0 + '@algolia/requester-fetch': 5.35.0 + '@algolia/requester-node-http': 5.35.0 '@algolia/client-common@4.24.0': dependencies: '@algolia/requester-common': 4.24.0 '@algolia/transporter': 4.24.0 - '@algolia/client-common@5.34.1': {} + '@algolia/client-common@4.25.2': + dependencies: + '@algolia/requester-common': 4.25.2 + '@algolia/transporter': 4.25.2 + + '@algolia/client-common@5.35.0': {} - '@algolia/client-insights@5.34.1': + '@algolia/client-insights@5.35.0': dependencies: - '@algolia/client-common': 5.34.1 - '@algolia/requester-browser-xhr': 5.34.1 - '@algolia/requester-fetch': 5.34.1 - '@algolia/requester-node-http': 5.34.1 + '@algolia/client-common': 5.35.0 + '@algolia/requester-browser-xhr': 5.35.0 + '@algolia/requester-fetch': 5.35.0 + '@algolia/requester-node-http': 5.35.0 '@algolia/client-personalization@4.24.0': dependencies: @@ -13797,19 +14182,25 @@ snapshots: '@algolia/requester-common': 4.24.0 '@algolia/transporter': 4.24.0 - '@algolia/client-personalization@5.34.1': + '@algolia/client-personalization@4.25.2': + dependencies: + '@algolia/client-common': 4.25.2 + '@algolia/requester-common': 4.25.2 + '@algolia/transporter': 4.25.2 + + '@algolia/client-personalization@5.35.0': dependencies: - '@algolia/client-common': 5.34.1 - '@algolia/requester-browser-xhr': 5.34.1 - '@algolia/requester-fetch': 5.34.1 - '@algolia/requester-node-http': 5.34.1 + '@algolia/client-common': 5.35.0 + '@algolia/requester-browser-xhr': 5.35.0 + '@algolia/requester-fetch': 5.35.0 + '@algolia/requester-node-http': 5.35.0 - '@algolia/client-query-suggestions@5.34.1': + '@algolia/client-query-suggestions@5.35.0': dependencies: - '@algolia/client-common': 5.34.1 - '@algolia/requester-browser-xhr': 5.34.1 - '@algolia/requester-fetch': 5.34.1 - '@algolia/requester-node-http': 5.34.1 + '@algolia/client-common': 5.35.0 + '@algolia/requester-browser-xhr': 5.35.0 + '@algolia/requester-fetch': 5.35.0 + '@algolia/requester-node-http': 5.35.0 '@algolia/client-search@4.24.0': dependencies: @@ -13817,32 +14208,44 @@ snapshots: '@algolia/requester-common': 4.24.0 '@algolia/transporter': 4.24.0 - '@algolia/client-search@5.34.1': + '@algolia/client-search@4.25.2': + dependencies: + '@algolia/client-common': 4.25.2 + '@algolia/requester-common': 4.25.2 + '@algolia/transporter': 4.25.2 + + '@algolia/client-search@5.35.0': dependencies: - '@algolia/client-common': 5.34.1 - '@algolia/requester-browser-xhr': 5.34.1 - '@algolia/requester-fetch': 5.34.1 - '@algolia/requester-node-http': 5.34.1 + '@algolia/client-common': 5.35.0 + '@algolia/requester-browser-xhr': 5.35.0 + '@algolia/requester-fetch': 5.35.0 + '@algolia/requester-node-http': 5.35.0 - '@algolia/ingestion@1.34.1': + '@algolia/ingestion@1.35.0': dependencies: - '@algolia/client-common': 5.34.1 - '@algolia/requester-browser-xhr': 5.34.1 - '@algolia/requester-fetch': 5.34.1 - '@algolia/requester-node-http': 5.34.1 + '@algolia/client-common': 5.35.0 + '@algolia/requester-browser-xhr': 5.35.0 + '@algolia/requester-fetch': 5.35.0 + '@algolia/requester-node-http': 5.35.0 '@algolia/logger-common@4.24.0': {} + '@algolia/logger-common@4.25.2': {} + '@algolia/logger-console@4.24.0': dependencies: '@algolia/logger-common': 4.24.0 - '@algolia/monitoring@1.34.1': + '@algolia/logger-console@4.25.2': dependencies: - '@algolia/client-common': 5.34.1 - '@algolia/requester-browser-xhr': 5.34.1 - '@algolia/requester-fetch': 5.34.1 - '@algolia/requester-node-http': 5.34.1 + '@algolia/logger-common': 4.25.2 + + '@algolia/monitoring@1.35.0': + dependencies: + '@algolia/client-common': 5.35.0 + '@algolia/requester-browser-xhr': 5.35.0 + '@algolia/requester-fetch': 5.35.0 + '@algolia/requester-node-http': 5.35.0 '@algolia/recommend@4.24.0': dependencies: @@ -13858,34 +14261,58 @@ snapshots: '@algolia/requester-node-http': 4.24.0 '@algolia/transporter': 4.24.0 - '@algolia/recommend@5.34.1': + '@algolia/recommend@4.25.2': + dependencies: + '@algolia/cache-browser-local-storage': 4.25.2 + '@algolia/cache-common': 4.25.2 + '@algolia/cache-in-memory': 4.25.2 + '@algolia/client-common': 4.25.2 + '@algolia/client-search': 4.25.2 + '@algolia/logger-common': 4.25.2 + '@algolia/logger-console': 4.25.2 + '@algolia/requester-browser-xhr': 4.25.2 + '@algolia/requester-common': 4.25.2 + '@algolia/requester-node-http': 4.25.2 + '@algolia/transporter': 4.25.2 + + '@algolia/recommend@5.35.0': dependencies: - '@algolia/client-common': 5.34.1 - '@algolia/requester-browser-xhr': 5.34.1 - '@algolia/requester-fetch': 5.34.1 - '@algolia/requester-node-http': 5.34.1 + '@algolia/client-common': 5.35.0 + '@algolia/requester-browser-xhr': 5.35.0 + '@algolia/requester-fetch': 5.35.0 + '@algolia/requester-node-http': 5.35.0 '@algolia/requester-browser-xhr@4.24.0': dependencies: '@algolia/requester-common': 4.24.0 - '@algolia/requester-browser-xhr@5.34.1': + '@algolia/requester-browser-xhr@4.25.2': dependencies: - '@algolia/client-common': 5.34.1 + '@algolia/requester-common': 4.25.2 + + '@algolia/requester-browser-xhr@5.35.0': + dependencies: + '@algolia/client-common': 5.35.0 '@algolia/requester-common@4.24.0': {} - '@algolia/requester-fetch@5.34.1': + '@algolia/requester-common@4.25.2': {} + + '@algolia/requester-fetch@5.35.0': dependencies: - '@algolia/client-common': 5.34.1 + '@algolia/client-common': 5.35.0 '@algolia/requester-node-http@4.24.0': dependencies: '@algolia/requester-common': 4.24.0 - '@algolia/requester-node-http@5.34.1': + '@algolia/requester-node-http@4.25.2': + dependencies: + '@algolia/requester-common': 4.25.2 + + '@algolia/requester-node-http@5.35.0': dependencies: - '@algolia/client-common': 5.34.1 + '@algolia/client-common': 5.35.0 '@algolia/transporter@4.24.0': dependencies: @@ -13893,6 +14320,12 @@ snapshots: '@algolia/logger-common': 4.24.0 '@algolia/requester-common': 4.24.0 + '@algolia/transporter@4.25.2': + dependencies: + '@algolia/cache-common': 4.25.2 + '@algolia/logger-common': 4.25.2 + '@algolia/requester-common': 4.25.2 + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.5 @@ -13914,6 +14347,20 @@ snapshots: '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 chokidar: 3.6.0 + '@babel/cli@7.25.9(@babel/core@7.28.0)': + dependencies: + '@babel/core': 7.28.0 + '@jridgewell/trace-mapping': 0.3.25 + commander: 6.2.1 + convert-source-map: 2.0.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.3 + make-dir: 2.1.0 + slash: 2.0.0 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 + chokidar: 3.6.0 + '@babel/code-frame@7.25.7': dependencies: '@babel/highlight': 7.25.7 @@ -13982,7 +14429,7 @@ snapshots: '@babel/types': 7.28.2 '@jridgewell/gen-mapping': 0.3.12 '@jridgewell/trace-mapping': 0.3.29 - jsesc: 3.0.2 + jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.25.7': dependencies: @@ -14011,7 +14458,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.24.2 + browserslist: 4.25.1 lru-cache: 5.1.1 semver: 6.3.1 @@ -14068,6 +14515,13 @@ snapshots: regexpu-core: 6.1.1 semver: 6.3.1 + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.2.0 + semver: 6.3.1 + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -14078,7 +14532,7 @@ snapshots: '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-compilation-targets': 7.25.7 + '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.25.7 debug: 4.4.1 lodash.debounce: 4.0.8 @@ -14089,7 +14543,7 @@ snapshots: '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.25.7 + '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-plugin-utils': 7.25.7 debug: 4.4.1 lodash.debounce: 4.0.8 @@ -14141,7 +14595,7 @@ snapshots: '@babel/helper-module-transforms@7.25.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-module-imports': 7.25.7 + '@babel/helper-module-imports': 7.27.1 '@babel/helper-simple-access': 7.25.7 '@babel/helper-validator-identifier': 7.25.7 '@babel/traverse': 7.28.0 @@ -14151,7 +14605,7 @@ snapshots: '@babel/helper-module-transforms@7.25.7(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.25.7 + '@babel/helper-module-imports': 7.27.1 '@babel/helper-simple-access': 7.25.7 '@babel/helper-validator-identifier': 7.25.7 '@babel/traverse': 7.28.0 @@ -14445,42 +14899,42 @@ snapshots: '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-decorators@7.25.7(@babel/core@7.25.8)': dependencies: @@ -14517,6 +14971,11 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.25.7 + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.25.8)': + dependencies: + '@babel/core': 7.25.8 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -14525,22 +14984,22 @@ snapshots: '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.25.8)': dependencies: @@ -14560,82 +15019,82 @@ snapshots: '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-typescript@7.25.7(@babel/core@7.25.8)': dependencies: @@ -14655,14 +15114,14 @@ snapshots: '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.25.8) - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.25.8) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.25.7(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.0) + '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-arrow-functions@7.25.7(@babel/core@7.25.8)': dependencies: @@ -14709,7 +15168,7 @@ snapshots: '@babel/plugin-transform-async-to-generator@7.25.7(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-module-imports': 7.25.7 + '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.25.7 '@babel/helper-remap-async-to-generator': 7.25.7(@babel/core@7.25.8) transitivePeerDependencies: @@ -14718,7 +15177,7 @@ snapshots: '@babel/plugin-transform-async-to-generator@7.25.7(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.25.7 + '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.25.7 '@babel/helper-remap-async-to-generator': 7.25.7(@babel/core@7.28.0) transitivePeerDependencies: @@ -15883,7 +16342,7 @@ snapshots: babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.0) babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.0) babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0) - core-js-compat: 3.44.0 + core-js-compat: 3.45.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -15891,15 +16350,15 @@ snapshots: '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.8)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/types': 7.25.8 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.2 esutils: 2.0.3 '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.25.7 - '@babel/types': 7.25.8 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.2 esutils: 2.0.3 '@babel/preset-typescript@7.25.7(@babel/core@7.25.8)': @@ -15939,6 +16398,8 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 + '@babel/runtime@7.28.2': {} + '@babel/template@7.25.7': dependencies: '@babel/code-frame': 7.25.7 @@ -15994,7 +16455,7 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@bufbuild/protobuf@2.2.0': {} + '@bufbuild/protobuf@2.6.3': {} '@changesets/apply-release-plan@7.0.12': dependencies: @@ -16010,7 +16471,7 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.6.3 + semver: 7.7.2 '@changesets/assemble-release-plan@6.0.9': dependencies: @@ -16019,7 +16480,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 - semver: 7.6.3 + semver: 7.7.2 '@changesets/changelog-git@0.2.1': dependencies: @@ -16049,10 +16510,10 @@ snapshots: fs-extra: 7.0.1 mri: 1.2.0 p-limit: 2.3.0 - package-manager-detector: 0.2.2 + package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 - semver: 7.6.3 + semver: 7.7.2 spawndamnit: 3.0.1 term-size: 2.2.1 @@ -16075,7 +16536,7 @@ snapshots: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 - semver: 7.6.3 + semver: 7.7.2 '@changesets/get-release-plan@4.0.13': dependencies: @@ -16184,7 +16645,7 @@ snapshots: dependencies: '@commitlint/format': 19.5.0 '@commitlint/lint': 19.5.0 - '@commitlint/load': 19.5.0(@types/node@20.5.1)(typescript@4.9.5) + '@commitlint/load': 19.5.0(@types/node@24.2.0)(typescript@4.9.5) '@commitlint/read': 19.5.0 '@commitlint/types': 19.5.0 tinyexec: 0.3.1 @@ -16193,11 +16654,11 @@ snapshots: - '@types/node' - typescript - '@commitlint/cli@19.8.1(@types/node@18.19.120)(typescript@5.8.3)': + '@commitlint/cli@19.8.1(@types/node@18.19.121)(typescript@5.9.2)': dependencies: '@commitlint/format': 19.8.1 '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@18.19.120)(typescript@5.8.3) + '@commitlint/load': 19.8.1(@types/node@18.19.121)(typescript@5.9.2) '@commitlint/read': 19.8.1 '@commitlint/types': 19.8.1 tinyexec: 1.0.1 @@ -16276,12 +16737,12 @@ snapshots: '@commitlint/format@19.5.0': dependencies: '@commitlint/types': 19.5.0 - chalk: 5.4.1 + chalk: 5.3.0 '@commitlint/format@19.8.1': dependencies: '@commitlint/types': 19.8.1 - chalk: 5.4.1 + chalk: 5.5.0 '@commitlint/is-ignored@17.8.1': dependencies: @@ -16291,12 +16752,12 @@ snapshots: '@commitlint/is-ignored@19.5.0': dependencies: '@commitlint/types': 19.5.0 - semver: 7.6.3 + semver: 7.7.2 '@commitlint/is-ignored@19.8.1': dependencies: '@commitlint/types': 19.8.1 - semver: 7.6.3 + semver: 7.7.2 '@commitlint/lint@17.8.1': dependencies: @@ -16333,8 +16794,8 @@ snapshots: lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.8.3) - typescript: 5.8.3 + ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -16377,9 +16838,9 @@ snapshots: '@commitlint/execute-rule': 19.5.0 '@commitlint/resolve-extends': 19.5.0 '@commitlint/types': 19.5.0 - chalk: 5.4.1 + chalk: 5.3.0 cosmiconfig: 9.0.0(typescript@4.9.5) - cosmiconfig-typescript-loader: 5.1.0(@types/node@20.5.1)(cosmiconfig@9.0.0(typescript@4.9.5))(typescript@4.9.5) + cosmiconfig-typescript-loader: 5.1.0(@types/node@24.2.0)(cosmiconfig@9.0.0(typescript@4.9.5))(typescript@4.9.5) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -16387,15 +16848,15 @@ snapshots: - '@types/node' - typescript - '@commitlint/load@19.8.1(@types/node@18.19.120)(typescript@5.8.3)': + '@commitlint/load@19.8.1(@types/node@18.19.121)(typescript@5.9.2)': dependencies: '@commitlint/config-validator': 19.8.1 '@commitlint/execute-rule': 19.8.1 '@commitlint/resolve-extends': 19.8.1 '@commitlint/types': 19.8.1 - chalk: 5.4.1 - cosmiconfig: 9.0.0(typescript@5.8.3) - cosmiconfig-typescript-loader: 6.1.0(@types/node@18.19.120)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) + chalk: 5.5.0 + cosmiconfig: 9.0.0(typescript@5.9.2) + cosmiconfig-typescript-loader: 6.1.0(@types/node@18.19.121)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -16431,7 +16892,7 @@ snapshots: dependencies: '@commitlint/top-level': 17.8.1 '@commitlint/types': 17.8.1 - fs-extra: 11.3.0 + fs-extra: 11.3.1 git-raw-commits: 2.0.11 minimist: 1.2.8 @@ -16455,7 +16916,7 @@ snapshots: dependencies: '@commitlint/config-validator': 17.8.1 '@commitlint/types': 17.8.1 - import-fresh: 3.3.0 + import-fresh: 3.3.1 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 resolve-global: 1.0.0 @@ -16525,20 +16986,20 @@ snapshots: '@commitlint/types@19.5.0': dependencies: '@types/conventional-commits-parser': 5.0.0 - chalk: 5.4.1 + chalk: 5.3.0 '@commitlint/types@19.8.1': dependencies: - '@types/conventional-commits-parser': 5.0.0 - chalk: 5.4.1 + '@types/conventional-commits-parser': 5.0.1 + chalk: 5.5.0 - '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.0.0)': + '@conventional-changelog/git-client@1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0)': dependencies: - '@types/semver': 7.5.8 - semver: 7.6.3 + '@types/semver': 7.7.0 + semver: 7.7.2 optionalDependencies: conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.0.0 + conventional-commits-parser: 6.2.0 '@cspotcode/source-map-support@0.8.1': dependencies: @@ -16572,14 +17033,14 @@ snapshots: '@docsearch/js@1.0.0-alpha.28(react-dom@16.14.0(react@16.14.0))(react@16.14.0)': dependencies: '@docsearch/react': 1.0.0-alpha.28(react-dom@16.14.0(react@16.14.0))(react@16.14.0) - preact: 10.24.3 + preact: 10.27.0 transitivePeerDependencies: - react - react-dom - '@docsearch/js@3.6.0(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2)': + '@docsearch/js@3.6.0(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2)': dependencies: - '@docsearch/react': 3.6.0(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) + '@docsearch/react': 3.6.0(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) preact: 10.24.3 transitivePeerDependencies: - '@algolia/client-search' @@ -16588,9 +17049,9 @@ snapshots: - react-dom - search-insights - '@docsearch/js@3.6.2(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2)': + '@docsearch/js@3.6.2(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2)': dependencies: - '@docsearch/react': 3.6.2(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) + '@docsearch/react': 3.6.2(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) preact: 10.24.3 transitivePeerDependencies: - '@algolia/client-search' @@ -16599,10 +17060,10 @@ snapshots: - react-dom - search-insights - '@docsearch/js@3.8.2(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2)': + '@docsearch/js@3.8.2(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2)': dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) - preact: 10.24.3 + '@docsearch/react': 3.8.2(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) + preact: 10.27.0 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -16615,14 +17076,14 @@ snapshots: '@docsearch/css': 1.0.0-alpha.28 '@francoischalifour/autocomplete-core': 1.0.0-alpha.28 '@francoischalifour/autocomplete-preset-algolia': 1.0.0-alpha.28 - algoliasearch: 4.24.0 + algoliasearch: 4.25.2 react: 16.14.0 react-dom: 16.14.0(react@16.14.0) - '@docsearch/react@3.6.0(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2)': + '@docsearch/react@3.6.0(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2)': dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@5.34.1)(algoliasearch@4.24.0)(search-insights@2.17.2) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@5.34.1)(algoliasearch@4.24.0) + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@5.35.0)(algoliasearch@4.24.0)(search-insights@2.17.2) + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@5.35.0)(algoliasearch@4.24.0) '@docsearch/css': 3.6.0 algoliasearch: 4.24.0 optionalDependencies: @@ -16632,10 +17093,10 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@docsearch/react@3.6.2(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2)': + '@docsearch/react@3.6.2(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2)': dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@5.34.1)(algoliasearch@4.24.0)(search-insights@2.17.2) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@5.34.1)(algoliasearch@4.24.0) + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@5.35.0)(algoliasearch@4.24.0)(search-insights@2.17.2) + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@5.35.0)(algoliasearch@4.24.0) '@docsearch/css': 3.6.2 algoliasearch: 4.24.0 optionalDependencies: @@ -16645,12 +17106,12 @@ snapshots: transitivePeerDependencies: - '@algolia/client-search' - '@docsearch/react@3.8.2(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2)': + '@docsearch/react@3.8.2(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2)': dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1)(search-insights@2.17.2) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.34.1)(algoliasearch@5.34.1) + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0)(search-insights@2.17.2) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.35.0)(algoliasearch@5.35.0) '@docsearch/css': 3.8.2 - algoliasearch: 5.34.1 + algoliasearch: 5.35.0 optionalDependencies: react: 16.14.0 react-dom: 16.14.0(react@16.14.0) @@ -16728,7 +17189,7 @@ snapshots: '@farris/devkit-vue': 0.0.5(typescript@4.9.5) '@farris/ui-vue': 1.5.3(@algolia/client-search@5.34.1)(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.45.1)(search-insights@2.17.2)(vite@4.5.14(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/shared': 3.5.12 - '@vueuse/core': 9.2.0(vue@3.5.12(typescript@4.9.5)) + '@vueuse/core': 9.2.0(vue@3.5.18(typescript@4.9.5)) async-validator: 4.2.5 bignumber.js: 9.1.2 lodash: 4.17.21 @@ -16736,8 +17197,8 @@ snapshots: moment: 2.29.4 mxgraph: 4.2.2 rxjs: 7.8.1 - vue: 3.5.12(typescript@4.9.5) - vue-router: 4.4.5(vue@3.5.12(typescript@4.9.5)) + vue: 3.5.18(typescript@4.9.5) + vue-router: 4.4.5(vue@3.5.18(typescript@4.9.5)) transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -16762,6 +17223,60 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer2: 1.2.0 + '@emotion/babel-plugin@11.13.5': + dependencies: + '@babel/helper-module-imports': 7.27.1 + '@babel/runtime': 7.28.2 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.14.0': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/css@11.13.5': + dependencies: + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + transitivePeerDependencies: + - supports-color + + '@emotion/hash@0.9.2': {} + + '@emotion/memoize@0.9.0': {} + + '@emotion/serialize@1.3.3': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/unitless@0.10.0': {} + + '@emotion/utils@1.4.2': {} + + '@emotion/weak-memoize@0.4.0': {} + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -16988,8 +17503,6 @@ snapshots: eslint: 9.38.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.1': {} - '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.21.1': @@ -17019,7 +17532,7 @@ snapshots: espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 @@ -17216,7 +17729,7 @@ snapshots: '@farris/ui-vue@1.5.3(@algolia/client-search@5.34.1)(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.45.1)(search-insights@2.17.2)(vite@4.5.14(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5))': dependencies: - '@docsearch/js': 3.6.0(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) + '@docsearch/js': 3.6.0(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.2) '@types/lodash-es': 4.17.12 '@vue/shared': 3.5.18 @@ -17246,7 +17759,7 @@ snapshots: '@farris/ui-vue@1.5.3(@algolia/client-search@5.34.1)(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.45.1)(search-insights@2.17.2)(vite@4.5.14(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.18(typescript@4.9.5))': dependencies: - '@docsearch/js': 3.6.0(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) + '@docsearch/js': 3.6.0(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.2) '@types/lodash-es': 4.17.12 '@vue/shared': 3.5.18 @@ -17873,7 +18386,7 @@ snapshots: '@farris/devkit-vue': 0.0.5(typescript@4.9.5) '@farris/ui-vue': 1.5.3(@algolia/client-search@5.34.1)(@types/node@20.5.1)(monaco-editor@0.52.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(rollup@4.45.1)(search-insights@2.17.2)(vite@4.5.14(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/shared': 3.5.12 - '@vueuse/core': 9.2.0(vue@3.5.12(typescript@4.9.5)) + '@vueuse/core': 9.2.0(vue@3.5.18(typescript@4.9.5)) async-validator: 4.2.5 bignumber.js: 9.1.2 lodash: 4.17.21 @@ -17881,8 +18394,8 @@ snapshots: moment: 2.29.4 mxgraph: 4.2.2 rxjs: 7.8.1 - vue: 3.5.12(typescript@4.9.5) - vue-router: 4.4.5(vue@3.5.12(typescript@4.9.5)) + vue: 3.5.18(typescript@4.9.5) + vue-router: 4.4.5(vue@3.5.18(typescript@4.9.5)) transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -17915,13 +18428,13 @@ snapshots: '@hutson/parse-repository-url@5.0.0': {} - '@iconify-json/simple-icons@1.2.44': + '@iconify-json/simple-icons@1.2.46': dependencies: '@iconify/types': 2.0.0 '@iconify/types@2.0.0': {} - '@inquirer/figures@1.0.7': {} + '@inquirer/figures@1.0.13': {} '@interactjs/actions@1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27)': dependencies: @@ -17957,71 +18470,26 @@ snapshots: transitivePeerDependencies: - typescript - '@interactjs/inertia@1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/modifiers@1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27)': + '@interactjs/interact@1.10.27': dependencies: '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) - '@interactjs/modifiers': 1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27) - '@interactjs/offset': 1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27) '@interactjs/utils': 1.10.27 - optionalDependencies: - '@interactjs/interact': 1.10.27 - '@interactjs/interact@1.10.27': + '@interactjs/modifiers@1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27)': dependencies: '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) + '@interactjs/snappers': 1.10.27(@interactjs/utils@1.10.27) '@interactjs/utils': 1.10.27 + optionalDependencies: + '@interactjs/interact': 1.10.27 - '@interactjs/interactjs@1.10.27(typescript@5.6.3)': + '@interactjs/snappers@1.10.27(@interactjs/utils@1.10.27)': dependencies: - '@interactjs/actions': 1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27) - '@interactjs/auto-scroll': 1.10.27(@interactjs/utils@1.10.27) - '@interactjs/auto-start': 1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27) - '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) - '@interactjs/dev-tools': 1.10.27(@interactjs/modifiers@1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27)(typescript@5.6.3) - '@interactjs/inertia': 1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/modifiers@1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27) - '@interactjs/interact': 1.10.27 - '@interactjs/modifiers': 1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27) - '@interactjs/offset': 1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27) - '@interactjs/pointer-events': 1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27) - '@interactjs/reflow': 1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27) - '@interactjs/utils': 1.10.27 - transitivePeerDependencies: - - typescript - - '@interactjs/modifiers@1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27)': - dependencies: - '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) - '@interactjs/snappers': 1.10.27(@interactjs/utils@1.10.27) - '@interactjs/utils': 1.10.27 - optionalDependencies: - '@interactjs/interact': 1.10.27 - - '@interactjs/offset@1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27)': - dependencies: - '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) - '@interactjs/utils': 1.10.27 - optionalDependencies: - '@interactjs/interact': 1.10.27 - - '@interactjs/pointer-events@1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27)': - dependencies: - '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) - '@interactjs/utils': 1.10.27 - optionalDependencies: - '@interactjs/interact': 1.10.27 - - '@interactjs/reflow@1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27)': - dependencies: - '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) '@interactjs/utils': 1.10.27 optionalDependencies: '@interactjs/interact': 1.10.27 - '@interactjs/snappers@1.10.27(@interactjs/utils@1.10.27)': - dependencies: - '@interactjs/utils': 1.10.27 - optionalDependencies: - '@interactjs/interact': 1.10.27 + '@interactjs/types@1.10.27': {} '@interactjs/utils@1.10.27': {} @@ -18065,62 +18533,27 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.120 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.6.3))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.120 - ansi-escapes: 4.3.2 + '@types/node': 18.19.121 chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.6.3)) - jest-haste-map: 29.7.0 jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.120 + '@types/node': 18.19.121 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -18141,21 +18574,21 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.120 + '@types/node': 18.19.121 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + jest-config: 29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -18176,56 +18609,21 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.120 + '@types/node': 18.19.121 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3))': - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.120 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -18303,7 +18701,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.19.120 + '@types/node': 18.19.121 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -18372,9 +18770,9 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.28.0 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.29 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -18384,7 +18782,7 @@ snapshots: jest-regex-util: 29.6.3 jest-util: 29.7.0 micromatch: 4.0.8 - pirates: 4.0.6 + pirates: 4.0.7 slash: 3.0.0 write-file-atomic: 4.0.2 transitivePeerDependencies: @@ -18394,7 +18792,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 18.19.120 + '@types/node': 24.2.0 '@types/yargs': 15.0.19 chalk: 4.1.2 @@ -18403,13 +18801,13 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 18.19.120 + '@types/node': 18.19.121 '@types/yargs': 17.0.33 chalk: 4.1.2 '@jridgewell/gen-mapping@0.3.12': dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping': 0.3.29 '@jridgewell/gen-mapping@0.3.5': @@ -18429,6 +18827,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.4': {} + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -18437,12 +18837,12 @@ snapshots: '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 '@jsdevtools/ez-spawn@3.0.4': dependencies: @@ -18457,29 +18857,29 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.28.2 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.28.2 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - '@microsoft/api-extractor-model@7.28.13(@types/node@18.19.120)': + '@microsoft/api-extractor-model@7.28.13(@types/node@18.19.121)': dependencies: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@18.19.120) + '@rushstack/node-core-library': 4.0.2(@types/node@18.19.121) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor-model@7.28.13(@types/node@20.5.1)': + '@microsoft/api-extractor-model@7.28.13(@types/node@24.2.0)': dependencies: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 @@ -18503,38 +18903,38 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor-model@7.29.8(@types/node@20.5.1)': + '@microsoft/api-extractor-model@7.29.8(@types/node@24.2.0)': dependencies: '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.9.0(@types/node@20.5.1) + '@rushstack/node-core-library': 5.9.0(@types/node@24.2.0) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.43.0(@types/node@18.19.120)': + '@microsoft/api-extractor@7.43.0(@types/node@18.19.121)': dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@18.19.120) + '@microsoft/api-extractor-model': 7.28.13(@types/node@18.19.121) '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@18.19.120) + '@rushstack/node-core-library': 4.0.2(@types/node@18.19.121) '@rushstack/rig-package': 0.5.2 - '@rushstack/terminal': 0.10.0(@types/node@18.19.120) - '@rushstack/ts-command-line': 4.19.1(@types/node@18.19.120) + '@rushstack/terminal': 0.10.0(@types/node@18.19.121) + '@rushstack/ts-command-line': 4.19.1(@types/node@18.19.121) lodash: 4.17.21 minimatch: 3.0.8 - resolve: 1.22.8 + resolve: 1.22.10 semver: 7.5.4 source-map: 0.6.1 typescript: 5.4.2 transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.43.0(@types/node@20.5.1)': + '@microsoft/api-extractor@7.43.0(@types/node@24.2.0)': dependencies: - '@microsoft/api-extractor-model': 7.28.13(@types/node@20.5.1) + '@microsoft/api-extractor-model': 7.28.13(@types/node@24.2.0) '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 4.0.2(@types/node@20.5.1) + '@rushstack/node-core-library': 4.0.2(@types/node@24.2.0) '@rushstack/rig-package': 0.5.2 '@rushstack/terminal': 0.10.0(@types/node@20.5.1) '@rushstack/ts-command-line': 4.19.1(@types/node@20.5.1) @@ -18576,25 +18976,25 @@ snapshots: '@rushstack/ts-command-line': 4.23.0(@types/node@18.19.57) lodash: 4.17.21 minimatch: 3.0.8 - resolve: 1.22.8 + resolve: 1.22.10 semver: 7.5.4 source-map: 0.6.1 typescript: 5.4.2 transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.47.11(@types/node@20.5.1)': + '@microsoft/api-extractor@7.47.11(@types/node@24.2.0)': dependencies: - '@microsoft/api-extractor-model': 7.29.8(@types/node@20.5.1) + '@microsoft/api-extractor-model': 7.29.8(@types/node@24.2.0) '@microsoft/tsdoc': 0.15.0 '@microsoft/tsdoc-config': 0.17.0 - '@rushstack/node-core-library': 5.9.0(@types/node@20.5.1) + '@rushstack/node-core-library': 5.9.0(@types/node@24.2.0) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.14.2(@types/node@20.5.1) - '@rushstack/ts-command-line': 4.23.0(@types/node@20.5.1) + '@rushstack/terminal': 0.14.2(@types/node@24.2.0) + '@rushstack/ts-command-line': 4.23.0(@types/node@24.2.0) lodash: 4.17.21 minimatch: 3.0.8 - resolve: 1.22.8 + resolve: 1.22.10 semver: 7.5.4 source-map: 0.6.1 typescript: 5.4.2 @@ -18639,46 +19039,85 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.19.1 '@one-ini/wasm@0.1.1': {} '@parcel/watcher-android-arm64@2.4.1': optional: true + '@parcel/watcher-android-arm64@2.5.1': + optional: true + '@parcel/watcher-darwin-arm64@2.4.1': optional: true + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + '@parcel/watcher-darwin-x64@2.4.1': optional: true + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + '@parcel/watcher-freebsd-x64@2.4.1': optional: true + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + '@parcel/watcher-linux-arm-glibc@2.4.1': optional: true + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + '@parcel/watcher-linux-arm64-glibc@2.4.1': optional: true + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + '@parcel/watcher-linux-arm64-musl@2.4.1': optional: true + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + '@parcel/watcher-linux-x64-glibc@2.4.1': optional: true + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + '@parcel/watcher-linux-x64-musl@2.4.1': optional: true + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + '@parcel/watcher-win32-arm64@2.4.1': optional: true + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + '@parcel/watcher-win32-ia32@2.4.1': optional: true + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + '@parcel/watcher-win32-x64@2.4.1': optional: true + '@parcel/watcher-win32-x64@2.5.1': + optional: true + '@parcel/watcher@2.4.1': dependencies: detect-libc: 1.0.3 @@ -18699,6 +19138,28 @@ snapshots: '@parcel/watcher-win32-ia32': 2.4.1 '@parcel/watcher-win32-x64': 2.4.1 + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + '@pkgjs/parseargs@0.11.0': optional: true @@ -18708,15 +19169,15 @@ snapshots: '@polka/url@0.5.0': {} - '@polka/url@1.0.0-next.28': {} + '@polka/url@1.0.0-next.29': {} - '@rolldown/pluginutils@1.0.0-beta.29': {} + '@rolldown/pluginutils@1.0.0-beta.31': {} '@rollup/plugin-babel@6.0.4(@babel/core@7.25.8)(@types/babel__core@7.20.5)(rollup@4.24.0)': dependencies: '@babel/core': 7.25.8 - '@babel/helper-module-imports': 7.25.7 - '@rollup/pluginutils': 5.1.2(rollup@4.24.0) + '@babel/helper-module-imports': 7.27.1 + '@rollup/pluginutils': 5.2.0(rollup@4.24.0) optionalDependencies: '@types/babel__core': 7.20.5 rollup: 4.24.0 @@ -18726,22 +19187,22 @@ snapshots: '@rollup/plugin-babel@6.0.4(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.24.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.25.7 - '@rollup/pluginutils': 5.1.2(rollup@4.24.0) + '@babel/helper-module-imports': 7.27.1 + '@rollup/pluginutils': 5.2.0(rollup@4.24.0) optionalDependencies: '@types/babel__core': 7.20.5 rollup: 4.24.0 transitivePeerDependencies: - supports-color - '@rollup/plugin-babel@6.0.4(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.45.1)': + '@rollup/plugin-babel@6.0.4(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@4.46.2)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.25.7 - '@rollup/pluginutils': 5.1.2(rollup@4.45.1) + '@babel/helper-module-imports': 7.27.1 + '@rollup/pluginutils': 5.2.0(rollup@4.46.2) optionalDependencies: '@types/babel__core': 7.20.5 - rollup: 4.45.1 + rollup: 4.46.2 transitivePeerDependencies: - supports-color @@ -18757,9 +19218,9 @@ snapshots: optionalDependencies: rollup: 4.24.0 - '@rollup/plugin-commonjs@28.0.1(rollup@4.45.1)': + '@rollup/plugin-commonjs@28.0.1(rollup@4.46.2)': dependencies: - '@rollup/pluginutils': 5.1.2(rollup@4.45.1) + '@rollup/pluginutils': 5.1.2(rollup@4.46.2) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.4.2(picomatch@4.0.2) @@ -18767,7 +19228,7 @@ snapshots: magic-string: 0.30.12 picomatch: 4.0.2 optionalDependencies: - rollup: 4.45.1 + rollup: 4.46.2 '@rollup/plugin-json@6.1.0(rollup@4.24.0)': dependencies: @@ -18775,11 +19236,11 @@ snapshots: optionalDependencies: rollup: 4.24.0 - '@rollup/plugin-json@6.1.0(rollup@4.45.1)': + '@rollup/plugin-json@6.1.0(rollup@4.46.2)': dependencies: - '@rollup/pluginutils': 5.1.2(rollup@4.45.1) + '@rollup/pluginutils': 5.1.2(rollup@4.46.2) optionalDependencies: - rollup: 4.45.1 + rollup: 4.46.2 '@rollup/plugin-node-resolve@15.3.0(rollup@4.24.0)': dependencies: @@ -18791,25 +19252,25 @@ snapshots: optionalDependencies: rollup: 4.24.0 - '@rollup/plugin-node-resolve@15.3.0(rollup@4.45.1)': + '@rollup/plugin-node-resolve@15.3.0(rollup@4.46.2)': dependencies: - '@rollup/pluginutils': 5.1.2(rollup@4.45.1) + '@rollup/pluginutils': 5.1.2(rollup@4.46.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.8 optionalDependencies: - rollup: 4.45.1 + rollup: 4.46.2 - '@rollup/plugin-node-resolve@15.3.1(rollup@4.45.1)': + '@rollup/plugin-node-resolve@15.3.1(rollup@4.46.2)': dependencies: - '@rollup/pluginutils': 5.1.2(rollup@4.45.1) + '@rollup/pluginutils': 5.2.0(rollup@4.46.2) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 - resolve: 1.22.8 + resolve: 1.22.10 optionalDependencies: - rollup: 4.45.1 + rollup: 4.46.2 '@rollup/plugin-terser@0.4.4(rollup@4.24.0)': dependencies: @@ -18819,13 +19280,13 @@ snapshots: optionalDependencies: rollup: 4.24.0 - '@rollup/plugin-terser@0.4.4(rollup@4.45.1)': + '@rollup/plugin-terser@0.4.4(rollup@4.46.2)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 terser: 5.36.0 optionalDependencies: - rollup: 4.45.1 + rollup: 4.46.2 '@rollup/pluginutils@4.2.1': dependencies: @@ -18834,126 +19295,142 @@ snapshots: '@rollup/pluginutils@5.1.2(rollup@4.24.0)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: rollup: 4.24.0 - '@rollup/pluginutils@5.1.2(rollup@4.45.1)': + '@rollup/pluginutils@5.1.2(rollup@4.46.2)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.45.1 + rollup: 4.46.2 + + '@rollup/pluginutils@5.2.0(rollup@4.24.0)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.24.0 + + '@rollup/pluginutils@5.2.0(rollup@4.46.2)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.46.2 '@rollup/rollup-android-arm-eabi@4.24.0': optional: true - '@rollup/rollup-android-arm-eabi@4.45.1': + '@rollup/rollup-android-arm-eabi@4.46.2': optional: true '@rollup/rollup-android-arm64@4.24.0': optional: true - '@rollup/rollup-android-arm64@4.45.1': + '@rollup/rollup-android-arm64@4.46.2': optional: true '@rollup/rollup-darwin-arm64@4.24.0': optional: true - '@rollup/rollup-darwin-arm64@4.45.1': + '@rollup/rollup-darwin-arm64@4.46.2': optional: true '@rollup/rollup-darwin-x64@4.24.0': optional: true - '@rollup/rollup-darwin-x64@4.45.1': + '@rollup/rollup-darwin-x64@4.46.2': optional: true - '@rollup/rollup-freebsd-arm64@4.45.1': + '@rollup/rollup-freebsd-arm64@4.46.2': optional: true - '@rollup/rollup-freebsd-x64@4.45.1': + '@rollup/rollup-freebsd-x64@4.46.2': optional: true '@rollup/rollup-linux-arm-gnueabihf@4.24.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.45.1': + '@rollup/rollup-linux-arm-gnueabihf@4.46.2': optional: true '@rollup/rollup-linux-arm-musleabihf@4.24.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.45.1': + '@rollup/rollup-linux-arm-musleabihf@4.46.2': optional: true '@rollup/rollup-linux-arm64-gnu@4.24.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.45.1': + '@rollup/rollup-linux-arm64-gnu@4.46.2': optional: true '@rollup/rollup-linux-arm64-musl@4.24.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.45.1': + '@rollup/rollup-linux-arm64-musl@4.46.2': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.45.1': + '@rollup/rollup-linux-loongarch64-gnu@4.46.2': optional: true '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.45.1': + '@rollup/rollup-linux-ppc64-gnu@4.46.2': optional: true '@rollup/rollup-linux-riscv64-gnu@4.24.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.45.1': + '@rollup/rollup-linux-riscv64-gnu@4.46.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.45.1': + '@rollup/rollup-linux-riscv64-musl@4.46.2': optional: true '@rollup/rollup-linux-s390x-gnu@4.24.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.45.1': + '@rollup/rollup-linux-s390x-gnu@4.46.2': optional: true '@rollup/rollup-linux-x64-gnu@4.24.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.45.1': + '@rollup/rollup-linux-x64-gnu@4.46.2': optional: true '@rollup/rollup-linux-x64-musl@4.24.0': optional: true - '@rollup/rollup-linux-x64-musl@4.45.1': + '@rollup/rollup-linux-x64-musl@4.46.2': optional: true '@rollup/rollup-win32-arm64-msvc@4.24.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.45.1': + '@rollup/rollup-win32-arm64-msvc@4.46.2': optional: true '@rollup/rollup-win32-ia32-msvc@4.24.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.45.1': + '@rollup/rollup-win32-ia32-msvc@4.46.2': optional: true '@rollup/rollup-win32-x64-msvc@4.24.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.45.1': + '@rollup/rollup-win32-x64-msvc@4.46.2': optional: true '@rtsao/scc@1.1.0': {} @@ -18990,13 +19467,13 @@ snapshots: fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.8 + resolve: 1.22.10 semver: 7.5.4 z-schema: 5.0.5 optionalDependencies: - '@types/node': 20.5.1 + '@types/node': 24.2.0 - '@rushstack/node-core-library@4.0.2(@types/node@18.19.120)': + '@rushstack/node-core-library@4.0.2(@types/node@18.19.121)': dependencies: fs-extra: 7.0.1 import-lazy: 4.0.0 @@ -19005,9 +19482,9 @@ snapshots: semver: 7.5.4 z-schema: 5.0.5 optionalDependencies: - '@types/node': 18.19.120 + '@types/node': 18.19.121 - '@rushstack/node-core-library@4.0.2(@types/node@20.5.1)': + '@rushstack/node-core-library@4.0.2(@types/node@24.2.0)': dependencies: fs-extra: 7.0.1 import-lazy: 4.0.0 @@ -19044,7 +19521,7 @@ snapshots: optionalDependencies: '@types/node': 18.19.57 - '@rushstack/node-core-library@5.9.0(@types/node@20.5.1)': + '@rushstack/node-core-library@5.9.0(@types/node@24.2.0)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -19055,7 +19532,7 @@ snapshots: resolve: 1.22.10 semver: 7.5.4 optionalDependencies: - '@types/node': 20.5.1 + '@types/node': 24.2.0 '@rushstack/rig-package@0.5.2': dependencies: @@ -19067,19 +19544,12 @@ snapshots: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.10.0(@types/node@18.19.120)': - dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@18.19.120) - supports-color: 8.1.1 - optionalDependencies: - '@types/node': 18.19.120 - - '@rushstack/terminal@0.10.0(@types/node@20.5.1)': + '@rushstack/terminal@0.10.0(@types/node@18.19.121)': dependencies: - '@rushstack/node-core-library': 4.0.2(@types/node@20.5.1) + '@rushstack/node-core-library': 4.0.2(@types/node@18.19.121) supports-color: 8.1.1 optionalDependencies: - '@types/node': 20.5.1 + '@types/node': 18.19.121 '@rushstack/terminal@0.14.2(@types/node@18.19.120)': dependencies: @@ -19090,30 +19560,21 @@ snapshots: '@rushstack/terminal@0.14.2(@types/node@18.19.57)': dependencies: - '@rushstack/node-core-library': 5.9.0(@types/node@18.19.57) + '@rushstack/node-core-library': 4.0.2(@types/node@24.2.0) supports-color: 8.1.1 optionalDependencies: - '@types/node': 18.19.57 + '@types/node': 24.2.0 - '@rushstack/terminal@0.14.2(@types/node@20.5.1)': + '@rushstack/terminal@0.14.2(@types/node@24.2.0)': dependencies: - '@rushstack/node-core-library': 5.9.0(@types/node@20.5.1) + '@rushstack/node-core-library': 5.9.0(@types/node@24.2.0) supports-color: 8.1.1 optionalDependencies: - '@types/node': 20.5.1 + '@types/node': 24.2.0 - '@rushstack/ts-command-line@4.19.1(@types/node@18.19.120)': + '@rushstack/ts-command-line@4.19.1(@types/node@18.19.121)': dependencies: - '@rushstack/terminal': 0.10.0(@types/node@18.19.120) - '@types/argparse': 1.0.38 - argparse: 1.0.10 - string-argv: 0.3.2 - transitivePeerDependencies: - - '@types/node' - - '@rushstack/ts-command-line@4.19.1(@types/node@20.5.1)': - dependencies: - '@rushstack/terminal': 0.10.0(@types/node@20.5.1) + '@rushstack/terminal': 0.10.0(@types/node@18.19.121) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -19131,16 +19592,16 @@ snapshots: '@rushstack/ts-command-line@4.23.0(@types/node@18.19.57)': dependencies: - '@rushstack/terminal': 0.14.2(@types/node@18.19.57) + '@rushstack/terminal': 0.10.0(@types/node@24.2.0) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 transitivePeerDependencies: - '@types/node' - '@rushstack/ts-command-line@4.23.0(@types/node@20.5.1)': + '@rushstack/ts-command-line@4.23.0(@types/node@24.2.0)': dependencies: - '@rushstack/terminal': 0.14.2(@types/node@20.5.1) + '@rushstack/terminal': 0.14.2(@types/node@24.2.0) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -19248,8 +19709,8 @@ snapshots: '@testing-library/dom@9.3.4': dependencies: - '@babel/code-frame': 7.25.7 - '@babel/runtime': 7.25.7 + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.28.2 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -19273,12 +19734,12 @@ snapshots: '@vue/test-utils': 2.4.6 vue: 3.5.12(typescript@5.6.3) - '@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.18)(vue@3.5.18(typescript@5.8.3))': + '@testing-library/vue@8.1.0(@vue/compiler-sfc@3.5.18)(vue@3.5.18(typescript@5.9.2))': dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.28.2 '@testing-library/dom': 9.3.4 '@vue/test-utils': 2.4.6 - vue: 3.5.18(typescript@5.8.3) + vue: 3.5.18(typescript@5.9.2) optionalDependencies: '@vue/compiler-sfc': 3.5.18 @@ -19311,9 +19772,9 @@ snapshots: '@babel/types': 7.28.2 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.28.0 - '@types/babel__generator@7.6.8': + '@types/babel__generator@7.27.0': dependencies: '@babel/types': 7.28.2 @@ -19322,7 +19783,7 @@ snapshots: '@babel/parser': 7.28.0 '@babel/types': 7.28.2 - '@types/babel__traverse@7.20.6': + '@types/babel__traverse@7.28.0': dependencies: '@babel/types': 7.28.2 @@ -19330,17 +19791,25 @@ snapshots: dependencies: '@types/chai': 4.3.20 + '@types/chai-subset@1.3.6(@types/chai@4.3.20)': + dependencies: + '@types/chai': 4.3.20 + '@types/chai@4.3.20': {} '@types/conventional-commits-parser@5.0.0': dependencies: - '@types/node': 18.19.120 + '@types/node': 24.2.0 + + '@types/conventional-commits-parser@5.0.1': + dependencies: + '@types/node': 18.19.121 '@types/crypto-js@4.2.2': {} '@types/echarts@4.9.22': dependencies: - '@types/zrender': 4.0.6 + '@types/zrender': 5.0.0 '@types/estree@1.0.6': {} @@ -19350,20 +19819,20 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 18.19.120 + '@types/node': 18.19.121 '@types/gulp-autoprefixer@0.0.33': dependencies: - '@types/node': 18.19.57 + '@types/node': 24.2.0 '@types/gulp-rename@2.0.6': dependencies: - '@types/node': 18.19.57 + '@types/node': 24.2.0 '@types/vinyl': 2.0.12 '@types/gulp-sass@5.0.4': dependencies: - '@types/node': 18.19.57 + '@types/node': 24.2.0 '@types/node-sass': 4.11.7 '@types/hast@3.0.4': @@ -19403,9 +19872,9 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 18.19.120 + '@types/node': 18.19.121 '@types/tough-cookie': 4.0.5 - parse5: 7.2.0 + parse5: 7.3.0 '@types/json-schema@7.0.15': {} @@ -19417,7 +19886,7 @@ snapshots: '@types/lodash-es@4.17.12': dependencies: - '@types/lodash': 4.17.12 + '@types/lodash': 4.17.20 '@types/lodash.debounce@4.0.9': dependencies: @@ -19447,31 +19916,33 @@ snapshots: '@types/node-sass@4.11.7': dependencies: - '@types/node': 18.19.120 + '@types/node': 24.2.0 '@types/node@12.20.55': {} - '@types/node@18.19.120': - dependencies: - undici-types: 5.26.5 - - '@types/node@18.19.57': + '@types/node@18.19.121': dependencies: undici-types: 5.26.5 '@types/node@20.5.1': {} + '@types/node@24.2.0': + dependencies: + undici-types: 7.10.0 + '@types/normalize-package-data@2.4.4': {} + '@types/parse-json@4.0.2': {} + '@types/resolve@1.20.2': {} - '@types/semver@7.5.8': {} + '@types/semver@7.7.0': {} '@types/stack-utils@2.0.3': {} '@types/through@0.0.33': dependencies: - '@types/node': 18.19.120 + '@types/node': 24.2.0 '@types/tough-cookie@4.0.5': {} @@ -19482,7 +19953,7 @@ snapshots: '@types/vinyl@2.0.12': dependencies: '@types/expect': 1.20.4 - '@types/node': 18.19.120 + '@types/node': 24.2.0 '@types/web-bluetooth@0.0.15': {} @@ -19498,7 +19969,9 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@types/zrender@4.0.6': {} + '@types/zrender@5.0.0': + dependencies: + zrender: 6.0.0 '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.38.0(jiti@2.5.1))(typescript@4.9.5))(eslint@9.38.0(jiti@2.5.1))(typescript@4.9.5)': dependencies: @@ -19512,7 +19985,7 @@ snapshots: graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@4.9.5) + ts-api-utils: 1.4.3(typescript@4.9.5) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -19530,7 +20003,7 @@ snapshots: graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.6.3) + ts-api-utils: 1.4.3(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: @@ -19548,9 +20021,9 @@ snapshots: graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.8.3) + ts-api-utils: 1.4.3(typescript@5.9.2) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -19566,8 +20039,8 @@ snapshots: graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -19601,12 +20074,12 @@ snapshots: dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2) '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.3.7 eslint: 9.38.0(jiti@2.5.1) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -19622,7 +20095,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.38.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.39.0(typescript@5.9.2)': dependencies: '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) '@typescript-eslint/types': 8.38.0 @@ -19636,14 +20109,14 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.38.0': + '@typescript-eslint/scope-manager@8.39.0': dependencies: - '@typescript-eslint/types': 8.38.0 - '@typescript-eslint/visitor-keys': 8.38.0 + '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/visitor-keys': 8.39.0 - '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.39.0(typescript@5.9.2)': dependencies: - typescript: 5.8.3 + typescript: 5.9.2 '@typescript-eslint/type-utils@7.18.0(eslint@9.38.0(jiti@2.5.1))(typescript@4.9.5)': dependencies: @@ -19677,7 +20150,7 @@ snapshots: eslint: 9.38.0(jiti@2.5.1) ts-api-utils: 1.3.0(typescript@5.8.3) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -19695,7 +20168,7 @@ snapshots: '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.38.0': {} + '@typescript-eslint/types@8.39.0': {} '@typescript-eslint/typescript-estree@7.18.0(typescript@4.9.5)': dependencies: @@ -19705,8 +20178,8 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@4.9.5) + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@4.9.5) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -19720,14 +20193,14 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.3) + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 @@ -19735,14 +20208,14 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.8.3) + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.9.2) optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.38.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.39.0(typescript@5.9.2)': dependencies: '@typescript-eslint/project-service': 8.38.0(typescript@5.8.3) '@typescript-eslint/tsconfig-utils': 8.38.0(typescript@5.8.3) @@ -19752,9 +20225,9 @@ snapshots: fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -19807,9 +20280,9 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.38.0': + '@typescript-eslint/visitor-keys@8.39.0': dependencies: - '@typescript-eslint/types': 8.38.0 + '@typescript-eslint/types': 8.39.0 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} @@ -19874,14 +20347,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@4.2.0(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0))(vue@3.5.18(typescript@5.8.3))': + '@vitejs/plugin-vue-jsx@4.2.0(vite@5.4.19(@types/node@18.19.121)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0))(vue@3.5.18(typescript@5.9.2))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0) - '@rolldown/pluginutils': 1.0.0-beta.29 + '@rolldown/pluginutils': 1.0.0-beta.31 '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.28.0) - vite: 5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0) - vue: 3.5.18(typescript@5.8.3) + vite: 5.4.19(@types/node@18.19.121)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0) + vue: 3.5.18(typescript@5.9.2) transitivePeerDependencies: - supports-color @@ -19889,28 +20362,18 @@ snapshots: dependencies: vite: 2.9.18(sass@1.80.3) - '@vitejs/plugin-vue@1.10.2(vite@2.9.18(sass@1.89.2))': - dependencies: - vite: 2.9.18(sass@1.89.2) - - '@vitejs/plugin-vue@3.2.0(vite@3.2.11(@types/node@18.19.120)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))': - dependencies: - vite: 3.2.11(@types/node@18.19.120)(sass@1.80.3)(terser@5.36.0) - vue: 3.5.12(typescript@5.6.3) - - '@vitejs/plugin-vue@3.2.0(vite@3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5))': + '@vitejs/plugin-vue@1.10.2(vite@2.9.18(sass@1.90.0))': dependencies: - vite: 3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) - vue: 3.5.12(typescript@4.9.5) + vite: 2.9.18(sass@1.90.0) - '@vitejs/plugin-vue@3.2.0(vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5))': + '@vitejs/plugin-vue@3.2.0(vite@3.2.11(@types/node@24.2.0)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5))': dependencies: - vite: 3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + vite: 3.2.11(@types/node@24.2.0)(sass@1.80.3)(terser@5.36.0) vue: 3.5.12(typescript@4.9.5) - '@vitejs/plugin-vue@3.2.0(vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))': + '@vitejs/plugin-vue@3.2.0(vite@3.2.11(@types/node@24.2.0)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3))': dependencies: - vite: 3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + vite: 3.2.11(@types/node@24.2.0)(sass@1.80.3)(terser@5.36.0) vue: 3.5.12(typescript@5.6.3) '@vitejs/plugin-vue@3.2.0(vite@3.2.11(@types/node@20.5.1)(sass@1.89.2)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5))': @@ -19953,10 +20416,10 @@ snapshots: vite: 5.4.19(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0) vue: 3.5.12(typescript@5.6.3) - '@vitejs/plugin-vue@5.2.4(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0))(vue@3.5.18(typescript@5.8.3))': + '@vitejs/plugin-vue@5.2.4(vite@5.4.19(@types/node@24.2.0)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0))(vue@3.5.18(typescript@5.9.2))': dependencies: - vite: 5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0) - vue: 3.5.18(typescript@5.8.3) + vite: 5.4.19(@types/node@24.2.0)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0) + vue: 3.5.18(typescript@5.9.2) '@vitest/expect@0.29.8': dependencies: @@ -20040,7 +20503,7 @@ snapshots: '@volar/typescript-faster@0.40.13': dependencies: - semver: 7.6.3 + semver: 7.7.2 '@volar/typescript@1.11.1': dependencies: @@ -20051,7 +20514,7 @@ snapshots: dependencies: '@volar/language-core': 2.4.15 path-browserify: 1.0.1 - vscode-uri: 3.0.8 + vscode-uri: 3.1.0 '@volar/typescript@2.4.6': dependencies: @@ -20296,7 +20759,7 @@ snapshots: optionalDependencies: typescript: 5.6.3 - '@vue/language-core@1.8.27(typescript@5.8.3)': + '@vue/language-core@1.8.27(typescript@5.9.2)': dependencies: '@volar/language-core': 1.11.1 '@volar/source-map': 1.11.1 @@ -20308,7 +20771,7 @@ snapshots: path-browserify: 1.0.1 vue-template-compiler: 2.7.16 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 '@vue/language-core@2.1.6(typescript@5.6.3)': dependencies: @@ -20323,7 +20786,7 @@ snapshots: optionalDependencies: typescript: 5.6.3 - '@vue/language-core@2.2.12(typescript@5.8.3)': + '@vue/language-core@2.2.12(typescript@5.9.2)': dependencies: '@volar/language-core': 2.4.15 '@vue/compiler-dom': 3.5.18 @@ -20334,7 +20797,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 '@vue/reactivity@3.2.38': dependencies: @@ -20396,11 +20859,11 @@ snapshots: '@vue/shared': 3.5.18 vue: 3.5.18(typescript@5.6.3) - '@vue/server-renderer@3.5.18(vue@3.5.18(typescript@5.8.3))': + '@vue/server-renderer@3.5.18(vue@3.5.18(typescript@5.9.2))': dependencies: '@vue/compiler-ssr': 3.5.18 '@vue/shared': 3.5.18 - vue: 3.5.18(typescript@5.8.3) + vue: 3.5.18(typescript@5.9.2) '@vue/shared@3.2.38': {} @@ -20410,8 +20873,8 @@ snapshots: '@vue/test-utils@2.4.6': dependencies: - js-beautify: 1.15.1 - vue-component-type-helpers: 2.1.6 + js-beautify: 1.15.4 + vue-component-type-helpers: 2.2.12 '@vue/tsconfig@0.5.1': {} @@ -20470,7 +20933,7 @@ snapshots: '@vuedx/typescript-plugin-vue': 0.7.6 '@vuedx/vue-virtual-textdocument': 0.7.6 chalk: 4.1.2 - fast-glob: 3.3.2 + fast-glob: 3.3.3 minimist: 1.2.8 resolve-from: 5.0.0 typescript: 4.9.5 @@ -20503,12 +20966,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@vueuse/core@12.8.2(typescript@5.8.3)': + '@vueuse/core@12.8.2(typescript@5.9.2)': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 12.8.2 - '@vueuse/shared': 12.8.2(typescript@5.8.3) - vue: 3.5.18(typescript@5.8.3) + '@vueuse/shared': 12.8.2(typescript@5.9.2) + vue: 3.5.18(typescript@5.9.2) transitivePeerDependencies: - typescript @@ -20554,9 +21017,9 @@ snapshots: '@vueuse/integrations@12.8.2(async-validator@4.2.5)(axios@1.12.2)(focus-trap@7.6.5)(typescript@5.8.3)': dependencies: - '@vueuse/core': 12.8.2(typescript@5.8.3) - '@vueuse/shared': 12.8.2(typescript@5.8.3) - vue: 3.5.18(typescript@5.8.3) + '@vueuse/core': 12.8.2(typescript@5.9.2) + '@vueuse/shared': 12.8.2(typescript@5.9.2) + vue: 3.5.18(typescript@5.9.2) optionalDependencies: async-validator: 4.2.5 axios: 1.12.2 @@ -20568,9 +21031,9 @@ snapshots: '@vueuse/metadata@9.2.0': {} - '@vueuse/shared@12.8.2(typescript@5.8.3)': + '@vueuse/shared@12.8.2(typescript@5.9.2)': dependencies: - vue: 3.5.18(typescript@5.8.3) + vue: 3.5.18(typescript@5.9.2) transitivePeerDependencies: - typescript @@ -20606,13 +21069,12 @@ snapshots: dependencies: '@types/markdown-it': 12.2.3 '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) - fp-ts: 2.16.9 + fp-ts: 2.16.10 inferred-types: 0.37.6(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) markdown-it: 13.0.2 vite-plugin-md: 0.22.5(@vitejs/plugin-vue@4.6.2(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)))(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)) transitivePeerDependencies: - '@edge-runtime/vm' - - '@vitejs/plugin-vue' - '@vitest/browser' - '@vitest/ui' - encoding @@ -20625,7 +21087,6 @@ snapshots: - sugarss - supports-color - terser - - vite '@yankeeinlondon/builder-api@1.4.1(@vitejs/plugin-vue@5.2.4(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0))(vue@3.5.18(typescript@5.8.3)))(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0)(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0))': dependencies: @@ -20703,7 +21164,7 @@ snapshots: '@yankeeinlondon/gray-matter@6.2.1(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0)': dependencies: - inferred-types: 0.37.6(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0) + inferred-types: 0.37.6(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0) js-yaml: 4.1.0 kind-of: 6.0.3 section-matter: 1.0.0 @@ -20745,7 +21206,7 @@ snapshots: '@yankeeinlondon/happy-wrapper@2.10.1(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0)': dependencies: - fp-ts: 2.16.9 + fp-ts: 2.16.10 happy-dom: 8.9.0 native-dash: 1.25.0(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.80.3)(terser@5.36.0) transitivePeerDependencies: @@ -20762,11 +21223,11 @@ snapshots: - supports-color - terser - '@yankeeinlondon/happy-wrapper@2.10.1(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0)': + '@yankeeinlondon/happy-wrapper@2.10.1(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0)': dependencies: - fp-ts: 2.16.9 + fp-ts: 2.16.10 happy-dom: 8.9.0 - native-dash: 1.25.0(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0) + native-dash: 1.25.0(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0) transitivePeerDependencies: - '@edge-runtime/vm' - '@vitest/browser' @@ -20810,8 +21271,6 @@ snapshots: acorn@8.13.0: {} - acorn@8.14.0: {} - acorn@8.15.0: {} add-stream@1.0.0: {} @@ -20859,7 +21318,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.3 + fast-uri: 3.0.6 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -20881,21 +21340,40 @@ snapshots: '@algolia/requester-node-http': 4.24.0 '@algolia/transporter': 4.24.0 - algoliasearch@5.34.1: - dependencies: - '@algolia/client-abtesting': 5.34.1 - '@algolia/client-analytics': 5.34.1 - '@algolia/client-common': 5.34.1 - '@algolia/client-insights': 5.34.1 - '@algolia/client-personalization': 5.34.1 - '@algolia/client-query-suggestions': 5.34.1 - '@algolia/client-search': 5.34.1 - '@algolia/ingestion': 1.34.1 - '@algolia/monitoring': 1.34.1 - '@algolia/recommend': 5.34.1 - '@algolia/requester-browser-xhr': 5.34.1 - '@algolia/requester-fetch': 5.34.1 - '@algolia/requester-node-http': 5.34.1 + algoliasearch@4.25.2: + dependencies: + '@algolia/cache-browser-local-storage': 4.25.2 + '@algolia/cache-common': 4.25.2 + '@algolia/cache-in-memory': 4.25.2 + '@algolia/client-account': 4.25.2 + '@algolia/client-analytics': 4.25.2 + '@algolia/client-common': 4.25.2 + '@algolia/client-personalization': 4.25.2 + '@algolia/client-search': 4.25.2 + '@algolia/logger-common': 4.25.2 + '@algolia/logger-console': 4.25.2 + '@algolia/recommend': 4.25.2 + '@algolia/requester-browser-xhr': 4.25.2 + '@algolia/requester-common': 4.25.2 + '@algolia/requester-node-http': 4.25.2 + '@algolia/transporter': 4.25.2 + + algoliasearch@5.35.0: + dependencies: + '@algolia/abtesting': 1.1.0 + '@algolia/client-abtesting': 5.35.0 + '@algolia/client-analytics': 5.35.0 + '@algolia/client-common': 5.35.0 + '@algolia/client-insights': 5.35.0 + '@algolia/client-personalization': 5.35.0 + '@algolia/client-query-suggestions': 5.35.0 + '@algolia/client-search': 5.35.0 + '@algolia/ingestion': 1.35.0 + '@algolia/monitoring': 1.35.0 + '@algolia/recommend': 5.35.0 + '@algolia/requester-browser-xhr': 5.35.0 + '@algolia/requester-fetch': 5.35.0 + '@algolia/requester-node-http': 5.35.0 alien-signals@1.0.13: {} @@ -21108,7 +21586,7 @@ snapshots: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.24.0 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.2: dependencies: @@ -21122,7 +21600,7 @@ snapshots: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.24.0 - es-shim-unscopables: 1.0.2 + es-shim-unscopables: 1.1.0 arraybuffer.prototype.slice@1.0.3: dependencies: @@ -21157,7 +21635,7 @@ snapshots: async-done@1.3.2: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 process-nextick-args: 2.0.1 stream-exhaust: 1.0.2 @@ -21176,8 +21654,6 @@ snapshots: dependencies: lodash: 4.17.21 - async@3.2.6: {} - asynckit@0.4.0: {} atob@2.1.2: {} @@ -21194,11 +21670,11 @@ snapshots: available-typed-arrays@1.0.7: dependencies: - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 axios@0.21.4: dependencies: - follow-redirects: 1.15.9 + follow-redirects: 1.15.11 transitivePeerDependencies: - debug @@ -21319,7 +21795,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.27.1 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -21332,7 +21808,13 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.28.2 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.28.0 + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.28.2 + cosmiconfig: 7.1.0 + resolve: 1.22.10 babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.8): dependencies: @@ -21381,7 +21863,7 @@ snapshots: dependencies: '@babel/core': 7.28.0 '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.0) - core-js-compat: 3.44.0 + core-js-compat: 3.45.0 transitivePeerDependencies: - supports-color @@ -21412,14 +21894,14 @@ snapshots: core-js: 2.6.12 regenerator-runtime: 0.10.5 - babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.8): + babel-preset-current-node-syntax@1.2.0(@babel/core@7.25.8): dependencies: '@babel/core': 7.25.8 '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.8) '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.8) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.8) '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.8) - '@babel/plugin-syntax-import-attributes': 7.25.7(@babel/core@7.25.8) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.25.8) '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.8) '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.8) '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.8) @@ -21431,14 +21913,14 @@ snapshots: '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.8) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.8) - babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.0): + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.0): dependencies: '@babel/core': 7.28.0 '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0) '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.0) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0) - '@babel/plugin-syntax-import-attributes': 7.25.7(@babel/core@7.28.0) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.0) '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0) '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0) @@ -21454,13 +21936,13 @@ snapshots: dependencies: '@babel/core': 7.25.8 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.8) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.25.8) babel-preset-jest@29.6.3(@babel/core@7.28.0): dependencies: '@babel/core': 7.28.0 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.0) babel-register@6.26.0: dependencies: @@ -21599,12 +22081,12 @@ snapshots: boolbase@1.0.0: {} - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -21634,7 +22116,7 @@ snapshots: dependencies: fill-range: 7.1.1 - brilliant-errors@0.7.3(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0): + brilliant-errors@0.7.3(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0): dependencies: bumpp: 8.2.1 callsites: 4.2.0 @@ -21674,7 +22156,7 @@ snapshots: - supports-color - terser - brilliant-errors@0.7.3(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0): + brilliant-errors@0.7.3(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0): dependencies: bumpp: 8.2.1 callsites: 4.2.0 @@ -21703,8 +22185,8 @@ snapshots: browserslist@4.25.1: dependencies: - caniuse-lite: 1.0.30001727 - electron-to-chromium: 1.5.191 + caniuse-lite: 1.0.30001731 + electron-to-chromium: 1.5.197 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.1) @@ -21751,10 +22233,10 @@ snapshots: dependencies: '@jsdevtools/ez-spawn': 3.0.4 cac: 6.7.14 - fast-glob: 3.3.2 + fast-glob: 3.3.3 kleur: 4.1.5 prompts: 2.4.2 - semver: 7.6.3 + semver: 7.7.2 bytes@3.1.2: {} @@ -21774,8 +22256,8 @@ snapshots: cacheable@1.10.3: dependencies: - hookified: 1.10.0 - keyv: 5.4.0 + hookified: 1.11.0 + keyv: 5.5.0 call-bind-apply-helpers@1.0.2: dependencies: @@ -21834,7 +22316,7 @@ snapshots: caniuse-lite@1.0.30001669: {} - caniuse-lite@1.0.30001727: {} + caniuse-lite@1.0.30001731: {} ccount@2.0.1: {} @@ -21869,7 +22351,7 @@ snapshots: chalk@5.3.0: {} - chalk@5.4.1: {} + chalk@5.5.0: {} change-case@3.1.0: dependencies: @@ -21954,9 +22436,13 @@ snapshots: dependencies: readdirp: 4.0.2 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + ci-info@3.9.0: {} - cjs-module-lexer@1.4.1: {} + cjs-module-lexer@1.4.3: {} class-utils@0.3.6: dependencies: @@ -22121,7 +22607,7 @@ snapshots: compressible@2.0.18: dependencies: - mime-db: 1.53.0 + mime-db: 1.54.0 compressing@1.10.3: dependencies: @@ -22130,7 +22616,7 @@ snapshots: get-ready: 1.0.0 iconv-lite: 0.5.2 mkdirp: 0.5.6 - pump: 3.0.2 + pump: 3.0.3 streamifier: 0.1.1 tar-stream: 1.6.2 yazl: 2.5.1 @@ -22279,10 +22765,10 @@ snapshots: dependencies: '@hutson/parse-repository-url': 5.0.0 add-stream: 1.0.0 - conventional-changelog-writer: 8.0.0 - conventional-commits-parser: 6.0.0 - git-raw-commits: 5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.0.0) - git-semver-tags: 8.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.0.0) + conventional-changelog-writer: 8.2.0 + conventional-commits-parser: 6.2.0 + git-raw-commits: 5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) + git-semver-tags: 8.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) hosted-git-info: 7.0.2 normalize-package-data: 6.0.2 read-package-up: 11.0.0 @@ -22339,13 +22825,12 @@ snapshots: split: 1.0.1 through2: 4.0.2 - conventional-changelog-writer@8.0.0: + conventional-changelog-writer@8.2.0: dependencies: - '@types/semver': 7.5.8 conventional-commits-filter: 5.0.0 handlebars: 4.7.8 meow: 13.2.0 - semver: 7.6.3 + semver: 7.7.2 conventional-changelog@3.1.25: dependencies: @@ -22407,7 +22892,7 @@ snapshots: meow: 12.1.1 split2: 4.2.0 - conventional-commits-parser@6.0.0: + conventional-commits-parser@6.2.0: dependencies: meow: 13.2.0 @@ -22446,7 +22931,7 @@ snapshots: dependencies: browserslist: 4.24.2 - core-js-compat@3.44.0: + core-js-compat@3.45.0: dependencies: browserslist: 4.25.1 @@ -22482,46 +22967,54 @@ snapshots: jiti: 1.21.6 typescript: 5.6.3 - cosmiconfig-typescript-loader@5.1.0(@types/node@20.5.1)(cosmiconfig@9.0.0(typescript@4.9.5))(typescript@4.9.5): + cosmiconfig-typescript-loader@5.1.0(@types/node@24.2.0)(cosmiconfig@9.0.0(typescript@4.9.5))(typescript@4.9.5): dependencies: - '@types/node': 20.5.1 + '@types/node': 24.2.0 cosmiconfig: 9.0.0(typescript@4.9.5) jiti: 1.21.6 typescript: 4.9.5 - cosmiconfig-typescript-loader@6.1.0(@types/node@18.19.120)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): + cosmiconfig-typescript-loader@6.1.0(@types/node@18.19.121)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2): dependencies: - '@types/node': 18.19.120 - cosmiconfig: 9.0.0(typescript@5.8.3) + '@types/node': 18.19.121 + cosmiconfig: 9.0.0(typescript@5.9.2) jiti: 2.5.1 - typescript: 5.8.3 + typescript: 5.9.2 - cosmiconfig@8.3.6(typescript@5.8.3): + cosmiconfig@7.1.0: dependencies: - import-fresh: 3.3.0 + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cosmiconfig@8.3.6(typescript@5.9.2): + dependencies: + import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 cosmiconfig@9.0.0(typescript@4.9.5): dependencies: env-paths: 2.2.1 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: typescript: 4.9.5 - cosmiconfig@9.0.0(typescript@5.8.3): + cosmiconfig@9.0.0(typescript@5.9.2): dependencies: env-paths: 2.2.1 - import-fresh: 3.3.0 + import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 cp-file@10.0.0: dependencies: @@ -22545,13 +23038,13 @@ snapshots: p-filter: 3.0.0 p-map: 6.0.0 - create-jest@29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.6.3)): + create-jest@29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -22560,13 +23053,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)): + create-jest@29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -22575,43 +23068,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)): + create-jest@29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - create-jest@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - create-jest@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -22622,19 +23085,13 @@ snapshots: create-require@1.1.1: {} - cross-spawn@6.0.5: + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 path-key: 2.0.1 semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 + shebang-command: 1.2.0 + which: 1.3.1 cross-spawn@7.0.6: dependencies: @@ -22651,12 +23108,12 @@ snapshots: change-case: 3.1.0 postcss: 6.0.23 - css-select@5.1.0: + css-select@5.2.2: dependencies: boolbase: 1.0.0 - css-what: 6.1.0 + css-what: 6.2.2 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 nth-check: 2.1.1 css-selector-extract@3.3.6: @@ -22678,7 +23135,7 @@ snapshots: mdn-data: 2.12.2 source-map-js: 1.2.1 - css-what@6.1.0: {} + css-what@6.2.2: {} css.escape@1.5.1: {} @@ -22751,7 +23208,7 @@ snapshots: date-fns@2.30.0: dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.28.2 date-fns@3.6.0: {} @@ -22786,11 +23243,13 @@ snapshots: decamelize@5.0.1: {} - decimal.js@10.4.3: {} + decimal.js@10.6.0: {} decode-uri-component@0.2.2: {} - dedent@1.5.3: {} + dedent@1.6.0(babel-plugin-macros@3.1.0): + optionalDependencies: + babel-plugin-macros: 3.1.0 deep-eql@4.1.4: dependencies: @@ -22798,8 +23257,8 @@ snapshots: deep-equal@2.2.3: dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 es-get-iterator: 1.1.3 get-intrinsic: 1.3.0 is-arguments: 1.1.1 @@ -22810,12 +23269,12 @@ snapshots: isarray: 2.0.5 object-is: 1.1.6 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.3 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 + object.assign: 4.1.7 + regexp.prototype.flags: 1.5.4 + side-channel: 1.1.0 + which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.15 + which-typed-array: 1.1.19 deep-is@0.1.4: {} @@ -22934,7 +23393,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - domutils@3.1.0: + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -22962,7 +23421,7 @@ snapshots: duplexify@3.7.1: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 inherits: 2.0.4 readable-stream: 2.3.8 stream-shift: 1.0.3 @@ -22986,15 +23445,11 @@ snapshots: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.1 - semver: 7.6.3 + semver: 7.7.2 ee-first@1.1.1: {} - ejs@3.1.10: - dependencies: - jake: 10.9.2 - - electron-to-chromium@1.5.191: {} + electron-to-chromium@1.5.197: {} electron-to-chromium@1.5.41: {} @@ -23016,7 +23471,7 @@ snapshots: encodeurl@2.0.0: {} - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -23036,6 +23491,8 @@ snapshots: entities@4.5.0: {} + entities@6.0.1: {} + env-paths@2.2.1: {} environment@1.1.0: {} @@ -23162,9 +23619,9 @@ snapshots: is-arguments: 1.1.1 is-map: 2.0.3 is-set: 2.0.3 - is-string: 1.0.7 + is-string: 1.1.1 isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 + stop-iteration-iterator: 1.1.0 es-object-atoms@1.0.0: dependencies: @@ -23198,8 +23655,8 @@ snapshots: es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 es5-ext@0.10.64: dependencies: @@ -23324,7 +23781,7 @@ snapshots: esbuild-register@3.6.0(esbuild@0.23.1): dependencies: - debug: 4.3.7 + debug: 4.4.1 esbuild: 0.23.1 transitivePeerDependencies: - supports-color @@ -23334,7 +23791,7 @@ snapshots: esbuild: 0.23.1 resolve: 1.22.8 safe-identifier: 0.4.2 - sass: 1.80.3 + sass: 1.90.0 sass-embedded: 1.80.3 esbuild-sunos-64@0.14.54: @@ -23770,7 +24227,7 @@ snapshots: execa@5.1.1: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -23942,13 +24399,13 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-uri@3.0.3: {} + fast-uri@3.0.6: {} fastest-levenshtein@1.0.16: {} - fastq@1.17.1: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 fb-watchman@2.0.2: dependencies: @@ -23973,10 +24430,6 @@ snapshots: file-uri-to-path@1.0.0: optional: true - filelist@1.0.4: - dependencies: - minimatch: 5.1.6 - filename-regex@2.0.1: optional: true @@ -24018,7 +24471,9 @@ snapshots: make-dir: 3.1.0 pkg-dir: 4.2.0 - find-up-simple@1.0.0: {} + find-root@1.1.0: {} + + find-up-simple@1.0.1: {} find-up@1.1.2: dependencies: @@ -24104,6 +24559,8 @@ snapshots: dependencies: tabbable: 6.2.0 + follow-redirects@1.15.11: {} + follow-redirects@1.15.9: {} for-each@0.3.3: @@ -24151,7 +24608,7 @@ snapshots: forwarded@0.2.0: {} - fp-ts@2.16.9: {} + fp-ts@2.16.10: {} fraction.js@4.3.7: {} @@ -24171,7 +24628,7 @@ snapshots: jsonfile: 6.1.0 universalify: 2.0.1 - fs-extra@11.3.0: + fs-extra@11.3.1: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -24201,7 +24658,7 @@ snapshots: fsevents@1.2.13: dependencies: bindings: 1.5.0 - nan: 2.22.0 + nan: 2.23.0 optional: true fsevents@2.3.3: @@ -24306,9 +24763,9 @@ snapshots: meow: 12.1.1 split2: 4.2.0 - git-raw-commits@5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.0.0): + git-raw-commits@5.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0): dependencies: - '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.0.0) + '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) meow: 13.2.0 transitivePeerDependencies: - conventional-commits-filter @@ -24324,9 +24781,9 @@ snapshots: meow: 8.1.2 semver: 6.3.1 - git-semver-tags@8.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.0.0): + git-semver-tags@8.0.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0): dependencies: - '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.0.0) + '@conventional-changelog/git-client': 1.0.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.0) meow: 13.2.0 transitivePeerDependencies: - conventional-commits-filter @@ -24465,7 +24922,7 @@ snapshots: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -24473,7 +24930,7 @@ snapshots: globby@13.2.2: dependencies: dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 ignore: 5.3.2 merge2: 1.4.1 slash: 4.0.0 @@ -24655,6 +25112,8 @@ snapshots: has-bigints@1.0.2: {} + has-bigints@1.1.0: {} + has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -24744,7 +25203,7 @@ snapshots: hookable@5.5.3: {} - hookified@1.10.0: {} + hookified@1.11.0: {} hosted-git-info@2.8.9: {} @@ -24824,6 +25283,11 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + import-lazy@4.0.0: {} import-local@3.2.0: @@ -24839,7 +25303,11 @@ snapshots: indent-string@5.0.0: {} - index-to-position@0.1.2: {} + index-to-position@1.1.0: {} + + inferred-types@0.37.6: + dependencies: + brilliant-errors: 0.7.3(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0) inferred-types@0.37.6: dependencies: @@ -24847,7 +25315,7 @@ snapshots: inferred-types@0.37.6(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0): dependencies: - brilliant-errors: 0.7.3(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0) + brilliant-errors: 0.7.3(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0) transitivePeerDependencies: - '@edge-runtime/vm' - '@vitest/browser' @@ -24879,9 +25347,9 @@ snapshots: - supports-color - terser - inferred-types@0.37.6(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0): + inferred-types@0.37.6(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0): dependencies: - brilliant-errors: 0.7.3(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0) + brilliant-errors: 0.7.3(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0) transitivePeerDependencies: - '@edge-runtime/vm' - '@vitest/browser' @@ -24909,24 +25377,28 @@ snapshots: inquirer@9.3.7: dependencies: - '@inquirer/figures': 1.0.7 + '@inquirer/figures': 1.0.13 ansi-escapes: 4.3.2 cli-width: 4.1.0 external-editor: 3.1.0 mute-stream: 1.0.0 ora: 5.4.1 run-async: 3.0.0 - rxjs: 7.8.1 + rxjs: 7.8.2 string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 + interactjs@1.10.27: + dependencies: + '@interactjs/types': 1.10.27 + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 - side-channel: 1.0.6 + side-channel: 1.1.0 internal-slot@1.1.0: dependencies: @@ -24957,9 +25429,9 @@ snapshots: dependencies: hasown: 2.0.2 - is-arguments@1.1.1: + is-arguments@1.2.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-array-buffer@3.0.4: @@ -24989,7 +25461,7 @@ snapshots: is-bigint@1.1.0: dependencies: - has-bigints: 1.0.2 + has-bigints: 1.1.0 is-binary-path@1.0.1: dependencies: @@ -25177,7 +25649,7 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 is-regex@1.1.4: dependencies: @@ -25276,7 +25748,7 @@ snapshots: dependencies: call-bound: 1.0.4 - is-weakset@2.0.3: + is-weakset@2.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.3.0 @@ -25307,7 +25779,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.28.0 '@babel/parser': 7.28.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 @@ -25317,11 +25789,11 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.28.0 '@babel/parser': 7.28.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.3 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -25354,29 +25826,22 @@ snapshots: dependencies: '@isaacs/cliui': 8.0.2 - jake@10.9.2: - dependencies: - async: 3.2.6 - chalk: 4.1.2 - filelist: 1.0.4 - minimatch: 3.1.2 - jest-changed-files@29.7.0: dependencies: execa: 5.1.1 jest-util: 29.7.0 p-limit: 3.1.0 - jest-circus@29.7.0: + jest-circus@29.7.0(babel-plugin-macros@3.1.0): dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.120 + '@types/node': 18.19.121 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.3 + dedent: 1.6.0(babel-plugin-macros@3.1.0) is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -25393,54 +25858,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.6.3)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.6.3)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.6.3)) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.6.3)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-cli@29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest-cli@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)): + jest-cli@29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + create-jest: 29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + jest-config: 29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -25450,16 +25877,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)): + jest-cli@29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) + create-jest: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) + jest-config: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -25469,16 +25896,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): + jest-cli@29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + create-jest: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + jest-config: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -25488,111 +25915,18 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.6.3)): - dependencies: - '@babel/core': 7.25.8 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.8) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 18.19.120 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.8.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)): - dependencies: - '@babel/core': 7.25.8 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.8) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 18.19.120 - ts-node: 10.9.2(@types/node@18.19.120)(typescript@5.8.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)): - dependencies: - '@babel/core': 7.25.8 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.8) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 18.19.120 - ts-node: 10.9.2(@types/node@18.19.57)(typescript@4.9.5) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - jest-config@29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)): + jest-config@29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)): dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.28.0 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.8) + babel-jest: 29.7.0(@babel/core@7.28.0) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) jest-environment-node: 29.7.0 jest-get-type: 29.6.3 jest-regex-util: 29.6.3 @@ -25606,24 +25940,24 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 18.19.120 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@4.9.5) + '@types/node': 18.19.121 + ts-node: 10.9.2(@types/node@18.19.121)(typescript@5.9.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): + jest-config@29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)): dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.28.0 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.8) + babel-jest: 29.7.0(@babel/core@7.28.0) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) jest-environment-node: 29.7.0 jest-get-type: 29.6.3 jest-regex-util: 29.6.3 @@ -25637,24 +25971,24 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 18.19.120 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.6.3) + '@types/node': 18.19.121 + ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.9.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)): + jest-config@29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3)): dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.28.0 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.8) + babel-jest: 29.7.0(@babel/core@7.28.0) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) jest-environment-node: 29.7.0 jest-get-type: 29.6.3 jest-regex-util: 29.6.3 @@ -25668,8 +26002,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 18.19.57 - ts-node: 10.9.2(@types/node@18.19.57)(typescript@4.9.5) + '@types/node': 18.19.121 + ts-node: 10.9.2(@types/node@24.2.0)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -25769,16 +26103,16 @@ snapshots: jest-config@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)): dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.28.0 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.8) + babel-jest: 29.7.0(@babel/core@7.28.0) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) jest-environment-node: 29.7.0 jest-get-type: 29.6.3 jest-regex-util: 29.6.3 @@ -25792,24 +26126,24 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.5.1 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@4.9.5) + '@types/node': 24.2.0 + ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.9.2) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): + jest-config@29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3)): dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.28.0 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.8) + babel-jest: 29.7.0(@babel/core@7.28.0) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) jest-environment-node: 29.7.0 jest-get-type: 29.6.3 jest-regex-util: 29.6.3 @@ -25823,8 +26157,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.5.1 - ts-node: 10.9.2(@types/node@20.5.1)(typescript@5.6.3) + '@types/node': 24.2.0 + ts-node: 10.9.2(@types/node@24.2.0)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -25861,7 +26195,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 18.19.120 + '@types/node': 18.19.121 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -25875,7 +26209,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.120 + '@types/node': 18.19.121 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -25887,7 +26221,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 18.19.120 + '@types/node': 18.19.121 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -25926,7 +26260,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.120 + '@types/node': 18.19.121 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -25961,7 +26295,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.120 + '@types/node': 18.19.121 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -25989,9 +26323,9 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.120 + '@types/node': 18.19.121 chalk: 4.1.2 - cjs-module-lexer: 1.4.1 + cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 glob: 7.2.3 graceful-fs: 4.2.11 @@ -26017,7 +26351,7 @@ snapshots: '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.8) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.0) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -26028,14 +26362,14 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.3 + semver: 7.7.2 transitivePeerDependencies: - supports-color jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 18.19.120 + '@types/node': 18.19.121 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -26054,7 +26388,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.19.120 + '@types/node': 18.19.121 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -26063,65 +26397,41 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 18.19.120 + '@types/node': 18.19.121 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.6.3)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.6.3)) - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.6.3)) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest@29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)) - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - - jest@29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)): + jest@29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.19.57)(ts-node@10.9.2(@types/node@18.19.57)(typescript@4.9.5)) + jest-cli: 29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)): + jest@29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5)) + jest-cli: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@4.9.5)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)): + jest@29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.5.1)(ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3)) + jest-cli: 29.7.0(@types/node@24.2.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -26134,7 +26444,7 @@ snapshots: jju@1.4.0: {} - js-beautify@1.15.1: + js-beautify@1.15.4: dependencies: config-chain: 1.1.13 editorconfig: 1.0.4 @@ -26156,6 +26466,8 @@ snapshots: js-tokens@9.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -26173,16 +26485,16 @@ snapshots: cssom: 0.5.0 cssstyle: 2.3.0 data-urls: 3.0.2 - decimal.js: 10.4.3 + decimal.js: 10.6.0 domexception: 4.0.0 escodegen: 2.1.0 - form-data: 4.0.1 + form-data: 4.0.4 html-encoding-sniffer: 3.0.0 http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.13 - parse5: 7.2.0 + nwsapi: 2.2.21 + parse5: 7.3.0 saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 4.1.4 @@ -26191,7 +26503,7 @@ snapshots: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.18.0 + ws: 8.18.3 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -26202,6 +26514,8 @@ snapshots: jsesc@3.0.2: {} + jsesc@3.1.0: {} + json-buffer@3.0.1: {} json-parse-better-errors@1.0.2: {} @@ -26252,7 +26566,7 @@ snapshots: dependencies: json-buffer: 3.0.1 - keyv@5.4.0: + keyv@5.5.0: dependencies: '@keyv/serialize': 1.1.0 @@ -26335,20 +26649,20 @@ snapshots: lint-staged@15.5.2: dependencies: - chalk: 5.4.1 + chalk: 5.5.0 commander: 13.1.0 debug: 4.4.1 execa: 8.0.1 lilconfig: 3.1.3 - listr2: 8.2.5 + listr2: 8.3.3 micromatch: 4.0.8 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.8.0 + yaml: 2.8.1 transitivePeerDependencies: - supports-color - listr2@8.2.5: + listr2@8.3.3: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 @@ -26379,6 +26693,11 @@ snapshots: mlly: 1.7.2 pkg-types: 1.2.1 + local-pkg@0.5.1: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + locate-path@2.0.0: dependencies: p-locate: 2.0.0 @@ -26492,12 +26811,12 @@ snapshots: log-symbols@5.1.0: dependencies: - chalk: 5.4.1 + chalk: 5.3.0 is-unicode-supported: 1.3.0 log-symbols@6.0.0: dependencies: - chalk: 5.4.1 + chalk: 5.5.0 is-unicode-supported: 1.3.0 log-update@6.1.0: @@ -26552,7 +26871,7 @@ snapshots: magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 make-dir-cli@4.0.0: dependencies: @@ -26570,7 +26889,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.3 + semver: 7.7.2 make-dir@5.0.0: {} @@ -26787,7 +27106,7 @@ snapshots: mime-db@1.52.0: {} - mime-db@1.53.0: {} + mime-db@1.54.0: {} mime-types@2.1.35: dependencies: @@ -26809,27 +27128,23 @@ snapshots: minimatch@3.0.8: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 - - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 + brace-expansion: 1.1.12 minimatch@7.4.6: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimatch@9.0.1: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist-options@4.1.0: dependencies: @@ -26865,6 +27180,13 @@ snapshots: pkg-types: 1.2.1 ufo: 1.5.4 + mlly@1.7.4: + dependencies: + acorn: 8.15.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.1 + modify-values@1.0.1: {} moment@2.29.1: {} @@ -26895,7 +27217,7 @@ snapshots: mxgraph@4.2.2: {} - nan@2.22.0: + nan@2.23.0: optional: true nanoid@3.3.11: {} @@ -26936,10 +27258,10 @@ snapshots: - supports-color - terser - native-dash@1.25.0(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0): + native-dash@1.25.0(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0): dependencies: - brilliant-errors: 0.7.3(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0) - inferred-types: 0.37.6(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0) + brilliant-errors: 0.7.3(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0) + inferred-types: 0.37.6(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0) transitivePeerDependencies: - '@edge-runtime/vm' - '@vitest/browser' @@ -27027,7 +27349,7 @@ snapshots: normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 - semver: 7.6.3 + semver: 7.7.2 validate-npm-package-license: 3.0.4 normalize-path@2.1.1: @@ -27046,12 +27368,12 @@ snapshots: dependencies: ansi-styles: 3.2.1 chalk: 2.4.2 - cross-spawn: 6.0.5 + cross-spawn: 6.0.6 memorystream: 0.3.1 minimatch: 3.1.2 pidtree: 0.3.1 read-pkg: 3.0.0 - shell-quote: 1.8.1 + shell-quote: 1.8.3 string.prototype.padend: 3.1.6 npm-run-path@4.0.1: @@ -27068,7 +27390,7 @@ snapshots: number-is-nan@1.0.1: {} - nwsapi@2.2.13: {} + nwsapi@2.2.21: {} object-assign@3.0.0: {} @@ -27088,7 +27410,7 @@ snapshots: object-is@1.1.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 object-keys@1.1.1: {} @@ -27128,16 +27450,16 @@ snapshots: object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 object.groupby@1.0.3: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.3 + es-abstract: 1.24.0 object.map@1.0.1: dependencies: @@ -27241,7 +27563,7 @@ snapshots: ora@8.1.0: dependencies: - chalk: 5.3.0 + chalk: 5.5.0 cli-cursor: 5.0.0 cli-spinners: 2.9.2 is-interactive: 2.0.0 @@ -27253,7 +27575,7 @@ snapshots: ora@8.2.0: dependencies: - chalk: 5.4.1 + chalk: 5.5.0 cli-cursor: 5.0.0 cli-spinners: 2.9.2 is-interactive: 2.0.0 @@ -27319,7 +27641,7 @@ snapshots: p-limit@5.0.0: dependencies: - yocto-queue: 1.1.1 + yocto-queue: 1.2.1 p-locate@2.0.0: dependencies: @@ -27353,7 +27675,9 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@0.2.2: {} + package-manager-detector@0.2.11: + dependencies: + quansync: 0.2.10 param-case@2.1.1: dependencies: @@ -27393,7 +27717,7 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-json@8.1.0: + parse-json@8.3.0: dependencies: '@babel/code-frame': 7.27.1 index-to-position: 0.1.2 @@ -27403,9 +27727,9 @@ snapshots: parse-passwd@1.0.0: {} - parse5@7.2.0: + parse5@7.3.0: dependencies: - entities: 4.5.0 + entities: 6.0.1 parseurl@1.3.3: {} @@ -27478,6 +27802,8 @@ snapshots: pathe@1.1.2: {} + pathe@2.0.3: {} + pathval@1.1.1: {} pause-stream@0.0.11: @@ -27494,6 +27820,8 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.3: {} + pidtree@0.3.1: {} pidtree@0.6.0: {} @@ -27510,7 +27838,7 @@ snapshots: pinkie@2.0.4: {} - pirates@4.0.6: {} + pirates@4.0.7: {} pkg-dir@4.2.0: dependencies: @@ -27522,6 +27850,12 @@ snapshots: mlly: 1.7.2 pathe: 1.1.2 + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + plugin-error@0.1.2: dependencies: ansi-cyan: 0.1.1 @@ -27554,6 +27888,8 @@ snapshots: possible-typed-array-names@1.0.0: {} + possible-typed-array-names@1.1.0: {} + postcss-media-query-parser@0.2.3: {} postcss-resolve-nested-selector@0.1.6: {} @@ -27566,9 +27902,9 @@ snapshots: dependencies: postcss: 8.5.6 - postcss-scss@4.0.9(postcss@8.4.47): + postcss-scss@4.0.9(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 postcss-selector-parser@6.1.2: dependencies: @@ -27580,9 +27916,9 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-sorting@8.0.2(postcss@8.4.47): + postcss-sorting@8.0.2(postcss@8.5.6): dependencies: - postcss: 8.4.47 + postcss: 8.5.6 postcss-value-parser@4.2.0: {} @@ -27606,6 +27942,8 @@ snapshots: preact@10.24.3: {} + preact@10.27.0: {} + prelude-ls@1.2.1: {} preserve@0.2.0: @@ -27640,7 +27978,7 @@ snapshots: pretty-hrtime@1.0.3: {} - prismjs@1.29.0: {} + prismjs@1.30.0: {} private@0.1.8: {} @@ -27668,16 +28006,18 @@ snapshots: proxy-from-env@1.1.0: {} - psl@1.9.0: {} + psl@1.15.0: + dependencies: + punycode: 2.3.1 pump@2.0.1: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 - pump@3.0.2: + pump@3.0.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 pumpify@1.5.1: @@ -27696,7 +28036,9 @@ snapshots: qs@6.13.0: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 + + quansync@0.2.10: {} querystringify@2.2.0: {} @@ -27748,9 +28090,9 @@ snapshots: read-package-up@11.0.0: dependencies: - find-up-simple: 1.0.0 + find-up-simple: 1.0.1 read-pkg: 9.0.1 - type-fest: 4.26.1 + type-fest: 4.41.0 read-pkg-up@1.0.1: dependencies: @@ -27804,8 +28146,8 @@ snapshots: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 6.0.2 - parse-json: 8.1.0 - type-fest: 4.26.1 + parse-json: 8.3.0 + type-fest: 4.41.0 unicorn-magic: 0.1.0 read-yaml-file@1.1.0: @@ -27859,6 +28201,8 @@ snapshots: readdirp@4.0.2: {} + readdirp@4.1.2: {} + rechoir@0.6.2: dependencies: resolve: 1.22.10 @@ -27900,7 +28244,7 @@ snapshots: regenerator-transform@0.15.2: dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.28.2 regex-cache@0.4.4: dependencies: @@ -28030,7 +28374,7 @@ snapshots: resolve-url@0.2.1: {} - resolve.exports@2.0.2: {} + resolve.exports@2.0.3: {} resolve@1.19.0: dependencies: @@ -28066,7 +28410,7 @@ snapshots: ret@0.1.15: {} - reusify@1.0.4: {} + reusify@1.1.0: {} rfdc@1.4.1: {} @@ -28102,16 +28446,26 @@ snapshots: tslib: 2.8.0 typescript: 5.6.3 - rollup-plugin-typescript2@0.36.0(rollup@4.45.1)(typescript@4.9.5): + rollup-plugin-typescript2@0.36.0(rollup@4.46.2)(typescript@4.9.5): dependencies: '@rollup/pluginutils': 4.2.1 find-cache-dir: 3.3.2 fs-extra: 10.1.0 - rollup: 4.45.1 + rollup: 4.46.2 semver: 7.6.3 tslib: 2.8.0 typescript: 4.9.5 + rollup-plugin-typescript2@0.36.0(rollup@4.46.2)(typescript@5.9.2): + dependencies: + '@rollup/pluginutils': 4.2.1 + find-cache-dir: 3.3.2 + fs-extra: 10.1.0 + rollup: 4.46.2 + semver: 7.6.3 + tslib: 2.8.0 + typescript: 5.9.2 + rollup-plugin-visualizer@5.12.0(rollup@4.24.0): dependencies: open: 8.4.2 @@ -28121,14 +28475,14 @@ snapshots: optionalDependencies: rollup: 4.24.0 - rollup-plugin-visualizer@5.12.0(rollup@4.45.1): + rollup-plugin-visualizer@5.12.0(rollup@4.46.2): dependencies: open: 8.4.2 picomatch: 2.3.1 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: - rollup: 4.45.1 + rollup: 4.46.2 rollup-plugin-vue@6.0.0(@vue/compiler-sfc@3.5.12): dependencies: @@ -28186,30 +28540,30 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.24.0 fsevents: 2.3.3 - rollup@4.45.1: + rollup@4.46.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.45.1 - '@rollup/rollup-android-arm64': 4.45.1 - '@rollup/rollup-darwin-arm64': 4.45.1 - '@rollup/rollup-darwin-x64': 4.45.1 - '@rollup/rollup-freebsd-arm64': 4.45.1 - '@rollup/rollup-freebsd-x64': 4.45.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.45.1 - '@rollup/rollup-linux-arm-musleabihf': 4.45.1 - '@rollup/rollup-linux-arm64-gnu': 4.45.1 - '@rollup/rollup-linux-arm64-musl': 4.45.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.45.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-gnu': 4.45.1 - '@rollup/rollup-linux-riscv64-musl': 4.45.1 - '@rollup/rollup-linux-s390x-gnu': 4.45.1 - '@rollup/rollup-linux-x64-gnu': 4.45.1 - '@rollup/rollup-linux-x64-musl': 4.45.1 - '@rollup/rollup-win32-arm64-msvc': 4.45.1 - '@rollup/rollup-win32-ia32-msvc': 4.45.1 - '@rollup/rollup-win32-x64-msvc': 4.45.1 + '@rollup/rollup-android-arm-eabi': 4.46.2 + '@rollup/rollup-android-arm64': 4.46.2 + '@rollup/rollup-darwin-arm64': 4.46.2 + '@rollup/rollup-darwin-x64': 4.46.2 + '@rollup/rollup-freebsd-arm64': 4.46.2 + '@rollup/rollup-freebsd-x64': 4.46.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.2 + '@rollup/rollup-linux-arm-musleabihf': 4.46.2 + '@rollup/rollup-linux-arm64-gnu': 4.46.2 + '@rollup/rollup-linux-arm64-musl': 4.46.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.2 + '@rollup/rollup-linux-ppc64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-gnu': 4.46.2 + '@rollup/rollup-linux-riscv64-musl': 4.46.2 + '@rollup/rollup-linux-s390x-gnu': 4.46.2 + '@rollup/rollup-linux-x64-gnu': 4.46.2 + '@rollup/rollup-linux-x64-musl': 4.46.2 + '@rollup/rollup-win32-arm64-msvc': 4.46.2 + '@rollup/rollup-win32-ia32-msvc': 4.46.2 + '@rollup/rollup-win32-x64-msvc': 4.46.2 fsevents: 2.3.3 run-async@3.0.0: {} @@ -28222,6 +28576,10 @@ snapshots: dependencies: tslib: 2.8.0 + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 @@ -28328,11 +28686,11 @@ snapshots: sass-embedded@1.80.3: dependencies: - '@bufbuild/protobuf': 2.2.0 + '@bufbuild/protobuf': 2.6.3 buffer-builder: 0.2.0 colorjs.io: 0.5.2 immutable: 4.3.7 - rxjs: 7.8.1 + rxjs: 7.8.2 supports-color: 8.1.1 varint: 6.0.0 optionalDependencies: @@ -28370,13 +28728,13 @@ snapshots: immutable: 4.3.7 source-map-js: 1.2.1 - sass@1.89.2: + sass@1.90.0: dependencies: - chokidar: 4.0.1 + chokidar: 4.0.3 immutable: 5.1.3 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.4.1 + '@parcel/watcher': 2.5.1 saxes@6.0.0: dependencies: @@ -28493,6 +28851,8 @@ snapshots: shell-quote@1.8.1: {} + shell-quote@1.8.3: {} + shelljs@0.8.5: dependencies: glob: 7.2.3 @@ -28559,7 +28919,7 @@ snapshots: sirv@1.0.19: dependencies: - '@polka/url': 1.0.0-next.28 + '@polka/url': 1.0.0-next.29 mrmime: 1.0.1 totalist: 1.1.0 @@ -28670,16 +29030,16 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.20 + spdx-license-ids: 3.0.21 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.20 + spdx-license-ids: 3.0.21 - spdx-license-ids@3.0.20: {} + spdx-license-ids@3.0.21: {} speakingurl@14.0.1: {} @@ -28718,16 +29078,14 @@ snapshots: std-env@3.7.0: {} + std-env@3.9.0: {} + stdin-discarder@0.1.0: dependencies: bl: 5.1.0 stdin-discarder@0.2.2: {} - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.7 - stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -28777,7 +29135,7 @@ snapshots: string.prototype.padend@3.1.6: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.1.1 @@ -28814,7 +29172,7 @@ snapshots: string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.1.1 @@ -28871,41 +29229,45 @@ snapshots: strip-literal@1.3.0: dependencies: - acorn: 8.14.0 + acorn: 8.13.0 strip-literal@2.1.0: dependencies: js-tokens: 9.0.0 + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + strong-type@0.1.6: {} strong-type@1.1.0: {} - stylelint-config-recommended-scss@14.1.0(postcss@8.4.47)(stylelint@16.22.0(typescript@5.8.3)): + stylelint-config-recommended-scss@14.1.0(postcss@8.5.6)(stylelint@16.23.0(typescript@5.9.2)): dependencies: - postcss-scss: 4.0.9(postcss@8.4.47) - stylelint: 16.22.0(typescript@5.8.3) - stylelint-config-recommended: 14.0.1(stylelint@16.22.0(typescript@5.8.3)) - stylelint-scss: 6.12.1(stylelint@16.22.0(typescript@5.8.3)) + postcss-scss: 4.0.9(postcss@8.5.6) + stylelint: 16.23.0(typescript@5.9.2) + stylelint-config-recommended: 14.0.1(stylelint@16.23.0(typescript@5.9.2)) + stylelint-scss: 6.12.1(stylelint@16.23.0(typescript@5.9.2)) optionalDependencies: - postcss: 8.4.47 + postcss: 8.5.6 - stylelint-config-recommended@14.0.1(stylelint@16.22.0(typescript@5.8.3)): + stylelint-config-recommended@14.0.1(stylelint@16.23.0(typescript@5.9.2)): dependencies: - stylelint: 16.22.0(typescript@5.8.3) + stylelint: 16.23.0(typescript@5.9.2) - stylelint-config-standard@36.0.1(stylelint@16.22.0(typescript@5.8.3)): + stylelint-config-standard@36.0.1(stylelint@16.23.0(typescript@5.9.2)): dependencies: - stylelint: 16.22.0(typescript@5.8.3) - stylelint-config-recommended: 14.0.1(stylelint@16.22.0(typescript@5.8.3)) + stylelint: 16.23.0(typescript@5.9.2) + stylelint-config-recommended: 14.0.1(stylelint@16.23.0(typescript@5.9.2)) - stylelint-order@6.0.4(stylelint@16.22.0(typescript@5.8.3)): + stylelint-order@6.0.4(stylelint@16.23.0(typescript@5.9.2)): dependencies: - postcss: 8.4.47 - postcss-sorting: 8.0.2(postcss@8.4.47) - stylelint: 16.22.0(typescript@5.8.3) + postcss: 8.5.6 + postcss-sorting: 8.0.2(postcss@8.5.6) + stylelint: 16.23.0(typescript@5.9.2) - stylelint-scss@6.12.1(stylelint@16.22.0(typescript@5.8.3)): + stylelint-scss@6.12.1(stylelint@16.23.0(typescript@5.9.2)): dependencies: css-tree: 3.1.0 is-plain-object: 5.0.0 @@ -28915,9 +29277,9 @@ snapshots: postcss-resolve-nested-selector: 0.1.6 postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - stylelint: 16.22.0(typescript@5.8.3) + stylelint: 16.23.0(typescript@5.9.2) - stylelint@16.22.0(typescript@5.8.3): + stylelint@16.23.0(typescript@5.9.2): dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 @@ -28926,7 +29288,7 @@ snapshots: '@dual-bundle/import-meta-resolve': 4.1.0 balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.8.3) + cosmiconfig: 9.0.0(typescript@5.9.2) css-functions-list: 3.2.3 css-tree: 3.1.0 debug: 4.4.1 @@ -28961,6 +29323,8 @@ snapshots: - supports-color - typescript + stylis@4.2.0: {} + superjson@2.2.2: dependencies: copy-anything: 3.0.5 @@ -28997,9 +29361,9 @@ snapshots: dependencies: '@trysound/sax': 0.2.0 commander: 7.2.0 - css-select: 5.1.0 + css-select: 5.2.2 css-tree: 2.3.1 - css-what: 6.1.0 + css-what: 6.2.2 csso: 5.0.5 picocolors: 1.1.1 @@ -29013,7 +29377,7 @@ snapshots: synckit@0.9.2: dependencies: '@pkgr/core': 0.1.1 - tslib: 2.8.0 + tslib: 2.8.1 tabbable@6.2.0: {} @@ -29031,10 +29395,10 @@ snapshots: dependencies: bl: 1.2.3 buffer-alloc: 1.2.0 - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 fs-constants: 1.0.0 readable-stream: 2.3.8 - to-buffer: 1.1.1 + to-buffer: 1.2.1 xtend: 4.0.2 temp-dir@2.0.0: {} @@ -29055,7 +29419,7 @@ snapshots: terser@5.36.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.14.0 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -29123,7 +29487,11 @@ snapshots: is-absolute: 1.0.0 is-negated-glob: 1.0.0 - to-buffer@1.1.1: {} + to-buffer@1.2.1: + dependencies: + isarray: 2.0.5 + safe-buffer: 5.2.1 + typed-array-buffer: 1.0.3 to-fast-properties@1.0.3: {} @@ -29159,7 +29527,7 @@ snapshots: tough-cookie@4.1.4: dependencies: - psl: 1.9.0 + psl: 1.15.0 punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 @@ -29184,34 +29552,34 @@ snapshots: dependencies: matchit: 1.1.0 - ts-api-utils@1.3.0(typescript@4.9.5): + ts-api-utils@1.4.3(typescript@4.9.5): dependencies: typescript: 4.9.5 - ts-api-utils@1.3.0(typescript@5.6.3): + ts-api-utils@1.4.3(typescript@5.6.3): dependencies: typescript: 5.6.3 - ts-api-utils@1.3.0(typescript@5.8.3): + ts-api-utils@1.4.3(typescript@5.9.2): dependencies: - typescript: 5.8.3 + typescript: 5.9.2 - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.1.0(typescript@5.9.2): dependencies: - typescript: 5.8.3 + typescript: 5.9.2 - ts-jest@29.4.0(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.23.1)(jest-util@29.7.0)(jest@29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.4.1(@babel/core@7.28.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.28.0))(esbuild@0.23.1)(jest-util@29.7.0)(jest@29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)))(typescript@5.9.2): dependencies: bs-logger: 0.2.6 - ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.120)(ts-node@10.9.2(@types/node@18.19.120)(typescript@5.8.3)) + handlebars: 4.7.8 + jest: 29.7.0(@types/node@18.19.121)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@18.19.121)(typescript@5.9.2)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.7.2 type-fest: 4.41.0 - typescript: 5.8.3 + typescript: 5.9.2 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.28.0 @@ -29252,19 +29620,18 @@ snapshots: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.57 - acorn: 8.13.0 + '@types/node': 18.19.121 + acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.5 + typescript: 5.9.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - optional: true - ts-node@10.9.2(@types/node@20.5.1)(typescript@4.9.5): + ts-node@10.9.2(@types/node@20.5.1)(typescript@5.9.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -29272,26 +29639,25 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.5.1 - acorn: 8.13.0 + acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.9.5 + typescript: 5.9.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - optional: true - ts-node@10.9.2(@types/node@20.5.1)(typescript@5.6.3): + ts-node@10.9.2(@types/node@24.2.0)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.5.1 - acorn: 8.13.0 + '@types/node': 24.2.0 + acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -29301,24 +29667,6 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@20.5.1)(typescript@5.8.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.5.1 - acorn: 8.13.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.8.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -29332,6 +29680,8 @@ snapshots: tslib@2.8.0: {} + tslib@2.8.1: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -29352,8 +29702,6 @@ snapshots: type-fest@1.4.0: {} - type-fest@4.26.1: {} - type-fest@4.41.0: {} type-is@1.6.18: @@ -29386,7 +29734,7 @@ snapshots: typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -29404,7 +29752,7 @@ snapshots: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 @@ -29422,10 +29770,10 @@ snapshots: typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 - for-each: 0.3.3 + for-each: 0.3.5 gopd: 1.2.0 is-typed-array: 1.1.15 - possible-typed-array-names: 1.0.0 + possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 typedarray@0.0.6: {} @@ -29447,7 +29795,7 @@ snapshots: typescript@5.6.3: {} - typescript@5.8.3: {} + typescript@5.9.2: {} uc.micro@1.0.6: {} @@ -29455,6 +29803,8 @@ snapshots: ufo@1.5.4: {} + ufo@1.6.1: {} + uglify-js@3.19.3: {} unbox-primitive@1.0.2: @@ -29467,7 +29817,7 @@ snapshots: unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 - has-bigints: 1.0.2 + has-bigints: 1.1.0 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 @@ -29490,6 +29840,8 @@ snapshots: undici-types@5.26.5: {} + undici-types@7.10.0: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: @@ -29627,7 +29979,7 @@ snapshots: vary@1.1.2: {} - vfile-message@4.0.2: + vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 @@ -29635,7 +29987,7 @@ snapshots: vfile@6.0.3: dependencies: '@types/unist': 3.0.3 - vfile-message: 4.0.2 + vfile-message: 4.0.3 vinyl-bufferstream@1.0.1: dependencies: @@ -29690,7 +30042,7 @@ snapshots: remove-trailing-separator: 1.1.0 replace-ext: 1.0.1 - vite-node@0.29.8(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0): + vite-node@0.29.8(@types/node@24.2.0)(sass@1.80.3)(terser@5.36.0): dependencies: cac: 6.7.14 debug: 4.4.1 @@ -29708,7 +30060,7 @@ snapshots: - supports-color - terser - vite-node@0.29.8(@types/node@18.19.57)(sass@1.89.2)(terser@5.36.0): + vite-node@0.29.8(@types/node@24.2.0)(sass@1.90.0)(terser@5.36.0): dependencies: cac: 6.7.14 debug: 4.4.1 @@ -29732,7 +30084,7 @@ snapshots: debug: 4.4.1 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) + vite: 5.4.19(@types/node@24.2.0)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - less @@ -29825,9 +30177,9 @@ snapshots: vite-plugin-dts@2.3.0(@types/node@20.5.1)(rollup@4.24.0)(vite@4.5.14(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)): dependencies: '@babel/parser': 7.25.8 - '@microsoft/api-extractor': 7.47.11(@types/node@20.5.1) - '@rollup/pluginutils': 5.1.2(rollup@4.24.0) - '@rushstack/node-core-library': 3.66.1(@types/node@20.5.1) + '@microsoft/api-extractor': 7.47.11(@types/node@24.2.0) + '@rollup/pluginutils': 5.1.2(rollup@4.46.2) + '@rushstack/node-core-library': 3.66.1(@types/node@24.2.0) debug: 4.3.7 fast-glob: 3.3.2 fs-extra: 10.1.0 @@ -29861,9 +30213,9 @@ snapshots: vite-plugin-dts@2.3.0(@types/node@20.5.1)(rollup@4.45.1)(vite@4.5.14(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0)): dependencies: '@babel/parser': 7.25.8 - '@microsoft/api-extractor': 7.47.11(@types/node@20.5.1) - '@rollup/pluginutils': 5.1.2(rollup@4.45.1) - '@rushstack/node-core-library': 3.66.1(@types/node@20.5.1) + '@microsoft/api-extractor': 7.47.11(@types/node@24.2.0) + '@rollup/pluginutils': 5.1.2(rollup@4.46.2) + '@rushstack/node-core-library': 3.66.1(@types/node@24.2.0) debug: 4.3.7 fast-glob: 3.3.2 fs-extra: 10.1.0 @@ -29879,9 +30231,9 @@ snapshots: vite-plugin-dts@2.3.0(@types/node@20.5.1)(rollup@4.45.1)(vite@5.4.19(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0)): dependencies: '@babel/parser': 7.25.8 - '@microsoft/api-extractor': 7.47.11(@types/node@20.5.1) - '@rollup/pluginutils': 5.1.2(rollup@4.45.1) - '@rushstack/node-core-library': 3.66.1(@types/node@20.5.1) + '@microsoft/api-extractor': 7.47.11(@types/node@24.2.0) + '@rollup/pluginutils': 5.1.2(rollup@4.46.2) + '@rushstack/node-core-library': 3.66.1(@types/node@24.2.0) debug: 4.3.7 fast-glob: 3.3.2 fs-extra: 10.1.0 @@ -29912,18 +30264,18 @@ snapshots: - rollup - supports-color - vite-plugin-dts@3.9.1(@types/node@18.19.120)(rollup@4.45.1)(typescript@5.8.3)(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0)): + vite-plugin-dts@3.9.1(@types/node@24.2.0)(rollup@4.46.2)(typescript@4.9.5)(vite@4.5.5(@types/node@24.2.0)(sass@1.90.0)(terser@5.36.0)): dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@18.19.120) - '@rollup/pluginutils': 5.1.2(rollup@4.45.1) - '@vue/language-core': 1.8.27(typescript@5.8.3) - debug: 4.3.7 + '@microsoft/api-extractor': 7.43.0(@types/node@24.2.0) + '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@vue/language-core': 1.8.27(typescript@4.9.5) + debug: 4.4.1 kolorist: 1.8.0 - magic-string: 0.30.12 - typescript: 5.8.3 - vue-tsc: 1.8.27(typescript@5.8.3) + magic-string: 0.30.17 + typescript: 4.9.5 + vue-tsc: 1.8.27(typescript@4.9.5) optionalDependencies: - vite: 5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0) + vite: 4.5.5(@types/node@24.2.0)(sass@1.90.0)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - rollup @@ -29931,14 +30283,14 @@ snapshots: vite-plugin-dts@3.9.1(@types/node@20.5.1)(rollup@4.45.1)(typescript@4.9.5)(vite@4.5.14(@types/node@20.5.1)(sass@1.89.2)(terser@5.36.0)): dependencies: - '@microsoft/api-extractor': 7.43.0(@types/node@20.5.1) - '@rollup/pluginutils': 5.1.2(rollup@4.45.1) - '@vue/language-core': 1.8.27(typescript@4.9.5) - debug: 4.3.7 + '@microsoft/api-extractor': 7.43.0(@types/node@24.2.0) + '@rollup/pluginutils': 5.2.0(rollup@4.46.2) + '@vue/language-core': 1.8.27(typescript@5.6.3) + debug: 4.4.1 kolorist: 1.8.0 - magic-string: 0.30.12 - typescript: 4.9.5 - vue-tsc: 1.8.27(typescript@4.9.5) + magic-string: 0.30.17 + typescript: 5.6.3 + vue-tsc: 1.8.27(typescript@5.6.3) optionalDependencies: vite: 4.5.14(@types/node@20.5.1)(sass@1.89.2)(terser@5.36.0) transitivePeerDependencies: @@ -30010,12 +30362,12 @@ snapshots: vite-plugin-md@0.21.5(@vitejs/plugin-vue@5.2.4(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0))(vue@3.5.18(typescript@5.8.3)))(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0)(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0)): dependencies: - '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@5.2.4(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0))(vue@3.5.18(typescript@5.8.3)))(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0)(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0)) - '@yankeeinlondon/gray-matter': 6.2.1(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0) - '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0) + '@yankeeinlondon/builder-api': 1.4.1(@vitejs/plugin-vue@5.2.4(vite@5.4.19(@types/node@18.19.121)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0))(vue@3.5.18(typescript@5.9.2)))(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0)(vite@5.4.19(@types/node@18.19.121)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0)) + '@yankeeinlondon/gray-matter': 6.2.1(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0) + '@yankeeinlondon/happy-wrapper': 2.10.1(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0) markdown-it: 13.0.2 source-map-js: 1.2.1 - vite: 5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0) + vite: 5.4.19(@types/node@18.19.121)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0) transitivePeerDependencies: - '@edge-runtime/vm' - '@vitejs/plugin-vue' @@ -30112,10 +30464,10 @@ snapshots: svgo: 3.3.2 vue: 3.5.12(typescript@5.6.3) - vite-svg-loader@5.1.0(vue@3.5.18(typescript@5.8.3)): + vite-svg-loader@5.1.0(vue@3.5.18(typescript@5.9.2)): dependencies: svgo: 3.3.2 - vue: 3.5.18(typescript@5.8.3) + vue: 3.5.18(typescript@5.9.2) vite@2.9.18(sass@1.80.3): dependencies: @@ -30127,7 +30479,7 @@ snapshots: fsevents: 2.3.3 sass: 1.80.3 - vite@2.9.18(sass@1.89.2): + vite@2.9.18(sass@1.90.0): dependencies: esbuild: 0.14.54 postcss: 8.5.6 @@ -30135,54 +30487,30 @@ snapshots: rollup: 2.77.3 optionalDependencies: fsevents: 2.3.3 - sass: 1.89.2 - - vite@3.2.11(@types/node@18.19.120)(sass@1.80.3)(terser@5.36.0): - dependencies: - esbuild: 0.15.18 - postcss: 8.4.47 - resolve: 1.22.8 - rollup: 2.79.2 - optionalDependencies: - '@types/node': 18.19.120 - fsevents: 2.3.3 - sass: 1.80.3 - terser: 5.36.0 - - vite@3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0): - dependencies: - esbuild: 0.15.18 - postcss: 8.4.47 - resolve: 1.22.8 - rollup: 2.79.2 - optionalDependencies: - '@types/node': 18.19.57 - fsevents: 2.3.3 - sass: 1.80.3 - terser: 5.36.0 + sass: 1.90.0 - vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0): + vite@3.2.11(@types/node@24.2.0)(sass@1.80.3)(terser@5.36.0): dependencies: esbuild: 0.15.18 postcss: 8.4.47 resolve: 1.22.8 rollup: 2.79.2 optionalDependencies: - '@types/node': 20.5.1 + '@types/node': 24.2.0 fsevents: 2.3.3 sass: 1.80.3 terser: 5.36.0 - vite@3.2.11(@types/node@20.5.1)(sass@1.89.2)(terser@5.36.0): + vite@3.2.11(@types/node@24.2.0)(sass@1.90.0)(terser@5.36.0): dependencies: esbuild: 0.15.18 postcss: 8.4.47 resolve: 1.22.8 rollup: 2.79.2 optionalDependencies: - '@types/node': 20.5.1 + '@types/node': 24.2.0 fsevents: 2.3.3 - sass: 1.89.2 + sass: 1.90.0 terser: 5.36.0 vite@4.5.14(@types/node@18.19.120)(sass@1.80.3)(terser@5.36.0): @@ -30191,7 +30519,7 @@ snapshots: postcss: 8.5.6 rollup: 3.29.5 optionalDependencies: - '@types/node': 18.19.120 + '@types/node': 18.19.121 fsevents: 2.3.3 sass: 1.80.3 terser: 5.36.0 @@ -30202,9 +30530,9 @@ snapshots: postcss: 8.5.6 rollup: 3.29.5 optionalDependencies: - '@types/node': 18.19.120 + '@types/node': 18.19.121 fsevents: 2.3.3 - sass: 1.89.2 + sass: 1.90.0 terser: 5.36.0 vite@4.5.14(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0): @@ -30213,7 +30541,7 @@ snapshots: postcss: 8.5.6 rollup: 3.29.5 optionalDependencies: - '@types/node': 18.19.57 + '@types/node': 24.2.0 fsevents: 2.3.3 sass: 1.80.3 terser: 5.36.0 @@ -30224,9 +30552,9 @@ snapshots: postcss: 8.5.6 rollup: 3.29.5 optionalDependencies: - '@types/node': 18.19.57 + '@types/node': 24.2.0 fsevents: 2.3.3 - sass: 1.89.2 + sass: 1.90.0 terser: 5.36.0 vite@4.5.14(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0): @@ -30235,7 +30563,7 @@ snapshots: postcss: 8.5.6 rollup: 3.29.5 optionalDependencies: - '@types/node': 20.5.1 + '@types/node': 24.2.0 fsevents: 2.3.3 sass: 1.80.3 terser: 5.36.0 @@ -30246,12 +30574,12 @@ snapshots: postcss: 8.5.6 rollup: 3.29.5 optionalDependencies: - '@types/node': 20.5.1 + '@types/node': 24.2.0 fsevents: 2.3.3 - sass: 1.89.2 + sass: 1.90.0 terser: 5.36.0 - vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0): + vite@5.4.19(@types/node@18.19.121)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -30269,19 +30597,19 @@ snapshots: postcss: 8.5.6 rollup: 4.45.1 optionalDependencies: - '@types/node': 18.19.120 + '@types/node': 18.19.121 fsevents: 2.3.3 - sass: 1.89.2 + sass: 1.90.0 sass-embedded: 1.80.3 terser: 5.36.0 - vite@5.4.19(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0): + vite@5.4.19(@types/node@24.2.0)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0): dependencies: esbuild: 0.21.5 postcss: 8.5.6 rollup: 4.45.1 optionalDependencies: - '@types/node': 20.5.1 + '@types/node': 24.2.0 fsevents: 2.3.3 sass: 1.80.3 sass-embedded: 1.80.3 @@ -30293,9 +30621,9 @@ snapshots: postcss: 8.5.6 rollup: 4.45.1 optionalDependencies: - '@types/node': 20.5.1 + '@types/node': 24.2.0 fsevents: 2.3.3 - sass: 1.89.2 + sass: 1.90.0 sass-embedded: 1.80.3 terser: 5.36.0 @@ -30308,7 +30636,7 @@ snapshots: minimist: 1.2.8 prettier: 2.8.8 vitepress: 0.16.1(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@4.9.5) - yaml: 2.6.0 + yaml: 2.8.1 transitivePeerDependencies: - less - react @@ -30327,7 +30655,7 @@ snapshots: minimist: 1.2.8 prettier: 2.8.8 vitepress: 0.16.1(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(typescript@5.6.3) - yaml: 2.6.0 + yaml: 2.8.1 transitivePeerDependencies: - less - react @@ -30337,7 +30665,7 @@ snapshots: - supports-color - typescript - vitepress-theme-demoblock@1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.89.2)(typescript@4.9.5): + vitepress-theme-demoblock@1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.90.0)(typescript@4.9.5): dependencies: camelcase: 6.3.0 globby: 11.1.0 @@ -30345,8 +30673,8 @@ snapshots: markdown-it: 12.3.2 minimist: 1.2.8 prettier: 2.8.8 - vitepress: 0.16.1(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.89.2)(typescript@4.9.5) - yaml: 2.6.0 + vitepress: 0.16.1(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.90.0)(typescript@4.9.5) + yaml: 2.8.1 transitivePeerDependencies: - less - react @@ -30356,7 +30684,7 @@ snapshots: - supports-color - typescript - vitepress-theme-demoblock@1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.89.2)(typescript@5.8.3): + vitepress-theme-demoblock@1.4.2(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.90.0)(typescript@5.9.2): dependencies: camelcase: 6.3.0 globby: 11.1.0 @@ -30364,8 +30692,8 @@ snapshots: markdown-it: 12.3.2 minimist: 1.2.8 prettier: 2.8.8 - vitepress: 0.16.1(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.89.2)(typescript@5.8.3) - yaml: 2.6.0 + vitepress: 0.16.1(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.90.0)(typescript@5.9.2) + yaml: 2.8.1 transitivePeerDependencies: - less - react @@ -30400,7 +30728,7 @@ snapshots: minimist: 1.2.8 ora: 5.4.1 polka: 0.5.2 - prismjs: 1.29.0 + prismjs: 1.30.0 sirv: 1.0.19 vite: 2.9.18(sass@1.80.3) vue: 3.5.18(typescript@4.9.5) @@ -30438,7 +30766,7 @@ snapshots: minimist: 1.2.8 ora: 5.4.1 polka: 0.5.2 - prismjs: 1.29.0 + prismjs: 1.30.0 sirv: 1.0.19 vite: 2.9.18(sass@1.80.3) vue: 3.5.18(typescript@5.6.3) @@ -30451,12 +30779,12 @@ snapshots: - supports-color - typescript - vitepress@0.16.1(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.89.2)(typescript@4.9.5): + vitepress@0.16.1(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.90.0)(typescript@4.9.5): dependencies: '@docsearch/css': 1.0.0-alpha.28 '@docsearch/js': 1.0.0-alpha.28(react-dom@16.14.0(react@16.14.0))(react@16.14.0) '@types/markdown-it': 12.2.3 - '@vitejs/plugin-vue': 1.10.2(vite@2.9.18(sass@1.89.2)) + '@vitejs/plugin-vue': 1.10.2(vite@2.9.18(sass@1.90.0)) '@vue/compiler-sfc': 3.5.18 '@vue/server-renderer': 3.5.18(vue@3.5.18(typescript@4.9.5)) chalk: 4.1.2 @@ -30476,9 +30804,9 @@ snapshots: minimist: 1.2.8 ora: 5.4.1 polka: 0.5.2 - prismjs: 1.29.0 + prismjs: 1.30.0 sirv: 1.0.19 - vite: 2.9.18(sass@1.89.2) + vite: 2.9.18(sass@1.90.0) vue: 3.5.18(typescript@4.9.5) transitivePeerDependencies: - less @@ -30489,14 +30817,14 @@ snapshots: - supports-color - typescript - vitepress@0.16.1(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.89.2)(typescript@5.8.3): + vitepress@0.16.1(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.90.0)(typescript@5.9.2): dependencies: '@docsearch/css': 1.0.0-alpha.28 '@docsearch/js': 1.0.0-alpha.28(react-dom@16.14.0(react@16.14.0))(react@16.14.0) '@types/markdown-it': 12.2.3 - '@vitejs/plugin-vue': 1.10.2(vite@2.9.18(sass@1.89.2)) + '@vitejs/plugin-vue': 1.10.2(vite@2.9.18(sass@1.90.0)) '@vue/compiler-sfc': 3.5.18 - '@vue/server-renderer': 3.5.18(vue@3.5.18(typescript@5.8.3)) + '@vue/server-renderer': 3.5.18(vue@3.5.18(typescript@5.9.2)) chalk: 4.1.2 compression: 1.8.1 debug: 4.4.1 @@ -30514,10 +30842,10 @@ snapshots: minimist: 1.2.8 ora: 5.4.1 polka: 0.5.2 - prismjs: 1.29.0 + prismjs: 1.30.0 sirv: 1.0.19 - vite: 2.9.18(sass@1.89.2) - vue: 3.5.18(typescript@5.8.3) + vite: 2.9.18(sass@1.90.0) + vue: 3.5.18(typescript@5.9.2) transitivePeerDependencies: - less - react @@ -30527,42 +30855,16 @@ snapshots: - supports-color - typescript - vitepress@1.0.0-alpha.10(@algolia/client-search@5.34.1)(@types/node@18.19.120)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3): - dependencies: - '@docsearch/css': 3.6.2 - '@docsearch/js': 3.6.0(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) - '@vitejs/plugin-vue': 3.2.0(vite@3.2.11(@types/node@18.19.120)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) - '@vue/devtools-api': 6.6.4 - '@vueuse/core': 9.2.0(vue@3.5.12(typescript@5.6.3)) - body-scroll-lock: 4.0.0-beta.0 - shiki: 0.11.1 - vite: 3.2.11(@types/node@18.19.120)(sass@1.80.3)(terser@5.36.0) - vue: 3.5.12(typescript@5.6.3) - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/node' - - '@types/react' - - '@vue/composition-api' - - less - - react - - react-dom - - sass - - search-insights - - stylus - - sugarss - - terser - - typescript - - vitepress@1.0.0-alpha.10(@algolia/client-search@5.34.1)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3): + vitepress@1.0.0-alpha.10(@algolia/client-search@5.35.0)(@types/node@24.2.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.6.3): dependencies: '@docsearch/css': 3.6.2 - '@docsearch/js': 3.6.0(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) - '@vitejs/plugin-vue': 3.2.0(vite@3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) + '@docsearch/js': 3.6.0(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) + '@vitejs/plugin-vue': 3.2.0(vite@3.2.11(@types/node@24.2.0)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@5.6.3)) '@vue/devtools-api': 6.6.4 '@vueuse/core': 9.2.0(vue@3.5.12(typescript@5.6.3)) body-scroll-lock: 4.0.0-beta.0 shiki: 0.11.1 - vite: 3.2.11(@types/node@20.5.1)(sass@1.80.3)(terser@5.36.0) + vite: 3.2.11(@types/node@24.2.0)(sass@1.80.3)(terser@5.36.0) vue: 3.5.12(typescript@5.6.3) transitivePeerDependencies: - '@algolia/client-search' @@ -30579,16 +30881,16 @@ snapshots: - terser - typescript - vitepress@1.0.0-alpha.10(@algolia/client-search@5.34.1)(@types/node@20.5.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.89.2)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5): + vitepress@1.0.0-alpha.10(@algolia/client-search@5.35.0)(@types/node@24.2.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.90.0)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5): dependencies: '@docsearch/css': 3.6.2 - '@docsearch/js': 3.6.0(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) - '@vitejs/plugin-vue': 3.2.0(vite@3.2.11(@types/node@20.5.1)(sass@1.89.2)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + '@docsearch/js': 3.6.0(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) + '@vitejs/plugin-vue': 3.2.0(vite@3.2.11(@types/node@24.2.0)(sass@1.90.0)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/devtools-api': 6.6.4 '@vueuse/core': 9.2.0(vue@3.5.12(typescript@4.9.5)) body-scroll-lock: 4.0.0-beta.0 shiki: 0.11.1 - vite: 3.2.11(@types/node@20.5.1)(sass@1.89.2)(terser@5.36.0) + vite: 3.2.11(@types/node@24.2.0)(sass@1.90.0)(terser@5.36.0) vue: 3.5.12(typescript@4.9.5) transitivePeerDependencies: - '@algolia/client-search' @@ -30605,16 +30907,16 @@ snapshots: - terser - typescript - vitepress@1.0.0-alpha.8(@algolia/client-search@5.34.1)(@types/node@18.19.57)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5): + vitepress@1.0.0-alpha.8(@algolia/client-search@5.35.0)(@types/node@24.2.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass@1.80.3)(search-insights@2.17.2)(terser@5.36.0)(typescript@4.9.5): dependencies: '@docsearch/css': 3.6.2 - '@docsearch/js': 3.6.2(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) - '@vitejs/plugin-vue': 3.2.0(vite@3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) + '@docsearch/js': 3.6.2(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) + '@vitejs/plugin-vue': 3.2.0(vite@3.2.11(@types/node@24.2.0)(sass@1.80.3)(terser@5.36.0))(vue@3.5.12(typescript@4.9.5)) '@vue/devtools-api': 6.6.4 '@vueuse/core': 9.2.0(vue@3.5.12(typescript@4.9.5)) body-scroll-lock: 4.0.0-beta.0 shiki: 0.11.1 - vite: 3.2.11(@types/node@18.19.57)(sass@1.80.3)(terser@5.36.0) + vite: 3.2.11(@types/node@24.2.0)(sass@1.80.3)(terser@5.36.0) vue: 3.5.12(typescript@4.9.5) transitivePeerDependencies: - '@algolia/client-search' @@ -30660,13 +30962,13 @@ snapshots: vitepress@1.6.3(@algolia/client-search@5.34.1)(@types/node@18.19.120)(async-validator@4.2.5)(axios@1.12.2)(postcss@8.4.47)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(sass-embedded@1.80.3)(sass@1.89.2)(search-insights@2.17.2)(terser@5.36.0)(typescript@5.8.3): dependencies: '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.34.1)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) - '@iconify-json/simple-icons': 1.2.44 + '@docsearch/js': 3.8.2(@algolia/client-search@5.35.0)(react-dom@16.14.0(react@16.14.0))(react@16.14.0)(search-insights@2.17.2) + '@iconify-json/simple-icons': 1.2.46 '@shikijs/core': 2.5.0 '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0))(vue@3.5.18(typescript@5.8.3)) + '@vitejs/plugin-vue': 5.2.4(vite@5.4.19(@types/node@18.19.121)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0))(vue@3.5.18(typescript@5.9.2)) '@vue/devtools-api': 7.7.7 '@vue/shared': 3.5.18 '@vueuse/core': 12.8.2(typescript@5.8.3) @@ -30675,10 +30977,10 @@ snapshots: mark.js: 8.11.1 minisearch: 7.1.2 shiki: 2.5.0 - vite: 5.4.19(@types/node@18.19.120)(sass-embedded@1.80.3)(sass@1.89.2)(terser@5.36.0) - vue: 3.5.18(typescript@5.8.3) + vite: 5.4.19(@types/node@18.19.121)(sass-embedded@1.80.3)(sass@1.90.0)(terser@5.36.0) + vue: 3.5.18(typescript@5.9.2) optionalDependencies: - postcss: 8.4.47 + postcss: 8.5.6 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -30706,7 +31008,7 @@ snapshots: - typescript - universal-cookie - vitest@0.25.8(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0): + vitest@0.25.8(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0): dependencies: '@types/chai': 4.3.20 '@types/chai-subset': 1.3.5 @@ -30762,7 +31064,7 @@ snapshots: - supports-color - terser - vitest@0.25.8(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0): + vitest@0.25.8(happy-dom@8.9.0)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0): dependencies: '@types/chai': 4.3.20 '@types/chai-subset': 1.3.5 @@ -30790,11 +31092,11 @@ snapshots: - supports-color - terser - vitest@0.29.8(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.89.2)(terser@5.36.0): + vitest@0.29.8(happy-dom@14.12.3)(jsdom@20.0.3)(sass@1.90.0)(terser@5.36.0): dependencies: '@types/chai': 4.3.20 '@types/chai-subset': 1.3.5 - '@types/node': 18.19.57 + '@types/node': 24.2.0 '@vitest/expect': 0.29.8 '@vitest/runner': 0.29.8 '@vitest/spy': 0.29.8 @@ -30832,7 +31134,7 @@ snapshots: dependencies: '@types/chai': 4.3.20 '@types/chai-subset': 1.3.5 - '@types/node': 18.19.57 + '@types/node': 24.2.0 '@vitest/expect': 0.29.8 '@vitest/runner': 0.29.8 '@vitest/spy': 0.29.8 @@ -30953,8 +31255,8 @@ snapshots: magic-string: 0.30.17 pathe: 1.1.2 picocolors: 1.1.1 - std-env: 3.7.0 - strip-literal: 2.1.0 + std-env: 3.9.0 + strip-literal: 2.1.1 tinybench: 2.9.0 tinypool: 0.8.4 vite: 5.4.19(@types/node@20.5.1)(sass-embedded@1.80.3)(sass@1.80.3)(terser@5.36.0) @@ -30984,7 +31286,9 @@ snapshots: vscode-uri@3.0.8: {} - vue-component-type-helpers@2.1.6: {} + vscode-uri@3.1.0: {} + + vue-component-type-helpers@2.2.12: {} vue-demi@0.14.10(vue@3.5.12(typescript@4.9.5)): dependencies: @@ -31011,7 +31315,7 @@ snapshots: espree: 9.6.1 esquery: 1.6.0 lodash: 4.17.21 - semver: 7.6.3 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -31049,6 +31353,11 @@ snapshots: '@vue/devtools-api': 6.6.4 vue: 3.5.18(typescript@5.6.3) + vue-router@4.4.5(vue@3.5.18(typescript@5.9.2)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.18(typescript@5.9.2) + vue-template-compiler@2.7.16: dependencies: de-indent: 1.0.2 @@ -31074,12 +31383,12 @@ snapshots: semver: 7.6.3 typescript: 5.6.3 - vue-tsc@1.8.27(typescript@5.8.3): + vue-tsc@1.8.27(typescript@5.9.2): dependencies: '@volar/typescript': 1.11.1 - '@vue/language-core': 1.8.27(typescript@5.8.3) + '@vue/language-core': 1.8.27(typescript@5.9.2) semver: 7.6.3 - typescript: 5.8.3 + typescript: 5.9.2 vue-tsc@2.1.6(typescript@5.6.3): dependencies: @@ -31088,24 +31397,26 @@ snapshots: semver: 7.6.3 typescript: 5.6.3 - vue-tsc@2.2.12(typescript@5.8.3): + vue-tsc@2.2.12(typescript@5.9.2): dependencies: '@volar/typescript': 2.4.15 - '@vue/language-core': 2.2.12(typescript@5.8.3) - typescript: 5.8.3 + '@vue/language-core': 2.2.12(typescript@5.9.2) + typescript: 5.9.2 - vue3-grid-layout@1.0.0(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27)(typescript@5.6.3): + vue3-grid-layout-ts@0.0.1(typescript@5.6.3): dependencies: '@interactjs/actions': 1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27) + '@interactjs/auto-scroll': 1.10.27(@interactjs/utils@1.10.27) '@interactjs/auto-start': 1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27) + '@interactjs/core': 1.10.27(@interactjs/utils@1.10.27) '@interactjs/dev-tools': 1.10.27(@interactjs/modifiers@1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27)(typescript@5.6.3) - '@interactjs/interactjs': 1.10.27(typescript@5.6.3) + '@interactjs/interact': 1.10.27 '@interactjs/modifiers': 1.10.27(@interactjs/core@1.10.27(@interactjs/utils@1.10.27))(@interactjs/utils@1.10.27) + '@interactjs/utils': 1.10.27 element-resize-detector: 1.2.4 - lodash: 4.17.21 + interactjs: 1.10.27 + mitt: 3.0.1 transitivePeerDependencies: - - '@interactjs/core' - - '@interactjs/utils' - typescript vue@3.5.12(typescript@4.9.5): @@ -31148,15 +31459,15 @@ snapshots: optionalDependencies: typescript: 5.6.3 - vue@3.5.18(typescript@5.8.3): + vue@3.5.18(typescript@5.9.2): dependencies: '@vue/compiler-dom': 3.5.18 '@vue/compiler-sfc': 3.5.18 '@vue/runtime-dom': 3.5.18 - '@vue/server-renderer': 3.5.18(vue@3.5.18(typescript@5.8.3)) + '@vue/server-renderer': 3.5.18(vue@3.5.18(typescript@5.9.2)) '@vue/shared': 3.5.18 optionalDependencies: - typescript: 5.8.3 + typescript: 5.9.2 w3c-xmlserializer@4.0.0: dependencies: @@ -31196,7 +31507,7 @@ snapshots: is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 - is-symbol: 1.0.4 + is-symbol: 1.1.1 which-boxed-primitive@1.1.1: dependencies: @@ -31227,7 +31538,7 @@ snapshots: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 - is-weakset: 2.0.3 + is-weakset: 2.0.4 which-module@1.0.0: {} @@ -31307,7 +31618,7 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 - ws@8.18.0: {} + ws@8.18.3: {} xml-name-validator@4.0.0: {} @@ -31323,9 +31634,9 @@ snapshots: yallist@4.0.0: {} - yaml@2.6.0: {} + yaml@1.10.2: {} - yaml@2.8.0: {} + yaml@2.8.1: {} yargs-parser@20.2.9: {} @@ -31382,6 +31693,8 @@ snapshots: yocto-queue@1.1.1: {} + yocto-queue@1.2.1: {} + yoctocolors-cjs@2.1.2: {} z-schema@5.0.5: @@ -31396,4 +31709,8 @@ snapshots: dependencies: tslib: 2.3.0 + zrender@6.0.0: + dependencies: + tslib: 2.3.0 + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c288af42c6bfbdf46b93967ab3900889707a79cf..1a22eed90cd0701590cf73d88e16c811e564b8e2 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,6 +5,7 @@ packages: - 'packages/devkit' - 'packages/bef' - 'packages/mobile-command-services' + - 'packages/ba-command-services' - 'packages/eslint-config' - 'packages/farris-theme' - 'packages/mobile-ui-vue'