@softium/table-core 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/adapters/adaptArray.ts","../src/adapters/util.ts","../src/adapters/adaptPaginated.ts","../src/adapters/adaptDynamicSchema.ts","../src/derive/columns.ts","../src/derive/columnOps.ts","../src/derive/sort.ts","../src/derive/filter.ts","../src/derive/search.ts","../src/derive/paginate.ts","../src/derive/pivot.ts","../src/derive/rows.ts","../src/export/csv.ts","../src/export/json.ts","../src/export/xml.ts","../src/export/zip.ts","../src/export/xlsx.ts","../src/export/index.ts","../src/index.ts"],"names":["num"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * adaptArray — the simplest ERP response: a plain array of row objects.\n *\n * const data = adaptArray<Employee>(raw); // raw: [ {...}, {...} ]\n *\n * Columns are supplied separately by the developer. This only normalizes/validates\n * the data array.\n */\n\nexport function adaptArray<T>(raw: unknown): T[] {\n if (!Array.isArray(raw)) {\n throw new TypeError(\n `adaptArray expected an array, received ${raw === null ? 'null' : typeof raw}.`,\n );\n }\n return raw as T[];\n}\n","/** Internal helpers for reading unknown server payloads without `any`. */\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function getProp(value: unknown, key: string): unknown {\n return isRecord(value) ? value[key] : undefined;\n}\n\nexport function asNumber(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n","/**\n * adaptPaginated — the common `{ data, total, page, pageSize }` wrapper.\n *\n * const { data, total, page, pageSize } =\n * adaptPaginated<Employee>(raw, { dataKey: 'data' });\n *\n * Key names are configurable for legacy ERP servers (e.g. rows/count/pageNo).\n */\n\nimport { asNumber, getProp } from './util';\n\nexport interface PaginatedResult<T> {\n data: T[];\n total: number;\n page: number;\n pageSize: number;\n}\n\nexport interface AdaptPaginatedOptions {\n dataKey?: string;\n totalKey?: string;\n pageKey?: string;\n pageSizeKey?: string;\n}\n\nexport function adaptPaginated<T>(\n raw: unknown,\n options: AdaptPaginatedOptions = {},\n): PaginatedResult<T> {\n const {\n dataKey = 'data',\n totalKey = 'total',\n pageKey = 'page',\n pageSizeKey = 'pageSize',\n } = options;\n\n const rawData = getProp(raw, dataKey);\n if (!Array.isArray(rawData)) {\n throw new TypeError(\n `adaptPaginated expected an array at \"${dataKey}\", received ${\n rawData === undefined ? 'undefined' : typeof rawData\n }.`,\n );\n }\n\n const data = rawData as T[];\n const total = asNumber(getProp(raw, totalKey), data.length);\n const page = asNumber(getProp(raw, pageKey), 1);\n const pageSize = asNumber(getProp(raw, pageSizeKey), data.length);\n\n return { data, total, page, pageSize };\n}\n","/**\n * adaptDynamicSchema — legacy ERP that sends column definitions alongside rows\n * (the table shape is decided by the server at runtime, not hardcoded in the app).\n *\n * const { columns, data } = adaptDynamicSchema(raw, {\n * columnsKey: 'columns', rowsKey: 'rows', fieldKey: 'field', labelKey: 'label',\n * });\n *\n * Produces real `ColumnDef`s so the rest of the library treats dynamic and static\n * schemas identically.\n */\n\nimport type { ColumnDef, ColumnType } from '../types';\nimport { getProp, isRecord } from './util';\n\nexport interface DynamicSchemaResult<T> {\n columns: ColumnDef<T>[];\n data: T[];\n}\n\nexport interface AdaptDynamicSchemaOptions {\n /** key under which the server lists column descriptors. Default 'columns'. */\n columnsKey?: string;\n /** key under which the server lists row objects. Default 'rows'. */\n rowsKey?: string;\n /** descriptor field holding the data-binding key. Default 'field'. */\n fieldKey?: string;\n /** descriptor field holding the header text. Default 'label'. */\n labelKey?: string;\n /** descriptor field holding the column type (optional). Default 'type'. */\n typeKey?: string;\n}\n\nconst KNOWN_TYPES: ReadonlySet<string> = new Set<ColumnType>([\n 'text',\n 'number',\n 'date',\n 'boolean',\n 'select',\n 'custom',\n]);\n\nfunction toColumnType(value: unknown): ColumnType | undefined {\n return typeof value === 'string' && KNOWN_TYPES.has(value) ? (value as ColumnType) : undefined;\n}\n\nexport function adaptDynamicSchema<T = Record<string, unknown>>(\n raw: unknown,\n options: AdaptDynamicSchemaOptions = {},\n): DynamicSchemaResult<T> {\n const {\n columnsKey = 'columns',\n rowsKey = 'rows',\n fieldKey = 'field',\n labelKey = 'label',\n typeKey = 'type',\n } = options;\n\n const rawColumns = getProp(raw, columnsKey);\n if (!Array.isArray(rawColumns)) {\n throw new TypeError(\n `adaptDynamicSchema expected an array at \"${columnsKey}\", received ${typeof rawColumns}.`,\n );\n }\n\n const rawRows = getProp(raw, rowsKey);\n if (!Array.isArray(rawRows)) {\n throw new TypeError(\n `adaptDynamicSchema expected an array at \"${rowsKey}\", received ${typeof rawRows}.`,\n );\n }\n\n const columns: ColumnDef<T>[] = rawColumns.map((descriptor, i) => {\n if (!isRecord(descriptor)) {\n throw new TypeError(`adaptDynamicSchema: column descriptor at index ${i} is not an object.`);\n }\n const field = descriptor[fieldKey];\n if (typeof field !== 'string' || field.length === 0) {\n throw new TypeError(\n `adaptDynamicSchema: column descriptor at index ${i} has no string \"${fieldKey}\".`,\n );\n }\n const rawLabel = descriptor[labelKey];\n const label = typeof rawLabel === 'string' && rawLabel.length > 0 ? rawLabel : field;\n const type = toColumnType(descriptor[typeKey]);\n\n return {\n key: field as keyof T & string,\n label,\n ...(type ? { type } : {}),\n } satisfies ColumnDef<T>;\n });\n\n return { columns, data: rawRows as T[] };\n}\n","/**\n * Column derivation (SPEC §2): the final render columns are a pure composition of\n * the immutable `columnDefs` (developer) and the mutable `columnState` (end user).\n *\n * renderColumns = columnDefs\n * .map(def => merge(def, columnState[def.key]))\n * .filter(c => c.visible)\n * .sort by (pinned group, order)\n *\n * `columnDefs` and the input `columnState` are never mutated.\n */\n\nimport type { ColumnDef, ColumnState, ColumnType, PinSide, ResolvedColumn } from '../types';\n\n/** Build the default view state for a set of column defs (order = declaration order). */\nexport function createInitialColumnState<T, TNode>(defs: ColumnDef<T, TNode>[]): ColumnState[] {\n return defs.map((def, index) => ({\n key: def.key,\n visible: true,\n order: index,\n width: def.width,\n pinned: null,\n }));\n}\n\n/**\n * Reconcile a persisted (e.g. localStorage) columnState against the current defs:\n * - keep stored entries for columns that still exist\n * - drop stored entries for columns that no longer exist\n * - append defaults for newly added columns (so a schema change never breaks)\n *\n * This makes persistence forward-compatible with evolving column definitions.\n */\nexport function reconcileColumnState<T, TNode>(\n defs: ColumnDef<T, TNode>[],\n stored: ColumnState[],\n): ColumnState[] {\n const storedByKey = new Map(stored.map((s) => [s.key, s]));\n const maxOrder = stored.reduce((m, s) => Math.max(m, s.order), -1);\n let nextOrder = maxOrder + 1;\n\n return defs.map((def) => {\n const existing = storedByKey.get(def.key);\n if (existing) return existing;\n return {\n key: def.key,\n visible: true,\n order: nextOrder++,\n width: def.width,\n pinned: null,\n } satisfies ColumnState;\n });\n}\n\nconst PIN_GROUP: Record<'left' | 'none' | 'right', number> = {\n left: 0,\n none: 1,\n right: 2,\n};\n\nfunction pinGroup(pinned: PinSide): number {\n if (pinned === 'left') return PIN_GROUP.left;\n if (pinned === 'right') return PIN_GROUP.right;\n return PIN_GROUP.none;\n}\n\n/**\n * Merge defs with state, drop hidden columns, and order them.\n * Ordering: left-pinned first, then unpinned, then right-pinned; `order` breaks ties.\n */\nexport function resolveColumns<T, TNode>(\n defs: ColumnDef<T, TNode>[],\n state: ColumnState[],\n): ResolvedColumn<T, TNode>[] {\n const stateByKey = new Map<string, ColumnState>();\n for (const s of state) stateByKey.set(s.key, s);\n\n const resolved: ResolvedColumn<T, TNode>[] = [];\n\n defs.forEach((def, index) => {\n const s = stateByKey.get(def.key);\n const visible = s?.visible ?? true;\n if (!visible) return;\n\n const order = s?.order ?? index;\n const pinned = s?.pinned ?? null;\n const labelOverride = s?.labelOverride;\n const type = def.type ?? 'text';\n // width precedence: user override → def.width → type-based smart default.\n // flex columns stay width-less (the flex basis drives them).\n const width = s?.width ?? def.width ?? (def.flex ? undefined : defaultWidthForType(type));\n\n resolved.push({\n key: def.key,\n label: def.label,\n displayLabel: labelOverride && labelOverride.length > 0 ? labelOverride : def.label,\n type,\n align: s?.align ?? def.align ?? defaultAlign(def.type),\n order,\n visible: true,\n pinned,\n width,\n minWidth: def.minWidth,\n maxWidth: def.maxWidth,\n flex: def.flex,\n // interaction defaults: on unless opted out; filtering is opt-in via `filterable`\n sortable: def.sortable ?? true,\n filterable: def.filterable ?? false,\n resizable: def.resizable ?? true,\n pinnable: def.pinnable ?? true,\n hideable: def.hideable ?? true,\n editable: def.editable ?? false,\n copyable: def.copyable ?? true,\n renderCell: def.renderCell,\n renderHeader: def.renderHeader,\n def,\n });\n });\n\n return resolved.sort((a, b) => {\n const groupDiff = pinGroup(a.pinned) - pinGroup(b.pinned);\n if (groupDiff !== 0) return groupDiff;\n return a.order - b.order;\n });\n}\n\n/** Numbers default to right, booleans to center (the check reads best centered),\n * everything else to left. Header and cell share this, so they always agree. */\nfunction defaultAlign(type: ColumnDef<unknown>['type']): 'left' | 'right' | 'center' {\n if (type === 'number') return 'right';\n if (type === 'boolean') return 'center';\n return 'left';\n}\n\n/**\n * Type-based smart default width (px) for columns that declare neither a width nor\n * flex. Content width is mostly a function of type — this is the predictable, no-scan\n * starting point. Users can resize (double-click a handle to auto-fit) and persist.\n */\nfunction defaultWidthForType(type: ColumnType): number {\n switch (type) {\n case 'boolean':\n return 72;\n case 'number':\n return 120;\n case 'date':\n return 128;\n case 'select':\n return 150;\n default:\n return 140; // text / custom\n }\n}\n","/**\n * Column operations (SPEC §3, §10): every user gesture on the table — hide, reorder,\n * resize, pin, rename — is a pure transformation of `ColumnState[]` into a NEW array.\n *\n * Invariants enforced by these functions:\n * - `columnDefs` and `data` are never referenced here (this layer only knows view state)\n * - the input `state` array is never mutated; a fresh array is always returned\n * - renaming writes `labelOverride`, NEVER the immutable `label`\n */\n\nimport type { ColumnAlign, ColumnState, PinSide } from '../types';\n\n/** Apply a partial patch to one column's state, returning a new array. */\nexport function patchColumnState(\n state: ColumnState[],\n key: string,\n patch: Partial<Omit<ColumnState, 'key'>>,\n): ColumnState[] {\n return state.map((s) => (s.key === key ? { ...s, ...patch } : s));\n}\n\nexport function setColumnVisible(\n state: ColumnState[],\n key: string,\n visible: boolean,\n): ColumnState[] {\n return patchColumnState(state, key, { visible });\n}\n\nexport function setColumnPinned(state: ColumnState[], key: string, pinned: PinSide): ColumnState[] {\n return patchColumnState(state, key, { pinned });\n}\n\nexport function setColumnWidth(state: ColumnState[], key: string, width: number): ColumnState[] {\n return patchColumnState(state, key, { width: Math.max(0, Math.round(width)) });\n}\n\nexport function setColumnAlign(\n state: ColumnState[],\n key: string,\n align: ColumnAlign,\n): ColumnState[] {\n return patchColumnState(state, key, { align });\n}\n\n/**\n * Rename a column. An empty/whitespace override clears back to the original `label`.\n * The original `label` lives on the ColumnDef and is untouched.\n */\nexport function setColumnLabelOverride(\n state: ColumnState[],\n key: string,\n labelOverride: string | undefined,\n): ColumnState[] {\n const trimmed = labelOverride?.trim();\n return patchColumnState(state, key, {\n labelOverride: trimmed && trimmed.length > 0 ? trimmed : undefined,\n });\n}\n\n/** Immutable array move. */\nfunction arrayMove<U>(arr: U[], from: number, to: number): U[] {\n const next = arr.slice();\n const [moved] = next.splice(from, 1);\n if (moved === undefined) return next;\n next.splice(to, 0, moved);\n return next;\n}\n\n/**\n * Reorder so that `activeKey` lands where `overKey` currently sits (DnD semantics),\n * then renumber `order` densely (0..n-1) in the resulting sequence.\n */\nexport function moveColumn(\n state: ColumnState[],\n activeKey: string,\n overKey: string,\n): ColumnState[] {\n if (activeKey === overKey) return state;\n\n const ordered = [...state].sort((a, b) => a.order - b.order);\n const from = ordered.findIndex((s) => s.key === activeKey);\n const to = ordered.findIndex((s) => s.key === overKey);\n if (from === -1 || to === -1) return state;\n\n const moved = arrayMove(ordered, from, to);\n const orderByKey = new Map<string, number>();\n moved.forEach((s, i) => orderByKey.set(s.key, i));\n\n return state.map((s) => ({ ...s, order: orderByKey.get(s.key) ?? s.order }));\n}\n","/**\n * Sorting (SPEC §5): single and multi-column. Pure — returns a NEW array, never\n * mutates the input. JS sort is stable, so a single comparator that walks the rule\n * list in priority order yields correct multi-sort with stable ties.\n */\n\nimport type { ColumnType, SortRule } from '../types';\n\nexport type TypeLookup = (columnKey: string) => ColumnType | undefined;\n\n/** Per-column sort configuration. */\nexport interface ColumnSort<T> {\n type?: ColumnType;\n /** sort by a derived value instead of row[key] */\n accessor?: (row: T) => unknown;\n /** full custom comparator (ascending); overrides type/accessor */\n comparator?: (a: T, b: T) => number;\n}\n\nexport type SortLookup<T> = (columnKey: string) => ColumnSort<T> | undefined;\n\nfunction toComparable(value: unknown, type: ColumnType | undefined): number | string {\n if (value === null || value === undefined)\n return type === 'number' ? Number.NEGATIVE_INFINITY : '';\n if (type === 'number') {\n const n = typeof value === 'number' ? value : Number(value);\n return Number.isNaN(n) ? Number.NEGATIVE_INFINITY : n;\n }\n if (type === 'date') {\n const t = value instanceof Date ? value.getTime() : new Date(String(value)).getTime();\n return Number.isNaN(t) ? Number.NEGATIVE_INFINITY : t;\n }\n if (type === 'boolean') return value ? 1 : 0;\n return String(value).toLocaleLowerCase();\n}\n\nfunction compare(a: unknown, b: unknown, type: ColumnType | undefined): number {\n const ca = toComparable(a, type);\n const cb = toComparable(b, type);\n if (typeof ca === 'number' && typeof cb === 'number') return ca - cb;\n return String(ca).localeCompare(String(cb));\n}\n\n/**\n * Sort by the active rules. `getSort` supplies each column's sort behavior:\n * - comparator: full custom (ascending) comparator over rows\n * - accessor: sort by a derived value instead of row[key]\n * - type: typed comparison (number/date/boolean/text)\n */\nexport function sortRows<T>(data: T[], rules: SortRule[], getSort: SortLookup<T>): T[] {\n if (rules.length === 0) return data;\n\n return [...data].sort((ra, rb) => {\n for (const rule of rules) {\n const cfg = getSort(rule.columnKey);\n let diff: number;\n if (cfg?.comparator) {\n diff = cfg.comparator(ra, rb);\n } else {\n const key = rule.columnKey as keyof T & string;\n const av = cfg?.accessor ? cfg.accessor(ra) : ra[key];\n const bv = cfg?.accessor ? cfg.accessor(rb) : rb[key];\n diff = compare(av, bv, cfg?.type);\n }\n if (diff !== 0) return rule.direction === 'asc' ? diff : -diff;\n }\n return 0;\n });\n}\n\n/**\n * Cycle a column's sort for click-to-sort headers: none → asc → desc → none.\n * `multi` keeps existing rules (appending/updating this column); otherwise this\n * column becomes the sole sort.\n */\nexport function toggleSort(rules: SortRule[], columnKey: string, multi = false): SortRule[] {\n const existing = rules.find((r) => r.columnKey === columnKey);\n const others = multi ? rules.filter((r) => r.columnKey !== columnKey) : [];\n\n if (!existing) return [...others, { columnKey, direction: 'asc' }];\n if (existing.direction === 'asc') return [...others, { columnKey, direction: 'desc' }];\n return others; // was desc → remove\n}\n","/**\n * Column filters (SPEC §3, §5): structured per-column data queries. Distinct from\n * global search (which is free-text UX). Pure — returns a NEW filtered array.\n */\n\nimport type { ColumnType, Filter } from '../types';\n\nfunction num(value: unknown): number {\n if (typeof value === 'number') return value;\n if (value instanceof Date) return value.getTime();\n const n = Number(value);\n return Number.isNaN(n) ? Number.NaN : n;\n}\n\nfunction text(value: unknown): string {\n return value === null || value === undefined ? '' : String(value).toLocaleLowerCase();\n}\n\nexport function matchesFilter(value: unknown, filter: Filter, type?: ColumnType): boolean {\n const { operator, value: target, value2 } = filter;\n\n switch (operator) {\n case 'eq':\n return type === 'number' ? num(value) === num(target) : text(value) === text(target);\n case 'neq':\n return type === 'number' ? num(value) !== num(target) : text(value) !== text(target);\n case 'gt':\n return num(value) > num(target);\n case 'lt':\n return num(value) < num(target);\n case 'gte':\n return num(value) >= num(target);\n case 'lte':\n return num(value) <= num(target);\n case 'contains':\n return text(value).includes(text(target));\n case 'between': {\n const v = num(value);\n return v >= num(target) && v <= num(value2);\n }\n case 'in':\n return Array.isArray(target) && target.some((t) => text(value) === text(t));\n default:\n return true;\n }\n}\n\nexport type TypeLookup = (columnKey: string) => ColumnType | undefined;\n\n/** Apply all filters with AND semantics. An empty filter list returns the input as-is. */\nexport function applyFilters<T>(data: T[], filters: Filter[], getType: TypeLookup): T[] {\n if (filters.length === 0) return data;\n return data.filter((row) =>\n filters.every((f) => matchesFilter(row[f.columnKey as keyof T], f, getType(f.columnKey))),\n );\n}\n","/**\n * Global search (SPEC §3): free-text UX matching, kept deliberately separate from\n * structured column filters. Case-insensitive substring match over the column scope.\n * Pure — returns a NEW array (or the input untouched when the query is empty).\n */\n\nimport type { SearchState } from '../types';\n\nexport function applySearch<T>(data: T[], search: SearchState, allKeys: string[]): T[] {\n const query = search.query.trim().toLocaleLowerCase();\n if (query.length === 0) return data;\n\n const keys = search.scope === 'all' ? allKeys : search.scope;\n\n return data.filter((row) =>\n keys.some((key) => {\n const value = row[key as keyof T];\n if (value === null || value === undefined) return false;\n return String(value).toLocaleLowerCase().includes(query);\n }),\n );\n}\n","/**\n * Pagination (SPEC §5, §6). Pure slicing over the already filtered/searched/sorted\n * data. The companion `offset` lets buildRows keep `globalIndex` dataset-absolute\n * while `displayIndex` resets per page.\n */\n\nexport function getPageCount(total: number, pageSize: number): number {\n if (pageSize <= 0) return 1;\n return Math.max(1, Math.ceil(total / pageSize));\n}\n\n/** Clamp a requested page into the valid 1..pageCount range. */\nexport function clampPage(page: number, total: number, pageSize: number): number {\n const count = getPageCount(total, pageSize);\n return Math.min(Math.max(1, Math.floor(page)), count);\n}\n\nexport interface PageSlice<T> {\n /** the rows for this page */\n items: T[];\n /** number of rows preceding this page in the full set — pass to buildRows */\n offset: number;\n page: number;\n pageCount: number;\n}\n\nexport function paginate<T>(data: T[], page: number, pageSize: number): PageSlice<T> {\n if (pageSize <= 0) {\n return { items: data, offset: 0, page: 1, pageCount: 1 };\n }\n const safePage = clampPage(page, data.length, pageSize);\n const offset = (safePage - 1) * pageSize;\n return {\n items: data.slice(offset, offset + pageSize),\n offset,\n page: safePage,\n pageCount: getPageCount(data.length, pageSize),\n };\n}\n","/**\n * Pivot / cross-tab (AG-Grid style). Pure — groups `data` by one or more row\n * fields and column fields, aggregating a value field into a matrix with row /\n * column / grand totals. The original data is never mutated.\n *\n * v1: row + column fields are composite keys (joined paths); a single value field\n * with sum / count / avg / min / max.\n */\n\nexport type PivotAggregate = 'sum' | 'count' | 'avg' | 'min' | 'max';\n\nexport interface PivotConfig<T> {\n rows: (keyof T & string)[];\n columns: (keyof T & string)[];\n value: keyof T & string;\n aggregate: PivotAggregate;\n}\n\nexport interface PivotResult {\n rowFields: string[];\n columnFields: string[];\n value: string;\n aggregate: PivotAggregate;\n /** ordered row-key paths (one entry per row-field value combination) */\n rowKeys: string[][];\n /** ordered column-key paths */\n columnKeys: string[][];\n /** values[rowIndex][colIndex] — null when a cell has no data */\n values: (number | null)[][];\n rowTotals: (number | null)[];\n columnTotals: (number | null)[];\n grandTotal: number | null;\n}\n\ninterface Acc {\n sum: number;\n n: number; // numeric count\n rows: number; // row count\n min: number;\n max: number;\n}\n\nfunction newAcc(): Acc {\n return { sum: 0, n: 0, rows: 0, min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY };\n}\n\nfunction add(acc: Acc, value: unknown): void {\n acc.rows += 1;\n const num = typeof value === 'number' ? value : Number(value);\n if (!Number.isNaN(num) && value !== null && value !== undefined && value !== '') {\n acc.sum += num;\n acc.n += 1;\n if (num < acc.min) acc.min = num;\n if (num > acc.max) acc.max = num;\n }\n}\n\nfunction finalize(acc: Acc | undefined, agg: PivotAggregate): number | null {\n if (!acc) return null;\n if (agg === 'count') return acc.rows;\n if (acc.n === 0) return null;\n switch (agg) {\n case 'sum':\n return acc.sum;\n case 'avg':\n return acc.sum / acc.n;\n case 'min':\n return acc.min;\n case 'max':\n return acc.max;\n default:\n return null;\n }\n}\n\nfunction pathOf<T>(row: T, fields: (keyof T & string)[]): string[] {\n return fields.map((f) => {\n const v = row[f];\n return v === null || v === undefined ? '' : String(v);\n });\n}\n\nexport function pivot<T>(data: T[], config: PivotConfig<T>): PivotResult {\n const { rows: rowFields, columns: colFields, value, aggregate } = config;\n\n const cells = new Map<string, Map<string, Acc>>();\n const rowAcc = new Map<string, Acc>();\n const colAcc = new Map<string, Acc>();\n const grand = newAcc();\n\n const rowKeyPaths = new Map<string, string[]>();\n const colKeyPaths = new Map<string, string[]>();\n\n for (const row of data) {\n const rPath = pathOf(row, rowFields);\n const cPath = pathOf(row, colFields);\n const rKey = rPath.join('\u0000');\n const cKey = cPath.join('\u0000');\n rowKeyPaths.set(rKey, rPath);\n colKeyPaths.set(cKey, cPath);\n\n const v = row[value];\n let byCol = cells.get(rKey);\n if (!byCol) {\n byCol = new Map();\n cells.set(rKey, byCol);\n }\n let acc = byCol.get(cKey);\n if (!acc) {\n acc = newAcc();\n byCol.set(cKey, acc);\n }\n add(acc, v);\n\n let ra = rowAcc.get(rKey);\n if (!ra) {\n ra = newAcc();\n rowAcc.set(rKey, ra);\n }\n add(ra, v);\n\n let ca = colAcc.get(cKey);\n if (!ca) {\n ca = newAcc();\n colAcc.set(cKey, ca);\n }\n add(ca, v);\n\n add(grand, v);\n }\n\n const byPath = (a: string[], b: string[]) => a.join('\u0000').localeCompare(b.join('\u0000'));\n const rowKeys = [...rowKeyPaths.values()].sort(byPath);\n const columnKeys = [...colKeyPaths.values()].sort(byPath);\n\n const values = rowKeys.map((rPath) => {\n const byCol = cells.get(rPath.join('\u0000'));\n return columnKeys.map((cPath) => finalize(byCol?.get(cPath.join('\u0000')), aggregate));\n });\n const rowTotals = rowKeys.map((rPath) => finalize(rowAcc.get(rPath.join('\u0000')), aggregate));\n const columnTotals = columnKeys.map((cPath) => finalize(colAcc.get(cPath.join('\u0000')), aggregate));\n\n return {\n rowFields,\n columnFields: colFields,\n value,\n aggregate,\n rowKeys,\n columnKeys,\n values,\n rowTotals,\n columnTotals,\n grandTotal: finalize(grand, aggregate),\n };\n}\n","/**\n * Row indexing (SPEC §3).\n *\n * Three distinct numbers, never conflated:\n * - rowId stable PK (from getRowId, or a global-index fallback string)\n * - displayIndex 1-based position within the current page/view slice\n * - globalIndex 1-based position within the full dataset (page-independent)\n *\n * The original row objects are referenced, never mutated.\n */\n\nimport type { Row } from '../types';\n\nexport interface BuildRowsOptions<T> {\n /** stable id resolver; falls back to the globalIndex as a string */\n getRowId?: (row: T) => string;\n /** how many rows precede this slice in the full dataset (for pagination). Default 0. */\n offset?: number;\n}\n\n/**\n * Turn a (possibly paginated) data slice into indexed rows.\n * Pass the full array with offset 0 for the non-paginated case.\n */\nexport function buildRows<T>(data: T[], options: BuildRowsOptions<T> = {}): Row<T>[] {\n const { getRowId, offset = 0 } = options;\n\n return data.map((item, i) => {\n const displayIndex = i + 1;\n const globalIndex = offset + i + 1;\n return {\n rowId: getRowId ? getRowId(item) : String(globalIndex),\n displayIndex,\n globalIndex,\n data: item,\n };\n });\n}\n","import type { ExportCell, ExportTable } from './types';\n\nexport interface CsvOptions {\n /** field delimiter. Default \",\". Use \"\\t\" for TSV. */\n delimiter?: string;\n}\n\nfunction escapeCell(value: ExportCell, delimiter: string): string {\n const s = value == null ? '' : String(value);\n if (s.includes(delimiter) || s.includes('\"') || s.includes('\\n') || s.includes('\\r')) {\n return `\"${s.replace(/\"/g, '\"\"')}\"`;\n }\n return s;\n}\n\n/** Serialize an export table to RFC-4180 CSV (CRLF line breaks). */\nexport function toCSV(table: ExportTable, options: CsvOptions = {}): string {\n const delimiter = options.delimiter ?? ',';\n const lines: string[] = [table.headers.map((h) => escapeCell(h, delimiter)).join(delimiter)];\n for (const row of table.rows) {\n lines.push(row.map((c) => escapeCell(c, delimiter)).join(delimiter));\n }\n return lines.join('\\r\\n');\n}\n","import type { ExportTable } from './types';\n\nexport interface JsonOptions {\n /** pretty-print with 2-space indent. Default true. */\n pretty?: boolean;\n}\n\n/** Serialize an export table to a JSON array of header-keyed record objects. */\nexport function toJSON(table: ExportTable, options: JsonOptions = {}): string {\n const records = table.rows.map((row) => {\n const obj: Record<string, unknown> = {};\n table.headers.forEach((h, i) => {\n obj[h] = row[i] ?? null;\n });\n return obj;\n });\n return JSON.stringify(records, null, options.pretty === false ? undefined : 2);\n}\n","import type { ExportCell, ExportTable } from './types';\n\nexport interface XmlOptions {\n /** wrapping root element. Default \"rows\". */\n rootTag?: string;\n /** per-row element. Default \"row\". */\n rowTag?: string;\n}\n\n/** XML-escape a text value for element content / attributes. */\nexport function escapeXml(value: ExportCell): string {\n const s = value == null ? '' : String(value);\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n\n/** Turn a header label into a valid XML element name (fallback `colN`). */\nfunction toTagName(header: string, index: number): string {\n let name = header.replace(/[^A-Za-z0-9_.-]/g, '_');\n if (!name || !/^[A-Za-z_]/.test(name)) name = `_${name}`;\n return name || `col${index}`;\n}\n\n/** Serialize an export table to XML: <root><row><header>value</header>…</row></root>. */\nexport function toXML(table: ExportTable, options: XmlOptions = {}): string {\n const root = options.rootTag ?? 'rows';\n const rowTag = options.rowTag ?? 'row';\n const tags = table.headers.map((h, i) => toTagName(h, i));\n\n const lines: string[] = ['<?xml version=\"1.0\" encoding=\"UTF-8\"?>', `<${root}>`];\n for (const row of table.rows) {\n lines.push(` <${rowTag}>`);\n row.forEach((cell, i) => {\n const tag = tags[i] ?? `col${i}`;\n lines.push(` <${tag}>${escapeXml(cell)}</${tag}>`);\n });\n lines.push(` </${rowTag}>`);\n }\n lines.push(`</${root}>`);\n return lines.join('\\n');\n}\n","/**\n * Minimal store-only (uncompressed) ZIP writer — just enough to assemble a\n * valid .xlsx (an OOXML zip) with no dependencies. Files are stored with\n * method 0 (no compression), which Excel/Numbers/LibreOffice all open fine.\n */\n\nexport interface ZipEntry {\n name: string;\n data: Uint8Array;\n}\n\nconst CRC_TABLE = (() => {\n const table = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n table[n] = c >>> 0;\n }\n return table;\n})();\n\nfunction crc32(bytes: Uint8Array): number {\n let c = 0xffffffff;\n for (let i = 0; i < bytes.length; i++) {\n const byte = bytes[i] ?? 0;\n const idx = (c ^ byte) & 0xff;\n c = (CRC_TABLE[idx] ?? 0) ^ (c >>> 8);\n }\n return (c ^ 0xffffffff) >>> 0;\n}\n\n/** Encode a string to UTF-8 bytes without relying on the DOM `TextEncoder`. */\nexport function utf8Bytes(str: string): Uint8Array {\n const out: number[] = [];\n for (let i = 0; i < str.length; i++) {\n let code = str.charCodeAt(i);\n if (code >= 0xd800 && code <= 0xdbff && i + 1 < str.length) {\n const next = str.charCodeAt(i + 1);\n if (next >= 0xdc00 && next <= 0xdfff) {\n code = ((code - 0xd800) << 10) + (next - 0xdc00) + 0x10000;\n i++;\n }\n }\n if (code < 0x80) {\n out.push(code);\n } else if (code < 0x800) {\n out.push(0xc0 | (code >> 6), 0x80 | (code & 0x3f));\n } else if (code < 0x10000) {\n out.push(0xe0 | (code >> 12), 0x80 | ((code >> 6) & 0x3f), 0x80 | (code & 0x3f));\n } else {\n out.push(\n 0xf0 | (code >> 18),\n 0x80 | ((code >> 12) & 0x3f),\n 0x80 | ((code >> 6) & 0x3f),\n 0x80 | (code & 0x3f),\n );\n }\n }\n return Uint8Array.from(out);\n}\n\n/** Build a ZIP archive (stored, no compression) from the given entries. */\nexport function zipStore(entries: ZipEntry[]): Uint8Array {\n const prepped = entries.map((e) => {\n const name = utf8Bytes(e.name);\n return { name, data: e.data, crc: crc32(e.data), size: e.data.length };\n });\n\n // total size: per-entry (local header 30 + name + data) + (central 46 + name) + EOCD 22\n let total = 22;\n for (const p of prepped) total += 30 + p.name.length + p.size + 46 + p.name.length;\n\n const buf = new Uint8Array(total);\n const dv = new DataView(buf.buffer);\n let pos = 0;\n const u16 = (v: number) => {\n dv.setUint16(pos, v & 0xffff, true);\n pos += 2;\n };\n const u32 = (v: number) => {\n dv.setUint32(pos, v >>> 0, true);\n pos += 4;\n };\n const write = (b: Uint8Array) => {\n buf.set(b, pos);\n pos += b.length;\n };\n\n // local headers + file data\n const localOffsets: number[] = [];\n for (const p of prepped) {\n localOffsets.push(pos);\n u32(0x04034b50);\n u16(20);\n u16(0);\n u16(0); // method: stored\n u16(0);\n u16(0); // mod time/date\n u32(p.crc);\n u32(p.size);\n u32(p.size);\n u16(p.name.length);\n u16(0); // extra len\n write(p.name);\n write(p.data);\n }\n\n // central directory\n const cdStart = pos;\n prepped.forEach((p, i) => {\n u32(0x02014b50);\n u16(20);\n u16(20);\n u16(0);\n u16(0);\n u16(0);\n u16(0);\n u32(p.crc);\n u32(p.size);\n u32(p.size);\n u16(p.name.length);\n u16(0);\n u16(0);\n u16(0);\n u16(0);\n u32(0);\n u32(localOffsets[i] ?? 0);\n write(p.name);\n });\n const cdSize = pos - cdStart;\n\n // end of central directory\n u32(0x06054b50);\n u16(0);\n u16(0);\n u16(prepped.length);\n u16(prepped.length);\n u32(cdSize);\n u32(cdStart);\n u16(0);\n\n return buf;\n}\n","import type { ExportCell, ExportTable } from './types';\nimport { escapeXml } from './xml';\nimport { utf8Bytes, zipStore } from './zip';\n\nexport interface XlsxOptions {\n /** worksheet tab name. Default \"Sheet1\". Excel caps names at 31 chars. */\n sheetName?: string;\n}\n\n/** 0-based column index → spreadsheet column letters (A, B, … Z, AA, …). */\nfunction colLetter(index: number): string {\n let s = '';\n let i = index + 1;\n while (i > 0) {\n const rem = (i - 1) % 26;\n s = String.fromCharCode(65 + rem) + s;\n i = Math.floor((i - 1) / 26);\n }\n return s;\n}\n\nfunction cellXml(ref: string, value: ExportCell): string {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return `<c r=\"${ref}\"><v>${value}</v></c>`;\n }\n const s = value == null ? '' : String(value);\n return `<c r=\"${ref}\" t=\"inlineStr\"><is><t xml:space=\"preserve\">${escapeXml(s)}</t></is></c>`;\n}\n\n/** valid worksheet name: strip Excel-forbidden chars and clamp to 31 chars */\nfunction safeSheetName(name: string): string {\n return (name.replace(/[[\\]:*?/\\\\]/g, ' ').trim() || 'Sheet1').slice(0, 31);\n}\n\nconst CONTENT_TYPES = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/><Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/><Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/></Types>`;\n\nconst ROOT_RELS = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/></Relationships>`;\n\nconst WORKBOOK_RELS = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet1.xml\"/></Relationships>`;\n\n/**\n * Serialize an export table to a real .xlsx workbook (OOXML zip) as raw bytes —\n * no dependencies. Numeric cells are written as numbers; everything else as\n * inline strings. Open the returned bytes in Excel / Numbers / Google Sheets.\n */\nexport function toXLSX(table: ExportTable, options: XlsxOptions = {}): Uint8Array {\n const sheetName = safeSheetName(options.sheetName ?? 'Sheet1');\n const matrix: ExportCell[][] = [table.headers, ...table.rows];\n\n const rowsXml = matrix\n .map((row, r) => {\n const cells = row.map((v, c) => cellXml(`${colLetter(c)}${r + 1}`, v)).join('');\n return `<row r=\"${r + 1}\">${cells}</row>`;\n })\n .join('');\n\n const sheet = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\"><sheetData>${rowsXml}</sheetData></worksheet>`;\n\n const workbook = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"><sheets><sheet name=\"${escapeXml(sheetName)}\" sheetId=\"1\" r:id=\"rId1\"/></sheets></workbook>`;\n\n return zipStore([\n { name: '[Content_Types].xml', data: utf8Bytes(CONTENT_TYPES) },\n { name: '_rels/.rels', data: utf8Bytes(ROOT_RELS) },\n { name: 'xl/workbook.xml', data: utf8Bytes(workbook) },\n { name: 'xl/_rels/workbook.xml.rels', data: utf8Bytes(WORKBOOK_RELS) },\n { name: 'xl/worksheets/sheet1.xml', data: utf8Bytes(sheet) },\n ]);\n}\n","import { toCSV } from './csv';\nimport { toJSON } from './json';\nimport type { ExportFormat, ExportTable } from './types';\nimport { toXLSX } from './xlsx';\nimport { toXML } from './xml';\n\nexport { toCSV } from './csv';\nexport type { CsvOptions } from './csv';\nexport { toJSON } from './json';\nexport type { JsonOptions } from './json';\nexport { toXML, escapeXml } from './xml';\nexport type { XmlOptions } from './xml';\nexport { toXLSX } from './xlsx';\nexport type { XlsxOptions } from './xlsx';\nexport { zipStore } from './zip';\nexport type { ZipEntry } from './zip';\nexport type { ExportCell, ExportTable, ExportFormat } from './types';\n\n/** MIME type + file extension for each export format. */\nexport const EXPORT_FORMAT_META: Record<ExportFormat, { mime: string; ext: string }> = {\n csv: { mime: 'text/csv;charset=utf-8', ext: 'csv' },\n json: { mime: 'application/json;charset=utf-8', ext: 'json' },\n xml: { mime: 'application/xml;charset=utf-8', ext: 'xml' },\n xlsx: {\n mime: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n ext: 'xlsx',\n },\n};\n\n/**\n * Serialize an export table to the given format. Text formats return a string;\n * xlsx returns raw bytes (a Uint8Array). Framework-agnostic — the download\n * itself (Blob + anchor) lives in the React layer.\n */\nexport function serializeExport(table: ExportTable, format: ExportFormat): string | Uint8Array {\n switch (format) {\n case 'csv':\n return toCSV(table);\n case 'json':\n return toJSON(table);\n case 'xml':\n return toXML(table);\n case 'xlsx':\n return toXLSX(table);\n default:\n return toCSV(table);\n }\n}\n","/**\n * @softium/table-core\n *\n * Headless core for the softium-ui Table.\n * Pure TypeScript — does not import React, DOM, or `window`.\n */\n\nexport const VERSION = '0.0.0';\n\n// types — the contract\nexport type {\n ColumnAlign,\n ColumnDef,\n ColumnState,\n ColumnType,\n CellContext,\n Filter,\n FilterOperator,\n HeaderContext,\n PinSide,\n ResolvedColumn,\n Row,\n SearchState,\n SortDirection,\n SortRule,\n TableInput,\n} from './types';\n\n// adapters — absorb any server shape\nexport * from './adapters';\n\n// derive — pure view derivations (no mutation of inputs)\nexport * from './derive';\n\n// export — CSV / JSON / XML / XLSX serializers (DOM-free)\nexport * from './export';\n"]}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@softium/table-core",
3
+ "version": "0.1.0",
4
+ "description": "Headless core for softium-ui Table. Types, adapters, and derivation logic. No DOM.",
5
+ "license": "MIT",
6
+ "author": "Sunghoon Lee",
7
+ "homepage": "https://github.com/HOONY-LEE/softium-ui/tree/main/packages/table-core#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/HOONY-LEE/softium-ui.git",
11
+ "directory": "packages/table-core"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/HOONY-LEE/softium-ui/issues"
15
+ },
16
+ "keywords": [
17
+ "table",
18
+ "datagrid",
19
+ "headless",
20
+ "erp",
21
+ "typescript",
22
+ "softium-ui"
23
+ ],
24
+ "type": "module",
25
+ "sideEffects": false,
26
+ "files": [
27
+ "dist",
28
+ "LICENSE"
29
+ ],
30
+ "main": "./dist/index.cjs",
31
+ "module": "./dist/index.js",
32
+ "types": "./dist/index.d.ts",
33
+ "exports": {
34
+ ".": {
35
+ "types": "./dist/index.d.ts",
36
+ "import": "./dist/index.js",
37
+ "require": "./dist/index.cjs"
38
+ }
39
+ },
40
+ "devDependencies": {
41
+ "tsup": "^8.3.5",
42
+ "typescript": "^5.7.3",
43
+ "vitest": "^2.1.8"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "scripts": {
49
+ "build": "tsup",
50
+ "dev": "tsup --watch",
51
+ "typecheck": "tsc --noEmit",
52
+ "test": "vitest run --passWithNoTests"
53
+ }
54
+ }