@taocompany/magic-grid 0.3.4 → 0.4.0

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.
Files changed (35) hide show
  1. package/README.md +2851 -2851
  2. package/dist/components/ColumnSettings/ColumnSettingsButton.vue.d.ts.map +1 -1
  3. package/dist/core/column/applyFooterCells.d.ts +2 -0
  4. package/dist/core/column/applyFooterCells.d.ts.map +1 -1
  5. package/dist/core/column/applyHeaderCells.d.ts +9 -0
  6. package/dist/core/column/applyHeaderCells.d.ts.map +1 -1
  7. package/dist/core/column/columnModel.d.ts +2 -0
  8. package/dist/core/column/columnModel.d.ts.map +1 -1
  9. package/dist/core/column/columnMoveService.d.ts +28 -1
  10. package/dist/core/column/columnMoveService.d.ts.map +1 -1
  11. package/dist/core/column/index.d.ts +2 -2
  12. package/dist/core/column/index.d.ts.map +1 -1
  13. package/dist/core/grid/columnHeaderDragEdgeScroll.d.ts +8 -0
  14. package/dist/core/grid/columnHeaderDragEdgeScroll.d.ts.map +1 -1
  15. package/dist/core/grid/grid.d.ts.map +1 -1
  16. package/dist/core/grid/gridColumnLayout.d.ts +10 -1
  17. package/dist/core/grid/gridColumnLayout.d.ts.map +1 -1
  18. package/dist/core/grid/gridInteraction/columnHeaderDragSession.d.ts +14 -0
  19. package/dist/core/grid/gridInteraction/columnHeaderDragSession.d.ts.map +1 -1
  20. package/dist/core/grid/gridInteraction/gridInteraction.d.ts.map +1 -1
  21. package/dist/core/grid/gridInteraction/types.d.ts +1 -0
  22. package/dist/core/grid/gridInteraction/types.d.ts.map +1 -1
  23. package/dist/core/grid/gridViewport.d.ts +8 -0
  24. package/dist/core/grid/gridViewport.d.ts.map +1 -1
  25. package/dist/core/renderer/rowRenderer.d.ts +2 -0
  26. package/dist/core/renderer/rowRenderer.d.ts.map +1 -1
  27. package/dist/core/renderer/spannedRowRenderer.d.ts +1 -0
  28. package/dist/core/renderer/spannedRowRenderer.d.ts.map +1 -1
  29. package/dist/index.cjs.js +5 -5
  30. package/dist/index.cjs.js.map +1 -1
  31. package/dist/index.es.js +2857 -2597
  32. package/dist/index.es.js.map +1 -1
  33. package/dist/validation-BHqm5Flb.js.map +1 -1
  34. package/dist/validation-CD6lt5wS.cjs.map +1 -1
  35. package/package.json +96 -96
