@taocompany/magic-grid 0.5.0 → 0.5.3
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 +3206 -3202
- package/dist/components/MagicGrid/MagicGrid.vue.d.ts +1 -1
- package/dist/components/MagicGrid/MagicGrid.vue.d.ts.map +1 -1
- package/dist/core/cell/cellCtrl.d.ts.map +1 -1
- package/dist/core/editing/cellEditPipeline.d.ts +2 -1
- package/dist/core/editing/cellEditPipeline.d.ts.map +1 -1
- package/dist/core/editing/cellEditingService.d.ts.map +1 -1
- package/dist/core/editing/inlineCellEditorService.d.ts +2 -0
- package/dist/core/editing/inlineCellEditorService.d.ts.map +1 -1
- package/dist/core/grid/cellEditing/editorParams.d.ts.map +1 -1
- package/dist/core/grid/cellEditing/startEditing.d.ts.map +1 -1
- package/dist/core/grid/cellEditing/types.d.ts +2 -0
- package/dist/core/grid/cellEditing/types.d.ts.map +1 -1
- package/dist/core/grid/cellRangeDeleteWrite.d.ts +2 -0
- package/dist/core/grid/cellRangeDeleteWrite.d.ts.map +1 -1
- package/dist/core/grid/cellRangeFillWrite.d.ts +2 -0
- package/dist/core/grid/cellRangeFillWrite.d.ts.map +1 -1
- package/dist/core/grid/grid.d.ts +1 -0
- package/dist/core/grid/grid.d.ts.map +1 -1
- package/dist/core/selection/cellClipboardService.d.ts +2 -0
- package/dist/core/selection/cellClipboardService.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/gridOptions.d.ts +3 -0
- package/dist/core/types/gridOptions.d.ts.map +1 -1
- package/dist/index.cjs.js +3 -3
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +19 -13
- package/dist/index.es.js.map +1 -1
- package/dist/types/core.d.ts +5 -0
- package/dist/validation-BHqm5Flb.js.map +1 -1
- package/dist/validation-CD6lt5wS.cjs.map +1 -1
- package/package.json +96 -96
package/dist/types/core.d.ts
CHANGED
|
@@ -227,6 +227,8 @@ export declare interface CellEditorParams {
|
|
|
227
227
|
value: unknown;
|
|
228
228
|
data: RowData;
|
|
229
229
|
formattedValue: string;
|
|
230
|
+
/** 当前 Grid 尺寸 preset,与 MagicGrid `size` prop 一致 */
|
|
231
|
+
size: GridSize_2;
|
|
230
232
|
/** 提交(true) 或 取消(false);块 5 起返回 Promise */
|
|
231
233
|
stopEditing: (commit?: boolean) => Promise<void>;
|
|
232
234
|
/** 中断进行中的 async 提交,保持编辑态 */
|
|
@@ -1576,6 +1578,9 @@ export declare type GridRounded = number | boolean;
|
|
|
1576
1578
|
/** 尺寸 preset;rowHeight / headerHeight 未显式传入时由 size 推导 */
|
|
1577
1579
|
export declare type GridSize = 'mini' | 'small' | 'default' | 'large';
|
|
1578
1580
|
|
|
1581
|
+
/** 表格尺寸 preset(与 CSS `magic-grid--size-*` 对齐) */
|
|
1582
|
+
declare type GridSize_2 = 'mini' | 'small' | 'default' | 'large';
|
|
1583
|
+
|
|
1579
1584
|
/** 主题 preset:`light` 亮色(默认);`dark` 暗色语义 token */
|
|
1580
1585
|
export declare type GridTheme = 'light' | 'dark';
|
|
1581
1586
|
|
|
@@ -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,96 +1,96 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@taocompany/magic-grid",
|
|
3
|
-
"version": "0.5.
|
|
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.5.3",
|
|
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
|
+
}
|