@taocompany/magic-grid 0.12.8 → 0.13.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.
- 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/components/cellEditor/index.d.ts +2 -0
- package/dist/components/cellEditor/index.d.ts.map +1 -1
- package/dist/components/cellEditor/vueCellEditorHost.d.ts.map +1 -1
- package/dist/components/cellRenderer/vueCellRendererHost.d.ts.map +1 -1
- package/dist/core/api/gridApi.d.ts +1 -0
- package/dist/core/api/gridApi.d.ts.map +1 -1
- package/dist/core/cell/cellCtrl.d.ts +13 -0
- package/dist/core/cell/cellCtrl.d.ts.map +1 -1
- package/dist/core/cell/cellStructuralState.d.ts +13 -0
- package/dist/core/cell/cellStructuralState.d.ts.map +1 -0
- package/dist/core/cell/compIdentityKey.d.ts +13 -0
- package/dist/core/cell/compIdentityKey.d.ts.map +1 -0
- package/dist/core/cell/permanentEditHost.d.ts +21 -0
- package/dist/core/cell/permanentEditHost.d.ts.map +1 -0
- package/dist/core/cell/userCompHost.d.ts +32 -0
- package/dist/core/cell/userCompHost.d.ts.map +1 -0
- package/dist/core/editing/inlineCellEditorHost.d.ts +12 -18
- package/dist/core/editing/inlineCellEditorHost.d.ts.map +1 -1
- package/dist/core/editing/mountedInlineCellEditor.d.ts +8 -0
- package/dist/core/editing/mountedInlineCellEditor.d.ts.map +1 -0
- package/dist/core/grid/grid.d.ts +3 -0
- package/dist/core/grid/grid.d.ts.map +1 -1
- package/dist/core/grid/gridBootstrap.d.ts +1 -0
- package/dist/core/grid/gridBootstrap.d.ts.map +1 -1
- package/dist/core/grid/gridFilter.d.ts +1 -0
- package/dist/core/grid/gridFilter.d.ts.map +1 -1
- package/dist/core/grid/gridHierarchyOps.d.ts +4 -0
- package/dist/core/grid/gridHierarchyOps.d.ts.map +1 -1
- package/dist/core/grid/gridRowMutation.d.ts +2 -0
- package/dist/core/grid/gridRowMutation.d.ts.map +1 -1
- package/dist/core/renderer/renderWindowUtils.d.ts +4 -0
- package/dist/core/renderer/renderWindowUtils.d.ts.map +1 -0
- package/dist/core/renderer/rowRenderer.d.ts +13 -1
- package/dist/core/renderer/rowRenderer.d.ts.map +1 -1
- package/dist/core/renderer/spannedRowRenderer.d.ts +3 -1
- package/dist/core/renderer/spannedRowRenderer.d.ts.map +1 -1
- package/dist/core/row/cellComp.d.ts +6 -0
- package/dist/core/row/cellComp.d.ts.map +1 -1
- package/dist/core/row/rowComp.d.ts +6 -0
- package/dist/core/row/rowComp.d.ts.map +1 -1
- package/dist/core/row/rowFullWidthEmbed.d.ts +2 -1
- package/dist/core/row/rowFullWidthEmbed.d.ts.map +1 -1
- package/dist/core/row/rowLaneCellSync.d.ts +9 -3
- package/dist/core/row/rowLaneCellSync.d.ts.map +1 -1
- package/dist/core/types/cellEditor.d.ts +3 -0
- package/dist/core/types/cellEditor.d.ts.map +1 -1
- package/dist/core/types/index.d.ts +1 -1
- package/dist/core/types/index.d.ts.map +1 -1
- package/dist/core/types/rowComp.d.ts +8 -0
- package/dist/core/types/rowComp.d.ts.map +1 -1
- package/dist/core/types/rowMutation.d.ts +5 -0
- package/dist/core/types/rowMutation.d.ts.map +1 -1
- package/dist/core/types/transaction.d.ts +10 -0
- package/dist/core/types/transaction.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.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +4628 -4354
- package/dist/index.es.js.map +1 -1
- package/dist/token-catalog.json +2 -2
- package/dist/types/core.d.ts +16 -0
- package/dist/validation-BHqm5Flb.js.map +1 -1
- package/dist/validation-CD6lt5wS.cjs.map +1 -1
- package/package.json +105 -105
package/dist/token-catalog.json
CHANGED
package/dist/types/core.d.ts
CHANGED
|
@@ -1699,6 +1699,7 @@ export declare interface GridApi extends RowMutationGridApi {
|
|
|
1699
1699
|
*
|
|
1700
1700
|
* - `update` / `remove` 项可通过 `data[rowKey]` 或字符串 rowId 定位行。
|
|
1701
1701
|
* - 与 `addRows` / `updateRows` / `removeRows` 共用同一刷新管线;大量连续操作建议包在 `beginUpdate` / `endUpdate` 中。
|
|
1702
|
+
* - `newData?: true` — 纯 update flush 时对更新行使用 `refreshRows({ newData: true })`(与 {@link UpdateRowsOptions.newData} 同义)。
|
|
1702
1703
|
* - 配置 `asyncRowMutation` 时 await 对应钩子成功后再写入本地。
|
|
1703
1704
|
*
|
|
1704
1705
|
* @returns 本次事务影响的 RowNode 快照
|
|
@@ -3468,6 +3469,11 @@ export declare interface RefreshCellsParams {
|
|
|
3468
3469
|
colIds?: string[];
|
|
3469
3470
|
/** 忽略单元格值缓存,强制重绘 */
|
|
3470
3471
|
force?: boolean;
|
|
3472
|
+
/**
|
|
3473
|
+
* 行数据对象/身份替换语义(对齐 AG `newData` → forceNewCellRendererInstance)。
|
|
3474
|
+
* 与 CompIdentityKey 变并列触发 inline / renderer remount;单独 `force` 不会。
|
|
3475
|
+
*/
|
|
3476
|
+
newData?: boolean;
|
|
3471
3477
|
}
|
|
3472
3478
|
|
|
3473
3479
|
export declare type RefreshCellStylesParams = CellStyleScopeParams;
|
|
@@ -4280,6 +4286,11 @@ export declare interface RowTransaction {
|
|
|
4280
4286
|
add?: RowTransactionAddItem[];
|
|
4281
4287
|
remove?: RowData[] | string[];
|
|
4282
4288
|
update?: RowTransactionUpdateItem[];
|
|
4289
|
+
/**
|
|
4290
|
+
* 纯 update flush 时对更新行使用 `refreshRows({ newData: true })`(对齐 AG 行替换语义)。
|
|
4291
|
+
* 与 {@link UpdateRowsOptions.newData} 等价;add/remove 或与 sort/filter 同批时忽略。
|
|
4292
|
+
*/
|
|
4293
|
+
newData?: boolean;
|
|
4283
4294
|
}
|
|
4284
4295
|
|
|
4285
4296
|
export declare type RowTransactionAddItem = RowData | AddRowPayload;
|
|
@@ -4762,6 +4773,11 @@ export declare interface UpdateRowPayload {
|
|
|
4762
4773
|
|
|
4763
4774
|
export declare interface UpdateRowsOptions {
|
|
4764
4775
|
rows: UpdateRowItem[];
|
|
4776
|
+
/**
|
|
4777
|
+
* 对齐 AG 行数据替换语义:刷新更新行时使用 `refreshCells({ newData: true })`。
|
|
4778
|
+
* 默认 false(仅 patch / refresh 链)。
|
|
4779
|
+
*/
|
|
4780
|
+
newData?: boolean;
|
|
4765
4781
|
}
|
|
4766
4782
|
|
|
4767
4783
|
export declare interface ValidateCellsOptions {
|
|
@@ -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, {\
|
|
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 +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, {\
|
|
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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"}
|
package/package.json
CHANGED
|
@@ -1,105 +1,105 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@taocompany/magic-grid",
|
|
3
|
-
"version": "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
|
-
"./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.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
|
+
"./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
|
+
}
|