@atscript/ui-table 0.1.140 → 0.1.142

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/index.mjs CHANGED
@@ -45,6 +45,19 @@ function filledFilterCount(filters) {
45
45
  for (const path in filters) if (filters[path].some(isFilled)) count++;
46
46
  return count;
47
47
  }
48
+ /**
49
+ * `filters` without the fields that have no filled condition — the shape
50
+ * table state holds (a field with nothing filled has no entry). Returns
51
+ * `filters` itself when every field has one; never mutates it.
52
+ *
53
+ * @since 0.1.142
54
+ */
55
+ function compactFieldFilters(filters) {
56
+ if (filledFilterCount(filters) === Object.keys(filters).length) return filters;
57
+ const out = {};
58
+ for (const path in filters) if (filters[path].some(isFilled)) out[path] = filters[path];
59
+ return out;
60
+ }
48
61
  /** Summarize a field's conditions into a human-readable token label. */
49
62
  function filterTokenLabel(path, conditions, columnLabel) {
50
63
  const filled = conditions.filter(isFilled);
@@ -527,6 +540,7 @@ function fieldsOf(expr, out) {
527
540
  else if (!out.includes(key)) out.push(key);
528
541
  return out;
529
542
  }
543
+ /** @internal Module-shared with the URL parser; not a package export. */
530
544
  function unsupported(reason, expr) {
531
545
  const fields = fieldsOf(expr, []);
532
546
  return {
@@ -752,10 +766,10 @@ function warnUnsupported(issue) {
752
766
  /**
753
767
  * Split a Uniquery `FilterExpr` into what the table's field-filter model
754
768
  * holds exactly (`filters`), what it cannot hold but carries as residual
755
- * conditions (`residual`, with `carry`), and what it leaves out
756
- * (`unsupported`). Nothing is approximated: `filters AND residual` selects
757
- * `expr` minus the `unsupported` pieces and pieces on fields outside
758
- * `knownFields`.
769
+ * conditions (`residual`, with `carry`), what it leaves out (`unsupported`)
770
+ * and what names a field outside `knownFields` (`unknown`). Nothing is
771
+ * approximated: `filters AND residual` selects `expr` minus the
772
+ * `unsupported` and `unknown` pieces.
759
773
  *
760
774
  * Never throws, never warns — the caller decides how to report.
761
775
  *
@@ -766,7 +780,8 @@ function decomposeUniqueryFilter(expr, opts = {}) {
766
780
  const result = {
767
781
  filters,
768
782
  residual: [],
769
- unsupported: []
783
+ unsupported: [],
784
+ unknown: []
770
785
  };
771
786
  if (!expr) return result;
772
787
  const knownFields = opts.knownFields;
@@ -787,8 +802,12 @@ function decomposeUniqueryFilter(expr, opts = {}) {
787
802
  }];
788
803
  }
789
804
  const positives = /* @__PURE__ */ new Map();
805
+ const unknown = /* @__PURE__ */ new Map();
790
806
  for (const term of out.terms) {
791
- if (!isKnown(term.field)) continue;
807
+ if (!isKnown(term.field)) {
808
+ unknown.set(term.expr, [term.field]);
809
+ continue;
810
+ }
792
811
  const list = filters[term.field] ??= [];
793
812
  if (isNegative(term)) {
794
813
  list.push(...term.conds);
@@ -818,11 +837,16 @@ function decomposeUniqueryFilter(expr, opts = {}) {
818
837
  }
819
838
  for (const issue of out.issues) {
820
839
  const fields = issue.fields;
821
- if (fields.length > 0 && !fields.some(isKnown)) continue;
822
- if (opts.carry && fields.length > 0 && fields.every(isKnown)) carried.push(issue.expr);
840
+ const outside = fields.filter((f) => !isKnown(f));
841
+ if (outside.length > 0) unknown.set(issue.expr, outside);
842
+ else if (opts.carry && fields.length > 0) carried.push(issue.expr);
823
843
  else result.unsupported.push(issue);
824
844
  }
825
845
  result.residual = normalizeResidualFilters(carried);
846
+ result.unknown = [...unknown].map(([expr, fields]) => ({
847
+ expr,
848
+ fields
849
+ }));
826
850
  return result;
827
851
  }
828
852
  /**
@@ -873,9 +897,10 @@ function normalizeResidualFilters(exprs) {
873
897
  * to a dev-mode `console.warn` when no handler is given. To keep those
874
898
  * pieces instead, use {@link decomposeUniqueryFilter} with `carry`.
875
899
  *
876
- * Conditions on fields outside `knownFields` (when provided) are ignored
877
- * silently: they are not this table's (a host page flag, a stale column). A
878
- * piece that mixes known and unknown fields is reported.
900
+ * Pieces that name a field outside `knownFields` (when provided) are ignored
901
+ * silently: they are not this table's (a host page flag, a hidden or stale
902
+ * column). Since 0.1.141 that includes a piece mixing known and unknown
903
+ * fields — {@link decomposeUniqueryFilter} lists them as `unknown`.
879
904
  *
880
905
  * Returns `{}` for an empty/missing expression. Never throws.
881
906
  */
@@ -1145,6 +1170,176 @@ function resolveSystemPresets(input) {
1145
1170
  }, ...named];
1146
1171
  }
1147
1172
  //#endregion
1173
+ //#region src/presets/prune-preset-snapshot.ts
1174
+ /** `[kept, dropped]` in one pass. */
1175
+ function partition(list, keep) {
1176
+ const kept = [];
1177
+ const dropped = [];
1178
+ for (const x of list) (keep(x) ? kept : dropped).push(x);
1179
+ return [kept, dropped];
1180
+ }
1181
+ /** The columns aspect, an empty width map spelled by omission — the way capture writes it. */
1182
+ function columnsAspect(columnNames, columnWidths) {
1183
+ return columnWidths && Object.keys(columnWidths).length > 0 ? {
1184
+ columnNames,
1185
+ columnWidths
1186
+ } : { columnNames };
1187
+ }
1188
+ /**
1189
+ * Remove every entry of `snapshot` that names a field outside `known`, per
1190
+ * aspect:
1191
+ *
1192
+ * - `columns.columnNames` — unknown names go, the rest keep their order. When
1193
+ * none survives, it falls back to every column, never an empty grid.
1194
+ * - `columns.columnWidths` — unknown keys go.
1195
+ * - `filters` (displayed inputs) and `filterOps` — entries on a field outside
1196
+ * `known.server` go. A field's conditions are one AND-ed conjunct, so
1197
+ * dropping one only broadens the result.
1198
+ * - `sorters` — unknown entries go, the rest keep their priority.
1199
+ * - `itemsPerPage` — untouched.
1200
+ *
1201
+ * `dropped` is `null` when nothing user-visible went (a width-only drop is
1202
+ * hygiene). The input is never mutated.
1203
+ *
1204
+ * @since 0.1.141
1205
+ */
1206
+ function prunePresetSnapshot(snapshot, known) {
1207
+ const isColumn = (p) => known.columns.has(p);
1208
+ const isServer = (p) => known.server.has(p);
1209
+ const out = { ...snapshot };
1210
+ const dropped = {
1211
+ fields: [],
1212
+ columns: [],
1213
+ filterFields: [],
1214
+ filters: {},
1215
+ residual: [],
1216
+ sorters: []
1217
+ };
1218
+ if (snapshot.columns) {
1219
+ const [names, gone] = partition(snapshot.columns.columnNames, isColumn);
1220
+ const [widths] = partition(Object.entries(snapshot.columns.columnWidths ?? {}), ([p]) => isColumn(p));
1221
+ dropped.columns = gone;
1222
+ out.columns = columnsAspect(names.length > 0 || gone.length === 0 ? names : [...known.columns], Object.fromEntries(widths));
1223
+ }
1224
+ if (snapshot.filters) [out.filters, dropped.filterFields] = partition(snapshot.filters, isServer);
1225
+ if (snapshot.filterOps) {
1226
+ const [kept, gone] = partition(Object.entries(snapshot.filterOps), ([p]) => isServer(p));
1227
+ out.filterOps = Object.fromEntries(kept);
1228
+ dropped.filters = Object.fromEntries(gone);
1229
+ }
1230
+ if (snapshot.sorters) [out.sorters, dropped.sorters] = partition(snapshot.sorters, (s) => isColumn(s.field));
1231
+ dropped.fields = [...new Set([
1232
+ ...dropped.columns,
1233
+ ...dropped.filterFields,
1234
+ ...Object.keys(dropped.filters),
1235
+ ...dropped.sorters.map((s) => s.field)
1236
+ ])];
1237
+ return {
1238
+ snapshot: out,
1239
+ dropped: dropped.fields.length > 0 ? dropped : null
1240
+ };
1241
+ }
1242
+ /**
1243
+ * Spell a snapshot the way table state holds it, so it compares equal to a
1244
+ * capture of the state it produces:
1245
+ *
1246
+ * - `columns.columnWidths` — an entry equal to its column's default width, or
1247
+ * on a path with no default (not a column), goes; an emptied map is
1248
+ * omitted. Capture writes overrides only.
1249
+ * - `filterOps` — a field with no filled condition goes
1250
+ * (`compactFieldFilters`). Table state never holds one.
1251
+ *
1252
+ * `defaultWidths` maps each column path to its default width — the `d` of
1253
+ * its `ColumnWidthsMap` entry. Other aspects pass through. Returns `snapshot`
1254
+ * itself when nothing changes; the input is never mutated.
1255
+ *
1256
+ * @since 0.1.142
1257
+ */
1258
+ function canonicalPresetSnapshot(snapshot, defaultWidths) {
1259
+ let out = snapshot;
1260
+ const columns = snapshot.columns;
1261
+ if (columns?.columnWidths) {
1262
+ const entries = Object.entries(columns.columnWidths);
1263
+ const [kept] = partition(entries, ([p, w]) => {
1264
+ const d = defaultWidths[p];
1265
+ return d !== void 0 && d !== w;
1266
+ });
1267
+ if (kept.length !== entries.length || kept.length === 0) out = {
1268
+ ...out,
1269
+ columns: columnsAspect(columns.columnNames, Object.fromEntries(kept))
1270
+ };
1271
+ }
1272
+ if (snapshot.filterOps) {
1273
+ const filterOps = compactFieldFilters(snapshot.filterOps);
1274
+ if (filterOps !== snapshot.filterOps) out = {
1275
+ ...out,
1276
+ filterOps
1277
+ };
1278
+ }
1279
+ return out;
1280
+ }
1281
+ /**
1282
+ * Split residual filter conditions, in one pass, into the ones that name
1283
+ * only `known` fields and the ones that do not. A condition naming any
1284
+ * unknown field is dropped WHOLE — never pruned inside an `$or` (that would
1285
+ * narrow the result) or a `$not` (that would invert it). Each condition is an
1286
+ * AND-ed conjunct, so dropping one only broadens the result.
1287
+ *
1288
+ * `dropped` holds the conditions in `residual` and the unknown paths in
1289
+ * `fields`; `null` when every condition is kept.
1290
+ *
1291
+ * @since 0.1.141
1292
+ */
1293
+ function pruneResidualFilters(exprs, known) {
1294
+ const kept = [];
1295
+ const residual = [];
1296
+ const fields = /* @__PURE__ */ new Set();
1297
+ for (const expr of exprs) {
1298
+ const unknown = filterExprFields(expr).filter((p) => !known.has(p));
1299
+ if (unknown.length === 0) {
1300
+ kept.push(expr);
1301
+ continue;
1302
+ }
1303
+ residual.push(expr);
1304
+ for (const p of unknown) fields.add(p);
1305
+ }
1306
+ if (residual.length === 0) return {
1307
+ kept,
1308
+ dropped: null
1309
+ };
1310
+ return {
1311
+ kept,
1312
+ dropped: {
1313
+ fields: [...fields],
1314
+ columns: [],
1315
+ filterFields: [],
1316
+ filters: {},
1317
+ residual,
1318
+ sorters: []
1319
+ }
1320
+ };
1321
+ }
1322
+ /**
1323
+ * Append what a prune dropped back onto a snapshot captured from (pruned)
1324
+ * table state, so overwriting a preset with a narrower view does not destroy
1325
+ * the parts the saver cannot see. Column names, filter inputs and sorters go
1326
+ * after the captured ones; field filters are added back. Only aspects
1327
+ * `captured` carries are touched; widths of hidden columns are not kept.
1328
+ *
1329
+ * @since 0.1.141
1330
+ */
1331
+ function restoreDroppedEntries(captured, dropped) {
1332
+ const out = { ...captured };
1333
+ if (captured.columns) out.columns = columnsAspect([...captured.columns.columnNames, ...dropped.columns], captured.columns.columnWidths);
1334
+ if (captured.filters) out.filters = [...captured.filters, ...dropped.filterFields];
1335
+ if (captured.filterOps) out.filterOps = {
1336
+ ...captured.filterOps,
1337
+ ...dropped.filters
1338
+ };
1339
+ if (captured.sorters) out.sorters = [...captured.sorters, ...dropped.sorters];
1340
+ return out;
1341
+ }
1342
+ //#endregion
1148
1343
  //#region src/presets/preset-dirty.ts
1149
1344
  /**
1150
1345
  * JSON-stringify with object keys sorted alphabetically at every depth so
@@ -1748,6 +1943,20 @@ const CONSUMED_CONTROLS = new Set([
1748
1943
  "$skip",
1749
1944
  URL_SNAPSHOT_KEY
1750
1945
  ]);
1946
+ function toSet(paths) {
1947
+ if (!paths) return null;
1948
+ return paths instanceof Set ? paths : new Set(paths);
1949
+ }
1950
+ /**
1951
+ * `field=value` (or `field=null`) — the one filter shape a host page flag
1952
+ * shares, so a bare one on an unknown field is not reported as dropped.
1953
+ */
1954
+ function isBareEquality(expr) {
1955
+ const keys = Object.keys(expr);
1956
+ if (keys.length !== 1 || keys[0].startsWith("$")) return false;
1957
+ const v = expr[keys[0]];
1958
+ return v === null || typeof v !== "object";
1959
+ }
1751
1960
  /**
1752
1961
  * Characters that can only appear in a uniqu filter key, never in a page flag:
1753
1962
  * comparison operators, `^` (OR), `( )` (groups) and `{ }` (`$in` lists).
@@ -1774,9 +1983,10 @@ function urlQueryConsumesKey(key) {
1774
1983
  /**
1775
1984
  * Parse a URL query string back into the table state subset.
1776
1985
  *
1777
- * Robust by design — schema drift and copy-paste errors must not break the
1778
- * recipient's view:
1779
- * - unknown fields (not in `knownFields`) → silently dropped
1986
+ * Robust by design — schema drift, fields hidden from the recipient and
1987
+ * copy-paste errors must not break the recipient's view:
1988
+ * - unknown fields (not in `knownFields`) → dropped, listed in `unknown` /
1989
+ * `unknownSorters` (the parser does not warn — the caller decides)
1780
1990
  * - filter pieces field filters cannot express (cross-field OR, unknown
1781
1991
  * operator, …) → left out of `filters` and listed in `unsupported`, never
1782
1992
  * approximated (the parser does not warn — the caller decides). Unless
@@ -1809,12 +2019,15 @@ function urlQueryStringToState(urlString, opts = {}) {
1809
2019
  const sortersGate = resolveAspectGate(opts.sync?.sorters);
1810
2020
  const searchOff = opts.sync?.search === false;
1811
2021
  const paginationOff = opts.sync?.pagination === false;
1812
- const knownSet = opts.knownFields ? new Set(opts.knownFields) : null;
2022
+ const knownSet = toSet(opts.knownFields);
2023
+ const localSet = toSet(opts.localFields);
2024
+ const isHidden = (f) => !!knownSet && !knownSet.has(f) && !localSet?.has(f);
1813
2025
  let filterKnown;
1814
2026
  if (filtersGate === "all") filterKnown = knownSet ?? void 0;
1815
2027
  else if (filtersGate !== "none") if (knownSet) {
1816
- filterKnown = /* @__PURE__ */ new Set();
1817
- for (const path of filtersGate) if (knownSet.has(path)) filterKnown.add(path);
2028
+ const owned = /* @__PURE__ */ new Set();
2029
+ for (const path of filtersGate) if (knownSet.has(path)) owned.add(path);
2030
+ filterKnown = owned;
1818
2031
  } else filterKnown = filtersGate;
1819
2032
  const decomposed = filtersGate === "none" ? null : decomposeUniqueryFilter(parsed.filter, {
1820
2033
  knownFields: filterKnown,
@@ -1822,20 +2035,19 @@ function urlQueryStringToState(urlString, opts = {}) {
1822
2035
  });
1823
2036
  const filters = decomposed?.filters ?? {};
1824
2037
  const sorters = [];
2038
+ const unknownSorters = [];
1825
2039
  if (sortersGate !== "none") {
1826
2040
  const $sort = parsed.controls?.$sort;
1827
2041
  if ($sort && typeof $sort === "object") for (const field in $sort) {
1828
- if (knownSet && !knownSet.has(field)) continue;
1829
2042
  if (!gateOwns(sortersGate, field)) continue;
1830
2043
  const dir = $sort[field];
1831
- if (dir === 1) sorters.push({
2044
+ if (dir !== 1 && dir !== -1) continue;
2045
+ const sorter = {
1832
2046
  field,
1833
- direction: "asc"
1834
- });
1835
- else if (dir === -1) sorters.push({
1836
- field,
1837
- direction: "desc"
1838
- });
2047
+ direction: dir === 1 ? "asc" : "desc"
2048
+ };
2049
+ if (!knownSet || knownSet.has(field)) sorters.push(sorter);
2050
+ else if (isHidden(field)) unknownSorters.push(sorter);
1839
2051
  }
1840
2052
  }
1841
2053
  const $search = parsed.controls?.$search;
@@ -1844,8 +2056,24 @@ function urlQueryStringToState(urlString, opts = {}) {
1844
2056
  sorters,
1845
2057
  searchTerm: !searchOff && typeof $search === "string" ? $search : ""
1846
2058
  };
1847
- if (decomposed?.unsupported.length) out.unsupported = decomposed.unsupported;
2059
+ const unsupported$1 = decomposed?.unsupported ?? [];
2060
+ const unknown = [];
2061
+ for (const piece of decomposed?.unknown ?? []) {
2062
+ const hidden = piece.fields.filter(isHidden);
2063
+ if (hidden.length > 0) {
2064
+ if (!isBareEquality(piece.expr)) unknown.push({
2065
+ expr: piece.expr,
2066
+ fields: hidden
2067
+ });
2068
+ continue;
2069
+ }
2070
+ const issue = unsupported("cross-field", piece.expr);
2071
+ if (issue.fields.some((f) => filterKnown?.has(f))) unsupported$1.push(issue);
2072
+ }
2073
+ if (unsupported$1.length) out.unsupported = unsupported$1;
1848
2074
  if (decomposed?.residual.length) out.residual = decomposed.residual;
2075
+ if (unknown.length) out.unknown = unknown;
2076
+ if (unknownSorters.length) out.unknownSorters = unknownSorters;
1849
2077
  if (opts.sync?.snapshot !== false && parsed.controls && "$snapshot" in parsed.controls) out.snapshot = true;
1850
2078
  if (!searchOff) {
1851
2079
  const $relevance = parsed.controls?.$relevance;
@@ -2397,4 +2625,4 @@ function sortRowsLocally(rows, sorters, getValue = (row, field) => row[field]) {
2397
2625
  });
2398
2626
  }
2399
2627
  //#endregion
2400
- export { APP_CONF_PREFIX, AppPrefsClient, DEFAULT_EXPORT_PAGE_SIZE, DEFAULT_ROW_HEIGHT_PX, DEV, DRAFT_PERSISTED_ASPECTS, ExportAbortError, MAX_DEFAULT_COLUMN_WIDTH_PX, NULL_OPS, PRESET_ASPECTS, PresetsClient, PresetsHttpError, RESERVED_ID_PREFIXES, STANDARD_PRESET_ID, SYSTEM_PRESET_PREFIX, URL_SNAPSHOT_KEY, USER_CONF_PREFIX, appConfId, arraysEqual, blockStartFor, buildTableQuery, cellAsString, clampTopIndex, collectExportRows, columnDefaultCondition, columnFilterConditions, columnFilterType, computeDefaultColumnWidth, conditionLabel, conditionsForType, csvCell, dateShortcuts, debounce, decomposeUniqueryFilter, defaultCondition, derivePresetAspects, deserializeDraft, draftMatchesPreset, escapeRegex, filledFilterCount, filterExprFields, filterExprKey, filterTokenLabel, filtersToUniqueryFilter, formatFilterCondition, formatFilterExpr, fromWireSnapshot, gateOwns, hasSecondValue, isAuthError, isColumnFilterable, isDirtyAgainst, isEmptyDraft, isFilled, isSimpleEq, isSystemPresetId, isUnavailableError, mergeDisplayColumns, mergeFilters, mergeSorters, normaliseSystemPresetId, normalizeResidualFilters, pageAlignedBlocksFor, parseColumnFilterInput, parseFilterInput, planFetch, reconcileColumnWidthDefaults, reorderColumnNames, residualGateOwns, resolveAspectGate, resolveExportValue, resolveSystemPresets, rowsToPks, sameColumnSet, serializeDraft, setsEqual, sortRowsLocally, sortersEqual, stableStringify, stateToUrlQueryString, toCsv, toWireSnapshot, togglePk, trimSelection, unescapeRegex, uniqueryFilterToFieldFilters, urlQueryConsumesKey, urlQueryStringToState, userConfId, walkBackwardAbsorb, walkForwardAbsorb, withStableOrder };
2628
+ export { APP_CONF_PREFIX, AppPrefsClient, DEFAULT_EXPORT_PAGE_SIZE, DEFAULT_ROW_HEIGHT_PX, DEV, DRAFT_PERSISTED_ASPECTS, ExportAbortError, MAX_DEFAULT_COLUMN_WIDTH_PX, NULL_OPS, PRESET_ASPECTS, PresetsClient, PresetsHttpError, RESERVED_ID_PREFIXES, STANDARD_PRESET_ID, SYSTEM_PRESET_PREFIX, URL_SNAPSHOT_KEY, USER_CONF_PREFIX, appConfId, arraysEqual, blockStartFor, buildTableQuery, canonicalPresetSnapshot, cellAsString, clampTopIndex, collectExportRows, columnDefaultCondition, columnFilterConditions, columnFilterType, compactFieldFilters, computeDefaultColumnWidth, conditionLabel, conditionsForType, csvCell, dateShortcuts, debounce, decomposeUniqueryFilter, defaultCondition, derivePresetAspects, deserializeDraft, draftMatchesPreset, escapeRegex, filledFilterCount, filterExprFields, filterExprKey, filterTokenLabel, filtersToUniqueryFilter, formatFilterCondition, formatFilterExpr, fromWireSnapshot, gateOwns, hasSecondValue, isAuthError, isColumnFilterable, isDirtyAgainst, isEmptyDraft, isFilled, isSimpleEq, isSystemPresetId, isUnavailableError, mergeDisplayColumns, mergeFilters, mergeSorters, normaliseSystemPresetId, normalizeResidualFilters, pageAlignedBlocksFor, parseColumnFilterInput, parseFilterInput, planFetch, prunePresetSnapshot, pruneResidualFilters, reconcileColumnWidthDefaults, reorderColumnNames, residualGateOwns, resolveAspectGate, resolveExportValue, resolveSystemPresets, restoreDroppedEntries, rowsToPks, sameColumnSet, serializeDraft, setsEqual, sortRowsLocally, sortersEqual, stableStringify, stateToUrlQueryString, toCsv, toWireSnapshot, togglePk, trimSelection, unescapeRegex, uniqueryFilterToFieldFilters, urlQueryConsumesKey, urlQueryStringToState, userConfId, walkBackwardAbsorb, walkForwardAbsorb, withStableOrder };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atscript/ui-table",
3
- "version": "0.1.140",
3
+ "version": "0.1.142",
4
4
  "description": "Framework-agnostic filter model, filter-to-Uniquery conversion, and preset serialization for atscript tables",
5
5
  "keywords": [
6
6
  "atscript",
@@ -42,18 +42,18 @@
42
42
  "access": "public"
43
43
  },
44
44
  "dependencies": {
45
- "@atscript/ui": "0.1.140"
45
+ "@atscript/ui": "0.1.142"
46
46
  },
47
47
  "devDependencies": {
48
- "@atscript/db-client": "^0.1.133",
49
- "@uniqu/core": "^0.1.10",
50
- "@uniqu/url": "^0.1.10",
48
+ "@atscript/db-client": "^0.1.136",
49
+ "@uniqu/core": "^0.1.11",
50
+ "@uniqu/url": "^0.1.11",
51
51
  "vitest": "npm:@voidzero-dev/vite-plus-test@0.1.14"
52
52
  },
53
53
  "peerDependencies": {
54
- "@atscript/db-client": "^0.1.133",
55
- "@uniqu/core": "^0.1.10",
56
- "@uniqu/url": "^0.1.10"
54
+ "@atscript/db-client": "^0.1.136",
55
+ "@uniqu/core": "^0.1.11",
56
+ "@uniqu/url": "^0.1.11"
57
57
  },
58
58
  "scripts": {
59
59
  "build": "vp pack",