@simple-table/svelte 4.1.4 → 4.1.5

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/dist/cjs/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("svelte/internal/disclose-version"),require("svelte/internal/flags/legacy");var e=require("svelte/internal/client"),t=require("svelte"),n=require("simple-table-core");function r(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})}}),t.default=e,Object.freeze(t)}var o=r(e);function s(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}function c(e,n){return r=>{const o=document.createElement("div"),s=t.mount(n,{target:o,props:r});return e.register(o,()=>{t.unmount(s)}),o}}function i(e,n,r,o){const s="cell"===r?e.cellRendererCache:e.headerRendererCache,c=s.get(n);if(c)return c.component=o,c.wrapped;const i={component:o,wrapped:null},l=n=>{const r=document.createElement("div"),o=t.mount(i.component,{target:r,props:n});return e.register(r,()=>{t.unmount(o)}),r};return i.wrapped=l,s.set(n,i),l}function l(e,n={}){const r=document.createElement("div"),o=t.mount(e,{target:r,props:n}),s=r.innerHTML;return t.unmount(o),s}function a(e){return"function"==typeof e}function u(e,t){const{cellRenderer:n,headerRenderer:r,children:o,nestedTable:c}=e,l=s(e,["cellRenderer","headerRenderer","children","nestedTable"]),a=String(e.accessor),d=Object.assign({},l);if(n&&(d.cellRenderer="function"==typeof n&&n.length>=2?i(t,a,"cell",n):n),r&&(d.headerRenderer="function"==typeof r&&r.length>=2?i(t,a,"header",r):r),o&&(d.children=o.map(e=>u(e,t))),c){const e=Object.assign(Object.assign({},c),{rows:[]});d.nestedTable=p(e,t)}return d}function d(e){const t=e.columns;if(!t)throw new Error("SimpleTable requires `columns`");return t}function p(e,r){const{rows:o,footerRenderer:i,emptyStateRenderer:p,errorStateRenderer:g,loadingStateRenderer:f,headerDropdown:m,columnEditorConfig:b,icons:h,tableEmptyStateRenderer:R,rowButtons:v,onColumnOrderChange:y,onColumnWidthChange:O,onHeaderEdit:w,onColumnSelect:E,enableColumnEditor:C,enableColumnEditorInitOpen:_,enablePagination:P,onTableReady:S,hoverRowBackground:j,oddColumnBackground:T,oddEvenRowBackground:I}=e,A=s(e,["columns","rows","footerRenderer","emptyStateRenderer","errorStateRenderer","loadingStateRenderer","headerDropdown","columnEditorConfig","icons","tableEmptyStateRenderer","rowButtons","onColumnOrderChange","onColumnWidthChange","onHeaderEdit","onColumnSelect","enableColumnEditor","enableColumnEditorInitOpen","enablePagination","onTableReady","hoverRowBackground","oddColumnBackground","oddEvenRowBackground"]),B=d(e);r.pruneRendererCaches(n.collectHeaderAccessors(B));const x=Object.assign(Object.assign({},A),{rows:n.asRows(o),columns:B.map(e=>u(e,r)),enableColumnEditor:C,enableColumnEditorInitOpen:_,enablePagination:P,onTableReady:S,hoverRowBackground:j,oddColumnBackground:T,oddEvenRowBackground:I,onRendererHostDiscard:r.disposeHost});return y&&(x.onColumnOrderChange=e=>y(e)),O&&(x.onColumnWidthChange=e=>O(e)),w&&(x.onHeaderEdit=(e,t)=>w(e,t)),E&&(x.onColumnSelect=e=>E(e)),void 0!==R&&(null===R?x.tableEmptyStateRenderer=null:"string"==typeof R||R instanceof HTMLElement?x.tableEmptyStateRenderer=R:a(R)&&(x.tableEmptyStateRenderer=function(e,n){const r=document.createElement("div"),o=t.mount(n,{target:r,props:{}});return e.register(r,()=>{t.unmount(o)}),r}(r,R))),void 0!==i&&(x.footerRenderer="function"==typeof i&&i.length>=2?c(r,i):i),void 0!==p&&(x.emptyStateRenderer="function"==typeof p&&p.length>=2?c(r,p):p),void 0!==g&&(x.errorStateRenderer="function"==typeof g&&g.length>=2?c(r,g):g),void 0!==f&&(x.loadingStateRenderer="function"==typeof f&&f.length>=2?c(r,f):f),void 0!==m&&(x.headerDropdown=c(r,m)),void 0!==b&&(x.columnEditorConfig=function(e,t){const{rowRenderer:n,customRenderer:r}=e,o=s(e,["rowRenderer","customRenderer"]);return Object.assign(Object.assign(Object.assign({},o),n?{rowRenderer:c(t,n)}:{}),r?{customRenderer:c(t,r)}:{})}(b,r)),void 0!==h&&(x.icons=function(e){const t={};for(const[n,r]of Object.entries(e))null!=r&&("string"==typeof r||r instanceof HTMLElement||r instanceof SVGElement?t[n]=r:a(r)&&(t[n]=l(r,{})));return t}(h)),void 0!==v&&(x.rowButtons=v.map(e=>c(r,e))),x}"function"==typeof SuppressedError&&SuppressedError;const g="data-st-mount-id";class f{constructor(){this.entries=new Map,this.nextId=0,this.cellRendererCache=new Map,this.headerRendererCache=new Map,this.disposeHost=e=>{if("function"!=typeof e.getAttribute)return;const t=[],n=e.getAttribute(g);null!==n&&t.push(n),e.querySelectorAll(`[${g}]`).forEach(e=>{const n=e.getAttribute(g);null!==n&&t.push(n)});for(const e of t){const t=this.entries.get(e);t&&(this.entries.delete(e),t())}}}register(e,t){const n="st-mount-"+this.nextId++;e.setAttribute(g,n),this.entries.set(n,t)}clear(){this.cellRendererCache.clear(),this.headerRendererCache.clear();for(const e of this.entries.values())e();this.entries.clear()}pruneRendererCaches(e){for(const t of this.cellRendererCache.keys())e.has(t)||this.cellRendererCache.delete(t);for(const t of this.headerRendererCache.keys())e.has(t)||this.headerRendererCache.delete(t)}get size(){return this.entries.size}}var m=o.from_html("<div></div>");Object.defineProperty(exports,"PIVOT_ACCESSOR_PREFIX",{enumerable:!0,get:function(){return n.PIVOT_ACCESSOR_PREFIX}}),Object.defineProperty(exports,"PIVOT_BLANK_LABEL",{enumerable:!0,get:function(){return n.PIVOT_BLANK_LABEL}}),Object.defineProperty(exports,"PIVOT_CHILDREN_KEY",{enumerable:!0,get:function(){return n.PIVOT_CHILDREN_KEY}}),Object.defineProperty(exports,"PIVOT_IS_TOTAL_KEY",{enumerable:!0,get:function(){return n.PIVOT_IS_TOTAL_KEY}}),Object.defineProperty(exports,"asRows",{enumerable:!0,get:function(){return n.asRows}}),Object.defineProperty(exports,"buildPivotAccessor",{enumerable:!0,get:function(){return n.buildPivotAccessor}}),Object.defineProperty(exports,"buildPivotRowTotalAccessor",{enumerable:!0,get:function(){return n.buildPivotRowTotalAccessor}}),Object.defineProperty(exports,"pivotRows",{enumerable:!0,get:function(){return n.pivotRows}}),exports.SimpleTable=function(e,r){const s=o.legacy_rest_props(r,["children","$$slots","$$events","$$legacy"]),c=o.legacy_rest_props(s,["getAPI","rows","columns"]);o.push(r,!1);let i=o.prop(r,"rows",8),l=o.prop(r,"columns",8,void 0),a=o.mutable_source(),u=o.mutable_source(null);const g=new f;let b=o.mutable_source(void 0),h=o.mutable_source(void 0);function R(){var e;return null!==(e=null===o.get(u)||void 0===o.get(u)?void 0:o.get(u).getAPI())&&void 0!==e?e:null}t.onMount(()=>{const e=Object.assign({rows:i(),columns:l()},c);o.set(u,new n.SimpleTableVanilla(o.get(a),p(e,g))),o.get(u).mount(),o.set(b,d(e)),o.set(h,i())}),t.onDestroy(()=>{null===o.get(u)||void 0===o.get(u)||o.get(u).destroy(),o.set(u,null),o.set(b,void 0),o.set(h,void 0),g.clear()}),o.legacy_pre_effect(()=>(o.get(u),o.deep_read_state(i()),o.deep_read_state(l()),o.deep_read_state(c),o.get(b),o.get(h)),()=>{if(o.get(u)){const e=Object.assign({rows:i(),columns:l()},c),t=p(e,g),r=Object.assign({},t),s=d(e),a=n.headersStructurallyEqual(o.get(b),s);o.set(b,s),a&&delete r.columns;const f=n.rowsShallowUnchanged(o.get(h),i(),e.getRowId);o.set(h,i()),f&&delete r.rows,o.get(u).update(r)}}),o.legacy_pre_effect_reset();var v={getAPI:R};o.init();var y=m();return o.bind_this(y,e=>o.set(a,e),()=>o.get(a)),o.append(e,y),o.bind_prop(r,"getAPI",R),o.pop(v)};
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),require("svelte/internal/disclose-version"),require("svelte/internal/flags/legacy");var e=require("svelte/internal/client"),t=require("svelte"),n=require("simple-table-core"),r=require("svelte/legacy");function o(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach(function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,r.get?r:{enumerable:!0,get:function(){return e[n]}})}}),t.default=e,Object.freeze(t)}var s=o(e);function i(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}function l(e,t,n){return r.createClassComponent({component:e,target:t,props:n,intro:!1})}function c(e,n){return r=>{const o=document.createElement("div"),s=t.mount(n,{target:o,props:r});return e.register(o,()=>{t.unmount(s)}),o}}function u(e,n,r,o){const s="cell"===r?e.cellRendererCache:e.headerRendererCache,i=s.get(n);if(i)return i.component=o,i.wrapped;const c={component:o,wrapped:null};if("header"===r){let t=null,r=null,o=null;const i=n=>{const s=c.component;return t&&r&&e.isRegistered(t)&&o===s?(r.$set(n),t):(t&&e.isRegistered(t)&&e.disposeHost(t),t=document.createElement("div"),r=l(s,t,n),o=s,e.register(t,()=>{null==r||r.$destroy(),r=null,o=null,t=null}),t)};return c.wrapped=i,s.set(n,c),i}const u=n=>{const r=document.createElement("div"),o=t.mount(c.component,{target:r,props:n});return e.register(r,()=>{t.unmount(o)}),r};return c.wrapped=u,s.set(n,c),u}function a(e,t){const n=new Map;return r=>{const o=String(r.accessor),s=n.get(o);if(s&&e.isRegistered(s.host))return s.instance.$set(r),s.host;const i=document.createElement("div"),c=l(t,i,r);return e.register(i,()=>{c.$destroy(),n.delete(o)}),n.set(o,{host:i,instance:c}),i}}function d(e,n={}){const r=document.createElement("div"),o=t.mount(e,{target:r,props:n}),s=r.innerHTML;return t.unmount(o),s}function p(e){return"function"==typeof e}function g(e,t){const{cellRenderer:n,headerRenderer:r,children:o,nestedTable:s}=e,l=i(e,["cellRenderer","headerRenderer","children","nestedTable"]),c=String(e.accessor),a=Object.assign({},l);if(n&&(a.cellRenderer="function"==typeof n&&n.length>=2?u(t,c,"cell",n):n),r&&(a.headerRenderer="function"==typeof r&&r.length>=2?u(t,c,"header",r):r),o&&(a.children=o.map(e=>g(e,t))),s){const e=Object.assign(Object.assign({},s),{rows:[]});a.nestedTable=m(e,t)}return a}function f(e){const t=e.columns;if(!t)throw new Error("SimpleTable requires `columns`");return t}function m(e,r){const{rows:o,footerRenderer:s,emptyStateRenderer:l,errorStateRenderer:u,loadingStateRenderer:m,headerDropdown:h,columnEditorConfig:b,icons:R,tableEmptyStateRenderer:v,rowButtons:y,onColumnOrderChange:O,onColumnWidthChange:w,onHeaderEdit:C,onColumnSelect:E,enableColumnEditor:_,enableColumnEditorInitOpen:S,enablePagination:P,onTableReady:j,hoverRowBackground:T,oddColumnBackground:A,oddEvenRowBackground:I}=e,B=i(e,["columns","rows","footerRenderer","emptyStateRenderer","errorStateRenderer","loadingStateRenderer","headerDropdown","columnEditorConfig","icons","tableEmptyStateRenderer","rowButtons","onColumnOrderChange","onColumnWidthChange","onHeaderEdit","onColumnSelect","enableColumnEditor","enableColumnEditorInitOpen","enablePagination","onTableReady","hoverRowBackground","oddColumnBackground","oddEvenRowBackground"]),x=f(e);r.pruneRendererCaches(n.collectHeaderAccessors(x));const L=Object.assign(Object.assign({},B),{rows:n.asRows(o),columns:x.map(e=>g(e,r)),enableColumnEditor:_,enableColumnEditorInitOpen:S,enablePagination:P,onTableReady:j,hoverRowBackground:T,oddColumnBackground:A,oddEvenRowBackground:I,onRendererHostDiscard:r.disposeHost});return O&&(L.onColumnOrderChange=e=>O(e)),w&&(L.onColumnWidthChange=e=>w(e)),C&&(L.onHeaderEdit=(e,t)=>C(e,t)),E&&(L.onColumnSelect=e=>E(e)),void 0!==v&&(null===v?L.tableEmptyStateRenderer=null:"string"==typeof v||v instanceof HTMLElement?L.tableEmptyStateRenderer=v:p(v)&&(L.tableEmptyStateRenderer=function(e,n){const r=document.createElement("div"),o=t.mount(n,{target:r,props:{}});return e.register(r,()=>{t.unmount(o)}),r}(r,v))),void 0!==s&&(L.footerRenderer="function"==typeof s&&s.length>=2?c(r,s):s),void 0!==l&&(L.emptyStateRenderer="function"==typeof l&&l.length>=2?c(r,l):l),void 0!==u&&(L.errorStateRenderer="function"==typeof u&&u.length>=2?c(r,u):u),void 0!==m&&(L.loadingStateRenderer="function"==typeof m&&m.length>=2?c(r,m):m),void 0!==h&&(L.headerDropdown=c(r,h)),void 0!==b&&(L.columnEditorConfig=function(e,t){const{rowRenderer:n,customRenderer:r}=e,o=i(e,["rowRenderer","customRenderer"]);return Object.assign(Object.assign(Object.assign({},o),n?{rowRenderer:a(t,n)}:{}),r?{customRenderer:c(t,r)}:{})}(b,r)),void 0!==R&&(L.icons=function(e){const t={};for(const[n,r]of Object.entries(e))null!=r&&("string"==typeof r||r instanceof HTMLElement||r instanceof SVGElement?t[n]=r:p(r)&&(t[n]=d(r,{})));return t}(R)),void 0!==y&&(L.rowButtons=y.map(e=>c(r,e))),L}"function"==typeof SuppressedError&&SuppressedError;const h="data-st-mount-id";class b{constructor(){this.entries=new Map,this.nextId=0,this.cellRendererCache=new Map,this.headerRendererCache=new Map,this.disposeHost=e=>{if("function"!=typeof e.getAttribute)return;const t=[],n=e.getAttribute(h);null!==n&&t.push(n),e.querySelectorAll(`[${h}]`).forEach(e=>{const n=e.getAttribute(h);null!==n&&t.push(n)});for(const e of t){const t=this.entries.get(e);t&&(this.entries.delete(e),t())}}}register(e,t){const n="st-mount-"+this.nextId++;e.setAttribute(h,n),this.entries.set(n,t)}isRegistered(e){const t=e.getAttribute(h);return null!==t&&this.entries.has(t)}clear(){this.cellRendererCache.clear(),this.headerRendererCache.clear();for(const e of this.entries.values())e();this.entries.clear()}pruneRendererCaches(e){for(const t of this.cellRendererCache.keys())e.has(t)||this.cellRendererCache.delete(t);for(const t of this.headerRendererCache.keys())e.has(t)||this.headerRendererCache.delete(t)}get size(){return this.entries.size}}var R=s.from_html("<div></div>");function v(e,r){const o=s.legacy_rest_props(r,["children","$$slots","$$events","$$legacy"]),i=s.legacy_rest_props(o,["getAPI","rows","columns"]);s.push(r,!1);let l=s.prop(r,"rows",8),c=s.prop(r,"columns",8,void 0),u=s.mutable_source(),a=s.mutable_source(null);const d=new b;let p=s.mutable_source(void 0),g=s.mutable_source(void 0),h=s.mutable_source(!1),v=!1;function y(e){var t,n;s.get(a)&&(e?null===(t=s.get(a).refitAutoSizeColumns)||void 0===t||t.call(s.get(a)):!v&&d.size>0&&(v=!0,null===(n=s.get(a).refitAutoSizeColumns)||void 0===n||n.call(s.get(a))))}function O(){var e;return null!==(e=null===s.get(a)||void 0===s.get(a)?void 0:s.get(a).getAPI())&&void 0!==e?e:null}t.onMount(()=>{const e=Object.assign({rows:l(),columns:c()},i);s.set(a,new n.SimpleTableVanilla(s.get(u),m(e,d))),s.get(a).mount(),s.set(p,f(e)),s.set(g,l()),s.set(h,Boolean(e.isLoading)),y(!1)}),t.onDestroy(()=>{null===s.get(a)||void 0===s.get(a)||s.get(a).destroy(),s.set(a,null),s.set(p,void 0),s.set(g,void 0),d.clear()}),s.legacy_pre_effect(()=>(s.get(a),s.deep_read_state(l()),s.deep_read_state(c()),s.deep_read_state(i),s.get(p),s.get(g),s.get(h)),()=>{if(s.get(a)){const e=Object.assign({rows:l(),columns:c()},i),t=m(e,d),r=Object.assign({},t),o=f(e),u=n.headersStructurallyEqual(s.get(p),o);s.set(p,o),u&&delete r.columns;const b=n.rowsShallowUnchanged(s.get(g),l(),e.getRowId);s.set(g,l()),b&&delete r.rows;const R=Boolean(e.isLoading),v=s.get(h)&&!R;s.set(h,R),s.get(a).update(r),y(v)}}),s.legacy_pre_effect_reset();var w={getAPI:O};s.init();var C=R();return s.bind_this(C,e=>s.set(u,e),()=>s.get(u)),s.append(e,C),s.bind_prop(r,"getAPI",O),s.pop(w)}Object.defineProperty(exports,"PIVOT_ACCESSOR_PREFIX",{enumerable:!0,get:function(){return n.PIVOT_ACCESSOR_PREFIX}}),Object.defineProperty(exports,"PIVOT_BLANK_LABEL",{enumerable:!0,get:function(){return n.PIVOT_BLANK_LABEL}}),Object.defineProperty(exports,"PIVOT_CHILDREN_KEY",{enumerable:!0,get:function(){return n.PIVOT_CHILDREN_KEY}}),Object.defineProperty(exports,"PIVOT_IS_TOTAL_KEY",{enumerable:!0,get:function(){return n.PIVOT_IS_TOTAL_KEY}}),Object.defineProperty(exports,"asRows",{enumerable:!0,get:function(){return n.asRows}}),Object.defineProperty(exports,"buildPivotAccessor",{enumerable:!0,get:function(){return n.buildPivotAccessor}}),Object.defineProperty(exports,"buildPivotRowTotalAccessor",{enumerable:!0,get:function(){return n.buildPivotRowTotalAccessor}}),Object.defineProperty(exports,"pivotRows",{enumerable:!0,get:function(){return n.pivotRows}}),exports.SimpleTable=v,exports.mountSimpleTable=function(e){return t.mount(v,e)};
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/SimpleTable.svelte"],"sourcesContent":["<script lang=\"ts\" generics=\"TData extends Record<string, any> = Record<string, any>\">\n import { onMount, onDestroy } from \"svelte\";\n import {\n SimpleTableVanilla,\n headersStructurallyEqual,\n rowsShallowUnchanged,\n } from \"simple-table-core\";\n import type { SimpleTableConfig, TableAPI } from \"simple-table-core\";\n import { buildVanillaConfig, resolveSvelteColumns } from \"./buildVanillaConfig\";\n import { MountRegistry } from \"./MountRegistry\";\n import type { SimpleTableSvelteProps, TableInstance } from \"./types\";\n\n // SimpleTable — Svelte adapter for simple-table-core.\n // Accepts the same props as SimpleTableProps with Svelte component types for renderers.\n // Prefer typed `rows` / `columns` (`SvelteColumnDef<MyRow>`) so TData flows into\n // callbacks. Use bind:this={tableRef} for TableAPI: tableRef.getAPI()?.sort(...)\n\n type $$Props = SimpleTableSvelteProps<TData>;\n\n export let rows: $$Props[\"rows\"];\n export let columns: $$Props[\"columns\"] = undefined;\n\n // All remaining optional props — spread via $$restProps\n let container: HTMLDivElement;\n let instance: TableInstance | null = null;\n const registry = new MountRegistry();\n\n /** Last headers/rows whose structure/content was applied via update. */\n let syncedColumns: ReadonlyArray<\n NonNullable<$$Props[\"columns\"]>[number]\n > | undefined = undefined;\n let syncedRows: $$Props[\"rows\"] | undefined = undefined;\n\n onMount(() => {\n const props = { rows, columns, ...$$restProps } as SimpleTableSvelteProps<TData>;\n instance = new SimpleTableVanilla(\n container,\n buildVanillaConfig(props, registry),\n ) as unknown as TableInstance;\n instance.mount();\n syncedColumns = resolveSvelteColumns(props);\n syncedRows = rows;\n });\n\n onDestroy(() => {\n instance?.destroy();\n instance = null;\n syncedColumns = undefined;\n syncedRows = undefined;\n registry.clear();\n });\n\n // Reactive update: skip no-op columns/rows when structure/content is unchanged.\n $: if (instance) {\n const props = { rows, columns, ...$$restProps } as SimpleTableSvelteProps<TData>;\n const fullConfig = buildVanillaConfig(props, registry);\n const patch: Partial<SimpleTableConfig> = { ...fullConfig };\n const resolvedColumns = resolveSvelteColumns(props);\n\n const headersUnchanged = headersStructurallyEqual(syncedColumns, resolvedColumns);\n syncedColumns = resolvedColumns;\n if (headersUnchanged) {\n delete patch.columns;\n }\n\n const rowsUnchanged = rowsShallowUnchanged(\n syncedRows as ReadonlyArray<object> | undefined,\n rows as ReadonlyArray<object>,\n props.getRowId as Parameters<typeof rowsShallowUnchanged>[2],\n );\n syncedRows = rows;\n if (rowsUnchanged) {\n delete patch.rows;\n }\n\n instance.update(patch);\n }\n\n /** Expose the TableAPI for consumers using bind:this. */\n export function getAPI(): TableAPI<TData> | null {\n return (instance?.getAPI() as TableAPI<TData> | undefined) ?? null;\n }\n</script>\n\n<div bind:this={container}></div>\n"],"names":["div","root","$$value","$","set","container","get"],"mappings":"i6OAoFCA,EAAGC,uBAAHD,EAAGE,GAAAC,EAAAC,IAAYC,EAASH,GAAA,IAAAC,EAAAG,IAATD,eAAfL,qCAFO"}
1
+ {"version":3,"file":"index.js","sources":["../../src/SimpleTable.svelte"],"sourcesContent":["<script lang=\"ts\" generics=\"TData extends Record<string, any> = Record<string, any>\">\n import { onMount, onDestroy } from \"svelte\";\n import {\n SimpleTableVanilla,\n headersStructurallyEqual,\n rowsShallowUnchanged,\n } from \"simple-table-core\";\n import type { SimpleTableConfig, TableAPI } from \"simple-table-core\";\n import { buildVanillaConfig, resolveSvelteColumns } from \"./buildVanillaConfig\";\n import { MountRegistry } from \"./MountRegistry\";\n import type { SimpleTableSvelteProps, TableInstance } from \"./types\";\n\n // SimpleTable — Svelte adapter for simple-table-core.\n // Accepts the same props as SimpleTableProps with Svelte component types for renderers.\n // Prefer typed `rows` / `columns` (`SvelteColumnDef<MyRow>`) so TData flows into\n // callbacks. Use bind:this={tableRef} for TableAPI: tableRef.getAPI()?.sort(...)\n\n type $$Props = SimpleTableSvelteProps<TData>;\n\n export let rows: $$Props[\"rows\"];\n export let columns: $$Props[\"columns\"] = undefined;\n\n // All remaining optional props — spread via $$restProps\n let container: HTMLDivElement;\n let instance: TableInstance | null = null;\n const registry = new MountRegistry();\n\n /** Last headers/rows whose structure/content was applied via update. */\n let syncedColumns: ReadonlyArray<\n NonNullable<$$Props[\"columns\"]>[number]\n > | undefined = undefined;\n let syncedRows: $$Props[\"rows\"] | undefined = undefined;\n let wasLoading = false;\n let didInitialAutoSize = false;\n\n function maybeRefitAutoSizeColumns(leftLoading: boolean) {\n if (!instance) return;\n if (leftLoading) {\n instance.refitAutoSizeColumns?.();\n return;\n }\n // Svelte mounts are synchronous for template DOM, so custom renderer hosts\n // are already present after the first paint that registered mounts (mirrors\n // Vue/React first-portals refit).\n if (!didInitialAutoSize && registry.size > 0) {\n didInitialAutoSize = true;\n instance.refitAutoSizeColumns?.();\n }\n }\n\n onMount(() => {\n const props = { rows, columns, ...$$restProps } as SimpleTableSvelteProps<TData>;\n instance = new SimpleTableVanilla(\n container,\n buildVanillaConfig(props, registry),\n ) as unknown as TableInstance;\n instance.mount();\n syncedColumns = resolveSvelteColumns(props);\n syncedRows = rows;\n wasLoading = Boolean(props.isLoading);\n maybeRefitAutoSizeColumns(false);\n });\n\n onDestroy(() => {\n instance?.destroy();\n instance = null;\n syncedColumns = undefined;\n syncedRows = undefined;\n registry.clear();\n });\n\n // Reactive update: skip no-op columns/rows when structure/content is unchanged.\n $: if (instance) {\n const props = { rows, columns, ...$$restProps } as SimpleTableSvelteProps<TData>;\n const fullConfig = buildVanillaConfig(props, registry);\n const patch: Partial<SimpleTableConfig> = { ...fullConfig };\n const resolvedColumns = resolveSvelteColumns(props);\n\n const headersUnchanged = headersStructurallyEqual(syncedColumns, resolvedColumns);\n syncedColumns = resolvedColumns;\n if (headersUnchanged) {\n delete patch.columns;\n }\n\n const rowsUnchanged = rowsShallowUnchanged(\n syncedRows as ReadonlyArray<object> | undefined,\n rows as ReadonlyArray<object>,\n props.getRowId as Parameters<typeof rowsShallowUnchanged>[2],\n );\n syncedRows = rows;\n if (rowsUnchanged) {\n delete patch.rows;\n }\n\n const isLoading = Boolean(props.isLoading);\n const leftLoading = wasLoading && !isLoading;\n wasLoading = isLoading;\n\n instance.update(patch);\n maybeRefitAutoSizeColumns(leftLoading);\n }\n\n /** Expose the TableAPI for consumers using bind:this. */\n export function getAPI(): TableAPI<TData> | null {\n return (instance?.getAPI() as TableAPI<TData> | undefined) ?? null;\n }\n</script>\n\n<div bind:this={container}></div>\n"],"names":["div","root","$$value","$","set","container","get"],"mappings":"soPA4GCA,EAAGC,uBAAHD,EAAGE,GAAAC,EAAAC,IAAYC,EAASH,GAAA,IAAAC,EAAAG,IAATD,eAAfL,qCAFO"}
package/dist/index.es.js CHANGED
@@ -1,2 +1,2 @@
1
- import"svelte/internal/disclose-version";import"svelte/internal/flags/legacy";import*as e from"svelte/internal/client";import{mount as t,unmount as n,onMount as r,onDestroy as o}from"svelte";import{collectHeaderAccessors as s,asRows as i,SimpleTableVanilla as l,headersStructurallyEqual as d,rowsShallowUnchanged as a}from"simple-table-core";export{PIVOT_ACCESSOR_PREFIX,PIVOT_BLANK_LABEL,PIVOT_CHILDREN_KEY,PIVOT_IS_TOTAL_KEY,asRows,buildPivotAccessor,buildPivotRowTotalAccessor,pivotRows}from"simple-table-core";function c(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}function u(e,r){return o=>{const s=document.createElement("div"),i=t(r,{target:s,props:o});return e.register(s,()=>{n(i)}),s}}function p(e,r,o,s){const i="cell"===o?e.cellRendererCache:e.headerRendererCache,l=i.get(r);if(l)return l.component=s,l.wrapped;const d={component:s,wrapped:null},a=r=>{const o=document.createElement("div"),s=t(d.component,{target:o,props:r});return e.register(o,()=>{n(s)}),o};return d.wrapped=a,i.set(r,d),a}function g(e,r={}){const o=document.createElement("div"),s=t(e,{target:o,props:r}),i=o.innerHTML;return n(s),i}function m(e){return"function"==typeof e}function f(e,t){const{cellRenderer:n,headerRenderer:r,children:o,nestedTable:s}=e,i=c(e,["cellRenderer","headerRenderer","children","nestedTable"]),l=String(e.accessor),d=Object.assign({},i);if(n&&(d.cellRenderer="function"==typeof n&&n.length>=2?p(t,l,"cell",n):n),r&&(d.headerRenderer="function"==typeof r&&r.length>=2?p(t,l,"header",r):r),o&&(d.children=o.map(e=>f(e,t))),s){const e=Object.assign(Object.assign({},s),{rows:[]});d.nestedTable=R(e,t)}return d}function h(e){const t=e.columns;if(!t)throw new Error("SimpleTable requires `columns`");return t}function R(e,r){const{rows:o,footerRenderer:l,emptyStateRenderer:d,errorStateRenderer:a,loadingStateRenderer:p,headerDropdown:R,columnEditorConfig:b,icons:v,tableEmptyStateRenderer:C,rowButtons:w,onColumnOrderChange:y,onColumnWidthChange:E,onHeaderEdit:O,onColumnSelect:_,enableColumnEditor:S,enableColumnEditorInitOpen:I,enablePagination:P,onTableReady:T,hoverRowBackground:j,oddColumnBackground:A,oddEvenRowBackground:B}=e,k=c(e,["columns","rows","footerRenderer","emptyStateRenderer","errorStateRenderer","loadingStateRenderer","headerDropdown","columnEditorConfig","icons","tableEmptyStateRenderer","rowButtons","onColumnOrderChange","onColumnWidthChange","onHeaderEdit","onColumnSelect","enableColumnEditor","enableColumnEditorInitOpen","enablePagination","onTableReady","hoverRowBackground","oddColumnBackground","oddEvenRowBackground"]),H=h(e);r.pruneRendererCaches(s(H));const L=Object.assign(Object.assign({},k),{rows:i(o),columns:H.map(e=>f(e,r)),enableColumnEditor:S,enableColumnEditorInitOpen:I,enablePagination:P,onTableReady:T,hoverRowBackground:j,oddColumnBackground:A,oddEvenRowBackground:B,onRendererHostDiscard:r.disposeHost});return y&&(L.onColumnOrderChange=e=>y(e)),E&&(L.onColumnWidthChange=e=>E(e)),O&&(L.onHeaderEdit=(e,t)=>O(e,t)),_&&(L.onColumnSelect=e=>_(e)),void 0!==C&&(null===C?L.tableEmptyStateRenderer=null:"string"==typeof C||C instanceof HTMLElement?L.tableEmptyStateRenderer=C:m(C)&&(L.tableEmptyStateRenderer=function(e,r){const o=document.createElement("div"),s=t(r,{target:o,props:{}});return e.register(o,()=>{n(s)}),o}(r,C))),void 0!==l&&(L.footerRenderer="function"==typeof l&&l.length>=2?u(r,l):l),void 0!==d&&(L.emptyStateRenderer="function"==typeof d&&d.length>=2?u(r,d):d),void 0!==a&&(L.errorStateRenderer="function"==typeof a&&a.length>=2?u(r,a):a),void 0!==p&&(L.loadingStateRenderer="function"==typeof p&&p.length>=2?u(r,p):p),void 0!==R&&(L.headerDropdown=u(r,R)),void 0!==b&&(L.columnEditorConfig=function(e,t){const{rowRenderer:n,customRenderer:r}=e,o=c(e,["rowRenderer","customRenderer"]);return Object.assign(Object.assign(Object.assign({},o),n?{rowRenderer:u(t,n)}:{}),r?{customRenderer:u(t,r)}:{})}(b,r)),void 0!==v&&(L.icons=function(e){const t={};for(const[n,r]of Object.entries(e))null!=r&&("string"==typeof r||r instanceof HTMLElement||r instanceof SVGElement?t[n]=r:m(r)&&(t[n]=g(r,{})));return t}(v)),void 0!==w&&(L.rowButtons=w.map(e=>u(r,e))),L}"function"==typeof SuppressedError&&SuppressedError;const b="data-st-mount-id";class v{constructor(){this.entries=new Map,this.nextId=0,this.cellRendererCache=new Map,this.headerRendererCache=new Map,this.disposeHost=e=>{if("function"!=typeof e.getAttribute)return;const t=[],n=e.getAttribute(b);null!==n&&t.push(n),e.querySelectorAll(`[${b}]`).forEach(e=>{const n=e.getAttribute(b);null!==n&&t.push(n)});for(const e of t){const t=this.entries.get(e);t&&(this.entries.delete(e),t())}}}register(e,t){const n="st-mount-"+this.nextId++;e.setAttribute(b,n),this.entries.set(n,t)}clear(){this.cellRendererCache.clear(),this.headerRendererCache.clear();for(const e of this.entries.values())e();this.entries.clear()}pruneRendererCaches(e){for(const t of this.cellRendererCache.keys())e.has(t)||this.cellRendererCache.delete(t);for(const t of this.headerRendererCache.keys())e.has(t)||this.headerRendererCache.delete(t)}get size(){return this.entries.size}}var C=e.from_html("<div></div>");function w(t,n){const s=e.legacy_rest_props(n,["children","$$slots","$$events","$$legacy"]),i=e.legacy_rest_props(s,["getAPI","rows","columns"]);e.push(n,!1);let c=e.prop(n,"rows",8),u=e.prop(n,"columns",8,void 0),p=e.mutable_source(),g=e.mutable_source(null);const m=new v;let f=e.mutable_source(void 0),b=e.mutable_source(void 0);function w(){var t;return null!==(t=null===e.get(g)||void 0===e.get(g)?void 0:e.get(g).getAPI())&&void 0!==t?t:null}r(()=>{const t=Object.assign({rows:c(),columns:u()},i);e.set(g,new l(e.get(p),R(t,m))),e.get(g).mount(),e.set(f,h(t)),e.set(b,c())}),o(()=>{null===e.get(g)||void 0===e.get(g)||e.get(g).destroy(),e.set(g,null),e.set(f,void 0),e.set(b,void 0),m.clear()}),e.legacy_pre_effect(()=>(e.get(g),e.deep_read_state(c()),e.deep_read_state(u()),e.deep_read_state(i),e.get(f),e.get(b)),()=>{if(e.get(g)){const t=Object.assign({rows:c(),columns:u()},i),n=R(t,m),r=Object.assign({},n),o=h(t),s=d(e.get(f),o);e.set(f,o),s&&delete r.columns;const l=a(e.get(b),c(),t.getRowId);e.set(b,c()),l&&delete r.rows,e.get(g).update(r)}}),e.legacy_pre_effect_reset();var y={getAPI:w};e.init();var E=C();return e.bind_this(E,t=>e.set(p,t),()=>e.get(p)),e.append(t,E),e.bind_prop(n,"getAPI",w),e.pop(y)}export{w as SimpleTable};
1
+ import"svelte/internal/disclose-version";import"svelte/internal/flags/legacy";import*as e from"svelte/internal/client";import{mount as t,unmount as n,onMount as r,onDestroy as o}from"svelte";import{collectHeaderAccessors as s,asRows as i,SimpleTableVanilla as l,headersStructurallyEqual as c,rowsShallowUnchanged as d}from"simple-table-core";export{PIVOT_ACCESSOR_PREFIX,PIVOT_BLANK_LABEL,PIVOT_CHILDREN_KEY,PIVOT_IS_TOTAL_KEY,asRows,buildPivotAccessor,buildPivotRowTotalAccessor,pivotRows}from"simple-table-core";import{createClassComponent as a}from"svelte/legacy";function u(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}function g(e,t,n){return a({component:e,target:t,props:n,intro:!1})}function p(e,r){return o=>{const s=document.createElement("div"),i=t(r,{target:s,props:o});return e.register(s,()=>{n(i)}),s}}function m(e,r,o,s){const i="cell"===o?e.cellRendererCache:e.headerRendererCache,l=i.get(r);if(l)return l.component=s,l.wrapped;const c={component:s,wrapped:null};if("header"===o){let t=null,n=null,o=null;const s=r=>{const s=c.component;return t&&n&&e.isRegistered(t)&&o===s?(n.$set(r),t):(t&&e.isRegistered(t)&&e.disposeHost(t),t=document.createElement("div"),n=g(s,t,r),o=s,e.register(t,()=>{null==n||n.$destroy(),n=null,o=null,t=null}),t)};return c.wrapped=s,i.set(r,c),s}const d=r=>{const o=document.createElement("div"),s=t(c.component,{target:o,props:r});return e.register(o,()=>{n(s)}),o};return c.wrapped=d,i.set(r,c),d}function f(e,t){const n=new Map;return r=>{const o=String(r.accessor),s=n.get(o);if(s&&e.isRegistered(s.host))return s.instance.$set(r),s.host;const i=document.createElement("div"),l=g(t,i,r);return e.register(i,()=>{l.$destroy(),n.delete(o)}),n.set(o,{host:i,instance:l}),i}}function h(e,r={}){const o=document.createElement("div"),s=t(e,{target:o,props:r}),i=o.innerHTML;return n(s),i}function R(e){return"function"==typeof e}function b(e,t){const{cellRenderer:n,headerRenderer:r,children:o,nestedTable:s}=e,i=u(e,["cellRenderer","headerRenderer","children","nestedTable"]),l=String(e.accessor),c=Object.assign({},i);if(n&&(c.cellRenderer="function"==typeof n&&n.length>=2?m(t,l,"cell",n):n),r&&(c.headerRenderer="function"==typeof r&&r.length>=2?m(t,l,"header",r):r),o&&(c.children=o.map(e=>b(e,t))),s){const e=Object.assign(Object.assign({},s),{rows:[]});c.nestedTable=y(e,t)}return c}function v(e){const t=e.columns;if(!t)throw new Error("SimpleTable requires `columns`");return t}function y(e,r){const{rows:o,footerRenderer:l,emptyStateRenderer:c,errorStateRenderer:d,loadingStateRenderer:a,headerDropdown:g,columnEditorConfig:m,icons:y,tableEmptyStateRenderer:C,rowButtons:w,onColumnOrderChange:E,onColumnWidthChange:O,onHeaderEdit:_,onColumnSelect:S,enableColumnEditor:A,enableColumnEditorInitOpen:I,enablePagination:P,onTableReady:T,hoverRowBackground:j,oddColumnBackground:B,oddEvenRowBackground:k}=e,H=u(e,["columns","rows","footerRenderer","emptyStateRenderer","errorStateRenderer","loadingStateRenderer","headerDropdown","columnEditorConfig","icons","tableEmptyStateRenderer","rowButtons","onColumnOrderChange","onColumnWidthChange","onHeaderEdit","onColumnSelect","enableColumnEditor","enableColumnEditorInitOpen","enablePagination","onTableReady","hoverRowBackground","oddColumnBackground","oddEvenRowBackground"]),$=v(e);r.pruneRendererCaches(s($));const L=Object.assign(Object.assign({},H),{rows:i(o),columns:$.map(e=>b(e,r)),enableColumnEditor:A,enableColumnEditorInitOpen:I,enablePagination:P,onTableReady:T,hoverRowBackground:j,oddColumnBackground:B,oddEvenRowBackground:k,onRendererHostDiscard:r.disposeHost});return E&&(L.onColumnOrderChange=e=>E(e)),O&&(L.onColumnWidthChange=e=>O(e)),_&&(L.onHeaderEdit=(e,t)=>_(e,t)),S&&(L.onColumnSelect=e=>S(e)),void 0!==C&&(null===C?L.tableEmptyStateRenderer=null:"string"==typeof C||C instanceof HTMLElement?L.tableEmptyStateRenderer=C:R(C)&&(L.tableEmptyStateRenderer=function(e,r){const o=document.createElement("div"),s=t(r,{target:o,props:{}});return e.register(o,()=>{n(s)}),o}(r,C))),void 0!==l&&(L.footerRenderer="function"==typeof l&&l.length>=2?p(r,l):l),void 0!==c&&(L.emptyStateRenderer="function"==typeof c&&c.length>=2?p(r,c):c),void 0!==d&&(L.errorStateRenderer="function"==typeof d&&d.length>=2?p(r,d):d),void 0!==a&&(L.loadingStateRenderer="function"==typeof a&&a.length>=2?p(r,a):a),void 0!==g&&(L.headerDropdown=p(r,g)),void 0!==m&&(L.columnEditorConfig=function(e,t){const{rowRenderer:n,customRenderer:r}=e,o=u(e,["rowRenderer","customRenderer"]);return Object.assign(Object.assign(Object.assign({},o),n?{rowRenderer:f(t,n)}:{}),r?{customRenderer:p(t,r)}:{})}(m,r)),void 0!==y&&(L.icons=function(e){const t={};for(const[n,r]of Object.entries(e))null!=r&&("string"==typeof r||r instanceof HTMLElement||r instanceof SVGElement?t[n]=r:R(r)&&(t[n]=h(r,{})));return t}(y)),void 0!==w&&(L.rowButtons=w.map(e=>p(r,e))),L}"function"==typeof SuppressedError&&SuppressedError;const C="data-st-mount-id";class w{constructor(){this.entries=new Map,this.nextId=0,this.cellRendererCache=new Map,this.headerRendererCache=new Map,this.disposeHost=e=>{if("function"!=typeof e.getAttribute)return;const t=[],n=e.getAttribute(C);null!==n&&t.push(n),e.querySelectorAll(`[${C}]`).forEach(e=>{const n=e.getAttribute(C);null!==n&&t.push(n)});for(const e of t){const t=this.entries.get(e);t&&(this.entries.delete(e),t())}}}register(e,t){const n="st-mount-"+this.nextId++;e.setAttribute(C,n),this.entries.set(n,t)}isRegistered(e){const t=e.getAttribute(C);return null!==t&&this.entries.has(t)}clear(){this.cellRendererCache.clear(),this.headerRendererCache.clear();for(const e of this.entries.values())e();this.entries.clear()}pruneRendererCaches(e){for(const t of this.cellRendererCache.keys())e.has(t)||this.cellRendererCache.delete(t);for(const t of this.headerRendererCache.keys())e.has(t)||this.headerRendererCache.delete(t)}get size(){return this.entries.size}}var E=e.from_html("<div></div>");function O(t,n){const s=e.legacy_rest_props(n,["children","$$slots","$$events","$$legacy"]),i=e.legacy_rest_props(s,["getAPI","rows","columns"]);e.push(n,!1);let a=e.prop(n,"rows",8),u=e.prop(n,"columns",8,void 0),g=e.mutable_source(),p=e.mutable_source(null);const m=new w;let f=e.mutable_source(void 0),h=e.mutable_source(void 0),R=e.mutable_source(!1),b=!1;function C(t){var n,r;e.get(p)&&(t?null===(n=e.get(p).refitAutoSizeColumns)||void 0===n||n.call(e.get(p)):!b&&m.size>0&&(b=!0,null===(r=e.get(p).refitAutoSizeColumns)||void 0===r||r.call(e.get(p))))}function O(){var t;return null!==(t=null===e.get(p)||void 0===e.get(p)?void 0:e.get(p).getAPI())&&void 0!==t?t:null}r(()=>{const t=Object.assign({rows:a(),columns:u()},i);e.set(p,new l(e.get(g),y(t,m))),e.get(p).mount(),e.set(f,v(t)),e.set(h,a()),e.set(R,Boolean(t.isLoading)),C(!1)}),o(()=>{null===e.get(p)||void 0===e.get(p)||e.get(p).destroy(),e.set(p,null),e.set(f,void 0),e.set(h,void 0),m.clear()}),e.legacy_pre_effect(()=>(e.get(p),e.deep_read_state(a()),e.deep_read_state(u()),e.deep_read_state(i),e.get(f),e.get(h),e.get(R)),()=>{if(e.get(p)){const t=Object.assign({rows:a(),columns:u()},i),n=y(t,m),r=Object.assign({},n),o=v(t),s=c(e.get(f),o);e.set(f,o),s&&delete r.columns;const l=d(e.get(h),a(),t.getRowId);e.set(h,a()),l&&delete r.rows;const g=Boolean(t.isLoading),b=e.get(R)&&!g;e.set(R,g),e.get(p).update(r),C(b)}}),e.legacy_pre_effect_reset();var _={getAPI:O};e.init();var S=E();return e.bind_this(S,t=>e.set(g,t),()=>e.get(g)),e.append(t,S),e.bind_prop(n,"getAPI",O),e.pop(_)}function _(e){return t(O,e)}export{O as SimpleTable,_ as mountSimpleTable};
2
2
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/SimpleTable.svelte"],"sourcesContent":["<script lang=\"ts\" generics=\"TData extends Record<string, any> = Record<string, any>\">\n import { onMount, onDestroy } from \"svelte\";\n import {\n SimpleTableVanilla,\n headersStructurallyEqual,\n rowsShallowUnchanged,\n } from \"simple-table-core\";\n import type { SimpleTableConfig, TableAPI } from \"simple-table-core\";\n import { buildVanillaConfig, resolveSvelteColumns } from \"./buildVanillaConfig\";\n import { MountRegistry } from \"./MountRegistry\";\n import type { SimpleTableSvelteProps, TableInstance } from \"./types\";\n\n // SimpleTable — Svelte adapter for simple-table-core.\n // Accepts the same props as SimpleTableProps with Svelte component types for renderers.\n // Prefer typed `rows` / `columns` (`SvelteColumnDef<MyRow>`) so TData flows into\n // callbacks. Use bind:this={tableRef} for TableAPI: tableRef.getAPI()?.sort(...)\n\n type $$Props = SimpleTableSvelteProps<TData>;\n\n export let rows: $$Props[\"rows\"];\n export let columns: $$Props[\"columns\"] = undefined;\n\n // All remaining optional props — spread via $$restProps\n let container: HTMLDivElement;\n let instance: TableInstance | null = null;\n const registry = new MountRegistry();\n\n /** Last headers/rows whose structure/content was applied via update. */\n let syncedColumns: ReadonlyArray<\n NonNullable<$$Props[\"columns\"]>[number]\n > | undefined = undefined;\n let syncedRows: $$Props[\"rows\"] | undefined = undefined;\n\n onMount(() => {\n const props = { rows, columns, ...$$restProps } as SimpleTableSvelteProps<TData>;\n instance = new SimpleTableVanilla(\n container,\n buildVanillaConfig(props, registry),\n ) as unknown as TableInstance;\n instance.mount();\n syncedColumns = resolveSvelteColumns(props);\n syncedRows = rows;\n });\n\n onDestroy(() => {\n instance?.destroy();\n instance = null;\n syncedColumns = undefined;\n syncedRows = undefined;\n registry.clear();\n });\n\n // Reactive update: skip no-op columns/rows when structure/content is unchanged.\n $: if (instance) {\n const props = { rows, columns, ...$$restProps } as SimpleTableSvelteProps<TData>;\n const fullConfig = buildVanillaConfig(props, registry);\n const patch: Partial<SimpleTableConfig> = { ...fullConfig };\n const resolvedColumns = resolveSvelteColumns(props);\n\n const headersUnchanged = headersStructurallyEqual(syncedColumns, resolvedColumns);\n syncedColumns = resolvedColumns;\n if (headersUnchanged) {\n delete patch.columns;\n }\n\n const rowsUnchanged = rowsShallowUnchanged(\n syncedRows as ReadonlyArray<object> | undefined,\n rows as ReadonlyArray<object>,\n props.getRowId as Parameters<typeof rowsShallowUnchanged>[2],\n );\n syncedRows = rows;\n if (rowsUnchanged) {\n delete patch.rows;\n }\n\n instance.update(patch);\n }\n\n /** Expose the TableAPI for consumers using bind:this. */\n export function getAPI(): TableAPI<TData> | null {\n return (instance?.getAPI() as TableAPI<TData> | undefined) ?? null;\n }\n</script>\n\n<div bind:this={container}></div>\n"],"names":["div","root","$$value","$","set","container","get"],"mappings":"m2MAoFCA,EAAGC,uBAAHD,EAAGE,GAAAC,EAAAC,IAAYC,EAASH,GAAA,IAAAC,EAAAG,IAATD,eAAfL,qCAFO"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/SimpleTable.svelte"],"sourcesContent":["<script lang=\"ts\" generics=\"TData extends Record<string, any> = Record<string, any>\">\n import { onMount, onDestroy } from \"svelte\";\n import {\n SimpleTableVanilla,\n headersStructurallyEqual,\n rowsShallowUnchanged,\n } from \"simple-table-core\";\n import type { SimpleTableConfig, TableAPI } from \"simple-table-core\";\n import { buildVanillaConfig, resolveSvelteColumns } from \"./buildVanillaConfig\";\n import { MountRegistry } from \"./MountRegistry\";\n import type { SimpleTableSvelteProps, TableInstance } from \"./types\";\n\n // SimpleTable — Svelte adapter for simple-table-core.\n // Accepts the same props as SimpleTableProps with Svelte component types for renderers.\n // Prefer typed `rows` / `columns` (`SvelteColumnDef<MyRow>`) so TData flows into\n // callbacks. Use bind:this={tableRef} for TableAPI: tableRef.getAPI()?.sort(...)\n\n type $$Props = SimpleTableSvelteProps<TData>;\n\n export let rows: $$Props[\"rows\"];\n export let columns: $$Props[\"columns\"] = undefined;\n\n // All remaining optional props — spread via $$restProps\n let container: HTMLDivElement;\n let instance: TableInstance | null = null;\n const registry = new MountRegistry();\n\n /** Last headers/rows whose structure/content was applied via update. */\n let syncedColumns: ReadonlyArray<\n NonNullable<$$Props[\"columns\"]>[number]\n > | undefined = undefined;\n let syncedRows: $$Props[\"rows\"] | undefined = undefined;\n let wasLoading = false;\n let didInitialAutoSize = false;\n\n function maybeRefitAutoSizeColumns(leftLoading: boolean) {\n if (!instance) return;\n if (leftLoading) {\n instance.refitAutoSizeColumns?.();\n return;\n }\n // Svelte mounts are synchronous for template DOM, so custom renderer hosts\n // are already present after the first paint that registered mounts (mirrors\n // Vue/React first-portals refit).\n if (!didInitialAutoSize && registry.size > 0) {\n didInitialAutoSize = true;\n instance.refitAutoSizeColumns?.();\n }\n }\n\n onMount(() => {\n const props = { rows, columns, ...$$restProps } as SimpleTableSvelteProps<TData>;\n instance = new SimpleTableVanilla(\n container,\n buildVanillaConfig(props, registry),\n ) as unknown as TableInstance;\n instance.mount();\n syncedColumns = resolveSvelteColumns(props);\n syncedRows = rows;\n wasLoading = Boolean(props.isLoading);\n maybeRefitAutoSizeColumns(false);\n });\n\n onDestroy(() => {\n instance?.destroy();\n instance = null;\n syncedColumns = undefined;\n syncedRows = undefined;\n registry.clear();\n });\n\n // Reactive update: skip no-op columns/rows when structure/content is unchanged.\n $: if (instance) {\n const props = { rows, columns, ...$$restProps } as SimpleTableSvelteProps<TData>;\n const fullConfig = buildVanillaConfig(props, registry);\n const patch: Partial<SimpleTableConfig> = { ...fullConfig };\n const resolvedColumns = resolveSvelteColumns(props);\n\n const headersUnchanged = headersStructurallyEqual(syncedColumns, resolvedColumns);\n syncedColumns = resolvedColumns;\n if (headersUnchanged) {\n delete patch.columns;\n }\n\n const rowsUnchanged = rowsShallowUnchanged(\n syncedRows as ReadonlyArray<object> | undefined,\n rows as ReadonlyArray<object>,\n props.getRowId as Parameters<typeof rowsShallowUnchanged>[2],\n );\n syncedRows = rows;\n if (rowsUnchanged) {\n delete patch.rows;\n }\n\n const isLoading = Boolean(props.isLoading);\n const leftLoading = wasLoading && !isLoading;\n wasLoading = isLoading;\n\n instance.update(patch);\n maybeRefitAutoSizeColumns(leftLoading);\n }\n\n /** Expose the TableAPI for consumers using bind:this. */\n export function getAPI(): TableAPI<TData> | null {\n return (instance?.getAPI() as TableAPI<TData> | undefined) ?? null;\n }\n</script>\n\n<div bind:this={container}></div>\n"],"names":["div","root","$$value","$","set","container","get"],"mappings":"y8OA4GCA,EAAGC,uBAAHD,EAAGE,GAAAC,EAAAC,IAAYC,EAASH,GAAA,IAAAC,EAAAG,IAATD,eAAfL,qCAFO"}
@@ -14,6 +14,8 @@ export declare class MountRegistry {
14
14
  * {@link disposeHost} can find it when core discards an ancestor host.
15
15
  */
16
16
  register(container: HTMLElement, dispose: () => void): void;
17
+ /** True when `container` is a live registered mount host (not yet disposed). */
18
+ isRegistered(container: HTMLElement): boolean;
17
19
  /**
18
20
  * Tear down mounts owned by a host element core is permanently discarding.
19
21
  * Collects `host` itself plus every descendant tagged with {@link MOUNT_ID_ATTR}.
@@ -9,14 +9,23 @@ export type SimpleTableExports<
9
9
  getAPI: () => TableAPI<TData> | null;
10
10
  };
11
11
 
12
+ /**
13
+ * Typed Svelte component for a concrete row shape. Prefer
14
+ * {@link mountSimpleTable} for imperative mounts so `TData` is inferred from
15
+ * `props` without casts.
16
+ */
17
+ export type SimpleTableComponent<
18
+ TData extends SvelteDefaultRowData = SvelteDefaultRowData,
19
+ > = Component<SimpleTableSvelteProps<TData>, SimpleTableExports<TData>>;
20
+
12
21
  /**
13
22
  * Declaration for the precompiled SimpleTable Svelte component.
14
23
  * Copied into dist/types so published `index.d.ts` can resolve
15
24
  * `export … from "./SimpleTable.svelte"`.
25
+ *
26
+ * Defaults `TData` for untyped usage; use {@link SimpleTableComponent} /
27
+ * {@link mountSimpleTable} when mounting with a concrete row type.
16
28
  */
17
- declare const SimpleTable: Component<
18
- SimpleTableSvelteProps,
19
- SimpleTableExports
20
- >;
29
+ declare const SimpleTable: SimpleTableComponent;
21
30
 
22
31
  export default SimpleTable;
@@ -1,4 +1,7 @@
1
1
  export { default as SimpleTable } from "./SimpleTable.svelte";
2
+ export { mountSimpleTable } from "./mountSimpleTable";
3
+ export type { MountSimpleTableOptions } from "./mountSimpleTable";
4
+ export type { SimpleTableComponent, SimpleTableExports } from "./SimpleTable.svelte";
2
5
  export { asRows } from "simple-table-core";
3
6
  export type { SimpleTableSvelteProps, TableInstance, SvelteColumnDef, NestedSvelteColumnDef, NestedTableSvelteConfig, SvelteIconsConfig, SvelteIconElement, SvelteColumnEditorConfig, SvelteCellRenderer, SvelteHeaderRenderer, SvelteFooterRenderer, SvelteHeaderDropdown, SvelteColumnEditorRowRenderer, SvelteColumnEditorCustomRenderer, SvelteRowButton, SvelteLoadingStateRenderer, SvelteErrorStateRenderer, SvelteEmptyStateRenderer, SvelteDefaultRowData, } from "./types";
4
7
  export type { Accessor, AggregationConfig, AggregationType, AnimationsConfig, AutoSizeMode, ColumnDef, Cell, CellChangeProps, CellClickProps, CellRenderer, CellRendererProps, CellValue, ChartOptions, ColumnEditorConfig, ColumnEditorRowRenderer, ColumnEditorRowRendererComponents, ColumnEditorCustomRenderer, ColumnEditorCustomRendererProps, ColumnEditorRowRendererProps, ColumnEditorSearchFunction, ColumnType, ColumnVisibilityState, Comparator, ComparatorProps, CustomTheme, CustomThemeProps, EmptyStateRenderer, EmptyStateRendererProps, EnumOption, ErrorStateRenderer, ErrorStateRendererProps, ExportToCSVProps, ExportValueGetter, ExportValueProps, FilterCondition, FilterOperator, StringFilterOperator, NumberFilterOperator, BooleanFilterOperator, DateFilterOperator, EnumFilterOperator, FooterRendererProps, FooterPosition, GetRowId, GetRowIdParams, GetRowClass, GetRowClassParams, HeaderDropdown, HeaderDropdownProps, HeaderRenderer, HeaderRendererComponents, HeaderRendererProps, IconsConfig, LoadingStateRenderer, LoadingStateRendererProps, OnRowGroupExpandProps, Pinned, PinnedSectionsState, PivotConfig, PivotValueConfig, PivotResult, QuickFilterConfig, QuickFilterGetter, QuickFilterGetterProps, QuickFilterMode, Row, RowButtonProps, RowId, RowSelectionChangeProps, RowSelectionMode, RowState, SetHeaderRenameProps, ShowWhen, SimpleTableConfig, SimpleTableProps, SortColumn, TableAPI, TableFilterState, TableRow, Theme, UpdateDataProps, ValueFormatter, ValueFormatterProps, ValueGetter, ValueGetterProps, } from "simple-table-core";
@@ -0,0 +1,13 @@
1
+ import type { SimpleTableExports } from "./SimpleTable.svelte";
2
+ import type { SimpleTableSvelteProps, SvelteDefaultRowData } from "./types";
3
+ export type MountSimpleTableOptions<TData extends SvelteDefaultRowData> = {
4
+ target: Document | Element | ShadowRoot;
5
+ props: SimpleTableSvelteProps<TData>;
6
+ intro?: boolean;
7
+ };
8
+ /**
9
+ * Imperative mount with `TData` inferred from `props` (same role as typing
10
+ * `<SimpleTable rows={…}>` in a Svelte template). Prefer this over bare
11
+ * `mount(SimpleTable, …)`, whose typings collapse to the default row shape.
12
+ */
13
+ export declare function mountSimpleTable<TData extends SvelteDefaultRowData>(options: MountSimpleTableOptions<TData>): SimpleTableExports<TData>;
@@ -14,9 +14,11 @@ export interface TableInstance {
14
14
  update(config: Partial<SimpleTableConfig>): void;
15
15
  destroy(): void;
16
16
  getAPI(): TableAPI;
17
+ /** Re-measure `width: "auto"` columns after custom renderer DOM is present. */
18
+ refitAutoSizeColumns?(): void;
17
19
  }
18
- export type SvelteCellRenderer<TData extends SvelteDefaultRowData = SvelteDefaultRowData, TValue = CellValue> = Component<CellRendererProps<TData, TValue>> | CellRenderer<TData, TValue>;
19
- export type SvelteHeaderRenderer<TData extends SvelteDefaultRowData = SvelteDefaultRowData> = Component<HeaderRendererProps<TData>> | HeaderRenderer<TData>;
20
+ export type SvelteCellRenderer<TData extends SvelteDefaultRowData = SvelteDefaultRowData, TValue = CellValue> = CellRenderer<TData, TValue> | Component<CellRendererProps<TData, TValue>>;
21
+ export type SvelteHeaderRenderer<TData extends SvelteDefaultRowData = SvelteDefaultRowData> = HeaderRenderer<TData> | Component<HeaderRendererProps<TData>>;
20
22
  export type SvelteFooterRenderer = Component<FooterRendererProps>;
21
23
  export type SvelteHeaderDropdown = Component<HeaderDropdownProps>;
22
24
  export type SvelteColumnEditorRowRenderer = Component<ColumnEditorRowRendererProps>;
@@ -1,4 +1,5 @@
1
1
  import type { Component } from "svelte";
2
+ import type { ColumnEditorRowRendererProps as VanillaColumnEditorRowRendererProps, HeaderRendererProps as VanillaHeaderRendererProps } from "simple-table-core";
2
3
  import type { MountRegistry } from "../MountRegistry";
3
4
  /**
4
5
  * Wraps a Svelte 5 component into a function returning an HTMLElement,
@@ -7,11 +8,27 @@ import type { MountRegistry } from "../MountRegistry";
7
8
  * (including any `<svelte:teleport>` / floating UI) when the host is discarded.
8
9
  */
9
10
  export declare function wrapSvelteRenderer<P extends Record<string, any>>(registry: MountRegistry, component: Component<P>): (props: P) => HTMLElement;
11
+ /**
12
+ * Header renderer wrapper that reuses one host element so sort/filter icon
13
+ * refreshes update props in place instead of remounting the Svelte subtree
14
+ * and wiping local state. Mirrors Vue's {@link wrapVueHeaderRenderer} /
15
+ * React's {@link wrapReactHeaderRenderer}.
16
+ */
17
+ export declare function wrapSvelteHeaderRenderer(registry: MountRegistry, component: Component<VanillaHeaderRendererProps>): (props: VanillaHeaderRendererProps) => HTMLElement;
10
18
  /**
11
19
  * Like {@link wrapSvelteRenderer}, but reuses one wrapper per accessor so
12
20
  * unstable column rebuilds keep a stable function identity on ColumnDef.
21
+ *
22
+ * For `kind: "header"`, also reuses a single mount host (React
23
+ * {@link wrapCachedHeaderRenderer} / Vue {@link wrapCachedVueRenderer}) so
24
+ * sort/filter refreshes preserve state.
13
25
  */
14
26
  export declare function wrapCachedSvelteRenderer<P extends Record<string, any>>(registry: MountRegistry, accessor: string, kind: "cell" | "header", component: Component<P>): (props: P) => HTMLElement;
27
+ /**
28
+ * Column-editor row renderer: one host per `accessor` so popout list rebuilds
29
+ * update in place instead of remounting Svelte state (mirrors Vue/React).
30
+ */
31
+ export declare function wrapSvelteColumnEditorRowRenderer(registry: MountRegistry, component: Component<VanillaColumnEditorRowRendererProps>): (props: VanillaColumnEditorRowRendererProps) => HTMLElement;
15
32
  /** Mount a Svelte component into a div for vanilla-only slots (e.g. table empty state). */
16
33
  export declare function wrapSvelteStatic(registry: MountRegistry, component: Component): HTMLElement;
17
34
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simple-table/svelte",
3
- "version": "4.1.4",
3
+ "version": "4.1.5",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/index.es.js",
6
6
  "types": "dist/types/index.d.ts",
@@ -32,11 +32,12 @@
32
32
  "svelte": ">=5.0.0"
33
33
  },
34
34
  "dependencies": {
35
- "simple-table-core": "4.1.4"
35
+ "simple-table-core": "4.1.5"
36
36
  },
37
37
  "devDependencies": {
38
38
  "@rollup/plugin-alias": "4.0.0",
39
39
  "@rollup/plugin-node-resolve": "^15.3.0",
40
+ "@sveltejs/vite-plugin-svelte": "^4.0.0",
40
41
  "jsdom": "^24.1.3",
41
42
  "rollup": "^2.79.2",
42
43
  "rollup-plugin-delete": "^2.1.0",
@@ -48,6 +49,7 @@
48
49
  "svelte-preprocess": "^6.0.0",
49
50
  "tslib": "^2.8.1",
50
51
  "typescript": "^5.0.0",
52
+ "vite": "^5.0.0",
51
53
  "vitest": "^2.1.9"
52
54
  },
53
55
  "description": "Svelte adapter for simple-table-core — use the Simple Table data grid with full Svelte component support for renderers.",