@@ -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,96 +1,96 @@
1
- {
2
- "name": "@taocompany/magic-grid",
3
- "version": "0.3.4",
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
- },
39
- "main": "./dist/index.cjs.js",
40
- "module": "./dist/index.es.js",
41
- "types": "./dist/index.d.ts",
42
- "files": [
43
- "dist"
44
- ],
45
- "sideEffects": [
46
- "dist/style.css",
47
- "**/*.css"
48
- ],
49
- "publishConfig": {
50
- "access": "public",
51
- "registry": "https://registry.npmjs.org/"
52
- },
53
- "engines": {
54
- "node": ">=20.19"
55
- },
56
- "packageManager": "pnpm@11.4.0",
57
- "scripts": {
58
- "dev": "vite --config vite.config.playground.ts",
59
- "build": "vue-tsc -p tsconfig.build.json --noEmit && vite build && node --experimental-strip-types scripts/bundle-types.ts",
60
- "build:playground": "vite build --config vite.config.playground.ts",
61
- "preview": "vite preview --config vite.config.playground.ts",
62
- "typecheck": "vue-tsc -p tsconfig.build.json --noEmit",
63
- "test": "vitest",
64
- "test:run": "vitest run",
65
- "test:perf": "vitest run --include 'src/__tests__/**/*.perf.test.ts'",
66
- "test:coverage": "vitest run --coverage",
67
- "prepublishOnly": "pnpm run build",
68
- "deploy:dev": "node --experimental-strip-types scripts/deploy-dev.ts",
69
- "publish:dev": "node --experimental-strip-types scripts/publish-dev.ts"
70
- },
71
- "peerDependencies": {
72
- "vue": "^3.5.0",
73
- "async-validator": "^4.2.0"
74
- },
75
- "devDependencies": {
76
- "@microsoft/api-extractor": "^7.55.0",
77
- "@vitejs/plugin-vue": "^6.0.8",
78
- "@vitest/coverage-v8": "^4.1.10",
79
- "@vue/test-utils": "^2.4.11",
80
- "@vue/tsconfig": "^0.8.1",
81
- "async-validator": "^4.2.5",
82
- "element-plus": "^2.14.3",
83
- "happy-dom": "^20.11.1",
84
- "less": "^4.8.1",
85
- "typescript": "^5.9.3",
86
- "vite": "^8.2.0",
87
- "vite-plugin-dts": "^5.0.3",
88
- "vitest": "^4.1.10",
89
- "vue": "^3.5.40",
90
- "vue-router": "^4.6.4",
91
- "vue-tsc": "^3.2.0"
92
- },
93
- "dependencies": {
94
- "@lucide/vue": "^1.28.0"
95
- }
96
- }
1
+ {
2
+ "name": "@taocompany/magic-grid",
3
+ "version": "0.4.0",
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
+ },
39
+ "main": "./dist/index.cjs.js",
40
+ "module": "./dist/index.es.js",
41
+ "types": "./dist/index.d.ts",
42
+ "files": [
43
+ "dist"
44
+ ],
45
+ "sideEffects": [
46
+ "dist/style.css",
47
+ "**/*.css"
48
+ ],
49
+ "publishConfig": {
50
+ "access": "public",
51
+ "registry": "https://registry.npmjs.org/"
52
+ },
53
+ "engines": {
54
+ "node": ">=20.19"
55
+ },
56
+ "packageManager": "pnpm@11.4.0",
57
+ "scripts": {
58
+ "dev": "vite --config vite.config.playground.ts",
59
+ "build": "vue-tsc -p tsconfig.build.json --noEmit && vite build && node --experimental-strip-types scripts/bundle-types.ts",
60
+ "build:playground": "vite build --config vite.config.playground.ts",
61
+ "preview": "vite preview --config vite.config.playground.ts",
62
+ "typecheck": "vue-tsc -p tsconfig.build.json --noEmit",
63
+ "test": "vitest",
64
+ "test:run": "vitest run",
65
+ "test:perf": "vitest run --include 'src/__tests__/**/*.perf.test.ts'",
66
+ "test:coverage": "vitest run --coverage",
67
+ "prepublishOnly": "pnpm run build",
68
+ "deploy:dev": "node --experimental-strip-types scripts/deploy-dev.ts",
69
+ "publish:dev": "node --experimental-strip-types scripts/publish-dev.ts"
70
+ },
71
+ "peerDependencies": {
72
+ "vue": "^3.5.0",
73
+ "async-validator": "^4.2.0"
74
+ },
75
+ "devDependencies": {
76
+ "@microsoft/api-extractor": "^7.55.0",
77
+ "@vitejs/plugin-vue": "^6.0.8",
78
+ "@vitest/coverage-v8": "^4.1.10",
79
+ "@vue/test-utils": "^2.4.11",
80
+ "@vue/tsconfig": "^0.8.1",
81
+ "async-validator": "^4.2.5",
82
+ "element-plus": "^2.14.3",
83
+ "happy-dom": "^20.11.1",
84
+ "less": "^4.8.1",
85
+ "typescript": "^5.9.3",
86
+ "vite": "^8.2.0",
87
+ "vite-plugin-dts": "^5.0.3",
88
+ "vitest": "^4.1.10",
89
+ "vue": "^3.5.40",
90
+ "vue-router": "^4.6.4",
91
+ "vue-tsc": "^3.2.0"
92
+ },
93
+ "dependencies": {
94
+ "@lucide/vue": "^1.28.0"
95
+ }
96
+ }