@taocompany/magic-grid 0.13.5 → 0.13.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4288 -4288
- package/dist/components/MagicGrid/MagicGrid.vue.d.ts.map +1 -1
- package/dist/components/MagicGrid/useMagicGrid.d.ts.map +1 -1
- package/dist/core/cellComment/cellCommentIndicatorGeometry.d.ts +2 -2
- package/dist/core/cellComment/cellCommentIndicatorGeometry.d.ts.map +1 -1
- package/dist/core/cellComment/cellCommentInteractionSession.d.ts +2 -2
- package/dist/core/cellComment/cellCommentInteractionSession.d.ts.map +1 -1
- package/dist/core/cellComment/cellCommentPopup.d.ts +1 -2
- package/dist/core/cellComment/cellCommentPopup.d.ts.map +1 -1
- package/dist/core/editing/cellEditingService.d.ts.map +1 -1
- package/dist/core/editing/rowEditingService.d.ts.map +1 -1
- package/dist/core/types/cellComment.d.ts +9 -3
- package/dist/core/types/cellComment.d.ts.map +1 -1
- package/dist/core/types/cellEditor.d.ts +3 -1
- package/dist/core/types/cellEditor.d.ts.map +1 -1
- package/dist/getRowDragCommitHierarchy-DoMf_SY8.cjs.map +1 -1
- package/dist/getRowDragCommitHierarchy-pWgukMAX.js.map +1 -1
- package/dist/index.cjs.js +6 -6
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +638 -628
- package/dist/index.es.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/token-catalog.json +2 -2
- package/dist/types/core.d.ts +3 -1
- package/dist/validation-BHqm5Flb.js.map +1 -1
- package/dist/validation-CD6lt5wS.cjs.map +1 -1
- package/package.json +105 -105
package/dist/types/core.d.ts
CHANGED
|
@@ -481,6 +481,8 @@ export declare interface CellEditorKeyboardPolicy {
|
|
|
481
481
|
deferEnterCommit?: boolean;
|
|
482
482
|
/** 为 true 时进入编辑态不自动 `focusEditor` / 行编辑初始 `focusRowEditor`(校验失败 refocus 等仍聚焦) */
|
|
483
483
|
suppressInitialAutoFocus?: boolean;
|
|
484
|
+
/** 为 true 时内核捕获阶段不处理 Tab(不 commit / 不链式跳格),由编辑器在单元格内处理焦点 */
|
|
485
|
+
suppressTabNavigation?: boolean;
|
|
484
486
|
}
|
|
485
487
|
|
|
486
488
|
/** 生命周期回调;commit/cancel 路径上 Composable 会 `await`(`onDestroy` 为 fire-and-forget) */
|
|
@@ -552,7 +554,7 @@ export declare interface CellEditorParams {
|
|
|
552
554
|
getEditPhase: () => EditSessionPhase;
|
|
553
555
|
/** Vue / 复合组件编辑器注册自定义取值(优先于 DOM 扫描) */
|
|
554
556
|
setGetValue?: (getValue: () => string) => void;
|
|
555
|
-
/** 注册键盘策略(如 deferEnterCommit、
|
|
557
|
+
/** 注册键盘策略(如 deferEnterCommit、suppressTabNavigation) */
|
|
556
558
|
setKeyboardPolicy?: (policy: CellEditorKeyboardPolicy) => void;
|
|
557
559
|
/** 是否执行编辑器 onStart(focus / 打开 overlay)。
|
|
558
560
|
* 行编辑时仅 focusColId 对应列为 true;省略时视为 true(单格编辑)。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-BHqm5Flb.js","names":[],"sources":["../src/core/editing/editCommitContext.ts","../src/validation/asyncValidatorAdapter.ts"],"sourcesContent":["/** 编辑会话阶段 */\nexport type EditSessionPhase = 'idle' | 'editing' | 'committing' | 'cancelling'\n\n/** 单次提交上下文:abort 与 commitId 防竞态 */\nexport interface EditCommitContext {\n signal: AbortSignal\n commitId: number\n}\n\nexport class EditCommitAbortedError extends Error {\n readonly name = 'EditCommitAbortedError'\n\n constructor(message = 'Edit commit aborted') {\n super(message)\n }\n}\n\nexport function isEditCommitAborted(error: unknown): error is EditCommitAbortedError {\n return error instanceof EditCommitAbortedError\n}\n\nexport interface EditCommitController {\n context: EditCommitContext\n abort: () => void\n}\n\n/** 创建新的提交控制器;若传入 previous 则先 abort */\nexport function createEditCommitController(\n commitId: number,\n previous?: EditCommitController | null,\n): EditCommitController {\n previous?.abort()\n\n const controller = new AbortController()\n const context: EditCommitContext = {\n signal: controller.signal,\n commitId,\n }\n\n return {\n context,\n abort: () => {\n if (!controller.signal.aborted) {\n controller.abort(new EditCommitAbortedError())\n }\n },\n }\n}\n\nexport function throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n}\n\nexport async function onceAborted(signal: AbortSignal): Promise<never> {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n\n return new Promise((_, reject) => {\n const onAbort = (): void => {\n signal.removeEventListener('abort', onAbort)\n reject(new EditCommitAbortedError())\n }\n\n signal.addEventListener('abort', onAbort)\n })\n}\n","import Schema, {\n type Rule,\n type Rules,\n type ValidateError,\n type ValidateFieldsError,\n} from 'async-validator'\n\nimport { isEditCommitAborted } from '@core/editing/editCommitContext'\nimport type { CellValidator, RowValidator, ValidationSchema } from '@core/types/validation'\nimport type { ColumnDef } from '@types'\n\nexport { default as Schema } from 'async-validator'\n\nfunction formatValidateErrors(errors: ValidateError[]): string[] {\n return errors.map((error) => error.message ?? String(error.field))\n}\n\nfunction raceWithAbort<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) {\n return promise\n }\n\n if (signal.aborted) {\n return Promise.reject(signal.reason)\n }\n\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n signal.removeEventListener('abort', onAbort)\n reject(signal.reason)\n }\n\n signal.addEventListener('abort', onAbort)\n promise.then(\n (value) => {\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n (error) => {\n signal.removeEventListener('abort', onAbort)\n reject(error)\n },\n )\n })\n}\n\nfunction isAsyncFunction(fn: (...args: unknown[]) => unknown): boolean {\n return fn.constructor.name === 'AsyncFunction'\n}\n\n/** magic-grid validationRules 使用 validator;async-validator 异步规则使用 asyncValidator */\nfunction normalizeRule(rule: Rule): Rule {\n const record = rule as Record<string, unknown>\n const customValidator = record.validator\n\n if (typeof customValidator === 'function' && record.asyncValidator == null) {\n if (isAsyncFunction(customValidator as (...args: unknown[]) => unknown)) {\n const { validator, ...rest } = record\n return { ...rest, asyncValidator: validator } as Rule\n }\n }\n\n return rule\n}\n\nfunction normalizeRules(rules: Rule | Rule[]): Rule[] {\n const list = Array.isArray(rules) ? rules : [rules]\n return list.map(normalizeRule)\n}\n\nfunction normalizeSchema(schema: Rules): Rules {\n const normalized: Record<string, Rule | Rule[]> = {}\n\n for (const [field, rules] of Object.entries(schema)) {\n normalized[field] = normalizeRules(rules as Rule | Rule[])\n }\n\n return normalized as Rules\n}\n\nexport async function validateWithSchema(\n schema: Rules,\n source: Record<string, unknown>,\n options?: { signal?: AbortSignal },\n): Promise<string[] | null> {\n const validator = new Schema(normalizeSchema(schema as Rules))\n\n try {\n await raceWithAbort(validator.validate(source), options?.signal)\n return null\n } catch (error) {\n if (isEditCommitAborted(error)) {\n throw error\n }\n\n if (error && typeof error === 'object' && 'errors' in error) {\n const fieldError = error as ValidateFieldsError\n return formatValidateErrors(fieldError.errors ?? [])\n }\n\n if (error instanceof Error) {\n return [error.message]\n }\n\n return ['Validation failed']\n }\n}\n\nexport function createCellValidator(field: string, rules: Rule | Rule[]): CellValidator {\n const schema = { [field]: rules } as Rules\n\n return async (params) => {\n const source = {\n [field]: params.parsedValue,\n }\n return validateWithSchema(schema, source, { signal: params.signal })\n }\n}\n\nexport function createRowValidator(schema: ValidationSchema): RowValidator {\n return async (params) => {\n const source: Record<string, unknown> = { ...params.data }\n for (const [colId, value] of params.draftValues) {\n source[colId] = value\n }\n\n return validateWithSchema(schema as Rules, source, { signal: params.signal })\n }\n}\n\n/** 判断 validationRules 是否包含 required 规则 */\nexport function isValidationRequired(rules?: import('@core/types/validation').ValidationRules): boolean {\n if (!rules) {\n return false\n }\n\n const list = Array.isArray(rules) ? rules : [rules]\n return list.some((rule) => {\n const record = rule as Record<string, unknown>\n return record.required === true\n })\n}\n\n/** 将 ColumnDef.validationRules 编译为 cellValidator(不覆盖已有 cellValidator) */\nexport function enrichColumnsWithValidation(columns: ColumnDef[]): ColumnDef[] {\n return columns.map((column) => {\n const validationRequired =\n column.validationRequired ?? isValidationRequired(column.validationRules)\n\n if (column.cellValidator || !column.validationRules || !column.prop) {\n return validationRequired === column.validationRequired\n ? column\n : { ...column, validationRequired }\n }\n\n const field = column.prop\n return {\n ...column,\n validationRequired,\n cellValidator: createCellValidator(field, column.validationRules as Rule | Rule[]),\n }\n })\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validation-BHqm5Flb.js","names":[],"sources":["../src/core/editing/editCommitContext.ts","../src/validation/asyncValidatorAdapter.ts"],"sourcesContent":["/** 编辑会话阶段 */\nexport type EditSessionPhase = 'idle' | 'editing' | 'committing' | 'cancelling'\n\n/** 单次提交上下文:abort 与 commitId 防竞态 */\nexport interface EditCommitContext {\n signal: AbortSignal\n commitId: number\n}\n\nexport class EditCommitAbortedError extends Error {\n readonly name = 'EditCommitAbortedError'\n\n constructor(message = 'Edit commit aborted') {\n super(message)\n }\n}\n\nexport function isEditCommitAborted(error: unknown): error is EditCommitAbortedError {\n return error instanceof EditCommitAbortedError\n}\n\nexport interface EditCommitController {\n context: EditCommitContext\n abort: () => void\n}\n\n/** 创建新的提交控制器;若传入 previous 则先 abort */\nexport function createEditCommitController(\n commitId: number,\n previous?: EditCommitController | null,\n): EditCommitController {\n previous?.abort()\n\n const controller = new AbortController()\n const context: EditCommitContext = {\n signal: controller.signal,\n commitId,\n }\n\n return {\n context,\n abort: () => {\n if (!controller.signal.aborted) {\n controller.abort(new EditCommitAbortedError())\n }\n },\n }\n}\n\nexport function throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n}\n\nexport async function onceAborted(signal: AbortSignal): Promise<never> {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n\n return new Promise((_, reject) => {\n const onAbort = (): void => {\n signal.removeEventListener('abort', onAbort)\n reject(new EditCommitAbortedError())\n }\n\n signal.addEventListener('abort', onAbort)\n })\n}\n","import Schema, {\r\n type Rule,\r\n type Rules,\r\n type ValidateError,\r\n type ValidateFieldsError,\r\n} from 'async-validator'\r\n\r\nimport { isEditCommitAborted } from '@core/editing/editCommitContext'\r\nimport type { CellValidator, RowValidator, ValidationSchema } from '@core/types/validation'\r\nimport type { ColumnDef } from '@types'\r\n\r\nexport { default as Schema } from 'async-validator'\r\n\r\nfunction formatValidateErrors(errors: ValidateError[]): string[] {\r\n return errors.map((error) => error.message ?? String(error.field))\r\n}\r\n\r\nfunction raceWithAbort<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\r\n if (!signal) {\r\n return promise\r\n }\r\n\r\n if (signal.aborted) {\r\n return Promise.reject(signal.reason)\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const onAbort = (): void => {\r\n signal.removeEventListener('abort', onAbort)\r\n reject(signal.reason)\r\n }\r\n\r\n signal.addEventListener('abort', onAbort)\r\n promise.then(\r\n (value) => {\r\n signal.removeEventListener('abort', onAbort)\r\n resolve(value)\r\n },\r\n (error) => {\r\n signal.removeEventListener('abort', onAbort)\r\n reject(error)\r\n },\r\n )\r\n })\r\n}\r\n\r\nfunction isAsyncFunction(fn: (...args: unknown[]) => unknown): boolean {\r\n return fn.constructor.name === 'AsyncFunction'\r\n}\r\n\r\n/** magic-grid validationRules 使用 validator;async-validator 异步规则使用 asyncValidator */\r\nfunction normalizeRule(rule: Rule): Rule {\r\n const record = rule as Record<string, unknown>\r\n const customValidator = record.validator\r\n\r\n if (typeof customValidator === 'function' && record.asyncValidator == null) {\r\n if (isAsyncFunction(customValidator as (...args: unknown[]) => unknown)) {\r\n const { validator, ...rest } = record\r\n return { ...rest, asyncValidator: validator } as Rule\r\n }\r\n }\r\n\r\n return rule\r\n}\r\n\r\nfunction normalizeRules(rules: Rule | Rule[]): Rule[] {\r\n const list = Array.isArray(rules) ? rules : [rules]\r\n return list.map(normalizeRule)\r\n}\r\n\r\nfunction normalizeSchema(schema: Rules): Rules {\r\n const normalized: Record<string, Rule | Rule[]> = {}\r\n\r\n for (const [field, rules] of Object.entries(schema)) {\r\n normalized[field] = normalizeRules(rules as Rule | Rule[])\r\n }\r\n\r\n return normalized as Rules\r\n}\r\n\r\nexport async function validateWithSchema(\r\n schema: Rules,\r\n source: Record<string, unknown>,\r\n options?: { signal?: AbortSignal },\r\n): Promise<string[] | null> {\r\n const validator = new Schema(normalizeSchema(schema as Rules))\r\n\r\n try {\r\n await raceWithAbort(validator.validate(source), options?.signal)\r\n return null\r\n } catch (error) {\r\n if (isEditCommitAborted(error)) {\r\n throw error\r\n }\r\n\r\n if (error && typeof error === 'object' && 'errors' in error) {\r\n const fieldError = error as ValidateFieldsError\r\n return formatValidateErrors(fieldError.errors ?? [])\r\n }\r\n\r\n if (error instanceof Error) {\r\n return [error.message]\r\n }\r\n\r\n return ['Validation failed']\r\n }\r\n}\r\n\r\nexport function createCellValidator(field: string, rules: Rule | Rule[]): CellValidator {\r\n const schema = { [field]: rules } as Rules\r\n\r\n return async (params) => {\r\n const source = {\r\n [field]: params.parsedValue,\r\n }\r\n return validateWithSchema(schema, source, { signal: params.signal })\r\n }\r\n}\r\n\r\nexport function createRowValidator(schema: ValidationSchema): RowValidator {\r\n return async (params) => {\r\n const source: Record<string, unknown> = { ...params.data }\r\n for (const [colId, value] of params.draftValues) {\r\n source[colId] = value\r\n }\r\n\r\n return validateWithSchema(schema as Rules, source, { signal: params.signal })\r\n }\r\n}\r\n\r\n/** 判断 validationRules 是否包含 required 规则 */\r\nexport function isValidationRequired(rules?: import('@core/types/validation').ValidationRules): boolean {\r\n if (!rules) {\r\n return false\r\n }\r\n\r\n const list = Array.isArray(rules) ? rules : [rules]\r\n return list.some((rule) => {\r\n const record = rule as Record<string, unknown>\r\n return record.required === true\r\n })\r\n}\r\n\r\n/** 将 ColumnDef.validationRules 编译为 cellValidator(不覆盖已有 cellValidator) */\r\nexport function enrichColumnsWithValidation(columns: ColumnDef[]): ColumnDef[] {\r\n return columns.map((column) => {\r\n const validationRequired =\r\n column.validationRequired ?? isValidationRequired(column.validationRules)\r\n\r\n if (column.cellValidator || !column.validationRules || !column.prop) {\r\n return validationRequired === column.validationRequired\r\n ? column\r\n : { ...column, validationRequired }\r\n }\r\n\r\n const field = column.prop\r\n return {\r\n ...column,\r\n validationRequired,\r\n cellValidator: createCellValidator(field, column.validationRules as Rule | Rule[]),\r\n }\r\n })\r\n}\r\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation-CD6lt5wS.cjs","names":[],"sources":["../src/core/editing/editCommitContext.ts","../src/validation/asyncValidatorAdapter.ts"],"sourcesContent":["/** 编辑会话阶段 */\nexport type EditSessionPhase = 'idle' | 'editing' | 'committing' | 'cancelling'\n\n/** 单次提交上下文:abort 与 commitId 防竞态 */\nexport interface EditCommitContext {\n signal: AbortSignal\n commitId: number\n}\n\nexport class EditCommitAbortedError extends Error {\n readonly name = 'EditCommitAbortedError'\n\n constructor(message = 'Edit commit aborted') {\n super(message)\n }\n}\n\nexport function isEditCommitAborted(error: unknown): error is EditCommitAbortedError {\n return error instanceof EditCommitAbortedError\n}\n\nexport interface EditCommitController {\n context: EditCommitContext\n abort: () => void\n}\n\n/** 创建新的提交控制器;若传入 previous 则先 abort */\nexport function createEditCommitController(\n commitId: number,\n previous?: EditCommitController | null,\n): EditCommitController {\n previous?.abort()\n\n const controller = new AbortController()\n const context: EditCommitContext = {\n signal: controller.signal,\n commitId,\n }\n\n return {\n context,\n abort: () => {\n if (!controller.signal.aborted) {\n controller.abort(new EditCommitAbortedError())\n }\n },\n }\n}\n\nexport function throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n}\n\nexport async function onceAborted(signal: AbortSignal): Promise<never> {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n\n return new Promise((_, reject) => {\n const onAbort = (): void => {\n signal.removeEventListener('abort', onAbort)\n reject(new EditCommitAbortedError())\n }\n\n signal.addEventListener('abort', onAbort)\n })\n}\n","import Schema, {\n type Rule,\n type Rules,\n type ValidateError,\n type ValidateFieldsError,\n} from 'async-validator'\n\nimport { isEditCommitAborted } from '@core/editing/editCommitContext'\nimport type { CellValidator, RowValidator, ValidationSchema } from '@core/types/validation'\nimport type { ColumnDef } from '@types'\n\nexport { default as Schema } from 'async-validator'\n\nfunction formatValidateErrors(errors: ValidateError[]): string[] {\n return errors.map((error) => error.message ?? String(error.field))\n}\n\nfunction raceWithAbort<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\n if (!signal) {\n return promise\n }\n\n if (signal.aborted) {\n return Promise.reject(signal.reason)\n }\n\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n signal.removeEventListener('abort', onAbort)\n reject(signal.reason)\n }\n\n signal.addEventListener('abort', onAbort)\n promise.then(\n (value) => {\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n (error) => {\n signal.removeEventListener('abort', onAbort)\n reject(error)\n },\n )\n })\n}\n\nfunction isAsyncFunction(fn: (...args: unknown[]) => unknown): boolean {\n return fn.constructor.name === 'AsyncFunction'\n}\n\n/** magic-grid validationRules 使用 validator;async-validator 异步规则使用 asyncValidator */\nfunction normalizeRule(rule: Rule): Rule {\n const record = rule as Record<string, unknown>\n const customValidator = record.validator\n\n if (typeof customValidator === 'function' && record.asyncValidator == null) {\n if (isAsyncFunction(customValidator as (...args: unknown[]) => unknown)) {\n const { validator, ...rest } = record\n return { ...rest, asyncValidator: validator } as Rule\n }\n }\n\n return rule\n}\n\nfunction normalizeRules(rules: Rule | Rule[]): Rule[] {\n const list = Array.isArray(rules) ? rules : [rules]\n return list.map(normalizeRule)\n}\n\nfunction normalizeSchema(schema: Rules): Rules {\n const normalized: Record<string, Rule | Rule[]> = {}\n\n for (const [field, rules] of Object.entries(schema)) {\n normalized[field] = normalizeRules(rules as Rule | Rule[])\n }\n\n return normalized as Rules\n}\n\nexport async function validateWithSchema(\n schema: Rules,\n source: Record<string, unknown>,\n options?: { signal?: AbortSignal },\n): Promise<string[] | null> {\n const validator = new Schema(normalizeSchema(schema as Rules))\n\n try {\n await raceWithAbort(validator.validate(source), options?.signal)\n return null\n } catch (error) {\n if (isEditCommitAborted(error)) {\n throw error\n }\n\n if (error && typeof error === 'object' && 'errors' in error) {\n const fieldError = error as ValidateFieldsError\n return formatValidateErrors(fieldError.errors ?? [])\n }\n\n if (error instanceof Error) {\n return [error.message]\n }\n\n return ['Validation failed']\n }\n}\n\nexport function createCellValidator(field: string, rules: Rule | Rule[]): CellValidator {\n const schema = { [field]: rules } as Rules\n\n return async (params) => {\n const source = {\n [field]: params.parsedValue,\n }\n return validateWithSchema(schema, source, { signal: params.signal })\n }\n}\n\nexport function createRowValidator(schema: ValidationSchema): RowValidator {\n return async (params) => {\n const source: Record<string, unknown> = { ...params.data }\n for (const [colId, value] of params.draftValues) {\n source[colId] = value\n }\n\n return validateWithSchema(schema as Rules, source, { signal: params.signal })\n }\n}\n\n/** 判断 validationRules 是否包含 required 规则 */\nexport function isValidationRequired(rules?: import('@core/types/validation').ValidationRules): boolean {\n if (!rules) {\n return false\n }\n\n const list = Array.isArray(rules) ? rules : [rules]\n return list.some((rule) => {\n const record = rule as Record<string, unknown>\n return record.required === true\n })\n}\n\n/** 将 ColumnDef.validationRules 编译为 cellValidator(不覆盖已有 cellValidator) */\nexport function enrichColumnsWithValidation(columns: ColumnDef[]): ColumnDef[] {\n return columns.map((column) => {\n const validationRequired =\n column.validationRequired ?? isValidationRequired(column.validationRules)\n\n if (column.cellValidator || !column.validationRules || !column.prop) {\n return validationRequired === column.validationRequired\n ? column\n : { ...column, validationRequired }\n }\n\n const field = column.prop\n return {\n ...column,\n validationRequired,\n cellValidator: createCellValidator(field, column.validationRules as Rule | Rule[]),\n }\n })\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"validation-CD6lt5wS.cjs","names":[],"sources":["../src/core/editing/editCommitContext.ts","../src/validation/asyncValidatorAdapter.ts"],"sourcesContent":["/** 编辑会话阶段 */\nexport type EditSessionPhase = 'idle' | 'editing' | 'committing' | 'cancelling'\n\n/** 单次提交上下文:abort 与 commitId 防竞态 */\nexport interface EditCommitContext {\n signal: AbortSignal\n commitId: number\n}\n\nexport class EditCommitAbortedError extends Error {\n readonly name = 'EditCommitAbortedError'\n\n constructor(message = 'Edit commit aborted') {\n super(message)\n }\n}\n\nexport function isEditCommitAborted(error: unknown): error is EditCommitAbortedError {\n return error instanceof EditCommitAbortedError\n}\n\nexport interface EditCommitController {\n context: EditCommitContext\n abort: () => void\n}\n\n/** 创建新的提交控制器;若传入 previous 则先 abort */\nexport function createEditCommitController(\n commitId: number,\n previous?: EditCommitController | null,\n): EditCommitController {\n previous?.abort()\n\n const controller = new AbortController()\n const context: EditCommitContext = {\n signal: controller.signal,\n commitId,\n }\n\n return {\n context,\n abort: () => {\n if (!controller.signal.aborted) {\n controller.abort(new EditCommitAbortedError())\n }\n },\n }\n}\n\nexport function throwIfAborted(signal: AbortSignal): void {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n}\n\nexport async function onceAborted(signal: AbortSignal): Promise<never> {\n if (signal.aborted) {\n throw new EditCommitAbortedError()\n }\n\n return new Promise((_, reject) => {\n const onAbort = (): void => {\n signal.removeEventListener('abort', onAbort)\n reject(new EditCommitAbortedError())\n }\n\n signal.addEventListener('abort', onAbort)\n })\n}\n","import Schema, {\r\n type Rule,\r\n type Rules,\r\n type ValidateError,\r\n type ValidateFieldsError,\r\n} from 'async-validator'\r\n\r\nimport { isEditCommitAborted } from '@core/editing/editCommitContext'\r\nimport type { CellValidator, RowValidator, ValidationSchema } from '@core/types/validation'\r\nimport type { ColumnDef } from '@types'\r\n\r\nexport { default as Schema } from 'async-validator'\r\n\r\nfunction formatValidateErrors(errors: ValidateError[]): string[] {\r\n return errors.map((error) => error.message ?? String(error.field))\r\n}\r\n\r\nfunction raceWithAbort<T>(promise: Promise<T>, signal?: AbortSignal): Promise<T> {\r\n if (!signal) {\r\n return promise\r\n }\r\n\r\n if (signal.aborted) {\r\n return Promise.reject(signal.reason)\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const onAbort = (): void => {\r\n signal.removeEventListener('abort', onAbort)\r\n reject(signal.reason)\r\n }\r\n\r\n signal.addEventListener('abort', onAbort)\r\n promise.then(\r\n (value) => {\r\n signal.removeEventListener('abort', onAbort)\r\n resolve(value)\r\n },\r\n (error) => {\r\n signal.removeEventListener('abort', onAbort)\r\n reject(error)\r\n },\r\n )\r\n })\r\n}\r\n\r\nfunction isAsyncFunction(fn: (...args: unknown[]) => unknown): boolean {\r\n return fn.constructor.name === 'AsyncFunction'\r\n}\r\n\r\n/** magic-grid validationRules 使用 validator;async-validator 异步规则使用 asyncValidator */\r\nfunction normalizeRule(rule: Rule): Rule {\r\n const record = rule as Record<string, unknown>\r\n const customValidator = record.validator\r\n\r\n if (typeof customValidator === 'function' && record.asyncValidator == null) {\r\n if (isAsyncFunction(customValidator as (...args: unknown[]) => unknown)) {\r\n const { validator, ...rest } = record\r\n return { ...rest, asyncValidator: validator } as Rule\r\n }\r\n }\r\n\r\n return rule\r\n}\r\n\r\nfunction normalizeRules(rules: Rule | Rule[]): Rule[] {\r\n const list = Array.isArray(rules) ? rules : [rules]\r\n return list.map(normalizeRule)\r\n}\r\n\r\nfunction normalizeSchema(schema: Rules): Rules {\r\n const normalized: Record<string, Rule | Rule[]> = {}\r\n\r\n for (const [field, rules] of Object.entries(schema)) {\r\n normalized[field] = normalizeRules(rules as Rule | Rule[])\r\n }\r\n\r\n return normalized as Rules\r\n}\r\n\r\nexport async function validateWithSchema(\r\n schema: Rules,\r\n source: Record<string, unknown>,\r\n options?: { signal?: AbortSignal },\r\n): Promise<string[] | null> {\r\n const validator = new Schema(normalizeSchema(schema as Rules))\r\n\r\n try {\r\n await raceWithAbort(validator.validate(source), options?.signal)\r\n return null\r\n } catch (error) {\r\n if (isEditCommitAborted(error)) {\r\n throw error\r\n }\r\n\r\n if (error && typeof error === 'object' && 'errors' in error) {\r\n const fieldError = error as ValidateFieldsError\r\n return formatValidateErrors(fieldError.errors ?? [])\r\n }\r\n\r\n if (error instanceof Error) {\r\n return [error.message]\r\n }\r\n\r\n return ['Validation failed']\r\n }\r\n}\r\n\r\nexport function createCellValidator(field: string, rules: Rule | Rule[]): CellValidator {\r\n const schema = { [field]: rules } as Rules\r\n\r\n return async (params) => {\r\n const source = {\r\n [field]: params.parsedValue,\r\n }\r\n return validateWithSchema(schema, source, { signal: params.signal })\r\n }\r\n}\r\n\r\nexport function createRowValidator(schema: ValidationSchema): RowValidator {\r\n return async (params) => {\r\n const source: Record<string, unknown> = { ...params.data }\r\n for (const [colId, value] of params.draftValues) {\r\n source[colId] = value\r\n }\r\n\r\n return validateWithSchema(schema as Rules, source, { signal: params.signal })\r\n }\r\n}\r\n\r\n/** 判断 validationRules 是否包含 required 规则 */\r\nexport function isValidationRequired(rules?: import('@core/types/validation').ValidationRules): boolean {\r\n if (!rules) {\r\n return false\r\n }\r\n\r\n const list = Array.isArray(rules) ? rules : [rules]\r\n return list.some((rule) => {\r\n const record = rule as Record<string, unknown>\r\n return record.required === true\r\n })\r\n}\r\n\r\n/** 将 ColumnDef.validationRules 编译为 cellValidator(不覆盖已有 cellValidator) */\r\nexport function enrichColumnsWithValidation(columns: ColumnDef[]): ColumnDef[] {\r\n return columns.map((column) => {\r\n const validationRequired =\r\n column.validationRequired ?? isValidationRequired(column.validationRules)\r\n\r\n if (column.cellValidator || !column.validationRules || !column.prop) {\r\n return validationRequired === column.validationRequired\r\n ? column\r\n : { ...column, validationRequired }\r\n }\r\n\r\n const field = column.prop\r\n return {\r\n ...column,\r\n validationRequired,\r\n cellValidator: createCellValidator(field, column.validationRules as Rule | Rule[]),\r\n }\r\n })\r\n}\r\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@taocompany/magic-grid",
|
|
3
|
-
"version": "0.13.
|
|
4
|
-
"description": "A high-performance virtual table component library for Vue 3",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"author": "songjiuzhang <jiuzhang.song@taoandcompany02.com>",
|
|
8
|
-
"keywords": [
|
|
9
|
-
"vue",
|
|
10
|
-
"vue3",
|
|
11
|
-
"virtual-table",
|
|
12
|
-
"virtual-grid",
|
|
13
|
-
"component-library",
|
|
14
|
-
"magic-grid"
|
|
15
|
-
],
|
|
16
|
-
"exports": {
|
|
17
|
-
".": {
|
|
18
|
-
"types": "./dist/index.d.ts",
|
|
19
|
-
"import": "./dist/index.es.js",
|
|
20
|
-
"require": "./dist/index.cjs.js"
|
|
21
|
-
},
|
|
22
|
-
"./types/core": {
|
|
23
|
-
"types": "./dist/types/core.d.ts",
|
|
24
|
-
"import": "./dist/types/core.es.js",
|
|
25
|
-
"require": "./dist/types/core.cjs.js"
|
|
26
|
-
},
|
|
27
|
-
"./types/validation": {
|
|
28
|
-
"types": "./dist/types/validation.d.ts",
|
|
29
|
-
"import": "./dist/types/validation.es.js",
|
|
30
|
-
"require": "./dist/types/validation.cjs.js"
|
|
31
|
-
},
|
|
32
|
-
"./validation": {
|
|
33
|
-
"types": "./dist/validation.d.ts",
|
|
34
|
-
"import": "./dist/validation.es.js",
|
|
35
|
-
"require": "./dist/validation.cjs.js"
|
|
36
|
-
},
|
|
37
|
-
"./style.css": "./dist/style.css",
|
|
38
|
-
"./tokens.css": "./dist/tokens.css",
|
|
39
|
-
"./token-catalog.json": "./dist/token-catalog.json"
|
|
40
|
-
},
|
|
41
|
-
"main": "./dist/index.cjs.js",
|
|
42
|
-
"module": "./dist/index.es.js",
|
|
43
|
-
"types": "./dist/index.d.ts",
|
|
44
|
-
"files": [
|
|
45
|
-
"dist"
|
|
46
|
-
],
|
|
47
|
-
"sideEffects": [
|
|
48
|
-
"dist/style.css",
|
|
49
|
-
"dist/tokens.css",
|
|
50
|
-
"**/*.css"
|
|
51
|
-
],
|
|
52
|
-
"publishConfig": {
|
|
53
|
-
"access": "public",
|
|
54
|
-
"registry": "https://registry.npmjs.org/"
|
|
55
|
-
},
|
|
56
|
-
"engines": {
|
|
57
|
-
"node": ">=20.19"
|
|
58
|
-
},
|
|
59
|
-
"packageManager": "pnpm@12.5.1",
|
|
60
|
-
"scripts": {
|
|
61
|
-
"dev": "vite --config vite.config.playground.ts",
|
|
62
|
-
"build": "vue-tsc -p tsconfig.build.json --noEmit && vite build && vite build --config vite.config.tokens.ts && tsx scripts/generate-token-catalog.ts && node --experimental-strip-types scripts/bundle-types.ts",
|
|
63
|
-
"theme-studio:catalog": "vite build --config vite.config.tokens.ts && tsx scripts/generate-token-catalog.ts",
|
|
64
|
-
"theme-studio:validate": "tsx scripts/validate-theme-overrides.ts",
|
|
65
|
-
"build:playground": "vite build --config vite.config.playground.ts",
|
|
66
|
-
"preview": "vite preview --config vite.config.playground.ts",
|
|
67
|
-
"typecheck": "vue-tsc -p tsconfig.build.json --noEmit",
|
|
68
|
-
"test": "vitest",
|
|
69
|
-
"test:run": "vitest run",
|
|
70
|
-
"test:theme-studio": "vitest run theme-studio/__tests__",
|
|
71
|
-
"test:perf": "vitest run --include 'src/__tests__/**/*.perf.test.ts'",
|
|
72
|
-
"test:coverage": "vitest run --coverage",
|
|
73
|
-
"prepublishOnly": "pnpm run build",
|
|
74
|
-
"deploy:dev": "node --experimental-strip-types scripts/deploy-dev.ts",
|
|
75
|
-
"publish:dev": "node --experimental-strip-types scripts/publish-dev.ts",
|
|
76
|
-
"docs:api": "node --experimental-strip-types scripts/generate-docs-api-entries.ts"
|
|
77
|
-
},
|
|
78
|
-
"peerDependencies": {
|
|
79
|
-
"async-validator": "^4.2.0",
|
|
80
|
-
"vue": "^3.5.0"
|
|
81
|
-
},
|
|
82
|
-
"devDependencies": {
|
|
83
|
-
"@microsoft/api-extractor": "^7.55.0",
|
|
84
|
-
"@vitejs/plugin-vue": "^6.0.8",
|
|
85
|
-
"@vitest/coverage-v8": "^4.1.10",
|
|
86
|
-
"@vue/test-utils": "^2.4.11",
|
|
87
|
-
"@vue/tsconfig": "^0.8.1",
|
|
88
|
-
"async-validator": "^4.2.5",
|
|
89
|
-
"element-plus": "^2.14.3",
|
|
90
|
-
"happy-dom": "^20.11.1",
|
|
91
|
-
"less": "^4.8.1",
|
|
92
|
-
"shiki": "^4.4.3",
|
|
93
|
-
"tsx": "^4.23.15",
|
|
94
|
-
"typescript": "^5.9.3",
|
|
95
|
-
"vite": "^8.2.0",
|
|
96
|
-
"vite-plugin-dts": "^5.0.3",
|
|
97
|
-
"vitest": "^4.1.10",
|
|
98
|
-
"vue": "^3.5.40",
|
|
99
|
-
"vue-router": "^4.6.4",
|
|
100
|
-
"vue-tsc": "^3.2.0"
|
|
101
|
-
},
|
|
102
|
-
"dependencies": {
|
|
103
|
-
"@lucide/vue": "^1.28.0"
|
|
104
|
-
}
|
|
105
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@taocompany/magic-grid",
|
|
3
|
+
"version": "0.13.7",
|
|
4
|
+
"description": "A high-performance virtual table component library for Vue 3",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "songjiuzhang <jiuzhang.song@taoandcompany02.com>",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"vue",
|
|
10
|
+
"vue3",
|
|
11
|
+
"virtual-table",
|
|
12
|
+
"virtual-grid",
|
|
13
|
+
"component-library",
|
|
14
|
+
"magic-grid"
|
|
15
|
+
],
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.es.js",
|
|
20
|
+
"require": "./dist/index.cjs.js"
|
|
21
|
+
},
|
|
22
|
+
"./types/core": {
|
|
23
|
+
"types": "./dist/types/core.d.ts",
|
|
24
|
+
"import": "./dist/types/core.es.js",
|
|
25
|
+
"require": "./dist/types/core.cjs.js"
|
|
26
|
+
},
|
|
27
|
+
"./types/validation": {
|
|
28
|
+
"types": "./dist/types/validation.d.ts",
|
|
29
|
+
"import": "./dist/types/validation.es.js",
|
|
30
|
+
"require": "./dist/types/validation.cjs.js"
|
|
31
|
+
},
|
|
32
|
+
"./validation": {
|
|
33
|
+
"types": "./dist/validation.d.ts",
|
|
34
|
+
"import": "./dist/validation.es.js",
|
|
35
|
+
"require": "./dist/validation.cjs.js"
|
|
36
|
+
},
|
|
37
|
+
"./style.css": "./dist/style.css",
|
|
38
|
+
"./tokens.css": "./dist/tokens.css",
|
|
39
|
+
"./token-catalog.json": "./dist/token-catalog.json"
|
|
40
|
+
},
|
|
41
|
+
"main": "./dist/index.cjs.js",
|
|
42
|
+
"module": "./dist/index.es.js",
|
|
43
|
+
"types": "./dist/index.d.ts",
|
|
44
|
+
"files": [
|
|
45
|
+
"dist"
|
|
46
|
+
],
|
|
47
|
+
"sideEffects": [
|
|
48
|
+
"dist/style.css",
|
|
49
|
+
"dist/tokens.css",
|
|
50
|
+
"**/*.css"
|
|
51
|
+
],
|
|
52
|
+
"publishConfig": {
|
|
53
|
+
"access": "public",
|
|
54
|
+
"registry": "https://registry.npmjs.org/"
|
|
55
|
+
},
|
|
56
|
+
"engines": {
|
|
57
|
+
"node": ">=20.19"
|
|
58
|
+
},
|
|
59
|
+
"packageManager": "pnpm@12.5.1",
|
|
60
|
+
"scripts": {
|
|
61
|
+
"dev": "vite --config vite.config.playground.ts",
|
|
62
|
+
"build": "vue-tsc -p tsconfig.build.json --noEmit && vite build && vite build --config vite.config.tokens.ts && tsx scripts/generate-token-catalog.ts && node --experimental-strip-types scripts/bundle-types.ts",
|
|
63
|
+
"theme-studio:catalog": "vite build --config vite.config.tokens.ts && tsx scripts/generate-token-catalog.ts",
|
|
64
|
+
"theme-studio:validate": "tsx scripts/validate-theme-overrides.ts",
|
|
65
|
+
"build:playground": "vite build --config vite.config.playground.ts",
|
|
66
|
+
"preview": "vite preview --config vite.config.playground.ts",
|
|
67
|
+
"typecheck": "vue-tsc -p tsconfig.build.json --noEmit",
|
|
68
|
+
"test": "vitest",
|
|
69
|
+
"test:run": "vitest run",
|
|
70
|
+
"test:theme-studio": "vitest run theme-studio/__tests__",
|
|
71
|
+
"test:perf": "vitest run --include 'src/__tests__/**/*.perf.test.ts'",
|
|
72
|
+
"test:coverage": "vitest run --coverage",
|
|
73
|
+
"prepublishOnly": "pnpm run build",
|
|
74
|
+
"deploy:dev": "node --experimental-strip-types scripts/deploy-dev.ts",
|
|
75
|
+
"publish:dev": "node --experimental-strip-types scripts/publish-dev.ts",
|
|
76
|
+
"docs:api": "node --experimental-strip-types scripts/generate-docs-api-entries.ts"
|
|
77
|
+
},
|
|
78
|
+
"peerDependencies": {
|
|
79
|
+
"async-validator": "^4.2.0",
|
|
80
|
+
"vue": "^3.5.0"
|
|
81
|
+
},
|
|
82
|
+
"devDependencies": {
|
|
83
|
+
"@microsoft/api-extractor": "^7.55.0",
|
|
84
|
+
"@vitejs/plugin-vue": "^6.0.8",
|
|
85
|
+
"@vitest/coverage-v8": "^4.1.10",
|
|
86
|
+
"@vue/test-utils": "^2.4.11",
|
|
87
|
+
"@vue/tsconfig": "^0.8.1",
|
|
88
|
+
"async-validator": "^4.2.5",
|
|
89
|
+
"element-plus": "^2.14.3",
|
|
90
|
+
"happy-dom": "^20.11.1",
|
|
91
|
+
"less": "^4.8.1",
|
|
92
|
+
"shiki": "^4.4.3",
|
|
93
|
+
"tsx": "^4.23.15",
|
|
94
|
+
"typescript": "^5.9.3",
|
|
95
|
+
"vite": "^8.2.0",
|
|
96
|
+
"vite-plugin-dts": "^5.0.3",
|
|
97
|
+
"vitest": "^4.1.10",
|
|
98
|
+
"vue": "^3.5.40",
|
|
99
|
+
"vue-router": "^4.6.4",
|
|
100
|
+
"vue-tsc": "^3.2.0"
|
|
101
|
+
},
|
|
102
|
+
"dependencies": {
|
|
103
|
+
"@lucide/vue": "^1.28.0"
|
|
104
|
+
}
|
|
105
|
+
}
|